Implement granting of URI permissions from picker.
Now apps can have the user pick a contact and retrieve its data without
needing the READ_CONTACTS permission.
Also fix the intent filters for GET_CONTENT to work correctly (not require
a URI).
This is a manual cherry-pick of
https://android-git.corp.google.com/g/#change,64188
Bug: 3230253
Change-Id: I82ada3e1be000e02aa057a1ff2f64bb97e14bc26
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index fcffd21..27f1d66 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -187,11 +187,11 @@
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.dir/person" android:host="contacts" />
- <data android:mimeType="vnd.android.cursor.dir/contact" android:host="com.android.contacts" />
- <data android:mimeType="vnd.android.cursor.item/person" android:host="contacts" />
- <data android:mimeType="vnd.android.cursor.item/contact" android:host="com.android.contacts" />
- <data android:mimeType="vnd.android.cursor.item/raw_contact" android:host="com.android.contacts" />
+ <data android:mimeType="vnd.android.cursor.dir/person" />
+ <data android:mimeType="vnd.android.cursor.dir/contact" />
+ <data android:mimeType="vnd.android.cursor.item/person" />
+ <data android:mimeType="vnd.android.cursor.item/contact" />
+ <data android:mimeType="vnd.android.cursor.item/raw_contact" />
</intent-filter>
</activity>
@@ -251,7 +251,7 @@
<intent-filter>
<action android:name="com.android.contacts.action.FILTER_CONTACTS" />
<category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.dir/contact" android:host="com.android.contacts" />
+ <data android:mimeType="vnd.android.cursor.dir/contact" />
</intent-filter>
<meta-data android:name="android.app.searchable"
@@ -275,23 +275,23 @@
<intent-filter>
<action android:name="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.dir/contact" android:host="com.android.contacts" />
- <data android:mimeType="vnd.android.cursor.dir/person" android:host="contacts" />
- <data android:mimeType="vnd.android.cursor.dir/phone_v2" android:host="com.android.contacts" />
- <data android:mimeType="vnd.android.cursor.dir/phone" android:host="contacts" />
- <data android:mimeType="vnd.android.cursor.dir/postal-address_v2" android:host="com.android.contacts" />
- <data android:mimeType="vnd.android.cursor.dir/postal-address" android:host="contacts" />
+ <data android:mimeType="vnd.android.cursor.dir/contact" />
+ <data android:mimeType="vnd.android.cursor.dir/person" />
+ <data android:mimeType="vnd.android.cursor.dir/phone_v2" />
+ <data android:mimeType="vnd.android.cursor.dir/phone" />
+ <data android:mimeType="vnd.android.cursor.dir/postal-address_v2" />
+ <data android:mimeType="vnd.android.cursor.dir/postal-address" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.item/contact" android:host="com.android.contacts" />
- <data android:mimeType="vnd.android.cursor.item/person" android:host="contacts" />
- <data android:mimeType="vnd.android.cursor.item/phone_v2" android:host="com.android.contacts" />
- <data android:mimeType="vnd.android.cursor.item/phone" android:host="contacts" />
- <data android:mimeType="vnd.android.cursor.item/postal-address_v2" android:host="com.android.contacts" />
- <data android:mimeType="vnd.android.cursor.item/postal-address" android:host="contacts" />
+ <data android:mimeType="vnd.android.cursor.item/contact" />
+ <data android:mimeType="vnd.android.cursor.item/person" />
+ <data android:mimeType="vnd.android.cursor.item/phone_v2" />
+ <data android:mimeType="vnd.android.cursor.item/phone" />
+ <data android:mimeType="vnd.android.cursor.item/postal-address_v2" />
+ <data android:mimeType="vnd.android.cursor.item/postal-address" />
</intent-filter>
</activity>
@@ -349,8 +349,8 @@
<intent-filter>
<action android:name="com.android.contacts.action.QUICK_CONTACT" />
<category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.item/contact" android:host="com.android.contacts" />
- <data android:mimeType="vnd.android.cursor.item/person" android:host="contacts" />
+ <data android:mimeType="vnd.android.cursor.item/contact" />
+ <data android:mimeType="vnd.android.cursor.item/person" />
</intent-filter>
</activity>
@@ -444,9 +444,9 @@
<intent-filter android:label="@string/editContactDescription">
<action android:name="android.intent.action.EDIT" />
<category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.item/person" android:host="contacts" />
- <data android:mimeType="vnd.android.cursor.item/contact" android:host="com.android.contacts" />
- <data android:mimeType="vnd.android.cursor.item/raw_contact" android:host="com.android.contacts" />
+ <data android:mimeType="vnd.android.cursor.item/person" />
+ <data android:mimeType="vnd.android.cursor.item/contact" />
+ <data android:mimeType="vnd.android.cursor.item/raw_contact" />
</intent-filter>
<intent-filter android:label="@string/insertContactDescription">
<action android:name="android.intent.action.INSERT" />
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 493514d..e0a05cc 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -296,15 +296,12 @@
@Override
public void onPickContactAction(Uri contactUri) {
- Intent intent = new Intent();
- setResult(RESULT_OK, intent.setData(contactUri));
- finish();
+ returnPickerResult(contactUri);
}
@Override
public void onShortcutIntentCreated(Intent intent) {
- setResult(RESULT_OK, intent);
- finish();
+ returnPickerResult(intent);
}
}
@@ -312,15 +309,12 @@
OnPhoneNumberPickerActionListener {
@Override
public void onPickPhoneNumberAction(Uri dataUri) {
- Intent intent = new Intent();
- setResult(RESULT_OK, intent.setData(dataUri));
- finish();
+ returnPickerResult(dataUri);
}
@Override
public void onShortcutIntentCreated(Intent intent) {
- setResult(RESULT_OK, intent);
- finish();
+ returnPickerResult(intent);
}
}
@@ -328,9 +322,7 @@
OnPostalAddressPickerActionListener {
@Override
public void onPickPostalAddressAction(Uri dataUri) {
- Intent intent = new Intent();
- setResult(RESULT_OK, intent.setData(dataUri));
- finish();
+ returnPickerResult(dataUri);
}
}
@@ -368,6 +360,18 @@
return false;
}
+ public void returnPickerResult(Uri data) {
+ Intent intent = new Intent();
+ intent.setData(data);
+ returnPickerResult(intent);
+ }
+
+ public void returnPickerResult(Intent intent) {
+ intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ setResult(RESULT_OK, intent);
+ finish();
+ }
+
@Override
public void onClick(View v) {
if (v.getId() == R.id.cancel) {