Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c3322286 authored by Wenyi Wang's avatar Wenyi Wang
Browse files

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
parent d5702716
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -703,9 +703,9 @@ public abstract class ContactsDrawerActivity extends AppCompatContactsActivity i
            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
+13 −50
Original line number Diff line number Diff line
@@ -25,9 +25,6 @@ import android.content.Context;
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 @@ import java.util.List;
/**
 * 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,21 +174,17 @@ public class ImportDialogFragment extends DialogFragment
                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();
            }
            }
        };

        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), getTheme())
@@ -238,18 +230,15 @@ public class ImportDialogFragment extends DialogFragment
        }
    }

    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 @@ public class ImportDialogFragment extends DialogFragment
            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));
        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) {
+16 −2
Original line number Diff line number Diff line
@@ -34,15 +34,19 @@ import android.view.View;
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 @@ public final class ContactsPreferenceActivity extends PreferenceActivity impleme
                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() {
    }
}
+7 −26
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ import android.app.Activity;
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 @@ public final class SelectAccountDialogFragment extends DialogFragment {
     * 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 @@ public final class SelectAccountDialogFragment extends DialogFragment {

        final SelectAccountDialogFragment instance = new SelectAccountDialogFragment();
        instance.setArguments(args);
        if (targetFragment != null) {
            instance.setTargetFragment(targetFragment, 0);
        }
        instance.show(fragmentManager, tag);
    }

@@ -115,14 +107,8 @@ public final class SelectAccountDialogFragment extends DialogFragment {
        }
    }

    @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,15 +119,10 @@ public final class SelectAccountDialogFragment extends DialogFragment {

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