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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user