summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/Utils.java48
1 files changed, 30 insertions, 18 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java
index edaa0fb5de4f..a822e185479a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/Utils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java
@@ -10,6 +10,8 @@ import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.Signature;
import android.content.pm.UserInfo;
import android.content.res.ColorStateList;
import android.content.res.Resources;
@@ -60,6 +62,7 @@ public class Utils {
static final String STORAGE_MANAGER_ENABLED_PROPERTY =
"ro.storage_manager.enabled";
+ private static Signature[] sSystemSignature;
private static String sPermissionControllerPackageName;
private static String sServicesSystemSharedLibPackageName;
private static String sSharedSystemSharedLibPackageName;
@@ -371,21 +374,13 @@ public class Utils {
}
/**
- * @deprecated Use {@link #isSystemPackage(Resources, PackageManager, ApplicationInfo)} instead.
- */
- @Deprecated
- public static boolean isSystemPackage(Resources resources, PackageManager pm, PackageInfo pkg) {
- return pkg.applicationInfo != null && isSystemPackage(resources, pm, pkg.applicationInfo);
- }
-
- /**
* Determine whether a package is a "system package", in which case certain things (like
* disabling notifications or disabling the package altogether) should be disallowed.
- *
- * Note: This function is just for UI treatment, and should not be used for security purposes.
*/
- public static boolean isSystemPackage(
- Resources resources, PackageManager pm, @NonNull ApplicationInfo app) {
+ public static boolean isSystemPackage(Resources resources, PackageManager pm, PackageInfo pkg) {
+ if (sSystemSignature == null) {
+ sSystemSignature = new Signature[]{getSystemSignature(pm)};
+ }
if (sPermissionControllerPackageName == null) {
sPermissionControllerPackageName = pm.getPermissionControllerPackageName();
}
@@ -395,12 +390,29 @@ public class Utils {
if (sSharedSystemSharedLibPackageName == null) {
sSharedSystemSharedLibPackageName = pm.getSharedSystemSharedLibraryPackageName();
}
- return app.isSignedWithPlatformKey()
- || app.packageName.equals(sPermissionControllerPackageName)
- || app.packageName.equals(sServicesSystemSharedLibPackageName)
- || app.packageName.equals(sSharedSystemSharedLibPackageName)
- || app.packageName.equals(PrintManager.PRINT_SPOOLER_PACKAGE_NAME)
- || isDeviceProvisioningPackage(resources, app.packageName);
+ return (sSystemSignature[0] != null
+ && sSystemSignature[0].equals(getFirstSignature(pkg)))
+ || pkg.packageName.equals(sPermissionControllerPackageName)
+ || pkg.packageName.equals(sServicesSystemSharedLibPackageName)
+ || pkg.packageName.equals(sSharedSystemSharedLibPackageName)
+ || pkg.packageName.equals(PrintManager.PRINT_SPOOLER_PACKAGE_NAME)
+ || isDeviceProvisioningPackage(resources, pkg.packageName);
+ }
+
+ private static Signature getFirstSignature(PackageInfo pkg) {
+ if (pkg != null && pkg.signatures != null && pkg.signatures.length > 0) {
+ return pkg.signatures[0];
+ }
+ return null;
+ }
+
+ private static Signature getSystemSignature(PackageManager pm) {
+ try {
+ final PackageInfo sys = pm.getPackageInfo("android", PackageManager.GET_SIGNATURES);
+ return getFirstSignature(sys);
+ } catch (NameNotFoundException e) {
+ }
+ return null;
}
/**