Merge "Pixel perfect group detail"
diff --git a/res/drawable-hdpi/panel_content.9.png b/res/drawable-hdpi/panel_content.9.png
index 8c412ed..5c3090d 100644
--- a/res/drawable-hdpi/panel_content.9.png
+++ b/res/drawable-hdpi/panel_content.9.png
Binary files differ
diff --git a/res/drawable-hdpi/panel_message.9.png b/res/drawable-hdpi/panel_message.9.png
index 796a8fa..caa3f60 100644
--- a/res/drawable-hdpi/panel_message.9.png
+++ b/res/drawable-hdpi/panel_message.9.png
Binary files differ
diff --git a/res/drawable-mdpi/panel_content.9.png b/res/drawable-mdpi/panel_content.9.png
index 12604ad..c5d2545 100644
--- a/res/drawable-mdpi/panel_content.9.png
+++ b/res/drawable-mdpi/panel_content.9.png
Binary files differ
diff --git a/res/drawable-mdpi/panel_message.9.png b/res/drawable-mdpi/panel_message.9.png
index 529c61d..de74565 100644
--- a/res/drawable-mdpi/panel_message.9.png
+++ b/res/drawable-mdpi/panel_message.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/panel_content.9.png b/res/drawable-xhdpi/panel_content.9.png
index e0b20de..6acbbb1 100644
--- a/res/drawable-xhdpi/panel_content.9.png
+++ b/res/drawable-xhdpi/panel_content.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/panel_message.9.png b/res/drawable-xhdpi/panel_message.9.png
index ce3c06d..30a7bc3 100644
--- a/res/drawable-xhdpi/panel_message.9.png
+++ b/res/drawable-xhdpi/panel_message.9.png
Binary files differ
diff --git a/res/layout/directory_header.xml b/res/layout/directory_header.xml
index 6043c7b..a1516ef 100644
--- a/res/layout/directory_header.xml
+++ b/res/layout/directory_header.xml
@@ -24,25 +24,12 @@
android:paddingLeft="?attr/list_item_padding_left"
android:paddingRight="?attr/list_item_padding_right">
<TextView
- android:id="@+id/display_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@+id/label"
- android:layout_toLeftOf="@+id/count"
- android:layout_centerVertical="true"
- android:layout_marginLeft="8dip"
- android:layout_marginRight="8dip"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorSecondary"
- android:singleLine="true"
- android:textStyle="bold"
- android:textAllCaps="true" />
- <TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
- android:layout_alignBaseline="@id/display_name"
+ android:layout_centerVertical="true"
android:layout_marginLeft="8dip"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"
@@ -54,10 +41,24 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
- android:layout_alignBaseline="@id/display_name"
+ android:layout_alignBaseline="@id/label"
android:singleLine="true"
android:textSize="12sp"
android:textColor="@color/contact_count_text_color" />
+ <TextView
+ android:id="@+id/display_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/label"
+ android:layout_toLeftOf="@id/count"
+ android:layout_alignBaseline="@id/label"
+ android:layout_marginLeft="8dip"
+ android:layout_marginRight="8dip"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="?android:attr/textColorSecondary"
+ android:singleLine="true"
+ android:textStyle="bold"
+ android:textAllCaps="true" />
<View
android:id="@+id/contact_filter_header_bottom_divider"
style="@style/SectionDivider"
diff --git a/res/values-sw580dp-w720dp/styles.xml b/res/values-sw580dp-w720dp/styles.xml
index 69548c5..1bda6aa 100644
--- a/res/values-sw580dp-w720dp/styles.xml
+++ b/res/values-sw580dp-w720dp/styles.xml
@@ -16,6 +16,7 @@
<resources>
<style name="PeopleTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/ContactsActionBarStyle</item>
+ <item name="android:actionBarWidgetTheme">@style/ContactsActionBarTheme</item>
<item name="android:actionBarItemBackground">@drawable/action_bar_item_background</item>
<item name="android:actionBarTabStyle">@style/ContactsActionBarTabView</item>
<item name="android:textColorPrimary">@color/primary_text_color</item>
diff --git a/res/values-sw580dp/styles.xml b/res/values-sw580dp/styles.xml
index 0a62db2..62c0efb 100644
--- a/res/values-sw580dp/styles.xml
+++ b/res/values-sw580dp/styles.xml
@@ -16,6 +16,7 @@
<resources>
<style name="PeopleTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/ContactsActionBarStyle</item>
+ <item name="android:actionBarWidgetTheme">@style/ContactsActionBarTheme</item>
<item name="android:actionBarItemBackground">@drawable/action_bar_item_background</item>
<item name="android:actionBarTabStyle">@style/ContactsActionBarTabView</item>
<item name="android:textColorPrimary">@color/primary_text_color</item>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index f218bd2..aa421f1 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -128,6 +128,7 @@
<style name="PeopleTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/ContactsActionBarStyle</item>
<item name="android:actionBarItemBackground">@drawable/action_bar_item_background</item>
+ <item name="android:actionBarWidgetTheme">@style/ContactsActionBarTheme</item>
<item name="android:actionBarTabStyle">@style/ContactsActionBarTabView</item>
<item name="android:textColorPrimary">@color/primary_text_color</item>
<item name="android:textColorSecondary">@color/secondary_text_color</item>
@@ -171,6 +172,10 @@
<item name="android:displayOptions"></item>
</style>
+ <style name="ContactsActionBarTheme" parent="@android:style/Theme.Holo">
+ <item name="android:textColorHint">#CCCCCC</item>
+ </style>
+
<style name="ContactsActionBarTabView" parent="@android:style/Widget.Holo.ActionBar.TabView">
<item name="android:background">@drawable/action_bar_tab</item>
</style>
diff --git a/src/com/android/contacts/PhoneCallDetails.java b/src/com/android/contacts/PhoneCallDetails.java
index 78ac9b3..547695c 100644
--- a/src/com/android/contacts/PhoneCallDetails.java
+++ b/src/com/android/contacts/PhoneCallDetails.java
@@ -53,6 +53,8 @@
/**
* The photo URI of the picture of the contact that is associated with this phone call or
* null if there is none.
+ * <p>
+ * This is meant to store the high-res photo only.
*/
public final Uri photoUri;
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index 09f4f1c..edf5519 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -107,8 +107,8 @@
mShowHomeIcon = mContext.getResources().getBoolean(R.bool.show_home_icon);
// Set up search view.
- View customSearchView = LayoutInflater.from(mContext).inflate(R.layout.custom_action_bar,
- null);
+ View customSearchView = LayoutInflater.from(mActionBar.getThemedContext()).inflate(
+ R.layout.custom_action_bar, null);
int searchViewWidth = mContext.getResources().getDimensionPixelSize(
R.dimen.search_view_width);
if (searchViewWidth == 0) {
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 1c69ef9..1bab98d 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -1045,6 +1045,8 @@
@Override
public void onDetailsLoaded(final ContactLoader.Result result) {
if (result == null) {
+ // Nothing is loaded. Show empty state.
+ mContactDetailLayoutController.showEmptyState();
return;
}
// Since {@link FragmentTransaction}s cannot be done in the onLoadFinished() of the
diff --git a/src/com/android/contacts/calllog/CallLogAdapter.java b/src/com/android/contacts/calllog/CallLogAdapter.java
index bed721a..7cd73a5 100644
--- a/src/com/android/contacts/calllog/CallLogAdapter.java
+++ b/src/com/android/contacts/calllog/CallLogAdapter.java
@@ -329,11 +329,8 @@
info.number = dataTableCursor.getString(
dataTableCursor.getColumnIndex(Data.DATA1));
info.normalizedNumber = null; // meaningless for SIP addresses
- final String thumbnailUriString = dataTableCursor.getString(
- dataTableCursor.getColumnIndex(Data.PHOTO_THUMBNAIL_URI));
- info.thumbnailUri = thumbnailUriString == null
- ? null
- : Uri.parse(thumbnailUriString);
+ info.photoId = dataTableCursor.getLong(
+ dataTableCursor.getColumnIndex(Data.PHOTO_ID));
} else {
info = ContactInfo.EMPTY;
}
@@ -377,11 +374,7 @@
.getString(PhoneQuery.MATCHED_NUMBER);
info.normalizedNumber = phonesCursor
.getString(PhoneQuery.NORMALIZED_NUMBER);
- final String thumbnailUriString = phonesCursor.getString(
- PhoneQuery.THUMBNAIL_URI);
- info.thumbnailUri = thumbnailUriString == null
- ? null
- : Uri.parse(thumbnailUriString);
+ info.photoId = phonesCursor.getLong(PhoneQuery.PHOTO_ID);
} else {
info = ContactInfo.EMPTY;
}
@@ -635,7 +628,7 @@
final String name = info.name;
final int ntype = info.type;
final String label = info.label;
- final Uri thumbnailUri = info.thumbnailUri;
+ final long photoId = info.photoId;
final int[] callTypes = getCallTypes(c, count);
final String geocode = c.getString(CallLogQuery.GEOCODED_LOCATION);
final PhoneCallDetails details;
@@ -643,15 +636,16 @@
details = new PhoneCallDetails(number, formattedNumber, countryIso, geocode,
callTypes, date, duration);
} else {
+ // We do not pass a photo id since we do not need the high-res picture.
details = new PhoneCallDetails(number, formattedNumber, countryIso, geocode,
- callTypes, date, duration, name, ntype, label, contactUri , thumbnailUri);
+ callTypes, date, duration, name, ntype, label, contactUri, null);
}
final boolean isNew = CallLogQuery.isNewSection(c);
// New items also use the highlighted version of the text.
final boolean isHighlighted = isNew;
mCallLogViewsHelper.setPhoneCallDetails(views, details, isHighlighted);
- setPhoto(views, thumbnailUri, contactUri);
+ setPhoto(views, photoId, contactUri);
// Listen for the first draw
if (mPreDrawListener == null) {
@@ -718,7 +712,7 @@
info.number = c.getString(CallLogQuery.NUMBER);
info.formattedNumber = info.number;
info.normalizedNumber = info.number;
- info.thumbnailUri = null;
+ info.photoId = 0;
return info;
}
@@ -740,9 +734,9 @@
return callTypes;
}
- private void setPhoto(CallLogListItemViews views, Uri thumbnailUri, Uri contactUri) {
+ private void setPhoto(CallLogListItemViews views, long photoId, Uri contactUri) {
views.quickContactView.assignContactUri(contactUri);
- mContactPhotoManager.loadPhoto(views.quickContactView, thumbnailUri);
+ mContactPhotoManager.loadPhoto(views.quickContactView, photoId);
}
/**
diff --git a/src/com/android/contacts/calllog/ContactInfo.java b/src/com/android/contacts/calllog/ContactInfo.java
index 58c5f6a..c28018c 100644
--- a/src/com/android/contacts/calllog/ContactInfo.java
+++ b/src/com/android/contacts/calllog/ContactInfo.java
@@ -32,7 +32,8 @@
public String number;
public String formattedNumber;
public String normalizedNumber;
- public Uri thumbnailUri;
+ /** The photo for the contact, if available. */
+ public long photoId;
public static ContactInfo EMPTY = new ContactInfo();
@@ -61,7 +62,7 @@
if (!TextUtils.equals(number, other.number)) return false;
// Ignore formatted number.
if (!TextUtils.equals(normalizedNumber, other.normalizedNumber)) return false;
- if (!UriUtils.areEqual(thumbnailUri, other.thumbnailUri)) return false;
+ if (photoId != other.photoId) return false;
return true;
}
}
\ No newline at end of file
diff --git a/src/com/android/contacts/calllog/PhoneQuery.java b/src/com/android/contacts/calllog/PhoneQuery.java
index 52faa8b..a53e5c8 100644
--- a/src/com/android/contacts/calllog/PhoneQuery.java
+++ b/src/com/android/contacts/calllog/PhoneQuery.java
@@ -29,7 +29,7 @@
PhoneLookup.LABEL,
PhoneLookup.NUMBER,
PhoneLookup.NORMALIZED_NUMBER,
- PhoneLookup.PHOTO_THUMBNAIL_URI,
+ PhoneLookup.PHOTO_ID,
PhoneLookup.LOOKUP_KEY};
public static final int PERSON_ID = 0;
@@ -38,6 +38,6 @@
public static final int LABEL = 3;
public static final int MATCHED_NUMBER = 4;
public static final int NORMALIZED_NUMBER = 5;
- public static final int THUMBNAIL_URI = 6;
+ public static final int PHOTO_ID = 6;
public static final int LOOKUP_KEY = 7;
}
\ No newline at end of file
diff --git a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
index 6bca80d..5d6c7d5 100644
--- a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
+++ b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
@@ -129,16 +129,11 @@
}
/**
- * Returns the attribution string for the contact. This could either specify
- * that this is a joined contact or specify the contact directory that the
- * contact came from. Returns null if there is none applicable.
+ * Returns the attribution string for the contact, which may specify the contact directory that
+ * the contact came from. Returns null if there is none applicable.
*/
public static String getAttribution(Context context, Result contactData) {
- // Check if this is a joined contact
- if (contactData.getEntities().size() > 1) {
- return context.getString(R.string.indicator_joined_contact);
- } else if (contactData.isDirectoryEntry()) {
- // This contact is from a directory
+ if (contactData.isDirectoryEntry()) {
String directoryDisplayName = contactData.getDirectoryDisplayName();
String directoryType = contactData.getDirectoryType();
String displayName = !TextUtils.isEmpty(directoryDisplayName)
@@ -193,7 +188,6 @@
return null;
}
-
/**
* Sets the contact photo to display in the given {@link ImageView}. If bitmap is null, the
* default placeholder image is shown.
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index daf8229..b2e20ca 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -371,6 +371,10 @@
mShowStaticPhoto = showPhoto;
}
+ public void showEmptyState() {
+ setData(null, null);
+ }
+
public void setData(Uri lookupUri, ContactLoader.Result result) {
mLookupUri = lookupUri;
mContactData = result;
@@ -412,6 +416,10 @@
if (mContactData == null) {
mView.setVisibility(View.INVISIBLE);
+ mAllEntries.clear();
+ if (mAdapter != null) {
+ mAdapter.notifyDataSetChanged();
+ }
return;
}
diff --git a/src/com/android/contacts/detail/ContactDetailLayoutController.java b/src/com/android/contacts/detail/ContactDetailLayoutController.java
index 579d7bf..f9d6443 100644
--- a/src/com/android/contacts/detail/ContactDetailLayoutController.java
+++ b/src/com/android/contacts/detail/ContactDetailLayoutController.java
@@ -233,6 +233,33 @@
}
}
+ public void showEmptyState() {
+ switch (mLayoutMode) {
+ case FRAGMENT_CAROUSEL: {
+ mFragmentCarousel.enableSwipe(false);
+ mDetailFragment.showEmptyState();
+ break;
+ }
+ case TWO_COLUMN: {
+ mDetailFragment.setShowStaticPhoto(false);
+ mUpdatesFragmentView.setVisibility(View.GONE);
+ mDetailFragment.showEmptyState();
+ break;
+ }
+ case VIEW_PAGER_AND_TAB_CAROUSEL: {
+ mDetailFragment.setShowStaticPhoto(false);
+ mDetailFragment.showEmptyState();
+ mTabCarousel.loadData(null);
+ mTabCarousel.setVisibility(View.GONE);
+ mViewPagerAdapter.enableSwipe(false);
+ mViewPager.setCurrentItem(0);
+ break;
+ }
+ default:
+ throw new IllegalStateException("Invalid LayoutMode " + mLayoutMode);
+ }
+ }
+
/**
* Setup the layout for the contact with updates. Pass in the index of the current page to
* select or null if the current selection should be left as is.
diff --git a/src/com/android/contacts/dialpad/DialpadFragment.java b/src/com/android/contacts/dialpad/DialpadFragment.java
index eef5a61..e3e8875 100644
--- a/src/com/android/contacts/dialpad/DialpadFragment.java
+++ b/src/com/android/contacts/dialpad/DialpadFragment.java
@@ -96,6 +96,10 @@
public void onSearchButtonPressed();
}
+ /**
+ * View (usually FrameLayout) containing mDigits field. This can be null, in which mDigits
+ * isn't enclosed by the container.
+ */
private View mDigitsContainer;
private EditText mDigits;
@@ -931,7 +935,12 @@
if (enabled) {
// Log.i(TAG, "Showing dialpad chooser!");
- mDigitsContainer.setVisibility(View.GONE);
+ if (mDigitsContainer != null) {
+ mDigitsContainer.setVisibility(View.GONE);
+ } else {
+ // mDigits is not enclosed by the container. Make the digits field itself gone.
+ mDigits.setVisibility(View.GONE);
+ }
if (mDialpad != null) mDialpad.setVisibility(View.GONE);
mAdditionalButtonsRow.setVisibility(View.GONE);
mDialpadChooser.setVisibility(View.VISIBLE);
@@ -944,7 +953,11 @@
mDialpadChooser.setAdapter(mDialpadChooserAdapter);
} else {
// Log.i(TAG, "Displaying normal Dialer UI.");
- mDigitsContainer.setVisibility(View.VISIBLE);
+ if (mDigitsContainer != null) {
+ mDigitsContainer.setVisibility(View.VISIBLE);
+ } else {
+ mDigits.setVisibility(View.VISIBLE);
+ }
if (mDialpad != null) mDialpad.setVisibility(View.VISIBLE);
mAdditionalButtonsRow.setVisibility(View.VISIBLE);
mDialpadChooser.setVisibility(View.GONE);
diff --git a/src/com/android/contacts/group/GroupBrowseListFragment.java b/src/com/android/contacts/group/GroupBrowseListFragment.java
index 49835ef..2b9c594 100644
--- a/src/com/android/contacts/group/GroupBrowseListFragment.java
+++ b/src/com/android/contacts/group/GroupBrowseListFragment.java
@@ -101,6 +101,15 @@
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
+ if (savedInstanceState != null) {
+ mSelectedGroupUri = savedInstanceState.getParcelable(EXTRA_KEY_GROUP_URI);
+ if (mSelectedGroupUri != null) {
+ // The selection may be out of screen, if rotated from portrait to landscape,
+ // so ensure it's visible.
+ mSelectionToScreenRequested = true;
+ }
+ }
+
mRootView = inflater.inflate(R.layout.group_browse_list_fragment, null);
mEmptyView = (TextView)mRootView.findViewById(R.id.empty);
@@ -137,12 +146,6 @@
});
setAddAccountsVisibility(!ContactsUtils.areAccountsAvailable(mContext));
- if (savedInstanceState != null) {
- String groupUriString = savedInstanceState.getString(EXTRA_KEY_GROUP_URI);
- if (groupUriString != null) {
- mSelectedGroupUri = Uri.parse(groupUriString);
- }
- }
return mRootView;
}
@@ -300,12 +303,7 @@
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- if (mSelectedGroupUri != null) {
- String uriString = mSelectedGroupUri.toString();
- if (!TextUtils.isEmpty(uriString)) {
- outState.putString(EXTRA_KEY_GROUP_URI, uriString);
- }
- }
+ outState.putParcelable(EXTRA_KEY_GROUP_URI, mSelectedGroupUri);
}
public void setAddAccountsVisibility(boolean visible) {
diff --git a/src/com/android/contacts/util/UriUtils.java b/src/com/android/contacts/util/UriUtils.java
index 28874f2..7ef8786 100644
--- a/src/com/android/contacts/util/UriUtils.java
+++ b/src/com/android/contacts/util/UriUtils.java
@@ -35,4 +35,12 @@
}
return uri1.equals(uri2);
}
+
+ /** Parses a string into a URI and returns null if the given string is null. */
+ public static Uri parseUriOrNull(String uriString) {
+ if (uriString == null) {
+ return null;
+ }
+ return Uri.parse(uriString);
+ }
}
diff --git a/tests/src/com/android/contacts/activities/CallLogActivityTests.java b/tests/src/com/android/contacts/activities/CallLogActivityTests.java
index 0f43313..b148121 100644
--- a/tests/src/com/android/contacts/activities/CallLogActivityTests.java
+++ b/tests/src/com/android/contacts/activities/CallLogActivityTests.java
@@ -68,8 +68,6 @@
/** A test value for the URI of a contact. */
private static final Uri TEST_CONTACT_URI = Uri.parse("content://contacts/2");
- /** A test value for the photo uri of a contact. */
- private static final Uri TEST_THUMBNAIL_URI = Uri.parse("something://picture/2");
/** A test value for the country ISO of the phone number in the call log. */
private static final String TEST_COUNTRY_ISO = "US";
/** A phone number to be used in tests. */
@@ -462,7 +460,7 @@
}
contactInfo.formattedNumber = formattedNumber;
contactInfo.normalizedNumber = number;
- contactInfo.thumbnailUri = TEST_THUMBNAIL_URI;
+ contactInfo.photoId = 0;
mAdapter.injectContactInfoForTest(number, contactInfo);
}
diff --git a/tests/src/com/android/contacts/calllog/CallLogAdapterTest.java b/tests/src/com/android/contacts/calllog/CallLogAdapterTest.java
index 28db896..42733c9 100644
--- a/tests/src/com/android/contacts/calllog/CallLogAdapterTest.java
+++ b/tests/src/com/android/contacts/calllog/CallLogAdapterTest.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.database.MatrixCursor;
import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
import android.view.View;
import java.util.List;
@@ -28,6 +29,7 @@
/**
* Unit tests for {@link CallLogAdapter}.
*/
+@SmallTest
public class CallLogAdapterTest extends AndroidTestCase {
private static final String TEST_NUMBER = "12345678";
private static final String TEST_NAME = "name";