Bring back account filter
- ContactListFilterController no longer loads accounts and groups,
to display in the action bar drop down menu. Now it just stores
current filter and saves it to preferences.
- ContactListFilterLoader is no longer needed because we're not
loading groups anymore
- Move adapter from ContactListFilterController to the
AccountFilterActivity
- AccountFilterActivity loads a list of accounts and returns
a ContactListFilter as an activity result based on the account
selected
- If "customize" is selected, then the CustomContactListFilterActivity
will be launched.
- Show header in contacts list according to what account filter
was selected
- Update filter activities to holo theme
- TODO: Remove the "display phones only" option in the
customize menu on the phone
Change-Id: I45e0bdee80e7885d39bf09183a66ec50d81d1982
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 56bf4e5..e27445f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -315,11 +315,17 @@
android:label="@string/activity_title_settings"
android:theme="@style/ContactsPreferencesTheme" />
+ <!-- Used to filter contacts list by account -->
+ <activity
+ android:name=".list.AccountFilterActivity"
+ android:label="@string/activity_title_contacts_filter"
+ android:theme="@style/ContactListFilterTheme" />
+
<!-- Used to select display and sync groups -->
<activity
android:name=".list.CustomContactListFilterActivity"
android:label="@string/custom_list_filter"
- android:theme="@style/CustomContactListFilterTheme" />
+ android:theme="@style/ContactListFilterTheme" />
<activity
android:name=".activities.ShowOrCreateActivity"
diff --git a/res/layout/contact_list_filter.xml b/res/layout/contact_list_filter.xml
new file mode 100644
index 0000000..de05cf8
--- /dev/null
+++ b/res/layout/contact_list_filter.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:fillViewport="true">
+
+ <ListView
+ android:id="@android:id/list"
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:layout_marginLeft="16dip"
+ android:layout_marginRight="16dip"
+ android:background="?android:attr/dividerHorizontal" />
+</LinearLayout>
diff --git a/res/layout/contacts_list_content.xml b/res/layout/contacts_list_content.xml
index 6792f9c..b92929b 100644
--- a/res/layout/contacts_list_content.xml
+++ b/res/layout/contacts_list_content.xml
@@ -21,6 +21,19 @@
android:layout_height="match_parent"
android:orientation="vertical">
+ <TextView
+ android:id="@+id/account_filter_header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:gravity="center"
+ android:padding="5dip"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@android:color/white"
+ android:background="@android:color/black"
+ android:visibility="gone" />
+
<view
class="com.android.contacts.list.ContactEntryListView"
android:id="@android:id/list"
diff --git a/res/values-sw580dp/styles.xml b/res/values-sw580dp/styles.xml
index 32d02be..4f2b073 100644
--- a/res/values-sw580dp/styles.xml
+++ b/res/values-sw580dp/styles.xml
@@ -60,10 +60,11 @@
<item name="list_item_header_text_size">14sp</item>
</style>
- <style name="CustomContactListFilterTheme" parent="@android:Theme.Holo.Light.Dialog">
+ <style name="ContactListFilterTheme" parent="@android:Theme.Holo.Light.Dialog">
+ <item name="android:windowCloseOnTouchOutside">true</item>
</style>
- <style name="CustomContactListFilterView" parent="CustomContactListFilterTheme">
+ <style name="CustomContactListFilterView" parent="ContactListFilterTheme">
<item name="android:layout_width">400dip</item>
<item name="android:layout_height">400dip</item>
</style>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 821e5f8..a25b73d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -366,6 +366,9 @@
<!-- Displayed at the top of the contacts showing the zero total number of contacts visible when a group or account is selected [CHAR LIMIT=64]-->
<string name="listTotalAllContactsZeroGroup">No contacts in <xliff:g id="name" example="Friends">%s</xliff:g></string>
+ <!-- Displayed at the top of the contacts showing the account filter selected [CHAR LIMIT=64] -->
+ <string name="listAllContactsInAccount">Contacts in <xliff:g id="name" example="abc@gmail.com">%s</xliff:g></string>
+
<!-- Displayed at the top of the contacts showing the total number of contacts found when "Only contacts with phones" not selected -->
<plurals name="listFoundAllContacts">
<item quantity="one">1 found</item>
@@ -1490,6 +1493,9 @@
<!-- Title of the settings activity [CHAR LIMIT=64] -->
<string name="activity_title_settings">Settings</string>
+ <!-- Title of the activity that allows the uesr to filter the list of contacts displayed according to account [CHAR LIMIT=25] -->
+ <string name="activity_title_contacts_filter">Contacts to display</string>
+
<!-- Menu item for the settings activity [CHAR LIMIT=64] -->
<string name="menu_settings">Settings</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 067a730..914532c 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -227,7 +227,7 @@
<style name="ContactsPreferencesTheme" parent="@android:Theme.Holo.Light">
</style>
- <style name="CustomContactListFilterTheme" parent="@android:Theme">
+ <style name="ContactListFilterTheme" parent="@android:Theme.Holo.Light">
</style>
<style name="ContactPickerLayout" parent="ContactPickerTheme">
@@ -235,7 +235,7 @@
<item name="android:layout_height">match_parent</item>
</style>
- <style name="CustomContactListFilterView" parent="CustomContactListFilterTheme">
+ <style name="CustomContactListFilterView" parent="ContactListFilterTheme">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">match_parent</item>
</style>
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index e0f8aef..51ed1e8 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -18,8 +18,6 @@
import com.android.contacts.R;
import com.android.contacts.activities.ActionBarAdapter.Listener.Action;
-import com.android.contacts.list.ContactListFilterController;
-import com.android.contacts.list.ContactListFilterController.ContactListFilterListener;
import com.android.contacts.list.ContactsRequest;
import android.app.ActionBar;
@@ -36,8 +34,7 @@
/**
* Adapter for the action bar at the top of the Contacts activity.
*/
-public class ActionBarAdapter
- implements OnQueryTextListener, OnCloseListener, ContactListFilterListener {
+public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
public interface Listener {
public enum Action {
@@ -61,7 +58,6 @@
private final boolean mAlwaysShowSearchView;
private Listener mListener;
- private ContactListFilterController mFilterController;
private ActionBar mActionBar;
@@ -108,11 +104,6 @@
mListener = listener;
}
- public void setContactListFilterController(ContactListFilterController controller) {
- mFilterController = controller;
- mFilterController.addListener(this);
- }
-
public boolean isSearchMode() {
return mSearchMode;
}
@@ -210,20 +201,6 @@
mActionBar.setSelectedNavigationItem(savedState.getInt(EXTRA_KEY_SELECTED_TAB));
}
- @Override
- public void onContactListFiltersLoaded() {
- update();
- }
-
- @Override
- public void onContactListFilterChanged() {
- update();
- }
-
- @Override
- public void onContactListFilterCustomizationRequest() {
- }
-
private void setFocusOnSearchView() {
mSearchView.requestFocus();
mSearchView.setIconified(false); // Workaround for the "IME not popping up" issue.
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 19019f4..049deb0 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -32,6 +32,7 @@
import com.android.contacts.interactions.ContactDeletionInteraction;
import com.android.contacts.interactions.ImportExportDialogFragment;
import com.android.contacts.interactions.PhoneNumberInteraction;
+import com.android.contacts.list.AccountFilterActivity;
import com.android.contacts.list.ContactBrowseListContextMenuAdapter;
import com.android.contacts.list.ContactBrowseListFragment;
import com.android.contacts.list.ContactEntryListFragment;
@@ -108,7 +109,8 @@
private static final int SUBACTIVITY_EDIT_CONTACT = 3;
private static final int SUBACTIVITY_NEW_GROUP = 4;
private static final int SUBACTIVITY_EDIT_GROUP = 5;
- private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 6;
+ private static final int SUBACTIVITY_ACCOUNT_FILTER = 6;
+ private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 7;
private static final String KEY_SEARCH_MODE = "searchMode";
@@ -178,8 +180,6 @@
public PeopleActivity() {
mIntentResolver = new ContactsIntentResolver(this);
- // TODO: Get rid of the ContactListFilterController class because there aren't any
- // dropdown filters anymore. Just store the selected filter as a member variable.
mContactListFilterController = new ContactListFilterController(this);
mContactListFilterController.addListener(this);
mProviderStatusLoader = new ProviderStatusLoader(this);
@@ -304,7 +304,6 @@
ActionBar actionBar = getActionBar();
mActionBarAdapter = new ActionBarAdapter(this, this);
mActionBarAdapter.onCreate(savedState, mRequest, getActionBar());
- mActionBarAdapter.setContactListFilterController(mContactListFilterController);
ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
ContactDetailTabCarousel tabCarousel = (ContactDetailTabCarousel)
@@ -489,17 +488,6 @@
}
@Override
- public void onContactListFiltersLoaded() {
- if (mListFragment == null || !mListFragment.isAdded()) {
- return;
- }
-
- mListFragment.setFilter(mContactListFilterController.getFilter());
-
- invalidateOptionsMenuIfNeeded();
- }
-
- @Override
public void onContactListFilterChanged() {
if (mListFragment == null || !mListFragment.isAdded()) {
return;
@@ -510,12 +498,6 @@
invalidateOptionsMenuIfNeeded();
}
- @Override
- public void onContactListFilterCustomizationRequest() {
- startActivityForResult(new Intent(this, CustomContactListFilterActivity.class),
- SUBACTIVITY_CUSTOMIZE_FILTER);
- }
-
private void setupContactDetailFragment(final Uri contactLookupUri) {
mContactDetailLoaderFragment.loadUri(contactLookupUri);
invalidateOptionsMenuIfNeeded();
@@ -593,7 +575,7 @@
mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
}
- if (mContactListFilterController.isLoaded()) {
+ if (mContactListFilterController.isInitialized()) {
mListFragment.setFilter(mContactListFilterController.getFilter());
}
}
@@ -1035,8 +1017,8 @@
return true;
}
case R.id.menu_contacts_filter: {
- final Intent intent = new Intent(this, CustomContactListFilterActivity.class);
- startActivityForResult(intent, SUBACTIVITY_CUSTOMIZE_FILTER);
+ final Intent intent = new Intent(this, AccountFilterActivity.class);
+ startActivityForResult(intent, SUBACTIVITY_ACCOUNT_FILTER);
return true;
}
case R.id.menu_search: {
@@ -1115,13 +1097,30 @@
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
+ case SUBACTIVITY_ACCOUNT_FILTER: {
+ if (resultCode == Activity.RESULT_OK) {
+ ContactListFilter filter = (ContactListFilter) data.getParcelableExtra(
+ AccountFilterActivity.KEY_EXTRA_CONTACT_LIST_FILTER);
+ if (filter == null) {
+ return;
+ }
+ // If this is a custom filter, launch the activity to customize the display list
+ if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
+ final Intent intent = new Intent(this,
+ CustomContactListFilterActivity.class);
+ startActivityForResult(intent, SUBACTIVITY_CUSTOMIZE_FILTER);
+ } else {
+ mContactListFilterController.setContactListFilter(filter, true);
+ }
+ }
+ break;
+ }
case SUBACTIVITY_CUSTOMIZE_FILTER: {
if (resultCode == Activity.RESULT_OK) {
mContactListFilterController.selectCustomFilter();
}
break;
}
-
case SUBACTIVITY_EDIT_CONTACT:
case SUBACTIVITY_NEW_CONTACT: {
if (resultCode == RESULT_OK && mContentPaneDisplayed) {
diff --git a/src/com/android/contacts/list/AccountFilterActivity.java b/src/com/android/contacts/list/AccountFilterActivity.java
new file mode 100644
index 0000000..c38599e
--- /dev/null
+++ b/src/com/android/contacts/list/AccountFilterActivity.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.list;
+
+import com.android.contacts.ContactsActivity;
+import com.android.contacts.ContactsSearchManager;
+import com.android.contacts.R;
+import com.android.contacts.model.AccountType;
+import com.android.contacts.model.AccountTypeManager;
+
+import android.accounts.Account;
+import android.app.ActionBar;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Shows a list of all available accounts, letting the user select under which account to view
+ * contacts.
+ */
+public class AccountFilterActivity extends ContactsActivity
+ implements AdapterView.OnItemClickListener {
+
+ private static final String TAG = AccountFilterActivity.class.getSimpleName();
+
+ public static final String KEY_EXTRA_CONTACT_LIST_FILTER = "contactListFilter";
+
+ private ListView mListView;
+
+ private List<ContactListFilter> mFilters = new ArrayList<ContactListFilter>();
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setContentView(R.layout.contact_list_filter);
+
+ mListView = (ListView) findViewById(com.android.internal.R.id.list);
+ mListView.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ finishAndSetResult(mFilters.get(position));
+ }
+ });
+
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+
+ loadAccountFilters();
+ }
+
+ private void loadAccountFilters() {
+ ArrayList<ContactListFilter> accountFilters = new ArrayList<ContactListFilter>();
+ final AccountTypeManager accountTypes = AccountTypeManager.getInstance(this);
+ ArrayList<Account> accounts = accountTypes.getAccounts(false);
+ for (Account account : accounts) {
+ AccountType accountType = accountTypes.getAccountType(account.type);
+ Drawable icon = accountType != null ? accountType.getDisplayIcon(this) : null;
+ accountFilters.add(ContactListFilter.createAccountFilter(account.type, account.name,
+ icon, account.name));
+ }
+ int count = accountFilters.size();
+
+ if (count >= 1) {
+ // If we only have one account, don't show it as "account", instead show it as "all"
+ mFilters.add(ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
+ if (count > 1) {
+ mFilters.addAll(accountFilters);
+ mFilters.add(ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_CUSTOM));
+ }
+ }
+
+ mListView.setAdapter(new FilterListAdapter(this));
+ }
+
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ finishAndSetResult(mFilters.get(position));
+ }
+
+ private void finishAndSetResult(ContactListFilter filter) {
+ final Intent intent = new Intent();
+ intent.putExtra(KEY_EXTRA_CONTACT_LIST_FILTER, filter);
+ setResult(Activity.RESULT_OK, intent);
+ finish();
+ }
+
+ @Override
+ public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
+ boolean globalSearch) {
+ if (globalSearch) {
+ super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
+ } else {
+ ContactsSearchManager.startSearch(this, initialQuery);
+ }
+ }
+
+ private class FilterListAdapter extends BaseAdapter {
+ private LayoutInflater mLayoutInflater;
+
+ public FilterListAdapter(Context context) {
+ mLayoutInflater = (LayoutInflater) context.getSystemService
+ (Context.LAYOUT_INFLATER_SERVICE);
+ }
+
+ @Override
+ public int getCount() {
+ return mFilters.size();
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public ContactListFilter getItem(int position) {
+ return mFilters.get(position);
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ContactListFilterView view;
+ if (convertView != null) {
+ view = (ContactListFilterView) convertView;
+ } else {
+ view = (ContactListFilterView) mLayoutInflater.inflate(
+ R.layout.filter_spinner_item, parent, false);
+ }
+ view.setSingleAccount(mFilters.size() == 1);
+ ContactListFilter filter = mFilters.get(position);
+ view.setContactListFilter(filter);
+ view.bindView(true);
+ return view;
+ }
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ finish();
+ return true;
+ default:
+ break;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+}
diff --git a/src/com/android/contacts/list/ContactListFilterController.java b/src/com/android/contacts/list/ContactListFilterController.java
index 533f24a..28b62ca 100644
--- a/src/com/android/contacts/list/ContactListFilterController.java
+++ b/src/com/android/contacts/list/ContactListFilterController.java
@@ -15,67 +15,43 @@
*/
package com.android.contacts.list;
-import com.android.contacts.R;
-
import android.app.Activity;
-import android.app.LoaderManager;
-import android.app.LoaderManager.LoaderCallbacks;
import android.content.Context;
-import android.content.Loader;
import android.content.SharedPreferences;
-import android.content.res.TypedArray;
-import android.os.Bundle;
import android.preference.PreferenceManager;
-import android.text.TextUtils;
-import android.util.SparseArray;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.BaseAdapter;
-import android.widget.ListPopupWindow;
import java.util.ArrayList;
import java.util.List;
/**
- * Controls a list of {@link ContactListFilter}'s.
+ * Stores the {@link ContactListFilter} selected by the user and saves it to
+ * {@link SharedPreferences} if necessary.
*/
-// TODO: Remove the extra functionality dealing with loading and displaying a list of filters in
-// the action bar.
-public class ContactListFilterController
- implements LoaderCallbacks<List<ContactListFilter>>, OnClickListener, OnItemClickListener {
+public class ContactListFilterController {
public interface ContactListFilterListener {
- void onContactListFiltersLoaded();
void onContactListFilterChanged();
- void onContactListFilterCustomizationRequest();
}
private Context mContext;
- private LoaderManager mLoaderManager;
- private boolean mEnabled = true;
private List<ContactListFilterListener> mListeners = new ArrayList<ContactListFilterListener>();
- private ListPopupWindow mPopup;
- private int mPopupWidth = -1;
- private List<ContactListFilter> mCachedFilters;
- private SparseArray<ContactListFilter> mFilters;
- private int mNextFilterId = 1;
- private View mAnchor;
- private FilterListAdapter mFilterListAdapter;
private ContactListFilter mFilter;
- private boolean mFiltersLoaded;
- private int mAccountCount;
+
+ private boolean mIsInitialized;
public ContactListFilterController(Activity activity) {
mContext = activity;
- mLoaderManager = activity.getLoaderManager();
}
- public void setEnabled(boolean flag) {
- mEnabled = flag;
+ public void onStart() {
+ if (mFilter == null) {
+ mFilter = ContactListFilter.restoreFromPreferences(getSharedPreferences());
+ mIsInitialized = true;
+ }
+ }
+
+ public boolean isInitialized() {
+ return mIsInitialized;
}
public void addListener(ContactListFilterListener listener) {
@@ -90,157 +66,10 @@
return mFilter;
}
- public int getFilterCount() {
- return mFilters != null ? mFilters.size() : 0;
- }
-
- public boolean isLoaded() {
- return mFiltersLoaded;
- }
-
- public void onStart() {
- if (mFilter == null) {
- mFilter = ContactListFilter.restoreFromPreferences(getSharedPreferences());
- }
- }
-
private SharedPreferences getSharedPreferences() {
return PreferenceManager.getDefaultSharedPreferences(mContext);
}
- @Override
- public ContactListFilterLoader onCreateLoader(int id, Bundle args) {
- return new ContactListFilterLoader(mContext);
- }
-
- @Override
- public void onLoadFinished(
- Loader<List<ContactListFilter>> loader, List<ContactListFilter> filters) {
- int count = filters.size();
- if (mCachedFilters != null && mCachedFilters.size() == count) {
- boolean changed = false;
- for (int i = 0; i < filters.size(); i++) {
- ContactListFilter filter1 = mCachedFilters.get(i);
- ContactListFilter filter2 = filters.get(i);
- if (!filter1.equals(filter2)) {
- changed = true;
- break;
- }
-
- // Group title is intentionally not included in the "equals" algorithm for
- // ContactListFilter, because we want stability of filter identity
- // across label changes. However, here we do care about the label changes.
- if (filter1.filterType == ContactListFilter.FILTER_TYPE_GROUP &&
- !TextUtils.equals(filter1.title, filter2.title)) {
- changed = true;
- break;
- }
- }
-
- if (!changed) {
- return;
- }
- }
-
- mCachedFilters = filters;
-
- if (mFilters == null) {
- mFilters = new SparseArray<ContactListFilter>(filters.size());
- } else {
- mFilters.clear();
- }
-
- boolean filterValid = mFilter != null && !mFilter.isValidationRequired();
-
- mAccountCount = 0;
- for (int index = 0; index < count; index++) {
- if (filters.get(index).filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
- mAccountCount++;
- }
- }
-
- if (mAccountCount != 1) {
- mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
- ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
- mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
- ContactListFilter.FILTER_TYPE_STARRED));
- }
-
- for (int index = 0; index < count; index++) {
- ContactListFilter filter = filters.get(index);
-
- boolean firstAndOnly = mAccountCount == 1
- && filter.filterType == ContactListFilter.FILTER_TYPE_ACCOUNT;
-
- // If we only have one account, don't show it as "account", instead show it as "all"
- if (firstAndOnly) {
- filter = ContactListFilter.createFilterWithType(
- ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
- }
-
- mFilters.append(mNextFilterId++, filter);
-
- if (filter.equals(mFilter)) {
- // Refresh the filter in case the title got changed
- mFilter = filter;
- filterValid = true;
- }
-
- if (firstAndOnly) {
- mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
- ContactListFilter.FILTER_TYPE_STARRED));
- }
- }
-
- if (mAccountCount > 0) {
- mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
- ContactListFilter.FILTER_TYPE_CUSTOM));
- }
-
- boolean filterChanged = false;
- if (mFilter == null || !filterValid) {
- filterChanged = mFilter != null;
- mFilter = getDefaultFilter();
- }
-
- if (mFilterListAdapter == null) {
- mFilterListAdapter = new FilterListAdapter();
- } else {
- mFilterListAdapter.notifyDataSetChanged();
- }
-
- mFiltersLoaded = true;
- notifyContacListFiltersLoaded();
-
- if (filterChanged) {
- notifyContactListFilterChanged();
- }
- }
-
- public void onLoaderReset(Loader<List<ContactListFilter>> loader) {
- }
-
- private void setContactListFilter(int filterId) {
- ContactListFilter filter;
- if (filterId == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
- filter = ContactListFilter.createFilterWithType(
- ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
- } else if (filterId == ContactListFilter.FILTER_TYPE_CUSTOM) {
- filter = ContactListFilter.createFilterWithType(
- ContactListFilter.FILTER_TYPE_CUSTOM);
- } else if (filterId == ContactListFilter.FILTER_TYPE_STARRED) {
- filter = ContactListFilter.createFilterWithType(
- ContactListFilter.FILTER_TYPE_STARRED);
- } else {
- filter = mFilters.get(filterId);
- if (filter == null) {
- filter = getDefaultFilter();
- }
- }
-
- setContactListFilter(filter, true);
- }
-
public void setContactListFilter(ContactListFilter filter, boolean persistent) {
if (!filter.equals(mFilter)) {
mFilter = filter;
@@ -253,59 +82,9 @@
}
}
- @Override
- public void onClick(View v) {
- if (!mFiltersLoaded || !mEnabled) {
- return;
- }
-
- if (mPopupWidth == -1) {
- TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ContactBrowser);
- mPopupWidth = a.getDimensionPixelSize(
- R.styleable.ContactBrowser_contact_filter_popup_width, -1);
- a.recycle();
-
- if (mPopupWidth == -1) {
- mPopupWidth = mAnchor.getWidth();
- }
- }
-
- mPopup = new ListPopupWindow(mContext, null);
- mPopup.setWidth(mPopupWidth);
- mPopup.setAdapter(mFilterListAdapter);
- mPopup.setAnchorView(mAnchor);
- mPopup.setOnItemClickListener(this);
- mPopup.setModal(true);
- mPopup.show();
- }
-
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- mPopup.dismiss();
- if (mFilters.get((int) id).filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
- notifyContactListFilterCustomizationRequest();
- } else {
- setContactListFilter((int) id);
- }
- }
-
public void selectCustomFilter() {
- mFilter = ContactListFilter.createFilterWithType(ContactListFilter.FILTER_TYPE_CUSTOM);
- notifyContactListFilterChanged();
- }
-
- public int getAccountCount() {
- return mAccountCount;
- }
-
- private ContactListFilter getDefaultFilter() {
- return mFilters.size() > 0 ? mFilters.valueAt(0) : null;
- }
-
- private void notifyContacListFiltersLoaded() {
- for (ContactListFilterListener listener : mListeners) {
- listener.onContactListFiltersLoaded();
- }
+ setContactListFilter(ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_CUSTOM), true);
}
private void notifyContactListFilterChanged() {
@@ -314,48 +93,4 @@
}
}
- private void notifyContactListFilterCustomizationRequest() {
- for (ContactListFilterListener listener : mListeners) {
- listener.onContactListFilterCustomizationRequest();
- }
- }
-
- private class FilterListAdapter extends BaseAdapter {
- private LayoutInflater mLayoutInflater;
-
- public FilterListAdapter() {
- mLayoutInflater = LayoutInflater.from(mContext);
- }
-
- @Override
- public int getCount() {
- return mFilters.size();
- }
-
- @Override
- public long getItemId(int position) {
- return mFilters.keyAt(position);
- }
-
- @Override
- public Object getItem(int position) {
- return mFilters.valueAt(position);
- }
-
- public View getView(int position, View convertView, ViewGroup parent) {
- ContactListFilterView view;
- if (convertView != null) {
- view = (ContactListFilterView) convertView;
- } else {
- view = (ContactListFilterView) mLayoutInflater.inflate(
- R.layout.filter_spinner_item, parent, false);
- }
- view.setSingleAccount(mAccountCount == 1);
- ContactListFilter filter = mFilters.valueAt(position);
- view.setContactListFilter(filter);
- view.setActivated(filter.equals(mFilter));
- view.bindView(true);
- return view;
- }
- }
}
diff --git a/src/com/android/contacts/list/ContactListFilterLoader.java b/src/com/android/contacts/list/ContactListFilterLoader.java
deleted file mode 100644
index 07c11bc..0000000
--- a/src/com/android/contacts/list/ContactListFilterLoader.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.list;
-
-import com.android.contacts.model.AccountType;
-import com.android.contacts.model.AccountTypeManager;
-
-import android.accounts.Account;
-import android.content.AsyncTaskLoader;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.database.Cursor;
-import android.graphics.drawable.Drawable;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Groups;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A loader for the data needed for the group selector.
- */
-public class ContactListFilterLoader extends AsyncTaskLoader<List<ContactListFilter>> {
-
- private static final class GroupQuery {
- public static final String[] COLUMNS = {
- Groups._ID,
- Groups.ACCOUNT_TYPE,
- Groups.ACCOUNT_NAME,
- Groups.TITLE,
- Groups.AUTO_ADD,
- Groups.SOURCE_ID,
- Groups.GROUP_IS_READ_ONLY,
- };
-
- public static final int ID = 0;
- public static final int ACCOUNT_TYPE = 1;
- public static final int ACCOUNT_NAME = 2;
- public static final int TITLE = 3;
- public static final int IS_DEFAULT_GROUP = 4; // Using the AUTO_ADD group as default
- public static final int SOURCE_ID = 5;
- public static final int GROUP_IS_READ_ONLY = 6;
-
- public static final String SELECTION =
- Groups.DELETED + "=0" +
- " AND " + Groups.FAVORITES + "=0" +
- " AND " + Groups.ACCOUNT_TYPE + " NOT NULL" +
- " AND " + Groups.ACCOUNT_NAME + " NOT NULL";
- }
-
- private boolean mStopped;
- private ForceLoadContentObserver mObserver;
- private ArrayList<ContactListFilter> mResults;
-
- public ContactListFilterLoader(Context context) {
- super(context);
- }
-
- @Override
- public List<ContactListFilter> loadInBackground() {
-
- ArrayList<ContactListFilter> results = new ArrayList<ContactListFilter>();
- Context context = getContext();
- final AccountTypeManager accountTypes = AccountTypeManager.getInstance(context);
- ArrayList<Account> accounts = accountTypes.getAccounts(false);
- for (Account account : accounts) {
- AccountType accountType = accountTypes.getAccountType(account.type);
- Drawable icon = accountType != null ? accountType.getDisplayIcon(getContext()) : null;
- results.add(ContactListFilter.createAccountFilter(account.type, account.name, icon,
- account.name));
- }
-
- ContentResolver resolver = context.getContentResolver();
-
- Cursor cursor = resolver.query(
- Groups.CONTENT_URI, GroupQuery.COLUMNS, GroupQuery.SELECTION, null, null);
- try {
- while (cursor.moveToNext()) {
- long groupId = cursor.getLong(GroupQuery.ID);
- String groupSourceId = cursor.getString(GroupQuery.SOURCE_ID);
- boolean groupReadOnly = cursor.getInt(GroupQuery.GROUP_IS_READ_ONLY) != 0;
- String accountType = cursor.getString(GroupQuery.ACCOUNT_TYPE);
- String accountName = cursor.getString(GroupQuery.ACCOUNT_NAME);
- boolean defaultGroup = false;
- if (!cursor.isNull(GroupQuery.IS_DEFAULT_GROUP)) {
- defaultGroup = cursor.getInt(GroupQuery.IS_DEFAULT_GROUP) != 0;
- }
- if (defaultGroup) {
- // Find the filter for this account and set the default group ID
- for (ContactListFilter filter : results) {
- if (filter.accountName.equals(accountName)
- && filter.accountType.equals(accountType)) {
- filter.groupId = groupId;
- filter.groupSourceId = groupSourceId;
- break;
- }
- }
- } else {
- String title = cursor.getString(GroupQuery.TITLE);
- results.add(ContactListFilter.createGroupFilter(accountType, accountName,
- groupId, groupSourceId, groupReadOnly, title));
- }
- }
- } finally {
- cursor.close();
- }
-
- Collections.sort(results);
-
- mResults = results;
- return results;
- }
-
- /* Runs on the UI thread */
- @Override
- public void deliverResult(List<ContactListFilter> results) {
- if (!mStopped) {
- super.deliverResult(results);
- }
- }
-
- @Override
- protected void onStartLoading() {
- if (mObserver == null) {
- mObserver = new ForceLoadContentObserver();
- getContext().getContentResolver().registerContentObserver(
- Contacts.CONTENT_URI, true, mObserver);
- }
-
- mStopped = false;
-
- if (mResults != null) {
- deliverResult(mResults);
- } else {
- forceLoad();
- }
- }
-
- @Override
- protected void onStopLoading() {
- if (mObserver != null) {
- getContext().getContentResolver().unregisterContentObserver(mObserver);
- mObserver = null;
- }
-
- mResults = null;
-
- // Attempt to cancel the current load task if possible.
- cancelLoad();
-
- // Make sure that any outstanding loads clean themselves up properly
- mStopped = true;
- }
-
- @Override
- protected void onReset() {
- stopLoading();
- }
-}
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index f95c4af..88531e1 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -34,6 +34,7 @@
private View mCounterHeaderView;
private View mSearchHeaderView;
+ private TextView mAccountFilterHeaderView;
public DefaultContactBrowseListFragment() {
setPhotoLoaderEnabled(true);
@@ -63,6 +64,8 @@
protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
super.onCreateView(inflater, container);
+ mAccountFilterHeaderView = (TextView) getView().findViewById(R.id.account_filter_header);
+
// Putting the header view inside a container will allow us to make
// it invisible later. See checkHeaderViewVisibility()
FrameLayout headerContainer = new FrameLayout(inflater.getContext());
@@ -92,6 +95,19 @@
}
@Override
+ public void setFilter(ContactListFilter filter) {
+ super.setFilter(filter);
+ if (filter != null && filter.filterType != ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS &&
+ filter.filterType != ContactListFilter.FILTER_TYPE_CUSTOM) {
+ mAccountFilterHeaderView.setText(getContext().getString(
+ R.string.listAllContactsInAccount, filter.accountName));
+ mAccountFilterHeaderView.setVisibility(View.VISIBLE);
+ } else {
+ mAccountFilterHeaderView.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
protected void showCount(int partitionIndex, Cursor data) {
if (!isSearchMode() && data != null) {
int count = data.getCount();