From 78832f2bd3eebcb3df1a4506675849a5375243a4 Mon Sep 17 00:00:00 2001 From: sspanak Date: Thu, 27 Jun 2024 19:08:08 +0300 Subject: [PATCH] automatic height adjustment to prevent eating up too much screen space --- app/src/main/AndroidManifest.xml | 4 +-- .../github/sspanak/tt9/hacks/DeviceInfo.java | 8 +++++ .../sspanak/tt9/ime/MainViewHandler.java | 22 ++++++++++++- .../sspanak/tt9/ui/main/MainLayoutNumpad.java | 24 ++++++++++++-- .../tt9/ui/main/ResizableMainView.java | 32 +++++++++++-------- 5 files changed, 72 insertions(+), 18 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2288cd99..ca4baca7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/java/io/github/sspanak/tt9/hacks/DeviceInfo.java b/app/src/main/java/io/github/sspanak/tt9/hacks/DeviceInfo.java index 8328a725..ebfdb48a 100644 --- a/app/src/main/java/io/github/sspanak/tt9/hacks/DeviceInfo.java +++ b/app/src/main/java/io/github/sspanak/tt9/hacks/DeviceInfo.java @@ -10,6 +10,14 @@ import android.view.KeyEvent; import androidx.annotation.NonNull; public class DeviceInfo { + public static boolean isLandscapeOrientation(Context context) { + return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; + } + + public static int getScreenHeight(Context context) { + return context.getResources().getDisplayMetrics().heightPixels; + } + public static boolean noKeyboard(Context context) { // all Xiaomi phones are only touchscreen, but some of them report they have a keyboard // See: https://github.com/sspanak/tt9/issues/549 diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/MainViewHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/MainViewHandler.java index dc9bc242..ab9d4218 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/MainViewHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/MainViewHandler.java @@ -1,5 +1,7 @@ package io.github.sspanak.tt9.ime; +import android.view.OrientationEventListener; + import androidx.annotation.Nullable; import io.github.sspanak.tt9.ime.modes.ModeABC; @@ -8,8 +10,26 @@ import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.ui.main.ResizableMainView; +/** + * Informational methods for the on-screen keyboard + **/ abstract public class MainViewHandler extends HotkeyHandler { - /**** Informational methods for the on-screen keyboard ****/ + @Override + protected void onInit() { + super.onInit(); + + OrientationEventListener orientationListener = new OrientationEventListener(getApplicationContext()) { + @Override + public void onOrientationChanged(int orientation) { + mainView.onOrientationChanged(); + } + }; + + if (orientationListener.canDetectOrientation()) { + orientationListener.enable(); + } + } + public int getTextCase() { return mInputMode.getTextCase(); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java index b1515c98..276cd69e 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.Arrays; import io.github.sspanak.tt9.R; +import io.github.sspanak.tt9.hacks.DeviceInfo; import io.github.sspanak.tt9.ime.TraditionalT9; import io.github.sspanak.tt9.ui.main.keys.SoftKey; import io.github.sspanak.tt9.ui.main.keys.SoftKeySettings; @@ -64,6 +65,25 @@ class MainLayoutNumpad extends BaseMainLayout { } + /** + * Uses the key height from the settings, but if it takes up too much of the screen, it will + * be adjusted so that the entire Main View would take up around 50% of the screen in landscape mode + * and 75% in portrait mode. Returns the adjusted height of a single key. + */ + private int getKeyHeightCompat() { + int keyHeight = tt9.getSettings().getNumpadKeyHeight(); + int screenHeight = DeviceInfo.getScreenHeight(tt9.getApplicationContext()); + + boolean isLandscape = DeviceInfo.isLandscapeOrientation(tt9.getApplicationContext()); + double maxScreenHeight = isLandscape ? screenHeight * 0.75 : screenHeight * 0.8; + double maxKeyHeight = isLandscape ? screenHeight * 0.115 : screenHeight * 0.125; + + // it's all very approximate but when it comes to screen dimensions, + // accuracy is not that important + return keyHeight * 5 > maxScreenHeight ? (int) Math.round(maxKeyHeight) : keyHeight; + } + + void setKeyHeight(int height) { if (view == null || height <= 0) { return; @@ -86,7 +106,7 @@ class MainLayoutNumpad extends BaseMainLayout { int getHeight() { if (height <= 0) { Resources resources = tt9.getResources(); - height = tt9.getSettings().getNumpadKeyHeight() * 4 + height = getKeyHeightCompat() * 4 + resources.getDimensionPixelSize(R.dimen.numpad_candidate_height) + resources.getDimensionPixelSize(R.dimen.numpad_padding_bottom) * 4; } @@ -103,7 +123,7 @@ class MainLayoutNumpad extends BaseMainLayout { @Override void render() { getView(); - setKeyHeight(tt9 != null ? tt9.getSettings().getNumpadKeyHeight() : -1); + setKeyHeight(getKeyHeightCompat()); enableClickHandlers(); for (SoftKey key : getKeys()) { key.render(); diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/ResizableMainView.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/ResizableMainView.java index ba7ce94c..3a7ac382 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/ResizableMainView.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/ResizableMainView.java @@ -68,6 +68,16 @@ public class ResizableMainView extends MainView implements View.OnAttachStateCha } } + @Override public void onViewAttachedToWindow(@NonNull View v) { onCreateAdjustHeight(); } + @Override public void onViewDetachedFromWindow(@NonNull View v) {} + + + public void onOrientationChanged() { + calculateSnapHeights(); + calculateInitialHeight(); + render(); + } + public void onResizeStart(float startY) { resizeStartY = startY; @@ -86,6 +96,15 @@ public class ResizableMainView extends MainView implements View.OnAttachStateCha } + public void onResizeThrottled(float currentY) { + long now = System.currentTimeMillis(); + if (now - lastResizeTime > SettingsStore.RESIZE_THROTTLING_TIME) { + lastResizeTime = now; + onResize(currentY); + } + } + + public void onSnap() { SettingsStore settings = tt9.getSettings(); @@ -99,15 +118,6 @@ public class ResizableMainView extends MainView implements View.OnAttachStateCha } - public void onResizeThrottled(float currentY) { - long now = System.currentTimeMillis(); - if (now - lastResizeTime > SettingsStore.RESIZE_THROTTLING_TIME) { - lastResizeTime = now; - onResize(currentY); - } - } - - private void expand(int delta) { SettingsStore settings = tt9.getSettings(); @@ -193,8 +203,4 @@ public class ResizableMainView extends MainView implements View.OnAttachStateCha main.getView().performHapticFeedback(Vibration.getPressVibration(null)); } } - - - @Override public void onViewAttachedToWindow(@NonNull View v) { onCreateAdjustHeight(); } - @Override public void onViewDetachedFromWindow(@NonNull View v) {} }