Merge "setPackagesSuspended now overwrites all the state" into pi-dev

This commit is contained in:
TreeHugger Robot
2018-04-10 20:15:24 +00:00
committed by Android (Google) Code Review
7 changed files with 32 additions and 104 deletions

View File

@@ -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);

View File

@@ -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 {

View File

@@ -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.
*/

View File

@@ -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.

View File

@@ -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);
}
}
}

View File

@@ -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;

View File

@@ -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());