Fix touchable region calculation in NavigationBarController (2nd)
As ViewTreeObserver.InternelInsetsInfo.touchableRegion with setting TOUCHABLE_INSETS_REGION requires setting the region that relative the window position, but CL[1] uses the global screen position to calculate the touch region, which will affect the end result, To fix this, we should use getLocationInWindow to get the relative position of the window. [1]: I0fe54efac80dd0d55f4ba37cfa7d7188b642abb0 Fix: 229562319 Test: manually verified with the IME mentioned in the bug. Test: ensure Bug 226566506 is verified. Change-Id: I9e3fe45dccb263445d378b5ac17b0e450bdb1c24
This commit is contained in:
@@ -152,6 +152,7 @@ final class NavigationBarController {
|
||||
private boolean mDrawLegacyNavigationBarBackground;
|
||||
|
||||
private final Rect mTempRect = new Rect();
|
||||
private final int[] mTempPos = new int[2];
|
||||
|
||||
Impl(@NonNull InputMethodService inputMethodService) {
|
||||
mService = inputMethodService;
|
||||
@@ -259,21 +260,28 @@ final class NavigationBarController {
|
||||
switch (originalInsets.touchableInsets) {
|
||||
case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME:
|
||||
if (inputFrame.getVisibility() == View.VISIBLE) {
|
||||
inputFrame.getBoundsOnScreen(mTempRect);
|
||||
inputFrame.getLocationInWindow(mTempPos);
|
||||
mTempRect.set(mTempPos[0], mTempPos[1],
|
||||
mTempPos[0] + inputFrame.getWidth(),
|
||||
mTempPos[1] + inputFrame.getHeight());
|
||||
touchableRegion = new Region(mTempRect);
|
||||
}
|
||||
break;
|
||||
case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT:
|
||||
if (inputFrame.getVisibility() == View.VISIBLE) {
|
||||
inputFrame.getBoundsOnScreen(mTempRect);
|
||||
mTempRect.top = originalInsets.contentTopInsets;
|
||||
inputFrame.getLocationInWindow(mTempPos);
|
||||
mTempRect.set(mTempPos[0], originalInsets.contentTopInsets,
|
||||
mTempPos[0] + inputFrame.getWidth() ,
|
||||
mTempPos[1] + inputFrame.getHeight());
|
||||
touchableRegion = new Region(mTempRect);
|
||||
}
|
||||
break;
|
||||
case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_VISIBLE:
|
||||
if (inputFrame.getVisibility() == View.VISIBLE) {
|
||||
inputFrame.getBoundsOnScreen(mTempRect);
|
||||
mTempRect.top = originalInsets.visibleTopInsets;
|
||||
inputFrame.getLocationInWindow(mTempPos);
|
||||
mTempRect.set(mTempPos[0], originalInsets.visibleTopInsets,
|
||||
mTempPos[0] + inputFrame.getWidth(),
|
||||
mTempPos[1] + inputFrame.getHeight());
|
||||
touchableRegion = new Region(mTempRect);
|
||||
}
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user