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

Commit fd56b0df authored by Sumedh Sen's avatar Sumedh Sen
Browse files

Revert "Implement Reinstall dialogs in new UI"

This reverts commit 82f7c887.

Reason for revert: UX clarified that we dont need "Reinstall" dialogs
Bug: 274120822

Change-Id: Ic34c5203baa956d5e0ef444e4f4d3c7c6419cee5
parent 3df8cf56
Loading
Loading
Loading
Loading
+17 −39
Original line number Diff line number Diff line
@@ -38,10 +38,9 @@ import android.os.UserManager
import android.text.TextUtils
import android.util.EventLog
import android.util.Log

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData

import com.android.packageinstaller.R
import com.android.packageinstaller.common.EventResultPersister
import com.android.packageinstaller.common.EventResultPersister.OutOfIdsException
import com.android.packageinstaller.common.InstallEventReceiver
@@ -53,9 +52,6 @@ import com.android.packageinstaller.v2.model.InstallAborted.Companion.DLG_PACKAG
import com.android.packageinstaller.v2.model.InstallUserActionRequired.Companion.USER_ACTION_REASON_ANONYMOUS_SOURCE
import com.android.packageinstaller.v2.model.InstallUserActionRequired.Companion.USER_ACTION_REASON_INSTALL_CONFIRMATION
import com.android.packageinstaller.v2.model.InstallUserActionRequired.Companion.USER_ACTION_REASON_UNKNOWN_SOURCE
import com.android.packageinstaller.v2.model.PackageUtil.INSTALL_TYPE_NEW
import com.android.packageinstaller.v2.model.PackageUtil.INSTALL_TYPE_REINSTALL
import com.android.packageinstaller.v2.model.PackageUtil.INSTALL_TYPE_UPDATE
import com.android.packageinstaller.v2.model.PackageUtil.canPackageQuery
import com.android.packageinstaller.v2.model.PackageUtil.generateStubPackageInfo
import com.android.packageinstaller.v2.model.PackageUtil.getAppSnippet
@@ -65,16 +61,14 @@ import com.android.packageinstaller.v2.model.PackageUtil.isCallerSessionOwner
import com.android.packageinstaller.v2.model.PackageUtil.isInstallPermissionGrantedOrRequested
import com.android.packageinstaller.v2.model.PackageUtil.isPermissionGranted
import com.android.packageinstaller.v2.model.PackageUtil.localLogv

import java.io.File
import java.io.IOException
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch

import java.io.File
import java.io.IOException

class InstallRepository(private val context: Context) {

    private val packageManager: PackageManager = context.packageManager
@@ -91,7 +85,6 @@ class InstallRepository(private val context: Context) {
    private val _installResult = MutableLiveData<InstallStage>()
    val installResult: LiveData<InstallStage>
        get() = _installResult
    private var installType = INSTALL_TYPE_NEW

    /**
     * Session ID for a session created when caller uses PackageInstaller APIs
@@ -656,13 +649,12 @@ class InstallRepository(private val context: Context) {
                return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
            }
        }
        installType = getInstallType(newPackageInfo)
        val isAppUpdating = isAppUpdating(newPackageInfo)
        val (existingUpdateOwner, requestedUpdateOwner) =
            getUpdateOwners(newPackageInfo, userActionReason,
                /* isAppUpdating= */ (installType != INSTALL_TYPE_NEW))
            getUpdateOwners(newPackageInfo, userActionReason, isAppUpdating)

        return InstallUserActionRequired(USER_ACTION_REASON_INSTALL_CONFIRMATION, appSnippet,
            installType, existingUpdateOwner, requestedUpdateOwner)
            isAppUpdating, existingUpdateOwner, requestedUpdateOwner)
    }

    /**
@@ -674,13 +666,12 @@ class InstallRepository(private val context: Context) {
    private fun processSessionInfo(sessionInfo: SessionInfo, userActionReason: Int): InstallStage {
        newPackageInfo = generateStubPackageInfo(sessionInfo.getAppPackageName())
        appSnippet = getAppSnippet(context, sessionInfo)
        installType = getInstallType(newPackageInfo)
        val isAppUpdating = isAppUpdating(newPackageInfo)
        val (existingUpdateOwner, requestedUpdateOwner) =
            getUpdateOwners(newPackageInfo, userActionReason,
                /* isAppUpdating= */ (installType != INSTALL_TYPE_NEW))
            getUpdateOwners(newPackageInfo, userActionReason, isAppUpdating)

        return InstallUserActionRequired(USER_ACTION_REASON_INSTALL_CONFIRMATION, appSnippet,
            installType, existingUpdateOwner, requestedUpdateOwner)
            isAppUpdating, existingUpdateOwner, requestedUpdateOwner)
    }

    private fun getUpdateOwners(
@@ -736,9 +727,9 @@ class InstallRepository(private val context: Context) {
        }
    }

    private fun getInstallType(newPkgInfo: PackageInfo?): Int {
    private fun isAppUpdating(newPkgInfo: PackageInfo?): Boolean {
        if (newPkgInfo == null) {
            return INSTALL_TYPE_NEW
            return false
        }
        var pkgName = newPkgInfo.packageName
        // Check if there is already a package on the device with this name
@@ -759,25 +750,13 @@ class InstallRepository(private val context: Context) {
                pkgName, PackageManager.MATCH_UNINSTALLED_PACKAGES
            )
            // If the package is archived, treat it as an update case.
            if (appInfo.isArchived) {
                return INSTALL_TYPE_UPDATE
            } else if (appInfo.flags and ApplicationInfo.FLAG_INSTALLED == 0) {
                return INSTALL_TYPE_NEW
            }

            val currentPkgInfo = packageManager.getPackageInfo(
                pkgName, PackageManager.MATCH_UNINSTALLED_PACKAGES)
            val currentVersionCode = currentPkgInfo.longVersionCode
            var newVersionCode = newPkgInfo.longVersionCode

            return if (currentVersionCode == newVersionCode) {
                INSTALL_TYPE_REINSTALL
            } else {
                INSTALL_TYPE_UPDATE
            if (!appInfo.isArchived && appInfo.flags and ApplicationInfo.FLAG_INSTALLED == 0) {
                return false
            }
        } catch (e: PackageManager.NameNotFoundException) {
            return INSTALL_TYPE_NEW
            return false
        }
        return true
    }

    /**
@@ -903,7 +882,7 @@ class InstallRepository(private val context: Context) {
        }
        val installId: Int
        try {
            _installResult.value = InstallInstalling(appSnippet, installType)
            _installResult.value = InstallInstalling(appSnippet)
            installId = InstallEventReceiver.addObserver(
                context, EventResultPersister.GENERATE_NEW_ID
            ) { statusCode: Int, legacyStatus: Int, message: String?, serviceId: Int ->
@@ -957,8 +936,7 @@ class InstallRepository(private val context: Context) {
                val intent = packageManager.getLaunchIntentForPackage(newPackageInfo!!.packageName)
                if (isLauncherActivityEnabled(intent)) intent else null
            }
            _installResult.setValue(
                InstallSuccess(appSnippet, shouldReturnResult, resultIntent, installType))
            _installResult.setValue(InstallSuccess(appSnippet, shouldReturnResult, resultIntent))
        } else {
            // TODO (b/346655018): Use INSTALL_FAILED_ABORTED legacyCode in the condition
            // statusCode can be STATUS_FAILURE_ABORTED if:
+2 −7
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import android.content.Intent
import android.content.pm.PackageInstaller
import android.content.pm.PackageManager
import android.graphics.drawable.Drawable
import com.android.packageinstaller.v2.model.PackageUtil.INSTALL_TYPE_NEW

sealed class InstallStage(val stageCode: Int) {

@@ -44,7 +43,7 @@ class InstallReady : InstallStage(STAGE_READY)
data class InstallUserActionRequired(
    val actionReason: Int,
    val appSnippet: PackageUtil.AppSnippet? = null,
    @PackageUtil.InstallType val installType: Int = INSTALL_TYPE_NEW,
    val isAppUpdating: Boolean = false,
    val existingUpdateOwnerLabel: CharSequence? = null,
    val requestedUpdateOwnerLabel: CharSequence? = null,
    val unknownSourcePackageName: String? = null,
@@ -63,10 +62,7 @@ data class InstallUserActionRequired(
    }
}

data class InstallInstalling(
    val appSnippet: PackageUtil.AppSnippet,
    @PackageUtil.InstallType val installType: Int
) :
data class InstallInstalling(val appSnippet: PackageUtil.AppSnippet) :
    InstallStage(STAGE_INSTALLING) {

    val appIcon: Drawable?
@@ -88,7 +84,6 @@ data class InstallSuccess(
     * the newly installed / updated app if a launchable activity exists.
     */
    val resultIntent: Intent? = null,
    @PackageUtil.InstallType val installType: Int,
) : InstallStage(STAGE_SUCCESS) {

    val appIcon: Drawable?
+3 −17
Original line number Diff line number Diff line
@@ -38,15 +38,11 @@ import android.os.Process
import android.os.UserHandle
import android.os.UserManager
import android.util.Log

import androidx.annotation.IntDef

import com.android.packageinstaller.v2.model.PackageUtil.getAppSnippet
import java.io.ByteArrayOutputStream
import java.io.File
import java.nio.file.Files
import java.nio.file.Path

import kotlinx.parcelize.Parceler
import kotlinx.parcelize.Parcelize

@@ -68,9 +64,11 @@ object PackageUtil {
    const val ARGS_EXISTING_OWNER: String = "existing_owner"
    const val ARGS_INSTALLER_LABEL: String = "installer_label"
    const val ARGS_INSTALLER_PACKAGE: String = "installer_pkg"
    const val ARGS_IS_ARCHIVE: String = "is_archive"
    const val ARGS_IS_CLONE_USER: String = "clone_user"
    const val ARGS_IS_UPDATING: String = "is_updating"
    const val ARGS_LEGACY_CODE: String = "legacy_code"
    const val ARGS_MESSAGE: String = "message"
    const val ARGS_INSTALL_TYPE: String = "new_app_state"
    const val ARGS_NEW_OWNER: String = "new_owner"
    const val ARGS_PENDING_INTENT: String = "pending_intent"
    const val ARGS_REQUIRED_BYTES: String = "required_bytes"
@@ -81,18 +79,6 @@ object PackageUtil {
    const val ARGS_TITLE: String = "title"
    const val ARGS_UNARCHIVAL_STATUS: String = "unarchival_status"

    @IntDef(
        value = [
            INSTALL_TYPE_NEW,
            INSTALL_TYPE_UPDATE,
            INSTALL_TYPE_REINSTALL,
        ])
    @Retention(AnnotationRetention.SOURCE)
    annotation class InstallType
    const val INSTALL_TYPE_NEW = 0
    const val INSTALL_TYPE_UPDATE = 1
    const val INSTALL_TYPE_REINSTALL = 2

    /**
     * Determines if the UID belongs to the system downloads provider and returns the
     * [ApplicationInfo] of the provider
+2 −3
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.packageinstaller.v2.ui.fragments;
import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_ACTION_REASON;
import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_APP_SNIPPET;
import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_SOURCE_PKG;
import static com.android.packageinstaller.v2.model.PackageUtil.INSTALL_TYPE_NEW;

import android.app.AlertDialog;
import android.app.Dialog;
@@ -145,7 +144,7 @@ public class ExternalSourcesBlockedFragment extends DialogFragment {
        AppSnippet appSnippet = args.getParcelable(ARGS_APP_SNIPPET, AppSnippet.class);
        String sourcePkg = args.getString(ARGS_SOURCE_PKG);

        mDialogData = new InstallUserActionRequired(actionReason, appSnippet, INSTALL_TYPE_NEW,
            null, null, sourcePkg);
        mDialogData = new InstallUserActionRequired(actionReason, appSnippet, false, null, null,
            sourcePkg);
    }
}
+22 −37
Original line number Diff line number Diff line
@@ -19,11 +19,8 @@ package com.android.packageinstaller.v2.ui.fragments;
import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_ACTION_REASON;
import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_APP_SNIPPET;
import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_EXISTING_OWNER;
import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_INSTALL_TYPE;
import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_IS_UPDATING;
import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_NEW_OWNER;
import static com.android.packageinstaller.v2.model.PackageUtil.INSTALL_TYPE_NEW;
import static com.android.packageinstaller.v2.model.PackageUtil.INSTALL_TYPE_REINSTALL;
import static com.android.packageinstaller.v2.model.PackageUtil.INSTALL_TYPE_UPDATE;

import android.app.AlertDialog;
import android.app.Dialog;
@@ -74,7 +71,7 @@ public class InstallConfirmationFragment extends DialogFragment {
        Bundle args = new Bundle();
        args.putInt(ARGS_ACTION_REASON, dialogData.getActionReason());
        args.putParcelable(ARGS_APP_SNIPPET, dialogData.getAppSnippet());
        args.putInt(ARGS_INSTALL_TYPE, dialogData.getInstallType());
        args.putBoolean(ARGS_IS_UPDATING, dialogData.isAppUpdating());
        args.putCharSequence(ARGS_EXISTING_OWNER, dialogData.getExistingUpdateOwnerLabel());
        args.putCharSequence(ARGS_NEW_OWNER, dialogData.getRequestedUpdateOwnerLabel());

@@ -104,16 +101,7 @@ public class InstallConfirmationFragment extends DialogFragment {

        int positiveBtnTextRes;
        String title;
        switch (mDialogData.getInstallType()) {
            case INSTALL_TYPE_NEW -> {
                title = getString(R.string.title_install);
                positiveBtnTextRes = R.string.button_install;
            }
            case INSTALL_TYPE_REINSTALL -> {
                title = getString(R.string.title_reinstall);
                positiveBtnTextRes = R.string.button_reinstall;
            }
            case INSTALL_TYPE_UPDATE -> {
        if (mDialogData.isAppUpdating()) {
            if (mDialogData.getExistingUpdateOwnerLabel() != null
                    && mDialogData.getRequestedUpdateOwnerLabel() != null) {
                title = getString(R.string.title_update_ownership_change,
@@ -124,19 +112,16 @@ public class InstallConfirmationFragment extends DialogFragment {
                customMessage.setVisibility(View.VISIBLE);
                String updateOwnerString = getString(R.string.message_update_owner_change,
                        mDialogData.getExistingUpdateOwnerLabel());
                    customMessage.setText(
                            Html.fromHtml(updateOwnerString, Html.FROM_HTML_MODE_LEGACY));
                customMessage.setText(Html.fromHtml(updateOwnerString, Html.FROM_HTML_MODE_LEGACY));
                customMessage.setMovementMethod(new ScrollingMovementMethod());
            } else {
                title = getString(R.string.title_update);
                positiveBtnTextRes = R.string.button_update;
            }
            }
            default -> {
        } else {
            title = getString(R.string.title_install);
            positiveBtnTextRes = R.string.button_install;
        }
        }

        mDialog = new AlertDialog.Builder(requireContext())
            .setTitle(title)
@@ -181,11 +166,11 @@ public class InstallConfirmationFragment extends DialogFragment {
    private void setDialogData(Bundle args) {
        int actionReason = args.getInt(ARGS_ACTION_REASON);
        AppSnippet appSnippet = args.getParcelable(ARGS_APP_SNIPPET, AppSnippet.class);
        int installType = args.getInt(ARGS_INSTALL_TYPE);
        boolean isUpdating = args.getBoolean(ARGS_IS_UPDATING);
        CharSequence existingOwner = args.getCharSequence(ARGS_EXISTING_OWNER);
        CharSequence newOwner = args.getCharSequence(ARGS_NEW_OWNER);

        mDialogData = new InstallUserActionRequired(actionReason, appSnippet, installType,
        mDialogData = new InstallUserActionRequired(actionReason, appSnippet, isUpdating,
            existingOwner, newOwner, null);
    }
}
Loading