diff options
3 files changed, 102 insertions, 75 deletions
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java index f548976eb..665d3cf8f 100644 --- a/src/com/android/contacts/activities/PeopleActivity.java +++ b/src/com/android/contacts/activities/PeopleActivity.java @@ -394,6 +394,8 @@ public class PeopleActivity extends ContactsActivity implements mPluginLength = mPluginTabInfo.size(); for (int i = 0; i < mPluginLength; i++) { InCallPluginInfo pluginInfo = mPluginTabInfo.get(i); + mCallMethodMap.put(pluginInfo.mCallMethodInfo.mComponent, pluginInfo + .mCallMethodInfo); mTabTitles.add(TabState.GROUPS + i, new TabEntry(pluginInfo.mTabTag, pluginInfo.mCallMethodInfo.mName)); pluginInfo.mFragment = (PluginContactBrowseListFragment) fragmentManager @@ -1883,7 +1885,7 @@ public class PeopleActivity extends ContactsActivity implements private synchronized void updatePlugins(HashMap<ComponentName, CallMethodInfo> callMethodInfo) { HashMap<ComponentName, CallMethodInfo> newCmMap = (HashMap<ComponentName, - CallMethodInfo>) CallMethodHelper.getAllEnabledCallMethods().clone(); + CallMethodInfo>) CallMethodHelper.getAllEnabledCallMethods(); if (DEBUG) Log.d(TAG, "updatePlugins newCmMap size:" + newCmMap.size()); boolean updateTabs = false; String lastSelectedTabTag = mTabTitles.get(mActionBarAdapter.getCurrentTab()).mTag; @@ -1892,16 +1894,14 @@ public class PeopleActivity extends ContactsActivity implements FragmentManager fragmentManager = getFragmentManager(); for (ComponentName cn : mCallMethodMap.keySet()) { - CallMethodInfo cm = mCallMethodMap.get(cn); if (newCmMap.containsKey(cn)) { - // Check if update needed + // Update plugin info only, the plugin fragment keeps track of its state to + // determine if a UI update is necessary CallMethodInfo newCm = newCmMap.remove(cn); - if (!newCm.equals(cm) || newCm.mIsAuthenticated != cm.mIsAuthenticated) { - InCallPluginInfo pluginInfo = getPluginInfo(cn); - pluginInfo.mCallMethodInfo = newCm; - pluginInfo.mFragment.updateInCallPluginInfo(pluginInfo); - mCallMethodMap.put(cn, newCm); - } + InCallPluginInfo pluginInfo = getPluginInfo(cn); + pluginInfo.mCallMethodInfo = newCm; + pluginInfo.mFragment.updateInCallPluginInfo(pluginInfo); + mCallMethodMap.put(cn, newCm); } else { // Remove the tab associated with a plugin that's no longer available updateTabs = true; @@ -1916,7 +1916,7 @@ public class PeopleActivity extends ContactsActivity implements } } } - // add newly added tab from newCmMap (existing tab already removed in the logic above) + // add newly added tab from newCmMap for (ComponentName cn : newCmMap.keySet()) { InCallPluginInfo newInfo = new InCallPluginInfo(); newInfo.mTabTag = cn.toShortString(); @@ -1940,11 +1940,10 @@ public class PeopleActivity extends ContactsActivity implements executeFragTransact = true; } } - if (executeFragTransact) { fragmentManager.executePendingTransactions(); } - // update holders + // update view pager if (updateTabs) { mPluginLength = mPluginTabInfo.size(); mPageStateCount = TabState.COUNT + mPluginLength; diff --git a/src/com/android/contacts/incall/InCallPluginHelper.java b/src/com/android/contacts/incall/InCallPluginHelper.java index f7fe3b6c7..8c0403df8 100644 --- a/src/com/android/contacts/incall/InCallPluginHelper.java +++ b/src/com/android/contacts/incall/InCallPluginHelper.java @@ -24,17 +24,19 @@ import android.util.Log; import com.android.phone.common.ambient.AmbientConnection; import com.android.phone.common.incall.CallMethodHelper; import com.android.phone.common.incall.CallMethodInfo; +import com.cyanogen.ambient.common.api.PendingResult; import com.cyanogen.ambient.common.api.ResultCallback; import com.cyanogen.ambient.discovery.util.NudgeKey; import com.cyanogen.ambient.incall.extension.InCallContactInfo; +import com.cyanogen.ambient.incall.extension.StatusCodes; import com.cyanogen.ambient.incall.InCallServices; import com.cyanogen.ambient.incall.results.InstalledPluginsResult; +import java.util.HashMap; + public class InCallPluginHelper extends CallMethodHelper { private static final String TAG = InCallPluginHelper.class.getSimpleName(); - private static final int EXPECTED_CALL_BACKS = 11; - protected static synchronized InCallPluginHelper getInstance() { if (sInstance == null) { sInstance = new InCallPluginHelper(); @@ -44,7 +46,6 @@ public class InCallPluginHelper extends CallMethodHelper { public static void init(Context context) { InCallPluginHelper helper = getInstance(); - helper.expectedCallbacks = EXPECTED_CALL_BACKS; helper.mContext = context; helper.mClient = AmbientConnection.CLIENT.get(context); helper.mInCallApi = InCallServices.getInstance(); @@ -58,9 +59,13 @@ public class InCallPluginHelper extends CallMethodHelper { } public static void refreshDynamicItems() { + HashMap<ResultCallback, PendingResult> apiCallbacks = new HashMap<ResultCallback, + PendingResult>(); for (ComponentName cn : mCallMethodInfos.keySet()) { - getCallMethodAuthenticated(cn, true); + getCallMethodAuthenticated(cn, apiCallbacks); + getCallMethodAccountHandle(cn, apiCallbacks); } + executeAll(apiCallbacks); } public static void refreshPendingIntents(InCallContactInfo contactInfo) { @@ -84,27 +89,32 @@ public class InCallPluginHelper extends CallMethodHelper { } if (mInstalledPlugins.size() == 0) { - broadcast(false); + broadcast(); } - + HashMap<ResultCallback, PendingResult> apiCallbacks = + new HashMap<ResultCallback, PendingResult>(); for (ComponentName cn : mInstalledPlugins) { mCallMethodInfos.put(cn, new CallMethodInfo()); - getCallMethodInfo(cn); - getCallMethodMimeType(cn); - getCallMethodStatus(cn); - getCallMethodVideoCallableMimeType(cn); - getCallMethodImMimeType(cn); - getCallMethodAuthenticated(cn, false); - getLoginIntent(cn); - getNudgeConfiguration(cn, NudgeKey.INCALL_CONTACT_FRAGMENT_LOGIN); - getNudgeConfiguration(cn, NudgeKey.INCALL_CONTACT_CARD_LOGIN); - getNudgeConfiguration(cn, NudgeKey.INCALL_CONTACT_CARD_DOWNLOAD); - getDefaultDirectorySearchIntent(cn); + getCallMethodInfo(cn, apiCallbacks); + getCallMethodMimeType(cn, apiCallbacks); + getCallMethodStatus(cn, apiCallbacks); + getCallMethodVideoCallableMimeType(cn, apiCallbacks); + getCallMethodImMimeType(cn, apiCallbacks); + getCallMethodAuthenticated(cn, apiCallbacks); + getLoginIntent(cn, apiCallbacks); + getNudgeConfiguration(cn, NudgeKey.INCALL_CONTACT_FRAGMENT_LOGIN, + apiCallbacks); + getNudgeConfiguration(cn, NudgeKey.INCALL_CONTACT_CARD_LOGIN, + apiCallbacks); + getNudgeConfiguration(cn, NudgeKey.INCALL_CONTACT_CARD_DOWNLOAD, + apiCallbacks); + getDefaultDirectorySearchIntent(cn, apiCallbacks); // If you add any more callbacks, be sure to update // EXPECTED_RESULT_CALLBACKS // and EXPECTED_DYNAMIC_RESULT_CALLBACKS if the callback is dynamic // with the proper count. } + executeAll(apiCallbacks); } }); } diff --git a/src/com/android/contacts/list/PluginContactBrowseListFragment.java b/src/com/android/contacts/list/PluginContactBrowseListFragment.java index 3a5aeaa6e..d5a219f0d 100644 --- a/src/com/android/contacts/list/PluginContactBrowseListFragment.java +++ b/src/com/android/contacts/list/PluginContactBrowseListFragment.java @@ -64,7 +64,6 @@ public class PluginContactBrowseListFragment extends ContactEntryListFragment<Co implements View.OnClickListener { private static final String TAG = PluginContactBrowseListFragment.class.getSimpleName(); private boolean DEBUG = false; - private Context mContext; private InCallPluginInfo mInCallPluginInfo; private View mLayout; private View mListView; @@ -96,6 +95,10 @@ public class PluginContactBrowseListFragment extends ContactEntryListFragment<Co private int mLastSelectedPosition = -1; private boolean mRefreshingContactUri; private ContactListFilter mFilter; + private boolean mInitialized = false; + private boolean mAuthenticated = false; + private String mAccountType = ""; + private String mAccountHandle = ""; private String mPersistentSelectionPrefix = PERSISTENT_SELECTION_PREFIX; protected OnContactBrowserActionListener mListener; @@ -202,7 +205,9 @@ public class PluginContactBrowseListFragment extends ContactEntryListFragment<Co super.onActivityCreated(savedInstanceState); mPrefs = getActivity().getSharedPreferences(mPrefsFileName, Context.MODE_PRIVATE); updatePluginView(); // this is execute again reflect change in plugin info - restoreFilter(); + if (savedInstanceState != null) { + restoreFilter(); + } restoreSelectedUri(false); } @@ -665,49 +670,54 @@ public class PluginContactBrowseListFragment extends ContactEntryListFragment<Co if (mInCallPluginInfo != null) { if (DEBUG) Log.d(TAG, "updatePluginView: " + mInCallPluginInfo.mCallMethodInfo.mName); if (mListView != null && mLoginView != null) { - if (mInCallPluginInfo.mCallMethodInfo.mIsAuthenticated) { - // Show list view - mLoginView.setVisibility(View.GONE); - mListView.setVisibility(View.VISIBLE); - if (mEmptyView != null) { - mEmptyView.setVisibility(View.VISIBLE); - ((ListView) mListView).setEmptyView(mEmptyView); - initEmptyView(); - } - } else { - // Show login view - ((ListView)mListView).setEmptyView(null); - mListView.setVisibility(View.GONE); - if (mEmptyView != null) { - mEmptyView.setVisibility(View.GONE); - } - mLoginView.setVisibility(View.VISIBLE); - if (mLoginIconView != null) { - if (mInCallPluginInfo.mCallMethodInfo.mLoginIconId == 0) { - // plugin does not provide a valid icon - mLoginIconView.setVisibility(View.GONE); - } else { - // plugin provides a valid icon, this method is called from the main - // thread so needs to start an AsyncTask to look up the Drawable from - // resource Id - if (mInCallPluginInfo.mCallMethodInfo.mLoginIcon != null) { - // TODO: may need to self load in the case of restore before plugin - // update - mLoginIconView.setImageDrawable( - mInCallPluginInfo.mCallMethodInfo.mLoginIcon); + // if the UI auth state is initialized the first time or the auth state has changed + if (!mInitialized || mInCallPluginInfo.mCallMethodInfo.mIsAuthenticated != + mAuthenticated) { + mInitialized = true; + mAuthenticated = mInCallPluginInfo.mCallMethodInfo.mIsAuthenticated; + if (mInCallPluginInfo.mCallMethodInfo.mIsAuthenticated) { + // Show list view + mLoginView.setVisibility(View.GONE); + mListView.setVisibility(View.VISIBLE); + if (mEmptyView != null) { + mEmptyView.setVisibility(View.VISIBLE); + ((ListView) mListView).setEmptyView(mEmptyView); + initEmptyView(); + } + } else { + // Show login view + ((ListView) mListView).setEmptyView(null); + mListView.setVisibility(View.GONE); + if (mEmptyView != null) { + mEmptyView.setVisibility(View.GONE); + } + mLoginView.setVisibility(View.VISIBLE); + if (mLoginIconView != null) { + if (mInCallPluginInfo.mCallMethodInfo.mLoginIconId == 0) { + // plugin does not provide a valid icon + mLoginIconView.setVisibility(View.GONE); } else { - if (mInCallPluginInfo.mCallMethodInfo.mLoginIconId != 0) { - new GetDrawableAsyncTask().execute(); + if (mInCallPluginInfo.mCallMethodInfo.mLoginIcon != null) { + mLoginIconView.setImageDrawable( + mInCallPluginInfo.mCallMethodInfo.mLoginIcon); + } else { + // The fragment has been restored so only the icon id is + // a valid value, need to manually load + if (mInCallPluginInfo.mCallMethodInfo.mLoginIconId != 0) { + new GetDrawableAsyncTask().execute(); + } } } } - } - if (mLoginMsg != null) { - if (!TextUtils.isEmpty(mInCallPluginInfo.mCallMethodInfo.mLoginSubtitle)) { - mLoginMsg.setText(mInCallPluginInfo.mCallMethodInfo.mLoginSubtitle); - } else { - mLoginMsg.setText(getResources().getString(R.string.plugin_login_msg, - mInCallPluginInfo.mCallMethodInfo.mName)); + if (mLoginMsg != null) { + if (!TextUtils + .isEmpty(mInCallPluginInfo.mCallMethodInfo.mLoginSubtitle)) { + mLoginMsg.setText(mInCallPluginInfo.mCallMethodInfo.mLoginSubtitle); + } else { + mLoginMsg + .setText(getResources().getString(R.string.plugin_login_msg, + mInCallPluginInfo.mCallMethodInfo.mName)); + } } } } @@ -715,11 +725,19 @@ public class PluginContactBrowseListFragment extends ContactEntryListFragment<Co mPrefsFileName = PREFS_FILE_PREFIX + mInCallPluginInfo.mCallMethodInfo.mComponent.getClassName(); if (mPrefs != null) { - setFilter(ContactListFilter.createAccountFilter( - mInCallPluginInfo.mCallMethodInfo.mAccountType, - mInCallPluginInfo.mCallMethodInfo.mAccountHandle, - null, - null)); + // Account filter should be updated + if (mInCallPluginInfo.mCallMethodInfo.mIsAuthenticated && (!TextUtils.equals + (mAccountType, mInCallPluginInfo.mCallMethodInfo.mAccountType) || + TextUtils.equals(mAccountHandle, + mInCallPluginInfo.mCallMethodInfo.mAccountHandle))) { + mAccountType = mInCallPluginInfo.mCallMethodInfo.mAccountType; + mAccountHandle = mInCallPluginInfo.mCallMethodInfo.mAccountHandle; + setFilter(ContactListFilter.createAccountFilter( + mInCallPluginInfo.mCallMethodInfo.mAccountType, + mInCallPluginInfo.mCallMethodInfo.mAccountHandle, + null, + null)); + } } } } |