diff options
author | Svetoslav <svetoslavganov@google.com> | 2015-06-09 16:05:21 -0700 |
---|---|---|
committer | Svetoslav <svetoslavganov@google.com> | 2015-06-09 18:17:44 -0700 |
commit | 970b59cbe377e23e9c681a5cef30c01f730c7377 (patch) | |
tree | 5dc3a1fb8a1b777292d024780e7e9048a577255a | |
parent | d6461bc4a6e56e28c1b976862aa46fe5bcaa15a3 (diff) | |
download | frameworks_base-970b59cbe377e23e9c681a5cef30c01f730c7377.zip frameworks_base-970b59cbe377e23e9c681a5cef30c01f730c7377.tar.gz frameworks_base-970b59cbe377e23e9c681a5cef30c01f730c7377.tar.bz2 |
Use who when requesting permissions
Change-Id: Id0b231f8b74099b7877eb4441a1664416c641731
-rw-r--r-- | api/current.txt | 1 | ||||
-rw-r--r-- | api/system-current.txt | 1 | ||||
-rw-r--r-- | core/java/android/app/Activity.java | 57 | ||||
-rw-r--r-- | core/java/android/app/Fragment.java | 4 | ||||
-rw-r--r-- | core/java/android/app/FragmentHostCallback.java | 10 |
5 files changed, 43 insertions, 30 deletions
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 @@ package android.app { 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 @@ package android.app { 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 @@ public class Activity extends ContextThemeWrapper 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 class Activity extends ContextThemeWrapper */ 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 @@ public class Activity extends ContextThemeWrapper + ", 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 @@ public class Activity extends ContextThemeWrapper 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 @@ public class Activity extends ContextThemeWrapper } @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 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene 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 @@ public abstract class FragmentHostCallback<E> extends FragmentContainer { } /** + * 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() { |