diff options
Diffstat (limited to 'core/java/android/view/ViewRootImpl.java')
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index b8215b5a8347..78dc57a94840 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -3376,14 +3376,12 @@ 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. @@ -3396,9 +3394,7 @@ public final class ViewRootImpl implements ViewParent, if (mAdded) { profileRendering(hasWindowFocus); - if (hasWindowFocus) { - ensureTouchModeLocally(inTouchMode); if (mAttachInfo.mThreadedRenderer != null && mSurface.isValid()) { mFullRedrawNeeded = true; try { @@ -3470,6 +3466,14 @@ 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; @@ -5127,6 +5131,7 @@ 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 { @@ -5193,6 +5198,8 @@ 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); } @@ -5315,9 +5322,12 @@ public final class ViewRootImpl implements ViewParent, case MSG_WINDOW_FOCUS_CHANGED: { handleWindowFocusChanged(); } break; - case MSG_DIE: + case MSG_WINDOW_TOUCH_MODE_CHANGED: { + handleWindowTouchModeChanged(); + } break; + case MSG_DIE: { doDie(); - break; + } break; case MSG_DISPATCH_INPUT_EVENT: { SomeArgs args = (SomeArgs) msg.obj; InputEvent event = (InputEvent) args.arg1; @@ -8688,6 +8698,11 @@ public final class ViewRootImpl implements ViewParent, } @Override + public void onTouchModeChanged(boolean inTouchMode) { + touchModeChanged(inTouchMode); + } + + @Override public void onPointerCaptureEvent(boolean pointerCaptureEnabled) { dispatchPointerCaptureChanged(pointerCaptureEnabled); } @@ -8945,17 +8960,33 @@ public final class ViewRootImpl implements ViewParent, mHandler.sendMessage(msg); } - public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) { + /** + * Notifies this {@link ViewRootImpl} object that window focus has changed. + */ + public void windowFocusChanged(boolean hasFocus, boolean unusedInTouchMode) { + // TODO(b/193718270): Remove inTouchMode parameter from this method and update related code + // accordingly. synchronized (this) { mWindowFocusChanged = true; mUpcomingWindowFocus = hasFocus; - mUpcomingInTouchMode = inTouchMode; } 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; + mHandler.sendMessage(msg); + } + public void dispatchWindowShown() { mHandler.sendEmptyMessage(MSG_DISPATCH_WINDOW_SHOWN); } |
