Merge "Cannot click on partially visible views in touch exploration." into jb-mr1-dev

This commit is contained in:
Svetoslav Ganov
2012-11-02 11:50:56 -07:00
committed by Android (Google) Code Review
2 changed files with 22 additions and 0 deletions

View File

@ -2338,6 +2338,7 @@ public final class ViewRootImpl implements ViewParent,
mAccessibilityFocusedVirtualView.getBoundsInScreen(bounds); mAccessibilityFocusedVirtualView.getBoundsInScreen(bounds);
} }
bounds.offset(-mAttachInfo.mWindowLeft, -mAttachInfo.mWindowTop); bounds.offset(-mAttachInfo.mWindowLeft, -mAttachInfo.mWindowTop);
bounds.intersect(0, 0, mAttachInfo.mViewRootImpl.mWidth, mAttachInfo.mViewRootImpl.mHeight);
drawable.setBounds(bounds); drawable.setBounds(bounds);
drawable.draw(canvas); drawable.draw(canvas);
} }

View File

@ -40,7 +40,9 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.graphics.Point;
import android.graphics.Rect; import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.hardware.input.InputManager; import android.hardware.input.InputManager;
import android.net.Uri; import android.net.Uri;
import android.os.Binder; import android.os.Binder;
@ -62,6 +64,7 @@ import android.text.TextUtils;
import android.text.TextUtils.SimpleStringSplitter; import android.text.TextUtils.SimpleStringSplitter;
import android.util.Slog; import android.util.Slog;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.Display;
import android.view.IWindow; import android.view.IWindow;
import android.view.IWindowManager; import android.view.IWindowManager;
import android.view.InputDevice; import android.view.InputDevice;
@ -137,6 +140,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
private final List<AccessibilityServiceInfo> mEnabledServicesForFeedbackTempList = private final List<AccessibilityServiceInfo> mEnabledServicesForFeedbackTempList =
new ArrayList<AccessibilityServiceInfo>(); new ArrayList<AccessibilityServiceInfo>();
private final Rect mTempRect = new Rect();
private final Point mTempPoint = new Point();
private final Display mDefaultDisplay;
private final PackageManager mPackageManager; private final PackageManager mPackageManager;
private final IWindowManager mWindowManagerService; private final IWindowManager mWindowManagerService;
@ -194,6 +203,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
mWindowManagerService = (IWindowManager) ServiceManager.getService(Context.WINDOW_SERVICE); mWindowManagerService = (IWindowManager) ServiceManager.getService(Context.WINDOW_SERVICE);
mSecurityPolicy = new SecurityPolicy(); mSecurityPolicy = new SecurityPolicy();
mMainHandler = new MainHandler(mContext.getMainLooper()); mMainHandler = new MainHandler(mContext.getMainLooper());
//TODO: (multi-display) We need to support multiple displays.
DisplayManager displayManager = (DisplayManager)
mContext.getSystemService(Context.DISPLAY_SERVICE);
mDefaultDisplay = displayManager.getDisplay(Display.DEFAULT_DISPLAY);
registerBroadcastReceivers(); registerBroadcastReceivers();
new AccessibilityContentObserver(mMainHandler).register( new AccessibilityContentObserver(mMainHandler).register(
context.getContentResolver()); context.getContentResolver());
@ -582,6 +595,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
* @param outBounds The output to which to write the focus bounds. * @param outBounds The output to which to write the focus bounds.
* @return Whether accessibility focus was found and the bounds are populated. * @return Whether accessibility focus was found and the bounds are populated.
*/ */
// TODO: (multi-display) Make sure this works for multiple displays.
boolean getAccessibilityFocusBoundsInActiveWindow(Rect outBounds) { boolean getAccessibilityFocusBoundsInActiveWindow(Rect outBounds) {
// Instead of keeping track of accessibility focus events per // Instead of keeping track of accessibility focus events per
// window to be able to find the focus in the active window, // window to be able to find the focus in the active window,
@ -603,6 +617,13 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
return false; return false;
} }
focus.getBoundsInScreen(outBounds); focus.getBoundsInScreen(outBounds);
// Clip to the window rectangle.
Rect windowBounds = mTempRect;
getActiveWindowBounds(windowBounds);
outBounds.intersect(windowBounds);
// Clip to the screen rectangle.
mDefaultDisplay.getRealSize(mTempPoint);
outBounds.intersect(0, 0, mTempPoint.x, mTempPoint.y);
return true; return true;
} finally { } finally {
client.removeConnection(connectionId); client.removeConnection(connectionId);