Merge "setPackagesSuspended now overwrites all the state" into pi-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
e901d69ea6
@@ -1027,7 +1027,6 @@ package android.content.pm {
|
||||
method public abstract java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(java.lang.String);
|
||||
method public abstract int getIntentVerificationStatusAsUser(java.lang.String, int);
|
||||
method public abstract int getPermissionFlags(java.lang.String, java.lang.String, android.os.UserHandle);
|
||||
method public android.os.PersistableBundle getSuspendedPackageAppExtras(java.lang.String);
|
||||
method public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
|
||||
method public abstract int installExistingPackage(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
|
||||
method public abstract int installExistingPackage(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
|
||||
@@ -1039,7 +1038,6 @@ package android.content.pm {
|
||||
method public abstract boolean setDefaultBrowserPackageNameAsUser(java.lang.String, int);
|
||||
method public void setHarmfulAppWarning(java.lang.String, java.lang.CharSequence);
|
||||
method public java.lang.String[] setPackagesSuspended(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String);
|
||||
method public void setSuspendedPackageAppExtras(java.lang.String, android.os.PersistableBundle);
|
||||
method public abstract void setUpdateAvailable(java.lang.String, boolean);
|
||||
method public abstract boolean updateIntentVerificationStatusAsUser(java.lang.String, int, int);
|
||||
method public abstract void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle);
|
||||
|
||||
@@ -2165,29 +2165,17 @@ public class ApplicationPackageManager extends PackageManager {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PersistableBundle getSuspendedPackageAppExtras(String packageName) {
|
||||
public Bundle getSuspendedPackageAppExtras() {
|
||||
final PersistableBundle extras;
|
||||
try {
|
||||
return mPM.getSuspendedPackageAppExtras(packageName, mContext.getUserId());
|
||||
extras = mPM.getSuspendedPackageAppExtras(mContext.getOpPackageName(),
|
||||
mContext.getUserId());
|
||||
} catch (RemoteException e) {
|
||||
throw e.rethrowFromSystemServer();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Bundle getSuspendedPackageAppExtras() {
|
||||
final PersistableBundle extras = getSuspendedPackageAppExtras(mContext.getOpPackageName());
|
||||
return extras != null ? new Bundle(extras.deepCopy()) : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSuspendedPackageAppExtras(String packageName, PersistableBundle appExtras) {
|
||||
try {
|
||||
mPM.setSuspendedPackageAppExtras(packageName, appExtras, mContext.getUserId());
|
||||
} catch (RemoteException e) {
|
||||
e.rethrowFromSystemServer();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPackageSuspendedForUser(String packageName, int userId) {
|
||||
try {
|
||||
|
||||
@@ -280,9 +280,6 @@ interface IPackageManager {
|
||||
|
||||
PersistableBundle getSuspendedPackageAppExtras(String packageName, int userId);
|
||||
|
||||
void setSuspendedPackageAppExtras(String packageName, in PersistableBundle appExtras,
|
||||
int userId);
|
||||
|
||||
/**
|
||||
* Backup/restore support - only the system uid may use these.
|
||||
*/
|
||||
|
||||
@@ -5615,46 +5615,6 @@ public abstract class PackageManager {
|
||||
throw new UnsupportedOperationException("isPackageSuspended not implemented");
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the {@link PersistableBundle} that was passed as {@code appExtras} when the given
|
||||
* package was suspended.
|
||||
*
|
||||
* <p> The caller must hold permission {@link Manifest.permission#SUSPEND_APPS} to use this
|
||||
* api.</p>
|
||||
*
|
||||
* @param packageName The package to retrieve extras for.
|
||||
* @return The {@code appExtras} for the suspended package.
|
||||
*
|
||||
* @see #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle, String)
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
@RequiresPermission(Manifest.permission.SUSPEND_APPS)
|
||||
public @Nullable PersistableBundle getSuspendedPackageAppExtras(String packageName) {
|
||||
throw new UnsupportedOperationException("getSuspendedPackageAppExtras not implemented");
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the app extras for a suspended package. This method can be used to update the appExtras
|
||||
* for a package that was earlier suspended using
|
||||
* {@link #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle,
|
||||
* String)}
|
||||
* Does nothing if the given package is not already in a suspended state.
|
||||
*
|
||||
* @param packageName The package for which the appExtras need to be updated
|
||||
* @param appExtras The new appExtras for the given package
|
||||
*
|
||||
* @see #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle, String)
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
@RequiresPermission(Manifest.permission.SUSPEND_APPS)
|
||||
public void setSuspendedPackageAppExtras(String packageName,
|
||||
@Nullable PersistableBundle appExtras) {
|
||||
throw new UnsupportedOperationException("setSuspendedPackageAppExtras not implemented");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns any extra information supplied as {@code appExtras} to the system when the calling
|
||||
* app was suspended.
|
||||
|
||||
@@ -14021,7 +14021,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
"setPackagesSuspended for user " + userId);
|
||||
if (callingUid != Process.ROOT_UID &&
|
||||
!UserHandle.isSameApp(getPackageUid(callingPackage, 0, userId), callingUid)) {
|
||||
throw new IllegalArgumentException("callingPackage " + callingPackage + " does not"
|
||||
throw new IllegalArgumentException("CallingPackage " + callingPackage + " does not"
|
||||
+ " belong to calling app id " + UserHandle.getAppId(callingUid));
|
||||
}
|
||||
|
||||
@@ -14045,20 +14045,18 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
final PackageSetting pkgSetting = mSettings.mPackages.get(packageName);
|
||||
if (pkgSetting == null
|
||||
|| filterAppAccessLPr(pkgSetting, callingUid, userId)) {
|
||||
Slog.w(TAG, "Could not find package setting for package \"" + packageName
|
||||
+ "\". Skipping suspending/un-suspending.");
|
||||
Slog.w(TAG, "Could not find package setting for package: " + packageName
|
||||
+ ". Skipping suspending/un-suspending.");
|
||||
unactionedPackages.add(packageName);
|
||||
continue;
|
||||
}
|
||||
if (pkgSetting.getSuspended(userId) != suspended) {
|
||||
if (!canSuspendPackageForUserLocked(packageName, userId)) {
|
||||
unactionedPackages.add(packageName);
|
||||
continue;
|
||||
}
|
||||
pkgSetting.setSuspended(suspended, callingPackage, dialogMessage, appExtras,
|
||||
launcherExtras, userId);
|
||||
changedPackagesList.add(packageName);
|
||||
if (!canSuspendPackageForUserLocked(packageName, userId)) {
|
||||
unactionedPackages.add(packageName);
|
||||
continue;
|
||||
}
|
||||
pkgSetting.setSuspended(suspended, callingPackage, dialogMessage, appExtras,
|
||||
launcherExtras, userId);
|
||||
changedPackagesList.add(packageName);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
@@ -14073,7 +14071,6 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
scheduleWritePackageRestrictionsLocked(userId);
|
||||
}
|
||||
}
|
||||
|
||||
return unactionedPackages.toArray(new String[unactionedPackages.size()]);
|
||||
}
|
||||
|
||||
@@ -14081,7 +14078,8 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
public PersistableBundle getSuspendedPackageAppExtras(String packageName, int userId) {
|
||||
final int callingUid = Binder.getCallingUid();
|
||||
if (getPackageUid(packageName, 0, userId) != callingUid) {
|
||||
mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, null);
|
||||
throw new SecurityException("Calling package " + packageName
|
||||
+ " does not belong to calling uid " + callingUid);
|
||||
}
|
||||
synchronized (mPackages) {
|
||||
final PackageSetting ps = mSettings.mPackages.get(packageName);
|
||||
@@ -14096,25 +14094,6 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSuspendedPackageAppExtras(String packageName, PersistableBundle appExtras,
|
||||
int userId) {
|
||||
final int callingUid = Binder.getCallingUid();
|
||||
mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, null);
|
||||
synchronized (mPackages) {
|
||||
final PackageSetting ps = mSettings.mPackages.get(packageName);
|
||||
if (ps == null || filterAppAccessLPr(ps, callingUid, userId)) {
|
||||
throw new IllegalArgumentException("Unknown target package: " + packageName);
|
||||
}
|
||||
final PackageUserState packageUserState = ps.readUserState(userId);
|
||||
if (packageUserState.suspended) {
|
||||
packageUserState.suspendedAppExtras = appExtras;
|
||||
sendMyPackageSuspendedOrUnsuspended(new String[] {packageName}, true, appExtras,
|
||||
userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void sendMyPackageSuspendedOrUnsuspended(String[] affectedPackages, boolean suspended,
|
||||
PersistableBundle appExtras, int userId) {
|
||||
final String action;
|
||||
@@ -14169,18 +14148,26 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
void onSuspendingPackageRemoved(String packageName, int userId) {
|
||||
final int[] userIds = (userId == UserHandle.USER_ALL) ? sUserManager.getUserIds()
|
||||
: new int[] {userId};
|
||||
synchronized (mPackages) {
|
||||
for (PackageSetting ps : mSettings.mPackages.values()) {
|
||||
for (int user : userIds) {
|
||||
final PackageUserState pus = ps.readUserState(user);
|
||||
void onSuspendingPackageRemoved(String packageName, int removedForUser) {
|
||||
final int[] userIds = (removedForUser == UserHandle.USER_ALL) ? sUserManager.getUserIds()
|
||||
: new int[] {removedForUser};
|
||||
for (int userId : userIds) {
|
||||
List<String> affectedPackages = new ArrayList<>();
|
||||
synchronized (mPackages) {
|
||||
for (PackageSetting ps : mSettings.mPackages.values()) {
|
||||
final PackageUserState pus = ps.readUserState(userId);
|
||||
if (pus.suspended && packageName.equals(pus.suspendingPackage)) {
|
||||
ps.setSuspended(false, null, null, null, null, user);
|
||||
ps.setSuspended(false, null, null, null, null, userId);
|
||||
affectedPackages.add(ps.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!affectedPackages.isEmpty()) {
|
||||
final String[] packageArray = affectedPackages.toArray(
|
||||
new String[affectedPackages.size()]);
|
||||
sendMyPackageSuspendedOrUnsuspended(packageArray, false, null, userId);
|
||||
sendPackagesSuspendedForUser(packageArray, userId, false, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,8 +20,6 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
|
||||
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
|
||||
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
|
||||
|
||||
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
|
||||
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.IntentFilterVerificationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
|
||||
@@ -297,7 +297,7 @@ public class SuspendPackagesTest {
|
||||
intentFromApp.getBundleExtra(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS));
|
||||
final PersistableBundle extras2 = getExtras("testMyPackageSuspendedOnChangingExtras", 2,
|
||||
"2", 0.2);
|
||||
mPackageManager.setSuspendedPackageAppExtras(TEST_APP_PACKAGE_NAME, extras2);
|
||||
suspendTestPackage(extras2, null, null);
|
||||
intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
|
||||
assertEquals("MY_PACKAGE_SUSPENDED delivery not reported",
|
||||
ACTION_REPORT_MY_PACKAGE_SUSPENDED, intentFromApp.getAction());
|
||||
|
||||
Reference in New Issue
Block a user