diff options
18 files changed, 325 insertions, 252 deletions
@@ -143,6 +143,8 @@ LOCAL_SRC_FILES += \ core/java/android/view/accessibility/IAccessibilityManager.aidl \ core/java/android/view/accessibility/IAccessibilityManagerClient.aidl \ core/java/android/view/IApplicationToken.aidl \ + core/java/android/view/IInputFilter.aidl \ + core/java/android/view/IInputFilterHost.aidl \ core/java/android/view/IOnKeyguardExitResult.aidl \ core/java/android/view/IRotationWatcher.aidl \ core/java/android/view/IWindow.aidl \ diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index d0c393c..fbda474 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -141,7 +141,7 @@ final class AccessibilityInteractionController { } public void findAccessibilityNodeInfoByAccessibilityIdClientThread( - long accessibilityNodeId, int windowLeft, int windowTop, int interactionId, + long accessibilityNodeId, int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid, long interrogatingTid) { Message message = mHandler.obtainMessage(); @@ -153,12 +153,6 @@ final class AccessibilityInteractionController { args.argi2 = AccessibilityNodeInfo.getVirtualDescendantId(accessibilityNodeId); args.argi3 = interactionId; args.arg1 = callback; - - SomeArgs moreArgs = mPool.acquire(); - moreArgs.argi1 = windowLeft; - moreArgs.argi2 = windowTop; - args.arg2 = moreArgs; - message.obj = args; // If the interrogation is performed by the same thread as the main UI @@ -183,11 +177,6 @@ final class AccessibilityInteractionController { final IAccessibilityInteractionConnectionCallback callback = (IAccessibilityInteractionConnectionCallback) args.arg1; - SomeArgs moreArgs = (SomeArgs) args.arg2; - mViewRootImpl.mAttachInfo.mActualWindowLeft = moreArgs.argi1; - mViewRootImpl.mAttachInfo.mActualWindowTop = moreArgs.argi2; - - mPool.release(moreArgs); mPool.release(args); List<AccessibilityNodeInfo> infos = mTempAccessibilityNodeInfoList; @@ -220,9 +209,8 @@ final class AccessibilityInteractionController { } public void findAccessibilityNodeInfoByViewIdClientThread(long accessibilityNodeId, - int viewId, int windowLeft, int windowTop, int interactionId, - IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid, - long interrogatingTid) { + int viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback, + int flags, int interrogatingPid, long interrogatingTid) { Message message = mHandler.obtainMessage(); message.what = PrivateHandler.MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID; message.arg1 = flags; @@ -233,11 +221,6 @@ final class AccessibilityInteractionController { args.argi2 = interactionId; args.arg1 = callback; - SomeArgs moreArgs = mPool.acquire(); - moreArgs.argi1 = windowLeft; - moreArgs.argi2 = windowTop; - args.arg2 = moreArgs; - message.obj = args; // If the interrogation is performed by the same thread as the main UI @@ -262,11 +245,6 @@ final class AccessibilityInteractionController { final IAccessibilityInteractionConnectionCallback callback = (IAccessibilityInteractionConnectionCallback) args.arg1; - SomeArgs moreArgs = (SomeArgs) args.arg2; - mViewRootImpl.mAttachInfo.mActualWindowLeft = moreArgs.argi1; - mViewRootImpl.mAttachInfo.mActualWindowTop = moreArgs.argi2; - - mPool.release(moreArgs); mPool.release(args); AccessibilityNodeInfo info = null; @@ -300,25 +278,19 @@ final class AccessibilityInteractionController { } public void findAccessibilityNodeInfosByTextClientThread(long accessibilityNodeId, - String text, int windowLeft, int windowTop, int interactionId, - IAccessibilityInteractionConnectionCallback callback, int flags, - int interrogatingPid, long interrogatingTid) { + String text, int interactionId, IAccessibilityInteractionConnectionCallback callback, + int flags, int interrogatingPid, long interrogatingTid) { Message message = mHandler.obtainMessage(); message.what = PrivateHandler.MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT; message.arg1 = flags; SomeArgs args = mPool.acquire(); args.arg1 = text; + args.arg2 = callback; args.argi1 = AccessibilityNodeInfo.getAccessibilityViewId(accessibilityNodeId); args.argi2 = AccessibilityNodeInfo.getVirtualDescendantId(accessibilityNodeId); args.argi3 = interactionId; - SomeArgs moreArgs = mPool.acquire(); - moreArgs.arg1 = callback; - moreArgs.argi1 = windowLeft; - moreArgs.argi2 = windowTop; - args.arg2 = moreArgs; - message.obj = args; // If the interrogation is performed by the same thread as the main UI @@ -338,17 +310,11 @@ final class AccessibilityInteractionController { SomeArgs args = (SomeArgs) message.obj; final String text = (String) args.arg1; + final IAccessibilityInteractionConnectionCallback callback = + (IAccessibilityInteractionConnectionCallback) args.arg2; final int accessibilityViewId = args.argi1; final int virtualDescendantId = args.argi2; final int interactionId = args.argi3; - - SomeArgs moreArgs = (SomeArgs) args.arg2; - final IAccessibilityInteractionConnectionCallback callback = - (IAccessibilityInteractionConnectionCallback) moreArgs.arg1; - mViewRootImpl.mAttachInfo.mActualWindowLeft = moreArgs.argi1; - mViewRootImpl.mAttachInfo.mActualWindowTop = moreArgs.argi2; - - mPool.release(moreArgs); mPool.release(args); List<AccessibilityNodeInfo> infos = null; @@ -409,9 +375,9 @@ final class AccessibilityInteractionController { } } - public void findFocusClientThread(long accessibilityNodeId, int focusType, int windowLeft, - int windowTop, int interactionId, IAccessibilityInteractionConnectionCallback callback, - int flags, int interogatingPid, long interrogatingTid) { + public void findFocusClientThread(long accessibilityNodeId, int focusType, int interactionId, + IAccessibilityInteractionConnectionCallback callback, int flags, int interogatingPid, + long interrogatingTid) { Message message = mHandler.obtainMessage(); message.what = PrivateHandler.MSG_FIND_FOCUS; message.arg1 = flags; @@ -423,11 +389,6 @@ final class AccessibilityInteractionController { args.argi3 = AccessibilityNodeInfo.getVirtualDescendantId(accessibilityNodeId); args.arg1 = callback; - SomeArgs moreArgs = mPool.acquire(); - moreArgs.argi1 = windowLeft; - moreArgs.argi2 = windowTop; - args.arg2 = moreArgs; - message.obj = args; // If the interrogation is performed by the same thread as the main UI @@ -453,11 +414,6 @@ final class AccessibilityInteractionController { final IAccessibilityInteractionConnectionCallback callback = (IAccessibilityInteractionConnectionCallback) args.arg1; - SomeArgs moreArgs = (SomeArgs) args.arg2; - mViewRootImpl.mAttachInfo.mActualWindowLeft = moreArgs.argi1; - mViewRootImpl.mAttachInfo.mActualWindowTop = moreArgs.argi2; - - mPool.release(moreArgs); mPool.release(args); AccessibilityNodeInfo focused = null; @@ -516,9 +472,9 @@ final class AccessibilityInteractionController { } } - public void focusSearchClientThread(long accessibilityNodeId, int direction, int windowLeft, - int windowTop, int interactionId, IAccessibilityInteractionConnectionCallback callback, - int flags, int interogatingPid, long interrogatingTid) { + public void focusSearchClientThread(long accessibilityNodeId, int direction, int interactionId, + IAccessibilityInteractionConnectionCallback callback, int flags, int interogatingPid, + long interrogatingTid) { Message message = mHandler.obtainMessage(); message.what = PrivateHandler.MSG_FOCUS_SEARCH; message.arg1 = flags; @@ -530,11 +486,6 @@ final class AccessibilityInteractionController { args.argi3 = interactionId; args.arg1 = callback; - SomeArgs moreArgs = mPool.acquire(); - moreArgs.argi1 = windowLeft; - moreArgs.argi2 = windowTop; - args.arg2 = moreArgs; - message.obj = args; // If the interrogation is performed by the same thread as the main UI @@ -560,11 +511,6 @@ final class AccessibilityInteractionController { final IAccessibilityInteractionConnectionCallback callback = (IAccessibilityInteractionConnectionCallback) args.arg1; - SomeArgs moreArgs = (SomeArgs) args.arg2; - mViewRootImpl.mAttachInfo.mActualWindowLeft = moreArgs.argi1; - mViewRootImpl.mAttachInfo.mActualWindowTop = moreArgs.argi2; - - mPool.release(moreArgs); mPool.release(args); AccessibilityNodeInfo next = null; diff --git a/core/java/android/view/IInputFilter.aidl b/core/java/android/view/IInputFilter.aidl new file mode 100644 index 0000000..fead5f6 --- /dev/null +++ b/core/java/android/view/IInputFilter.aidl @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2012, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view; + +import android.view.IInputFilterHost; +import android.view.InputEvent; + +/** + * Interface for implementing an filter which observes and + * potentially transforms the input event stream in the system. + * + * @hide + */ +oneway interface IInputFilter { + void install(IInputFilterHost host); + void uninstall(); + void filterInputEvent(in InputEvent event, int policyFlags); +} diff --git a/core/java/android/view/IInputFilterHost.aidl b/core/java/android/view/IInputFilterHost.aidl new file mode 100644 index 0000000..93b8239 --- /dev/null +++ b/core/java/android/view/IInputFilterHost.aidl @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2012, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view; + +import android.view.InputEvent; + +/** + * Interface for calls from an input filter to its host. + * + * @hide + */ +oneway interface IInputFilterHost { + void sendInputEvent(in InputEvent event, int policyFlags); +} diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 4d4eec7..5941e44 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -23,6 +23,7 @@ import android.content.res.CompatibilityInfo; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Point; +import android.graphics.Rect; import android.os.IRemoteCallback; import android.view.IApplicationToken; import android.view.IOnKeyguardExitResult; @@ -33,6 +34,7 @@ import android.view.InputEvent; import android.view.MotionEvent; import android.view.InputChannel; import android.view.InputDevice; +import android.view.IInputFilter; /** * System private interface to the window manager. @@ -208,4 +210,24 @@ interface IWindowManager * Lock the device immediately. */ void lockNow(); + + /** + * Gets the token for the focused window. + */ + IBinder getFocusedWindowToken(); + + /** + * Gets the frame on the screen of the window given its token. + */ + boolean getWindowFrame(IBinder token, out Rect outBounds); + + /** + * Gets the compatibility scale of e window given its token. + */ + float getWindowCompatibilityScale(IBinder windowToken); + + /** + * Sets an input filter for manipulating the input event stream. + */ + void setInputFilter(in IInputFilter filter); } diff --git a/services/java/com/android/server/input/InputFilter.java b/core/java/android/view/InputFilter.java index 2ce0a02..c25b87b 100644 --- a/services/java/com/android/server/input/InputFilter.java +++ b/core/java/android/view/InputFilter.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package com.android.server.input; - -import com.android.server.wm.WindowManagerService; +package android.view; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.os.RemoteException; +import android.view.IInputFilter; import android.view.InputEvent; import android.view.InputEventConsistencyVerifier; import android.view.KeyEvent; @@ -94,15 +94,14 @@ import android.view.WindowManagerPolicy; * It may be prudent to disable automatic key repeating for synthetic key events * by setting the {@link WindowManagerPolicy#FLAG_DISABLE_KEY_REPEAT} policy flag. * </p> + * + * @hide */ -public abstract class InputFilter { +public abstract class InputFilter extends IInputFilter.Stub { private static final int MSG_INSTALL = 1; private static final int MSG_UNINSTALL = 2; private static final int MSG_INPUT_EVENT = 3; - private final H mH; - private Host mHost; - // Consistency verifiers for debugging purposes. private final InputEventConsistencyVerifier mInboundInputEventConsistencyVerifier = InputEventConsistencyVerifier.isInstrumentationEnabled() ? @@ -115,6 +114,10 @@ public abstract class InputFilter { InputEventConsistencyVerifier.FLAG_RAW_DEVICE_INPUT, "InputFilter#OutboundInputEventConsistencyVerifier") : null; + private final H mH; + + private IInputFilterHost mHost; + /** * Creates the input filter. * @@ -130,7 +133,7 @@ public abstract class InputFilter { * * @param host The input filter host environment. */ - final void install(Host host) { + public final void install(IInputFilterHost host) { mH.obtainMessage(MSG_INSTALL, host).sendToTarget(); } @@ -138,7 +141,7 @@ public abstract class InputFilter { * Called when the input filter is uninstalled. * This method is guaranteed to be non-reentrant. */ - final void uninstall() { + public final void uninstall() { mH.obtainMessage(MSG_UNINSTALL).sendToTarget(); } @@ -149,7 +152,7 @@ public abstract class InputFilter { * * @param event The input event to enqueue. */ - final void filterInputEvent(InputEvent event, int policyFlags) { + final public void filterInputEvent(InputEvent event, int policyFlags) { mH.obtainMessage(MSG_INPUT_EVENT, policyFlags, 0, event).sendToTarget(); } @@ -170,7 +173,11 @@ public abstract class InputFilter { if (mOutboundInputEventConsistencyVerifier != null) { mOutboundInputEventConsistencyVerifier.onInputEvent(event, 0); } - mHost.sendInputEvent(event, policyFlags); + try { + mHost.sendInputEvent(event, policyFlags); + } catch (RemoteException re) { + /* ignore */ + } } /** @@ -218,7 +225,7 @@ public abstract class InputFilter { public void handleMessage(Message msg) { switch (msg.what) { case MSG_INSTALL: - mHost = (Host)msg.obj; + mHost = (IInputFilterHost) msg.obj; if (mInboundInputEventConsistencyVerifier != null) { mInboundInputEventConsistencyVerifier.reset(); } @@ -251,8 +258,4 @@ public abstract class InputFilter { } } } - - interface Host { - public void sendInputEvent(InputEvent event, int policyFlags); - } } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 3f017b4..b1500eb 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -4761,30 +4761,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** - * Returns the delta between the actual and last reported window left. - * - * @hide - */ - public int getActualAndReportedWindowLeftDelta() { -// if (mAttachInfo != null) { -// return mAttachInfo.mActualWindowLeft - mAttachInfo.mWindowLeft; -// } - return 0; - } - - /** - * Returns the delta between the actual and last reported window top. - * - * @hide - */ - public int getActualAndReportedWindowTopDelta() { -// if (mAttachInfo != null) { -// return mAttachInfo.mActualWindowTop - mAttachInfo.mWindowTop; -// } - return 0; - } - - /** * Computes whether this view is visible to the user. Such a view is * attached, visible, all its predecessors are visible, it is not clipped * entirely by its predecessors, and has an alpha greater than zero. @@ -17142,20 +17118,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, int mWindowTop; /** - * Left actual position of this view's window. - * - * TODO: This is a workaround for 6623031. Remove when fixed. - */ - int mActualWindowLeft; - - /** - * Actual top position of this view's window. - * - * TODO: This is a workaround for 6623031. Remove when fixed. - */ - int mActualWindowTop; - - /** * Indicates whether views need to use 32-bit drawing caches */ boolean mUse32BitDrawingCache; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 85b6d3d..fb0a8a4 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1678,6 +1678,30 @@ public final class ViewRootImpl implements ViewParent, layoutRequested = true; } } + } else { + // Not the first pass and no window/insets/visibility change but the window + // may have moved and we need check that and if so to update the left and right + // in the attach info. We translate only the window frame since on window move + // the window manager tells us only for the new frame but the insets are the + // same and we do not want to translate them more than once. + + // TODO: Well, we are checking whether the frame has changed similarly + // to how this is done for the insets. This is however incorrect since + // the insets and the frame are translated. For example, the old frame + // was (1, 1 - 1, 1) and was translated to say (2, 2 - 2, 2), now the new + // reported frame is (2, 2 - 2, 2) which implies no change but this is not + // true since we are comparing a not translated value to a translated one. + // This scenario is rare but we may want to fix that. + + final boolean windowMoved = (attachInfo.mWindowLeft != frame.left + || attachInfo.mWindowTop != frame.top); + if (windowMoved) { + if (mTranslator != null) { + mTranslator.translateRectInScreenToAppWinFrame(frame); + } + attachInfo.mWindowLeft = frame.left; + attachInfo.mWindowTop = frame.top; + } } final boolean didLayout = layoutRequested && !mStopped; @@ -5214,15 +5238,13 @@ public final class ViewRootImpl implements ViewParent, @Override public void findAccessibilityNodeInfoByAccessibilityId(long accessibilityNodeId, - int windowLeft, int windowTop, int interactionId, - IAccessibilityInteractionConnectionCallback callback, int flags, + int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid, long interrogatingTid) { ViewRootImpl viewRootImpl = mViewRootImpl.get(); if (viewRootImpl != null && viewRootImpl.mView != null) { viewRootImpl.getAccessibilityInteractionController() .findAccessibilityNodeInfoByAccessibilityIdClientThread(accessibilityNodeId, - windowLeft, windowTop, interactionId, callback, flags, interrogatingPid, - interrogatingTid); + interactionId, callback, flags, interrogatingPid, interrogatingTid); } else { // We cannot make the call and notify the caller so it does not wait. try { @@ -5255,15 +5277,13 @@ public final class ViewRootImpl implements ViewParent, @Override public void findAccessibilityNodeInfoByViewId(long accessibilityNodeId, int viewId, - int windowLeft, int windowTop, int interactionId, - IAccessibilityInteractionConnectionCallback callback, int flags, + int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid, long interrogatingTid) { ViewRootImpl viewRootImpl = mViewRootImpl.get(); if (viewRootImpl != null && viewRootImpl.mView != null) { viewRootImpl.getAccessibilityInteractionController() .findAccessibilityNodeInfoByViewIdClientThread(accessibilityNodeId, viewId, - windowLeft, windowTop, interactionId, callback, flags, interrogatingPid, - interrogatingTid); + interactionId, callback, flags, interrogatingPid, interrogatingTid); } else { // We cannot make the call and notify the caller so it does not wait. try { @@ -5276,15 +5296,13 @@ public final class ViewRootImpl implements ViewParent, @Override public void findAccessibilityNodeInfosByText(long accessibilityNodeId, String text, - int windowLeft, int windowTop, int interactionId, - IAccessibilityInteractionConnectionCallback callback, int flags, + int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid, long interrogatingTid) { ViewRootImpl viewRootImpl = mViewRootImpl.get(); if (viewRootImpl != null && viewRootImpl.mView != null) { viewRootImpl.getAccessibilityInteractionController() .findAccessibilityNodeInfosByTextClientThread(accessibilityNodeId, text, - windowLeft, windowTop, interactionId, callback, flags, interrogatingPid, - interrogatingTid); + interactionId, callback, flags, interrogatingPid, interrogatingTid); } else { // We cannot make the call and notify the caller so it does not wait. try { @@ -5296,15 +5314,14 @@ public final class ViewRootImpl implements ViewParent, } @Override - public void findFocus(long accessibilityNodeId, int focusType, int windowLeft, - int windowTop, int interactionId, + public void findFocus(long accessibilityNodeId, int focusType, int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid, long interrogatingTid) { ViewRootImpl viewRootImpl = mViewRootImpl.get(); if (viewRootImpl != null && viewRootImpl.mView != null) { viewRootImpl.getAccessibilityInteractionController() - .findFocusClientThread(accessibilityNodeId, focusType, windowLeft, windowTop, - interactionId, callback, flags, interrogatingPid, interrogatingTid); + .findFocusClientThread(accessibilityNodeId, focusType, interactionId, callback, + flags, interrogatingPid, interrogatingTid); } else { // We cannot make the call and notify the caller so it does not wait. try { @@ -5316,15 +5333,14 @@ public final class ViewRootImpl implements ViewParent, } @Override - public void focusSearch(long accessibilityNodeId, int direction, int windowLeft, - int windowTop, int interactionId, + public void focusSearch(long accessibilityNodeId, int direction, int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid, long interrogatingTid) { ViewRootImpl viewRootImpl = mViewRootImpl.get(); if (viewRootImpl != null && viewRootImpl.mView != null) { viewRootImpl.getAccessibilityInteractionController() - .focusSearchClientThread(accessibilityNodeId, direction, windowLeft, windowTop, - interactionId, callback, flags, interrogatingPid, interrogatingTid); + .focusSearchClientThread(accessibilityNodeId, direction, interactionId, + callback, flags, interrogatingPid, interrogatingTid); } else { // We cannot make the call and notify the caller so it does not wait. try { diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index 68983e2..768744b 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -382,10 +382,6 @@ public class AccessibilityNodeInfo implements Parcelable { private int mConnectionId = UNDEFINED; - // TODO: These are a workaround for 6623031. Remove when fixed. - private int mActualAndReportedWindowLeftDelta; - private int mActualAndReportedWindowTopDelta; - /** * Hide constructor from clients. */ @@ -432,10 +428,6 @@ public class AccessibilityNodeInfo implements Parcelable { final int rootAccessibilityViewId = (root != null) ? root.getAccessibilityViewId() : UNDEFINED; mSourceNodeId = makeNodeId(rootAccessibilityViewId, virtualDescendantId); - if (root != null) { - mActualAndReportedWindowLeftDelta = root.getActualAndReportedWindowLeftDelta(); - mActualAndReportedWindowTopDelta = root.getActualAndReportedWindowTopDelta(); - } } /** @@ -833,7 +825,6 @@ public class AccessibilityNodeInfo implements Parcelable { public void setBoundsInScreen(Rect bounds) { enforceNotSealed(); mBoundsInScreen.set(bounds.left, bounds.top, bounds.right, bounds.bottom); - mBoundsInScreen.offset(mActualAndReportedWindowLeftDelta, mActualAndReportedWindowTopDelta); } /** diff --git a/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl b/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl index 292702a..9b39300 100644 --- a/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl +++ b/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl @@ -28,25 +28,25 @@ import android.view.accessibility.IAccessibilityInteractionConnectionCallback; */ oneway interface IAccessibilityInteractionConnection { - void findAccessibilityNodeInfoByAccessibilityId(long accessibilityNodeId, int windowLeft, - int windowTop, int interactionId, IAccessibilityInteractionConnectionCallback callback, - int flags, int interrogatingPid, long interrogatingTid); + void findAccessibilityNodeInfoByAccessibilityId(long accessibilityNodeId, int interactionId, + IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid, + long interrogatingTid); - void findAccessibilityNodeInfoByViewId(long accessibilityNodeId, int viewId, int windowLeft, - int windowTop, int interactionId, IAccessibilityInteractionConnectionCallback callback, - int flags, int interrogatingPid, long interrogatingTid); + void findAccessibilityNodeInfoByViewId(long accessibilityNodeId, int viewId, int interactionId, + IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid, + long interrogatingTid); - void findAccessibilityNodeInfosByText(long accessibilityNodeId, String text, int windowLeft, - int windowTop, int interactionId, IAccessibilityInteractionConnectionCallback callback, - int flags, int interrogatingPid, long interrogatingTid); + void findAccessibilityNodeInfosByText(long accessibilityNodeId, String text, int interactionId, + IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid, + long interrogatingTid); - void findFocus(long accessibilityNodeId, int focusType, int windowLeft, int windowTop, - int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, - int interrogatingPid, long interrogatingTid); + void findFocus(long accessibilityNodeId, int focusType, int interactionId, + IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid, + long interrogatingTid); - void focusSearch(long accessibilityNodeId, int direction, int windowLeft, int windowTop, - int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, - int interrogatingPid, long interrogatingTid); + void focusSearch(long accessibilityNodeId, int direction, int interactionId, + IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid, + long interrogatingTid); void performAccessibilityAction(long accessibilityNodeId, int action, in Bundle arguments, int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 6546fed..cdc5ad4 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1223,6 +1223,19 @@ android:description="@string/permdesc_injectEvents" android:protectionLevel="signature" /> + <!-- @hide Allows an application to register an input filter which filters the stream + of user events (keys, touch, trackball) before they are dispatched to any window. --> + <permission android:name="android.permission.FILTER_EVENTS" + android:label="@string/permlab_filter_events" + android:description="@string/permdesc_filter_events" + android:protectionLevel="signature" /> + + <!-- @hide Allows an application to retrieve info for a window from the window manager. --> + <permission android:name="android.permission.RETRIEVE_WINDOW_INFO" + android:label="@string/permlab_retrieve_window_info" + android:description="@string/permdesc_retrieve_window_info" + android:protectionLevel="signature" /> + <!-- Allows an application to watch and control how activities are started globally in the system. Only for is in debugging (usually the monkey command). --> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 170c95d..a39d98d 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -630,6 +630,20 @@ the entire window content and examine all its text except passwords.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permlab_retrieve_window_info">retrieve window info</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permdesc_retrieve_window_info">Allows an application to retrieve + information about the the windows from the window manager. Malicious apps may + retrieve information that is intended for internal system usage.</string> + + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permlab_filter_events">filter events</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permdesc_filter_events">Allows an application to register an input filter + which filters the stream of all user events before they are dispatched. Malicious app + may control the system UI whtout user intervention.</string> + + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_shutdown">partial shutdown</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_shutdown">Puts the activity manager into a shutdown diff --git a/services/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/java/com/android/server/accessibility/AccessibilityInputFilter.java index 8fa6722..fc774d4 100644 --- a/services/java/com/android/server/accessibility/AccessibilityInputFilter.java +++ b/services/java/com/android/server/accessibility/AccessibilityInputFilter.java @@ -16,13 +16,12 @@ package com.android.server.accessibility; -import com.android.server.input.InputFilter; - import android.content.Context; import android.os.PowerManager; import android.util.Slog; import android.view.InputDevice; import android.view.InputEvent; +import android.view.InputFilter; import android.view.MotionEvent; import android.view.WindowManagerPolicy; import android.view.accessibility.AccessibilityEvent; diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java index 5650da8..857334e 100644 --- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -58,6 +58,7 @@ import android.text.TextUtils.SimpleStringSplitter; import android.util.Slog; import android.util.SparseArray; import android.view.IWindow; +import android.view.IWindowManager; import android.view.InputDevice; import android.view.KeyCharacterMap; import android.view.KeyEvent; @@ -74,7 +75,6 @@ import android.view.accessibility.IAccessibilityManagerClient; import com.android.internal.R; import com.android.internal.content.PackageMonitor; import com.android.internal.statusbar.IStatusBarService; -import com.android.server.wm.WindowManagerService; import org.xmlpull.v1.XmlPullParserException; @@ -157,7 +157,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private boolean mIsTouchExplorationEnabled; - private final WindowManagerService mWindowManagerService; + private final IWindowManager mWindowManager; private final SecurityPolicy mSecurityPolicy; @@ -181,8 +181,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { public AccessibilityManagerService(Context context) { mContext = context; mPackageManager = mContext.getPackageManager(); - mWindowManagerService = (WindowManagerService) ServiceManager.getService( - Context.WINDOW_SERVICE); + mWindowManager = (IWindowManager) ServiceManager.getService(Context.WINDOW_SERVICE); mSecurityPolicy = new SecurityPolicy(); mMainHandler = new MainHanler(); registerPackageChangeAndBootCompletedBroadcastReceiver(); @@ -583,15 +582,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { * * @param outBounds The output to which to write the bounds. */ - void getActiveWindowBounds(Rect outBounds) { + boolean getActiveWindowBounds(Rect outBounds) { synchronized (mLock) { final int windowId = mSecurityPolicy.mActiveWindowId; IBinder token = mWindowIdToWindowTokenMap.get(windowId); - mWindowManagerService.getWindowFrame(token, outBounds); + try { + mWindowManager.getWindowFrame(token, outBounds); + return true; + } catch (RemoteException re) { + /* ignore */ + } + return false; } } - int getActiveWindowId() { + public int getActiveWindowId() { return mSecurityPolicy.mActiveWindowId; } @@ -966,13 +971,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { if (mInputFilter == null) { mInputFilter = new AccessibilityInputFilter(mContext, this); } - mWindowManagerService.setInputFilter(mInputFilter); + try { + mWindowManager.setInputFilter(mInputFilter); + } catch (RemoteException re) { + /* ignore */ + } } return; } if (mHasInputFilter) { mHasInputFilter = false; - mWindowManagerService.setInputFilter(null); + try { + mWindowManager.setInputFilter(null); + } catch (RemoteException re) { + /* ignore */ + } } } @@ -1347,8 +1360,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { IAccessibilityInteractionConnectionCallback callback, long interrogatingTid) throws RemoteException { final int resolvedWindowId = resolveAccessibilityWindowId(accessibilityWindowId); - final int windowLeft; - final int windowTop; IAccessibilityInteractionConnection connection = null; synchronized (mLock) { mSecurityPolicy.enforceCanRetrieveWindowContent(this); @@ -1361,10 +1372,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return 0; } } - IBinder token = mWindowIdToWindowTokenMap.get(resolvedWindowId); - mWindowManagerService.getWindowFrame(token, mTempBounds); - windowLeft = mTempBounds.left; - windowTop = mTempBounds.top; } final int flags = (mIncludeNotImportantViews) ? AccessibilityNodeInfo.INCLUDE_NOT_IMPORTANT_VIEWS : 0; @@ -1372,8 +1379,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { final long identityToken = Binder.clearCallingIdentity(); try { connection.findAccessibilityNodeInfoByViewId(accessibilityNodeId, viewId, - windowLeft, windowTop, interactionId, callback, flags, interrogatingPid, - interrogatingTid); + interactionId, callback, flags, interrogatingPid, interrogatingTid); + return getCompatibilityScale(resolvedWindowId); } catch (RemoteException re) { if (DEBUG) { Slog.e(LOG_TAG, "Error findAccessibilityNodeInfoByViewId()."); @@ -1381,7 +1388,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } finally { Binder.restoreCallingIdentity(identityToken); } - return getCompatibilityScale(resolvedWindowId); + return 0; } @Override @@ -1390,8 +1397,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { IAccessibilityInteractionConnectionCallback callback, long interrogatingTid) throws RemoteException { final int resolvedWindowId = resolveAccessibilityWindowId(accessibilityWindowId); - final int windowLeft; - final int windowTop; IAccessibilityInteractionConnection connection = null; synchronized (mLock) { mSecurityPolicy.enforceCanRetrieveWindowContent(this); @@ -1405,19 +1410,16 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return 0; } } - IBinder token = mWindowIdToWindowTokenMap.get(resolvedWindowId); - mWindowManagerService.getWindowFrame(token, mTempBounds); - windowLeft = mTempBounds.left; - windowTop = mTempBounds.top; } final int flags = (mIncludeNotImportantViews) ? AccessibilityNodeInfo.INCLUDE_NOT_IMPORTANT_VIEWS : 0; final int interrogatingPid = Binder.getCallingPid(); final long identityToken = Binder.clearCallingIdentity(); try { - connection.findAccessibilityNodeInfosByText(accessibilityNodeId, text, windowLeft, - windowTop, interactionId, callback, flags, interrogatingPid, + connection.findAccessibilityNodeInfosByText(accessibilityNodeId, text, + interactionId, callback, flags, interrogatingPid, interrogatingTid); + return getCompatibilityScale(resolvedWindowId); } catch (RemoteException re) { if (DEBUG) { Slog.e(LOG_TAG, "Error calling findAccessibilityNodeInfosByText()"); @@ -1425,7 +1427,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } finally { Binder.restoreCallingIdentity(identityToken); } - return getCompatibilityScale(resolvedWindowId); + return 0; } @Override @@ -1434,8 +1436,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { IAccessibilityInteractionConnectionCallback callback, int flags, long interrogatingTid) throws RemoteException { final int resolvedWindowId = resolveAccessibilityWindowId(accessibilityWindowId); - final int windowLeft; - final int windowTop; IAccessibilityInteractionConnection connection = null; synchronized (mLock) { mSecurityPolicy.enforceCanRetrieveWindowContent(this); @@ -1449,10 +1449,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return 0; } } - IBinder token = mWindowIdToWindowTokenMap.get(resolvedWindowId); - mWindowManagerService.getWindowFrame(token, mTempBounds); - windowLeft = mTempBounds.left; - windowTop = mTempBounds.top; } final int allFlags = flags | ((mIncludeNotImportantViews) ? AccessibilityNodeInfo.INCLUDE_NOT_IMPORTANT_VIEWS : 0); @@ -1460,8 +1456,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { final long identityToken = Binder.clearCallingIdentity(); try { connection.findAccessibilityNodeInfoByAccessibilityId(accessibilityNodeId, - windowLeft, windowTop, interactionId, callback, allFlags, interrogatingPid, - interrogatingTid); + interactionId, callback, allFlags, interrogatingPid, interrogatingTid); + return getCompatibilityScale(resolvedWindowId); } catch (RemoteException re) { if (DEBUG) { Slog.e(LOG_TAG, "Error calling findAccessibilityNodeInfoByAccessibilityId()"); @@ -1469,7 +1465,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } finally { Binder.restoreCallingIdentity(identityToken); } - return getCompatibilityScale(resolvedWindowId); + return 0; } @Override @@ -1478,8 +1474,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { IAccessibilityInteractionConnectionCallback callback, long interrogatingTid) throws RemoteException { final int resolvedWindowId = resolveAccessibilityWindowId(accessibilityWindowId); - final int windowLeft; - final int windowTop; IAccessibilityInteractionConnection connection = null; synchronized (mLock) { mSecurityPolicy.enforceCanRetrieveWindowContent(this); @@ -1493,18 +1487,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return 0; } } - IBinder token = mWindowIdToWindowTokenMap.get(resolvedWindowId); - mWindowManagerService.getWindowFrame(token, mTempBounds); - windowLeft = mTempBounds.left; - windowTop = mTempBounds.top; } final int flags = (mIncludeNotImportantViews) ? AccessibilityNodeInfo.INCLUDE_NOT_IMPORTANT_VIEWS : 0; final int interrogatingPid = Binder.getCallingPid(); final long identityToken = Binder.clearCallingIdentity(); try { - connection.findFocus(accessibilityNodeId, focusType, windowLeft, windowTop, - interactionId, callback, flags, interrogatingPid, interrogatingTid); + connection.findFocus(accessibilityNodeId, focusType, interactionId, callback, + flags, interrogatingPid, interrogatingTid); + return getCompatibilityScale(resolvedWindowId); } catch (RemoteException re) { if (DEBUG) { Slog.e(LOG_TAG, "Error calling findAccessibilityFocus()"); @@ -1512,7 +1503,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } finally { Binder.restoreCallingIdentity(identityToken); } - return getCompatibilityScale(resolvedWindowId); + return 0; } @Override @@ -1521,8 +1512,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { IAccessibilityInteractionConnectionCallback callback, long interrogatingTid) throws RemoteException { final int resolvedWindowId = resolveAccessibilityWindowId(accessibilityWindowId); - final int windowLeft; - final int windowTop; IAccessibilityInteractionConnection connection = null; synchronized (mLock) { mSecurityPolicy.enforceCanRetrieveWindowContent(this); @@ -1536,18 +1525,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return 0; } } - IBinder token = mWindowIdToWindowTokenMap.get(resolvedWindowId); - mWindowManagerService.getWindowFrame(token, mTempBounds); - windowLeft = mTempBounds.left; - windowTop = mTempBounds.top; } final int flags = (mIncludeNotImportantViews) ? AccessibilityNodeInfo.INCLUDE_NOT_IMPORTANT_VIEWS : 0; final int interrogatingPid = Binder.getCallingPid(); final long identityToken = Binder.clearCallingIdentity(); try { - connection.focusSearch(accessibilityNodeId, direction, windowLeft, windowTop, - interactionId, callback, flags, interrogatingPid, interrogatingTid); + connection.focusSearch(accessibilityNodeId, direction, interactionId, callback, + flags, interrogatingPid, interrogatingTid); + return getCompatibilityScale(resolvedWindowId); } catch (RemoteException re) { if (DEBUG) { Slog.e(LOG_TAG, "Error calling accessibilityFocusSearch()"); @@ -1555,7 +1541,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } finally { Binder.restoreCallingIdentity(identityToken); } - return getCompatibilityScale(resolvedWindowId); + return 0; } @Override @@ -1833,7 +1819,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private float getCompatibilityScale(int windowId) { IBinder windowToken = mWindowIdToWindowTokenMap.get(windowId); - return mWindowManagerService.getWindowCompatibilityScale(windowToken); + try { + return mWindowManager.getWindowCompatibilityScale(windowToken); + } catch (RemoteException re) { + /* ignore */ + } + return 1.0f; } } @@ -1952,18 +1943,25 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } private int getFocusedWindowId() { - // We call this only on window focus change or after touch - // exploration gesture end and the shown windows are not that - // many, so the linear look up is just fine. - IBinder token = mWindowManagerService.getFocusedWindowClientToken(); - if (token != null) { - SparseArray<IBinder> windows = mWindowIdToWindowTokenMap; - final int windowCount = windows.size(); - for (int i = 0; i < windowCount; i++) { - if (windows.valueAt(i) == token) { - return windows.keyAt(i); + final long identity = Binder.clearCallingIdentity(); + try { + // We call this only on window focus change or after touch + // exploration gesture end and the shown windows are not that + // many, so the linear look up is just fine. + IBinder token = mWindowManager.getFocusedWindowToken(); + if (token != null) { + SparseArray<IBinder> windows = mWindowIdToWindowTokenMap; + final int windowCount = windows.size(); + for (int i = 0; i < windowCount; i++) { + if (windows.valueAt(i) == token) { + return windows.keyAt(i); + } } } + } catch (RemoteException re) { + /* ignore */ + } finally { + Binder.restoreCallingIdentity(identity); } return -1; } diff --git a/services/java/com/android/server/accessibility/TouchExplorer.java b/services/java/com/android/server/accessibility/TouchExplorer.java index 48c6b2a..ba9f2cd 100644 --- a/services/java/com/android/server/accessibility/TouchExplorer.java +++ b/services/java/com/android/server/accessibility/TouchExplorer.java @@ -28,6 +28,7 @@ import android.graphics.Rect; import android.os.Handler; import android.os.SystemClock; import android.util.Slog; +import android.view.InputFilter; import android.view.MotionEvent; import android.view.MotionEvent.PointerCoords; import android.view.MotionEvent.PointerProperties; @@ -37,7 +38,6 @@ import android.view.WindowManagerPolicy; import android.view.accessibility.AccessibilityEvent; import com.android.internal.R; -import com.android.server.input.InputFilter; import java.util.ArrayList; import java.util.Arrays; diff --git a/services/java/com/android/server/input/InputManagerService.java b/services/java/com/android/server/input/InputManagerService.java index bdd0aa4..e7afb1a 100644 --- a/services/java/com/android/server/input/InputManagerService.java +++ b/services/java/com/android/server/input/InputManagerService.java @@ -42,8 +42,8 @@ import android.content.res.Resources.NotFoundException; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.database.ContentObserver; -import android.hardware.input.IInputManager; import android.hardware.input.IInputDevicesChangedListener; +import android.hardware.input.IInputManager; import android.hardware.input.InputManager; import android.hardware.input.KeyboardLayout; import android.os.Binder; @@ -62,6 +62,8 @@ import android.util.Log; import android.util.Slog; import android.util.SparseArray; import android.util.Xml; +import android.view.IInputFilter; +import android.view.IInputFilterHost; import android.view.InputChannel; import android.view.InputDevice; import android.view.InputEvent; @@ -137,7 +139,7 @@ public class InputManagerService extends IInputManager.Stub implements Watchdog. // State for the currently installed input filter. final Object mInputFilterLock = new Object(); - InputFilter mInputFilter; // guarded by mInputFilterLock + IInputFilter mInputFilter; // guarded by mInputFilterLock InputFilterHost mInputFilterHost; // guarded by mInputFilterLock private static native int nativeInit(InputManagerService service, @@ -425,9 +427,9 @@ public class InputManagerService extends IInputManager.Stub implements Watchdog. * * @param filter The input filter, or null to remove the current filter. */ - public void setInputFilter(InputFilter filter) { + public void setInputFilter(IInputFilter filter) { synchronized (mInputFilterLock) { - final InputFilter oldFilter = mInputFilter; + final IInputFilter oldFilter = mInputFilter; if (oldFilter == filter) { return; // nothing to do } @@ -436,13 +438,21 @@ public class InputManagerService extends IInputManager.Stub implements Watchdog. mInputFilter = null; mInputFilterHost.disconnectLocked(); mInputFilterHost = null; - oldFilter.uninstall(); + try { + oldFilter.uninstall(); + } catch (RemoteException re) { + /* ignore */ + } } if (filter != null) { mInputFilter = filter; mInputFilterHost = new InputFilterHost(); - filter.install(mInputFilterHost); + try { + filter.install(mInputFilterHost); + } catch (RemoteException re) { + /* ignore */ + } } nativeSetInputFilterEnabled(mPtr, filter != null); @@ -1229,7 +1239,11 @@ public class InputManagerService extends IInputManager.Stub implements Watchdog. final boolean filterInputEvent(InputEvent event, int policyFlags) { synchronized (mInputFilterLock) { if (mInputFilter != null) { - mInputFilter.filterInputEvent(event, policyFlags); + try { + mInputFilter.filterInputEvent(event, policyFlags); + } catch (RemoteException e) { + /* ignore */ + } return false; } } @@ -1447,7 +1461,7 @@ public class InputManagerService extends IInputManager.Stub implements Watchdog. /** * Hosting interface for input filters to call back into the input manager. */ - private final class InputFilterHost implements InputFilter.Host { + private final class InputFilterHost extends IInputFilterHost.Stub { private boolean mDisconnected; public void disconnectLocked() { diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 61e3560..2c7d36f 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -45,7 +45,6 @@ import com.android.server.AttributeCache; import com.android.server.EventLogTags; import com.android.server.Watchdog; import com.android.server.am.BatteryStatsService; -import com.android.server.input.InputFilter; import com.android.server.input.InputManagerService; import com.android.server.power.PowerManagerService; import com.android.server.power.ShutdownThread; @@ -107,6 +106,7 @@ import android.view.Choreographer; import android.view.Display; import android.view.Gravity; import android.view.IApplicationToken; +import android.view.IInputFilter; import android.view.IOnKeyguardExitResult; import android.view.IRotationWatcher; import android.view.IWindow; @@ -3069,6 +3069,10 @@ public class WindowManagerService extends IWindowManager.Stub } public float getWindowCompatibilityScale(IBinder windowToken) { + if (!checkCallingPermission(android.Manifest.permission.RETRIEVE_WINDOW_INFO, + "getWindowCompatibilityScale()")) { + throw new SecurityException("Requires RETRIEVE_WINDOW_INFO permission."); + } synchronized (mWindowMap) { WindowState windowState = mWindowMap.get(windowToken); return (windowState != null) ? windowState.mGlobalScale : 1.0f; @@ -5190,7 +5194,10 @@ public class WindowManagerService extends IWindowManager.Stub ShutdownThread.rebootSafeMode(mContext, true); } - public void setInputFilter(InputFilter filter) { + public void setInputFilter(IInputFilter filter) { + if (!checkCallingPermission(android.Manifest.permission.FILTER_EVENTS, "setInputFilter()")) { + throw new SecurityException("Requires FILTER_EVENTS permission"); + } mInputManager.setInputFilter(filter); } @@ -6752,8 +6759,11 @@ public class WindowManagerService extends IWindowManager.Stub } } - // TODO: Put this on the IWindowManagerService and guard with a permission. - public IBinder getFocusedWindowClientToken() { + public IBinder getFocusedWindowToken() { + if (!checkCallingPermission(android.Manifest.permission.RETRIEVE_WINDOW_INFO, + "getFocusedWindowToken()")) { + throw new SecurityException("Requires RETRIEVE_WINDOW_INFO permission."); + } synchronized (mWindowMap) { WindowState windowState = getFocusedWindowLocked(); if (windowState != null) { @@ -6763,8 +6773,11 @@ public class WindowManagerService extends IWindowManager.Stub } } - // TODO: This is a workaround - remove when 6623031 is fixed. public boolean getWindowFrame(IBinder token, Rect outBounds) { + if (!checkCallingPermission(android.Manifest.permission.RETRIEVE_WINDOW_INFO, + "getWindowFrame()")) { + throw new SecurityException("Requires RETRIEVE_WINDOW_INFO permission."); + } synchronized (mWindowMap) { WindowState windowState = mWindowMap.get(token); if (windowState != null) { diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java index 8ab875f..3e56b60 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java @@ -23,6 +23,7 @@ import android.content.res.CompatibilityInfo; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Point; +import android.graphics.Rect; import android.os.IBinder; import android.os.IRemoteCallback; import android.os.RemoteException; @@ -31,15 +32,11 @@ import android.view.Display; import android.view.Display_Delegate; import android.view.Gravity; import android.view.IApplicationToken; +import android.view.IInputFilter; import android.view.IOnKeyguardExitResult; import android.view.IRotationWatcher; import android.view.IWindowManager; import android.view.IWindowSession; -import android.view.InputChannel; -import android.view.InputDevice; -import android.view.InputEvent; -import android.view.KeyEvent; -import android.view.MotionEvent; import java.util.List; @@ -455,4 +452,27 @@ public class BridgeWindowManager implements IWindowManager { public void lockNow() { // TODO Auto-generated method stub } + + @Override + public IBinder getFocusedWindowToken() { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean getWindowFrame(IBinder token, Rect outBounds) { + // TODO Auto-generated method stub + return false; + } + + @Override + public float getWindowCompatibilityScale(IBinder windowToken) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + @Override + public void setInputFilter(IInputFilter filter) throws RemoteException { + // TODO Auto-generated method stub + } } |