commit 4336a2b4c4c804661fe3cef0d72fc81f4e9da1f0
parent 3407a05c9341a2dd39c9118e4683a0e7ca6ba80d
Author: Makoto Kato <m_kato@ga2.so-net.ne.jp>
Date: Wed, 3 Dec 2025 01:56:18 +0000
Bug 2003237 - Use reflection for position issue of text selection menu on Android 9 and 10. r=geckoview-reviewers,ohall
This is similar to bug 1817924 for Android 9 and 10.
Jetpack's `currentWindowBounds` implementation uses reflection to get the
window bounds [*1]. So we should use the same approach to get the
position.
*1 https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:window/window/src/main/java/androidx/window/layout/util/BoundsHelper.kt;l=154-160
Differential Revision: https://phabricator.services.mozilla.com/D274557
Diffstat:
2 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/BasicSelectionActionDelegate.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/BasicSelectionActionDelegate.java
@@ -482,7 +482,7 @@ public class BasicSelectionActionDelegate
// outRect has to convert to current window coordinate.
final Matrix matrix = new Matrix();
- mSession.getScreenToWindowManagerOffsetMatrix(matrix);
+ mSession.getScreenToWindowManagerOffsetMatrix(mActivity, matrix);
final RectF transformedRect = new RectF();
matrix.mapRect(transformedRect, mSelection.screenRect);
transformedRect.roundOut(outRect);
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
@@ -10,7 +10,9 @@ import static org.mozilla.geckoview.GeckoSession.GeckoPrintException.ERROR_NO_PR
import android.Manifest;
import android.annotation.SuppressLint;
+import android.app.Activity;
import android.content.Context;
+import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.Point;
@@ -50,6 +52,9 @@ import java.io.InputStream;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.security.Principal;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
@@ -6937,12 +6942,15 @@ public class GeckoSession {
/**
* Get a matrix for transforming from screen coordinates to Android's current window coordinates.
*
+ * @param activity an Activity of this window.
* @param matrix Matrix to be replaced by the transformation matrix.
* @see <a
* href="https://developer.android.com/guide/topics/large-screens/multi-window-support#window_metrics">...</a>
*/
+ @SuppressLint("BlockedPrivateApi")
@UiThread
- /* package */ void getScreenToWindowManagerOffsetMatrix(@NonNull final Matrix matrix) {
+ /* package */ void getScreenToWindowManagerOffsetMatrix(
+ @NonNull final Activity activity, @NonNull final Matrix matrix) {
ThreadUtils.assertOnUiThread();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
@@ -6954,8 +6962,33 @@ public class GeckoSession {
return;
}
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ try {
+ // Android 9/10 hides WindowConfiguration object.
+ final Configuration config = activity.getResources().getConfiguration();
+ final Field windowConfigurationField =
+ Configuration.class.getDeclaredField("windowConfiguration");
+ windowConfigurationField.setAccessible(true);
+ final Object windowConfig = windowConfigurationField.get(config);
+ final Method getBoundsMethod;
+ if (activity.isInMultiWindowMode()) {
+ getBoundsMethod = windowConfig.getClass().getDeclaredMethod("getBounds");
+ } else {
+ getBoundsMethod = windowConfig.getClass().getDeclaredMethod("getAppBounds");
+ }
+ final Rect currentWindowRect = (Rect) getBoundsMethod.invoke(windowConfig);
+ matrix.postTranslate(-currentWindowRect.left, -currentWindowRect.top);
+ } catch (final NoSuchMethodException
+ | NoSuchFieldException
+ | IllegalAccessException
+ | InvocationTargetException e) {
+ Log.e(LOGTAG, "Could not convert from screen coordinate to window manager coordinate", e);
+ }
+ return;
+ }
+
// TODO(m_kato): Bug 1678531
- // How to get window coordinate on Android 7-10 that supports split window?
+ // How to get window coordinate on Android 8 that supports split window?
}
/**