Loading core/java/android/app/ApplicationPackageManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -2855,4 +2855,13 @@ public class ApplicationPackageManager extends PackageManager { throw e.rethrowAsRuntimeException(); } } @Override public boolean isPackageStateProtected(String packageName, int userId) { try { return mPM.isPackageStateProtected(packageName, userId); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } } core/java/android/content/pm/IPackageManager.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -674,4 +674,6 @@ interface IPackageManager { boolean hasUidSigningCertificate(int uid, in byte[] signingCertificate, int flags); String getSystemTextClassifierPackageName(); boolean isPackageStateProtected(String packageName, int userId); } core/java/android/content/pm/PackageManager.java +12 −0 Original line number Diff line number Diff line Loading @@ -6140,4 +6140,16 @@ public abstract class PackageManager { throw new UnsupportedOperationException( "getSystemTextClassifierPackageName not implemented in subclass"); } /** * @return whether a given package's state is protected, e.g. package cannot be disabled, * suspended, hidden or force stopped. * * @hide */ public boolean isPackageStateProtected(String packageName, int userId) { throw new UnsupportedOperationException( "isPackageStateProtected not implemented in subclass"); } } services/core/java/com/android/server/pm/PackageManagerService.java +19 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.pm; import static android.Manifest.permission.DELETE_PACKAGES; import static android.Manifest.permission.MANAGE_DEVICE_ADMINS; import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS; import static android.Manifest.permission.INSTALL_PACKAGES; import static android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS; Loading Loading @@ -115,6 +116,7 @@ import android.Manifest; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.AppOpsManager; Loading Loading @@ -24315,6 +24317,23 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); return mSettings.getHarmfulAppWarningLPr(packageName, userId); } } @Override public boolean isPackageStateProtected(@NonNull String packageName, @UserIdInt int userId) { final int callingUid = Binder.getCallingUid(); final int callingAppId = UserHandle.getAppId(callingUid); mPermissionManager.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, true /*checkShell*/, "isPackageStateProtected"); if (callingAppId != Process.SYSTEM_UID && callingAppId != Process.ROOT_UID && checkUidPermission(MANAGE_DEVICE_ADMINS, callingUid) != PERMISSION_GRANTED) { throw new SecurityException("Caller must have the " + MANAGE_DEVICE_ADMINS + " permission."); } return mProtectedPackages.isPackageStateProtected(userId, packageName); } } interface PackageSender { Loading
core/java/android/app/ApplicationPackageManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -2855,4 +2855,13 @@ public class ApplicationPackageManager extends PackageManager { throw e.rethrowAsRuntimeException(); } } @Override public boolean isPackageStateProtected(String packageName, int userId) { try { return mPM.isPackageStateProtected(packageName, userId); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } }
core/java/android/content/pm/IPackageManager.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -674,4 +674,6 @@ interface IPackageManager { boolean hasUidSigningCertificate(int uid, in byte[] signingCertificate, int flags); String getSystemTextClassifierPackageName(); boolean isPackageStateProtected(String packageName, int userId); }
core/java/android/content/pm/PackageManager.java +12 −0 Original line number Diff line number Diff line Loading @@ -6140,4 +6140,16 @@ public abstract class PackageManager { throw new UnsupportedOperationException( "getSystemTextClassifierPackageName not implemented in subclass"); } /** * @return whether a given package's state is protected, e.g. package cannot be disabled, * suspended, hidden or force stopped. * * @hide */ public boolean isPackageStateProtected(String packageName, int userId) { throw new UnsupportedOperationException( "isPackageStateProtected not implemented in subclass"); } }
services/core/java/com/android/server/pm/PackageManagerService.java +19 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.pm; import static android.Manifest.permission.DELETE_PACKAGES; import static android.Manifest.permission.MANAGE_DEVICE_ADMINS; import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS; import static android.Manifest.permission.INSTALL_PACKAGES; import static android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS; Loading Loading @@ -115,6 +116,7 @@ import android.Manifest; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.AppOpsManager; Loading Loading @@ -24315,6 +24317,23 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); return mSettings.getHarmfulAppWarningLPr(packageName, userId); } } @Override public boolean isPackageStateProtected(@NonNull String packageName, @UserIdInt int userId) { final int callingUid = Binder.getCallingUid(); final int callingAppId = UserHandle.getAppId(callingUid); mPermissionManager.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, true /*checkShell*/, "isPackageStateProtected"); if (callingAppId != Process.SYSTEM_UID && callingAppId != Process.ROOT_UID && checkUidPermission(MANAGE_DEVICE_ADMINS, callingUid) != PERMISSION_GRANTED) { throw new SecurityException("Caller must have the " + MANAGE_DEVICE_ADMINS + " permission."); } return mProtectedPackages.isPackageStateProtected(userId, packageName); } } interface PackageSender {