From 97355881a855c5d2503f7e518c1e30fc03f88d4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Drobni=C4=8D?= Date: Thu, 22 May 2025 23:54:13 +0200 Subject: [PATCH] Better support for foldable devices (#982) * Add AndroidX WindowManager unfortunately, this seems to be the only way to get fold state, native Android APIs are internal. To add this, we need to update some dependencies, raise java version and raise compile SDK. * adds separate layouts and separate layout settings for folded and unfolded state of the device. The affected settings are: + the margin bottom settings + the horizontal margin settings + the keyboard height settings * Update shell.nix --- build.gradle | 10 ++-- gradle.properties | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- res/values-cs/strings.xml | 2 + res/values-de/strings.xml | 2 + res/values-es/strings.xml | 2 + res/values-fa/strings.xml | 2 + res/values-fr/strings.xml | 2 + res/values-it/strings.xml | 2 + res/values-ja/strings.xml | 2 + res/values-ko/strings.xml | 2 + res/values-lv/strings.xml | 2 + res/values-pl/strings.xml | 2 + res/values-pt/strings.xml | 2 + res/values-ro/strings.xml | 2 + res/values-ru/strings.xml | 2 + res/values-tr/strings.xml | 2 + res/values-uk/strings.xml | 2 + res/values-vi/strings.xml | 2 + res/values-zh-rCN/strings.xml | 2 + res/values/strings.xml | 2 + res/xml/settings.xml | 6 +++ shell.nix | 4 +- srcs/juloo.keyboard2/Config.java | 57 +++++++++++++++----- srcs/juloo.keyboard2/FoldStateTracker.java | 62 ++++++++++++++++++++++ srcs/juloo.keyboard2/Keyboard2.java | 15 +++++- srcs/juloo.keyboard2/SettingsActivity.java | 8 +++ 27 files changed, 179 insertions(+), 25 deletions(-) create mode 100644 srcs/juloo.keyboard2/FoldStateTracker.java diff --git a/build.gradle b/build.gradle index b6f0b51..2f83e36 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,16 @@ plugins { - id 'com.android.application' version '8.1.1' + id 'com.android.application' version '8.6.0' } dependencies { + implementation "androidx.window:window-java:1.3.0" + implementation "androidx.core:core:1.16.0" testImplementation "junit:junit:4.13.2" } android { namespace 'juloo.keyboard2' - compileSdk 34 + compileSdk 35 defaultConfig { applicationId "juloo.keyboard2" @@ -82,8 +84,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } lintOptions { diff --git a/gradle.properties b/gradle.properties index 72138dd..81039a2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.jvmargs=-Dfile.encoding=UTF-8 -android.useAndroidX=false -android.nonTransitiveRClass=true \ No newline at end of file +android.useAndroidX=true +android.nonTransitiveRClass=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b32fb16..3227f43 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Mon Aug 21 18:13:41 CEST 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 0617298..96b2447 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -5,7 +5,9 @@ Nenáročná virtuální klávesnice pro vývojáře. Hlavní funkcí je možnost psát více znaků posunutím kláves směrem k rohům.\n\nTato aplikace byla původně navržena pro programátory používající Termux.\nNyní je ideální pro každodenní použití.\n\nTato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je Open Source. V režimu na výšku + V režimu na šířku + Rozvržení Upravit jas nápisu Upravit průhlednost pozadí klávesnice diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 90781c7..626edc4 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -5,7 +5,9 @@ Eine schlanke, datenschutzfreundliche Bildschirmtastatur für Android. Diese Tastatur zeichnet sich dadurch aus, dass man zusätzliche Zeichen durch Wischgesten in Richtung der Tastenecken eingeben kann.\n\nDie Anwendung wurde ursprünglich für das Programmieren in Termux entwickelt.\nMittlerweile ist sie auch für den täglichen Gebrauch perfekt geeignet.\n\nDiese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quelloffen. Im Hochformatmodus + Im Querformatmodus + Layout Helligkeit der Beschriftung anpassen Deckkraft des Tastaturhintergrunds anpassen diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 810bb25..a3556da 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -5,7 +5,9 @@ Un teclado virtual ligero para Android consciente de su privacidad. La característica principal es que hay acceso a más caractéres deslizando hacia las esquinas de las teclas.\n\nEsta aplicación fue originalmente diseñada para programadores que usaran Termux.\nAhora es perfecta para uso cotidiano.\n\nLa misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y es de Fuente Abierta. En modo vertical + En modo horizontal + Distribución Ajustar brillo de etiqueta Ajustar opacidad del fondo del teclado diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 52b004b..8e2b20c 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -5,7 +5,9 @@ در حالت عمودی + در حالت افقی + طرح تنظیم برچسب روشنایی تنظیم کدر بودن پس‌زمینه صفحه کلید diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index aab6603..0e9a6eb 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -5,7 +5,9 @@ Clavier virtuel léger et respectueux de la vie privée pour Android. La fonctionnalité principale est l\'accès rapide à plus de caractères en balayant les touches vers les coins.\n\nCette application a été conçue à l\'origine pour les programmeurs utilisant Termux.\nElle est maintenant parfaite pour une utilisation quotidienne.\n\nCette application ne contient pas de publicité, n\'accède pas au réseau et est Open Source. En mode portrait + En mode landscape + Disposition Luminosité des symboles Transparence du clavier diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 711e71c..f1cea65 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -5,7 +5,9 @@ Una Tastiera Virtuale Leggera Per La Programmazione + + Layout diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 420bf87..6ab7511 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -5,7 +5,9 @@ 軽量でプライバシーに配慮したAndroid用仮想キーボード このキーボードは、キーの角をスワイプすることで様々なキーを入力できます。\n\nこのアプリは元々はTermuxでのプログラミング用に設計されました。\nしかし、今では普段の入力にも適しています。\nPCキーボードでの半角入力を再現しています。日本語入力、変換は出来ません。\n\nこのアプリは広告を含まず、インターネットに接続せず、そしてオープンソースです。 縦向き + 横向き + レイアウト 文字の明るさ 背景の不透明度 diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index dadb7e4..5be9f9f 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -5,7 +5,9 @@ 개발자들을 위한 가벼운 가상 키보드. 주요 기능은 모서리 방향으로 키를 스와이프하여 더 많은 문자를 입력할 수 있다는 것입니다.\n\n이 앱은 처음에는 Termux를 사용하는 프로그래머들을 위한 것으로 개발되었습니다.\n지금은 일상적인 용도로도 완벽합니다.\n\n이 응용 프로그램에는 광고가 없으며 네트워크 요청을 하지 않고 오픈 소스입니다. 세로 화면 + 가로 화면 + 레이아웃 라벨 밝기 조절 키보드 배경 불투명도 조절 diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 148f186..b2f31d7 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -5,7 +5,9 @@ Mazizmēra un privātumu ievērojoša virtuālā Android tastatūra. Galvenā iezīme ir iespēja ievadīt vairāk rakstzīmju ar pavilkšanu uz taustiņu stūriem.\n\nŠī lietotne sākotnēji tika izstrādāta programmētājiem, kas izmanto Termux.\nTagad lieliski piemērota izmantošanai ikdienā.\n\nŠī lietotne nesatur reklāmas, neveic nekādus tīkla pieprasījumus, un tās pirmkods ir pieejams visiem. Stateniski + Guleniski + Izkārtojums Pielāgot iezīmju spilgtumu Pielāgot tastatūras fona necaurredzamību diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index bf93a38..5455759 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -5,7 +5,9 @@ Lekka i dbająca o prywatność klawiatura wirtualna dla Androida. Główną cechą tej klawiatury jest możliwość wprowadzania więcej znaków poprzez przesuwanie po klawiszach do ich rogów.\n\nTa aplikacja została pierwotnie zaprojektowana z myślą o programistach używających Termuxa.\nObecnie nadaje się doskonale do codziennego użytku.\n\nAplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źródłowy jest dostępny publicznie. W widoku pionowym + W widoku poziomym + Układ Dostosuj jasność znaków Nieprzezroczystość tła klawiatury diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index c85a213..358c493 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -5,7 +5,9 @@ Um teclado virtual leve para desenvolvedores. A principal característica é que você pode digitar mais caracteres deslizando as teclas para os cantos.\n\nO app foi criado originalmente para desenvolvedores que usam Termux.\nAgora aperfeiçoado para o uso diário.\n\nEste aplicativo não contém anúncios, não faz nenhuma solicitação de rede e é Open Source. No modo retrato + No modo paisagem + Layout Ajustar brilho dos rótulos Ajustar opacidade do fundo do teclado diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 8dbf37d..d11341f 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -5,7 +5,9 @@ Tastatură virtuală pentru Android, ușoară și respectuoasă cu viața privată. Funcționalitatea principală este accesul rapid la o mulțime de caractere ASCII prin glisarea către colțurile tastelor.\n\nAceastă aplicație a fost concepută inițial pentru programatori care folosec Termux.\nEste perfectă pentru uzul cotidian.\n\nAceastă aplicație nu conține publicitate, nu folosește rețeaua deloc și e Open Source. În mod portret + În mod panoramă + Aspect Modifică luminozitatea denumirii Modifică opacitatea fundalului tastaturii diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 89c60f5..f885ca1 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -5,7 +5,9 @@ Легкая клавиатура для пользователей, заботящихся о конфиденциальности. Главная особенность клавиатуры — это возможность легко напечатать любой ASCII-символ жестами в углы клавиш.\n\nПриложение изначально было разработано для использования с Termux.\nНа данный момент оно также удобно в повседневном использовании.\n\nПриложение не содержит рекламы, не осуществляет никаких запросов в сеть и имеет открытый исходный код. В портретном режиме + В ландшафтном режиме + Расположение Изменить яркость клавиатуры Изменить прозрачность фона diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 84226c7..68210c1 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -5,7 +5,9 @@ Android için hafif ve güvenlik odaklı bir sanal klavye uygulaması. Bu uygulama özünde tuşların kenarlarından kaydırarak daha fazla karakter yazabilmek amacıyla geliştirildi.\n\nBu uygulama aslında Termux kullanıcıları için geliştirildi.\nArtık gündelik kullanım için de uygun.\n\nBu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz. Portre modunda + Manzara modunda + Tuş düzeni Adjust label brightness Klavye arkaplanı opaklığını ayarla diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 82297b9..f2ed35e 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -5,7 +5,9 @@ Легка та конфіденційна віртуальна клавіатура для Android. Головна особливість полягає в тому, що ви можете вводити більше символів, проводячи клавіші до кутів.\n\nЦя програма спочатку була розроблена для програмістів, які використовують Termux.\nТепер ідеально підходить для щоденного використання.\n\nЦя програма не містить реклами, не надсилає жодних мережевих запитів і має відкритий код. У портретному режимі + У альбомному режимі + Макет Налаштувати яскравість символів Налаштувати прозорість фону клавіатури diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 1b6a306..4dcb6b8 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -5,7 +5,9 @@ Bàn phím ảo gọn nhẹ và tôn trọng quyền riêng tư cho Android. Chức năng chính là dễ dàng gõ nhiều ký tự bằng cách kéo phím về góc của nó.\n\nỨng dụng này ban đầu được thiết kế cho các lập trình viên dùng Termux.\nBây giờ đã hoàn hảo cho việc sử dụng hàng ngày.\n\nỨng dụng này không chứa quảng cáo, không cần đến mạng, và có mã nguồn mở. Trong chế độ chân dung + Trong chế độ phong cảnh + Bố cục Tùy chỉnh độ sáng của phím Tùy chỉnh độ trong suốt của bàn phím diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 62e8e2e..0c7051e 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -5,7 +5,9 @@ 适用于 Android 的轻量级、注重隐私的虚拟键盘。 此应用的主要功能是,通过将按键沿四角滑动,您可以输入更多字符。\n\n此应用最初是为使用 Termux 的程序员而设计的。\n现在对于日常使用来说也很完美。\n\n此应用没有广告,不会发送任何网络请求,而且是开源的。 在竖屏模式下 + 在横屏模式下 + 布局 调整字母亮度 调整键盘背景透明度 diff --git a/res/values/strings.xml b/res/values/strings.xml index e4202df..fad8b41 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5,7 +5,9 @@ Lightweight and privacy-conscious virtual keyboard for Android. The main feature is that you can type more characters by swiping the keys towards the corners.\n\nThis application was originally designed for programmers using Termux.\nNow perfect for everyday use.\n\nThis application contains no ads, doesn\'t make any network requests and is Open Source. In portrait mode + In portrait mode unfolded In landscape mode + In landscape mode unfolded Layout Adjust label brightness Adjust keyboard background opacity diff --git a/res/xml/settings.xml b/res/xml/settings.xml index d13a101..2e32eb6 100644 --- a/res/xml/settings.xml +++ b/res/xml/settings.xml @@ -36,14 +36,20 @@ + + + + + + diff --git a/shell.nix b/shell.nix index cabd6df..be0d8d0 100644 --- a/shell.nix +++ b/shell.nix @@ -5,11 +5,11 @@ let jdk = pkgs.openjdk17; - build_tools_version = "33.0.1"; + build_tools_version = "34.0.0"; android = pkgs.androidenv.composeAndroidPackages { buildToolsVersions = [ build_tools_version ]; - platformVersions = [ "34" ]; + platformVersions = [ "35" ]; abiVersions = [ "armeabi-v7a" ]; inherit repoJson; }; diff --git a/srcs/juloo.keyboard2/Config.java b/srcs/juloo.keyboard2/Config.java index 206c12a..9f27e7e 100644 --- a/srcs/juloo.keyboard2/Config.java +++ b/srcs/juloo.keyboard2/Config.java @@ -5,6 +5,7 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.util.DisplayMetrics; import android.util.TypedValue; +import androidx.window.layout.WindowInfoTracker; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -72,13 +73,16 @@ public final class Config public final IKeyEventHandler handler; public boolean orientation_landscape = false; + public boolean foldable_unfolded = false; /** Index in 'layouts' of the currently used layout. See [get_current_layout()] and [set_current_layout()]. */ int current_layout_portrait; int current_layout_landscape; + int current_layout_unfolded_portrait; + int current_layout_unfolded_landscape; public int bottomInsetMin; - private Config(SharedPreferences prefs, Resources res, IKeyEventHandler h) + private Config(SharedPreferences prefs, Resources res, IKeyEventHandler h, Boolean foldableUnfolded) { _prefs = prefs; // static values @@ -87,7 +91,7 @@ public final class Config labelTextSize = 0.33f; sublabelTextSize = 0.22f; // from prefs - refresh(res); + refresh(res, foldableUnfolded); // initialized later shouldOfferVoiceTyping = false; actionLabel = null; @@ -100,10 +104,12 @@ public final class Config /* ** Reload prefs */ - public void refresh(Resources res) + public void refresh(Resources res, Boolean foldableUnfolded) { DisplayMetrics dm = res.getDisplayMetrics(); orientation_landscape = res.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; + foldable_unfolded = foldableUnfolded; + // The height of the keyboard is relative to the height of the screen. // This is the height of the keyboard if it have 4 rows. int keyboardHeightPercent; @@ -114,12 +120,12 @@ public final class Config { if ("landscape".equals(show_numpad_s)) show_numpad = true; - keyboardHeightPercent = _prefs.getInt("keyboard_height_landscape", 50); + keyboardHeightPercent = _prefs.getInt(foldable_unfolded ? "keyboard_height_landscape_unfolded" : "keyboard_height_landscape", 50); characterSizeScale = 1.25f; } else { - keyboardHeightPercent = _prefs.getInt("keyboard_height", 35); + keyboardHeightPercent = _prefs.getInt(foldable_unfolded ? "keyboard_height_unfolded" : "keyboard_height", 35); } layouts = LayoutsPreference.load_from_preferences(res, _prefs); inverse_numpad = _prefs.getString("numpad_layout", "default").equals("low_first"); @@ -170,6 +176,8 @@ public final class Config pin_entry_enabled = _prefs.getBoolean("pin_entry_enabled", true); current_layout_portrait = _prefs.getInt("current_layout_portrait", 0); current_layout_landscape = _prefs.getInt("current_layout_landscape", 0); + current_layout_unfolded_portrait = _prefs.getInt("current_layout_unfolded_portrait", 0); + current_layout_unfolded_landscape = _prefs.getInt("current_layout_unfolded_landscape", 0); circle_sensitivity = Integer.valueOf(_prefs.getString("circle_sensitivity", "2")); clipboard_history_enabled = _prefs.getBoolean("clipboard_history_enabled", false); bottomInsetMin = Utils.is_navigation_bar_gestural(res) ? @@ -178,19 +186,34 @@ public final class Config public int get_current_layout() { - return (orientation_landscape) - ? current_layout_landscape : current_layout_portrait; + if (foldable_unfolded) { + return (orientation_landscape) + ? current_layout_unfolded_landscape : current_layout_unfolded_portrait; + } else { + return (orientation_landscape) + ? current_layout_landscape : current_layout_portrait; + } } public void set_current_layout(int l) { - if (orientation_landscape) - current_layout_landscape = l; - else - current_layout_portrait = l; + if (foldable_unfolded) { + if (orientation_landscape) + current_layout_unfolded_landscape = l; + else + current_layout_unfolded_portrait = l; + } else { + if (orientation_landscape) + current_layout_landscape = l; + else + current_layout_portrait = l; + } + SharedPreferences.Editor e = _prefs.edit(); e.putInt("current_layout_portrait", current_layout_portrait); e.putInt("current_layout_landscape", current_layout_landscape); + e.putInt("current_layout_unfolded_portrait", current_layout_unfolded_portrait); + e.putInt("current_layout_unfolded_landscape", current_layout_unfolded_landscape); e.apply(); } @@ -213,7 +236,13 @@ public final class Config /** [get_dip_pref] depending on orientation. */ float get_dip_pref_oriented(DisplayMetrics dm, String pref_base_name, float def_port, float def_land) { - String suffix = orientation_landscape ? "_landscape" : "_portrait"; + final String suffix; + if (foldable_unfolded) { + suffix = orientation_landscape ? "_landscape_unfolded" : "_portrait_unfolded"; + } else { + suffix = orientation_landscape ? "_landscape" : "_portrait"; + } + float def = orientation_landscape ? def_land : def_port; return get_dip_pref(dm, pref_base_name + suffix, def); } @@ -249,10 +278,10 @@ public final class Config private static Config _globalConfig = null; public static void initGlobalConfig(SharedPreferences prefs, Resources res, - IKeyEventHandler handler) + IKeyEventHandler handler, Boolean foldableUnfolded) { migrate(prefs); - _globalConfig = new Config(prefs, res, handler); + _globalConfig = new Config(prefs, res, handler, foldableUnfolded); LayoutModifier.init(_globalConfig, res); } diff --git a/srcs/juloo.keyboard2/FoldStateTracker.java b/srcs/juloo.keyboard2/FoldStateTracker.java new file mode 100644 index 0000000..60933c9 --- /dev/null +++ b/srcs/juloo.keyboard2/FoldStateTracker.java @@ -0,0 +1,62 @@ +package juloo.keyboard2; + +import android.content.Context; +import android.content.pm.PackageManager; +import androidx.window.java.layout.WindowInfoTrackerCallbackAdapter; +import androidx.window.layout.DisplayFeature; +import androidx.window.layout.FoldingFeature; +import androidx.window.layout.WindowInfoTracker; +import androidx.window.layout.WindowLayoutInfo; + +import androidx.core.util.Consumer; + + +public class FoldStateTracker { + private final Consumer _innerListener; + private final WindowInfoTrackerCallbackAdapter _windowInfoTracker; + private FoldingFeature _foldingFeature = null; + private Runnable _changedCallback = null; + public FoldStateTracker(Context context) { + _windowInfoTracker = + new WindowInfoTrackerCallbackAdapter(WindowInfoTracker.getOrCreate(context)); + _innerListener = new LayoutStateChangeCallback(); + _windowInfoTracker.addWindowLayoutInfoListener(context, Runnable::run, _innerListener); + } + + public static boolean isFoldableDevice(Context context) { + return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_SENSOR_HINGE_ANGLE); + } + + public boolean isUnfolded() { + // FoldableFeature is only present when the device is unfolded. Otherwise, it's removed. + // A weird decision from Google, but that's how it works: + // https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:window/window/src/main/java/androidx/window/layout/adapter/sidecar/SidecarAdapter.kt;l=187?q=SidecarAdapter + + return _foldingFeature != null; + } + + public void close() { + _windowInfoTracker.removeWindowLayoutInfoListener(_innerListener); + } + + public void setChangedCallback(Runnable _changedCallback) { + this._changedCallback = _changedCallback; + } + + class LayoutStateChangeCallback implements Consumer { + @Override + public void accept(WindowLayoutInfo newLayoutInfo) { + FoldingFeature old = _foldingFeature; + _foldingFeature = null; + for (DisplayFeature feature: newLayoutInfo.getDisplayFeatures()) { + if (feature instanceof FoldingFeature) { + _foldingFeature = (FoldingFeature) feature; + } + } + + if (old != _foldingFeature && _changedCallback != null) { + _changedCallback.run(); + } + } + } +} diff --git a/srcs/juloo.keyboard2/Keyboard2.java b/srcs/juloo.keyboard2/Keyboard2.java index 9e54aaf..9ce78f1 100644 --- a/srcs/juloo.keyboard2/Keyboard2.java +++ b/srcs/juloo.keyboard2/Keyboard2.java @@ -43,6 +43,8 @@ public class Keyboard2 extends InputMethodService private Config _config; + private FoldStateTracker _foldStateTracker; + /** Layout currently visible before it has been modified. */ KeyboardData current_layout_unmodified() { @@ -111,13 +113,22 @@ public class Keyboard2 extends InputMethodService SharedPreferences prefs = DirectBootAwarePreferences.get_shared_preferences(this); _handler = new Handler(getMainLooper()); _keyeventhandler = new KeyEventHandler(this.new Receiver()); - Config.initGlobalConfig(prefs, getResources(), _keyeventhandler); + _foldStateTracker = new FoldStateTracker(this); + Config.initGlobalConfig(prefs, getResources(), _keyeventhandler, _foldStateTracker.isUnfolded()); prefs.registerOnSharedPreferenceChangeListener(this); _config = Config.globalConfig(); _keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard); _keyboardView.reset(); Logs.set_debug_logs(getResources().getBoolean(R.bool.debug_logs)); ClipboardHistoryService.on_startup(this, _keyeventhandler); + _foldStateTracker.setChangedCallback(() -> { refresh_config(); }); + } + + @Override + public void onDestroy() { + super.onDestroy(); + + _foldStateTracker.close(); } private List getEnabledSubtypes(InputMethodManager imm) @@ -234,7 +245,7 @@ public class Keyboard2 extends InputMethodService private void refresh_config() { int prev_theme = _config.theme; - _config.refresh(getResources()); + _config.refresh(getResources(), _foldStateTracker.isUnfolded()); refreshSubtypeImm(); // Refreshing the theme config requires re-creating the views if (prev_theme != _config.theme) diff --git a/srcs/juloo.keyboard2/SettingsActivity.java b/srcs/juloo.keyboard2/SettingsActivity.java index 2b7ae91..dffc986 100644 --- a/srcs/juloo.keyboard2/SettingsActivity.java +++ b/srcs/juloo.keyboard2/SettingsActivity.java @@ -23,6 +23,14 @@ public class SettingsActivity extends PreferenceActivity } catch (Exception _e) { fallbackEncrypted(); return; } addPreferencesFromResource(R.xml.settings); + + boolean foldableDevice = FoldStateTracker.isFoldableDevice(this); + findPreference("margin_bottom_portrait_unfolded").setEnabled(foldableDevice); + findPreference("margin_bottom_landscape_unfolded").setEnabled(foldableDevice); + findPreference("horizontal_margin_portrait_unfolded").setEnabled(foldableDevice); + findPreference("horizontal_margin_landscape_unfolded").setEnabled(foldableDevice); + findPreference("keyboard_height_unfolded").setEnabled(foldableDevice); + findPreference("keyboard_height_landscape_unfolded").setEnabled(foldableDevice); } void fallbackEncrypted()