Merge "Forward intent extras to editor activity from springboard" into ub-contactsdialer-h-dev
diff --git a/src/com/android/contacts/SimImportFragment.java b/src/com/android/contacts/SimImportFragment.java
index 7421df4..7ce00d2 100644
--- a/src/com/android/contacts/SimImportFragment.java
+++ b/src/com/android/contacts/SimImportFragment.java
@@ -57,7 +57,7 @@
         implements LoaderManager.LoaderCallbacks<ArrayList<SimContact>>,
         MultiSelectEntryContactListAdapter.SelectedContactsListener {
 
-    private static final String KEY_ACCOUNT = "account";
+    private static final String KEY_SELECTED_IDS = "selectedIds";
     private static final String ARG_SUBSCRIPTION_ID = "subscriptionId";
     public static final int NO_SUBSCRIPTION_ID = -1;
 
@@ -70,11 +70,14 @@
     private ListView mListView;
     private View mImportButton;
 
+    private long[] mSelectedContacts;
+
     private int mSubscriptionId;
 
     @Override
     public void onCreate(final Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+
         setStyle(STYLE_NORMAL, R.style.PeopleThemeAppCompat_FullScreenDialog);
         mPreferences = new ContactsPreferences(getContext());
         mAccountTypeManager = AccountTypeManager.getInstance(getActivity());
@@ -87,6 +90,9 @@
         final Bundle args = getArguments();
         mSubscriptionId = args == null ? NO_SUBSCRIPTION_ID : args.getInt(ARG_SUBSCRIPTION_ID,
                 NO_SUBSCRIPTION_ID);
+
+        if (savedInstanceState == null) return;
+        mSelectedContacts = savedInstanceState.getLongArray(KEY_SELECTED_IDS);
     }
 
     @Override
@@ -112,8 +118,7 @@
         mAccountHeaderPresenter = new AccountHeaderPresenter(
                 view.findViewById(R.id.account_header_container));
         if (savedInstanceState != null) {
-            AccountWithDataSet account = savedInstanceState.getParcelable(KEY_ACCOUNT);
-            mAccountHeaderPresenter.setCurrentAccount(account);
+            mAccountHeaderPresenter.onRestoreInstanceState(savedInstanceState);
         } else {
             final AccountWithDataSet currentDefaultAccount = AccountWithDataSet
                     .getDefaultOrBestFallback(mPreferences, mAccountTypeManager);
@@ -164,7 +169,10 @@
     @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
-        outState.putParcelable(KEY_ACCOUNT, mAccountHeaderPresenter.getCurrentAccount());
+        mAccountHeaderPresenter.onSaveInstanceState(outState);
+        if (mAdapter != null) {
+            outState.putLongArray(KEY_SELECTED_IDS, mAdapter.getSelectedContactIdsArray());
+        }
     }
 
     @Override
@@ -177,8 +185,11 @@
             ArrayList<SimContact> data) {
         mListView.setEmptyView(getView().findViewById(R.id.empty_message));
         mAdapter.setContacts(data);
-        // we default to selecting all contacts.
-        mAdapter.selectAll();
+        if (mSelectedContacts != null) {
+            mAdapter.select(mSelectedContacts);
+        } else {
+            mAdapter.selectAll();
+        }
         mLoadingIndicator.hide();
     }
 
@@ -293,6 +304,14 @@
             }
             setSelectedContactIds(selected);
         }
+
+        public void select(long[] contacts) {
+            final TreeSet<Long> selected = new TreeSet<>();
+            for (long contact : contacts) {
+                selected.add(contact);
+            }
+            setSelectedContactIds(selected);
+        }
     }
 
     public static class SimContactLoader extends AsyncTaskLoader<ArrayList<SimContact>> {
diff --git a/src/com/android/contacts/editor/AccountHeaderPresenter.java b/src/com/android/contacts/editor/AccountHeaderPresenter.java
index de2b014..5323c60 100644
--- a/src/com/android/contacts/editor/AccountHeaderPresenter.java
+++ b/src/com/android/contacts/editor/AccountHeaderPresenter.java
@@ -16,6 +16,7 @@
 package com.android.contacts.editor;
 
 import android.content.Context;
+import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.StringRes;
 import android.view.View;
@@ -42,6 +43,8 @@
  */
 public class AccountHeaderPresenter {
 
+    private static final String KEY_SELECTED_ACCOUNT = "accountHeaderSelectedAccount";
+
     public interface Observer {
         void onChange(AccountHeaderPresenter sender);
 
@@ -100,6 +103,18 @@
         return mCurrentAccount;
     }
 
+    public void onSaveInstanceState(Bundle outState) {
+        outState.putParcelable(KEY_SELECTED_ACCOUNT, mCurrentAccount);
+    }
+
+    public void onRestoreInstanceState(Bundle savedInstanceState) {
+        if (savedInstanceState == null) return;
+        if (mCurrentAccount == null) {
+            mCurrentAccount = savedInstanceState.getParcelable(KEY_SELECTED_ACCOUNT);
+        }
+        updateDisplayedAccount();
+    }
+
     private void updateDisplayedAccount() {
         mAccountHeaderContainer.setVisibility(View.GONE);
         if (mCurrentAccount == null) return;
@@ -146,31 +161,40 @@
         final View.OnClickListener onClickListener = new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                final ListPopupWindow popup = new ListPopupWindow(mContext, null);
-                final AccountsListAdapter adapter =
-                        new AccountsListAdapter(mContext,
-                                AccountsListAdapter.AccountListFilter.ACCOUNTS_CONTACT_WRITABLE,
-                                mCurrentAccount);
-                popup.setWidth(mAccountHeaderContainer.getWidth());
-                popup.setAnchorView(mAccountHeaderContainer);
-                popup.setAdapter(adapter);
-                popup.setModal(true);
-                popup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
-                popup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
-                    @Override
-                    public void onItemClick(AdapterView<?> parent, View view, int position,
-                            long id) {
-                        UiClosables.closeQuietly(popup);
-                        final AccountWithDataSet newAccount = adapter.getItem(position);
-                        setCurrentAccount(newAccount);
-                    }
-                });
-                popup.show();
+                showPopup();
             }
         };
         setUpAccountSelector(nameLabel.toString(), onClickListener);
     }
 
+    private void showPopup() {
+        final ListPopupWindow popup = new ListPopupWindow(mContext);
+        final AccountsListAdapter adapter =
+                new AccountsListAdapter(mContext,
+                        AccountsListAdapter.AccountListFilter.ACCOUNTS_CONTACT_WRITABLE,
+                        mCurrentAccount);
+        popup.setWidth(mAccountHeaderContainer.getWidth());
+        popup.setAnchorView(mAccountHeaderContainer);
+        popup.setAdapter(adapter);
+        popup.setModal(true);
+        popup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
+        popup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position,
+                    long id) {
+                UiClosables.closeQuietly(popup);
+                final AccountWithDataSet newAccount = adapter.getItem(position);
+                setCurrentAccount(newAccount);
+            }
+        });
+        mAccountHeaderContainer.post(new Runnable() {
+            @Override
+            public void run() {
+                popup.show();
+            }
+        });
+    }
+
     private void setUpAccountSelector(String nameLabel, View.OnClickListener listener) {
         addAccountHeader(nameLabel);
         // Add handlers for choosing another account to save to.