Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 265ee869 authored by Alex Buynytskyy's avatar Alex Buynytskyy
Browse files

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
parent 0e7cd4bd
Loading
Loading
Loading
Loading
+42 −9
Original line number Diff line number Diff line
@@ -883,6 +883,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.
     */
@@ -1058,9 +1066,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 "
@@ -2107,6 +2113,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.
@@ -3740,6 +3763,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) {
@@ -3751,10 +3775,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) {
@@ -3848,14 +3877,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;
                    }