summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Andrei Stingaceanu <stg@google.com> 2016-02-17 11:57:50 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2016-02-17 11:57:51 +0000
commit5ae4e73ef0747c2d08a901f1a76d8fb8ee64a53a (patch)
treefee0f42b55a307e99989e4fcca379383a6ac9684
parent804d648138212a00bb260291e39fde0b327df709 (diff)
parent355b232d7998cfc9b29d42a0356390e25191bcbd (diff)
Merge "Suspend packages - new API for retrieving the suspended status" into nyc-dev
-rw-r--r--core/java/android/app/ApplicationPackageManager.java10
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java3
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl1
-rw-r--r--core/java/android/content/pm/PackageManager.java10
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java5
-rw-r--r--services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java5
-rw-r--r--services/core/java/com/android/server/AppOpsService.java18
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java33
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java10
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java5
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java5
-rw-r--r--test-runner/src/android/test/mock/MockPackageManager.java8
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java5
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;
}