Merge "Protect CallUtil methods with permission check" into ub-contactsdialer-a-dev
diff --git a/src/com/android/contacts/common/vcard/ImportVCardActivity.java b/src/com/android/contacts/common/vcard/ImportVCardActivity.java
index 010f752..692e53b 100644
--- a/src/com/android/contacts/common/vcard/ImportVCardActivity.java
+++ b/src/com/android/contacts/common/vcard/ImportVCardActivity.java
@@ -93,6 +93,9 @@
     private static final String LOCAL_TMP_FILE_NAME_EXTRA =
             "com.android.contacts.common.vcard.LOCAL_TMP_FILE_NAME";
 
+    private static final String SOURCE_URI_DISPLAY_NAME =
+            "com.android.contacts.common.vcard.SOURCE_URI_DISPLAY_NAME";
+
     private AccountWithDataSet mAccount;
 
     private ProgressDialog mProgressDialogForCachingVCard;
@@ -174,11 +177,13 @@
         private PowerManager.WakeLock mWakeLock;
         private VCardParser mVCardParser;
         private final Uri[] mSourceUris;  // Given from a caller.
+        private final String[] mSourceDisplayNames; // Display names for each Uri in mSourceUris.
         private final byte[] mSource;
         private final String mDisplayName;
 
-        public VCardCacheThread(final Uri[] sourceUris) {
+        public VCardCacheThread(final Uri[] sourceUris, String[] sourceDisplayNames) {
             mSourceUris = sourceUris;
+            mSourceDisplayNames = sourceDisplayNames;
             mSource = null;
             final Context context = ImportVCardActivity.this;
             final PowerManager powerManager =
@@ -232,44 +237,18 @@
                         return;
                     }
                 } else {
-                    final ContentResolver resolver =
-                            ImportVCardActivity.this.getContentResolver();
+                    int i = 0;
                     for (Uri sourceUri : mSourceUris) {
                         if (mCanceled) {
                             Log.i(LOG_TAG, "vCard cache operation is canceled.");
                             break;
                         }
 
-                        String displayName = null;
-                        Cursor cursor = null;
-                        // Try to get a display name from the given Uri. If it fails, we just
-                        // pick up the last part of the Uri.
-                        try {
-                            cursor = resolver.query(sourceUri,
-                                    new String[] { OpenableColumns.DISPLAY_NAME },
-                                    null, null, null);
-                            if (cursor != null && cursor.getCount() > 0 && cursor.moveToFirst()) {
-                                if (cursor.getCount() > 1) {
-                                    Log.w(LOG_TAG, "Unexpected multiple rows: "
-                                            + cursor.getCount());
-                                }
-                                int index = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
-                                if (index >= 0) {
-                                    displayName = cursor.getString(index);
-                                }
-                            }
-                        } finally {
-                            if (cursor != null) {
-                                cursor.close();
-                            }
-                        }
-                        if (TextUtils.isEmpty(displayName)){
-                            displayName = sourceUri.getLastPathSegment();
-                        }
+                        String sourceDisplayName = mSourceDisplayNames[i++];
 
                         final ImportRequest request;
                         try {
-                            request = constructImportRequest(null, sourceUri, displayName);
+                            request = constructImportRequest(null, sourceUri, sourceDisplayName);
                         } catch (VCardException e) {
                             Log.e(LOG_TAG, "Maybe the file is in wrong format", e);
                             showFailureNotification(R.string.fail_reason_not_supported);
@@ -404,16 +383,16 @@
         }
     }
 
-    private void importVCard(final Uri uri) {
-        importVCard(new Uri[] {uri});
+    private void importVCard(final Uri uri, final String sourceDisplayName) {
+        importVCard(new Uri[] {uri}, new String[] {sourceDisplayName});
     }
 
-    private void importVCard(final Uri[] uris) {
+    private void importVCard(final Uri[] uris, final String[] sourceDisplayNames) {
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
                 if (!isFinishing()) {
-                    mVCardCacheThread = new VCardCacheThread(uris);
+                    mVCardCacheThread = new VCardCacheThread(uris, sourceDisplayNames);
                     mListener = new NotificationImportExportListener(ImportVCardActivity.this);
                     showDialog(R.id.dialog_cache_vcard);
                 }
@@ -421,6 +400,37 @@
         });
     }
 
+    private String getDisplayName(Uri sourceUri) {
+        final ContentResolver resolver = ImportVCardActivity.this.getContentResolver();
+        String displayName = null;
+        Cursor cursor = null;
+        // Try to get a display name from the given Uri. If it fails, we just
+        // pick up the last part of the Uri.
+        try {
+            cursor = resolver.query(sourceUri,
+                    new String[] { OpenableColumns.DISPLAY_NAME },
+                    null, null, null);
+            if (cursor != null && cursor.getCount() > 0 && cursor.moveToFirst()) {
+                if (cursor.getCount() > 1) {
+                    Log.w(LOG_TAG, "Unexpected multiple rows: "
+                            + cursor.getCount());
+                }
+                int index = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
+                if (index >= 0) {
+                    displayName = cursor.getString(index);
+                }
+            }
+        } finally {
+            if (cursor != null) {
+                cursor.close();
+            }
+        }
+        if (TextUtils.isEmpty(displayName)){
+            displayName = sourceUri.getLastPathSegment();
+        }
+        return displayName;
+    }
+
     /**
      * Copy the content of sourceUri to the destination.
      */
@@ -517,17 +527,21 @@
         super.onCreate(bundle);
 
         Uri sourceUri = getIntent().getData();
+        String sourceDisplayName = null;
         if (sourceUri != null) {
             // Read the uri to local first.
             String localTmpFileName = getIntent().getStringExtra(LOCAL_TMP_FILE_NAME_EXTRA);
+            sourceDisplayName = getIntent().getStringExtra(SOURCE_URI_DISPLAY_NAME);
             if (TextUtils.isEmpty(localTmpFileName)) {
                 localTmpFileName = readUriToLocalFile(sourceUri);
+                sourceDisplayName = getDisplayName(sourceUri);
                 if (localTmpFileName == null) {
                     Log.e(LOG_TAG, "Cannot load uri to local storage.");
                     showFailureNotification(R.string.fail_reason_io_error);
                     return;
                 }
                 getIntent().putExtra(LOCAL_TMP_FILE_NAME_EXTRA, localTmpFileName);
+                getIntent().putExtra(SOURCE_URI_DISPLAY_NAME, sourceDisplayName);
             }
             sourceUri = Uri.parse(getFileStreamPath(localTmpFileName).toURI().toString());
         }
@@ -564,7 +578,7 @@
             }
         }
 
-        startImport(sourceUri);
+        startImport(sourceUri, sourceDisplayName);
     }
 
     @Override
@@ -577,13 +591,15 @@
                         intent.getStringExtra(SelectAccountActivity.DATA_SET));
                 final Uri sourceUri = getIntent().getData();
                 if (sourceUri == null) {
-                    startImport(sourceUri);
+                    startImport(sourceUri, /* sourceDisplayName =*/ null);
                 } else {
+                    final String sourceDisplayName = getIntent().getStringExtra(
+                            SOURCE_URI_DISPLAY_NAME);
                     final String localFileName = getIntent().getStringExtra(
                             LOCAL_TMP_FILE_NAME_EXTRA);
                     final Uri localUri = Uri.parse(
                             getFileStreamPath(localFileName).toURI().toString());
-                    startImport(localUri);
+                    startImport(localUri, sourceDisplayName);
                 }
             } else {
                 if (resultCode != Activity.RESULT_CANCELED) {
@@ -596,12 +612,15 @@
                 final ClipData clipData = intent.getClipData();
                 if (clipData != null) {
                     final ArrayList<Uri> uris = new ArrayList<>();
+                    final ArrayList<String> sourceDisplayNames = new ArrayList<>();
                     for (int i = 0; i < clipData.getItemCount(); i++) {
                         ClipData.Item item = clipData.getItemAt(i);
                         final Uri uri = item.getUri();
                         if (uri != null) {
                             final Uri localUri = readUriToLocalUri(uri);
+                            final String sourceDisplayName = getDisplayName(uri);
                             uris.add(localUri);
+                            sourceDisplayNames.add(sourceDisplayName);
                         }
                     }
                     if (uris.isEmpty()) {
@@ -609,14 +628,16 @@
                         finish();
                     } else {
                         Log.i(LOG_TAG, "Multiple vCards selected for import: " + uris);
-                        importVCard(uris.toArray(new Uri[0]));
+                        importVCard(uris.toArray(new Uri[0]),
+                                sourceDisplayNames.toArray(new String[0]));
                     }
                 } else {
                     final Uri uri = intent.getData();
                     if (uri != null) {
                         Log.i(LOG_TAG, "vCard selected for import: " + uri);
                         final Uri localUri = readUriToLocalUri(uri);
-                        importVCard(localUri);
+                        final String sourceDisplayName = getDisplayName(uri);
+                        importVCard(localUri, sourceDisplayName);
                     } else {
                         Log.w(LOG_TAG, "No vCard was selected for import");
                         finish();
@@ -631,11 +652,11 @@
         }
     }
 
-    private void startImport(Uri uri) {
+    private void startImport(Uri uri, String sourceDisplayName) {
         // Handle inbound files
         if (uri != null) {
             Log.i(LOG_TAG, "Starting vCard import using Uri " + uri);
-            importVCard(uri);
+            importVCard(uri, sourceDisplayName);
         } else {
             Log.i(LOG_TAG, "Start vCard without Uri. The user will select vCard manually.");
             final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);