am c5ff0020: Merge "Add API to hint whether to show on-board UI before a permission request." into mnc-dev
* commit 'c5ff0020a2467e0b7aed590d790b5a1b4b082f56': Add API to hint whether to show on-board UI before a permission request.
This commit is contained in:
@@ -3513,6 +3513,7 @@ package android.app {
|
||||
method public deprecated void setTitleColor(int);
|
||||
method public void setVisible(boolean);
|
||||
method public final void setVolumeControlStream(int);
|
||||
method public boolean shouldShowRequestPermissionRationale(java.lang.String);
|
||||
method public boolean shouldUpRecreateTask(android.content.Intent);
|
||||
method public final deprecated void showDialog(int);
|
||||
method public final deprecated boolean showDialog(int, android.os.Bundle);
|
||||
|
||||
@@ -3599,6 +3599,7 @@ package android.app {
|
||||
method public deprecated void setTitleColor(int);
|
||||
method public void setVisible(boolean);
|
||||
method public final void setVolumeControlStream(int);
|
||||
method public boolean shouldShowRequestPermissionRationale(java.lang.String);
|
||||
method public boolean shouldUpRecreateTask(android.content.Intent);
|
||||
method public final deprecated void showDialog(int);
|
||||
method public final deprecated boolean showDialog(int, android.os.Bundle);
|
||||
|
||||
@@ -3746,6 +3746,7 @@ public class Activity extends ContextThemeWrapper
|
||||
*
|
||||
* @see #onRequestPermissionsResult(int, String[], int[])
|
||||
* @see #checkSelfPermission(String)
|
||||
* @see #canShowRequestPermissionRationale(String)
|
||||
*/
|
||||
public final void requestPermissions(@NonNull String[] permissions, int requestCode) {
|
||||
Intent intent = getPackageManager().buildRequestPermissionsIntent(permissions);
|
||||
@@ -3769,6 +3770,30 @@ public class Activity extends ContextThemeWrapper
|
||||
/* callback - no nothing */
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets whether you should show UI with rationale for requesting a permission.
|
||||
* You should do this only if you do not have the permission and the context in
|
||||
* which the permission is requested does not clearly communicate to the user
|
||||
* what would be the benefit from granting this permission.
|
||||
* <p>
|
||||
* For example, if you write a camera app, requesting the camera permission
|
||||
* would be expected by the user and no rationale for why it is requested is
|
||||
* needed. If however, the app needs location for tagging photos then a non-tech
|
||||
* savvy user may wonder how location is related to taking photos. In this case
|
||||
* you may choose to show UI with rationale of requesting this permission.
|
||||
* </p>
|
||||
*
|
||||
* @param permission A permission your app wants to request.
|
||||
* @return Whether you can show permission rationale UI.
|
||||
*
|
||||
* @see #checkSelfPermission(String)
|
||||
* @see #requestPermissions(String[], int)
|
||||
* @see #onRequestPermissionsResult(int, String[], int[])
|
||||
*/
|
||||
public boolean shouldShowRequestPermissionRationale(String permission) {
|
||||
return getPackageManager().shouldShowRequestPermissionRationale(permission);
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as calling {@link #startActivityForResult(Intent, int, Bundle)}
|
||||
* with no options.
|
||||
|
||||
@@ -485,6 +485,16 @@ final class ApplicationPackageManager extends PackageManager {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldShowRequestPermissionRationale(String permission) {
|
||||
try {
|
||||
return mPM.shouldShowRequestPermissionRationale(permission,
|
||||
mContext.getPackageName(), mContext.getUserId());
|
||||
} catch (RemoteException e) {
|
||||
throw new RuntimeException("Package manager has died", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int checkSignatures(String pkg1, String pkg2) {
|
||||
try {
|
||||
|
||||
@@ -105,6 +105,9 @@ interface IPackageManager {
|
||||
void updatePermissionFlags(String permissionName, String packageName, int flagMask,
|
||||
int flagValues, int userId);
|
||||
|
||||
boolean shouldShowRequestPermissionRationale(String permissionName,
|
||||
String packageName, int userId);
|
||||
|
||||
boolean isProtectedBroadcast(String actionName);
|
||||
|
||||
int checkSignatures(String pkg1, String pkg2);
|
||||
|
||||
@@ -2538,6 +2538,19 @@ public abstract class PackageManager {
|
||||
String packageName, @PermissionFlags int flagMask, int flagValues,
|
||||
@NonNull UserHandle user);
|
||||
|
||||
/**
|
||||
* Gets whether you should show UI with rationale for requesting a permission.
|
||||
* You should do this only if you do not have the permission and the context in
|
||||
* which the permission is requested does not clearly communicate to the user
|
||||
* what would be the benefit from grating this permission.
|
||||
*
|
||||
* @param permission A permission your app wants to request.
|
||||
* @return Whether you can show permission rationale UI.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public abstract boolean shouldShowRequestPermissionRationale(String permission);
|
||||
|
||||
/**
|
||||
* Returns an {@link android.content.Intent} suitable for passing to
|
||||
* {@link android.app.Activity#startActivityForResult(android.content.Intent, int)}
|
||||
|
||||
@@ -3359,6 +3359,46 @@ public class PackageManagerService extends IPackageManager.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldShowRequestPermissionRationale(String permissionName,
|
||||
String packageName, int userId) {
|
||||
if (UserHandle.getCallingUserId() != userId) {
|
||||
mContext.enforceCallingPermission(
|
||||
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
|
||||
"canShowRequestPermissionRationale for user " + userId);
|
||||
}
|
||||
|
||||
final int uid = getPackageUid(packageName, userId);
|
||||
if (UserHandle.getAppId(getCallingUid()) != UserHandle.getAppId(uid)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (checkPermission(permissionName, packageName, userId)
|
||||
== PackageManager.PERMISSION_GRANTED) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final int flags;
|
||||
|
||||
final long identity = Binder.clearCallingIdentity();
|
||||
try {
|
||||
flags = getPermissionFlags(permissionName,
|
||||
packageName, userId);
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(identity);
|
||||
}
|
||||
|
||||
final int fixedFlags = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED
|
||||
| PackageManager.FLAG_PERMISSION_POLICY_FIXED
|
||||
| PackageManager.FLAG_PERMISSION_USER_FIXED;
|
||||
|
||||
if ((flags & fixedFlags) != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return (flags & PackageManager.FLAG_PERMISSION_USER_SET) != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isProtectedBroadcast(String actionName) {
|
||||
synchronized (mPackages) {
|
||||
|
||||
@@ -218,6 +218,12 @@ public class MockPackageManager extends PackageManager {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
@Override
|
||||
public boolean shouldShowRequestPermissionRationale(String permission) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int checkSignatures(String pkg1, String pkg2) {
|
||||
throw new UnsupportedOperationException();
|
||||
|
||||
Reference in New Issue
Block a user