Fix Insertion ActionMode not showing on RTL languages

When long pressing on an empty Text field with the system language set
to RTL, the "paste" popup was not showing up.

The Floating Toolbar requires a content rect to determine where the
text is and place itself close to it. In the case of an empty field,
we create a "fake" content rect by taking the placement of the cursor
+1 pixel to the right. In RTL languages, this +1 causes the content
rect to be considered off the bounds of the view, as the cursor is
aligned to the right, and hence the Floating Toolbar is hidden.

After making the rect a 0 width rect, we ran into the issue that
it was considered out of bounds due to the calculation ignoring rects
that simply touch the edge of the view's bounds.

BUG: 22540083
Change-Id: I29c79b701f586970b2611178233eff082b802ec1
This commit is contained in:
Clara Bayarri
2015-08-12 19:46:47 +01:00
parent bf88205bef
commit f95ed10d9d
2 changed files with 11 additions and 3 deletions

View File

@@ -3308,7 +3308,7 @@ public class Editor {
mSelectionBounds.set(
primaryHorizontal,
layout.getLineTop(line),
primaryHorizontal + 1,
primaryHorizontal,
layout.getLineTop(line + 1) + mHandleHeight);
}
// Take TextView's padding and scroll into account.

View File

@@ -194,8 +194,16 @@ public class FloatingActionMode extends ActionMode {
mContext.getResources().getDisplayMetrics().widthPixels,
mContext.getResources().getDisplayMetrics().heightPixels);
return Rect.intersects(mContentRectOnScreen, mScreenRect)
&& Rect.intersects(mContentRectOnScreen, mViewRectOnScreen);
return intersectsClosed(mContentRectOnScreen, mScreenRect)
&& intersectsClosed(mContentRectOnScreen, mViewRectOnScreen);
}
/*
* Same as Rect.intersects, but includes cases where the rectangles touch.
*/
private static boolean intersectsClosed(Rect a, Rect b) {
return a.left <= b.right && b.left <= a.right
&& a.top <= b.bottom && b.top <= a.bottom;
}
@Override