Merge "Use photo id when available."
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/menu/dialtacts_options.xml b/res/menu/dialtacts_options.xml
index 2c83f6b..8a2fd91 100644
--- a/res/menu/dialtacts_options.xml
+++ b/res/menu/dialtacts_options.xml
@@ -16,6 +16,7 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/search_on_action_bar"
+ android:title="@string/menu_search"
android:icon="@android:drawable/ic_menu_search"
android:showAsAction="always" />
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 03a9134..aa00071 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/ContactLoader.java b/src/com/android/contacts/ContactLoader.java
index 1107530..a28b1db 100644
--- a/src/com/android/contacts/ContactLoader.java
+++ b/src/com/android/contacts/ContactLoader.java
@@ -93,14 +93,7 @@
/**
* Singleton instance that represents "No Contact Found"
*/
- public static final Result NOT_FOUND = new Result();
-
- /**
- * Singleton instance that represents an error, e.g. because of an invalid Uri
- * TODO: We should come up with something nicer here. Maybe use an Either type so
- * that we can capture the Exception?
- */
- public static final Result ERROR = new Result();
+ public static final Result NOT_FOUND = new Result((Exception) null);
private final Uri mLookupUri;
private final Uri mUri;
@@ -135,11 +128,12 @@
private final String mCustomRingtone;
private final boolean mIsUserProfile;
+ private final Exception mException;
+
/**
- * Constructor for case "no contact found". This must only be used for the
- * final {@link Result#NOT_FOUND} singleton
+ * Constructor for special results, namely "no contact found" and "error".
*/
- private Result() {
+ private Result(Exception exception) {
mLookupUri = null;
mUri = null;
mDirectoryId = -1;
@@ -161,7 +155,11 @@
mSendToVoicemail = false;
mCustomRingtone = null;
mIsUserProfile = false;
+ mException = exception;
+ }
+ private static Result forError(Exception exception) {
+ return new Result(exception);
}
/**
@@ -172,6 +170,7 @@
String displayName, String altDisplayName, String phoneticName, boolean starred,
Integer presence, boolean sendToVoicemail, String customRingtone,
boolean isUserProfile) {
+ mException = null;
mLookupUri = lookupUri;
mUri = uri;
mDirectoryId = directoryId;
@@ -196,6 +195,7 @@
}
private Result(Result from) {
+ mException = from.mException;
mLookupUri = from.mLookupUri;
mUri = from.mUri;
mDirectoryId = from.mDirectoryId;
@@ -267,6 +267,18 @@
return mId;
}
+ /**
+ * @return true when an exception happened during loading, in which case
+ * {@link #getException} returns the actual exception object.
+ */
+ public boolean isError() {
+ return mException != null;
+ }
+
+ public Exception getException() {
+ return mException;
+ }
+
public long getNameRawContactId() {
return mNameRawContactId;
}
@@ -631,7 +643,7 @@
return result;
} catch (Exception e) {
Log.e(TAG, "Error loading the contact: " + mLookupUri, e);
- return Result.ERROR;
+ return Result.forError(e);
}
}
@@ -1087,7 +1099,7 @@
mContact = result;
- if (result != Result.ERROR && result != Result.NOT_FOUND) {
+ if (!result.isError() && result != Result.NOT_FOUND) {
mLookupUri = result.getLookupUri();
if (!result.isDirectoryEntry()) {
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/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/ContactLoaderFragment.java b/src/com/android/contacts/detail/ContactLoaderFragment.java
index c82d735..f3c6158 100644
--- a/src/com/android/contacts/detail/ContactLoaderFragment.java
+++ b/src/com/android/contacts/detail/ContactLoaderFragment.java
@@ -187,13 +187,10 @@
return;
}
- if (data == ContactLoader.Result.ERROR) {
+ if (data.isError()) {
// This shouldn't ever happen, so throw an exception. The {@link ContactLoader}
// should log the actual exception.
- // TODO: Make the {@link ContactLoader.Result} pass the exception so we can include
- // the original stack trace when this error is thrown.
- throw new IllegalStateException("The result of the ContactLoader is "
- + "ContactLoader.Result.ERROR");
+ throw new IllegalStateException("Failed to load contact", data.getException());
} else if (data == ContactLoader.Result.NOT_FOUND) {
Log.i(TAG, "No contact found: " + ((ContactLoader)loader).getLookupUri());
mContactData = null;
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/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 5a96e7f..046b1ed 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -1610,7 +1610,7 @@
public void onLoadFinished(Loader<ContactLoader.Result> loader, ContactLoader.Result data) {
final long loaderCurrentTime = SystemClock.elapsedRealtime();
Log.v(TAG, "Time needed for loading: " + (loaderCurrentTime-mLoaderStartTime));
- if (data == ContactLoader.Result.NOT_FOUND || data == ContactLoader.Result.ERROR) {
+ if (data == ContactLoader.Result.NOT_FOUND || data.isError()) {
// Item has been deleted
Log.i(TAG, "No contact found. Closing activity");
if (mListener != null) mListener.onContactNotFound();
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/socialwidget/SocialWidgetProvider.java b/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
index b29a9cd..cd6a494 100644
--- a/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
+++ b/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
@@ -133,8 +133,7 @@
final RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.social_widget);
- if (contactData == ContactLoader.Result.ERROR ||
- contactData == ContactLoader.Result.NOT_FOUND) {
+ if (contactData.isError() || contactData == ContactLoader.Result.NOT_FOUND) {
setDisplayNameAndSnippet(context, views,
context.getString(R.string.invalidContactMessage), null, null, null);
setPhoto(views, ContactBadgeUtil.loadPlaceholderPhoto(context));
diff --git a/tests/src/com/android/contacts/ContactLoaderTest.java b/tests/src/com/android/contacts/ContactLoaderTest.java
index 3560ce1..5d44cf1 100644
--- a/tests/src/com/android/contacts/ContactLoaderTest.java
+++ b/tests/src/com/android/contacts/ContactLoaderTest.java
@@ -76,17 +76,17 @@
public void testNullUri() {
ContactLoader.Result result = assertLoadContact(null);
- assertEquals(ContactLoader.Result.ERROR, result);
+ assertTrue(result.isError());
}
public void testEmptyUri() {
ContactLoader.Result result = assertLoadContact(Uri.EMPTY);
- assertEquals(ContactLoader.Result.ERROR, result);
+ assertTrue(result.isError());
}
public void testInvalidUri() {
ContactLoader.Result result = assertLoadContact(Uri.parse("content://wtf"));
- assertEquals(ContactLoader.Result.ERROR, result);
+ assertTrue(result.isError());
}
public void testLoadContactWithContactIdUri() {