Move ContactListFilterListener back to PeopleActivity
- It's not a good idea to put the listener in a fragment since
we need to do a lot in PeopleActivity when filter changes, and
filter may change when fragment is not added (and this is when
b/31838582 happens).
- Change the style of ProviderStatusListener.
Bug: 31838582
Bug: 31829161
Bug: 30944495
Test: manual
- follow steps to repro in the first 2 bugs
- navigate between fragments
- Add a contact to an account w/o contact and remove the only contact
from it, to make sure ProviderStatusListener works.
Change-Id: Ie45065152db67bf2c7c7873a72038c6f1145d678
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index 19d1466..b810eec 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -583,7 +583,7 @@
setTitle(getString(R.string.contactsList));
}
- protected void resetFilter() {
+ private void resetFilter() {
final Intent intent = new Intent();
final ContactListFilter filter = AccountFilterUtil.createContactsFilter(this);
intent.putExtra(AccountFilterActivity.EXTRA_CONTACT_LIST_FILTER, filter);
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 8d0ec08..3488c53 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -37,6 +37,7 @@
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.SwipeRefreshLayout;
+import android.text.TextUtils;
import android.util.Log;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
@@ -44,6 +45,7 @@
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.ImageButton;
import android.widget.Toast;
@@ -52,12 +54,16 @@
import com.android.contacts.R;
import com.android.contacts.common.Experiments;
import com.android.contacts.common.activity.RequestPermissionsActivity;
+import com.android.contacts.common.compat.CompatUtils;
import com.android.contacts.common.list.ContactListFilter;
+import com.android.contacts.common.list.ContactListFilterController.ContactListFilterListener;
import com.android.contacts.common.list.ProviderStatusWatcher;
import com.android.contacts.common.list.ProviderStatusWatcher.ProviderStatusListener;
import com.android.contacts.common.logging.Logger;
import com.android.contacts.common.logging.ScreenEvent.ScreenType;
import com.android.contacts.common.model.AccountTypeManager;
+import com.android.contacts.common.model.account.AccountDisplayInfo;
+import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.util.AccountFilterUtil;
import com.android.contacts.common.util.Constants;
@@ -81,7 +87,7 @@
/**
* Displays a list to browse contacts.
*/
-public class PeopleActivity extends ContactsDrawerActivity implements ProviderStatusListener {
+public class PeopleActivity extends ContactsDrawerActivity {
private static final String TAG = "PeopleActivity";
private static final String TAG_ALL = "contacts-all";
@@ -121,10 +127,11 @@
/**
* True if this activity instance is a re-created one. i.e. set true after orientation change.
- * This is set in {@link #onCreate} for later use in {@link #onStart}.
*/
private boolean mIsRecreatedInstance;
+ private boolean mShouldSwitchToAllContacts;
+
/** Sequential ID assigned to each instance; used for logging */
private final int mInstanceId;
private static final AtomicInteger sNextInstanceId = new AtomicInteger();
@@ -149,7 +156,7 @@
return;
}
- final ContactListFilter filter = mAllFragment.getFilter();
+ final ContactListFilter filter = mContactListFilterController.getFilter();
if (filter != null) {
final SwipeRefreshLayout swipeRefreshLayout = mAllFragment.getSwipeRefreshLayout();
if (swipeRefreshLayout == null) {
@@ -177,6 +184,23 @@
}
}
+ private final ContactListFilterListener mFilterListener = new ContactListFilterListener() {
+ @Override
+ public void onContactListFilterChanged() {
+ final ContactListFilter filter = mContactListFilterController.getFilter();
+ handleFilterChangeForFragment(filter);
+ handleFilterChangeForActivity(filter);
+ }
+ };
+
+ private final ProviderStatusListener mProviderStatusListener = new ProviderStatusListener() {
+ @Override
+ public void onProviderStatusChange() {
+ reloadGroupsAndFiltersIfNeeded();
+ updateViewConfiguration(false);
+ }
+ };
+
public PeopleActivity() {
mInstanceId = sNextInstanceId.getAndIncrement();
mIntentResolver = new ContactsIntentResolver(this);
@@ -227,7 +251,8 @@
return;
}
- mProviderStatusWatcher.addListener(this);
+ mContactListFilterController.addListener(mFilterListener);
+ mProviderStatusWatcher.addListener(mProviderStatusListener);
mIsRecreatedInstance = (savedState != null);
@@ -425,6 +450,10 @@
protected void onResume() {
super.onResume();
+ if (mShouldSwitchToAllContacts) {
+ switchToAllContacts();
+ }
+
mProviderStatusWatcher.start();
updateViewConfiguration(true);
@@ -445,7 +474,8 @@
@Override
protected void onDestroy() {
- mProviderStatusWatcher.removeListener(this);
+ mProviderStatusWatcher.removeListener(mProviderStatusListener);
+ mContactListFilterController.removeListener(mFilterListener);
super.onDestroy();
}
@@ -483,12 +513,6 @@
}
}
- @Override
- public void onProviderStatusChange() {
- reloadGroupsAndFiltersIfNeeded();
- updateViewConfiguration(false);
- }
-
private void reloadGroupsAndFiltersIfNeeded() {
final int providerStatus = mProviderStatusWatcher.getProviderStatus();
final Menu menu = mNavigationView.getMenu();
@@ -656,7 +680,7 @@
return true;
}
- if (!AccountFilterUtil.isAllContactsFilter(mAllFragment.getFilter())
+ if (!AccountFilterUtil.isAllContactsFilter(mContactListFilterController.getFilter())
&& !mAllFragment.isHidden()) {
// If mAllFragment is hidden, then mContactsUnavailableFragment is visible so we
// don't need to switch to all contacts.
@@ -773,7 +797,6 @@
transaction.commit();
fragmentManager.executePendingTransactions();
- resetFilter();
showFabWithAnimation(/* showFab */ false);
}
@@ -782,6 +805,7 @@
if (isInSecondLevel()) {
popSecondLevel();
}
+ mShouldSwitchToAllContacts = false;
mCurrentView = ContactsView.ALL_CONTACTS;
showFabWithAnimation(/* showFab */ true);
@@ -808,4 +832,46 @@
protected GroupMetaData getGroupMetaData() {
return mMembersFragment == null ? null : mMembersFragment.getGroupMetaData();
}
+
+ private void handleFilterChangeForFragment(ContactListFilter filter) {
+ mAllFragment.setFilterAndUpdateTitle(filter);
+ // Scroll to top after filter is changed.
+ mAllFragment.scrollToTop();
+ }
+
+ private void handleFilterChangeForActivity(ContactListFilter filter) {
+ // Set mShouldSwitchToAllContacts to true, so that we can switch to all contacts later.
+ if (filter.isContactsFilterType()) {
+ mShouldSwitchToAllContacts = true;
+ }
+
+ // Set title and check menu in navigation drawer.
+ final String actionBarTitle;
+ if (filter.filterType == ContactListFilter.FILTER_TYPE_DEVICE_CONTACTS) {
+ actionBarTitle = getString(R.string.account_phone);
+ } else if (!TextUtils.isEmpty(filter.accountName)) {
+ actionBarTitle = getActionBarTitleForAccount(filter);
+ } else {
+ actionBarTitle = getString(R.string.contactsList);
+ }
+ setTitle(actionBarTitle);
+ updateFilterMenu(filter);
+
+ if (CompatUtils.isNCompatible()) {
+ getWindow().getDecorView()
+ .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
+ }
+ invalidateOptionsMenu();
+ }
+
+ private String getActionBarTitleForAccount(ContactListFilter filter) {
+ final AccountDisplayInfoFactory factory = AccountDisplayInfoFactory
+ .forAllAccounts(this);
+ final AccountDisplayInfo account = factory.getAccountDisplayInfoFor(filter);
+ if (account.hasGoogleAccountType()) {
+ return getString(R.string.title_from_google);
+ }
+ return account.withFormattedName(this, R.string.title_from_other_accounts)
+ .getNameLabel().toString();
+ }
}
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index dd45fc2..4cd45a7 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -55,12 +55,10 @@
import com.android.contacts.R;
import com.android.contacts.activities.ActionBarAdapter;
import com.android.contacts.common.Experiments;
-import com.android.contacts.common.compat.CompatUtils;
import com.android.contacts.common.list.ContactEntryListFragment;
import com.android.contacts.common.list.ContactListAdapter;
import com.android.contacts.common.list.ContactListFilter;
import com.android.contacts.common.list.ContactListFilterController;
-import com.android.contacts.common.list.ContactListFilterController.ContactListFilterListener;
import com.android.contacts.common.list.ContactListItemView;
import com.android.contacts.common.list.DefaultContactListAdapter;
import com.android.contacts.common.list.DirectoryListLoader;
@@ -69,8 +67,6 @@
import com.android.contacts.common.logging.Logger;
import com.android.contacts.common.logging.ScreenEvent;
import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.account.AccountDisplayInfo;
-import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.util.AccountFilterUtil;
import com.android.contacts.common.util.ImplicitIntentsUtil;
@@ -138,18 +134,6 @@
private ContactsRequest mContactsRequest;
private ContactListFilterController mContactListFilterController;
- private final ContactListFilterListener mFilterListener = new ContactListFilterListener() {
- @Override
- public void onContactListFilterChanged() {
- setFilterAndUpdateTitle(getFilter());
-
- // Scroll to top after filter is changed.
- getListView().setSelection(0);
-
- mActivity.invalidateOptionsMenu();
- }
- };
-
private final ActionBarAdapter.Listener mActionBarListener = new ActionBarAdapter.Listener() {
@Override
public void onAction(int action) {
@@ -335,6 +319,12 @@
view == mAccountFilterContainer ? View.VISIBLE : View.GONE);
}
+ public void scrollToTop() {
+ if (getListView() != null) {
+ getListView().setSelection(0);
+ }
+ }
+
@Override
protected void onItemClick(int position, long id) {
final Uri uri = getAdapter().getContactUri(position);
@@ -425,7 +415,6 @@
mIsRecreatedInstance = (savedState != null);
mContactListFilterController = ContactListFilterController.getInstance(getContext());
mContactListFilterController.checkFilterValidity(false);
- mContactListFilterController.addListener(mFilterListener);
// Use FILTER_TYPE_ALL_ACCOUNTS filter if the instance is not a re-created one.
// This is useful when user upgrades app while an account filter was
// stored in sharedPreference in a previous version of Contacts app.
@@ -689,7 +678,7 @@
}
}
- private void setFilterAndUpdateTitle(ContactListFilter filter) {
+ public void setFilterAndUpdateTitle(ContactListFilter filter) {
setFilterAndUpdateTitle(filter, true);
}
@@ -697,39 +686,12 @@
setContactListFilter(filter);
updateListFilter(filter, restoreSelectedUri);
- final String actionBarTitle;
- if (filter.filterType == ContactListFilter.FILTER_TYPE_DEVICE_CONTACTS) {
- actionBarTitle = getString(R.string.account_phone);
- } else if (!TextUtils.isEmpty(filter.accountName)) {
- actionBarTitle = getActionBarTitleForAccount(filter);
- } else {
- actionBarTitle = getString(R.string.contactsList);
- }
- mActivity.setTitle(actionBarTitle);
- mActivity.updateFilterMenu(filter);
-
- if (CompatUtils.isNCompatible()) {
- mActivity.getWindow().getDecorView()
- .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
- }
-
// Determine whether the account has pullToRefresh feature
if (Flags.getInstance(getContext()).getBoolean(Experiments.PULL_TO_REFRESH)) {
setSwipeRefreshLayoutEnabledOrNot(filter);
}
}
- private String getActionBarTitleForAccount(ContactListFilter filter) {
- final AccountDisplayInfoFactory factory = AccountDisplayInfoFactory
- .forAllAccounts(getContext());
- final AccountDisplayInfo account = factory.getAccountDisplayInfoFor(filter);
- if (account.hasGoogleAccountType()) {
- return getString(R.string.title_from_google);
- }
- return account.withFormattedName(getContext(), R.string.title_from_other_accounts)
- .getNameLabel().toString();
- }
-
private void setSwipeRefreshLayoutEnabledOrNot(ContactListFilter filter) {
final SwipeRefreshLayout swipeRefreshLayout = getSwipeRefreshLayout();
if (swipeRefreshLayout == null) {
@@ -1081,9 +1043,6 @@
if (mActionBarAdapter != null) {
mActionBarAdapter.setListener(null);
}
- if (mContactListFilterController != null) {
- mContactListFilterController.removeListener(mFilterListener);
- }
super.onDestroy();
}