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

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

Implement Updating dialogs in new UI

Show appropriate dialog messages and title while updating a preexisting
app

Bug: 274120822
Test: Follow Pia Manual Test Plan
Flag: android.content.pm.use_pia_v2
Change-Id: I5a8bb35ff3f0907a771219d5c08e9a4dfb568048
parent fd56b0df
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@ 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
@@ -79,6 +78,7 @@ class InstallRepository(private val context: Context) {
    private val appOpsManager: AppOpsManager? = context.getSystemService(AppOpsManager::class.java)
    private var isSessionInstall = false
    private var isTrustedSource = false
    private var isAppUpdating = false
    private val _stagingResult = MutableLiveData<InstallStage>()
    val stagingResult: LiveData<InstallStage>
        get() = _stagingResult
@@ -649,7 +649,7 @@ class InstallRepository(private val context: Context) {
                return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
            }
        }
        val isAppUpdating = isAppUpdating(newPackageInfo)
        isAppUpdating = isAppUpdating(newPackageInfo)
        val (existingUpdateOwner, requestedUpdateOwner) =
            getUpdateOwners(newPackageInfo, userActionReason, isAppUpdating)

@@ -666,7 +666,7 @@ class InstallRepository(private val context: Context) {
    private fun processSessionInfo(sessionInfo: SessionInfo, userActionReason: Int): InstallStage {
        newPackageInfo = generateStubPackageInfo(sessionInfo.getAppPackageName())
        appSnippet = getAppSnippet(context, sessionInfo)
        val isAppUpdating = isAppUpdating(newPackageInfo)
        isAppUpdating = isAppUpdating(newPackageInfo)
        val (existingUpdateOwner, requestedUpdateOwner) =
            getUpdateOwners(newPackageInfo, userActionReason, isAppUpdating)

@@ -882,7 +882,7 @@ class InstallRepository(private val context: Context) {
        }
        val installId: Int
        try {
            _installResult.value = InstallInstalling(appSnippet)
            _installResult.value = InstallInstalling(appSnippet, isAppUpdating)
            installId = InstallEventReceiver.addObserver(
                context, EventResultPersister.GENERATE_NEW_ID
            ) { statusCode: Int, legacyStatus: Int, message: String?, serviceId: Int ->
@@ -936,7 +936,14 @@ class InstallRepository(private val context: Context) {
                val intent = packageManager.getLaunchIntentForPackage(newPackageInfo!!.packageName)
                if (isLauncherActivityEnabled(intent)) intent else null
            }
            _installResult.setValue(InstallSuccess(appSnippet, shouldReturnResult, resultIntent))
            _installResult.setValue(
                InstallSuccess(
                    appSnippet,
                    shouldReturnResult,
                    isAppUpdating,
                    resultIntent
                )
            )
        } else {
            // TODO (b/346655018): Use INSTALL_FAILED_ABORTED legacyCode in the condition
            // statusCode can be STATUS_FAILURE_ABORTED if:
+4 −1
Original line number Diff line number Diff line
@@ -62,7 +62,9 @@ data class InstallUserActionRequired(
    }
}

data class InstallInstalling(val appSnippet: PackageUtil.AppSnippet) :
data class InstallInstalling(
    val appSnippet: PackageUtil.AppSnippet,
    val isAppUpdating: Boolean = false) :
    InstallStage(STAGE_INSTALLING) {

    val appIcon: Drawable?
@@ -75,6 +77,7 @@ data class InstallInstalling(val appSnippet: PackageUtil.AppSnippet) :
data class InstallSuccess(
    val appSnippet: PackageUtil.AppSnippet,
    val shouldReturnResult: Boolean = false,
    val isAppUpdating: Boolean = false,
    /**
     *
     * * If the caller is requesting a result back, this will hold an Intent with
+6 −2
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.packageinstaller.v2.ui.fragments;

import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_APP_SNIPPET;
import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_IS_UPDATING;

import android.app.AlertDialog;
import android.app.Dialog;
@@ -58,6 +59,7 @@ public class InstallInstallingFragment extends DialogFragment {
    public static InstallInstallingFragment newInstance(@NonNull InstallInstalling dialogData) {
        Bundle args = new Bundle();
        args.putParcelable(ARGS_APP_SNIPPET, dialogData.getAppSnippet());
        args.putBoolean(ARGS_IS_UPDATING, dialogData.isAppUpdating());

        InstallInstallingFragment fragment = new InstallInstallingFragment();
        fragment.setArguments(args);
@@ -79,7 +81,8 @@ public class InstallInstallingFragment extends DialogFragment {
        ((TextView) dialogView.requireViewById(R.id.app_label)).setText(mDialogData.getAppLabel());

        mDialog = new AlertDialog.Builder(requireContext())
            .setTitle(R.string.title_installing)
            .setTitle(
                mDialogData.isAppUpdating() ? R.string.title_updating : R.string.title_installing)
            .setView(dialogView)
            .create();

@@ -96,6 +99,7 @@ public class InstallInstallingFragment extends DialogFragment {

    private void setDialogData(Bundle args) {
        AppSnippet appSnippet = args.getParcelable(ARGS_APP_SNIPPET, AppSnippet.class);
        mDialogData = new InstallInstalling(appSnippet);
        boolean isAppUpdating = args.getBoolean(ARGS_IS_UPDATING);
        mDialogData = new InstallInstalling(appSnippet, isAppUpdating);
    }
}
+7 −2
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.packageinstaller.v2.ui.fragments;

import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_APP_SNIPPET;
import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_IS_UPDATING;
import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_RESULT_INTENT;
import static com.android.packageinstaller.v2.model.PackageUtil.ARGS_SHOULD_RETURN_RESULT;

@@ -72,6 +73,7 @@ public class InstallSuccessFragment extends DialogFragment {
        Bundle args = new Bundle();
        args.putParcelable(ARGS_APP_SNIPPET, dialogData.getAppSnippet());
        args.putBoolean(ARGS_SHOULD_RETURN_RESULT, dialogData.getShouldReturnResult());
        args.putBoolean(ARGS_IS_UPDATING, dialogData.isAppUpdating());
        args.putParcelable(ARGS_RESULT_INTENT, dialogData.getResultIntent());

        InstallSuccessFragment fragment = new InstallSuccessFragment();
@@ -100,7 +102,8 @@ public class InstallSuccessFragment extends DialogFragment {
        ((TextView) dialogView.requireViewById(R.id.app_label)).setText(mDialogData.getAppLabel());

        mDialog = new AlertDialog.Builder(requireContext())
            .setTitle(R.string.title_installed)
            .setTitle(
                mDialogData.isAppUpdating() ? R.string.title_updated : R.string.title_installed)
            .setView(dialogView)
            .setNegativeButton(R.string.button_done,
                (dialog, which) -> mInstallActionListener.onNegativeResponse(
@@ -143,8 +146,10 @@ public class InstallSuccessFragment extends DialogFragment {
    private void setDialogData(Bundle args) {
        AppSnippet appSnippet = args.getParcelable(ARGS_APP_SNIPPET, AppSnippet.class);
        boolean shouldReturnResult = args.getBoolean(ARGS_SHOULD_RETURN_RESULT);
        boolean isAppUpdating = args.getBoolean(ARGS_IS_UPDATING);
        Intent resultIntent = args.getParcelable(ARGS_RESULT_INTENT, Intent.class);

        mDialogData = new InstallSuccess(appSnippet, shouldReturnResult, resultIntent);
        mDialogData = new InstallSuccess(appSnippet, shouldReturnResult, isAppUpdating,
            resultIntent);
    }
}