diff options
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 34 | ||||
| -rw-r--r-- | core/java/android/view/Window.java | 14 | ||||
| -rw-r--r-- | core/java/android/view/WindowManager.java | 14 | ||||
| -rw-r--r-- | core/java/android/widget/ZoomButtonsController.java | 2 |
4 files changed, 49 insertions, 15 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 1f7ff9b..3977a33 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -608,6 +608,11 @@ public final class ViewRootImpl implements ViewParent, } } + /** Whether the window is in local focus mode or not */ + private boolean isInLocalFocusMode() { + return (mWindowAttributes.flags & WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE) != 0; + } + void destroyHardwareResources() { if (mAttachInfo.mHardwareRenderer != null) { if (mAttachInfo.mHardwareRenderer.isEnabled()) { @@ -1818,7 +1823,7 @@ public final class ViewRootImpl implements ViewParent, mNewSurfaceNeeded = false; mViewVisibility = viewVisibility; - if (mAttachInfo.mHasWindowFocus) { + if (mAttachInfo.mHasWindowFocus && !isInLocalFocusMode()) { final boolean imTarget = WindowManager.LayoutParams .mayUseInputMethod(mWindowAttributes.flags); if (imTarget != mLastWasImTarget) { @@ -2906,7 +2911,7 @@ public final class ViewRootImpl implements ViewParent, private final static int MSG_RESIZED = 4; private final static int MSG_RESIZED_REPORT = 5; private final static int MSG_WINDOW_FOCUS_CHANGED = 6; - private final static int MSG_DISPATCH_KEY = 7; + private final static int MSG_DISPATCH_INPUT_EVENT = 7; private final static int MSG_DISPATCH_APP_VISIBILITY = 8; private final static int MSG_DISPATCH_GET_NEW_SURFACE = 9; private final static int MSG_DISPATCH_KEY_FROM_IME = 11; @@ -2941,8 +2946,8 @@ public final class ViewRootImpl implements ViewParent, return "MSG_RESIZED_REPORT"; case MSG_WINDOW_FOCUS_CHANGED: return "MSG_WINDOW_FOCUS_CHANGED"; - case MSG_DISPATCH_KEY: - return "MSG_DISPATCH_KEY"; + case MSG_DISPATCH_INPUT_EVENT: + return "MSG_DISPATCH_INPUT_EVENT"; case MSG_DISPATCH_APP_VISIBILITY: return "MSG_DISPATCH_APP_VISIBILITY"; case MSG_DISPATCH_GET_NEW_SURFACE: @@ -3092,7 +3097,8 @@ public final class ViewRootImpl implements ViewParent, InputMethodManager imm = InputMethodManager.peekInstance(); if (mView != null) { - if (hasWindowFocus && imm != null && mLastWasImTarget) { + if (hasWindowFocus && imm != null && mLastWasImTarget && + !isInLocalFocusMode()) { imm.startGettingWindowFocus(mView); } mAttachInfo.mKeyDispatchState.reset(); @@ -3103,7 +3109,7 @@ public final class ViewRootImpl implements ViewParent, // Note: must be done after the focus change callbacks, // so all of the view state is set up correctly. if (hasWindowFocus) { - if (imm != null && mLastWasImTarget) { + if (imm != null && mLastWasImTarget && !isInLocalFocusMode()) { imm.onWindowFocus(mView, mView.findFocus(), mWindowAttributes.softInputMode, !mHasHadWindowFocus, mWindowAttributes.flags); @@ -3131,8 +3137,8 @@ public final class ViewRootImpl implements ViewParent, case MSG_DIE: doDie(); break; - case MSG_DISPATCH_KEY: { - KeyEvent event = (KeyEvent)msg.obj; + case MSG_DISPATCH_INPUT_EVENT: { + InputEvent event = (InputEvent)msg.obj; enqueueInputEvent(event, null, 0, true); } break; case MSG_DISPATCH_KEY_FROM_IME: { @@ -3222,7 +3228,9 @@ public final class ViewRootImpl implements ViewParent, // tell the window manager try { - mWindowSession.setInTouchMode(inTouchMode); + if (!isInLocalFocusMode()) { + mWindowSession.setInTouchMode(inTouchMode); + } } catch (RemoteException e) { throw new RuntimeException(e); } @@ -3624,7 +3632,7 @@ public final class ViewRootImpl implements ViewParent, @Override protected int onProcess(QueuedInputEvent q) { - if (mLastWasImTarget) { + if (mLastWasImTarget && !isInLocalFocusMode()) { InputMethodManager imm = InputMethodManager.peekInstance(); if (imm != null) { final InputEvent event = q.mEvent; @@ -5666,8 +5674,8 @@ public final class ViewRootImpl implements ViewParent, mInvalidateOnAnimationRunnable.removeView(view); } - public void dispatchKey(KeyEvent event) { - Message msg = mHandler.obtainMessage(MSG_DISPATCH_KEY, event); + public void dispatchInputEvent(InputEvent event) { + Message msg = mHandler.obtainMessage(MSG_DISPATCH_INPUT_EVENT, event); msg.setAsynchronous(true); mHandler.sendMessage(msg); } @@ -5697,7 +5705,7 @@ public final class ViewRootImpl implements ViewParent, flags, event.getSource(), null); fallbackAction.recycle(); - dispatchKey(fallbackEvent); + dispatchInputEvent(fallbackEvent); } } } diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index 39d48a7..7a24243 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -1290,4 +1290,18 @@ public abstract class Window { * @hide */ public void setDefaultLogo(int resId) { } + + /** + * Set focus locally. The window should have the + * {@link WindowManager.LayoutParams#FLAG_LOCAL_FOCUS_MODE} flag set already. + * @param hasFocus Whether this window has focus or not. + * @param inTouchMode Whether this window is in touch mode or not. + */ + public void setLocalFocus(boolean hasFocus, boolean inTouchMode) { } + + /** + * Inject an event to window locally. + * @param event A key or touch event to inject to this window. + */ + public void injectInputEvent(InputEvent event) { } } diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 83a58be..c9c74e7 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -866,6 +866,15 @@ public interface WindowManager extends ViewManager { */ public static final int FLAG_NEEDS_MENU_KEY = 0x08000000; + /** + * Flag for a window in local focus mode. + * Window in local focus mode can control focus independent of window manager using + * {@link Window#setLocalFocus(boolean, boolean)}. + * Usually window in this mode will not get touch/key events from window manager, but will + * get events only via local injection using {@link Window#injectInputEvent(InputEvent)}. + */ + public static final int FLAG_LOCAL_FOCUS_MODE = 0x10000000; + /** Window flag: special flag to limit the size of the window to be * original size ([320x480] x density). Used to create window for applications * running under compatibility mode. @@ -905,6 +914,7 @@ public interface WindowManager extends ViewManager { * @see #FLAG_DISMISS_KEYGUARD * @see #FLAG_SPLIT_TOUCH * @see #FLAG_HARDWARE_ACCELERATED + * @see #FLAG_LOCAL_FOCUS_MODE */ @ViewDebug.ExportedProperty(flagMapping = { @ViewDebug.FlagToString(mask = FLAG_ALLOW_LOCK_WHILE_SCREEN_ON, equals = FLAG_ALLOW_LOCK_WHILE_SCREEN_ON, @@ -956,7 +966,9 @@ public interface WindowManager extends ViewManager { @ViewDebug.FlagToString(mask = FLAG_SPLIT_TOUCH, equals = FLAG_SPLIT_TOUCH, name = "FLAG_SPLIT_TOUCH"), @ViewDebug.FlagToString(mask = FLAG_HARDWARE_ACCELERATED, equals = FLAG_HARDWARE_ACCELERATED, - name = "FLAG_HARDWARE_ACCELERATED") + name = "FLAG_HARDWARE_ACCELERATED"), + @ViewDebug.FlagToString(mask = FLAG_LOCAL_FOCUS_MODE, equals = FLAG_LOCAL_FOCUS_MODE, + name = "FLAG_LOCAL_FOCUS_MODE") }) public int flags; diff --git a/core/java/android/widget/ZoomButtonsController.java b/core/java/android/widget/ZoomButtonsController.java index a89c9c1..50c803b 100644 --- a/core/java/android/widget/ZoomButtonsController.java +++ b/core/java/android/widget/ZoomButtonsController.java @@ -503,7 +503,7 @@ public class ZoomButtonsController implements View.OnTouchListener { ViewRootImpl viewRoot = mOwnerView.getViewRootImpl(); if (viewRoot != null) { - viewRoot.dispatchKey(event); + viewRoot.dispatchInputEvent(event); } // We gave the key to the owner, don't let the container handle this key |
