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

Commit cf5f2ecc authored by Steven Ng's avatar Steven Ng
Browse files

Avoid registering all apps key gesture when handled by Launcher

Test: mp droid, manually test no crash when registering all apps key events in launcher.
Test: atest WmTests:PhoneWindowManagerTests
Flag: com.android.window.flags.enable_key_gesture_handler_for_recents
Bug: 406452076
Change-Id: I373e6f1c51de86bb1f18148cfd608715abf29275
parent e1d45bfe
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -3627,7 +3627,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                KeyGestureEvent.KEY_GESTURE_TYPE_BRIGHTNESS_UP,
                KeyGestureEvent.KEY_GESTURE_TYPE_BRIGHTNESS_DOWN,
                KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS_SWITCHER,
                KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS,
                KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SEARCH,
                KeyGestureEvent.KEY_GESTURE_TYPE_LANGUAGE_SWITCH,
                KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT,
@@ -3645,6 +3644,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        if (enableVoiceAccessKeyGestures()) {
            supportedGestures.add(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_VOICE_ACCESS);
        }
        if (!com.android.window.flags.Flags.enableKeyGestureHandlerForRecents()) {
            // When enableKeyGestureHandlerForRecents is enabled, the event is handled in the
            // recents app.
            supportedGestures.add(KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS);
        }
        mInputManager.registerKeyGestureEventHandler(supportedGestures,
                PhoneWindowManager.this::handleKeyGestureEvent);
    }
+36 −4
Original line number Diff line number Diff line
@@ -52,17 +52,18 @@ import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.content.Context;
import android.hardware.input.InputManager;
import android.hardware.input.KeyGestureEvent;
import android.os.Bundle;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.PowerManagerInternal;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.service.dreams.DreamManagerInternal;
import android.testing.TestableContext;
import android.view.KeyEvent;

import androidx.test.filters.SmallTest;

@@ -76,6 +77,7 @@ import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.DisplayPolicy;
import com.android.server.wm.DisplayRotation;
import com.android.server.wm.WindowManagerInternal;
import com.android.window.flags.Flags;

import org.junit.After;
import org.junit.Before;
@@ -85,6 +87,8 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.List;

/**
 * Test class for {@link PhoneWindowManager}.
 *
@@ -107,6 +111,7 @@ public class PhoneWindowManagerTests {
    @Mock private IBinder mInputToken;

    PhoneWindowManager mPhoneWindowManager;

    @Mock
    private ActivityTaskManagerInternal mAtmInternal;
    @Mock
@@ -114,6 +119,8 @@ public class PhoneWindowManagerTests {
    @Mock
    private InputManagerInternal mInputManagerInternal;
    @Mock
    private InputManager mInputManager;
    @Mock
    private PowerManagerInternal mPowerManagerInternal;
    @Mock
    private StatusBarManagerInternal mStatusBarManagerInternal;
@@ -156,9 +163,8 @@ public class PhoneWindowManagerTests {
                mock(WindowManagerInternal.class));

        mPhoneWindowManager.mKeyguardDelegate = mKeyguardServiceDelegate;
        final InputManager im = mock(InputManager.class);
        doNothing().when(im).registerKeyGestureEventHandler(anyList(), any());
        doReturn(im).when(mContext).getSystemService(eq(Context.INPUT_SERVICE));
        doNothing().when(mInputManager).registerKeyGestureEventHandler(anyList(), any());
        doReturn(mInputManager).when(mContext).getSystemService(eq(Context.INPUT_SERVICE));
    }

    @After
@@ -426,6 +432,32 @@ public class PhoneWindowManagerTests {
        verify(mDreamManagerInternal).requestDream();
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_KEY_GESTURE_HANDLER_FOR_RECENTS)
    public void testKeyGestureEvents_recentKeyGesturesEventsEnabled_notRegistered() {
        initPhoneWindowManager();

        ArgumentCaptor<List<Integer>> registeredKeyGestureEvents = ArgumentCaptor.forClass(
                List.class);
        verify(mInputManager).registerKeyGestureEventHandler(registeredKeyGestureEvents.capture(),
                any());
        assertThat(registeredKeyGestureEvents.getValue()).doesNotContain(
                KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS);
    }

    @Test
    @DisableFlags(Flags.FLAG_ENABLE_KEY_GESTURE_HANDLER_FOR_RECENTS)
    public void testKeyGestureEvents_recentKeyGesturesEventsDisabled_registered() {
        initPhoneWindowManager();

        ArgumentCaptor<List<Integer>> registeredKeyGestureEvents = ArgumentCaptor.forClass(
                List.class);
        verify(mInputManager).registerKeyGestureEventHandler(registeredKeyGestureEvents.capture(),
                any());
        assertThat(registeredKeyGestureEvents.getValue()).contains(
                KeyGestureEvent.KEY_GESTURE_TYPE_ALL_APPS);
    }

    private void initPhoneWindowManager() {
        mPhoneWindowManager.mDefaultDisplayPolicy = mDisplayPolicy;
        mPhoneWindowManager.mDefaultDisplayRotation = mock(DisplayRotation.class);