tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mmobile/android/geckoview/src/main/java/org/mozilla/geckoview/BasicSelectionActionDelegate.java | 2+-
Mmobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java | 37+++++++++++++++++++++++++++++++++++--
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? } /**