summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android.mk2
-rw-r--r--core/java/android/view/AccessibilityInteractionController.java82
-rw-r--r--core/java/android/view/IInputFilter.aidl32
-rw-r--r--core/java/android/view/IInputFilterHost.aidl28
-rw-r--r--core/java/android/view/IWindowManager.aidl22
-rw-r--r--core/java/android/view/InputFilter.java (renamed from services/java/com/android/server/input/InputFilter.java)35
-rw-r--r--core/java/android/view/View.java38
-rw-r--r--core/java/android/view/ViewRootImpl.java56
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeInfo.java9
-rw-r--r--core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl30
-rw-r--r--core/res/AndroidManifest.xml13
-rwxr-xr-xcore/res/res/values/strings.xml14
-rw-r--r--services/java/com/android/server/accessibility/AccessibilityInputFilter.java3
-rw-r--r--services/java/com/android/server/accessibility/AccessibilityManagerService.java128
-rw-r--r--services/java/com/android/server/accessibility/TouchExplorer.java2
-rw-r--r--services/java/com/android/server/input/InputManagerService.java30
-rwxr-xr-xservices/java/com/android/server/wm/WindowManagerService.java23
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java30
18 files changed, 325 insertions, 252 deletions
diff --git a/Android.mk b/Android.mk
index b9157fe..e577b91 100644
--- a/Android.mk
+++ b/Android.mk
@@ -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
+ }
}