Loading res/values/strings.xml +6 −3 Original line number Diff line number Diff line Loading @@ -1595,7 +1595,7 @@ <string name="share_contacts_failure">Failed to share contacts.</string> <!-- Dialog title when selecting the bulk operation to perform from a list. [CHAR LIMIT=36] --> <string name="dialog_import_export">Import/export contacts</string> <string name="dialog_export">Export contacts</string> <!-- Dialog title when importing contacts from an external source. [CHAR LIMIT=36] --> <string name="dialog_import">Import contacts</string> Loading Loading @@ -1644,8 +1644,11 @@ <!-- The menu item to open the list of accounts. [CHAR LIMIT=60]--> <string name="menu_accounts">Manage accounts</string> <!-- The menu item to bulk import or bulk export contacts from SIM card or SD card. [CHAR LIMIT=30]--> <string name="menu_import_export">Import/export</string> <!-- The menu item to bulk import contacts from SIM card or SD card. [CHAR LIMIT=30]--> <string name="menu_import">Import</string> <!-- The menu item to bulk export contacts from SIM card or SD card. [CHAR LIMIT=30]--> <string name="menu_export">Export</string> <!-- The menu item to open blocked numbers activity [CHAR LIMIT=60]--> <string name="menu_blocked_numbers">Blocked numbers</string> Loading res/xml/preference_display_options.xml +7 −2 Original line number Diff line number Diff line Loading @@ -51,8 +51,13 @@ <Preference android:icon="@null" android:key="importExport" android:title="@string/menu_import_export"/> android:key="import" android:title="@string/menu_import"/> <Preference android:icon="@null" android:key="export" android:title="@string/menu_export"/> <Preference android:icon="@null" Loading src/com/android/contacts/common/interactions/ExportDialogFragment.java 0 → 100644 +230 −0 Original line number Diff line number Diff line /* * 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); } } } src/com/android/contacts/common/interactions/ImportExportDialogFragment.java→src/com/android/contacts/common/interactions/ImportDialogFragment.java +6 −107 Original line number Diff line number Diff line Loading @@ -23,10 +23,7 @@ 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.SubscriptionInfo; Loading @@ -39,7 +36,6 @@ 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.compat.CompatUtils; Loading @@ -48,10 +44,7 @@ import com.android.contacts.common.model.AccountTypeManager; 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; Loading @@ -59,19 +52,13 @@ import java.util.List; /** * 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 Loading @@ -80,15 +67,12 @@ public class ImportExportDialogFragment extends DialogFragment 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 Loading @@ -107,7 +91,6 @@ public class ImportExportDialogFragment extends DialogFragment 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); Loading Loading @@ -161,24 +144,6 @@ public class ImportExportDialogFragment extends DialogFragment } } 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() { Loading @@ -189,24 +154,6 @@ public class ImportExportDialogFragment extends DialogFragment 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: " Loading @@ -218,61 +165,13 @@ public class ImportExportDialogFragment extends DialogFragment } }; 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". * Loading src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java +25 −12 Original line number Diff line number Diff line Loading @@ -39,7 +39,8 @@ import com.android.contacts.common.ContactsUtils; 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; Loading Loading @@ -70,7 +71,8 @@ public class DisplayOptionsPreferenceFragment extends PreferenceFragment 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"; Loading Loading @@ -175,22 +177,27 @@ public class DisplayOptionsPreferenceFragment extends PreferenceFragment // 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) { Loading Loading @@ -248,6 +255,10 @@ public class DisplayOptionsPreferenceFragment extends PreferenceFragment if (!showBlockedNumbers) { getPreferenceScreen().removePreference(findPreference(KEY_BLOCKED_NUMBERS)); } if (!mAreContactsAvailable) { getPreferenceScreen().removePreference(findPreference(KEY_EXPORT)); } } private void addExtraPreferences() { Loading Loading @@ -294,10 +305,12 @@ public class DisplayOptionsPreferenceFragment extends PreferenceFragment 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_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; Loading Loading
res/values/strings.xml +6 −3 Original line number Diff line number Diff line Loading @@ -1595,7 +1595,7 @@ <string name="share_contacts_failure">Failed to share contacts.</string> <!-- Dialog title when selecting the bulk operation to perform from a list. [CHAR LIMIT=36] --> <string name="dialog_import_export">Import/export contacts</string> <string name="dialog_export">Export contacts</string> <!-- Dialog title when importing contacts from an external source. [CHAR LIMIT=36] --> <string name="dialog_import">Import contacts</string> Loading Loading @@ -1644,8 +1644,11 @@ <!-- The menu item to open the list of accounts. [CHAR LIMIT=60]--> <string name="menu_accounts">Manage accounts</string> <!-- The menu item to bulk import or bulk export contacts from SIM card or SD card. [CHAR LIMIT=30]--> <string name="menu_import_export">Import/export</string> <!-- The menu item to bulk import contacts from SIM card or SD card. [CHAR LIMIT=30]--> <string name="menu_import">Import</string> <!-- The menu item to bulk export contacts from SIM card or SD card. [CHAR LIMIT=30]--> <string name="menu_export">Export</string> <!-- The menu item to open blocked numbers activity [CHAR LIMIT=60]--> <string name="menu_blocked_numbers">Blocked numbers</string> Loading
res/xml/preference_display_options.xml +7 −2 Original line number Diff line number Diff line Loading @@ -51,8 +51,13 @@ <Preference android:icon="@null" android:key="importExport" android:title="@string/menu_import_export"/> android:key="import" android:title="@string/menu_import"/> <Preference android:icon="@null" android:key="export" android:title="@string/menu_export"/> <Preference android:icon="@null" Loading
src/com/android/contacts/common/interactions/ExportDialogFragment.java 0 → 100644 +230 −0 Original line number Diff line number Diff line /* * 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); } } }
src/com/android/contacts/common/interactions/ImportExportDialogFragment.java→src/com/android/contacts/common/interactions/ImportDialogFragment.java +6 −107 Original line number Diff line number Diff line Loading @@ -23,10 +23,7 @@ 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.SubscriptionInfo; Loading @@ -39,7 +36,6 @@ 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.compat.CompatUtils; Loading @@ -48,10 +44,7 @@ import com.android.contacts.common.model.AccountTypeManager; 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; Loading @@ -59,19 +52,13 @@ import java.util.List; /** * 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 Loading @@ -80,15 +67,12 @@ public class ImportExportDialogFragment extends DialogFragment 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 Loading @@ -107,7 +91,6 @@ public class ImportExportDialogFragment extends DialogFragment 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); Loading Loading @@ -161,24 +144,6 @@ public class ImportExportDialogFragment extends DialogFragment } } 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() { Loading @@ -189,24 +154,6 @@ public class ImportExportDialogFragment extends DialogFragment 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: " Loading @@ -218,61 +165,13 @@ public class ImportExportDialogFragment extends DialogFragment } }; 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". * Loading
src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java +25 −12 Original line number Diff line number Diff line Loading @@ -39,7 +39,8 @@ import com.android.contacts.common.ContactsUtils; 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; Loading Loading @@ -70,7 +71,8 @@ public class DisplayOptionsPreferenceFragment extends PreferenceFragment 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"; Loading Loading @@ -175,22 +177,27 @@ public class DisplayOptionsPreferenceFragment extends PreferenceFragment // 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) { Loading Loading @@ -248,6 +255,10 @@ public class DisplayOptionsPreferenceFragment extends PreferenceFragment if (!showBlockedNumbers) { getPreferenceScreen().removePreference(findPreference(KEY_BLOCKED_NUMBERS)); } if (!mAreContactsAvailable) { getPreferenceScreen().removePreference(findPreference(KEY_EXPORT)); } } private void addExtraPreferences() { Loading Loading @@ -294,10 +305,12 @@ public class DisplayOptionsPreferenceFragment extends PreferenceFragment 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_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; Loading