aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java
diff options
context:
space:
mode:
authorZiqi Chen <czq@google.com>2024-11-26 05:57:29 +0000
committerZiqi Chen <czq@google.com>2024-11-26 05:57:29 +0000
commitc0b9f318b68597ced8c8215fdca1c3ab0d4674f4 (patch)
tree7e62f0c4f78415a888c8144398990eef64e9b95b /java/src/com/android/inputmethod/latin/utils/ResourceUtils.java
parent1923336007591badf4304bb360077dea176dd956 (diff)
downloadlatinime-c0b9f318b68597ced8c8215fdca1c3ab0d4674f4.tar.gz
latinime-c0b9f318b68597ced8c8215fdca1c3ab0d4674f4.tar.xz
latinime-c0b9f318b68597ced8c8215fdca1c3ab0d4674f4.zip
Fix bug: AOSP keyboard is shown incompletely in Android V landscape mode
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
Diffstat (limited to 'java/src/com/android/inputmethod/latin/utils/ResourceUtils.java')
-rw-r--r--java/src/com/android/inputmethod/latin/utils/ResourceUtils.java21
1 files changed, 19 insertions, 2 deletions
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;
}