private void loadThirdPartyResources() { ImPluginHelper helper = ImPluginHelper.getInstance(this); helper.loadAvailablePlugins(); ArrayList<ImPlugin> pluginList = helper.getPluginObjects(); ArrayList<ImPluginInfo> infoList = helper.getPluginsInfo(); int N = pluginList.size(); PackageManager pm = getPackageManager(); for (int i = 0; i < N; i++) { ImPlugin plugin = pluginList.get(i); ImPluginInfo pluginInfo = infoList.get(i); try { Resources packageRes = pm.getResourcesForApplication(pluginInfo.mPackageName); Map<Integer, Integer> resMap = plugin.getResourceMap(); int[] smileyIcons = plugin.getSmileyIconIds(); BrandingResources res = new BrandingResources(packageRes, resMap, smileyIcons, mDefaultBrandingResources); mBrandingResources.put(pluginInfo.mProviderName, res); } catch (NameNotFoundException e) { Log.e(LOG_TAG, "Failed to load third party resources.", e); } } }
@SuppressWarnings("deprecation") private boolean cursorUnlocked() { try { mApp = ImApp.getApplication(this); mHandler = new MyHandler(this); ImPluginHelper.getInstance(this).loadAvailablePlugins(); mProviderCursor = managedQuery( Imps.Provider.CONTENT_URI_WITH_ACCOUNT, PROVIDER_PROJECTION, Imps.Provider.CATEGORY + "=?" /* selection */, new String[] {ImApp.IMPS_CATEGORY} /* selection args */, Imps.Provider.DEFAULT_SORT_ORDER); mProviderCursor.moveToFirst(); return true; } catch (Exception e) { Log.e(ImApp.LOG_TAG, e.getMessage(), e); // needs to be unlocked return false; } }
private void showNewAccountListDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.account_select_type); List<String> listProviders = helper.getProviderNames(); mAccountList = new String[listProviders.size() + 1]; int i = 0; for (String providerName : listProviders) mAccountList[i++] = providerName; mAccountList[i] = getString(R.string.google_account); builder.setItems( mAccountList, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int pos) { if (pos > helper.getProviderNames().size() - 1) // google accounts based on xmpp { showGoogleAccountListDialog(); } else { // otherwise support the actual plugin-type showSetupAccountForm(mAccountList[pos], null, null); } } }); AlertDialog dialog = builder.create(); dialog.show(); }
@Override protected void onCreate(Bundle icicle) { ((ImApp) getApplication()).setAppTheme(this); super.onCreate(icicle); ThemeableActivity.setBackgroundImage(this); mApp = ImApp.getApplication(this); mHandler = new MyHandler(this); mSignInHelper = new SignInHelper(this); ImPluginHelper.getInstance(this).loadAvailablePlugins(); mProviderCursor = managedQuery( Imps.Provider.CONTENT_URI_WITH_ACCOUNT, PROVIDER_PROJECTION, Imps.Provider.CATEGORY + "=?" + " AND " + Imps.Provider.ACTIVE_ACCOUNT_USERNAME + " NOT NULL" /* selection */, new String[] {ImApp.IMPS_CATEGORY} /* selection args */, Imps.Provider.DEFAULT_SORT_ORDER); Intent intent = getIntent(); if (ImApp.ACTION_QUIT.equals(intent.getAction())) { signOutAndKillProcess(); return; } mAdapter = new ProviderAdapter(this, mProviderCursor); setListAdapter(mAdapter); ViewGroup godfatherView = (ViewGroup) this.getWindow().getDecorView(); FontUtils.setRobotoFont(this, godfatherView); registerForContextMenu(getListView()); View emptyView = getLayoutInflater().inflate(R.layout.empty_account_view, godfatherView, false); emptyView.setVisibility(View.GONE); ((ViewGroup) getListView().getParent()).addView(emptyView); getListView().setEmptyView(emptyView); emptyView.setOnClickListener( new OnClickListener() { @Override public void onClick(View arg0) { if (getListView().getCount() == 0) { showNewAccountListDialog(); } } }); }
public void showSetupAccountForm(String providerType, String username, String token) { long providerId = helper.createAdditionalProvider(providerType); // xmpp ((ImApp) getApplication()).resetProviderSettings(); // clear cached provider list Intent intent = new Intent(); intent.setAction(Intent.ACTION_INSERT); intent.setData(ContentUris.withAppendedId(Imps.Provider.CONTENT_URI, providerId)); intent.addCategory(ImApp.IMPS_CATEGORY); if (username != null) intent.putExtra("newuser", username); if (token != null) intent.putExtra("newpass", token); startActivity(intent); }
private void doOnResume() { if (mApp == null) { mApp = ImApp.getApplication(this); mHandler = new MyHandler(this); ImPluginHelper.getInstance(this).loadAvailablePlugins(); } mApp.setAppTheme(this); mHandler.registerForBroadcastEvents(); int countSignedIn = accountsSignedIn(); int countAvailable = accountsAvailable(); int countConfigured = accountsConfigured(); if (countAvailable == 1) { // If just one account is available for auto-signin, go there immediately after service starts // trying // to connect. mSignInHelper.setSignInListener( new SignInHelper.Listener() { public void connectedToService() {} public void stateChanged(int state, long accountId) { if (state == ImConnection.LOGGING_IN) { mSignInHelper.goToAccount(accountId); } } }); } else { mSignInHelper.setSignInListener(null); } if (countSignedIn == 0 && countAvailable > 0 && !mDidAutoLaunch && mDoSignIn) { mDidAutoLaunch = true; signInAll(); showAccounts(); } else if (countSignedIn == 1) { showActiveAccount(); } else if (countConfigured > 0) { showAccounts(); } // Otherwise, stay on Getting Started view }
public class AccountListActivity extends SherlockListActivity implements View.OnCreateContextMenuListener { private static final String TAG = ImApp.LOG_TAG; private static final int ID_SIGN_IN = Menu.FIRST + 1; private static final int ID_SIGN_OUT = Menu.FIRST + 2; private static final int ID_EDIT_ACCOUNT = Menu.FIRST + 3; private static final int ID_REMOVE_ACCOUNT = Menu.FIRST + 4; // private static final int ID_SIGN_OUT_ALL = Menu.FIRST + 5; private static final int ID_ADD_ACCOUNT = Menu.FIRST + 6; private static final int ID_VIEW_CONTACT_LIST = Menu.FIRST + 7; private ProviderAdapter mAdapter; private Cursor mProviderCursor; private ImApp mApp; private SimpleAlertHandler mHandler; private SignInHelper mSignInHelper; private static final String[] PROVIDER_PROJECTION = { Imps.Provider._ID, Imps.Provider.NAME, Imps.Provider.FULLNAME, Imps.Provider.CATEGORY, Imps.Provider.ACTIVE_ACCOUNT_ID, Imps.Provider.ACTIVE_ACCOUNT_USERNAME, Imps.Provider.ACTIVE_ACCOUNT_PW, Imps.Provider.ACTIVE_ACCOUNT_LOCKED, Imps.Provider.ACTIVE_ACCOUNT_KEEP_SIGNED_IN, Imps.Provider.ACCOUNT_PRESENCE_STATUS, Imps.Provider.ACCOUNT_CONNECTION_STATUS }; static final int PROVIDER_ID_COLUMN = 0; static final int PROVIDER_NAME_COLUMN = 1; static final int PROVIDER_FULLNAME_COLUMN = 2; static final int PROVIDER_CATEGORY_COLUMN = 3; static final int ACTIVE_ACCOUNT_ID_COLUMN = 4; static final int ACTIVE_ACCOUNT_USERNAME_COLUMN = 5; static final int ACTIVE_ACCOUNT_PW_COLUMN = 6; static final int ACTIVE_ACCOUNT_LOCKED = 7; static final int ACTIVE_ACCOUNT_KEEP_SIGNED_IN = 8; static final int ACCOUNT_PRESENCE_STATUS = 9; static final int ACCOUNT_CONNECTION_STATUS = 10; @Override protected void onCreate(Bundle icicle) { ((ImApp) getApplication()).setAppTheme(this); super.onCreate(icicle); ThemeableActivity.setBackgroundImage(this); mApp = ImApp.getApplication(this); mHandler = new MyHandler(this); mSignInHelper = new SignInHelper(this); ImPluginHelper.getInstance(this).loadAvailablePlugins(); mProviderCursor = managedQuery( Imps.Provider.CONTENT_URI_WITH_ACCOUNT, PROVIDER_PROJECTION, Imps.Provider.CATEGORY + "=?" + " AND " + Imps.Provider.ACTIVE_ACCOUNT_USERNAME + " NOT NULL" /* selection */, new String[] {ImApp.IMPS_CATEGORY} /* selection args */, Imps.Provider.DEFAULT_SORT_ORDER); Intent intent = getIntent(); if (ImApp.ACTION_QUIT.equals(intent.getAction())) { signOutAndKillProcess(); return; } mAdapter = new ProviderAdapter(this, mProviderCursor); setListAdapter(mAdapter); ViewGroup godfatherView = (ViewGroup) this.getWindow().getDecorView(); FontUtils.setRobotoFont(this, godfatherView); registerForContextMenu(getListView()); View emptyView = getLayoutInflater().inflate(R.layout.empty_account_view, godfatherView, false); emptyView.setVisibility(View.GONE); ((ViewGroup) getListView().getParent()).addView(emptyView); getListView().setEmptyView(emptyView); emptyView.setOnClickListener( new OnClickListener() { @Override public void onClick(View arg0) { if (getListView().getCount() == 0) { showNewAccountListDialog(); } } }); } private void reloadList() { // mProviderCursor.close(); mProviderCursor = managedQuery( Imps.Provider.CONTENT_URI_WITH_ACCOUNT, PROVIDER_PROJECTION, Imps.Provider.CATEGORY + "=?" + " AND " + Imps.Provider.ACTIVE_ACCOUNT_USERNAME + " NOT NULL" /* selection */, new String[] {ImApp.IMPS_CATEGORY} /* selection args */, Imps.Provider.DEFAULT_SORT_ORDER); mAdapter = new ProviderAdapter(this, mProviderCursor); setListAdapter(mAdapter); } @Override protected void onPause() { mHandler.unregisterForBroadcastEvents(); super.onPause(); } @Override protected void onDestroy() { mSignInHelper.stop(); super.onDestroy(); } @Override protected void onResume() { ((ImApp) getApplication()).setAppTheme(this); mHandler.registerForBroadcastEvents(); super.onResume(); } private void signInAccountAtPosition(int position) { Intent intent = null; mProviderCursor.moveToPosition(position); if (mProviderCursor.isNull(ACTIVE_ACCOUNT_ID_COLUMN)) { showNewAccountListDialog(); } else { int state = mProviderCursor.getInt(ACCOUNT_CONNECTION_STATUS); long accountId = mProviderCursor.getLong(ACTIVE_ACCOUNT_ID_COLUMN); if (state == Imps.ConnectionStatus.OFFLINE) { boolean isKeepSignedIn = mProviderCursor.getInt(ACTIVE_ACCOUNT_KEEP_SIGNED_IN) != 0; boolean isAccountEditible = mProviderCursor.getInt(ACTIVE_ACCOUNT_LOCKED) == 0; if (isKeepSignedIn) { signIn(accountId); } else if (isAccountEditible) { intent = getEditAccountIntent(); } } else if (state == Imps.ConnectionStatus.CONNECTING) { gotoAccount(); } else { intent = getViewChatsIntent(); } } if (intent != null) { startActivity(intent); } } private void signIn(long accountId) { if (accountId == 0) { Log.w(TAG, "signIn: account id is 0, bail"); return; } boolean isAccountEditible = mProviderCursor.getInt(ACTIVE_ACCOUNT_LOCKED) == 0; if (isAccountEditible && mProviderCursor.isNull(ACTIVE_ACCOUNT_PW_COLUMN)) { // no password, edit the account if (Log.isLoggable(TAG, Log.DEBUG)) log("no pw for account " + accountId); Intent intent = getEditAccountIntent(); startActivity(intent); return; } // Remember that the user signed in. setKeepSignedIn(accountId, true); long providerId = mProviderCursor.getLong(PROVIDER_ID_COLUMN); String password = mProviderCursor.getString(ACTIVE_ACCOUNT_PW_COLUMN); boolean isActive = false; // TODO(miron) mSignInHelper.signIn(password, providerId, accountId, isActive); } protected void gotoAccount() { long accountId = mProviderCursor.getLong(ACTIVE_ACCOUNT_ID_COLUMN); Intent intent = new Intent(this, ChatListActivity.class); // clear the back stack of the account setup intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(ImServiceConstants.EXTRA_INTENT_ACCOUNT_ID, accountId); startActivity(intent); finish(); } boolean isSigningIn(Cursor cursor) { int connectionStatus = cursor.getInt(ACCOUNT_CONNECTION_STATUS); return connectionStatus == Imps.ConnectionStatus.CONNECTING; } private boolean isSignedIn(Cursor cursor) { int connectionStatus = cursor.getInt(ACCOUNT_CONNECTION_STATUS); return connectionStatus == Imps.ConnectionStatus.ONLINE; } private boolean allAccountsSignedOut() { if (!mProviderCursor.moveToFirst()) { return false; } do { if (isSignedIn(mProviderCursor)) { return false; } } while (mProviderCursor.moveToNext()); return true; } private void signOutAndKillPrompt() { DialogInterface.OnClickListener confirmListener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { mHandler.sendEmptyMessage(HANDLE_COMPLETE_EXIT); } }; new AlertDialog.Builder(this) .setTitle(R.string.confirm) .setMessage(R.string.signout_kill_confirm_message) .setPositiveButton(R.string.yes, confirmListener) // default button .setNegativeButton(R.string.no, null) .setCancelable(true) .show(); } private void signOutAndKillProcess() { if (ImApp.getApplication().hasActiveConnections()) { if (!mProviderCursor.moveToFirst()) return; do { long accountId = mProviderCursor.getLong(ACTIVE_ACCOUNT_ID_COLUMN); signOut(accountId); } while (mProviderCursor.moveToNext()); try { Thread.sleep(3000); } catch (Exception e) { } // wait a second for account to log out } ImApp.getApplication().forceStopImService(); } private void signOutAll() { DialogInterface.OnClickListener confirmListener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { if (!mProviderCursor.moveToFirst()) return; do { long accountId = mProviderCursor.getLong(ACTIVE_ACCOUNT_ID_COLUMN); signOut(accountId); } while (mProviderCursor.moveToNext()); } }; new AlertDialog.Builder(this) .setTitle(R.string.confirm) .setMessage(R.string.signout_all_confirm_message) .setPositiveButton(R.string.yes, confirmListener) // default button .setNegativeButton(R.string.no, null) .setCancelable(true) .show(); } private void signOut(final long accountId) { if (accountId == 0) { Log.w(TAG, "signOut: account id is 0, bail"); return; } // Remember that the user signed out and do not auto sign in until they // explicitly do so setKeepSignedIn(accountId, false); // Sign out mApp.callWhenServiceConnected( mHandler, new Runnable() { public void run() { try { IImConnection conn = mApp.getConnectionByAccount(accountId); if (conn != null) { conn.logout(); } } catch (RemoteException ex) { Log.e(TAG, "signOut failed", ex); } } }); } private void setKeepSignedIn(final long accountId, boolean signin) { Uri mAccountUri = ContentUris.withAppendedId(Imps.Account.CONTENT_URI, accountId); ContentValues values = new ContentValues(); values.put(Imps.Account.KEEP_SIGNED_IN, signin); getContentResolver().update(mAccountUri, values, null, null); } @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); menu.findItem(R.id.menu_sign_out_all).setVisible(!allAccountsSignedOut()); return true; } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.accounts_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_sign_out_all: signOutAll(); return true; case R.id.menu_new_account: showNewAccountListDialog(); return true; case R.id.menu_settings: Intent sintent = new Intent(this, SettingActivity.class); startActivityForResult(sintent, 1); return true; case R.id.menu_exit: signOutAndKillPrompt(); return true; } return super.onOptionsItemSelected(item); } private String[] mAccountList; private String mNewUser; private ImPluginHelper helper = ImPluginHelper.getInstance(this); private void showNewAccountListDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.account_select_type); List<String> listProviders = helper.getProviderNames(); mAccountList = new String[listProviders.size() + 1]; int i = 0; for (String providerName : listProviders) mAccountList[i++] = providerName; mAccountList[i] = getString(R.string.google_account); builder.setItems( mAccountList, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int pos) { if (pos > helper.getProviderNames().size() - 1) // google accounts based on xmpp { showGoogleAccountListDialog(); } else { // otherwise support the actual plugin-type showSetupAccountForm(mAccountList[pos], null, null); } } }); AlertDialog dialog = builder.create(); dialog.show(); } private Handler mHandlerGoogleAuth = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); Log.d(TAG, "Got handler callback from auth: " + msg.what); } }; private void showGoogleAccountListDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.account_select_type); Account[] accounts = AccountManager.get(this).getAccountsByType(GTalkOAuth2.TYPE_GOOGLE_ACCT); mAccountList = new String[accounts.length]; for (int i = 0; i < mAccountList.length; i++) mAccountList[i] = accounts[i].name; builder.setItems( mAccountList, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int pos) { mNewUser = mAccountList[pos]; Thread thread = new Thread() { public void run() { // get the oauth token // don't store anything just make sure it works! String password = GTalkOAuth2.NAME + ':' + GTalkOAuth2.getGoogleAuthTokenAllow( mNewUser, getApplicationContext(), AccountListActivity.this, mHandlerGoogleAuth); // use the XMPP type plugin for google accounts, and the .NAME "X-GOOGLE-TOKEN" // as the password showSetupAccountForm(helper.getProviderNames().get(0), mNewUser, password); } }; thread.start(); } }); AlertDialog dialog = builder.create(); dialog.show(); } public void showSetupAccountForm(String providerType, String username, String token) { long providerId = helper.createAdditionalProvider(providerType); // xmpp ((ImApp) getApplication()).resetProviderSettings(); // clear cached provider list Intent intent = new Intent(); intent.setAction(Intent.ACTION_INSERT); intent.setData(ContentUris.withAppendedId(Imps.Provider.CONTENT_URI, providerId)); intent.addCategory(ImApp.IMPS_CATEGORY); if (username != null) intent.putExtra("newuser", username); if (token != null) intent.putExtra("newpass", token); startActivity(intent); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { AdapterView.AdapterContextMenuInfo info; try { info = (AdapterView.AdapterContextMenuInfo) menuInfo; } catch (ClassCastException e) { Log.e(TAG, "bad menuInfo", e); return; } Cursor providerCursor = (Cursor) getListAdapter().getItem(info.position); menu.setHeaderTitle(providerCursor.getString(PROVIDER_FULLNAME_COLUMN)); if (providerCursor.isNull(ACTIVE_ACCOUNT_ID_COLUMN)) { menu.add(0, ID_ADD_ACCOUNT, 0, R.string.menu_edit_account); menu.add(0, ID_REMOVE_ACCOUNT, 0, R.string.menu_remove_account) .setIcon(android.R.drawable.ic_menu_delete); return; } long providerId = providerCursor.getLong(PROVIDER_ID_COLUMN); boolean isLoggingIn = isSigningIn(providerCursor); boolean isLoggedIn = isSignedIn(providerCursor); BrandingResources brandingRes = mApp.getBrandingResource(providerId); menu.add( 0, ID_VIEW_CONTACT_LIST, 0, brandingRes.getString(BrandingResourceIDs.STRING_MENU_CONTACT_LIST)); if (isLoggedIn) { menu.add(0, ID_SIGN_OUT, 0, R.string.menu_sign_out) .setIcon(android.R.drawable.ic_menu_close_clear_cancel); } else if (isLoggingIn) { menu.add(0, ID_SIGN_OUT, 0, R.string.menu_cancel_signin) .setIcon(android.R.drawable.ic_menu_close_clear_cancel); } else { menu.add(0, ID_SIGN_IN, 0, R.string.sign_in) // TODO .setIcon(info.guardianproject.otr.app.internal.R.drawable.ic_menu_login) ; } boolean isAccountEditable = providerCursor.getInt(ACTIVE_ACCOUNT_LOCKED) == 0; if (isAccountEditable && !isLoggingIn && !isLoggedIn) { menu.add(0, ID_EDIT_ACCOUNT, 0, R.string.menu_edit_account) .setIcon(android.R.drawable.ic_menu_edit); menu.add(0, ID_REMOVE_ACCOUNT, 0, R.string.menu_remove_account) .setIcon(android.R.drawable.ic_menu_delete); } } @SuppressWarnings("deprecation") @Override public boolean onContextItemSelected(android.view.MenuItem item) { AdapterView.AdapterContextMenuInfo info; try { info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); } catch (ClassCastException e) { Log.e(TAG, "bad menuInfo", e); return false; } long providerId = info.id; Cursor providerCursor = (Cursor) getListAdapter().getItem(info.position); long accountId = providerCursor.getLong(ACTIVE_ACCOUNT_ID_COLUMN); switch (item.getItemId()) { case ID_EDIT_ACCOUNT: { startActivity(getEditAccountIntent()); return true; } case ID_REMOVE_ACCOUNT: { Uri accountUri = ContentUris.withAppendedId(Imps.Account.CONTENT_URI, accountId); getContentResolver().delete(accountUri, null, null); Uri providerUri = ContentUris.withAppendedId(Imps.Provider.CONTENT_URI, providerId); getContentResolver().delete(providerUri, null, null); // Requery the cursor to force refreshing screen providerCursor.requery(); return true; } case ID_VIEW_CONTACT_LIST: { Intent intent = getViewContactsIntent(); startActivity(intent); return true; } case ID_ADD_ACCOUNT: { showNewAccountListDialog(); return true; } case ID_SIGN_IN: { signIn(accountId); return true; } case ID_SIGN_OUT: { // TODO: progress bar signOut(accountId); return true; } } return false; } @Override protected void onListItemClick(ListView l, View v, int position, long id) { signInAccountAtPosition(position); } /* Intent getCreateAccountIntent() { Intent intent = new Intent(); intent.setAction(Intent.ACTION_INSERT); long providerId = mProviderCursor.getLong(PROVIDER_ID_COLUMN); intent.setData(ContentUris.withAppendedId(Imps.Provider.CONTENT_URI, providerId)); intent.addCategory(getProviderCategory(mProviderCursor)); return intent; }*/ Intent getEditAccountIntent() { Intent intent = new Intent( Intent.ACTION_EDIT, ContentUris.withAppendedId( Imps.Account.CONTENT_URI, mProviderCursor.getLong(ACTIVE_ACCOUNT_ID_COLUMN))); intent.addCategory(ImApp.IMPS_CATEGORY); return intent; } Intent getViewContactsIntent() { Intent intent = new Intent(this, ContactListActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra( ImServiceConstants.EXTRA_INTENT_ACCOUNT_ID, mProviderCursor.getLong(ACTIVE_ACCOUNT_ID_COLUMN)); return intent; } Intent getViewChatsIntent() { Intent intent = new Intent(this, ChatListActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra( ImServiceConstants.EXTRA_INTENT_ACCOUNT_ID, mProviderCursor.getLong(ACTIVE_ACCOUNT_ID_COLUMN)); return intent; } /* private String getProviderCategory(Cursor cursor) { return cursor.getString(PROVIDER_CATEGORY_COLUMN); }*/ static void log(String msg) { Log.d(TAG, "[LandingPage]" + msg); } private class ProviderListItemFactory implements LayoutInflater.Factory { public View onCreateView(String name, Context context, AttributeSet attrs) { if (name != null && name.equals(ProviderListItem.class.getName())) { return new ProviderListItem(context, AccountListActivity.this); } return null; } } private final class ProviderAdapter extends CursorAdapter { private LayoutInflater mInflater; @SuppressWarnings("deprecation") public ProviderAdapter(Context context, Cursor c) { super(context, c); mInflater = LayoutInflater.from(context).cloneInContext(context); mInflater.setFactory(new ProviderListItemFactory()); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { // create a custom view, so we can manage it ourselves. Mainly, we want to // initialize the widget views (by calling getViewById()) in newView() instead of in // bindView(), which can be called more often. ProviderListItem view = (ProviderListItem) mInflater.inflate(R.layout.account_view, parent, false); view.init(cursor); return view; } @Override public void bindView(View view, Context context, Cursor cursor) { ((ProviderListItem) view).bindView(cursor); } } private static final int HANDLE_COMPLETE_EXIT = -999; private final class MyHandler extends SimpleAlertHandler { public MyHandler(Activity activity) { super(activity); } @Override public void handleMessage(Message msg) { if (msg.what == ImApp.EVENT_CONNECTION_DISCONNECTED) { promptDisconnectedEvent(msg); } else if (msg.what == HANDLE_COMPLETE_EXIT) { signOutAndKillProcess(); } super.handleMessage(msg); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Intent intent = getIntent(); finish(); startActivity(intent); } }