Merge "Fix clearing of voicemail notifications."
diff --git a/res/drawable-hdpi/btn_star_off_normal_holo_dark.png b/res/drawable-hdpi/btn_star_off_normal_holo_dark.png
new file mode 100644
index 0000000..1ab75f9
--- /dev/null
+++ b/res/drawable-hdpi/btn_star_off_normal_holo_dark.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_star_on_normal_holo_dark.png b/res/drawable-hdpi/btn_star_on_normal_holo_dark.png
new file mode 100644
index 0000000..8cd764a
--- /dev/null
+++ b/res/drawable-hdpi/btn_star_on_normal_holo_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_star_off_normal_holo_dark.png b/res/drawable-mdpi/btn_star_off_normal_holo_dark.png
new file mode 100644
index 0000000..069e1ca
--- /dev/null
+++ b/res/drawable-mdpi/btn_star_off_normal_holo_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_star_on_normal_holo_dark.png b/res/drawable-mdpi/btn_star_on_normal_holo_dark.png
new file mode 100644
index 0000000..d98dc94
--- /dev/null
+++ b/res/drawable-mdpi/btn_star_on_normal_holo_dark.png
Binary files differ
diff --git a/res/drawable-xhdpi/btn_star_off_normal_holo_dark.png b/res/drawable-xhdpi/btn_star_off_normal_holo_dark.png
new file mode 100644
index 0000000..3774545
--- /dev/null
+++ b/res/drawable-xhdpi/btn_star_off_normal_holo_dark.png
Binary files differ
diff --git a/res/drawable-xhdpi/btn_star_on_normal_holo_dark.png b/res/drawable-xhdpi/btn_star_on_normal_holo_dark.png
new file mode 100644
index 0000000..11c557c
--- /dev/null
+++ b/res/drawable-xhdpi/btn_star_on_normal_holo_dark.png
Binary files differ
diff --git a/res/drawable/btn_star_holo_dark.xml b/res/drawable/btn_star_holo_dark.xml
new file mode 100644
index 0000000..2949de9
--- /dev/null
+++ b/res/drawable/btn_star_holo_dark.xml
@@ -0,0 +1,20 @@
+<?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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_checked="true" android:drawable="@drawable/btn_star_on_normal_holo_dark"/>
+ <item android:drawable="@drawable/btn_star_off_normal_holo_dark"/>
+</selector>
\ No newline at end of file
diff --git a/res/layout-w470dp/contact_detail_fragment.xml b/res/layout-w470dp/contact_detail_fragment.xml
index d63236d..982abbb 100644
--- a/res/layout-w470dp/contact_detail_fragment.xml
+++ b/res/layout-w470dp/contact_detail_fragment.xml
@@ -76,7 +76,6 @@
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
- android:background="@android:color/black"
android:visibility="gone"/>
<View
diff --git a/res/layout-w470dp/contact_detail_updates_fragment.xml b/res/layout-w470dp/contact_detail_updates_fragment.xml
index 60d728d..ccb7123 100644
--- a/res/layout-w470dp/contact_detail_updates_fragment.xml
+++ b/res/layout-w470dp/contact_detail_updates_fragment.xml
@@ -32,7 +32,6 @@
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
- android:background="@android:color/black"
android:visibility="gone"/>
<View
diff --git a/res/layout/carousel_about_tab.xml b/res/layout/carousel_about_tab.xml
index ad763be..c7c4394 100644
--- a/res/layout/carousel_about_tab.xml
+++ b/res/layout/carousel_about_tab.xml
@@ -19,8 +19,7 @@
class="com.android.contacts.detail.CarouselTab"
android:layout_width="0dip"
android:layout_height="match_parent"
- android:layout_weight="1"
- android:background="@color/detail_tab_background">
+ android:layout_weight="1">
<ImageView android:id="@+id/photo"
android:scaleType="centerCrop"
@@ -45,8 +44,6 @@
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginBottom="@dimen/detail_tab_carousel_tab_label_height"
- android:background="@android:color/black"
- android:alpha="0"
android:visibility="gone"/>
<TextView
diff --git a/res/layout/carousel_updates_tab.xml b/res/layout/carousel_updates_tab.xml
index b41829f..9637023 100644
--- a/res/layout/carousel_updates_tab.xml
+++ b/res/layout/carousel_updates_tab.xml
@@ -33,7 +33,6 @@
android:layout_alignParentLeft="true"
android:visibility="gone" />
-
<!-- Transparent view to overlay on the update photo
(to allow white text to appear over a white photo). -->
<View
@@ -65,8 +64,6 @@
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginBottom="@dimen/detail_tab_carousel_tab_label_height"
- android:background="@android:color/black"
- android:alpha="0"
android:visibility="gone"/>
<TextView
diff --git a/res/layout/favorites_star.xml b/res/layout/favorites_star.xml
index 4b859b4..5bdc091 100644
--- a/res/layout/favorites_star.xml
+++ b/res/layout/favorites_star.xml
@@ -29,6 +29,5 @@
android:layout_gravity="center_vertical"
android:contentDescription="@string/description_star"
android:visibility="invisible"
- style="?android:attr/starStyle"/>
-
+ android:button="@drawable/btn_star_holo_dark"/>
</FrameLayout>
\ No newline at end of file
diff --git a/src/com/android/contacts/ContactLoader.java b/src/com/android/contacts/ContactLoader.java
index 064deb5..ceaa246 100644
--- a/src/com/android/contacts/ContactLoader.java
+++ b/src/com/android/contacts/ContactLoader.java
@@ -113,7 +113,7 @@
private final boolean mStarred;
private final Integer mPresence;
private final ArrayList<Entity> mEntities;
- private ArrayList<StreamItemEntry> mStreamItems;
+ private final ArrayList<StreamItemEntry> mStreamItems;
private final HashMap<Long, DataStatus> mStatuses;
private final ArrayList<AccountType> mInvitableAccountTypes;
@@ -127,9 +127,9 @@
private boolean mLoadingPhoto;
private byte[] mPhotoBinaryData;
- private boolean mSendToVoicemail;
- private String mCustomRingtone;
- private boolean mIsUserProfile;
+ private final boolean mSendToVoicemail;
+ private final String mCustomRingtone;
+ private final boolean mIsUserProfile;
/**
* Constructor for case "no contact found". This must only be used for the
@@ -618,7 +618,9 @@
loadStreamItems(result);
}
loadPhotoBinaryData(result);
- if (mLoadInvitableAccountTypes) {
+
+ // Note ME profile should never have "Add connection"
+ if (mLoadInvitableAccountTypes && !result.isUserProfile()) {
loadInvitableAccountTypes(result);
}
}
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index 5a32d74..0c0841c 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -211,6 +211,10 @@
return mSearchMode;
}
+ public boolean shouldShowSearchResult() {
+ return mSearchMode && !TextUtils.isEmpty(mQueryString);
+ }
+
public void setSearchMode(boolean flag) {
if (mSearchMode != flag) {
mSearchMode = flag;
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index 80bd5c1..13ce317 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -392,10 +392,14 @@
if (fragment instanceof DialpadFragment) {
mDialpadFragment = (DialpadFragment) fragment;
mDialpadFragment.setListener(mDialpadListener);
- mDialpadFragment.onVisibilityChanged(currentPosition == TAB_INDEX_DIALER);
+ if (currentPosition == TAB_INDEX_DIALER) {
+ mDialpadFragment.onVisibilityChanged(true);
+ }
} else if (fragment instanceof CallLogFragment) {
mCallLogFragment = (CallLogFragment) fragment;
- mCallLogFragment.onVisibilityChanged(currentPosition == TAB_INDEX_CALL_LOG);
+ if (currentPosition == TAB_INDEX_CALL_LOG) {
+ mCallLogFragment.onVisibilityChanged(true);
+ }
} else if (fragment instanceof ContactTileListFragment) {
mStrequentFragment = (ContactTileListFragment) fragment;
mStrequentFragment.enableQuickContact(false);
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index fc9879a..cab8afd 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -867,11 +867,11 @@
}
private void configureContactListFragment() {
- final boolean searchMode = mActionBarAdapter.isSearchMode();
- mAllFragment.setSearchMode(searchMode);
+ final boolean showSearchResult = mActionBarAdapter.shouldShowSearchResult();
+ mAllFragment.setSearchMode(showSearchResult);
final boolean useTwoPane = PhoneCapabilityTester.isUsingTwoPanes(this);
- mAllFragment.setVisibleScrollbarEnabled(!searchMode);
+ mAllFragment.setVisibleScrollbarEnabled(!showSearchResult);
mAllFragment.setVerticalScrollbarPosition(
useTwoPane
? View.SCROLLBAR_POSITION_LEFT
diff --git a/src/com/android/contacts/detail/CarouselTab.java b/src/com/android/contacts/detail/CarouselTab.java
index 9b8efd5..26397ff 100644
--- a/src/com/android/contacts/detail/CarouselTab.java
+++ b/src/com/android/contacts/detail/CarouselTab.java
@@ -94,8 +94,6 @@
@Override
public void setAlphaLayerValue(float alpha) {
- if (mAlphaLayer != null) {
- mAlphaLayer.setAlpha(alpha);
- }
+ ContactDetailDisplayUtils.setAlphaOnViewBackground(mAlphaLayer, alpha);
}
}
diff --git a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
index 131f052..cbdf148 100644
--- a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
+++ b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
@@ -452,4 +452,15 @@
}
}
}
+
+ /**
+ * Sets an alpha value on the view.
+ */
+ public static void setAlphaOnViewBackground(View view, float alpha) {
+ if (view != null) {
+ // Convert alpha layer to a black background HEX color with an alpha value for better
+ // performance (i.e. use setBackgroundColor() instead of setAlpha())
+ view.setBackgroundColor((int) (alpha * 255) << 24);
+ }
+ }
}
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index d56afc1..bbf9d5b 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -315,9 +315,7 @@
@Override
public void setAlphaLayerValue(float alpha) {
- if (mAlphaLayer != null) {
- mAlphaLayer.setAlpha(alpha);
- }
+ ContactDetailDisplayUtils.setAlphaOnViewBackground(mAlphaLayer, alpha);
}
@Override
@@ -787,6 +785,9 @@
String attribution = ContactDetailDisplayUtils.getAttribution(mContext, mContactData);
boolean hasAttribution = !TextUtils.isEmpty(attribution);
int networksCount = mOtherEntriesMap.keySet().size();
+
+ // Note: invitableCount will always be 0 for me profile. (ContactLoader won't set
+ // invitable types for me profile.)
int invitableCount = mContactData.getInvitableAccountTypes().size();
if (!hasAttribution && networksCount == 0 && invitableCount == 0) {
return;
diff --git a/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java b/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java
index 561d44e..7efcc51 100644
--- a/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java
+++ b/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java
@@ -98,27 +98,16 @@
mAllowedHorizontalScrollLength = (2 * fragmentWidth) - screenWidth;
mLowerThreshold = (screenWidth - fragmentWidth) / 2;
mUpperThreshold = mAllowedHorizontalScrollLength - mLowerThreshold;
-
- // Snap to the current page now that the allowed horizontal scroll length has been
- // computed.
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- if (isAttachedToWindow() && mAboutFragment != null &&
- mUpdatesFragment != null) {
- snapToEdge();
- }
- }
- });
}
}
public void setCurrentPage(int pageIndex) {
if (mCurrentPage != pageIndex) {
mCurrentPage = pageIndex;
- if (isAttachedToWindow() && mAboutFragment != null && mUpdatesFragment != null) {
- snapToEdge();
- }
+
+ // This method could have been called before the view has been measured, so snap to edge
+ // only after the view is ready.
+ postRunnableToSnapToEdge();
}
}
@@ -131,7 +120,26 @@
mUpdatesFragment.enableAlphaLayer();
mUpdatesFragment.setAlphaLayerValue(mCurrentPage == UPDATES_PAGE ? 0 : MAX_ALPHA);
- snapToEdge();
+ // This method could have been called before the view has been measured, so snap to edge
+ // only after the view is ready.
+ postRunnableToSnapToEdge();
+ }
+
+ /**
+ * Snap to the currently selected page only once all the view setup and measurement has
+ * completed (i.e. we need to know the allowed horizontal scroll width in order to
+ * snap to the correct page).
+ */
+ private void postRunnableToSnapToEdge() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (isAttachedToWindow() && mAboutFragment != null &&
+ mUpdatesFragment != null) {
+ snapToEdge();
+ }
+ }
+ });
}
public int getCurrentPage() {
diff --git a/src/com/android/contacts/detail/ContactDetailTabCarousel.java b/src/com/android/contacts/detail/ContactDetailTabCarousel.java
index cc4f0ff..5daca05 100644
--- a/src/com/android/contacts/detail/ContactDetailTabCarousel.java
+++ b/src/com/android/contacts/detail/ContactDetailTabCarousel.java
@@ -162,7 +162,7 @@
mAboutTab.setAlphaLayerValue(mLastScrollPosition * MAX_ALPHA /
mAllowedHorizontalScrollLength);
mUpdatesTab.setAlphaLayerValue(MAX_ALPHA - mLastScrollPosition * MAX_ALPHA /
- mAllowedVerticalScrollLength);
+ mAllowedHorizontalScrollLength);
}
@Override
diff --git a/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java b/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
index 02bd314..b2a203b 100644
--- a/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
@@ -142,9 +142,7 @@
@Override
public void setAlphaLayerValue(float alpha) {
- if (mAlphaLayer != null) {
- mAlphaLayer.setAlpha(alpha);
- }
+ ContactDetailDisplayUtils.setAlphaOnViewBackground(mAlphaLayer, alpha);
}
@Override
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 3869c54..e1b4e9f 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -693,7 +693,7 @@
@Override
public void onRequest(int request) {
- if (request == EditorListener.FIELD_CHANGED) {
+ if (request == EditorListener.FIELD_CHANGED && !isEditingUserProfile()) {
acquireAggregationSuggestions(rawContactEditor);
}
}
@@ -803,12 +803,11 @@
// TODO: Find a better way to handle shortcuts, i.e. onKeyDown()?
menu.findItem(R.id.menu_done).setVisible(false);
- boolean editingUserProfile = mIsUserProfile || mNewLocalProfile;
// Split only if more than one raw profile and not a user profile
menu.findItem(R.id.menu_split).setVisible(mState != null && mState.size() > 1 &&
- !editingUserProfile);
+ !isEditingUserProfile());
// Cannot join a user profile
- menu.findItem(R.id.menu_join).setVisible(!editingUserProfile);
+ menu.findItem(R.id.menu_join).setVisible(!isEditingUserProfile());
int size = menu.size();
@@ -974,7 +973,7 @@
setEnabled(false);
Intent intent = ContactSaveService.createSaveContactIntent(getActivity(), mState,
- SAVE_MODE_EXTRA_KEY, saveMode, mNewLocalProfile || mIsUserProfile,
+ SAVE_MODE_EXTRA_KEY, saveMode, isEditingUserProfile(),
getActivity().getClass(), ContactEditorActivity.ACTION_SAVE_COMPLETED);
getActivity().startService(intent);
return true;
@@ -1150,6 +1149,10 @@
return false;
}
+ private boolean isEditingUserProfile() {
+ return mNewLocalProfile || mIsUserProfile;
+ }
+
public static interface Listener {
/**
* Contact was not found, so somehow close this fragment. This is raised after a contact
@@ -1340,6 +1343,9 @@
final RawContactEditorView rawContactView =
(RawContactEditorView)getRawContactEditorView(mAggregationSuggestionsRawContactId);
+ if (rawContactView == null) {
+ return; // Raw contact deleted?
+ }
final View anchorView = rawContactView.findViewById(R.id.anchor_view);
mAggregationSuggestionPopup = new ListPopupWindow(mContext, null);
mAggregationSuggestionPopup.setAnchorView(anchorView);
diff --git a/src/com/android/contacts/group/GroupEditorFragment.java b/src/com/android/contacts/group/GroupEditorFragment.java
index a2feff8..4712871 100644
--- a/src/com/android/contacts/group/GroupEditorFragment.java
+++ b/src/com/android/contacts/group/GroupEditorFragment.java
@@ -191,9 +191,9 @@
private ContentResolver mContentResolver;
private SuggestedMemberListAdapter mAutoCompleteAdapter;
- private final List<Member> mListMembersToAdd = new ArrayList<Member>();
- private final List<Member> mListMembersToRemove = new ArrayList<Member>();
- private final List<Member> mListToDisplay = new ArrayList<Member>();
+ private ArrayList<Member> mListMembersToAdd = new ArrayList<Member>();
+ private ArrayList<Member> mListMembersToRemove = new ArrayList<Member>();
+ private ArrayList<Member> mListToDisplay = new ArrayList<Member>();
public GroupEditorFragment() {
}
@@ -273,9 +273,9 @@
outState.putBoolean(KEY_GROUP_NAME_IS_READ_ONLY, mGroupNameIsReadOnly);
outState.putString(KEY_ORIGINAL_GROUP_NAME, mOriginalGroupName);
- outState.putParcelableArray(KEY_MEMBERS_TO_ADD, Member.toArray(mListMembersToAdd));
- outState.putParcelableArray(KEY_MEMBERS_TO_REMOVE, Member.toArray(mListMembersToRemove));
- outState.putParcelableArray(KEY_MEMBERS_TO_DISPLAY, Member.toArray(mListToDisplay));
+ outState.putParcelableArrayList(KEY_MEMBERS_TO_ADD, mListMembersToAdd);
+ outState.putParcelableArrayList(KEY_MEMBERS_TO_REMOVE, mListMembersToRemove);
+ outState.putParcelableArrayList(KEY_MEMBERS_TO_DISPLAY, mListToDisplay);
}
private void onRestoreInstanceState(Bundle state) {
@@ -291,10 +291,9 @@
mGroupNameIsReadOnly = state.getBoolean(KEY_GROUP_NAME_IS_READ_ONLY);
mOriginalGroupName = state.getString(KEY_ORIGINAL_GROUP_NAME);
- Member.toList((Member[]) state.getParcelableArray(KEY_MEMBERS_TO_ADD), mListMembersToAdd);
- Member.toList((Member[]) state.getParcelableArray(KEY_MEMBERS_TO_REMOVE),
- mListMembersToRemove);
- Member.toList((Member[]) state.getParcelableArray(KEY_MEMBERS_TO_DISPLAY), mListToDisplay);
+ mListMembersToAdd = state.getParcelableArrayList(KEY_MEMBERS_TO_ADD);
+ mListMembersToRemove = state.getParcelableArrayList(KEY_MEMBERS_TO_REMOVE);
+ mListToDisplay = state.getParcelableArrayList(KEY_MEMBERS_TO_DISPLAY);
}
public void setContentResolver(ContentResolver resolver) {
@@ -404,7 +403,10 @@
mAutoCompleteTextView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- SuggestedMember member = mAutoCompleteAdapter.getItem(position);
+ SuggestedMember member = (SuggestedMember) view.getTag();
+ if (member == null) {
+ return; // just in case
+ }
loadMemberToAddToGroup(member.getRawContactId(),
String.valueOf(member.getContactId()));
@@ -892,22 +894,6 @@
return new Member[size];
}
};
-
- /** Convert to an array */
- public static Member[] toArray(List<Member> list) {
- return list.toArray(EMPTY_ARRAY);
- }
-
- /**
- * Convert to a list. Instead of creating a new one, this method clears the passed list
- * and adds elements to it.
- */
- public static void toList(Member[] array, List<Member> list) {
- list.clear();
- for (Member member : array) {
- list.add(member);
- }
- }
}
/**
diff --git a/src/com/android/contacts/group/SuggestedMemberListAdapter.java b/src/com/android/contacts/group/SuggestedMemberListAdapter.java
index f671b65..bc8055a 100644
--- a/src/com/android/contacts/group/SuggestedMemberListAdapter.java
+++ b/src/com/android/contacts/group/SuggestedMemberListAdapter.java
@@ -144,11 +144,11 @@
byte[] byteArray = member.getPhotoByteArray();
if (byteArray == null) {
icon.setImageResource(R.drawable.ic_contact_picture);
- }
- else {
+ } else {
Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
icon.setImageBitmap(bitmap);
}
+ result.setTag(member);
return result;
}
diff --git a/src/com/android/contacts/list/AccountFilterActivity.java b/src/com/android/contacts/list/AccountFilterActivity.java
index 9d872da..fb0cf9e 100644
--- a/src/com/android/contacts/list/AccountFilterActivity.java
+++ b/src/com/android/contacts/list/AccountFilterActivity.java
@@ -83,17 +83,17 @@
accountFilters.add(ContactListFilter.createAccountFilter(account.type, account.name,
account.dataSet, icon, account.name));
}
- int count = accountFilters.size();
+ final 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 we only have one account, don't show it as "account", instead show it as "all"
if (count > 1) {
mFilters.addAll(accountFilters);
- mFilters.add(ContactListFilter.createFilterWithType(
- ContactListFilter.FILTER_TYPE_CUSTOM));
}
+ mFilters.add(ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_CUSTOM));
}
mListView.setAdapter(new FilterListAdapter(this));
diff --git a/src/com/android/contacts/list/ContactEntryListAdapter.java b/src/com/android/contacts/list/ContactEntryListAdapter.java
index e75be26..ba16c17 100644
--- a/src/com/android/contacts/list/ContactEntryListAdapter.java
+++ b/src/com/android/contacts/list/ContactEntryListAdapter.java
@@ -457,10 +457,6 @@
if (!mEmptyListEnabled) {
return false;
} else if (isSearchMode()) {
- // TODO Do we really need this? DefaultContactListAdapter overrides it and always
- // return false, as it returns all contacts if in the search mode and the query is
- // empty. If there's no places relying on this behavior, we can just return false
- // here.
return TextUtils.isEmpty(getQueryString());
} else if (mLoading) {
// We don't want the empty state to show when loading.
diff --git a/src/com/android/contacts/list/ContactTileAdapter.java b/src/com/android/contacts/list/ContactTileAdapter.java
index cc0a184..7a293b3 100644
--- a/src/com/android/contacts/list/ContactTileAdapter.java
+++ b/src/com/android/contacts/list/ContactTileAdapter.java
@@ -183,17 +183,32 @@
/**
* Iterates over the {@link Cursor}
* Returns position of the first NON Starred Contact
- * Returns -1 if not {@link DisplayType#STREQUENT} or {@link DisplayType#STREQUENT_PHONE_ONLY}
+ * Returns -1 if {@link DisplayType#STARRED_ONLY} or {@link DisplayType#GROUP_MEMBERS}
+ * Returns 0 if {@link DisplayType#FREQUENT_ONLY}
*/
private int getDividerPosition(Cursor cursor) {
- if (cursor == null || cursor.isClosed() || (mDisplayType != DisplayType.STREQUENT
- && mDisplayType != DisplayType.STREQUENT_PHONE_ONLY)) {
- return -1;
+ if (cursor == null || cursor.isClosed()) {
+ throw new IllegalStateException("Unable to access cursor");
}
- while (cursor.moveToNext()) {
- if (cursor.getInt(mStarredIndex) == 0) {
- return cursor.getPosition();
- }
+
+ switch (mDisplayType) {
+ case STREQUENT:
+ case STREQUENT_PHONE_ONLY:
+ while (cursor.moveToNext()) {
+ if (cursor.getInt(mStarredIndex) == 0) {
+ return cursor.getPosition();
+ }
+ }
+ break;
+ case GROUP_MEMBERS:
+ case STARRED_ONLY:
+ // There is no divider
+ return -1;
+ case FREQUENT_ONLY:
+ // Divider is first
+ return 0;
+ default:
+ throw new IllegalStateException("Unrecognized DisplayType " + mDisplayType);
}
// There are not NON Starred contacts in cursor
@@ -354,6 +369,7 @@
// Creating new row if needed
contactTileRowView = new ContactTileRow(mContext, itemViewType);
}
+
contactTileRowView.configureRow(contactList, position == getCount() - 1);
return contactTileRowView;
}
@@ -390,20 +406,19 @@
}
@Override
public int getViewTypeCount() {
- return (mDisplayType == DisplayType.STREQUENT ||
- mDisplayType == DisplayType.STREQUENT_PHONE_ONLY) ? ViewTypes.COUNT : 1;
+ return ViewTypes.MAX_VIEW_COUNT;
}
- /**
- * Returns view type based on {@link DisplayType}.
- * {@link DisplayType#STARRED_ONLY} and {@link DisplayType#GROUP_MEMBERS}
- * are {@link ViewTypes#STARRED}.
- * {@link DisplayType#FREQUENT_ONLY} is {@link ViewTypes#FREQUENT}.
- * {@link DisplayType#STREQUENT} mixes both {@link ViewTypes}
- * and also adds in {@link ViewTypes#DIVIDER}.
- */
@Override
public int getItemViewType(int position) {
+ /*
+ * Returns view type based on {@link DisplayType}.
+ * {@link DisplayType#STARRED_ONLY} and {@link DisplayType#GROUP_MEMBERS}
+ * are {@link ViewTypes#STARRED}.
+ * {@link DisplayType#FREQUENT_ONLY} is {@link ViewTypes#FREQUENT}.
+ * {@link DisplayType#STREQUENT} mixes both {@link ViewTypes}
+ * and also adds in {@link ViewTypes#DIVIDER}.
+ */
switch (mDisplayType) {
case STREQUENT:
if (position < getRowCount(mDividerPosition)) {
@@ -504,7 +519,7 @@
}
private static class ViewTypes {
- public static final int COUNT = 4;
+ public static final int MAX_VIEW_COUNT = 4;
public static final int STARRED = 0;
public static final int DIVIDER = 1;
public static final int FREQUENT = 2;
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index 5134a1a..ca07516 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -140,11 +140,12 @@
if (!isSearchMode() && data != null) {
int count = data.getCount();
if (count != 0) {
+ count -= (mUserProfileExists ? 1: 0);
String format = getResources().getQuantityText(
R.plurals.listTotalAllContacts, count).toString();
// Do not count the user profile in the contacts count
if (mUserProfileExists) {
- getAdapter().setContactsCount(String.format(format, count - 1));
+ getAdapter().setContactsCount(String.format(format, count));
} else {
mCounterHeaderView.setText(String.format(format, count));
}
diff --git a/src/com/android/contacts/list/DefaultContactListAdapter.java b/src/com/android/contacts/list/DefaultContactListAdapter.java
index f081921..bb49027 100644
--- a/src/com/android/contacts/list/DefaultContactListAdapter.java
+++ b/src/com/android/contacts/list/DefaultContactListAdapter.java
@@ -66,15 +66,11 @@
}
query = query.trim();
if (TextUtils.isEmpty(query)) {
- // Special case: if the query string is empty, show all contacts, regardless of the
- // current filter.
- // (We can't use the FILTER_URI for this, as the contacts provider would return
- // an empty cursor if the query is empty.)
- final ContactListFilter allFilter = ContactListFilter.createFilterWithType(
- ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
- configureUri(loader, directoryId, allFilter);
- configureProjection(loader, directoryId, allFilter);
- configureSelection(loader, directoryId, allFilter);
+ // Regardless of the directory, we don't want anything returned,
+ // so let's just send a "nothing" query to the local directory.
+ loader.setUri(Contacts.CONTENT_URI);
+ loader.setProjection(PROJECTION_CONTACT);
+ loader.setSelection("0");
} else {
Builder builder = Contacts.CONTENT_FILTER_URI.buildUpon();
builder.appendPath(query); // Builder will encode the query
@@ -196,16 +192,16 @@
+ "SELECT DISTINCT " + RawContacts.CONTACT_ID
+ " FROM raw_contacts"
+ " WHERE " + RawContacts.ACCOUNT_TYPE + "=?"
- + " AND " + RawContacts.ACCOUNT_NAME + "=?"
- + " OR " + Contacts.IS_USER_PROFILE + "=1");
+ + " AND " + RawContacts.ACCOUNT_NAME + "=?");
selectionArgs.add(filter.accountType);
selectionArgs.add(filter.accountName);
if (filter.dataSet != null) {
- selection.append(" AND " + RawContacts.DATA_SET + "=?)");
+ selection.append(" AND " + RawContacts.DATA_SET + "=?");
selectionArgs.add(filter.dataSet);
} else {
- selection.append(" AND " + RawContacts.DATA_SET + " IS NULL)");
+ selection.append(" AND " + RawContacts.DATA_SET + " IS NULL");
}
+ selection.append(" OR " + Contacts.IS_USER_PROFILE + "=1)");
break;
}
case ContactListFilter.FILTER_TYPE_GROUP: {
@@ -256,16 +252,4 @@
return prefs.getBoolean(ContactsPreferences.PREF_DISPLAY_ONLY_PHONES,
ContactsPreferences.PREF_DISPLAY_ONLY_PHONES_DEFAULT);
}
-
- @Override
- public boolean isEmpty() {
- // ContactEntryListAdapter.isEmpty() returns false when in the search mode && the query is
- // empty. Here, we want to return all contacts in this case, override it and make it
- // always return false. See the TODO there -- we may not need this method entirely.
- if (isSearchMode()) {
- return false;
- } else {
- return super.isEmpty();
- }
- }
}
diff --git a/tests/src/com/android/contacts/model/AccountTypeTest.java b/tests/src/com/android/contacts/model/AccountTypeTest.java
index de66694..986d840 100644
--- a/tests/src/com/android/contacts/model/AccountTypeTest.java
+++ b/tests/src/com/android/contacts/model/AccountTypeTest.java
@@ -52,7 +52,7 @@
AccountType.getResourceText(c, packageName, externalResID, DEFAULT));
// Load from the contacts package itself.
- final int internalResId = com.android.contacts.R.string.sharedUserLabel;
+ final int internalResId = com.android.contacts.R.string.launcherDialer;
assertEquals(c.getString(internalResId),
AccountType.getResourceText(c, null, internalResId, DEFAULT));
}