diff options
| author | 2016-02-17 11:57:50 +0000 | |
|---|---|---|
| committer | 2016-02-17 11:57:51 +0000 | |
| commit | 5ae4e73ef0747c2d08a901f1a76d8fb8ee64a53a (patch) | |
| tree | fee0f42b55a307e99989e4fcca379383a6ac9684 | |
| parent | 804d648138212a00bb260291e39fde0b327df709 (diff) | |
| parent | 355b232d7998cfc9b29d42a0356390e25191bcbd (diff) | |
Merge "Suspend packages - new API for retrieving the suspended status" into nyc-dev
13 files changed, 65 insertions, 53 deletions
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 7e50518cb3e1..e71556c9eb6e 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -1917,6 +1917,16 @@ public class ApplicationPackageManager extends PackageManager { } @Override + public boolean isPackageSuspendedForUser(String packageName, int userId) { + try { + return mPM.isPackageSuspendedForUser(packageName, userId); + } catch (RemoteException e) { + // Should never happen! + } + return false; + } + + @Override public void getPackageSizeInfoAsUser(String packageName, int userHandle, IPackageStatsObserver observer) { try { diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index d26e4292e1b3..a95e89d62ff6 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -3500,7 +3500,8 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param packageName The name of the package to retrieve the suspended status of. - * @return boolean {@code true} if the package is suspended, {@code false} otherwise. + * @return {@code true} if the package is suspended or {@code false} if the package is not + * suspended, could not be found or an error occured. */ public boolean getPackageSuspended(@NonNull ComponentName admin, String packageName) { if (mService != null) { diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index c71a60353e1a..868b44b6dc00 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -284,6 +284,7 @@ interface IPackageManager { void clearCrossProfileIntentFilters(int sourceUserId, String ownerPackage); boolean setPackageSuspendedAsUser(String packageName, boolean suspended, int userId); + boolean isPackageSuspendedForUser(String packageName, int userId); /** * Backup/restore support - only the system uid may use these. diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 36b902c3e481..daf8b92e695c 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -5316,6 +5316,16 @@ public abstract class PackageManager { public abstract boolean setPackageSuspendedAsUser( String packageName, boolean suspended, @UserIdInt int userId); + /** + * @see #setPackageSuspendedAsUser(String, boolean, int) + * @param packageName The name of the package to get the suspended status of. + * @param userId The user id. + * @return {@code true} if the package is suspended or {@code false} if the package is not + * suspended or could not be found. + * @hide + */ + public abstract boolean isPackageSuspendedForUser(String packageName, int userId); + /** {@hide} */ public static boolean isMoveStatusFinished(int status) { return (status < 0 || status > 100); diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java index f8851101abc2..c44b638cc284 100644 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java @@ -21,10 +21,8 @@ import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.UserInfo; -import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.RemoteException; @@ -227,8 +225,7 @@ public class RestrictedLockUtils { int userId) { IPackageManager ipm = AppGlobals.getPackageManager(); try { - ApplicationInfo ai = ipm.getApplicationInfo(packageName, 0, userId); - if (ai != null && ((ai.flags & ApplicationInfo.FLAG_SUSPENDED) != 0)) { + if (ipm.isPackageSuspendedForUser(packageName, userId)) { return getProfileOrDeviceOwner(context, userId); } } catch (RemoteException e) { diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 29801b3cb8d9..4646f3cd093e 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -493,9 +493,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku continue; } try { - ApplicationInfo ai = mPackageManager.getApplicationInfo( - provider.info.provider.getPackageName(), 0, provider.getUserId()); - boolean suspended = (ai.flags & ApplicationInfo.FLAG_SUSPENDED) != 0; + boolean suspended = mPackageManager.isPackageSuspendedForUser( + provider.info.provider.getPackageName(), provider.getUserId()); if (provider.setMaskedBySuspendedPackageLocked(suspended)) { if (provider.isMaskedLocked()) { maskWidgetsViewsLocked(provider); diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java index 07d472dc5375..91f58c56c675 100644 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -16,8 +16,6 @@ package com.android.server; -import static android.content.pm.ApplicationInfo.FLAG_SUSPENDED; - import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; @@ -884,7 +882,7 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public int checkAudioOperation(int code, int usage, int uid, String packageName) { - if (isApplicationSuspended(packageName, uid)) { + if (isPackageSuspendedForUser(packageName, uid)) { Log.i(TAG, "Audio disabled for suspended package=" + packageName + " for uid=" + uid); return AppOpsManager.MODE_IGNORED; } @@ -898,21 +896,13 @@ public class AppOpsService extends IAppOpsService.Stub { return checkOperation(code, uid, packageName); } - private boolean isApplicationSuspended(String pkg, int uid) { - int userId = UserHandle.getUserId(uid); - - ApplicationInfo ai; + private boolean isPackageSuspendedForUser(String pkg, int uid) { try { - ai = AppGlobals.getPackageManager().getApplicationInfo(pkg, 0, userId); - if (ai == null) { - Log.w(TAG, "No application info for package " + pkg + " and user " + userId); - return false; - } + return AppGlobals.getPackageManager().isPackageSuspendedForUser( + pkg, UserHandle.getUserId(uid)); } catch (RemoteException re) { throw new SecurityException("Could not talk to package manager service"); } - - return ((ai.flags & FLAG_SUSPENDED) != 0); } private int checkRestrictionLocked(int code, int usage, int uid, String packageName) { diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 0519cf237053..ede1a2f2f457 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -16,7 +16,6 @@ package com.android.server.notification; -import static android.content.pm.ApplicationInfo.FLAG_SUSPENDED; import static android.service.notification.NotificationAssistantService.REASON_APP_CANCEL; import static android.service.notification.NotificationAssistantService.REASON_APP_CANCEL_ALL; import static android.service.notification.NotificationAssistantService.REASON_DELEGATE_CANCEL; @@ -461,7 +460,7 @@ public class NotificationManagerService extends SystemService { /** Use this to check if a package can post a notification or toast. */ private boolean checkNotificationOp(String pkg, int uid) { return mAppOps.checkOp(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg) - == AppOpsManager.MODE_ALLOWED && !isApplicationSuspended(pkg, uid); + == AppOpsManager.MODE_ALLOWED && !isPackageSuspendedForUser(pkg, uid); } private static final class ToastRecord @@ -1134,14 +1133,14 @@ public class NotificationManagerService extends SystemService { } final boolean isSystemToast = isCallerSystem() || ("android".equals(pkg)); - final boolean isApplicationSuspended = - isApplicationSuspended(pkg, Binder.getCallingUid()); + final boolean isPackageSuspended = + isPackageSuspendedForUser(pkg, Binder.getCallingUid()); if (ENABLE_BLOCKED_TOASTS && (!noteNotificationOp(pkg, Binder.getCallingUid()) - || isApplicationSuspended)) { + || isPackageSuspended)) { if (!isSystemToast) { Slog.e(TAG, "Suppressing toast from package " + pkg - + (isApplicationSuspended + + (isPackageSuspended ? " due to package suspended by administrator." : " by user request.")); return; @@ -1276,7 +1275,7 @@ public class NotificationManagerService extends SystemService { public boolean areNotificationsEnabledForPackage(String pkg, int uid) { checkCallerIsSystemOrSameApp(pkg); return (mAppOps.checkOpNoThrow(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg) - == AppOpsManager.MODE_ALLOWED) && !isApplicationSuspended(pkg, uid); + == AppOpsManager.MODE_ALLOWED) && !isPackageSuspendedForUser(pkg, uid); } @Override @@ -2384,13 +2383,13 @@ public class NotificationManagerService extends SystemService { // why is this here? savePolicyFile(); - final boolean isApplicationSuspended = isApplicationSuspended(pkg, callingUid); + final boolean isPackageSuspended = isPackageSuspendedForUser(pkg, callingUid); // blocked apps/topics if (r.getImportance() == NotificationListenerService.Ranking.IMPORTANCE_NONE - || !noteNotificationOp(pkg, callingUid) || isApplicationSuspended) { + || !noteNotificationOp(pkg, callingUid) || isPackageSuspended) { if (!isSystemNotification) { - if (isApplicationSuspended) { + if (isPackageSuspended) { Slog.e(TAG, "Suppressing notification from package due to package " + "suspended by administrator."); mUsageStats.registerSuspendedByAdmin(r); @@ -3492,23 +3491,13 @@ public class NotificationManagerService extends SystemService { return true; } - private boolean isApplicationSuspended(String pkg, int uid) { + private boolean isPackageSuspendedForUser(String pkg, int uid) { int userId = UserHandle.getUserId(uid); - ApplicationInfo ai; try { - // TODO: it might be faster to return a boolean from package manager rather than the - // whole application info. Revisit and make the API change. - ai = AppGlobals.getPackageManager().getApplicationInfo(pkg, - PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId); - if (ai == null) { - Slog.w(TAG, "No application info for package " + pkg + " and user " + userId); - return false; - } + return AppGlobals.getPackageManager().isPackageSuspendedForUser(pkg, userId); } catch (RemoteException re) { throw new SecurityException("Could not talk to package manager service"); } - - return ((ai.flags & FLAG_SUSPENDED) != 0); } private class TrimCache { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6011e071e5d2..ab9879fa3625 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -10717,6 +10717,16 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override + public boolean isPackageSuspendedForUser(String packageName, int userId) { + enforceCrossUserPermission(Binder.getCallingUid(), userId, true, + false, "isPackageSuspendedForUser for user " + userId); + synchronized (mPackages) { + final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); + return pkgSetting != null && pkgSetting.getSuspended(userId); + } + } + + @Override public void verifyPendingInstall(int id, int verificationCode) throws RemoteException { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.PACKAGE_VERIFICATION_AGENT, diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index d4048ef60b75..9a0d0ddbc69e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -179,11 +179,8 @@ class PackageManagerShellCommand extends ShellCommand { try { mInterface.setPackageSuspendedAsUser(packageName, suspendedState, userId); - ApplicationInfo appInfo = mInterface.getApplicationInfo( - packageName, 0, userId); - pw.println("Package " + packageName + " new suspended state: " - + ((appInfo.flags & ApplicationInfo.FLAG_SUSPENDED) != 0)); + + mInterface.isPackageSuspendedForUser(packageName, userId)); return 0; } catch (RemoteException e) { pw.println(e.toString()); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index ce6c68dffec9..cec8119f434a 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -6954,10 +6954,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = mInjector.binderClearCallingIdentity(); try { - ApplicationInfo appInfo = mIPackageManager.getApplicationInfo( - packageName, 0, callingUserId); - return appInfo != null && - (appInfo.flags & ApplicationInfo.FLAG_SUSPENDED) != 0; + return mIPackageManager.isPackageSuspendedForUser(packageName, callingUserId); } catch (RemoteException re) { // Shouldn't happen. Slog.e(LOG_TAG, "Failed talking to the package manager", re); diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 552ce6d724fd..e46189ff550c 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -860,7 +860,13 @@ public class MockPackageManager extends PackageManager { /** @hide */ @Override public boolean setPackageSuspendedAsUser(String packageName, boolean hidden, int userId) { - return false; + throw new UnsupportedOperationException(); + } + + /** @hide */ + @Override + public boolean isPackageSuspendedForUser(String packageName, int userId) { + throw new UnsupportedOperationException(); } /** diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java index 8da3cbd411b9..dc949960958c 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java @@ -789,6 +789,11 @@ public class BridgePackageManager extends PackageManager { } @Override + public boolean isPackageSuspendedForUser(String packageName, int userId) { + return false; + } + + @Override public int getMoveStatus(int moveId) { return 0; } |