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

Commit 15ea1c90 authored by Yabin Huang's avatar Yabin Huang Committed by Android (Google) Code Review
Browse files

Merge "Modify PhoneWindowManager to avoid interfering with current user's experience" into main

parents caa2c9be 0a332b80
Loading
Loading
Loading
Loading
+77 −4
Original line number Original line Diff line number Diff line
@@ -37,6 +37,7 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.O;
import static android.os.Build.VERSION_CODES.O;
import static android.os.IInputConstants.INVALID_INPUT_DEVICE_ID;
import static android.os.IInputConstants.INVALID_INPUT_DEVICE_ID;
import static android.os.UserManager.isVisibleBackgroundUsersEnabled;
import static android.provider.Settings.Secure.VOLUME_HUSH_OFF;
import static android.provider.Settings.Secure.VOLUME_HUSH_OFF;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
@@ -184,6 +185,7 @@ import android.service.dreams.IDreamManager;
import android.service.vr.IPersistentVrStateCallbacks;
import android.service.vr.IPersistentVrStateCallbacks;
import android.speech.RecognizerIntent;
import android.speech.RecognizerIntent;
import android.telecom.TelecomManager;
import android.telecom.TelecomManager;
import android.util.ArraySet;
import android.util.Log;
import android.util.Log;
import android.util.MathUtils;
import android.util.MathUtils;
import android.util.MutableBoolean;
import android.util.MutableBoolean;
@@ -256,6 +258,7 @@ import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.HashSet;
import java.util.List;
import java.util.List;
import java.util.Set;
import java.util.Set;
@@ -718,6 +721,22 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    // Timeout for showing the keyguard after the screen is on, in case no "ready" is received.
    // Timeout for showing the keyguard after the screen is on, in case no "ready" is received.
    private int mKeyguardDrawnTimeout = 1000;
    private int mKeyguardDrawnTimeout = 1000;


    private final boolean mVisibleBackgroundUsersEnabled = isVisibleBackgroundUsersEnabled();

    // Key codes that should be ignored for visible background users in MUMD environment.
    private static final Set<Integer> KEY_CODES_IGNORED_FOR_VISIBLE_BACKGROUND_USERS =
            new ArraySet<>(Arrays.asList(
                    KeyEvent.KEYCODE_POWER,
                    KeyEvent.KEYCODE_SLEEP,
                    KeyEvent.KEYCODE_WAKEUP,
                    KeyEvent.KEYCODE_CALL,
                    KeyEvent.KEYCODE_ENDCALL,
                    KeyEvent.KEYCODE_ASSIST,
                    KeyEvent.KEYCODE_VOICE_ASSIST,
                    KeyEvent.KEYCODE_MUTE,
                    KeyEvent.KEYCODE_VOLUME_MUTE
            ));

    private static final int MSG_DISPATCH_MEDIA_KEY_WITH_WAKE_LOCK = 3;
    private static final int MSG_DISPATCH_MEDIA_KEY_WITH_WAKE_LOCK = 3;
    private static final int MSG_DISPATCH_MEDIA_KEY_REPEAT_WITH_WAKE_LOCK = 4;
    private static final int MSG_DISPATCH_MEDIA_KEY_REPEAT_WITH_WAKE_LOCK = 4;
    private static final int MSG_KEYGUARD_DRAWN_COMPLETE = 5;
    private static final int MSG_KEYGUARD_DRAWN_COMPLETE = 5;
@@ -811,7 +830,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                    event.recycle();
                    event.recycle();
                    break;
                    break;
                case MSG_HANDLE_ALL_APPS:
                case MSG_HANDLE_ALL_APPS:
                    KeyEvent keyEvent = (KeyEvent) msg.obj;
                    if (isKeyEventForCurrentUser(keyEvent.getDisplayId(), keyEvent.getKeyCode(),
                            "launchAllAppsViaA11y")) {
                        launchAllAppsAction();
                        launchAllAppsAction();
                    }
                    break;
                    break;
                case MSG_RINGER_TOGGLE_CHORD:
                case MSG_RINGER_TOGGLE_CHORD:
                    handleRingerChordGesture();
                    handleRingerChordGesture();
@@ -2082,7 +2105,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            switch (mLongPressOnHomeBehavior) {
            switch (mLongPressOnHomeBehavior) {
                case LONG_PRESS_HOME_ALL_APPS:
                case LONG_PRESS_HOME_ALL_APPS:
                    notifyKeyGestureCompleted(event, KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS);
                    notifyKeyGestureCompleted(event, KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS);
                    if (isKeyEventForCurrentUser(event.getDisplayId(), event.getKeyCode(),
                            "launchAllAppsViaA11y")) {
                        launchAllAppsAction();
                        launchAllAppsAction();
                    }
                    break;
                    break;
                case LONG_PRESS_HOME_ASSIST:
                case LONG_PRESS_HOME_ASSIST:
                    notifyKeyGestureCompleted(event,
                    notifyKeyGestureCompleted(event,
@@ -3763,7 +3789,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                                KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK);
                                KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_CAPS_LOCK);
                    } else if (mPendingMetaAction) {
                    } else if (mPendingMetaAction) {
                        if (!canceled) {
                        if (!canceled) {
                            if (isKeyEventForCurrentUser(event.getDisplayId(), event.getKeyCode(),
                                    "launchAllAppsViaA11y")) {
                                launchAllAppsAction();
                                launchAllAppsAction();
                            }
                            notifyKeyGestureCompleted(event,
                            notifyKeyGestureCompleted(event,
                                    KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS);
                                    KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS);
                        }
                        }
@@ -4030,7 +4059,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                return true;
                return true;
            case KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS:
            case KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS:
            case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_ALL_APPS:
            case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_ALL_APPS:
                if (complete) {
                if (complete && isKeyEventForCurrentUser(event.getDisplayId(),
                        event.getKeycodes()[0], "launchAllAppsViaA11y")) {
                    launchAllAppsAction();
                    launchAllAppsAction();
                }
                }
                return true;
                return true;
@@ -4859,6 +4889,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
        boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
                || event.isWakeKey();
                || event.isWakeKey();


        // There are key events that perform the operation as the current user,
        // and these should be ignored for visible background users.
        if (mVisibleBackgroundUsersEnabled
                && KEY_CODES_IGNORED_FOR_VISIBLE_BACKGROUND_USERS.contains(keyCode)
                && !isKeyEventForCurrentUser(event.getDisplayId(), keyCode, null)) {
            return 0;
        }

        if (!mSystemBooted) {
        if (!mSystemBooted) {
            // If we have not yet booted, don't let key events do anything.
            // If we have not yet booted, don't let key events do anything.
            // Exception: Wake and power key events are forwarded to PowerManager to allow it to
            // Exception: Wake and power key events are forwarded to PowerManager to allow it to
@@ -5866,6 +5904,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    }
    }


    private void wakeUpFromWakeKey(KeyEvent event) {
    private void wakeUpFromWakeKey(KeyEvent event) {
        if (!isKeyEventForCurrentUser(
                event.getDisplayId(), event.getKeyCode(), "wakeUpFromWakeKey")) {
            return;
        }
        wakeUpFromWakeKey(
        wakeUpFromWakeKey(
                event.getEventTime(),
                event.getEventTime(),
                event.getKeyCode(),
                event.getKeyCode(),
@@ -6445,6 +6487,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    // TODO (b/113840485): Move this logic to DisplayPolicy when lockscreen supports multi-display.
    // TODO (b/113840485): Move this logic to DisplayPolicy when lockscreen supports multi-display.
    @Override
    @Override
    public void setAllowLockscreenWhenOn(int displayId, boolean allow) {
    public void setAllowLockscreenWhenOn(int displayId, boolean allow) {
        // We should ignore this operation for visible background users
        // until lockscreen supports multi-display.
        if (mVisibleBackgroundUsersEnabled
                && mUserManagerInternal.getUserAssignedToDisplay(displayId) != mCurrentUserId) {
            return;
        }
        if (allow) {
        if (allow) {
            mAllowLockscreenWhenOnDisplays.add(displayId);
            mAllowLockscreenWhenOnDisplays.add(displayId);
        } else {
        } else {
@@ -7253,4 +7301,29 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }
        }
        return DEFAULT_DISPLAY;
        return DEFAULT_DISPLAY;
    }
    }

    /**
     * This method is intended to prevent key events for visible background users
     * from interfering with the current user's experience in MUMD environment.
     *
     * @param displayId the displayId of the key event.
     * @param keyCode the key code of the event.
     *
     * @return false if the key event is for a visible background user.
     */
    private boolean isKeyEventForCurrentUser(int displayId, int keyCode, @Nullable String purpose) {
        if (!mVisibleBackgroundUsersEnabled) {
            return true;
        }
        int assignedUser = mUserManagerInternal.getUserAssignedToDisplay(displayId);
        if (assignedUser == mCurrentUserId) {
            return true;
        }
        if (DEBUG_INPUT) {
            Slog.w(TAG, "Cannot handle " + KeyEvent.keyCodeToString(keyCode)
                    + (purpose != null ? " to " + purpose : "")
                    + " for visible background user(u" + assignedUser + ")");
        }
        return false;
    }
}
}