Restore app uninstall on cable disconnect during ADB streaming.

This is a redo of ag/10717946 to keep feature parity with R.

Bug: 182214420
Test: install an app via USB2, disconnect the cable, observe the app
being uninstalled.

Change-Id: I79f34268730ea783c9d64a534417b8460c639c21
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 6b7e729..bf114d8 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -883,6 +883,14 @@
         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.
      */
@@ -1058,9 +1066,7 @@
                         "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 "
@@ -2107,6 +2113,23 @@
         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.
@@ -3740,6 +3763,7 @@
 
         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) {
@@ -3751,10 +3775,15 @@
                 }
 
                 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) {
@@ -3848,14 +3877,18 @@
             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;
                     }