am 60022334: am a1e60f1f: Merge "Use who when requesting permissions" into mnc-dev

* commit '60022334b7bff4a8c985465186e7472215178819':
  Use who when requesting permissions
This commit is contained in:
Svetoslav
2015-06-10 01:54:27 +00:00
committed by Android Git Automerger
5 changed files with 43 additions and 30 deletions

View File

@@ -4470,6 +4470,7 @@ package android.app {
method public boolean onHasView(); method public boolean onHasView();
method public boolean onHasWindowAnimations(); method public boolean onHasWindowAnimations();
method public void onInvalidateOptionsMenu(); method public void onInvalidateOptionsMenu();
method public void onRequestPermissionsFromFragment(android.app.Fragment, java.lang.String[], int);
method public boolean onShouldSaveFragmentState(android.app.Fragment); method public boolean onShouldSaveFragmentState(android.app.Fragment);
method public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle); method public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
method public boolean onUseFragmentManagerInflaterFactory(); method public boolean onUseFragmentManagerInflaterFactory();

View File

@@ -4566,6 +4566,7 @@ package android.app {
method public boolean onHasView(); method public boolean onHasView();
method public boolean onHasWindowAnimations(); method public boolean onHasWindowAnimations();
method public void onInvalidateOptionsMenu(); method public void onInvalidateOptionsMenu();
method public void onRequestPermissionsFromFragment(android.app.Fragment, java.lang.String[], int);
method public boolean onShouldSaveFragmentState(android.app.Fragment); method public boolean onShouldSaveFragmentState(android.app.Fragment);
method public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle); method public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
method public boolean onUseFragmentManagerInflaterFactory(); method public boolean onUseFragmentManagerInflaterFactory();

View File

@@ -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_KEY_PREFIX = "android:dialog_";
private static final String SAVED_DIALOG_ARGS_KEY_PREFIX = "android:dialog_args_"; 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 { private static class ManagedDialog {
Dialog mDialog; Dialog mDialog;
Bundle mArgs; Bundle mArgs;
@@ -3751,7 +3753,7 @@ public class Activity extends ContextThemeWrapper
*/ */
public final void requestPermissions(@NonNull String[] permissions, int requestCode) { public final void requestPermissions(@NonNull String[] permissions, int requestCode) {
Intent intent = getPackageManager().buildRequestPermissionsIntent(permissions); Intent intent = getPackageManager().buildRequestPermissionsIntent(permissions);
startActivityForResult(intent, requestCode); startActivityForResult(REQUEST_PERMISSIONS_WHO_PREFIX, intent, requestCode, null);
} }
/** /**
@@ -6348,32 +6350,32 @@ public class Activity extends ContextThemeWrapper
+ ", resCode=" + resultCode + ", data=" + data); + ", resCode=" + resultCode + ", data=" + data);
mFragments.noteStateNotSaved(); mFragments.noteStateNotSaved();
if (who == null) { 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); 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 { } else {
Fragment frag = mFragments.findFragmentByWho(who); Fragment frag = mFragments.findFragmentByWho(who);
if (frag != null) { if (frag != null) {
if (isRequestPermissionResult(data)) { dispatchRequestPermissionsResultToFragment(requestCode, data, frag);
dispatchRequestPermissionsResultToFragment(requestCode, data, frag);
} else {
frag.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) {
frag.onActivityResult(requestCode, resultCode, data);
}
} }
} }
@@ -6484,11 +6486,6 @@ public class Activity extends ContextThemeWrapper
fragement.onRequestPermissionsResult(requestCode, permissions, grantResults); 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> { class HostCallbacks extends FragmentHostCallback<Activity> {
public HostCallbacks() { public HostCallbacks() {
super(Activity.this /*activity*/); super(Activity.this /*activity*/);
@@ -6535,6 +6532,14 @@ public class Activity extends ContextThemeWrapper
Activity.this.startActivityFromFragment(fragment, intent, requestCode, options); Activity.this.startActivityFromFragment(fragment, intent, requestCode, options);
} }
@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 @Override
public boolean onHasWindowAnimations() { public boolean onHasWindowAnimations() {
return getWindow() != null; return getWindow() != null;

View File

@@ -1200,9 +1200,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene
if (mHost == null) { if (mHost == null) {
throw new IllegalStateException("Fragment " + this + " not attached to Activity"); throw new IllegalStateException("Fragment " + this + " not attached to Activity");
} }
Intent intent = mHost.onRequestPermissionsFromFragment(this, permissions,requestCode);
mHost.getContext().getPackageManager().buildRequestPermissionsIntent(permissions);
mHost.onStartActivityFromFragment(this, intent, requestCode, null);
} }
/** /**

View File

@@ -16,8 +16,8 @@
package android.app; package android.app;
import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@@ -125,6 +125,14 @@ public abstract class FragmentHostCallback<E> extends FragmentContainer {
mContext.startActivity(intent); mContext.startActivity(intent);
} }
/**
* 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. * Return {@code true} if there are window animations.
*/ */