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:
Svetoslav
2015-06-02 22:02:23 +00:00
committed by Android Git Automerger
8 changed files with 99 additions and 0 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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.

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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)}

View File

@@ -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) {

View File

@@ -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();