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) {