Split Import and Export Dialogs

Bug: 28942286
Test: manually entering the settings with 0 and non-zero numbers of
contacts checking that export option appears only with non-zero contacts

Change-Id: I4a5b2714081fab1f6ed387a821e3df59d4b36eee
diff --git a/src/com/android/contacts/common/interactions/ExportDialogFragment.java b/src/com/android/contacts/common/interactions/ExportDialogFragment.java
new file mode 100644
index 0000000..84a43dd
--- /dev/null
+++ b/src/com/android/contacts/common/interactions/ExportDialogFragment.java
@@ -0,0 +1,230 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.common.interactions;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.ContactsContract.Contacts;
+import android.telephony.SubscriptionManager;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.android.contacts.common.R;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
+import com.android.contacts.common.vcard.ExportVCardActivity;
+import com.android.contacts.common.vcard.ShareVCardActivity;
+import com.android.contacts.common.vcard.VCardCommonArguments;
+
+/**
+ * An dialog invoked to import/export contacts.
+ */
+public class ExportDialogFragment extends DialogFragment {
+    public static final String TAG = "ExportDialogFragment";
+
+    public static final int EXPORT_MODE_FAVORITES = 0;
+    public static final int EXPORT_MODE_ALL_CONTACTS = 1;
+    public static final int EXPORT_MODE_DEFAULT = -1;
+
+    private static int mExportMode = EXPORT_MODE_DEFAULT;
+
+    private final String[] LOOKUP_PROJECTION = new String[] {
+            Contacts.LOOKUP_KEY
+    };
+
+    private SubscriptionManager mSubscriptionManager;
+
+    /** Preferred way to show this dialog */
+    public static void show(FragmentManager fragmentManager, Class callingActivity,
+            int exportMode) {
+        final ExportDialogFragment fragment = new ExportDialogFragment();
+        Bundle args = new Bundle();
+        args.putString(VCardCommonArguments.ARG_CALLING_ACTIVITY, callingActivity.getName());
+        fragment.setArguments(args);
+        fragment.show(fragmentManager, TAG);
+        mExportMode = exportMode;
+    }
+
+    @Override
+    public Context getContext() {
+        return getActivity();
+    }
+
+    @Override
+    public void onAttach(Activity activity) {
+        super.onAttach(activity);
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        // Wrap our context to inflate list items using the correct theme
+        final Resources res = getActivity().getResources();
+        final LayoutInflater dialogInflater = (LayoutInflater)getActivity()
+                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        final String callingActivity = getArguments().getString(
+                VCardCommonArguments.ARG_CALLING_ACTIVITY);
+
+        // Adapter that shows a list of string resources
+        final ArrayAdapter<AdapterEntry> adapter = new ArrayAdapter<AdapterEntry>(getActivity(),
+                R.layout.select_dialog_item) {
+            @Override
+            public View getView(int position, View convertView, ViewGroup parent) {
+                final TextView result = (TextView)(convertView != null ? convertView :
+                        dialogInflater.inflate(R.layout.select_dialog_item, parent, false));
+
+                result.setText(getItem(position).mLabel);
+                return result;
+            }
+        };
+
+        if (res.getBoolean(R.bool.config_allow_export)) {
+                adapter.add(new AdapterEntry(getString(R.string.export_to_vcf_file),
+                        R.string.export_to_vcf_file));
+        }
+        if (res.getBoolean(R.bool.config_allow_share_contacts)) {
+            if (mExportMode == EXPORT_MODE_FAVORITES) {
+                // share favorite and frequently contacted contacts from Favorites tab
+                adapter.add(new AdapterEntry(getString(R.string.share_favorite_contacts),
+                        R.string.share_contacts));
+            } else {
+                // share "all" contacts (in groups selected in "Customize") from All tab for now
+                // TODO: change the string to share_visible_contacts if implemented
+                adapter.add(new AdapterEntry(getString(R.string.share_contacts),
+                        R.string.share_contacts));
+            }
+        }
+
+        final DialogInterface.OnClickListener clickListener =
+                new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                boolean dismissDialog;
+                final int resId = adapter.getItem(which).mChoiceResourceId;
+                if (resId == R.string.export_to_vcf_file) {
+                    dismissDialog = true;
+                    final Intent exportIntent = new Intent(
+                            getActivity(), ExportVCardActivity.class);
+                    exportIntent.putExtra(VCardCommonArguments.ARG_CALLING_ACTIVITY,
+                            callingActivity);
+                    getActivity().startActivity(exportIntent);
+                } else if (resId == R.string.share_contacts) {
+                    dismissDialog = true;
+                    if (mExportMode == EXPORT_MODE_FAVORITES) {
+                        doShareFavoriteContacts();
+                    } else { // EXPORT_MODE_ALL_CONTACTS
+                        final Intent exportIntent = new Intent(
+                                getActivity(), ShareVCardActivity.class);
+                        exportIntent.putExtra(VCardCommonArguments.ARG_CALLING_ACTIVITY,
+                                callingActivity);
+                        getActivity().startActivity(exportIntent);
+                    }
+                } else {
+                    dismissDialog = true;
+                    Log.e(TAG, "Unexpected resource: "
+                            + getActivity().getResources().getResourceEntryName(resId));
+                }
+                if (dismissDialog) {
+                    dialog.dismiss();
+                }
+            }
+        };
+        final TextView title = (TextView) View.inflate(getActivity(), R.layout.dialog_title, null);
+        title.setText(R.string.dialog_export);
+        return new AlertDialog.Builder(getActivity())
+                .setCustomTitle(title)
+                .setSingleChoiceItems(adapter, -1, clickListener)
+                .create();
+    }
+
+    private void doShareFavoriteContacts() {
+        try{
+            final Cursor cursor = getActivity().getContentResolver().query(
+                    Contacts.CONTENT_STREQUENT_URI, LOOKUP_PROJECTION, null, null,
+                    Contacts.DISPLAY_NAME + " COLLATE NOCASE ASC");
+            if (cursor != null) {
+                try {
+                    if (!cursor.moveToFirst()) {
+                        Toast.makeText(getActivity(), R.string.no_contact_to_share,
+                                Toast.LENGTH_SHORT).show();
+                        return;
+                    }
+
+                    // Build multi-vcard Uri for sharing
+                    final StringBuilder uriListBuilder = new StringBuilder();
+                    int index = 0;
+                    do {
+                        if (index != 0)
+                            uriListBuilder.append(':');
+                        uriListBuilder.append(cursor.getString(0));
+                        index++;
+                    } while (cursor.moveToNext());
+                    final Uri uri = Uri.withAppendedPath(
+                            Contacts.CONTENT_MULTI_VCARD_URI,
+                            Uri.encode(uriListBuilder.toString()));
+
+                    final Intent intent = new Intent(Intent.ACTION_SEND);
+                    intent.setType(Contacts.CONTENT_VCARD_TYPE);
+                    intent.putExtra(Intent.EXTRA_STREAM, uri);
+                    ImplicitIntentsUtil.startActivityOutsideApp(getActivity(), intent);
+                } finally {
+                    cursor.close();
+                }
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "Sharing contacts failed", e);
+            getActivity().runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    Toast.makeText(getContext(), R.string.share_contacts_failure,
+                            Toast.LENGTH_SHORT).show();
+                }
+            });
+        }
+    }
+
+    private static class AdapterEntry {
+        public final CharSequence mLabel;
+        public final int mChoiceResourceId;
+        public final int mSubscriptionId;
+
+        public AdapterEntry(CharSequence label, int resId, int subId) {
+            mLabel = label;
+            mChoiceResourceId = resId;
+            mSubscriptionId = subId;
+        }
+
+        public AdapterEntry(String label, int resId) {
+            // Store a nonsense value for mSubscriptionId. If this constructor is used,
+            // the mSubscriptionId value should not be read later.
+            this(label, resId, /* subId = */ -1);
+        }
+    }
+}
diff --git a/src/com/android/contacts/common/interactions/ImportExportDialogFragment.java b/src/com/android/contacts/common/interactions/ImportDialogFragment.java
similarity index 65%
rename from src/com/android/contacts/common/interactions/ImportExportDialogFragment.java
rename to src/com/android/contacts/common/interactions/ImportDialogFragment.java
index 0df0812..0c0ce73 100644
--- a/src/com/android/contacts/common/interactions/ImportExportDialogFragment.java
+++ b/src/com/android/contacts/common/interactions/ImportDialogFragment.java
@@ -23,10 +23,7 @@
 import android.app.FragmentManager;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.Intent;
 import android.content.res.Resources;
-import android.database.Cursor;
-import android.net.Uri;
 import android.os.Bundle;
 import android.provider.ContactsContract.Contacts;
 import android.telephony.SubscriptionInfo;
@@ -39,7 +36,6 @@
 import android.view.ViewGroup;
 import android.widget.ArrayAdapter;
 import android.widget.TextView;
-import android.widget.Toast;
 
 import com.android.contacts.common.R;
 import com.android.contacts.common.compat.CompatUtils;
@@ -48,10 +44,7 @@
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.util.AccountSelectionUtil;
 import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
-import com.android.contacts.common.util.ImplicitIntentsUtil;
-import com.android.contacts.common.vcard.ExportVCardActivity;
 import com.android.contacts.common.vcard.VCardCommonArguments;
-import com.android.contacts.common.vcard.ShareVCardActivity;
 import com.android.contacts.editor.SelectAccountDialogFragment;
 
 import java.util.List;
@@ -59,19 +52,13 @@
 /**
  * An dialog invoked to import/export contacts.
  */
-public class ImportExportDialogFragment extends DialogFragment
+public class ImportDialogFragment extends DialogFragment
         implements SelectAccountDialogFragment.Listener {
-    public static final String TAG = "ImportExportDialogFragment";
-
-    public static final int EXPORT_MODE_FAVORITES = 0;
-    public static final int EXPORT_MODE_ALL_CONTACTS = 1;
-    public static final int EXPORT_MODE_DEFAULT = -1;
+    public static final String TAG = "ImportDialogFragment";
 
     private static final String KEY_RES_ID = "resourceId";
     private static final String KEY_SUBSCRIPTION_ID = "subscriptionId";
-    private static final String ARG_CONTACTS_ARE_AVAILABLE = "CONTACTS_ARE_AVAILABLE";
 
-    private static int mExportMode = EXPORT_MODE_DEFAULT;
 
     private final String[] LOOKUP_PROJECTION = new String[] {
             Contacts.LOOKUP_KEY
@@ -80,15 +67,12 @@
     private SubscriptionManager mSubscriptionManager;
 
     /** Preferred way to show this dialog */
-    public static void show(FragmentManager fragmentManager, boolean contactsAreAvailable,
-                            Class callingActivity, int exportMode) {
-        final ImportExportDialogFragment fragment = new ImportExportDialogFragment();
+    public static void show(FragmentManager fragmentManager, Class callingActivity) {
+        final ImportDialogFragment fragment = new ImportDialogFragment();
         Bundle args = new Bundle();
-        args.putBoolean(ARG_CONTACTS_ARE_AVAILABLE, contactsAreAvailable);
         args.putString(VCardCommonArguments.ARG_CALLING_ACTIVITY, callingActivity.getName());
         fragment.setArguments(args);
-        fragment.show(fragmentManager, ImportExportDialogFragment.TAG);
-        mExportMode = exportMode;
+        fragment.show(fragmentManager, TAG);
     }
 
     @Override
@@ -107,7 +91,6 @@
         final Resources res = getActivity().getResources();
         final LayoutInflater dialogInflater = (LayoutInflater)getActivity()
                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        final boolean contactsAreAvailable = getArguments().getBoolean(ARG_CONTACTS_ARE_AVAILABLE);
         final String callingActivity = getArguments().getString(
                 VCardCommonArguments.ARG_CALLING_ACTIVITY);
 
@@ -161,24 +144,6 @@
             }
         }
 
-        if (res.getBoolean(R.bool.config_allow_export)) {
-            if (contactsAreAvailable) {
-                adapter.add(new AdapterEntry(getString(R.string.export_to_vcf_file),
-                        R.string.export_to_vcf_file));
-            }
-        }
-        if (res.getBoolean(R.bool.config_allow_share_contacts) && contactsAreAvailable) {
-            if (mExportMode == EXPORT_MODE_FAVORITES) {
-                // share favorite and frequently contacted contacts from Favorites tab
-                adapter.add(new AdapterEntry(getString(R.string.share_favorite_contacts),
-                        R.string.share_contacts));
-            } else {
-                // share "all" contacts (in groups selected in "Customize") from All tab for now
-                // TODO: change the string to share_visible_contacts if implemented
-                adapter.add(new AdapterEntry(getString(R.string.share_contacts),
-                        R.string.share_contacts));
-            }
-        }
 
         final DialogInterface.OnClickListener clickListener =
                 new DialogInterface.OnClickListener() {
@@ -189,24 +154,6 @@
                 if (resId == R.string.import_from_sim || resId == R.string.import_from_vcf_file) {
                         dismissDialog = handleImportRequest(resId,
                                 adapter.getItem(which).mSubscriptionId);
-                } else if (resId == R.string.export_to_vcf_file) {
-                    dismissDialog = true;
-                    final Intent exportIntent = new Intent(
-                            getActivity(), ExportVCardActivity.class);
-                    exportIntent.putExtra(VCardCommonArguments.ARG_CALLING_ACTIVITY,
-                            callingActivity);
-                    getActivity().startActivity(exportIntent);
-                } else if (resId == R.string.share_contacts) {
-                    dismissDialog = true;
-                    if (mExportMode == EXPORT_MODE_FAVORITES) {
-                        doShareFavoriteContacts();
-                    } else { // EXPORT_MODE_ALL_CONTACTS
-                        final Intent exportIntent = new Intent(
-                                getActivity(), ShareVCardActivity.class);
-                        exportIntent.putExtra(VCardCommonArguments.ARG_CALLING_ACTIVITY,
-                                callingActivity);
-                        getActivity().startActivity(exportIntent);
-                    }
                 } else {
                     dismissDialog = true;
                     Log.e(TAG, "Unexpected resource: "
@@ -218,61 +165,13 @@
             }
         };
         final TextView title = (TextView) View.inflate(getActivity(), R.layout.dialog_title, null);
-        title.setText(contactsAreAvailable
-                ? R.string.dialog_import_export
-                : R.string.dialog_import);
+        title.setText(R.string.dialog_import);
         return new AlertDialog.Builder(getActivity())
                 .setCustomTitle(title)
                 .setSingleChoiceItems(adapter, -1, clickListener)
                 .create();
     }
 
-    private void doShareFavoriteContacts() {
-        try{
-            final Cursor cursor = getActivity().getContentResolver().query(
-                    Contacts.CONTENT_STREQUENT_URI, LOOKUP_PROJECTION, null, null,
-                    Contacts.DISPLAY_NAME + " COLLATE NOCASE ASC");
-            if (cursor != null) {
-                try {
-                    if (!cursor.moveToFirst()) {
-                        Toast.makeText(getActivity(), R.string.no_contact_to_share,
-                                Toast.LENGTH_SHORT).show();
-                        return;
-                    }
-
-                    // Build multi-vcard Uri for sharing
-                    final StringBuilder uriListBuilder = new StringBuilder();
-                    int index = 0;
-                    do {
-                        if (index != 0)
-                            uriListBuilder.append(':');
-                        uriListBuilder.append(cursor.getString(0));
-                        index++;
-                    } while (cursor.moveToNext());
-                    final Uri uri = Uri.withAppendedPath(
-                            Contacts.CONTENT_MULTI_VCARD_URI,
-                            Uri.encode(uriListBuilder.toString()));
-
-                    final Intent intent = new Intent(Intent.ACTION_SEND);
-                    intent.setType(Contacts.CONTENT_VCARD_TYPE);
-                    intent.putExtra(Intent.EXTRA_STREAM, uri);
-                    ImplicitIntentsUtil.startActivityOutsideApp(getActivity(), intent);
-                } finally {
-                    cursor.close();
-                }
-            }
-        } catch (Exception e) {
-            Log.e(TAG, "Sharing contacts failed", e);
-            getActivity().runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    Toast.makeText(getContext(), R.string.share_contacts_failure,
-                            Toast.LENGTH_SHORT).show();
-                }
-            });
-        }
-    }
-
     /**
      * Handle "import from SIM" and "import from SD".
      *
diff --git a/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java b/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java
index 6593619..3bbdbb1 100644
--- a/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java
+++ b/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java
@@ -39,7 +39,8 @@
 import com.android.contacts.common.R;
 import com.android.contacts.common.compat.TelecomManagerUtil;
 import com.android.contacts.common.compat.TelephonyManagerCompat;
-import com.android.contacts.common.interactions.ImportExportDialogFragment;
+import com.android.contacts.common.interactions.ImportDialogFragment;
+import com.android.contacts.common.interactions.ExportDialogFragment;
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.list.ContactListFilterController;
 import com.android.contacts.common.logging.ScreenEvent.ScreenType;
@@ -70,7 +71,8 @@
     private static final String KEY_BLOCKED_NUMBERS = "blockedNumbers";
     private static final String KEY_DISPLAY_ORDER = "displayOrder";
     private static final String KEY_CUSTOM_CONTACTS_FILTER = "customContactsFilter";
-    private static final String KEY_IMPORT_EXPORT = "importExport";
+    private static final String KEY_IMPORT = "import";
+    private static final String KEY_EXPORT = "export";
     private static final String KEY_MY_INFO = "myInfo";
     private static final String KEY_SORT_ORDER = "sortOrder";
 
@@ -175,22 +177,27 @@
         // Load the preferences from an XML resource
         addPreferencesFromResource(R.xml.preference_display_options);
 
-        removeUnsupportedPreferences();
-        addExtraPreferences();
-
         final Bundle args = getArguments();
         mNewLocalProfileExtra = args.getString(ARG_NEW_LOCAL_PROFILE);
         mPreviousScreenExtra = args.getString(ARG_PREVIOUS_SCREEN);
         mModeFullyExpanded = args.getInt(ARG_MODE_FULLY_EXPANDED);
         mAreContactsAvailable = args.getBoolean(ARG_CONTACTS_AVAILABLE);
 
+        removeUnsupportedPreferences();
+        addExtraPreferences();
+
         mMyInfoPreference = findPreference(KEY_MY_INFO);
 
         final Preference accountsPreference = findPreference(KEY_ACCOUNTS);
         accountsPreference.setOnPreferenceClickListener(this);
 
-        final Preference importExportPreference = findPreference(KEY_IMPORT_EXPORT);
-        importExportPreference.setOnPreferenceClickListener(this);
+        final Preference importPreference = findPreference(KEY_IMPORT);
+        importPreference.setOnPreferenceClickListener(this);
+
+        final Preference exportPreference = findPreference(KEY_EXPORT);
+        if (exportPreference != null) {
+            exportPreference.setOnPreferenceClickListener(this);
+        }
 
         final Preference blockedNumbersPreference = findPreference(KEY_BLOCKED_NUMBERS);
         if (blockedNumbersPreference != null) {
@@ -248,6 +255,10 @@
         if (!showBlockedNumbers) {
             getPreferenceScreen().removePreference(findPreference(KEY_BLOCKED_NUMBERS));
         }
+
+        if (!mAreContactsAvailable) {
+            getPreferenceScreen().removePreference(findPreference(KEY_EXPORT));
+        }
     }
 
     private void addExtraPreferences() {
@@ -294,12 +305,14 @@
         if (KEY_ABOUT.equals(prefKey)) {
             ((ContactsPreferenceActivity) getActivity()).showAboutFragment();
             return true;
-        } else if (KEY_IMPORT_EXPORT.equals(prefKey)) {
-            ImportExportDialogFragment.show(getFragmentManager(), mAreContactsAvailable,
-                    ContactsPreferenceActivity.class,
-                    ImportExportDialogFragment.EXPORT_MODE_ALL_CONTACTS);
+        } else if (KEY_IMPORT.equals(prefKey)) {
+            ImportDialogFragment.show(getFragmentManager(), ContactsPreferenceActivity.class);
             return true;
-        } else if (KEY_MY_INFO.equals(prefKey)) {
+        } else if (KEY_EXPORT.equals(prefKey)) {
+            ExportDialogFragment.show(getFragmentManager(), ContactsPreferenceActivity.class,
+                    ExportDialogFragment.EXPORT_MODE_ALL_CONTACTS);
+            return true;
+        }else if (KEY_MY_INFO.equals(prefKey)) {
             final Intent intent;
             if (mHasProfile) {
                 final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, mProfileContactId);
diff --git a/src/com/android/contacts/list/ContactsUnavailableFragment.java b/src/com/android/contacts/list/ContactsUnavailableFragment.java
index c567dd2..488463d 100644
--- a/src/com/android/contacts/list/ContactsUnavailableFragment.java
+++ b/src/com/android/contacts/list/ContactsUnavailableFragment.java
@@ -36,7 +36,7 @@
 
 import com.android.contacts.R;
 import com.android.contacts.common.compat.ProviderStatusCompat;
-import com.android.contacts.common.interactions.ImportExportDialogFragment;
+import com.android.contacts.common.interactions.ImportDialogFragment;
 import com.android.contacts.common.util.ImplicitIntentsUtil;
 
 /**
@@ -146,9 +146,7 @@
                 ImplicitIntentsUtil.startActivityOutsideApp(getActivity(), intent);
                 break;
             case R.id.import_contacts_button:
-                ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(),
-                        getActivity().getClass(),
-                        ImportExportDialogFragment.EXPORT_MODE_ALL_CONTACTS);
+                ImportDialogFragment.show(getFragmentManager(), getActivity().getClass());
                 break;
         }
     }