diff options
author | blong <blong@codeaurora.org> | 2014-09-25 11:08:23 +0800 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2015-03-22 15:01:36 -0700 |
commit | 175dc02d5b4b22c5f049ea50c7d7c23eaa3a8188 (patch) | |
tree | 2064e083a87581f5389ba21ae7d718a465c0b33d | |
parent | 9f6296cc38ff929c05626969d6a08d75fca9be9b (diff) | |
download | android_packages_apps_ContactsCommon-175dc02d5b4b22c5f049ea50c7d7c23eaa3a8188.tar.gz android_packages_apps_ContactsCommon-175dc02d5b4b22c5f049ea50c7d7c23eaa3a8188.tar.bz2 android_packages_apps_ContactsCommon-175dc02d5b4b22c5f049ea50c7d7c23eaa3a8188.zip |
Support import/export vCard from both internal/external storage
- when import/export vCard file, if both internal and external
storage are avaliable, it will pops up a dialog to let user
select witch storage will be used.
Change-Id: Ie56f7d58cf409ff1db8075a1b283aabdbdb158cb
-rw-r--r-- | res/values-zh-rCN/strings.xml | 1 | ||||
-rw-r--r-- | res/values/strings.xml | 2 | ||||
-rw-r--r-- | src/com/android/contacts/common/MoreContactUtils.java | 30 | ||||
-rw-r--r-- | src/com/android/contacts/common/vcard/ExportVCardActivity.java | 86 | ||||
-rw-r--r-- | src/com/android/contacts/common/vcard/ImportVCardActivity.java | 47 | ||||
-rw-r--r-- | src/com/android/contacts/common/vcard/VCardService.java | 14 |
6 files changed, 162 insertions, 18 deletions
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 2c0b3bb6..24f19901 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -271,6 +271,7 @@ <string name="copy_done">复制成功!</string> <string name="copy_failure">复制失败!</string> <string name="card_no_space">卡记录已满,部分信息未复制</string> + <string name="select_path">请选择路径</string> <string name="description_clear_search" msgid="3893511425518852086">"清除搜索内容"</string> <string name="settings_contact_display_options_title" msgid="1020420603072835628">"联系人显示选项"</string> </resources> diff --git a/res/values/strings.xml b/res/values/strings.xml index 4dc69c3e..e2e76443 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -830,6 +830,6 @@ a ren't members of any other group. [CHAR LIMIT=25] --> <string name="ipcall_dialog_edit_hint">Please input the IP prefix</string> <string name="Import_All">Import Contacts From All SIMs</string> - + <string name="select_path">Select Path</string> <string name="select_sim">Select SIM</string> </resources> diff --git a/src/com/android/contacts/common/MoreContactUtils.java b/src/com/android/contacts/common/MoreContactUtils.java index 4d43a87c..6e55ca9b 100644 --- a/src/com/android/contacts/common/MoreContactUtils.java +++ b/src/com/android/contacts/common/MoreContactUtils.java @@ -43,6 +43,10 @@ import android.net.Uri; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.storage.StorageManager; +import android.os.storage.StorageVolume; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Phone; @@ -318,6 +322,32 @@ public class MoreContactUtils { return resources.getBoolean(R.bool.config_show_operator); } + public static boolean sdCardExist(Context context) { + boolean ret = false; + StorageManager mStorageManager = (StorageManager) context + .getSystemService(Context.STORAGE_SERVICE); + if (mStorageManager.getVolumeState(getSDPath(context)).equals( + android.os.Environment.MEDIA_MOUNTED)) { + ret = true; + } + return ret; + } + + public static String getSDPath(Context context) { + String sd = null; + StorageManager mStorageManager = (StorageManager) context + .getSystemService(Context.STORAGE_SERVICE); + StorageVolume[] volumes = mStorageManager.getVolumeList(); + for (int i = 0; i < volumes.length; i++) { + if (volumes[i].isRemovable() && volumes[i].allowMassStorage() + && !volumes[i].isPrimary() + && volumes[i].getDescription(context).contains("SD")) { + sd = volumes[i].getPath(); + } + } + return sd; + } + public static boolean isAPMOnAndSIMPowerDown(Context context) { if (context == null) { return false; diff --git a/src/com/android/contacts/common/vcard/ExportVCardActivity.java b/src/com/android/contacts/common/vcard/ExportVCardActivity.java index 6310082e..625412e8 100644 --- a/src/com/android/contacts/common/vcard/ExportVCardActivity.java +++ b/src/com/android/contacts/common/vcard/ExportVCardActivity.java @@ -33,6 +33,7 @@ import android.os.Messenger; import android.text.TextUtils; import android.util.Log; +import com.android.contacts.common.MoreContactUtils; import com.android.contacts.common.R; import java.io.File; @@ -119,6 +120,8 @@ public class ExportVCardActivity extends Activity implements ServiceConnection, // String for storing error reason temporarily. private String mErrorReason; + private int mSelectedStorage = VCardService.INTERNAL_PATH; + private class ExportConfirmationListener implements DialogInterface.OnClickListener { private final Uri mDestinationUri; @@ -150,27 +153,15 @@ public class ExportVCardActivity extends Activity implements ServiceConnection, protected void onCreate(Bundle bundle) { super.onCreate(bundle); - // Check directory is available. - if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - Log.w(LOG_TAG, "External storage is in state " + Environment.getExternalStorageState() + - ". Cancelling export"); - showDialog(R.id.dialog_sdcard_not_found); - return; - } - - final File targetDirectory = Environment.getExternalStorageDirectory(); - if (!(targetDirectory.exists() && - targetDirectory.isDirectory() && - targetDirectory.canRead()) && - !targetDirectory.mkdirs()) { - showDialog(R.id.dialog_sdcard_not_found); - return; - } + checkStorage(); + } + private void runExportContacts() { final String callingActivity = getIntent().getExtras() .getString(VCardCommonArguments.ARG_CALLING_ACTIVITY); Intent intent = new Intent(this, VCardService.class); intent.putExtra(VCardCommonArguments.ARG_CALLING_ACTIVITY, callingActivity); + intent.putExtra(VCardService.STORAGE_PATH, mSelectedStorage); if (startService(intent) == null) { Log.e(LOG_TAG, "Failed to start vCard service"); @@ -191,6 +182,69 @@ public class ExportVCardActivity extends Activity implements ServiceConnection, } } + private void checkStorage() { + boolean sdExist = MoreContactUtils.sdCardExist(this); + boolean inExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); + if (sdExist && inExist) { + CharSequence[] storage_list = new CharSequence[2]; + storage_list[VCardService.INTERNAL_PATH] = Environment.getExternalStorageDirectory() + .getPath(); + storage_list[VCardService.EXTERNAL_PATH] = MoreContactUtils.getSDPath(this); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.select_path); + builder.setSingleChoiceItems(storage_list, 0, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Log.d(LOG_TAG, "onClicked Dialog on which = " + which); + mSelectedStorage = which; + } + }); + + AlertDialog dialog = builder.create(); + dialog.setButton(DialogInterface.BUTTON_POSITIVE, getString(android.R.string.ok), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + runExportContacts(); + } + }); + dialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(android.R.string.cancel), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + mSelectedStorage = VCardService.INVALID_PATH; + } + }); + dialog.show(); + } else if (inExist) { + mSelectedStorage = VCardService.INTERNAL_PATH; + + // Check directory is available. + if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + Log.w(LOG_TAG, "External storage is in state " + + Environment.getExternalStorageState() + ". Cancelling export"); + showDialog(R.id.dialog_sdcard_not_found); + return; + } + + final File targetDirectory = Environment.getExternalStorageDirectory(); + if (!(targetDirectory.exists() && + targetDirectory.isDirectory() && + targetDirectory.canRead()) && + !targetDirectory.mkdirs()) { + showDialog(R.id.dialog_sdcard_not_found); + return; + } + + runExportContacts(); + } else if (sdExist) { + mSelectedStorage = VCardService.EXTERNAL_PATH; + runExportContacts(); + } else { + mSelectedStorage = VCardService.INVALID_PATH; + } + } + @Override public synchronized void onServiceConnected(ComponentName name, IBinder binder) { if (DEBUG) Log.d(LOG_TAG, "connected to service, requesting a destination file name"); diff --git a/src/com/android/contacts/common/vcard/ImportVCardActivity.java b/src/com/android/contacts/common/vcard/ImportVCardActivity.java index 70c98215..ecd74df6 100644 --- a/src/com/android/contacts/common/vcard/ImportVCardActivity.java +++ b/src/com/android/contacts/common/vcard/ImportVCardActivity.java @@ -45,6 +45,7 @@ import android.text.style.RelativeSizeSpan; import android.util.Log; import android.widget.Toast; +import com.android.contacts.common.MoreContactUtils; import com.android.contacts.common.R; import com.android.contacts.common.model.AccountTypeManager; import com.android.contacts.common.model.account.AccountWithDataSet; @@ -124,6 +125,7 @@ public class ImportVCardActivity extends Activity { /* package */ VCardImportExportListener mListener; private String mErrorMessage; + private int mSelectedStorage = VCardService.INTERNAL_PATH; private Handler mHandler = new Handler(); @@ -884,7 +886,52 @@ public class ImportVCardActivity extends Activity { importVCard(uri); } else { Log.i(LOG_TAG, "Start vCard without Uri. The user will select vCard manually."); + checkStorage(); + } + } + + private void checkStorage() { + boolean sdExist = MoreContactUtils.sdCardExist(this); + boolean inExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); + if (sdExist && inExist) { + CharSequence[] storage_list = new CharSequence[2]; + storage_list[VCardService.INTERNAL_PATH] = Environment.getExternalStorageDirectory() + .getPath(); + storage_list[VCardService.EXTERNAL_PATH] = MoreContactUtils.getSDPath(this); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.select_path); + builder.setSingleChoiceItems(storage_list, 0, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Log.d(LOG_TAG, "onClicked Dialog on which = " + which); + mSelectedStorage = which; + } + }); + + AlertDialog dialog = builder.create(); + dialog.setButton(DialogInterface.BUTTON_POSITIVE, getString(android.R.string.ok), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + doScanExternalStorageAndImportVCard(); + } + }); + dialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(android.R.string.cancel), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + mSelectedStorage = VCardService.INVALID_PATH; + } + }); + dialog.show(); + } else if (inExist) { + mSelectedStorage = VCardService.INTERNAL_PATH; doScanExternalStorageAndImportVCard(); + } else if (sdExist) { + mSelectedStorage = VCardService.EXTERNAL_PATH; + doScanExternalStorageAndImportVCard(); + } else { + mSelectedStorage = VCardService.INVALID_PATH; } } diff --git a/src/com/android/contacts/common/vcard/VCardService.java b/src/com/android/contacts/common/vcard/VCardService.java index dd5ea098..14a86656 100644 --- a/src/com/android/contacts/common/vcard/VCardService.java +++ b/src/com/android/contacts/common/vcard/VCardService.java @@ -31,6 +31,7 @@ import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; +import com.android.contacts.common.MoreContactUtils; import com.android.contacts.common.R; import java.io.File; @@ -54,6 +55,10 @@ import java.util.concurrent.RejectedExecutionException; public class VCardService extends Service { private final static String LOG_TAG = "VCardService"; + public final static int INTERNAL_PATH = 0; + public final static int EXTERNAL_PATH = 1; + public final static int INVALID_PATH = -1; + public final static String STORAGE_PATH = "storage"; /* package */ final static boolean DEBUG = false; /* package */ static final int MSG_IMPORT_REQUEST = 1; @@ -71,6 +76,7 @@ public class VCardService extends Service { /* package */ static final String CACHE_FILE_PREFIX = "import_tmp_"; private String selExport = ""; + private int mStorage = INTERNAL_PATH; private class CustomMediaScannerConnectionClient implements MediaScannerConnectionClient { final MediaScannerConnection mConnection; @@ -149,7 +155,11 @@ public class VCardService extends Service { } private void initExporterParams() { - mTargetDirectory = Environment.getExternalStorageDirectory(); + if (mStorage == EXTERNAL_PATH) { + mTargetDirectory = new File(MoreContactUtils.getSDPath(this)); + } else { + mTargetDirectory = Environment.getExternalStorageDirectory(); + } mFileNamePrefix = getString(R.string.config_export_file_prefix); mFileNameSuffix = getString(R.string.config_export_file_suffix); mFileNameExtension = getString(R.string.config_export_file_extension); @@ -178,9 +188,11 @@ public class VCardService extends Service { if (intent != null && intent.getExtras() != null) { mCallingActivity = intent.getExtras().getString( VCardCommonArguments.ARG_CALLING_ACTIVITY); + mStorage = intent.getExtras().getInt(STORAGE_PATH); } else { mCallingActivity = null; } + initExporterParams(); return START_STICKY; } |