summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorblong <blong@codeaurora.org>2014-09-25 11:08:23 +0800
committerSteve Kondik <steve@cyngn.com>2015-03-22 15:01:36 -0700
commit175dc02d5b4b22c5f049ea50c7d7c23eaa3a8188 (patch)
tree2064e083a87581f5389ba21ae7d718a465c0b33d
parent9f6296cc38ff929c05626969d6a08d75fca9be9b (diff)
downloadandroid_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.xml1
-rw-r--r--res/values/strings.xml2
-rw-r--r--src/com/android/contacts/common/MoreContactUtils.java30
-rw-r--r--src/com/android/contacts/common/vcard/ExportVCardActivity.java86
-rw-r--r--src/com/android/contacts/common/vcard/ImportVCardActivity.java47
-rw-r--r--src/com/android/contacts/common/vcard/VCardService.java14
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;
}