Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 683d7704 authored by Tingting Wang's avatar Tingting Wang
Browse files

Fix permission bug when importing vcard.

Possible source and source uris to import vcard to Contacts App:
Gmail App, uri starts with "content://content://gmail-ls/", permission
granted by Gmail App.
Downloads, uri starts with "content://con.google.provider.downloads.documents/document/",
or "content://downloads/", permission granted by Downloads.
Hangouts, uri starts with "content://com.google.android.apps.hangouts.content.EsProvider/",
permission granted by Hangouts

Gmail, Downloads, Hangouts uris need permissions granted from the source, so should read
to locall before requesting Contacts App required permissions.

Messenger, uri starts with "content://com.google.android.apps.messaging.shared.datamodel.MediaScratchFileProvider",
no permission needed.
Drive, uri starts with "file:///data/user/0/com.google.android.apps.docs/files/", no permission needed.

Messenger, Drive uris don't need permission, so both (read to local first, and requesting contacts
required permission first) are OK for them.

Contacts required permssion(READ_CONTACTS and READ_EXTERNAL_STORAGE) is used to grant uri like "file:///storage"
permission, so should be granted first for this kind of uris.

Totally, for uris "file:///storage" READ_EXTERNAL_STORAGE permission should be requested first.
For others uris should be read to local using granted permissions first.

BUG 26905556

Change-Id: I0dcf794ad71ed8eef6f08c617b84ccafd1cf1bed
parent 0617a246
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -96,9 +96,7 @@ public class ImportVCardActivity extends Activity {
    private static final String SOURCE_URI_DISPLAY_NAME =
            "com.android.contacts.common.vcard.SOURCE_URI_DISPLAY_NAME";

    private static final String GMAIL_VCARD_URI_PREFIX = "content://gmail-ls/";

    private static final String DOWNLOAD_VCARD_URI_PREFIX = "content://downloads";
    private static final String STORAGE_VCARD_URI_PREFIX = "file:///storage";

    private AccountWithDataSet mAccount;

@@ -532,13 +530,9 @@ public class ImportVCardActivity extends Activity {
        return Uri.parse(getFileStreamPath(fileName).toURI().toString());
    }

    // Returns true if uri is from Gmail app.
    private static boolean isGmailUri(Uri uri) {
        return uri != null && uri.toString().startsWith(GMAIL_VCARD_URI_PREFIX);
    }

    private static boolean isDownloadUri(Uri uri) {
        return uri != null && uri.toString().startsWith(DOWNLOAD_VCARD_URI_PREFIX);
    // Returns true if uri is from Storage.
    private boolean isStorageUri(Uri uri) {
        return uri != null && uri.toString().startsWith(STORAGE_VCARD_URI_PREFIX);
    }

    @Override
@@ -546,11 +540,12 @@ public class ImportVCardActivity extends Activity {
        super.onCreate(bundle);

        Uri sourceUri = getIntent().getData();
        // Reading uris from Gmail and Download needs the permission granted from the source intent,

        // Reading uris from non-storage needs the permission granted from the source intent,
        // instead of permissions from RequestImportVCardPermissionActivity. So skipping requesting
        // permissions from RequestImportVCardPermissionActivity for uris from Gmail and Download.
        if (!isGmailUri(sourceUri) && !isDownloadUri(sourceUri) &&
                RequestImportVCardPermissionsActivity.startPermissionActivity(this)) {
        // permissions from RequestImportVCardPermissionActivity for uris from non-storage source.
        if (isStorageUri(sourceUri)
                && RequestImportVCardPermissionsActivity.startPermissionActivity(this)) {
            return;
        }

@@ -573,6 +568,11 @@ public class ImportVCardActivity extends Activity {
            sourceUri = Uri.parse(getFileStreamPath(localTmpFileName).toURI().toString());
        }

        // Always request required permission for contacts before importing the vcard.
        if (RequestImportVCardPermissionsActivity.startPermissionActivity(this)) {
            return;
        }

        String accountName = null;
        String accountType = null;
        String dataSet = null;