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

Commit 4e282401 authored by Miriam Polzer's avatar Miriam Polzer
Browse files

Show user switch message for non-system user

So far, a DO could only be on system user, and the DO is the only one
who can set user switch messages. With HSUM, this changes, as the DO can
also live in user 10. Change the API and calls to allow for user switch
from and to messages to be configued with a given user, and not a
hardcoded system user.

Fix: 391605774
Test: Manual on tangorpro_hsum:
  m
  adevice update
  g4d -f testdpc
  bash third_party/java_src/testdpc/build-and-install.sh
  adb shell dpm set-device-owner --user 10 com.afwsamples.testdpc/com.afwsamples.testdpc.DeviceAdminReceiver
  Configure user switching message on the device, add a user and switch
Test: CTS verifier user switch message test
Test: btest UserSwitchingMessageTest -n
Flag: EXEMPT BUG_FIX
Change-Id: Ife3cd72690df1172cb334958f5d3f392d425162f
parent 7d96d0a4
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -55,9 +55,7 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.Icon;
import android.hardware.HardwareBuffer;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.Build;
@@ -86,7 +84,6 @@ import android.util.Log;
import android.util.Singleton;
import android.util.Size;
import android.view.WindowInsetsController.Appearance;
import android.window.TaskSnapshot;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.LocalePicker;
@@ -5401,10 +5398,11 @@ public class ActivityManager {
     *
     * @hide
     */
    @Nullable
    @RequiresPermission(Manifest.permission.MANAGE_USERS)
    public @Nullable String getSwitchingFromUserMessage() {
    public String getSwitchingFromUserMessage(@UserIdInt int userId) {
        try {
            return getService().getSwitchingFromUserMessage();
            return getService().getSwitchingFromUserMessage(userId);
        } catch (RemoteException re) {
            throw re.rethrowFromSystemServer();
        }
@@ -5415,10 +5413,11 @@ public class ActivityManager {
     *
     * @hide
     */
    @Nullable
    @RequiresPermission(Manifest.permission.MANAGE_USERS)
    public @Nullable String getSwitchingToUserMessage() {
    public String getSwitchingToUserMessage(@UserIdInt int userId) {
        try {
            return getService().getSwitchingToUserMessage();
            return getService().getSwitchingToUserMessage(userId);
        } catch (RemoteException re) {
            throw re.rethrowFromSystemServer();
        }
+4 −4
Original line number Diff line number Diff line
@@ -292,14 +292,14 @@ public abstract class ActivityManagerInternal {
    public abstract boolean canStartMoreUsers();

    /**
     * Sets the user switcher message for switching from {@link android.os.UserHandle#SYSTEM}.
     * Sets the user switcher message for switching from a user.
     */
    public abstract void setSwitchingFromSystemUserMessage(String switchingFromSystemUserMessage);
    public abstract void setSwitchingFromUserMessage(@UserIdInt int user, @Nullable String message);

    /**
     * Sets the user switcher message for switching to {@link android.os.UserHandle#SYSTEM}.
     * Sets the user switcher message for switching to a user.
     */
    public abstract void setSwitchingToSystemUserMessage(String switchingToSystemUserMessage);
    public abstract void setSwitchingToUserMessage(@UserIdInt int user, @Nullable String message);

    /**
     * Returns maximum number of users that can run simultaneously.
+2 −2
Original line number Diff line number Diff line
@@ -403,8 +403,8 @@ interface IActivityManager {
    void setPackageScreenCompatMode(in String packageName, int mode);
    @UnsupportedAppUsage
    boolean switchUser(int userid);
    String getSwitchingFromUserMessage();
    String getSwitchingToUserMessage();
    String getSwitchingFromUserMessage(int userId);
    String getSwitchingToUserMessage(int userId);
    @UnsupportedAppUsage
    void setStopUserOnSwitch(int value);
    boolean removeTask(int taskId);
+10 −8
Original line number Diff line number Diff line
@@ -16190,14 +16190,16 @@ public class ActivityManagerService extends IActivityManager.Stub
        return mUserController.switchUser(targetUserId);
    }
    @Nullable
    @Override
    public String getSwitchingFromUserMessage() {
        return mUserController.getSwitchingFromSystemUserMessage();
    public String getSwitchingFromUserMessage(@UserIdInt int userId) {
        return mUserController.getSwitchingFromUserMessage(userId);
    }
    @Nullable
    @Override
    public String getSwitchingToUserMessage() {
        return mUserController.getSwitchingToSystemUserMessage();
    public String getSwitchingToUserMessage(@UserIdInt int userId) {
        return mUserController.getSwitchingToUserMessage(userId);
    }
    @Override
@@ -16938,13 +16940,13 @@ public class ActivityManagerService extends IActivityManager.Stub
        }
        @Override
        public void setSwitchingFromSystemUserMessage(String switchingFromSystemUserMessage) {
            mUserController.setSwitchingFromSystemUserMessage(switchingFromSystemUserMessage);
        public void setSwitchingFromUserMessage(@UserIdInt int userId, @Nullable String message) {
            mUserController.setSwitchingFromUserMessage(userId, message);
        }
        @Override
        public void setSwitchingToSystemUserMessage(String switchingToSystemUserMessage) {
            mUserController.setSwitchingToSystemUserMessage(switchingToSystemUserMessage);
        public void setSwitchingToUserMessage(@UserIdInt int userId, @Nullable String message) {
            mUserController.setSwitchingToUserMessage(userId, message);
        }
        @Override
+28 −28
Original line number Diff line number Diff line
@@ -340,16 +340,16 @@ class UserController implements Handler.Callback {
    private volatile ArraySet<String> mCurWaitingUserSwitchCallbacks;

    /**
     * Messages for switching from {@link android.os.UserHandle#SYSTEM}.
     * Message shown when switching from a user.
     */
    @GuardedBy("mLock")
    private String mSwitchingFromSystemUserMessage;
    private final SparseArray<String> mSwitchingFromUserMessage = new SparseArray<>();

    /**
     * Messages for switching to {@link android.os.UserHandle#SYSTEM}.
     * Message shown when switching to a user.
     */
    @GuardedBy("mLock")
    private String mSwitchingToSystemUserMessage;
    private final SparseArray<String> mSwitchingToUserMessage = new SparseArray<>();

    /**
     * Callbacks that are still active after {@link #getUserSwitchTimeoutMs}
@@ -2271,8 +2271,8 @@ class UserController implements Handler.Callback {
    private void showUserSwitchDialog(Pair<UserInfo, UserInfo> fromToUserPair) {
        // The dialog will show and then initiate the user switch by calling startUserInForeground
        mInjector.showUserSwitchingDialog(fromToUserPair.first, fromToUserPair.second,
                getSwitchingFromSystemUserMessageUnchecked(),
                getSwitchingToSystemUserMessageUnchecked(),
                getSwitchingFromUserMessageUnchecked(fromToUserPair.first.id),
                getSwitchingToUserMessageUnchecked(fromToUserPair.second.id),
                /* onShown= */ () -> sendStartUserSwitchFgMessage(fromToUserPair.second.id));
    }

@@ -3388,41 +3388,45 @@ class UserController implements Handler.Callback {
        return mLockPatternUtils.isLockScreenDisabled(userId);
    }

    void setSwitchingFromSystemUserMessage(String switchingFromSystemUserMessage) {
    void setSwitchingFromUserMessage(@UserIdInt int user, @Nullable String message) {
        synchronized (mLock) {
            mSwitchingFromSystemUserMessage = switchingFromSystemUserMessage;
            mSwitchingFromUserMessage.put(user, message);
        }
    }

    void setSwitchingToSystemUserMessage(String switchingToSystemUserMessage) {
    void setSwitchingToUserMessage(@UserIdInt int user, @Nullable String message) {
        synchronized (mLock) {
            mSwitchingToSystemUserMessage = switchingToSystemUserMessage;
            mSwitchingToUserMessage.put(user, message);
        }
    }

    // Called by AMS, must check permission
    String getSwitchingFromSystemUserMessage() {
        checkHasManageUsersPermission("getSwitchingFromSystemUserMessage()");
    @Nullable
    String getSwitchingFromUserMessage(@UserIdInt int userId) {
        checkHasManageUsersPermission("getSwitchingFromUserMessage()");

        return getSwitchingFromSystemUserMessageUnchecked();
        return getSwitchingFromUserMessageUnchecked(userId);
    }

    // Called by AMS, must check permission
    String getSwitchingToSystemUserMessage() {
        checkHasManageUsersPermission("getSwitchingToSystemUserMessage()");
    @Nullable
    String getSwitchingToUserMessage(@UserIdInt int userId) {
        checkHasManageUsersPermission("getSwitchingToUserMessage()");

        return getSwitchingToSystemUserMessageUnchecked();
        return getSwitchingToUserMessageUnchecked(userId);
    }

    private String getSwitchingFromSystemUserMessageUnchecked() {
    @Nullable
    private String getSwitchingFromUserMessageUnchecked(@UserIdInt int userId) {
        synchronized (mLock) {
            return mSwitchingFromSystemUserMessage;
            return mSwitchingFromUserMessage.get(userId);
        }
    }

    private String getSwitchingToSystemUserMessageUnchecked() {
    @Nullable
    private String getSwitchingToUserMessageUnchecked(@UserIdInt int userId) {
        synchronized (mLock) {
            return mSwitchingToSystemUserMessage;
            return mSwitchingToUserMessage.get(userId);
        }
    }

@@ -3518,12 +3522,8 @@ class UserController implements Handler.Callback {
                    + mIsBroadcastSentForSystemUserStarted);
            pw.println("  mIsBroadcastSentForSystemUserStarting:"
                    + mIsBroadcastSentForSystemUserStarting);
            if (mSwitchingFromSystemUserMessage != null) {
                pw.println("  mSwitchingFromSystemUserMessage: " + mSwitchingFromSystemUserMessage);
            }
            if (mSwitchingToSystemUserMessage != null) {
                pw.println("  mSwitchingToSystemUserMessage: " + mSwitchingToSystemUserMessage);
            }
            pw.println("  mSwitchingFromUserMessage:" + mSwitchingFromUserMessage);
            pw.println("  mSwitchingToUserMessage:" + mSwitchingToUserMessage);
            pw.println("  mLastUserUnlockingUptime: " + mLastUserUnlockingUptime);
        }
    }
@@ -4046,7 +4046,7 @@ class UserController implements Handler.Callback {
        }

        void showUserSwitchingDialog(UserInfo fromUser, UserInfo toUser,
                String switchingFromSystemUserMessage, String switchingToSystemUserMessage,
                @Nullable String switchingFromUserMessage, @Nullable String switchingToUserMessage,
                @NonNull Runnable onShown) {
            if (mService.mContext.getPackageManager()
                    .hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
@@ -4059,7 +4059,7 @@ class UserController implements Handler.Callback {
            synchronized (mUserSwitchingDialogLock) {
                dismissUserSwitchingDialog(null);
                mUserSwitchingDialog = new UserSwitchingDialog(mService.mContext, fromUser, toUser,
                        mHandler, switchingFromSystemUserMessage, switchingToSystemUserMessage);
                        mHandler, switchingFromUserMessage, switchingToUserMessage);
                mUserSwitchingDialog.show(onShown);
            }
        }
Loading