Merge "Use who when requesting permissions" into mnc-dev

This commit is contained in:
Svetoslav
2015-06-10 01:29:19 +00:00
committed by Android (Google) Code Review
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 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();

View File

@@ -4566,6 +4566,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();

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_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);
}
/**
@@ -6348,32 +6350,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);
}
}
}
@@ -6484,11 +6486,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*/);
@@ -6535,6 +6532,14 @@ public class Activity extends ContextThemeWrapper
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
public boolean onHasWindowAnimations() {
return getWindow() != null;

View File

@@ -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);
}
/**

View File

@@ -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;
@@ -125,6 +125,14 @@ public abstract class FragmentHostCallback<E> extends FragmentContainer {
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.
*/