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