4040import android .content .pm .ResolveInfo ;
4141import android .content .pm .ServiceInfo ;
4242import android .database .ContentObserver ;
43+ import android .graphics .Point ;
4344import android .graphics .Rect ;
45+ import android .hardware .display .DisplayManager ;
4446import android .hardware .input .InputManager ;
4547import android .net .Uri ;
4648import android .os .Binder ;
6264import android .text .TextUtils .SimpleStringSplitter ;
6365import android .util .Slog ;
6466import android .util .SparseArray ;
67+ import android .view .Display ;
6568import android .view .IWindow ;
6669import android .view .IWindowManager ;
6770import android .view .InputDevice ;
@@ -137,6 +140,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
137140 private final List <AccessibilityServiceInfo > mEnabledServicesForFeedbackTempList =
138141 new ArrayList <AccessibilityServiceInfo >();
139142
143+ private final Rect mTempRect = new Rect ();
144+
145+ private final Point mTempPoint = new Point ();
146+
147+ private final Display mDefaultDisplay ;
148+
140149 private final PackageManager mPackageManager ;
141150
142151 private final IWindowManager mWindowManagerService ;
@@ -194,6 +203,10 @@ public AccessibilityManagerService(Context context) {
194203 mWindowManagerService = (IWindowManager ) ServiceManager .getService (Context .WINDOW_SERVICE );
195204 mSecurityPolicy = new SecurityPolicy ();
196205 mMainHandler = new MainHandler (mContext .getMainLooper ());
206+ //TODO: (multi-display) We need to support multiple displays.
207+ DisplayManager displayManager = (DisplayManager )
208+ mContext .getSystemService (Context .DISPLAY_SERVICE );
209+ mDefaultDisplay = displayManager .getDisplay (Display .DEFAULT_DISPLAY );
197210 registerBroadcastReceivers ();
198211 new AccessibilityContentObserver (mMainHandler ).register (
199212 context .getContentResolver ());
@@ -582,6 +595,7 @@ boolean onGesture(int gestureId) {
582595 * @param outBounds The output to which to write the focus bounds.
583596 * @return Whether accessibility focus was found and the bounds are populated.
584597 */
598+ // TODO: (multi-display) Make sure this works for multiple displays.
585599 boolean getAccessibilityFocusBoundsInActiveWindow (Rect outBounds ) {
586600 // Instead of keeping track of accessibility focus events per
587601 // window to be able to find the focus in the active window,
@@ -603,6 +617,13 @@ boolean getAccessibilityFocusBoundsInActiveWindow(Rect outBounds) {
603617 return false ;
604618 }
605619 focus .getBoundsInScreen (outBounds );
620+ // Clip to the window rectangle.
621+ Rect windowBounds = mTempRect ;
622+ getActiveWindowBounds (windowBounds );
623+ outBounds .intersect (windowBounds );
624+ // Clip to the screen rectangle.
625+ mDefaultDisplay .getRealSize (mTempPoint );
626+ outBounds .intersect (0 , 0 , mTempPoint .x , mTempPoint .y );
606627 return true ;
607628 } finally {
608629 client .removeConnection (connectionId );
0 commit comments