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;
}