From c0b9f318b68597ced8c8215fdca1c3ab0d4674f4 Mon Sep 17 00:00:00 2001 From: Ziqi Chen Date: Tue, 26 Nov 2024 05:57:29 +0000 Subject: Fix bug: AOSP keyboard is shown incompletely in Android V landscape mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause: The AOSP keyboard uses `DisplayMetrics#widthPixels` to calculate the keyboard width and draw keys. Since Android 15’s edge-to-edge enforcement, this property now returns the full screen width, including window insets. This results in an incorrectly large key width calculation. Fix: Subtract window insets including system bar and display cutout from the width. Change-Id: Iea01ba749a48145cf5b484dc22a570874b1b7ca4 Test: use `m LatinIME` to install the AOSP keyboard and test landscape mode manually Bug: 377594757 --- .../inputmethod/latin/utils/ResourceUtils.java | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'java/src/com/android/inputmethod/latin/utils/ResourceUtils.java') diff --git a/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java b/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java index cc0d470df..f799be750 100644 --- a/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java @@ -16,13 +16,18 @@ package com.android.inputmethod.latin.utils; +import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; +import android.graphics.Insets; import android.os.Build; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; +import android.view.WindowInsets; +import android.view.WindowManager; +import android.view.WindowMetrics; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.latin.R; @@ -182,8 +187,20 @@ public final class ResourceUtils { return matchedAll; } - public static int getDefaultKeyboardWidth(final Resources res) { - final DisplayMetrics dm = res.getDisplayMetrics(); + public static int getDefaultKeyboardWidth(final Context context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { + // Since Android 15’s edge-to-edge enforcement, window insets should be considered. + final WindowManager wm = context.getSystemService(WindowManager.class); + final WindowMetrics windowMetrics = wm.getCurrentWindowMetrics(); + final Insets insets = + windowMetrics + .getWindowInsets() + .getInsetsIgnoringVisibility( + WindowInsets.Type.systemBars() + | WindowInsets.Type.displayCutout()); + return windowMetrics.getBounds().width() - insets.left - insets.right; + } + final DisplayMetrics dm = context.getResources().getDisplayMetrics(); return dm.widthPixels; } -- cgit v1.2.3-83-g751a