Skip to content

Commit b020e7c

Browse files
Jakub Kinstfacebook-github-bot
Jakub Kinst
authored andcommitted
Fix calculating View position within a Window in split-screen mode on Android (#28449)
Summary: On Android, when using split-screen mode, the Window-relative position of a native View is not calculated properly when the app is running on the right (or bottom) half of the screen. The coordinates are currently calculated only based on View.getLocationOnScreen() with subtracting status bar height. Scenarios, where the window does not fill the entire screen (such as split-screen mode) are not supported. We need to use a more general solution to subtract the actual position of the window from position of the view within the screen. This PR fixes the issue by subtracting coordinates of the Window retrieved from View.getWindowVisibleDisplayFrame(), which covers all scenarios when Window can be in a different position than the screen (incl. status bar offset). ## Changelog [Android] [Fixed] - Calculating view position within the window in split-screen mode Pull Request resolved: #28449 Test Plan: 1. Run an app in split-screen mode on the right half of the screen 2. Call UIManagerModule.measureInWindow() from JS to fetch a position of a View within a Window 3. Observe the wrong coordinates returned 4. Try the same with the fix Reviewed By: mdvacca Differential Revision: D21246297 Pulled By: shergin fbshipit-source-id: 1f54b1a5d6610be17bf05521200304db2ba263ab
1 parent dfdbf41 commit b020e7c

File tree

1 file changed

+7
-9
lines changed

1 file changed

+7
-9
lines changed

ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java

+7-9
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
package com.facebook.react.uimanager;
99

10-
import android.content.res.Resources;
1110
import android.graphics.Matrix;
11+
import android.graphics.Rect;
1212
import android.graphics.RectF;
1313
import android.util.SparseArray;
1414
import android.util.SparseBooleanArray;
@@ -701,14 +701,12 @@ public synchronized void measureInWindow(int tag, int[] outputBuffer) {
701701

702702
v.getLocationOnScreen(outputBuffer);
703703

704-
// We need to remove the status bar from the height. getLocationOnScreen will include the
705-
// status bar.
706-
Resources resources = v.getContext().getResources();
707-
int statusBarId = resources.getIdentifier("status_bar_height", "dimen", "android");
708-
if (statusBarId > 0) {
709-
int height = (int) resources.getDimension(statusBarId);
710-
outputBuffer[1] -= height;
711-
}
704+
// we need to subtract visibleWindowCoords - to subtract possible window insets, split screen or
705+
// multi window
706+
Rect visibleWindowFrame = new Rect();
707+
v.getWindowVisibleDisplayFrame(visibleWindowFrame);
708+
outputBuffer[0] = outputBuffer[0] - visibleWindowFrame.left;
709+
outputBuffer[1] = outputBuffer[1] - visibleWindowFrame.top;
712710

713711
// outputBuffer[0,1] already contain what we want
714712
outputBuffer[2] = v.getWidth();

0 commit comments

Comments
 (0)