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

Commit d5a1e067 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

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

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

Change-Id: Id27362a3dac6b863e93042a8f4c9c3a2674ba550
parents 6d13c45e 306e4769
Loading
Loading
Loading
Loading
+42 −9
Original line number Diff line number Diff line
@@ -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;
                    }