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

Commit c1845792 authored by Alexandra-Mara Smau's avatar Alexandra-Mara Smau
Browse files

Fix press HOME logging tests.

The logic to log the system event triggered by the key press is executed after the tests check if the system event was logged. This happens when:
1. PhoneWindowManager posts handleShortPressOnHome, message queue: [handleShortPressOnHome]
2. TestPhoneWindowManager posts runWithScissors, message queue: [handleShortPressOnHome, runWithScissors]
3. Handler runs handleShortPressOnHome, which posts logKeyboardSystemsEvent, message queue: [runWithScissors, logKeyboardSystemsEvent]
4. Handler runs runWithScissors, fails the assertion that keyboardSystemEvent was logged, message queue: [logKeyboardSystemsEvent]
5. Handler runs logKeyboardSystemsEvent, message queue: []

A copy of the KeyEvent is needed, because the KeyEvent gets recycle later on.

Test: atest ShortcutLoggingTests
Change-Id: I0878bb616296ebbed4bf2a7e9479a970c3eb6bce
Bug: b/300023716
parent 7f9d72ca
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -1983,6 +1983,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            public void run() {
                if (mPendingHomeKeyEvent != null) {
                    handleShortPressOnHome(mPendingHomeKeyEvent);
                    mPendingHomeKeyEvent.recycle();
                    mPendingHomeKeyEvent = null;
                }
            }
@@ -2027,7 +2028,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                    if (mDoubleTapOnHomeBehavior != DOUBLE_TAP_HOME_PIP_MENU
                            || mPictureInPictureVisible) {
                        mHandler.removeCallbacks(mHomeDoubleTapTimeoutRunnable); // just in case
                        mPendingHomeKeyEvent = event;
                        mPendingHomeKeyEvent = KeyEvent.obtain(event);
                        mHandler.postDelayed(mHomeDoubleTapTimeoutRunnable,
                                ViewConfiguration.getDoubleTapTimeout());
                        return true;
@@ -2035,7 +2036,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                }

                // Post to main thread to avoid blocking input pipeline.
                mHandler.post(() -> handleShortPressOnHome(event));
                final KeyEvent shortPressEvent = KeyEvent.obtain(event);
                mHandler.post(() -> {
                    handleShortPressOnHome(shortPressEvent);
                    shortPressEvent.recycle();
                });
                return true;
            }

@@ -2062,9 +2067,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            if (repeatCount == 0) {
                mHomePressed = true;
                if (mPendingHomeKeyEvent != null) {
                    mPendingHomeKeyEvent.recycle();
                    mPendingHomeKeyEvent = null;
                    mHandler.removeCallbacks(mHomeDoubleTapTimeoutRunnable);
                    mHandler.post(() -> handleDoubleTapOnHome(event));
                    final KeyEvent doublePressEvent = KeyEvent.obtain(event);
                    mHandler.post(() -> {
                        handleDoubleTapOnHome(doublePressEvent);
                        doublePressEvent.recycle();
                    });
                // TODO(multi-display): Remove display id check once we support recents on
                // multi-display
                } else if (mDoubleTapOnHomeBehavior == DOUBLE_TAP_HOME_RECENT_SYSTEM_UI
@@ -2074,7 +2084,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            } else if ((event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0) {
                if (!keyguardOn) {
                    // Post to main thread to avoid blocking input pipeline.
                    mHandler.post(() -> handleLongPressOnHome(event));
                    final KeyEvent longPressEvent = KeyEvent.obtain(event);
                    mHandler.post(() -> {
                        handleLongPressOnHome(longPressEvent);
                        longPressEvent.recycle();
                    });
                }
            }
            return true;
+0 −5
Original line number Diff line number Diff line
@@ -46,7 +46,6 @@ import static com.android.server.policy.WindowManagerPolicy.ACTION_PASS_TO_USER;
import static java.util.Collections.unmodifiableMap;

import android.content.Context;
import android.os.Looper;
import android.os.SystemClock;
import android.util.ArrayMap;
import android.view.InputDevice;
@@ -99,10 +98,6 @@ class ShortcutKeyTestBase {
     *      settings values.
     */
    protected final void setUpPhoneWindowManager(boolean supportSettingsUpdate) {
        if (Looper.myLooper() == null) {
            Looper.prepare();
        }

        doReturn(mSettingsProviderRule.mockContentResolver(mContext))
                .when(mContext).getContentResolver();
        mPhoneWindowManager = new TestPhoneWindowManager(mContext, supportSettingsUpdate);
+7 −9
Original line number Diff line number Diff line
@@ -70,7 +70,6 @@ import android.hardware.display.DisplayManagerInternal;
import android.hardware.input.InputManager;
import android.media.AudioManagerInternal;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.PowerManagerInternal;
@@ -78,6 +77,7 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.os.Vibrator;
import android.os.VibratorInfo;
import android.os.test.TestLooper;
import android.service.dreams.DreamManagerInternal;
import android.telecom.TelecomManager;
import android.util.FeatureFlagUtils;
@@ -160,8 +160,8 @@ class TestPhoneWindowManager {
    @Mock private KeyguardServiceDelegate mKeyguardServiceDelegate;

    private StaticMockitoSession mMockitoSession;
    private HandlerThread mHandlerThread;
    private Handler mHandler;
    private TestLooper mTestLooper;

    private class TestInjector extends PhoneWindowManager.Injector {
        TestInjector(Context context, WindowManagerPolicy.WindowManagerFuncs funcs) {
@@ -184,12 +184,11 @@ class TestPhoneWindowManager {

    TestPhoneWindowManager(Context context, boolean supportSettingsUpdate) {
        MockitoAnnotations.initMocks(this);
        mHandlerThread = new HandlerThread("fake window manager");
        mHandlerThread.start();
        mHandler = new Handler(mHandlerThread.getLooper());
        mTestLooper = new TestLooper();
        mHandler = new Handler(mTestLooper.getLooper());
        mContext = mockingDetails(context).isSpy() ? context : spy(context);
        mHandler.runWithScissors(() -> setUp(supportSettingsUpdate),  0 /* timeout */);
        waitForIdle();
        mHandler.post(() -> setUp(supportSettingsUpdate));
        mTestLooper.dispatchAll();
    }

    private void setUp(boolean supportSettingsUpdate) {
@@ -301,7 +300,6 @@ class TestPhoneWindowManager {
    }

    void tearDown() {
        mHandlerThread.quitSafely();
        LocalServices.removeServiceForTest(InputMethodManagerInternal.class);
        Mockito.reset(mPhoneWindowManager);
        mMockitoSession.finishMocking();
@@ -328,7 +326,7 @@ class TestPhoneWindowManager {
    }

    void waitForIdle() {
        mHandler.runWithScissors(() -> { }, 0 /* timeout */);
        mTestLooper.dispatchAll();
    }

    /**