From 7961be75f4161769f620e44dec3f5911e50ebe03 Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Tue, 21 Jun 2011 12:31:56 -0700 Subject: [PATCH] AccessibilityNodeInfo bounds inconsistent with compatibility mode. 1. In compatibility mode a window wide scaling is applied to stretch the content. However, AccessibilityNodeInfos retrieved from that window contain bounds in application's view of the world and need to be scaled to properly relect what a sighted user sees. Change-Id: Iebbb99526fc327f45b5cede89ba8c32e6ebd8845 --- .../AccessibilityManagerService.java | 26 ++++++++++++++++++- .../server/wm/WindowManagerService.java | 7 +++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java index a9dfb22310d7d..dd99e06473780 100644 --- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -32,6 +32,7 @@ import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.database.ContentObserver; +import android.graphics.Rect; import android.net.Uri; import android.os.Binder; import android.os.Handler; @@ -814,6 +815,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub final AtomicInteger mInteractionIdCounter = new AtomicInteger(); + final Rect mTempBounds = new Rect(); + // the events pending events to be dispatched to this service final SparseArray mPendingEvents = new SparseArray(); @@ -932,9 +935,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub AccessibilityNodeInfo info = mCallback.getFindAccessibilityNodeInfoResultAndClear( interactionId); if (info != null) { + applyCompatibilityScaleIfNeeded(info); info.setConnection(this); + info.setSealed(true); } - info.setSealed(true); return info; } catch (RemoteException re) { if (DEBUG) { @@ -979,6 +983,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub final int infoCount = infos.size(); for (int i = 0; i < infoCount; i++) { AccessibilityNodeInfo info = infos.get(i); + applyCompatibilityScaleIfNeeded(info); info.setConnection(this); info.setSealed(true); } @@ -1019,6 +1024,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub AccessibilityNodeInfo info = mCallback.getFindAccessibilityNodeInfoResultAndClear(interactionId); if (info != null) { + applyCompatibilityScaleIfNeeded(info); info.setConnection(this); info.setSealed(true); } @@ -1093,6 +1099,24 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } return mWindowIdToInteractionConnectionMap.get(windowId); } + + private void applyCompatibilityScaleIfNeeded(AccessibilityNodeInfo info) { + IBinder windowToken = mWindowIdToWindowTokenMap.get(info.getWindowId()); + final float scale = mWindowManagerService.getWindowCompatibilityScale(windowToken); + + if (Float.compare(scale, 1.0f) == 0) { + return; + } + + Rect bounds = mTempBounds; + info.getBoundsInParent(bounds); + bounds.scale(scale); + info.setBoundsInParent(bounds); + + info.getBoundsInScreen(bounds); + bounds.scale(scale); + info.setBoundsInScreen(bounds); + } } final class SecurityPolicy { diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 1c87f5b4002d5..dba170ab78911 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -2776,6 +2776,13 @@ public class WindowManagerService extends IWindowManager.Stub Binder.restoreCallingIdentity(origId); } + public float getWindowCompatibilityScale(IBinder windowToken) { + synchronized (mWindowMap) { + WindowState windowState = mWindowMap.get(windowToken); + return (windowState != null) ? windowState.mGlobalScale : 1.0f; + } + } + private AttributeCache.Entry getCachedAnimations(WindowManager.LayoutParams lp) { if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: layout params pkg=" + (lp != null ? lp.packageName : null)