Use who when requesting permissions

Change-Id: Id0b231f8b74099b7877eb4441a1664416c641731
diff --git a/api/current.txt b/api/current.txt
index b35581c..4a3fafd 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -4469,6 +4469,7 @@
     method public boolean onHasView();
     method public boolean onHasWindowAnimations();
     method public void onInvalidateOptionsMenu();
+    method public void onRequestPermissionsFromFragment(android.app.Fragment, java.lang.String[], int);
     method public boolean onShouldSaveFragmentState(android.app.Fragment);
     method public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
     method public boolean onUseFragmentManagerInflaterFactory();
diff --git a/api/system-current.txt b/api/system-current.txt
index 3698b22..e4e8387 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -4565,6 +4565,7 @@
     method public boolean onHasView();
     method public boolean onHasWindowAnimations();
     method public void onInvalidateOptionsMenu();
+    method public void onRequestPermissionsFromFragment(android.app.Fragment, java.lang.String[], int);
     method public boolean onShouldSaveFragmentState(android.app.Fragment);
     method public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
     method public boolean onUseFragmentManagerInflaterFactory();
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 90567c7..b88d5d4 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -690,6 +690,8 @@
     private static final String SAVED_DIALOG_KEY_PREFIX = "android:dialog_";
     private static final String SAVED_DIALOG_ARGS_KEY_PREFIX = "android:dialog_args_";
 
+    private static final String REQUEST_PERMISSIONS_WHO_PREFIX = "@android:requestPermissions:";
+
     private static class ManagedDialog {
         Dialog mDialog;
         Bundle mArgs;
@@ -3751,7 +3753,7 @@
      */
     public final void requestPermissions(@NonNull String[] permissions, int requestCode) {
         Intent intent = getPackageManager().buildRequestPermissionsIntent(permissions);
-        startActivityForResult(intent, requestCode);
+        startActivityForResult(REQUEST_PERMISSIONS_WHO_PREFIX, intent, requestCode, null);
     }
 
     /**
@@ -6330,32 +6332,32 @@
             + ", resCode=" + resultCode + ", data=" + data);
         mFragments.noteStateNotSaved();
         if (who == null) {
-            if (isRequestPermissionResult(data)) {
+            onActivityResult(requestCode, resultCode, data);
+        } else if (who.startsWith(REQUEST_PERMISSIONS_WHO_PREFIX)) {
+            who = who.substring(REQUEST_PERMISSIONS_WHO_PREFIX.length());
+            if (TextUtils.isEmpty(who)) {
                 dispatchRequestPermissionsResult(requestCode, data);
             } else {
-                onActivityResult(requestCode, resultCode, data);
-            }
-        } else {
-            if (who.startsWith("@android:view:")) {
-                ArrayList<ViewRootImpl> views = WindowManagerGlobal.getInstance().getRootViews(
-                        getActivityToken());
-                for (ViewRootImpl viewRoot : views) {
-                    if (viewRoot.getView() != null
-                            && viewRoot.getView().dispatchActivityResult(
-                                    who, requestCode, resultCode, data)) {
-                        return;
-                    }
-                }
-            } else {
                 Fragment frag = mFragments.findFragmentByWho(who);
                 if (frag != null) {
-                    if (isRequestPermissionResult(data)) {
-                        dispatchRequestPermissionsResultToFragment(requestCode, data, frag);
-                    } else {
-                        frag.onActivityResult(requestCode, resultCode, data);
-                    }
+                    dispatchRequestPermissionsResultToFragment(requestCode, data, frag);
                 }
             }
+        } else if (who.startsWith("@android:view:")) {
+            ArrayList<ViewRootImpl> views = WindowManagerGlobal.getInstance().getRootViews(
+                    getActivityToken());
+            for (ViewRootImpl viewRoot : views) {
+                if (viewRoot.getView() != null
+                        && viewRoot.getView().dispatchActivityResult(
+                                who, requestCode, resultCode, data)) {
+                    return;
+                }
+            }
+        } else {
+            Fragment frag = mFragments.findFragmentByWho(who);
+            if (frag != null) {
+                frag.onActivityResult(requestCode, resultCode, data);
+            }
         }
     }
 
@@ -6466,11 +6468,6 @@
         fragement.onRequestPermissionsResult(requestCode, permissions, grantResults);
     }
 
-    private static boolean isRequestPermissionResult(Intent intent) {
-        return intent != null
-                && PackageManager.ACTION_REQUEST_PERMISSIONS.equals(intent.getAction());
-    }
-
     class HostCallbacks extends FragmentHostCallback<Activity> {
         public HostCallbacks() {
             super(Activity.this /*activity*/);
@@ -6518,6 +6515,14 @@
         }
 
         @Override
+        public void onRequestPermissionsFromFragment(Fragment fragment, String[] permissions,
+                int requestCode) {
+            String who = REQUEST_PERMISSIONS_WHO_PREFIX + fragment.mWho;
+            Intent intent = getPackageManager().buildRequestPermissionsIntent(permissions);
+            startActivityForResult(who, intent, requestCode, null);
+        }
+
+        @Override
         public boolean onHasWindowAnimations() {
             return getWindow() != null;
         }
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java
index 26d4fd4..95b3b8e 100644
--- a/core/java/android/app/Fragment.java
+++ b/core/java/android/app/Fragment.java
@@ -1200,9 +1200,7 @@
         if (mHost == null) {
             throw new IllegalStateException("Fragment " + this + " not attached to Activity");
         }
-        Intent intent =
-                mHost.getContext().getPackageManager().buildRequestPermissionsIntent(permissions);
-        mHost.onStartActivityFromFragment(this, intent, requestCode, null);
+        mHost.onRequestPermissionsFromFragment(this, permissions,requestCode);
     }
 
     /**
diff --git a/core/java/android/app/FragmentHostCallback.java b/core/java/android/app/FragmentHostCallback.java
index 3e753f0..7b01307 100644
--- a/core/java/android/app/FragmentHostCallback.java
+++ b/core/java/android/app/FragmentHostCallback.java
@@ -16,8 +16,8 @@
 
 package android.app;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
@@ -126,6 +126,14 @@
     }
 
     /**
+     * Requests permissions from the given fragment.
+     * See {@link Activity#requestPermissions(String[], int)}
+     */
+    public void onRequestPermissionsFromFragment(@NonNull Fragment fragment,
+            @NonNull String[] permissions, int requestCode) {
+    }
+
+    /**
      * Return {@code true} if there are window animations.
      */
     public boolean onHasWindowAnimations() {