Merge "Use correct external storage directory" into jb-mr1-dev
diff --git a/res/values/donottranslate_config.xml b/res/values/donottranslate_config.xml
index dd94097..2110a8b 100644
--- a/res/values/donottranslate_config.xml
+++ b/res/values/donottranslate_config.xml
@@ -55,9 +55,6 @@
     specific to some vendor (like DoCoMo), specify this type (e.g. "docomo") -->
     <string name="config_export_vcard_type" translatable="false">default</string>
 
-    <!-- Directory in which exported VCard file is stored -->
-    <string name="config_export_dir" translatable="false">/mnt/sdcard</string>
-
     <!-- Prefix of exported VCard file -->
     <string name="config_export_file_prefix" translatable="false"></string>
 
diff --git a/src/com/android/contacts/vcard/ExportVCardActivity.java b/src/com/android/contacts/vcard/ExportVCardActivity.java
index ac0850f..6bed577 100644
--- a/src/com/android/contacts/vcard/ExportVCardActivity.java
+++ b/src/com/android/contacts/vcard/ExportVCardActivity.java
@@ -25,6 +25,7 @@
 import android.content.ServiceConnection;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.Environment;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
@@ -148,7 +149,14 @@
         super.onCreate(bundle);
 
         // Check directory is available.
-        final File targetDirectory = new File(getString(R.string.config_export_dir));
+        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()) &&
diff --git a/src/com/android/contacts/vcard/VCardService.java b/src/com/android/contacts/vcard/VCardService.java
index 4ef1bcb..74ce69c 100644
--- a/src/com/android/contacts/vcard/VCardService.java
+++ b/src/com/android/contacts/vcard/VCardService.java
@@ -22,6 +22,7 @@
 import android.media.MediaScannerConnection.MediaScannerConnectionClient;
 import android.net.Uri;
 import android.os.Binder;
+import android.os.Environment;
 import android.os.IBinder;
 import android.os.Message;
 import android.os.Messenger;
@@ -117,7 +118,7 @@
     // If true, VCardExporter is able to emits files longer than 8.3 format.
     private static final boolean ALLOW_LONG_FILE_NAME = false;
 
-    private String mTargetDirectory;
+    private File mTargetDirectory;
     private String mFileNamePrefix;
     private String mFileNameSuffix;
     private int mFileIndexMinimum;
@@ -146,7 +147,7 @@
     }
 
     private void initExporterParams() {
-        mTargetDirectory = getString(R.string.config_export_dir);
+        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);
@@ -453,7 +454,7 @@
      * @return destination path for a vCard file to be exported. null on error and mErrorReason
      * is correctly set.
      */
-    private String getAppropriateDestination(final String destDirectory) {
+    private String getAppropriateDestination(final File destDirectory) {
         /*
          * Here, file names have 5 parts: directory, prefix, index, suffix, and extension.
          * e.g. "/mnt/sdcard/prfx00001sfx.vcf" -> "/mnt/sdcard", "prfx", "00001", "sfx", and ".vcf"
@@ -498,28 +499,30 @@
 
         for (int i = mFileIndexMinimum; i <= mFileIndexMaximum; i++) {
             boolean numberIsAvailable = true;
-            String body = null;
+            final String body = String.format(bodyFormat, mFileNamePrefix, i, mFileNameSuffix);
+            // Make sure that none of the extensions of mExtensionsToConsider matches. If this
+            // number is free, we'll go ahead with mFileNameExtension (which is included in
+            // mExtensionsToConsider)
             for (String possibleExtension : mExtensionsToConsider) {
-                body = String.format(bodyFormat, mFileNamePrefix, i, mFileNameSuffix);
-                final String path =
-                        String.format("%s/%s.%s", destDirectory, body, possibleExtension);
+                final File file = new File(destDirectory, body + "." + possibleExtension);
+                final String path = file.getAbsolutePath();
                 synchronized (this) {
+                    // Is this being exported right now? Skip this number
                     if (mReservedDestination.contains(path)) {
                         if (DEBUG) {
-                            Log.d(LOG_TAG, String.format("The path %s is reserved.", path));
+                            Log.d(LOG_TAG, String.format("%s is already being exported.", path));
                         }
                         numberIsAvailable = false;
                         break;
                     }
                 }
-                final File file = new File(path);
                 if (file.exists()) {
                     numberIsAvailable = false;
                     break;
                 }
             }
             if (numberIsAvailable) {
-                return String.format("%s/%s.%s", destDirectory, body, mFileNameExtension);
+                return new File(destDirectory, body + "." + mFileNameExtension).getAbsolutePath();
             }
         }