ChooseAccountActivity.java
上传用户:szyujian
上传日期:2016-09-20
资源大小:320k
文件大小:16k
源码类别:

android开发

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2008 Esmertec AG.
  3.  * Copyright (C) 2008 The Android Open Source Project
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package com.android.im.app;
  18. import android.app.ListActivity;
  19. import android.content.ContentUris;
  20. import android.content.Context;
  21. import android.content.Intent;
  22. import android.database.Cursor;
  23. import android.net.Uri;
  24. import android.os.Bundle;
  25. import android.os.Message;
  26. import android.os.RemoteException;
  27. import android.provider.Im;
  28. import android.util.Log;
  29. import android.util.AttributeSet;
  30. import android.view.ContextMenu;
  31. import android.view.Menu;
  32. import android.view.MenuItem;
  33. import android.view.View;
  34. import android.view.ViewGroup;
  35. import android.view.LayoutInflater;
  36. import android.view.ContextMenu.ContextMenuInfo;
  37. import android.widget.AdapterView;
  38. import android.widget.ListView;
  39. import android.widget.CursorAdapter;
  40. import com.android.im.IImConnection;
  41. import com.android.im.R;
  42. import com.android.im.engine.ImConnection;
  43. import com.android.im.plugin.BrandingResourceIDs;
  44. import com.android.im.service.ImServiceConstants;
  45. public class ChooseAccountActivity extends ListActivity implements
  46.         View.OnCreateContextMenuListener {
  47.     private static final int ID_SIGN_IN = Menu.FIRST + 1;
  48.     private static final int ID_SIGN_OUT = Menu.FIRST + 2;
  49.     private static final int ID_EDIT_ACCOUNT = Menu.FIRST + 3;
  50.     private static final int ID_REMOVE_ACCOUNT = Menu.FIRST + 4;
  51.     private static final int ID_SIGN_OUT_ALL = Menu.FIRST + 5;
  52.     private static final int ID_ADD_ACCOUNT = Menu.FIRST + 6;
  53.     private static final int ID_VIEW_CONTACT_LIST = Menu.FIRST + 7;
  54.     private static final int ID_SETTINGS = Menu.FIRST + 8;
  55.     ImApp mApp;
  56.     MyHandler mHandler;
  57.     private ProviderAdapter mAdapter;
  58.     private Cursor mProviderCursor;
  59.     private static final String[] PROVIDER_PROJECTION = {
  60.         Im.Provider._ID,
  61.         Im.Provider.NAME,
  62.         Im.Provider.FULLNAME,
  63.         Im.Provider.ACTIVE_ACCOUNT_ID,
  64.         Im.Provider.ACTIVE_ACCOUNT_USERNAME,
  65.         Im.Provider.ACTIVE_ACCOUNT_PW,
  66.     };
  67.     static final int PROVIDER_ID_COLUMN = 0;
  68.     static final int PROVIDER_NAME_COLUMN = 1;
  69.     static final int PROVIDER_FULLNAME_COLUMN = 2;
  70.     static final int ACTIVE_ACCOUNT_ID_COLUMN = 3;
  71.     static final int ACTIVE_ACCOUNT_USERNAME_COLUMN = 4;
  72.     static final int ACTIVE_ACCOUNT_PW_COLUMN = 5;
  73.     @Override
  74.     protected void onCreate(Bundle icicle) {
  75.         super.onCreate(icicle);
  76.         setTitle(R.string.choose_account_title);
  77.         mApp = ImApp.getApplication(this);
  78.         mHandler = new MyHandler();
  79.         mApp.registerForBroadcastEvent(ImApp.EVENT_SERVICE_CONNECTED, mHandler);
  80.         mApp.registerForConnEvents(mHandler);
  81.         mApp.startImServiceIfNeed();
  82.         // (for open source) for now exclude GTalk on the landing page until we can load
  83.         // it in an abstract way
  84.         String selection = "providers.name != ?";
  85.         String[] selectionArgs = new String[] { Im.ProviderNames.GTALK };
  86.         mProviderCursor = managedQuery(Im.Provider.CONTENT_URI_WITH_ACCOUNT,
  87.                 PROVIDER_PROJECTION,
  88.                 selection,
  89.                 selectionArgs,
  90.                 Im.Provider.DEFAULT_SORT_ORDER);
  91.         mAdapter = new ProviderAdapter(this, mProviderCursor);
  92.         mApp.callWhenServiceConnected(mHandler, new Runnable() {
  93.             public void run() {
  94.                 setListAdapter(mAdapter);
  95.             }
  96.         });
  97.         registerForContextMenu(getListView());
  98.     }
  99.     private boolean allAccountsSignedOut() {
  100.         if (!mProviderCursor.moveToFirst()) return true;
  101.         do {
  102.             long accountId = mProviderCursor.getLong(ACTIVE_ACCOUNT_ID_COLUMN);
  103.             if (isSignedIn(accountId)) return false;
  104.         } while (mProviderCursor.moveToNext()) ;
  105.         return true;
  106.     }
  107.     @Override
  108.     public boolean onPrepareOptionsMenu(Menu menu) {
  109.         super.onPrepareOptionsMenu(menu);
  110.         menu.findItem(ID_SIGN_OUT_ALL).setVisible(!allAccountsSignedOut());
  111.         return true;
  112.     }
  113.     @Override
  114.     public boolean onCreateOptionsMenu(Menu menu) {
  115.         menu.add(0, ID_SIGN_OUT_ALL, 0, R.string.menu_sign_out_all)
  116.                 .setIcon(android.R.drawable.ic_menu_close_clear_cancel);
  117.         return true;
  118.     }
  119.     @Override
  120.     public boolean onOptionsItemSelected(MenuItem item) {
  121.         switch (item.getItemId()) {
  122.             case ID_SIGN_OUT_ALL:
  123.                 // Sign out MSN/AIM/YAHOO account
  124.                 if (mApp.serviceConnected()) {
  125.                     for (IImConnection conn : mApp.getActiveConnections()) {
  126.                         try {
  127.                             conn.logout();
  128.                         } catch (RemoteException e) {
  129.                         }
  130.                     }
  131.                 }
  132.                 return true;
  133.         }
  134.         return super.onOptionsItemSelected(item);
  135.     }
  136.     @Override
  137.     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
  138.         AdapterView.AdapterContextMenuInfo info;
  139.         try {
  140.             info = (AdapterView.AdapterContextMenuInfo) menuInfo;
  141.         } catch (ClassCastException e) {
  142.             Log.e(ImApp.LOG_TAG, "bad menuInfo", e);
  143.             return;
  144.         }
  145.         Cursor providerCursor = (Cursor) getListAdapter().getItem(info.position);
  146.         menu.setHeaderTitle(providerCursor.getString(PROVIDER_FULLNAME_COLUMN));
  147.         if (providerCursor.isNull(ACTIVE_ACCOUNT_ID_COLUMN)) {
  148.             menu.add(0, ID_ADD_ACCOUNT, 0, R.string.menu_add_account);
  149.             return;
  150.         }
  151.         long providerId = providerCursor.getLong(PROVIDER_ID_COLUMN);
  152.         long accountId = providerCursor.getLong(ACTIVE_ACCOUNT_ID_COLUMN);
  153.         boolean isLoggingIn = isSigningIn(accountId);
  154.         boolean isLoggedIn = isSignedIn(accountId);
  155.         if (!isLoggedIn) {
  156.             menu.add(0, ID_SIGN_IN, 0, R.string.sign_in)
  157.                 .setIcon(R.drawable.ic_menu_login);
  158.         } else {
  159.             BrandingResources brandingRes = mApp.getBrandingResource(providerId);
  160.             menu.add(0, ID_VIEW_CONTACT_LIST, 0,
  161.                     brandingRes.getString(BrandingResourceIDs.STRING_MENU_CONTACT_LIST));
  162.             menu.add(0, ID_SIGN_OUT, 0, R.string.menu_sign_out)
  163.                 .setIcon(android.R.drawable.ic_menu_close_clear_cancel);
  164.         }
  165.         if (!isLoggingIn && !isLoggedIn) {
  166.             menu.add(0, ID_EDIT_ACCOUNT, 0, R.string.menu_edit_account)
  167.                 .setIcon(android.R.drawable.ic_menu_edit);
  168.             menu.add(0, ID_REMOVE_ACCOUNT, 0, R.string.menu_remove_account)
  169.                 .setIcon(android.R.drawable.ic_menu_delete);
  170.         }
  171.         // always add a settings menu item
  172.         menu.add(0, ID_SETTINGS, 0, R.string.menu_settings);
  173.     }
  174.     @Override
  175.     public boolean onContextItemSelected(MenuItem item) {
  176.         AdapterView.AdapterContextMenuInfo info;
  177.         try {
  178.             info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
  179.         } catch (ClassCastException e) {
  180.             Log.e(ImApp.LOG_TAG, "bad menuInfo", e);
  181.             return false;
  182.         }
  183.         int position = info.position;
  184.         long providerId = info.id;
  185.         switch (item.getItemId()) {
  186.         case ID_EDIT_ACCOUNT:
  187.         {
  188.             Cursor c = (Cursor)mAdapter.getItem(position);
  189.             if (c != null) {
  190.                 Intent i = new Intent(ChooseAccountActivity.this, AccountActivity.class);
  191.                 i.setAction(Intent.ACTION_EDIT);
  192.                 i.setData(ContentUris.withAppendedId(Im.Account.CONTENT_URI,
  193.                         c.getLong(ACTIVE_ACCOUNT_ID_COLUMN)));
  194.                 c.close();
  195.                 startActivity(i);
  196.             }
  197.             return true;
  198.         }
  199.         case ID_REMOVE_ACCOUNT:
  200.         {
  201.             Cursor c = (Cursor)mAdapter.getItem(position);
  202.             if (c != null) {
  203.                 long accountId = c.getLong(ACTIVE_ACCOUNT_ID_COLUMN);
  204.                 Uri accountUri = ContentUris.withAppendedId(Im.Account.CONTENT_URI, accountId);
  205.                 getContentResolver().delete(accountUri, null, null);
  206.                 // Requery the cursor to force refreshing screen
  207.                 c.requery();
  208.             }
  209.             return true;
  210.         }
  211.         case ID_VIEW_CONTACT_LIST:
  212.         case ID_ADD_ACCOUNT:
  213.         case ID_SIGN_IN:
  214.             Intent i = mAdapter.intentForPosition(position);
  215.             if (i != null) {
  216.                 startActivity(i);
  217.             }
  218.             return true;
  219.         case ID_SIGN_OUT:
  220.             // TODO: progress bar
  221.             IImConnection conn = mApp.getConnection(providerId);
  222.             if (conn != null) {
  223.                 try {
  224.                     conn.logout();
  225.                 } catch (RemoteException e) {
  226.                 }
  227.             }
  228.             return true;
  229.         case ID_SETTINGS:
  230.             Intent settingsIntent = mAdapter.settingsIntentForPosition(position);
  231.             if (settingsIntent != null) {
  232.                 startActivity(settingsIntent);
  233.             }
  234.             return true;
  235.         }
  236.         return false;
  237.     }
  238.     @Override
  239.     protected void onListItemClick(ListView l, View v, int position, long id) {
  240.         startActivityAtPosition(position);
  241.     }
  242.     void startActivityAtPosition(int position) {
  243.         Intent i = mAdapter.intentForPosition(position);
  244.         if (i != null) {
  245.             startActivity(i);
  246.         }
  247.     }
  248.     static void log(String msg) {
  249.         Log.d(ImApp.LOG_TAG, "[ChooseAccount]" + msg);
  250.     }
  251.     @Override
  252.     protected void onRestart() {
  253.         super.onRestart();
  254.         mApp.startImServiceIfNeed();
  255.         mApp.registerForConnEvents(mHandler);
  256.     }
  257.     @Override
  258.     protected void onStop() {
  259.         super.onStop();
  260.         mApp.unregisterForConnEvents(mHandler);
  261.         mApp.unregisterForBroadcastEvent(ImApp.EVENT_SERVICE_CONNECTED, mHandler);
  262.         mApp.stopImServiceIfInactive();
  263.     }
  264.     boolean isSigningIn(long accountId) {
  265.         IImConnection conn = mApp.getConnectionByAccount(accountId);
  266.         try {
  267.             return (conn == null) ? false : (conn.getState() == ImConnection.LOGGING_IN);
  268.         } catch (RemoteException e) {
  269.             return false;
  270.         }
  271.     }
  272.     boolean isSignedIn(long accountId) {
  273.         try {
  274.             IImConnection conn = mApp.getConnectionByAccount(accountId);
  275.             if (conn == null) {
  276.                 return false;
  277.             }
  278.             int state = conn.getState();
  279.             return state == ImConnection.LOGGED_IN || state == ImConnection.SUSPENDED;
  280.         } catch (RemoteException e) {
  281.             return false;
  282.         }
  283.     }
  284.     private final class MyHandler extends SimpleAlertHandler {
  285.         public MyHandler() {
  286.             super(ChooseAccountActivity.this);
  287.         }
  288.         @Override
  289.         public void handleMessage(Message msg) {
  290.             switch(msg.what) {
  291.                 case ImApp.EVENT_CONNECTION_DISCONNECTED:
  292.                     promptDisconnectedEvent(msg);
  293.                 // fall through
  294.                 case ImApp.EVENT_SERVICE_CONNECTED:
  295.                 case ImApp.EVENT_CONNECTION_CREATED:
  296.                 case ImApp.EVENT_CONNECTION_LOGGING_IN:
  297.                 case ImApp.EVENT_CONNECTION_LOGGED_IN:
  298.                     getListView().invalidateViews();
  299.                     return;
  300.             }
  301.             super.handleMessage(msg);
  302.         }
  303.     }
  304.     private class ProviderListItemFactory implements LayoutInflater.Factory {
  305.         public View onCreateView(String name, Context context, AttributeSet attrs) {
  306.             if (name != null && name.equals(ProviderListItem.class.getName())) {
  307.                 return new ProviderListItem(context, ChooseAccountActivity.this);
  308.             }
  309.             return null;
  310.         }
  311.     }
  312.     private final class ProviderAdapter extends CursorAdapter {
  313.         private LayoutInflater mInflater;
  314.         public ProviderAdapter(Context context, Cursor c) {
  315.             super(context, c);
  316.             mInflater = LayoutInflater.from(context).cloneInContext(context);
  317.             mInflater.setFactory(new ProviderListItemFactory());
  318.         }
  319.         @Override
  320.         public View newView(Context context, Cursor cursor, ViewGroup parent) {
  321.             // create a custom view, so we can manage it ourselves. Mainly, we want to
  322.             // initialize the widget views (by calling getViewById()) in newView() instead of in
  323.             // bindView(), which can be called more often.
  324.             ProviderListItem view = (ProviderListItem) mInflater.inflate(
  325.                     R.layout.account_view, parent, false);
  326.             view.init(cursor);
  327.             return view;
  328.         }
  329.         @Override
  330.         public void bindView(View view, Context context, Cursor cursor) {
  331.             ((ProviderListItem) view).bindView(cursor);
  332.         }
  333.         public Intent intentForPosition(int position) {
  334.             Intent intent = null;
  335.             if (mCursor == null) {
  336.                 return null;
  337.             }
  338.             mCursor.moveToPosition(position);
  339.             long providerId = mCursor.getLong(PROVIDER_ID_COLUMN);
  340.             if (mCursor.isNull(ACTIVE_ACCOUNT_ID_COLUMN)) {
  341.                 // add account
  342.                 intent = new Intent(ChooseAccountActivity.this, AccountActivity.class);
  343.                 intent.setAction(Intent.ACTION_INSERT);
  344.                 intent.setData(ContentUris.withAppendedId(Im.Provider.CONTENT_URI, providerId));
  345.             } else {
  346.                 long accountId = mCursor.getLong(ACTIVE_ACCOUNT_ID_COLUMN);
  347.                 IImConnection conn = mApp.getConnection(providerId);
  348.                 int state = getConnState(conn);
  349.                 if (state < ImConnection.LOGGED_IN ) {
  350.                     Uri accountUri = ContentUris.withAppendedId(Im.Account.CONTENT_URI, accountId);
  351.                     if (mCursor.isNull(ACTIVE_ACCOUNT_PW_COLUMN)) {
  352.                         // no password, edit the account
  353.                         intent = new Intent(ChooseAccountActivity.this, AccountActivity.class);
  354.                         intent.setAction(Intent.ACTION_EDIT);
  355.                         intent.setData(accountUri);
  356.                     } else {
  357.                         // intent for sign in
  358.                         intent = new Intent(ChooseAccountActivity.this, SigningInActivity.class);
  359.                         intent.setData(accountUri);
  360.                     }
  361.                 } else if (state == ImConnection.LOGGED_IN || state == ImConnection.SUSPENDED) {
  362.                     intent = new Intent(Intent.ACTION_VIEW);
  363.                     intent.setClass(ChooseAccountActivity.this, ContactListActivity.class);
  364.                     intent.putExtra(ImServiceConstants.EXTRA_INTENT_ACCOUNT_ID, accountId);
  365.                 }
  366.             }
  367.             return intent;
  368.         }
  369.         public Intent settingsIntentForPosition(int position) {
  370.             Intent intent = null;
  371.             if (mCursor == null) {
  372.                 return null;
  373.             }
  374.             mCursor.moveToPosition(position);
  375.             Long providerId = mCursor.getLong(PROVIDER_ID_COLUMN);
  376.             intent = new Intent(ChooseAccountActivity.this, SettingActivity.class);
  377.             intent.putExtra(ImServiceConstants.EXTRA_INTENT_PROVIDER_ID, providerId);
  378.             return intent;
  379.         }
  380.         private int getConnState(IImConnection conn) {
  381.             try {
  382.                 return conn == null ? ImConnection.DISCONNECTED : conn.getState();
  383.             } catch (RemoteException e) {
  384.                 return ImConnection.DISCONNECTED;
  385.             }
  386.         }
  387.     }
  388. }