From cfae44aeec5eef723ad8c03a5c94a68ff3433230 Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Thu, 9 Jan 2020 12:43:08 -0800 Subject: [PATCH] Add new api to get the button label for background permission This allows apps to get the string used so they can properly instruct the user on how to grant a background permission. Test: Manual, multiple languages Bug: 147440267 Change-Id: Ibdc6563e85cae930c25a9338513f747440fee8b4 --- api/current.txt | 1 + .../app/ApplicationPackageManager.java | 24 +++++++++++++++++++ .../android/content/pm/PackageManager.java | 12 ++++++++++ 3 files changed, 37 insertions(+) diff --git a/api/current.txt b/api/current.txt index afbb427ed2887..188e91eb84766 100644 --- a/api/current.txt +++ b/api/current.txt @@ -11784,6 +11784,7 @@ package android.content.pm { method @NonNull public abstract CharSequence getApplicationLabel(@NonNull android.content.pm.ApplicationInfo); method @Nullable public abstract android.graphics.drawable.Drawable getApplicationLogo(@NonNull android.content.pm.ApplicationInfo); method @Nullable public abstract android.graphics.drawable.Drawable getApplicationLogo(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException; + method @NonNull public CharSequence getBackgroundPermissionButtonLabel(); method @Nullable public abstract android.content.pm.ChangedPackages getChangedPackages(@IntRange(from=0) int); method public abstract int getComponentEnabledSetting(@NonNull android.content.ComponentName); method @NonNull public abstract android.graphics.drawable.Drawable getDefaultActivityIcon(); diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 1c6a5615dbd54..d39a8c4699e80 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -133,6 +133,10 @@ public class ApplicationPackageManager extends PackageManager { // Default flags to use with PackageManager when no flags are given. private final static int sDefaultFlags = PackageManager.GET_SHARED_LIBRARY_FILES; + // Name of the resource which provides background permission button string + public static final String APP_PERMISSION_BUTTON_ALLOW_ALWAYS = + "app_permission_button_allow_always"; + private final Object mLock = new Object(); @GuardedBy("mLock") @@ -806,6 +810,26 @@ public class ApplicationPackageManager extends PackageManager { } } + @Override + public CharSequence getBackgroundPermissionButtonLabel() { + try { + + String permissionController = getPermissionControllerPackageName(); + Context context = + mContext.createPackageContext(permissionController, 0); + + int textId = context.getResources().getIdentifier(APP_PERMISSION_BUTTON_ALLOW_ALWAYS, + "string", "com.android.permissioncontroller"); +// permissionController); STOPSHIP b/147434671 + if (textId != 0) { + return context.getText(textId); + } + } catch (NameNotFoundException e) { + Log.e(TAG, "Permission controller not found.", e); + } + return ""; + } + @Override public int checkSignatures(String pkg1, String pkg2) { try { diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 4bfc40e698b9f..176a066b6990a 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -4388,6 +4388,18 @@ public abstract class PackageManager { @UnsupportedAppUsage public abstract boolean shouldShowRequestPermissionRationale(@NonNull String permName); + /** + * Gets the string that is displayed on the button which corresponds to granting background + * location in settings. The intended use for this is to help apps instruct users how to + * grant a background permission by providing the string that users will see. + * + * @return the string shown on the button for granting background location + */ + @NonNull + public CharSequence getBackgroundPermissionButtonLabel() { + return ""; + } + /** * Returns an {@link android.content.Intent} suitable for passing to * {@link android.app.Activity#startActivityForResult(android.content.Intent, int)}