/**
* galaxy inc.
* meetup client for android
*/
package com.galaxy.meetup.client.android;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.widget.Toast;
import com.galaxy.meetup.client.android.analytics.EsAnalytics;
import com.galaxy.meetup.client.android.analytics.OzActions;
import com.galaxy.meetup.client.android.analytics.OzViews;
import com.galaxy.meetup.client.android.content.AccountSettingsData;
import com.galaxy.meetup.client.android.content.EsAccount;
import com.galaxy.meetup.client.android.iu.InstantUploadFacade;
import com.galaxy.meetup.client.android.oob.OutOfBoxResponseParcelable;
import com.galaxy.meetup.client.android.realtimechat.RealTimeChatService;
import com.galaxy.meetup.client.android.service.EsService;
import com.galaxy.meetup.client.android.ui.fragments.AlertFragmentDialog;
import com.galaxy.meetup.client.android.ui.fragments.ProgressFragmentDialog;
import com.galaxy.meetup.server.client.domain.response.MobileOutOfBoxResponse;
/**
*
* @author sihai
*
*/
public class SignOnManager implements AlertFragmentDialog.AlertDialogListener {
private EsAccount mAccount;
private final FragmentActivity mActivity;
private final FragmentManager mFragmentManager;
private Intent mIntent;
private boolean mIsResumed;
private EsAccount mOobAccount;
private EsAccount mResultAccount;
public SignOnManager(FragmentActivity fragmentactivity) {
mActivity = fragmentactivity;
mFragmentManager = mActivity.getSupportFragmentManager();
}
public final EsAccount getAccount() {
return mAccount;
}
public final boolean isSignedIn() {
boolean flag;
if (mAccount != null)
flag = true;
else
flag = false;
return flag;
}
public final boolean onActivityResult(int i, int j) {
if(1023 != i) {
return false;
}
mOobAccount = null;
if (j == -1) {
Intent intent = (Intent) mIntent.getParcelableExtra("intent");
if (intent != null) {
mActivity.startActivity(intent);
mActivity.finish();
} else {
mResultAccount = EsService.getActiveAccount(mActivity);
}
} else {
switchAccounts();
}
return true;
}
public final void onCreate(Bundle bundle, Intent intent) {
mIntent = intent;
EsAccount esaccount = EsService.getActiveAccount(mActivity);
if(null == esaccount) {
switchAccounts();
return;
}
if(bundle == null && mIntent.getBooleanExtra("run_oob", false)) {
Intent intent1 = (Intent)mIntent.getParcelableExtra("intent");
OutOfBoxResponseParcelable outofboxresponseparcelable = (OutOfBoxResponseParcelable)mIntent.getParcelableExtra("network_oob");
AccountSettingsData accountsettingsdata = (AccountSettingsData)mIntent.getParcelableExtra("plus_pages");
FragmentActivity fragmentactivity = mActivity;
MobileOutOfBoxResponse mobileoutofboxresponse;
Intent intent2;
if(outofboxresponseparcelable != null)
mobileoutofboxresponse = outofboxresponseparcelable.getResponse();
else
mobileoutofboxresponse = null;
intent2 = Intents.getOobIntent(fragmentactivity, esaccount, mobileoutofboxresponse, accountsettingsdata, null);
if(intent2 != null) {
mOobAccount = esaccount;
mActivity.startActivityForResult(intent2, 1023);
} else {
setAccount(esaccount);
if(intent1 != null) {
mActivity.startActivity(intent1);
mActivity.finish();
}
}
} else if(!esaccount.hasGaiaId()) {
switchAccounts();
} else {
setAccount(esaccount);
if(esaccount.isPlusPage() && bundle == null) {
Resources resources = mActivity.getResources();
int i = R.string.plus_page_reminder;
Object aobj[] = new Object[1];
aobj[0] = esaccount.getDisplayName();
String s = resources.getString(i, aobj);
Toast.makeText(mActivity, s, 1).show();
}
}
}
public final void onDialogCanceled(String s) {
}
public final void onDialogListClick(int i, Bundle bundle) {
}
public final void onDialogNegativeClick(String s) {
}
public final void onDialogPositiveClick(Bundle bundle, String s) {
if(bundle != null)
doSignOut(bundle.getBoolean("downgrade_account", false));
else
doSignOut(false);
}
public final void onPause() {
mIsResumed = false;
}
public final boolean onResume() {
AlertFragmentDialog alertfragmentdialog = (AlertFragmentDialog)mFragmentManager.findFragmentByTag("SignOnManager.confirm_signoff");
if(alertfragmentdialog != null)
alertfragmentdialog.setListener(this);
boolean flag;
if(mResultAccount != null) {
setAccount(mResultAccount);
mResultAccount = null;
flag = true;
} else {
flag = false;
}
if(null == mAccount) {
if(mOobAccount != null)
mIsResumed = true;
else
switchAccounts();
return flag;
}
if(!mAccount.equals(EsService.getActiveAccount(mActivity))) {
switchAccounts();
} else {
mIsResumed = true;
if(!mAccount.isPlusPage())
RealTimeChatService.initiateConnection(mActivity, mAccount);
}
return flag;
}
public final void signOut(final boolean downgrading) {
ProgressFragmentDialog.newInstance(null, mActivity.getString(R.string.sign_out_pending)).show(mFragmentManager, "SignOnManager.progress_dialog");
(new AsyncTask() {
protected final Object doInBackground(Object aobj[])
{
return Integer.valueOf(getPendingInstantUploadCount());
}
protected final void onPostExecute(Object obj) {
final Integer pendingInstantUploadCount = (Integer)obj;
(new Handler(Looper.getMainLooper())).postDelayed(new Runnable() {
public final void run()
{
continueSignOut(pendingInstantUploadCount.intValue(), downgrading);
}
}, 500L);
}
}).execute(new Void[0]);
}
protected final void continueSignOut(int i, boolean flag)
{
DialogFragment dialogfragment = (DialogFragment)mFragmentManager.findFragmentByTag("SignOnManager.progress_dialog");
if(dialogfragment != null)
try
{
dialogfragment.dismiss();
}
catch(IllegalStateException illegalstateexception) { }
if(!flag && i > 0)
{
Resources resources = mActivity.getResources();
int j = R.plurals.sign_out_message;
Object aobj[] = new Object[1];
aobj[0] = Integer.valueOf(i);
String s = resources.getQuantityString(j, i, aobj);
AlertFragmentDialog alertfragmentdialog = AlertFragmentDialog.newInstance(mActivity.getString(R.string.sign_out_title), s, mActivity.getString(R.string.ok), mActivity.getString(R.string.cancel));
alertfragmentdialog.setListener(this);
Bundle bundle = alertfragmentdialog.getArguments();
if(bundle == null)
bundle = new Bundle();
bundle.putBoolean("downgrade_account", flag);
alertfragmentdialog.setArguments(bundle);
alertfragmentdialog.show(mFragmentManager, "SignOnManager.confirm_signoff");
} else
{
doSignOut(flag);
}
}
private void switchAccounts() {
if(mAccount != null) {
RealTimeChatService.allowDisconnect(mActivity, mAccount);
EsService.removeAccount(mActivity, mAccount);
mAccount = null;
}
Intent intent = (Intent)mIntent.getParcelableExtra("intent");
mActivity.startActivity(Intents.getAccountsActivityIntent(mActivity, intent));
mActivity.finish();
}
private void setAccount(EsAccount esaccount) {
if(mIsResumed && mAccount != null && mAccount != esaccount)
RealTimeChatService.allowDisconnect(mActivity, mAccount);
mAccount = esaccount;
}
private int getPendingInstantUploadCount()
{
Cursor cursor = null;
Cursor cursor1 = null;
int i = 0;
int j = 0;
int k = 0;
ContentResolver contentresolver = mActivity.getContentResolver();
try {
cursor = contentresolver.query(InstantUploadFacade.INSTANT_UPLOAD_URI, null, null, null, null);
if(null != cursor && cursor.moveToNext()) {
i = cursor.getInt(0);
}
android.net.Uri.Builder builder = InstantUploadFacade.UPLOAD_ALL_URI.buildUpon();
builder.appendQueryParameter("account", mAccount.getName());
cursor1 = contentresolver.query(builder.build(), null, null, null, null);
if(null != cursor1 && cursor1.moveToNext()) {
k = cursor1.getInt(1);
j = cursor1.getInt(2);
}
return i + (j - k);
} finally {
if(cursor != null)
cursor.close();
if(cursor1 != null)
cursor1.close();
}
}
private void doSignOut(boolean flag) {
OzActions ozactions = OzActions.SETTINGS_SIGNOUT;
if(mAccount != null)
{
OzViews ozviews = OzViews.getViewForLogging(mActivity);
EsAnalytics.recordActionEvent(mActivity, mAccount, ozactions, ozviews);
}
EsService.removeAccount(mActivity, mAccount);
if(mAccount != null)
RealTimeChatService.allowDisconnect(mActivity, mAccount);
mAccount = null;
if(!flag)
{
Intent intent = (Intent)mIntent.getParcelableExtra("intent");
mActivity.startActivity(Intents.getAccountsActivityIntent(mActivity, intent));
mActivity.finish();
}
}
}