summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java22
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java16
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 */);
}
/**