Merge "Fix incorrect tab highlight in QuickContactActivity." into jb-mr1.1-dev
diff --git a/res/layout/dialtacts_custom_action_bar.xml b/res/layout/dialtacts_custom_action_bar.xml
index 0af8eaa..26e4785 100644
--- a/res/layout/dialtacts_custom_action_bar.xml
+++ b/res/layout/dialtacts_custom_action_bar.xml
@@ -36,6 +36,8 @@
         android:paddingRight="4dip"
         android:layout_height="match_parent"
         android:layout_alignParentRight="true"
+        android:contentDescription="@string/action_menu_overflow_description"
+        android:importantForAccessibility="yes"
         android:src="@drawable/ic_menu_overflow"
         android:background="?android:attr/selectableItemBackground"
         android:visibility="gone" />
diff --git a/res/layout/name_edit_expansion_view.xml b/res/layout/name_edit_expansion_view.xml
new file mode 100644
index 0000000..17ae263
--- /dev/null
+++ b/res/layout/name_edit_expansion_view.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+
+<!-- "More" or "less" expansion button in the contact editor. -->
+
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="@dimen/editor_min_line_item_height"
+    android:layout_gravity="top"
+    android:contentDescription="@string/expand_collapse_name_fields_description"
+    android:importantForAccessibility="yes">
+    <ImageView
+        android:id="@+id/expansion_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:duplicateParentState="true"
+        android:background="?android:attr/selectableItemBackground"
+        android:paddingLeft="@dimen/editor_round_button_padding_left"
+        android:paddingRight="@dimen/editor_round_button_padding_right"
+        android:paddingTop="@dimen/editor_round_button_padding_top"
+        android:paddingBottom="@dimen/editor_round_button_padding_bottom" />
+</FrameLayout>
diff --git a/res/layout/phonetic_name_editor_view.xml b/res/layout/phonetic_name_editor_view.xml
index 5846998..3b7562b 100644
--- a/res/layout/phonetic_name_editor_view.xml
+++ b/res/layout/phonetic_name_editor_view.xml
@@ -40,7 +40,7 @@
 
         <include
             android:id="@+id/expansion_view_container"
-            layout="@layout/edit_expansion_view"
+            layout="@layout/name_edit_expansion_view"
             android:visibility="gone" />
 
         <include
diff --git a/res/layout/structured_name_editor_view.xml b/res/layout/structured_name_editor_view.xml
index 3c5d5c9..d1eace8 100644
--- a/res/layout/structured_name_editor_view.xml
+++ b/res/layout/structured_name_editor_view.xml
@@ -38,7 +38,7 @@
 
         <include
             android:id="@+id/expansion_view_container"
-            layout="@layout/edit_expansion_view"
+            layout="@layout/name_edit_expansion_view"
             android:visibility="gone" />
 
         <include
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d90d0ef..1ac9b87 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -136,11 +136,11 @@
     <!-- Menu item that deletes the currently selected group [CHAR LIMIT=30] -->
     <string name="menu_deleteGroup">Delete</string>
 
-    <!-- Menu item (in the action bar) that creates a new contacts [CHAR LIMIT=12] -->
-    <string name="menu_new_contact_action_bar">New</string>
+    <!-- Menu item (in the action bar) that creates a new contact [CHAR LIMIT=30] -->
+    <string name="menu_new_contact_action_bar">Add Contact</string>
 
-    <!-- Menu item (in the action bar) that creates a new group [CHAR LIMIT=12] -->
-    <string name="menu_new_group_action_bar">New</string>
+    <!-- Menu item (in the action bar) that creates a new group [CHAR LIMIT=30] -->
+    <string name="menu_new_group_action_bar">Add Group</string>
 
     <!-- Title of the confirmation dialog for separating contacts into multiple instances [CHAR LIMIT=26] -->
     <string name="splitConfirmation_title">Separate contact?</string>
@@ -1850,4 +1850,11 @@
          [CHAR LIMIT=NONE] -->
     <string name="action_menu_overflow_description" msgid="2295659037509008453">More options</string>
 
+    <!-- Content description for the expand or collapse name fields button.
+         Clicking this button causes the name editor to toggle between showing
+         a single field where the entire name is edited at once, or multiple
+         fields corresponding to each part of the name (Name Prefix, First Name,
+         Middle Name, Last Name, Name Suffix).
+         [CHAR LIMIT=NONE] -->
+    <string name="expand_collapse_name_fields_description">Expand or collapse name fields</string>
 </resources>
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 66c1686..e29e488 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -118,8 +118,12 @@
     private static final String KEY_IS_USER_PROFILE = "isUserProfile";
     private static final String KEY_UPDATED_PHOTOS = "updatedPhotos";
 
+    private static final String[] VALID_ACTIONS = {Intent.ACTION_EDIT, Intent.ACTION_INSERT,
+            ContactEditorActivity.ACTION_SAVE_COMPLETED};
+
     public static final String SAVE_MODE_EXTRA_KEY = "saveMode";
 
+
     /**
      * An intent extra that forces the editor to add the edited contact
      * to the default group (e.g. "My Contacts").
@@ -347,11 +351,6 @@
 
         setHasOptionsMenu(true);
 
-        // If we are in an orientation change, we already have mState (it was loaded by onCreate)
-        if (mState != null) {
-            bindEditors();
-        }
-
         return view;
     }
 
@@ -359,13 +358,29 @@
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
 
+        validateAction(mAction);
+
         // Handle initial actions only when existing state missing
         final boolean hasIncomingState = savedInstanceState != null;
 
-        if (!hasIncomingState) {
+        if (mState == null) {
+            // The delta list may not have finished loading before orientation change happens.
+            // In this case, there will be a saved state but deltas will be missing.  Reload from
+            // database.
             if (Intent.ACTION_EDIT.equals(mAction)) {
+                // Either...
+                // 1) orientation change but load never finished.
+                // or
+                // 2) not an orientation change.  data needs to be loaded for first time.
                 getLoaderManager().initLoader(LOADER_DATA, null, mDataLoaderListener);
-            } else if (Intent.ACTION_INSERT.equals(mAction)) {
+            }
+        } else {
+            // Orientation change, we already have mState, it was loaded by onCreate
+            bindEditors();
+        }
+
+        if (!hasIncomingState) {
+            if (Intent.ACTION_INSERT.equals(mAction)) {
                 final Account account = mIntentExtras == null ? null :
                         (Account) mIntentExtras.getParcelable(Intents.Insert.ACCOUNT);
                 final String dataSet = mIntentExtras == null ? null :
@@ -379,13 +394,26 @@
                     // Load Accounts async so that we can present them
                     selectAccountAndCreateContact();
                 }
-            } else if (ContactEditorActivity.ACTION_SAVE_COMPLETED.equals(mAction)) {
-                // do nothing
-            } else throw new IllegalArgumentException("Unknown Action String " + mAction +
-                    ". Only support " + Intent.ACTION_EDIT + " or " + Intent.ACTION_INSERT);
+            }
         }
     }
 
+    /**
+     * Checks if the requested action is valid.
+     *
+     * @param action The action to test.
+     * @throws IllegalArgumentException when the action is invalid.
+     */
+    private void validateAction(String action) {
+        for (String validAction : VALID_ACTIONS) {
+            if (validAction.equals(action)) {
+                return;
+            }
+        }
+        throw new IllegalArgumentException("Unknown Action String " + mAction +
+                ". Only support " + Intent.ACTION_EDIT + " or " + Intent.ACTION_INSERT);
+    }
+
     @Override
     public void onStart() {
         getLoaderManager().initLoader(LOADER_GROUPS, null, mGroupLoaderListener);