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

Commit 4de1f637 authored by Sumedh Sen's avatar Sumedh Sen
Browse files

Compute dialog message when target user is different from current user

Check the target user type and compute the dialog message accordingly.

Bug: 182205982
Test: builds successfully
Test: No CTS Tests. Flag to use new app is turned off by default

Change-Id: Iabf6343bcd9a8c4bb1e26b03075f1f946c30b79c
parent de13b994
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package com.android.packageinstaller.v2.model;

import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.os.UserManager.USER_TYPE_PROFILE_CLONE;
import static android.os.UserManager.USER_TYPE_PROFILE_MANAGED;
import static com.android.packageinstaller.v2.model.PackageUtil.getMaxTargetSdkVersionForUid;
import static com.android.packageinstaller.v2.model.PackageUtil.getPackageNameForUid;
import static com.android.packageinstaller.v2.model.PackageUtil.isPermissionGranted;
@@ -40,6 +42,7 @@ import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Log;
import androidx.annotation.Nullable;
import com.android.packageinstaller.R;
import com.android.packageinstaller.v2.model.uninstallstagedata.UninstallAborted;
import com.android.packageinstaller.v2.model.uninstallstagedata.UninstallReady;
@@ -201,6 +204,26 @@ public class UninstallRepository {
        } else if (mUninstallFromAllUsers && !isSingleUser) {
            messageBuilder.append(mContext.getString(
                R.string.uninstall_application_text_all_users));
        } else if (!mUninstalledUser.equals(myUserHandle)) {
            // Uninstalling user is issuing uninstall for another user
            UserManager customUserManager = mContext.createContextAsUser(mUninstalledUser, 0)
                .getSystemService(UserManager.class);
            String userName = customUserManager.getUserName();

            String uninstalledUserType = getUninstalledUserType(myUserHandle, mUninstalledUser);
            String messageString;
            if (USER_TYPE_PROFILE_MANAGED.equals(uninstalledUserType)) {
                messageString = mContext.getString(
                    R.string.uninstall_application_text_current_user_work_profile, userName);
            } else if (USER_TYPE_PROFILE_CLONE.equals(uninstalledUserType)) {
                mIsClonedApp = true;
                messageString = mContext.getString(
                    R.string.uninstall_application_text_current_user_clone_profile);
            } else {
                messageString = mContext.getString(
                    R.string.uninstall_application_text_user, userName);
            }
            messageBuilder.append(messageString);
        } else if (isCloneProfile(mUninstalledUser)) {
            mIsClonedApp = true;
            messageBuilder.append(mContext.getString(
@@ -236,6 +259,29 @@ public class UninstallRepository {
        return userCount == 1 || (UserManager.isHeadlessSystemUserMode() && userCount == 2);
    }

    /**
     * Returns the type of the user from where an app is being uninstalled. We are concerned with
     * only USER_TYPE_PROFILE_MANAGED and USER_TYPE_PROFILE_CLONE and whether the user and profile
     * belong to the same profile group.
     */
    @Nullable
    private String getUninstalledUserType(UserHandle myUserHandle,
        UserHandle uninstalledUserHandle) {
        if (!mUserManager.isSameProfileGroup(myUserHandle, uninstalledUserHandle)) {
            return null;
        }

        UserManager customUserManager = mContext.createContextAsUser(uninstalledUserHandle, 0)
            .getSystemService(UserManager.class);
        String[] userTypes = {USER_TYPE_PROFILE_MANAGED, USER_TYPE_PROFILE_CLONE};
        for (String userType : userTypes) {
            if (customUserManager.isUserOfType(userType)) {
                return userType;
            }
        }
        return null;
    }

    private boolean hasClonedInstance(String packageName) {
        // Check if clone user is present on the device.
        UserHandle cloneUser = null;