auto import from //depot/cupcake/@136594
diff --git a/src/com/android/contacts/EditContactActivity.java b/src/com/android/contacts/EditContactActivity.java
index 49569e3..44bdef5 100644
--- a/src/com/android/contacts/EditContactActivity.java
+++ b/src/com/android/contacts/EditContactActivity.java
@@ -162,6 +162,7 @@
     
     private EditText mNameView;
     private ImageView mPhotoImageView;
+    private ViewGroup mContentView;
     private LinearLayout mLayout;
     private LayoutInflater mInflater;
     private MenuItem mPhotoMenuItem;
@@ -335,7 +336,10 @@
         setupSections();
 
         // Load the UI
-        setContentView(R.layout.edit_contact);
+        mInflater = getLayoutInflater();
+        mContentView = (ViewGroup)mInflater.inflate(R.layout.edit_contact, null);
+        setContentView(mContentView);
+        
         mLayout = (LinearLayout) findViewById(R.id.list);
         mNameView = (EditText) findViewById(R.id.name);
         mPhotoImageView = (ImageView) findViewById(R.id.photoImage);
@@ -348,8 +352,6 @@
         view = findViewById(R.id.discardButton);
         view.setOnClickListener(this);
 
-        mInflater = getLayoutInflater();
-
         // Resolve the intent
         mState = STATE_UNKNOWN;
         Intent intent = getIntent();
@@ -401,6 +403,48 @@
     
     @Override
     protected void onSaveInstanceState(Bundle outState) {
+        
+        // To store current focus between config changes, follow focus down the
+        // view tree, keeping track of any parents with EditEntry tags
+        View focusedChild = mContentView.getFocusedChild();
+        EditEntry focusedEntry = null;
+        while (focusedChild != null) {
+            Object tag = focusedChild.getTag();
+            if (tag instanceof EditEntry) {
+                focusedEntry = (EditEntry) tag;
+            }
+            
+            // Keep going deeper until child isn't a group
+            if (focusedChild instanceof ViewGroup) {
+                View deeperFocus = ((ViewGroup) focusedChild).getFocusedChild();
+                if (deeperFocus != null) {
+                    focusedChild = deeperFocus;
+                } else {
+                    break;
+                }
+            } else {
+                break;
+            }
+        }
+        
+        if (focusedChild != null) {
+            int requestFocusId = focusedChild.getId();
+            int requestCursor = 0;
+            if (focusedChild instanceof EditText) {
+                requestCursor = ((EditText) focusedChild).getSelectionStart();
+            }
+            
+            // Store focus values in EditEntry if found, otherwise store as
+            // generic values
+            if (focusedEntry != null) {
+                focusedEntry.requestFocusId = requestFocusId;
+                focusedEntry.requestCursor = requestCursor;
+            } else {
+                outState.putInt("requestFocusId", requestFocusId);
+                outState.putInt("requestCursor", requestCursor);
+            }
+        }
+        
         outState.putParcelableArrayList("phoneEntries", mPhoneEntries);
         outState.putParcelableArrayList("emailEntries", mEmailEntries);
         outState.putParcelableArrayList("imEntries", mImEntries);
@@ -447,6 +491,17 @@
 
         // Now that everything is restored, build the view
         buildViews();
+        
+        // Try restoring any generally requested focus
+        int requestFocusId = inState.getInt("requestFocusId", View.NO_ID);
+        View focusedChild = mContentView.findViewById(requestFocusId);
+        if (focusedChild != null) {
+            focusedChild.requestFocus();
+            if (focusedChild instanceof EditText) {
+                int requestCursor = inState.getInt("requestCursor", 0);
+                ((EditText) focusedChild).setSelection(requestCursor);
+            }
+        }
     }
 
     @Override
@@ -1572,6 +1627,19 @@
                 }
             }
         }
+        
+        // Give focus to children as requested, possibly after a configuration change
+        View focusChild = view.findViewById(entry.requestFocusId);
+        if (focusChild != null) {
+            focusChild.requestFocus();
+            if (focusChild instanceof EditText) {
+                ((EditText) focusChild).setSelection(entry.requestCursor);
+            }
+        }
+        
+        // Reset requested focus values
+        entry.requestFocusId = View.NO_ID;
+        entry.requestCursor = 0;
 
         // Connect listeners up to watch for changed values.
         if (data instanceof EditText) {
@@ -1656,6 +1724,19 @@
         public boolean isStaticLabel = false;
         public boolean syncDataWithView = true;
 
+        /**
+         * Request focus on the child of this {@link EditEntry} found using
+         * {@link View#findViewById(int)}. This value should be reset to
+         * {@link View#NO_ID} after each use.
+         */
+        public int requestFocusId = View.NO_ID;
+
+        /**
+         * If the {@link #requestFocusId} is an {@link EditText}, this value
+         * indicates the requested cursor position placement.
+         */
+        public int requestCursor = 0;
+
         private EditEntry() {
             // only used by CREATOR
         }
@@ -2082,7 +2163,8 @@
             entry.column = ContactMethods.DATA;
             entry.contentDirectory = People.ContactMethods.CONTENT_DIRECTORY;
             entry.kind = Contacts.KIND_IM;
-            entry.contentType = EditorInfo.TYPE_CLASS_TEXT;
+            entry.contentType = EditorInfo.TYPE_CLASS_TEXT
+                    | EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
             return entry;
         }
     }