Merge "Restore app uninstall on cable disconnect during ADB streaming." into sc-dev am: 306e47692f

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14293407

Change-Id: Id27362a3dac6b863e93042a8f4c9c3a2674ba550
This commit is contained in:
TreeHugger Robot
2021-04-26 17:02:17 +00:00
committed by Automerger Merge Worker

View File

@@ -878,6 +878,14 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
return isDataLoaderInstallation() && params.dataLoaderParams.getType() == INCREMENTAL;
}
private boolean isSystemDataLoaderInstallation() {
if (!isDataLoaderInstallation()) {
return false;
}
return SYSTEM_DATA_LOADER_PACKAGE.equals(
this.params.dataLoaderParams.getComponentName().getPackageName());
}
/**
* @return {@code true} iff the installing is app an device owner or affiliated profile owner.
*/
@@ -1053,9 +1061,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
"DataLoader installation of APEX modules is not allowed.");
}
boolean systemDataLoader = SYSTEM_DATA_LOADER_PACKAGE.equals(
this.params.dataLoaderParams.getComponentName().getPackageName());
if (systemDataLoader && mContext.checkCallingOrSelfPermission(
if (isSystemDataLoaderInstallation() && mContext.checkCallingOrSelfPermission(
Manifest.permission.USE_SYSTEM_DATA_LOADERS)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("You need the "
@@ -2100,6 +2106,23 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
dispatchSessionFinished(error, detailedMessage, null);
}
private void onSystemDataLoaderUnrecoverable() {
final PackageManagerService packageManagerService = mPm;
final String packageName = mPackageName;
if (TextUtils.isEmpty(packageName)) {
// The package has not been installed.
return;
}
mHandler.post(() -> {
if (packageManagerService.deletePackageX(packageName,
PackageManager.VERSION_CODE_HIGHEST, UserHandle.USER_SYSTEM,
PackageManager.DELETE_ALL_USERS, true /*removedBySystem*/)
!= PackageManager.DELETE_SUCCEEDED) {
Slog.e(TAG, "Failed to uninstall package with failed dataloader: " + packageName);
}
});
}
/**
* If session should be sealed, then it's sealed to prevent further modification.
* If the session can't be sealed then it's destroyed.
@@ -3735,6 +3758,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
final DataLoaderParams params = this.params.dataLoaderParams;
final boolean manualStartAndDestroy = !isIncrementalInstallation();
final boolean systemDataLoader = isSystemDataLoaderInstallation();
final IDataLoaderStatusListener statusListener = new IDataLoaderStatusListener.Stub() {
@Override
public void onStatusChanged(int dataLoaderId, int status) {
@@ -3746,10 +3770,15 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
if (mDestroyed || mDataLoaderFinished) {
// No need to worry about post installation
switch (status) {
case IDataLoaderStatusListener.DATA_LOADER_UNRECOVERABLE:
if (systemDataLoader) {
onSystemDataLoaderUnrecoverable();
}
return;
}
return;
}
try {
IDataLoader dataLoader = dataLoaderManager.getDataLoader(dataLoaderId);
if (dataLoader == null) {
@@ -3843,14 +3872,18 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
healthCheckParams.unhealthyTimeoutMs = INCREMENTAL_STORAGE_UNHEALTHY_TIMEOUT_MS;
healthCheckParams.unhealthyMonitoringMs = INCREMENTAL_STORAGE_UNHEALTHY_MONITORING_MS;
final boolean systemDataLoader = SYSTEM_DATA_LOADER_PACKAGE.equals(
params.getComponentName().getPackageName());
final IStorageHealthListener healthListener = new IStorageHealthListener.Stub() {
@Override
public void onHealthStatus(int storageId, int status) {
if (mDestroyed || mDataLoaderFinished) {
// No need to worry about post installation
// App's installed.
switch (status) {
case IStorageHealthListener.HEALTH_STATUS_UNHEALTHY:
if (systemDataLoader) {
onSystemDataLoaderUnrecoverable();
}
return;
}
return;
}