diff options
3 files changed, 18 insertions, 25 deletions
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index dc75a98c5bdc..097656cac7f7 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -1983,7 +1983,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { public void run() { if (mPendingHomeKeyEvent != null) { handleShortPressOnHome(mPendingHomeKeyEvent); - mPendingHomeKeyEvent.recycle(); mPendingHomeKeyEvent = null; } } @@ -2028,7 +2027,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mDoubleTapOnHomeBehavior != DOUBLE_TAP_HOME_PIP_MENU || mPictureInPictureVisible) { mHandler.removeCallbacks(mHomeDoubleTapTimeoutRunnable); // just in case - mPendingHomeKeyEvent = KeyEvent.obtain(event); + mPendingHomeKeyEvent = event; mHandler.postDelayed(mHomeDoubleTapTimeoutRunnable, ViewConfiguration.getDoubleTapTimeout()); return true; @@ -2036,11 +2035,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } // Post to main thread to avoid blocking input pipeline. - final KeyEvent shortPressEvent = KeyEvent.obtain(event); - mHandler.post(() -> { - handleShortPressOnHome(shortPressEvent); - shortPressEvent.recycle(); - }); + mHandler.post(() -> handleShortPressOnHome(event)); return true; } @@ -2067,14 +2062,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (repeatCount == 0) { mHomePressed = true; if (mPendingHomeKeyEvent != null) { - mPendingHomeKeyEvent.recycle(); mPendingHomeKeyEvent = null; mHandler.removeCallbacks(mHomeDoubleTapTimeoutRunnable); - final KeyEvent doublePressEvent = KeyEvent.obtain(event); - mHandler.post(() -> { - handleDoubleTapOnHome(doublePressEvent); - doublePressEvent.recycle(); - }); + mHandler.post(() -> handleDoubleTapOnHome(event)); // TODO(multi-display): Remove display id check once we support recents on // multi-display } else if (mDoubleTapOnHomeBehavior == DOUBLE_TAP_HOME_RECENT_SYSTEM_UI @@ -2084,11 +2074,7 @@ 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. - final KeyEvent longPressEvent = KeyEvent.obtain(event); - mHandler.post(() -> { - handleLongPressOnHome(longPressEvent); - longPressEvent.recycle(); - }); + mHandler.post(() -> handleLongPressOnHome(event)); } } return true; diff --git a/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java b/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java index 61c4d06131e1..8db09f9e3a16 100644 --- a/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java +++ b/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java @@ -46,6 +46,7 @@ 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; @@ -98,6 +99,10 @@ 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); diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java index 6e2c4bd7e570..ef28ffa7da8f 100644 --- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java +++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java @@ -70,6 +70,7 @@ 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; @@ -77,7 +78,6 @@ 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,11 +184,12 @@ class TestPhoneWindowManager { TestPhoneWindowManager(Context context, boolean supportSettingsUpdate) { MockitoAnnotations.initMocks(this); - mTestLooper = new TestLooper(); - mHandler = new Handler(mTestLooper.getLooper()); + mHandlerThread = new HandlerThread("fake window manager"); + mHandlerThread.start(); + mHandler = new Handler(mHandlerThread.getLooper()); mContext = mockingDetails(context).isSpy() ? context : spy(context); - mHandler.post(() -> setUp(supportSettingsUpdate)); - mTestLooper.dispatchAll(); + mHandler.runWithScissors(() -> setUp(supportSettingsUpdate), 0 /* timeout */); + waitForIdle(); } private void setUp(boolean supportSettingsUpdate) { @@ -300,6 +301,7 @@ class TestPhoneWindowManager { } void tearDown() { + mHandlerThread.quitSafely(); LocalServices.removeServiceForTest(InputMethodManagerInternal.class); Mockito.reset(mPhoneWindowManager); mMockitoSession.finishMocking(); @@ -326,7 +328,7 @@ class TestPhoneWindowManager { } void waitForIdle() { - mTestLooper.dispatchAll(); + mHandler.runWithScissors(() -> { }, 0 /* timeout */); } /** |