Merge "Import revised translations.  DO NOT MERGE" into honeycomb
diff --git a/res/layout/navigation_bar.xml b/res/layout/navigation_bar.xml
index 7840430..803705c 100644
--- a/res/layout/navigation_bar.xml
+++ b/res/layout/navigation_bar.xml
@@ -30,7 +30,7 @@
         android:gravity="center_vertical"
         android:textAppearance="?android:attr/textAppearanceMedium"
         android:text="@string/search_label"
-        android:minWidth="220dip" />
+        android:minWidth="@dimen/action_bar_filter_min_width" />
 
     <view
         class="com.android.contacts.list.ContactListFilterView"
@@ -40,7 +40,8 @@
         android:layout_height="match_parent"
         android:layout_gravity="left|center_vertical"
         android:focusable="true"
-        android:minWidth="220dip" >
+        android:minWidth="@dimen/action_bar_filter_min_width"
+         >
         <ImageView
             android:id="@+id/icon"
             android:scaleType="fitCenter"
@@ -55,7 +56,9 @@
             android:layout_width="wrap_content"
             android:gravity="center_vertical"
             android:textAppearance="?android:attr/textAppearanceMedium"
-            android:ellipsize="end" />
+            android:ellipsize="end"
+            android:singleLine="true" 
+            android:maxWidth="@dimen/action_bar_filter_max_width" />
     </view>
 
     <SearchView
@@ -63,8 +66,8 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_gravity="center_vertical"
-        android:layout_marginLeft="32dip"  
-        android:maxWidth="300dip"
+        android:layout_marginLeft="@dimen/action_bar_search_spacing"  
+        android:maxWidth="@dimen/action_bar_search_max_width"
         android:iconifiedByDefault="false" />
 
 </LinearLayout>
diff --git a/res/values-xlarge-land/dimens.xml b/res/values-xlarge-land/dimens.xml
index 85bd3a8..52c521e 100644
--- a/res/values-xlarge-land/dimens.xml
+++ b/res/values-xlarge-land/dimens.xml
@@ -15,4 +15,8 @@
 -->
 <resources>
     <dimen name="quick_contact_width">452dip</dimen>
+    <dimen name="action_bar_filter_min_width">220dip</dimen>
+    <dimen name="action_bar_filter_max_width">300dip</dimen>
+    <dimen name="action_bar_search_max_width">336dip</dimen>
+    <dimen name="action_bar_search_spacing">32dip</dimen>
 </resources>
diff --git a/res/values-xlarge/dimens.xml b/res/values-xlarge/dimens.xml
index 058e2cf..6ffbb31 100644
--- a/res/values-xlarge/dimens.xml
+++ b/res/values-xlarge/dimens.xml
@@ -18,4 +18,8 @@
     <dimen name="aggregation_suggestion_icon_size">64dip</dimen>
     <dimen name="quick_contact_width">356dip</dimen>
     <dimen name="contact_name_text_size">26sp</dimen>
+    <dimen name="action_bar_filter_min_width">120dip</dimen>
+    <dimen name="action_bar_filter_max_width">120dip</dimen>
+    <dimen name="action_bar_search_max_width">300dip</dimen>
+    <dimen name="action_bar_search_spacing">12dip</dimen>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index d55ebd6..0b2cffd 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -60,4 +60,17 @@
 
     <!-- Font size used for the contact name in the detail and the editor -->
     <dimen name="contact_name_text_size">18sp</dimen>
+
+    <!-- Minimum width of the filter selector in the action bar -->
+    <dimen name="action_bar_filter_min_width">100dip</dimen>
+
+    <!-- Maximum width of the filter selector in the action bar -->
+    <dimen name="action_bar_filter_max_width">100dip</dimen>
+
+    <!-- Maximum width of the search field in the action bar -->
+    <dimen name="action_bar_search_max_width">100dip</dimen>
+
+    <!-- Spacing on the left the search field in the action bar -->
+    <dimen name="action_bar_search_spacing">12dip</dimen>
+
 </resources>
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index d9c577e..b117d77 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -227,6 +227,7 @@
     private long mLoaderStartTime;
 
     private int mStatus;
+    private boolean mSaveOnStop = true;
 
     private AggregationSuggestionEngine mAggregationSuggestionEngine;
     private long mAggregationSuggestionsRawContactId;
@@ -265,8 +266,9 @@
         if (mAggregationSuggestionEngine != null) {
             mAggregationSuggestionEngine.quit();
         }
+
         // If anything was left unsaved, save it now but keep the editor open.
-        if (!getActivity().isChangingConfigurations() && mStatus == Status.EDITING) {
+        if (!getActivity().isChangingConfigurations() && mStatus == Status.EDITING && mSaveOnStop) {
             save(SaveMode.RELOAD);
         }
     }
@@ -321,6 +323,7 @@
 
     @Override
     public void onStart() {
+        mSaveOnStop = true;
         getLoaderManager().initLoader(LOADER_GROUPS, null, mGroupLoaderListener);
         super.onStart();
     }
@@ -736,6 +739,7 @@
 
             // Launch gallery to crop the photo
             final Intent intent = getCropImageIntent(Uri.fromFile(f));
+            mSaveOnStop = false;
             startActivityForResult(intent, REQUEST_CODE_PHOTO_PICKED_WITH_DATA);
         } catch (Exception e) {
             Log.e(TAG, "Cannot crop image", e);
@@ -1821,6 +1825,7 @@
                 mCurrentPhotoFile = new File(PHOTO_DIR, getPhotoFileName());
                 final Intent intent = getTakePickIntent(mCurrentPhotoFile);
 
+                mSaveOnStop = false;
                 startActivityForResult(intent, REQUEST_CODE_CAMERA_WITH_DATA);
             } catch (ActivityNotFoundException e) {
                 Toast.makeText(mContext, R.string.photoPickerNotFoundText,
@@ -1837,6 +1842,7 @@
             try {
                 // Launch picker to choose photo for selected contact
                 final Intent intent = getPhotoPickIntent();
+                mSaveOnStop = false;
                 startActivityForResult(intent, REQUEST_CODE_PHOTO_PICKED_WITH_DATA);
             } catch (ActivityNotFoundException e) {
                 Toast.makeText(mContext, R.string.photoPickerNotFoundText,
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 6bdfd97..70eb0db 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -432,6 +432,12 @@
     }
 
     protected void onPartitionLoaded(int partitionIndex, Cursor data) {
+        if (partitionIndex >= mAdapter.getPartitionCount()) {
+            // When we get unsolicited data, ignore it.  This could happen
+            // when we are switching from search mode to the default mode.
+            return;
+        }
+
         mAdapter.changeCursor(partitionIndex, data);
         showCount(partitionIndex, data);