From 8e8e721f61625ae013da5fbae42f7f192083be04 Mon Sep 17 00:00:00 2001 From: Yan-De Chen Date: Thu, 4 Nov 2021 06:33:22 +0000 Subject: [PATCH] Revert "TouchMode (5/n) Implementing onTouchModeChanged" This reverts commit 487559898c52a9a3baed8dde6a2d26936bef4918. Reason for revert: Broken test(b/205063292) Change-Id: I477ab2ca44571d99f46fe53e38033a6746522c7e --- .../java/android/view/InputEventReceiver.java | 4 +- core/java/android/view/ViewRootImpl.java | 47 ++------- .../src/android/view/ViewRootImplTest.java | 98 +++++-------------- 3 files changed, 35 insertions(+), 114 deletions(-) diff --git a/core/java/android/view/InputEventReceiver.java b/core/java/android/view/InputEventReceiver.java index 2165f55fbd608..2884d2279bfd2 100644 --- a/core/java/android/view/InputEventReceiver.java +++ b/core/java/android/view/InputEventReceiver.java @@ -174,10 +174,10 @@ public abstract class InputEventReceiver { * Called when the display for the window associated with the input channel has entered or * exited touch mode. * - * @param inTouchMode {@code true} if the display showing the window associated with the + * @param isInTouchMode {@code true} if the display showing the window associated with the * input channel entered touch mode. */ - public void onTouchModeChanged(boolean inTouchMode) { + public void onTouchModeChanged(boolean isInTouchMode) { } /** diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 467c9775e8f90..4879206d61907 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -3384,12 +3384,14 @@ public final class ViewRootImpl implements ViewParent, private void handleWindowFocusChanged() { final boolean hasWindowFocus; + final boolean inTouchMode; synchronized (this) { if (!mWindowFocusChanged) { return; } mWindowFocusChanged = false; hasWindowFocus = mUpcomingWindowFocus; + inTouchMode = mUpcomingInTouchMode; } // TODO (b/131181940): Make sure this doesn't leak Activity with mActivityConfigCallback // config changes. @@ -3402,7 +3404,9 @@ public final class ViewRootImpl implements ViewParent, if (mAdded) { profileRendering(hasWindowFocus); + if (hasWindowFocus) { + ensureTouchModeLocally(inTouchMode); if (mAttachInfo.mThreadedRenderer != null && mSurface.isValid()) { mFullRedrawNeeded = true; try { @@ -3474,14 +3478,6 @@ public final class ViewRootImpl implements ViewParent, } } - private void handleWindowTouchModeChanged() { - final boolean inTouchMode; - synchronized (this) { - inTouchMode = mUpcomingInTouchMode; - } - ensureTouchModeLocally(inTouchMode); - } - private void fireAccessibilityFocusEventIfHasFocusedNode() { if (!AccessibilityManager.getInstance(mContext).isEnabled()) { return; @@ -5139,7 +5135,6 @@ public final class ViewRootImpl implements ViewParent, private static final int MSG_SHOW_INSETS = 34; private static final int MSG_HIDE_INSETS = 35; private static final int MSG_REQUEST_SCROLL_CAPTURE = 36; - private static final int MSG_WINDOW_TOUCH_MODE_CHANGED = 37; final class ViewRootHandler extends Handler { @@ -5206,8 +5201,6 @@ public final class ViewRootImpl implements ViewParent, return "MSG_SHOW_INSETS"; case MSG_HIDE_INSETS: return "MSG_HIDE_INSETS"; - case MSG_WINDOW_TOUCH_MODE_CHANGED: - return "MSG_WINDOW_TOUCH_MODE_CHANGED"; } return super.getMessageName(message); } @@ -5330,12 +5323,9 @@ public final class ViewRootImpl implements ViewParent, case MSG_WINDOW_FOCUS_CHANGED: { handleWindowFocusChanged(); } break; - case MSG_WINDOW_TOUCH_MODE_CHANGED: { - handleWindowTouchModeChanged(); - } break; - case MSG_DIE: { + case MSG_DIE: doDie(); - } break; + break; case MSG_DISPATCH_INPUT_EVENT: { SomeArgs args = (SomeArgs) msg.obj; InputEvent event = (InputEvent) args.arg1; @@ -8705,11 +8695,6 @@ public final class ViewRootImpl implements ViewParent, windowFocusChanged(hasFocus, inTouchMode); } - @Override - public void onTouchModeChanged(boolean inTouchMode) { - touchModeChanged(inTouchMode); - } - @Override public void onPointerCaptureEvent(boolean pointerCaptureEnabled) { dispatchPointerCaptureChanged(pointerCaptureEnabled); @@ -8968,30 +8953,14 @@ public final class ViewRootImpl implements ViewParent, mHandler.sendMessage(msg); } - /** - * Notifies this {@link ViewRootImpl} object that window focus has changed. - */ - public void windowFocusChanged(boolean hasFocus, boolean unusedInTouchMode) { - // TODO(b/193718270): Delete unused inTouchMode parameter here once fully removing touch - // mode status from focus event. + public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) { synchronized (this) { mWindowFocusChanged = true; mUpcomingWindowFocus = hasFocus; - } - Message msg = Message.obtain(); - msg.what = MSG_WINDOW_FOCUS_CHANGED; - mHandler.sendMessage(msg); - } - - /** - * Notifies this {@link ViewRootImpl} object that touch mode state has changed. - */ - public void touchModeChanged(boolean inTouchMode) { - synchronized (this) { mUpcomingInTouchMode = inTouchMode; } Message msg = Message.obtain(); - msg.what = MSG_WINDOW_TOUCH_MODE_CHANGED; + msg.what = MSG_WINDOW_FOCUS_CHANGED; mHandler.sendMessage(msg); } diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java index 882a0da2d97f0..e0d9ecfcb336f 100644 --- a/core/tests/coretests/src/android/view/ViewRootImplTest.java +++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java @@ -31,14 +31,12 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; -import static com.google.common.truth.Truth.assertThat; -import static com.google.common.truth.Truth.assertWithMessage; +import static androidx.test.InstrumentationRegistry.getInstrumentation; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import android.app.Instrumentation; import android.content.Context; import android.os.Binder; import android.platform.test.annotations.Presubmit; @@ -49,9 +47,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; -import org.junit.AfterClass; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; @@ -62,7 +58,7 @@ import java.util.concurrent.TimeUnit; * Tests for {@link ViewRootImpl} * * Build/Install/Run: - * atest FrameworksCoreTests:ViewRootImplTest + * atest FrameworksCoreTests:ViewRootImplTest */ @Presubmit @SmallTest @@ -70,32 +66,15 @@ import java.util.concurrent.TimeUnit; public class ViewRootImplTest { private ViewRootImpl mViewRootImpl; + private Context mContext; private volatile boolean mKeyReceived = false; - private static Context sContext; - private static Instrumentation sInstrumentation = InstrumentationRegistry.getInstrumentation(); - - // The touch mode state before the test was started, needed to return the system to the original - // state after the test completes. - private static boolean sOriginalTouchMode; - - @BeforeClass - public static void setUpClass() { - sContext = sInstrumentation.getTargetContext(); - View view = new View(sContext); - sOriginalTouchMode = view.isInTouchMode(); - } - - @AfterClass - public static void tearDownClass() { - sInstrumentation.setInTouchMode(sOriginalTouchMode); - } - @Before public void setUp() throws Exception { - sInstrumentation.setInTouchMode(true); - sInstrumentation.runOnMainSync(() -> - mViewRootImpl = new ViewRootImpl(sContext, sContext.getDisplayNoVerify())); + mContext = getInstrumentation().getTargetContext(); + + getInstrumentation().runOnMainSync(() -> + mViewRootImpl = new ViewRootImpl(mContext, mContext.getDisplayNoVerify())); } @Test @@ -245,9 +224,9 @@ public class ViewRootImplTest { */ @Test public void requestScrollCapture_timeout() { - final View view = new View(sContext); + final View view = new View(mContext); view.setScrollCaptureCallback(new TestScrollCaptureCallback()); // Does nothing - sInstrumentation.runOnMainSync(() -> { + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY); // Set a fake token to bypass 'is your activity running' check @@ -271,29 +250,6 @@ public class ViewRootImplTest { } catch (InterruptedException e) { /* ignore */ } } - @Test - public void whenTouchModeChanges_viewRootIsNotified() throws Exception { - View view = new View(sContext); - attachViewToWindow(view); - ViewTreeObserver viewTreeObserver = view.getRootView().getViewTreeObserver(); - CountDownLatch latch = new CountDownLatch(1); - ViewTreeObserver.OnTouchModeChangeListener touchModeListener = (boolean inTouchMode) -> { - assertWithMessage("addOnTouchModeChangeListener parameter").that( - inTouchMode).isFalse(); - latch.countDown(); - }; - viewTreeObserver.addOnTouchModeChangeListener(touchModeListener); - - try { - view.requestFocusFromTouch(); - - assertThat(latch.await(1, TimeUnit.SECONDS)).isTrue(); - assertThat(view.isInTouchMode()).isFalse(); - } finally { - viewTreeObserver.removeOnTouchModeChangeListener(touchModeListener); - } - } - /** * When window doesn't have focus, keys should be dropped. */ @@ -352,31 +308,27 @@ public class ViewRootImplTest { * Next, inject an event into this view, and check whether it is received. */ private void checkKeyEvent(Runnable setup, boolean shouldReceiveKey) { - final KeyView view = new KeyView(sContext); + final KeyView view = new KeyView(mContext); - attachViewToWindow(view); - - mViewRootImpl = view.getViewRootImpl(); - sInstrumentation.runOnMainSync(setup); - sInstrumentation.waitForIdleSync(); - - // Inject a key event, and wait for it to be processed - sInstrumentation.runOnMainSync(() -> { - KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A); - mViewRootImpl.dispatchInputEvent(event); - }); - sInstrumentation.waitForIdleSync(); - assertEquals(mKeyReceived, shouldReceiveKey); - } - - private void attachViewToWindow(View view) { WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY); wmlp.token = new Binder(); // Set a fake token to bypass 'is your activity running' check - sInstrumentation.runOnMainSync(() -> { - WindowManager wm = sContext.getSystemService(WindowManager.class); + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { + WindowManager wm = mContext.getSystemService(WindowManager.class); wm.addView(view, wmlp); }); - sInstrumentation.waitForIdleSync(); + InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + + mViewRootImpl = view.getViewRootImpl(); + InstrumentationRegistry.getInstrumentation().runOnMainSync(setup); + InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + + // Inject a key event, and wait for it to be processed + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { + KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A); + mViewRootImpl.dispatchInputEvent(event); + }); + InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + assertEquals(mKeyReceived, shouldReceiveKey); } }