Merge changes from topic "reset-browser-on-install" into rvc-dev

* changes:
  Remove residual childPackages code
  Reset default browser on installExistingForUser
This commit is contained in:
TreeHugger Robot
2020-05-15 21:19:19 +00:00
committed by Android (Google) Code Review

View File

@@ -1566,13 +1566,17 @@ public class PackageManagerService extends IPackageManager.Stub
// Recordkeeping of restore-after-install operations that are currently in flight // Recordkeeping of restore-after-install operations that are currently in flight
// between the Package Manager and the Backup Manager // between the Package Manager and the Backup Manager
static class PostInstallData { static class PostInstallData {
@Nullable
public final InstallArgs args; public final InstallArgs args;
@NonNull
public final PackageInstalledInfo res; public final PackageInstalledInfo res;
@Nullable
public final Runnable mPostInstallRunnable; public final Runnable mPostInstallRunnable;
PostInstallData(InstallArgs _a, PackageInstalledInfo _r, Runnable postInstallRunnable) { PostInstallData(@Nullable InstallArgs args, @NonNull PackageInstalledInfo res,
args = _a; @Nullable Runnable postInstallRunnable) {
res = _r; this.args = args;
this.res = res;
mPostInstallRunnable = postInstallRunnable; mPostInstallRunnable = postInstallRunnable;
} }
} }
@@ -1714,7 +1718,7 @@ public class PackageManagerService extends IPackageManager.Stub
if (data != null && data.mPostInstallRunnable != null) { if (data != null && data.mPostInstallRunnable != null) {
data.mPostInstallRunnable.run(); data.mPostInstallRunnable.run();
} else if (data != null) { } else if (data != null && data.args != null) {
InstallArgs args = data.args; InstallArgs args = data.args;
PackageInstalledInfo parentRes = data.res; PackageInstalledInfo parentRes = data.res;
@@ -1732,26 +1736,12 @@ public class PackageManagerService extends IPackageManager.Stub
: args.whitelistedRestrictedPermissions; : args.whitelistedRestrictedPermissions;
int autoRevokePermissionsMode = args.autoRevokePermissionsMode; int autoRevokePermissionsMode = args.autoRevokePermissionsMode;
// Handle the parent package
handlePackagePostInstall(parentRes, grantPermissions, handlePackagePostInstall(parentRes, grantPermissions,
killApp, virtualPreload, grantedPermissions, killApp, virtualPreload, grantedPermissions,
whitelistedRestrictedPermissions, autoRevokePermissionsMode, whitelistedRestrictedPermissions, autoRevokePermissionsMode,
didRestore, args.installSource.installerPackageName, args.observer, didRestore, args.installSource.installerPackageName, args.observer,
args.mDataLoaderType); args.mDataLoaderType);
// Handle the child packages
final int childCount = (parentRes.addedChildPackages != null)
? parentRes.addedChildPackages.size() : 0;
for (int i = 0; i < childCount; i++) {
PackageInstalledInfo childRes = parentRes.addedChildPackages.valueAt(i);
handlePackagePostInstall(childRes, grantPermissions,
killApp, virtualPreload, grantedPermissions,
whitelistedRestrictedPermissions, autoRevokePermissionsMode,
false /*didRestore*/,
args.installSource.installerPackageName, args.observer,
args.mDataLoaderType);
}
// Log tracing if needed // Log tracing if needed
if (args.traceMethod != null) { if (args.traceMethod != null) {
Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, args.traceMethod, Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, args.traceMethod,
@@ -2306,27 +2296,8 @@ public class PackageManagerService extends IPackageManager.Stub
// Work that needs to happen on first install within each user // Work that needs to happen on first install within each user
if (firstUserIds != null && firstUserIds.length > 0) { if (firstUserIds != null && firstUserIds.length > 0) {
for (int userId : firstUserIds) { for (int userId : firstUserIds) {
// If this app is a browser and it's newly-installed for some clearRolesAndRestorePermissionsForNewUserInstall(packageName,
// users, clear any default-browser state in those users. The pkgSetting.getInstallReason(userId), userId);
// app's nature doesn't depend on the user, so we can just check
// its browser nature in any user and generalize.
if (packageIsBrowser(packageName, userId)) {
// If this browser is restored from user's backup, do not clear
// default-browser state for this user
if (pkgSetting.getInstallReason(userId)
!= PackageManager.INSTALL_REASON_DEVICE_RESTORE) {
mPermissionManager.setDefaultBrowser(null, true, true, userId);
}
}
// We may also need to apply pending (restored) runtime permission grants
// within these users.
mPermissionManager.restoreDelayedRuntimePermissions(packageName,
UserHandle.of(userId));
// Persistent preferred activity might have came into effect due to this
// install.
updateDefaultHomeNotLocked(userId);
} }
} }
@@ -13125,9 +13096,15 @@ public class PackageManagerService extends IPackageManager.Stub
createPackageInstalledInfo(PackageManager.INSTALL_SUCCEEDED); createPackageInstalledInfo(PackageManager.INSTALL_SUCCEEDED);
res.pkg = pkgSetting.pkg; res.pkg = pkgSetting.pkg;
res.newUsers = new int[]{ userId }; res.newUsers = new int[]{ userId };
PostInstallData postInstallData = intentSender == null ? null :
new PostInstallData(null, res, () -> onRestoreComplete(res.returnCode, PostInstallData postInstallData =
mContext, intentSender)); new PostInstallData(null, res, () -> {
clearRolesAndRestorePermissionsForNewUserInstall(packageName,
pkgSetting.getInstallReason(userId), userId);
if (intentSender != null) {
onRestoreComplete(res.returnCode, mContext, intentSender);
}
});
restoreAndPostInstall(userId, res, postInstallData); restoreAndPostInstall(userId, res, postInstallData);
} }
} finally { } finally {
@@ -15804,7 +15781,6 @@ public class PackageManagerService extends IPackageManager.Stub
String returnMsg; String returnMsg;
String installerPackageName; String installerPackageName;
PackageRemovedInfo removedInfo; PackageRemovedInfo removedInfo;
ArrayMap<String, PackageInstalledInfo> addedChildPackages;
// The set of packages consuming this shared library or null if no consumers exist. // The set of packages consuming this shared library or null if no consumers exist.
ArrayList<AndroidPackage> libraryConsumers; ArrayList<AndroidPackage> libraryConsumers;
PackageFreezer freezer; PackageFreezer freezer;
@@ -15818,37 +15794,21 @@ public class PackageManagerService extends IPackageManager.Stub
public void setError(String msg, PackageParserException e) { public void setError(String msg, PackageParserException e) {
setReturnCode(e.error); setReturnCode(e.error);
setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e)); setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e));
final int childCount = (addedChildPackages != null) ? addedChildPackages.size() : 0;
for (int i = 0; i < childCount; i++) {
addedChildPackages.valueAt(i).setError(msg, e);
}
Slog.w(TAG, msg, e); Slog.w(TAG, msg, e);
} }
public void setError(String msg, PackageManagerException e) { public void setError(String msg, PackageManagerException e) {
returnCode = e.error; returnCode = e.error;
setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e)); setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e));
final int childCount = (addedChildPackages != null) ? addedChildPackages.size() : 0;
for (int i = 0; i < childCount; i++) {
addedChildPackages.valueAt(i).setError(msg, e);
}
Slog.w(TAG, msg, e); Slog.w(TAG, msg, e);
} }
public void setReturnCode(int returnCode) { public void setReturnCode(int returnCode) {
this.returnCode = returnCode; this.returnCode = returnCode;
final int childCount = (addedChildPackages != null) ? addedChildPackages.size() : 0;
for (int i = 0; i < childCount; i++) {
addedChildPackages.valueAt(i).returnCode = returnCode;
}
} }
private void setReturnMessage(String returnMsg) { private void setReturnMessage(String returnMsg) {
this.returnMsg = returnMsg; this.returnMsg = returnMsg;
final int childCount = (addedChildPackages != null) ? addedChildPackages.size() : 0;
for (int i = 0; i < childCount; i++) {
addedChildPackages.valueAt(i).returnMsg = returnMsg;
}
} }
// In some error cases we want to convey more info back to the observer // In some error cases we want to convey more info back to the observer
@@ -17398,7 +17358,6 @@ public class PackageManagerService extends IPackageManager.Stub
int targetParseFlags = parseFlags; int targetParseFlags = parseFlags;
final PackageSetting ps; final PackageSetting ps;
final PackageSetting disabledPs; final PackageSetting disabledPs;
final PackageSetting[] childPackages;
if (replace) { if (replace) {
if (parsedPackage.isStaticSharedLibrary()) { if (parsedPackage.isStaticSharedLibrary()) {
// Static libs have a synthetic package name containing the version // Static libs have a synthetic package name containing the version
@@ -18400,7 +18359,6 @@ public class PackageManagerService extends IPackageManager.Stub
final boolean killApp = (deleteFlags & PackageManager.DELETE_DONT_KILL_APP) == 0; final boolean killApp = (deleteFlags & PackageManager.DELETE_DONT_KILL_APP) == 0;
info.sendPackageRemovedBroadcasts(killApp); info.sendPackageRemovedBroadcasts(killApp);
info.sendSystemPackageUpdatedBroadcasts(); info.sendSystemPackageUpdatedBroadcasts();
info.sendSystemPackageAppearedBroadcasts();
} }
// Force a gc here. // Force a gc here.
Runtime.getRuntime().gc(); Runtime.getRuntime().gc();
@@ -18458,7 +18416,6 @@ public class PackageManagerService extends IPackageManager.Stub
SparseArray<int[]> broadcastWhitelist; SparseArray<int[]> broadcastWhitelist;
// Clean up resources deleted packages. // Clean up resources deleted packages.
InstallArgs args = null; InstallArgs args = null;
ArrayMap<String, PackageInstalledInfo> appearedChildPackages;
PackageRemovedInfo(PackageSender packageSender) { PackageRemovedInfo(PackageSender packageSender) {
this.packageSender = packageSender; this.packageSender = packageSender;
@@ -18474,18 +18431,6 @@ public class PackageManagerService extends IPackageManager.Stub
} }
} }
void sendSystemPackageAppearedBroadcasts() {
final int packageCount = (appearedChildPackages != null)
? appearedChildPackages.size() : 0;
for (int i = 0; i < packageCount; i++) {
PackageInstalledInfo installedInfo = appearedChildPackages.valueAt(i);
packageSender.sendPackageAddedForNewUsers(installedInfo.name,
true /*sendBootCompleted*/, false /*startReceiver*/,
UserHandle.getAppId(installedInfo.uid), installedInfo.newUsers, null,
DataLoaderType.NONE);
}
}
private void sendSystemPackageUpdatedBroadcastsInternal() { private void sendSystemPackageUpdatedBroadcastsInternal() {
Bundle extras = new Bundle(2); Bundle extras = new Bundle(2);
extras.putInt(Intent.EXTRA_UID, removedAppId >= 0 ? removedAppId : uid); extras.putInt(Intent.EXTRA_UID, removedAppId >= 0 ? removedAppId : uid);
@@ -19752,6 +19697,30 @@ public class PackageManagerService extends IPackageManager.Stub
} }
} }
private void clearRolesAndRestorePermissionsForNewUserInstall(String packageName,
int installReason, @UserIdInt int userId) {
// If this app is a browser and it's newly-installed for some
// users, clear any default-browser state in those users. The
// app's nature doesn't depend on the user, so we can just check
// its browser nature in any user and generalize.
if (packageIsBrowser(packageName, userId)) {
// If this browser is restored from user's backup, do not clear
// default-browser state for this user
if (installReason != PackageManager.INSTALL_REASON_DEVICE_RESTORE) {
mPermissionManager.setDefaultBrowser(null, true, true, userId);
}
}
// We may also need to apply pending (restored) runtime permission grants
// within these users.
mPermissionManager.restoreDelayedRuntimePermissions(packageName,
UserHandle.of(userId));
// Persistent preferred activity might have came into effect due to this
// install.
updateDefaultHomeNotLocked(userId);
}
@Override @Override
public void resetApplicationPreferences(int userId) { public void resetApplicationPreferences(int userId) {
mContext.enforceCallingOrSelfPermission( mContext.enforceCallingOrSelfPermission(