Dismiss import dialog after it's clicked

- The workflow we want to fix is opening account dialog from import dialog.

- Previously, we keep import dialog around until account is chosen; this
  workflow never worked well on rotation since Lollipop.

- Now, we dismiss import dialog to simplify the workflow; and since we
  dismiss the import dialog, we use activity as a listener.

- SelectAccountDialogFragment is used in:
   - import contacts
   - create a new group

Bug: 32502787

Test: manual - verify importing contacts and creating new groups
               work well after rotation when there's 0, 1, and 2+ accounts.

Change-Id: Ic8b9c3f9987aeb3867ab2100097c235088507bdb
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index 325ecbe..e348a20 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -703,9 +703,9 @@
             onAccountChosen(accounts.get(0), /* extraArgs */ null);
             return;
         }
-        SelectAccountDialogFragment.show(getFragmentManager(), null,
-                R.string.dialog_new_group_account, AccountListFilter.ACCOUNTS_GROUP_WRITABLE,
-                /* extraArgs */ null, TAG_SELECT_ACCOUNT_DIALOG);
+        SelectAccountDialogFragment.show(getFragmentManager(), R.string.dialog_new_group_account,
+                AccountListFilter.ACCOUNTS_GROUP_WRITABLE, /* extraArgs */ null,
+                TAG_SELECT_ACCOUNT_DIALOG);
     }
 
     @Override
diff --git a/src/com/android/contacts/common/interactions/ImportDialogFragment.java b/src/com/android/contacts/common/interactions/ImportDialogFragment.java
index db7f621..a748b81 100644
--- a/src/com/android/contacts/common/interactions/ImportDialogFragment.java
+++ b/src/com/android/contacts/common/interactions/ImportDialogFragment.java
@@ -25,9 +25,6 @@
 import android.content.DialogInterface;
 import android.content.res.Resources;
 import android.os.Bundle;
-import android.support.v4.text.TextUtilsCompat;
-import android.text.SpannableString;
-import android.text.SpannableStringBuilder;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.LayoutInflater;
@@ -54,12 +51,11 @@
 /**
  * An dialog invoked to import/export contacts.
  */
-public class ImportDialogFragment extends DialogFragment
-        implements SelectAccountDialogFragment.Listener {
+public class ImportDialogFragment extends DialogFragment {
     public static final String TAG = "ImportDialogFragment";
 
-    private static final String KEY_RES_ID = "resourceId";
-    private static final String KEY_SUBSCRIPTION_ID = "subscriptionId";
+    public static final String KEY_RES_ID = "resourceId";
+    public static final String KEY_SUBSCRIPTION_ID = "subscriptionId";
 
     public static final String EXTRA_SIM_ONLY = "extraSimOnly";
 
@@ -178,20 +174,16 @@
                 new DialogInterface.OnClickListener() {
             @Override
             public void onClick(DialogInterface dialog, int which) {
-                boolean dismissDialog;
                 final int resId = adapter.getItem(which).mChoiceResourceId;
                 if (resId == R.string.import_from_sim) {
-                    dismissDialog = handleSimImportRequest(adapter.getItem(which).mSim);
+                    handleSimImportRequest(adapter.getItem(which).mSim);
                 } else if (resId == R.string.import_from_vcf_file) {
-                        dismissDialog = handleImportRequest(resId, SimCard.NO_SUBSCRIPTION_ID);
+                    handleImportRequest(resId, SimCard.NO_SUBSCRIPTION_ID);
                 } else {
-                    dismissDialog = true;
                     Log.e(TAG, "Unexpected resource: "
                             + getActivity().getResources().getResourceEntryName(resId));
                 }
-                if (dismissDialog) {
-                    dialog.dismiss();
-                }
+                dialog.dismiss();
             }
         };
 
@@ -238,18 +230,15 @@
         }
     }
 
-    private boolean handleSimImportRequest(SimCard sim) {
+    private void handleSimImportRequest(SimCard sim) {
         SimImportFragment.newInstance(sim.getSubscriptionId()).show(getFragmentManager(),
                 "SimImport");
-        return true;
     }
 
     /**
      * Handle "import from SD".
-     *
-     * @return {@code true} if the dialog show be closed.  {@code false} otherwise.
      */
-    private boolean handleImportRequest(int resId, int subscriptionId) {
+    private void handleImportRequest(int resId, int subscriptionId) {
         // There are three possibilities:
         // - more than one accounts -> ask the user
         // - just one account -> use the account without asking the user
@@ -263,39 +252,13 @@
             args.putInt(KEY_RES_ID, resId);
             args.putInt(KEY_SUBSCRIPTION_ID, subscriptionId);
             SelectAccountDialogFragment.show(
-                    getFragmentManager(), this,
-                    R.string.dialog_new_contact_account,
+                    getFragmentManager(), R.string.dialog_new_contact_account,
                     AccountListFilter.ACCOUNTS_CONTACT_WRITABLE, args);
-
-            // In this case, because this DialogFragment is used as a target fragment to
-            // SelectAccountDialogFragment, we can't close it yet.  We close the dialog when
-            // we get a callback from it.
-            return false;
+        } else {
+            AccountSelectionUtil.doImport(getActivity(), resId,
+                    (size == 1 ? accountList.get(0) : null),
+                    (CompatUtils.isMSIMCompatible() ? subscriptionId : -1));
         }
-
-        AccountSelectionUtil.doImport(getActivity(), resId,
-                (size == 1 ? accountList.get(0) : null),
-                (CompatUtils.isMSIMCompatible() ? subscriptionId : -1));
-        return true; // Close the dialog.
-    }
-
-    /**
-     * Called when an account is selected on {@link SelectAccountDialogFragment}.
-     */
-    @Override
-    public void onAccountChosen(AccountWithDataSet account, Bundle extraArgs) {
-        AccountSelectionUtil.doImport(getActivity(), extraArgs.getInt(KEY_RES_ID),
-                account, extraArgs.getInt(KEY_SUBSCRIPTION_ID));
-
-        // At this point the dialog is still showing (which is why we can use getActivity() above)
-        // So close it.
-        dismiss();
-    }
-
-    @Override
-    public void onAccountSelectorCancelled() {
-        // See onAccountChosen() -- at this point the dialog is still showing.  Close it.
-        dismiss();
     }
 
     private CharSequence getSimDescription(SimCard sim, int index) {
diff --git a/src/com/android/contacts/common/preference/ContactsPreferenceActivity.java b/src/com/android/contacts/common/preference/ContactsPreferenceActivity.java
index 030575d..4bdb12f 100644
--- a/src/com/android/contacts/common/preference/ContactsPreferenceActivity.java
+++ b/src/com/android/contacts/common/preference/ContactsPreferenceActivity.java
@@ -34,15 +34,19 @@
 import android.view.ViewGroup;
 
 import com.android.contacts.common.R;
+import com.android.contacts.common.interactions.ImportDialogFragment;
 import com.android.contacts.common.list.ProviderStatusWatcher;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.preference.DisplayOptionsPreferenceFragment.ProfileListener;
 import com.android.contacts.common.preference.DisplayOptionsPreferenceFragment.ProfileQuery;
+import com.android.contacts.common.util.AccountSelectionUtil;
+import com.android.contacts.editor.SelectAccountDialogFragment;
 
 /**
  * Contacts settings.
  */
-public final class ContactsPreferenceActivity extends PreferenceActivity implements
-        ProfileListener {
+public final class ContactsPreferenceActivity extends PreferenceActivity
+        implements ProfileListener, SelectAccountDialogFragment.Listener {
 
     private static final String TAG_ABOUT = "about_contacts";
     private static final String TAG_DISPLAY_OPTIONS = "display_options";
@@ -210,4 +214,14 @@
                 getFragmentManager().findFragmentByTag(TAG_DISPLAY_OPTIONS);
         fragment.updateMyInfoPreference(hasProfile, displayName, contactId);
     }
+
+    @Override
+    public void onAccountChosen(AccountWithDataSet account, Bundle extraArgs) {
+        AccountSelectionUtil.doImport(this, extraArgs.getInt(ImportDialogFragment
+                .KEY_RES_ID), account, extraArgs.getInt(ImportDialogFragment.KEY_SUBSCRIPTION_ID));
+    }
+
+    @Override
+    public void onAccountSelectorCancelled() {
+    }
 }
diff --git a/src/com/android/contacts/editor/SelectAccountDialogFragment.java b/src/com/android/contacts/editor/SelectAccountDialogFragment.java
index 34fac4f..4335239 100644
--- a/src/com/android/contacts/editor/SelectAccountDialogFragment.java
+++ b/src/com/android/contacts/editor/SelectAccountDialogFragment.java
@@ -20,7 +20,6 @@
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.DialogFragment;
-import android.app.Fragment;
 import android.app.FragmentManager;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -48,22 +47,18 @@
      * Show the dialog.
      *
      * @param fragmentManager {@link FragmentManager}.
-     * @param targetFragment {@link Fragment} that implements {@link Listener}.
      * @param titleResourceId resource ID to use as the title.
      * @param accountListFilter account filter.
      * @param extraArgs Extra arguments, which will later be passed to
      *     {@link Listener#onAccountChosen}.  {@code null} will be converted to
      *     {@link Bundle#EMPTY}.
      */
-    public static <F extends Fragment & Listener> void show(FragmentManager fragmentManager,
-            F targetFragment, int titleResourceId,
+    public static void show(FragmentManager fragmentManager, int titleResourceId,
             AccountListFilter accountListFilter, Bundle extraArgs) {
-        show(fragmentManager, targetFragment, titleResourceId, accountListFilter, extraArgs,
-                /* tag */ null);
+        show(fragmentManager, titleResourceId, accountListFilter, extraArgs, /* tag */ null);
     }
 
-    public static <F extends Fragment & Listener> void show(FragmentManager fragmentManager,
-            F targetFragment, int titleResourceId,
+    public static void show(FragmentManager fragmentManager, int titleResourceId,
             AccountListFilter accountListFilter, Bundle extraArgs, String tag) {
         final Bundle args = new Bundle();
         args.putInt(KEY_TITLE_RES_ID, titleResourceId);
@@ -72,9 +67,6 @@
 
         final SelectAccountDialogFragment instance = new SelectAccountDialogFragment();
         instance.setArguments(args);
-        if (targetFragment != null) {
-            instance.setTargetFragment(targetFragment, 0);
-        }
         instance.show(fragmentManager, tag);
     }
 
@@ -115,14 +107,8 @@
         }
     }
 
-    @Override
-    public void onSaveInstanceState(Bundle b) {
-        setTargetFragment(null, -1);
-        super.onSaveInstanceState(b);
-    }
-
     /**
-     * Calls {@link Listener#onAccountChosen} of {@code targetFragment}.
+     * Calls {@link Listener#onAccountChosen}.
      */
     private void onAccountSelected(AccountWithDataSet account) {
         final Listener listener = getListener();
@@ -133,14 +119,9 @@
 
     private Listener getListener() {
         Listener listener = null;
-        final Fragment targetFragment = getTargetFragment();
-        if (targetFragment == null) {
-            final Activity activity = getActivity();
-            if (activity != null && activity instanceof Listener) {
-                listener = (Listener) activity;
-            }
-        } else if (targetFragment instanceof Listener) {
-            listener = (Listener) targetFragment;
+        final Activity activity = getActivity();
+        if (activity != null && activity instanceof Listener) {
+            listener = (Listener) activity;
         }
         return listener;
     }