diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ca4baca7..a29d7cfd 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/preferences/screens/appearance/ItemNumpadAlignment.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/ItemNumpadAlignment.java index eaa51f44..8214ba13 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/ItemNumpadAlignment.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/appearance/ItemNumpadAlignment.java @@ -41,7 +41,7 @@ public class ItemNumpadAlignment extends ItemDropDown { options.put(Gravity.END, context.getString(R.string.virtual_numpad_alignment_right)); super.populateIntegers(options); - super.setValue(settings.getNumpadKeyAlignment() + ""); + super.setValue(settings.getNumpadAlignment() + ""); onLayoutChange(settings.getMainViewLayout()); return this; diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java index daa0b7d2..96226729 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsUI.java @@ -39,10 +39,19 @@ public class SettingsUI extends SettingsTyping { return prefs.getBoolean("pref_haptic_feedback", true); } - public int getNumpadKeyAlignment() { + public int getNumpadAlignment() { return getStringifiedInt("pref_numpad_alignment", Gravity.CENTER_HORIZONTAL); } + public void setNumpadAlignment(int alignment) { + if (alignment != Gravity.CENTER_HORIZONTAL && alignment != Gravity.START && alignment != Gravity.END) { + Logger.w(getClass().getSimpleName(), "Ignoring invalid numpad key alignment: " + alignment); + } + + prefsEditor.putString("pref_numpad_alignment", Integer.toString(alignment)); + prefsEditor.apply(); + } + public int getNumpadKeyDefaultHeight() { return context.getResources().getDimensionPixelSize(R.dimen.numpad_key_height); } 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 e2e6df46..7503ba5b 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 @@ -2,7 +2,6 @@ package io.github.sspanak.tt9.ui.main; import android.content.res.Resources; import android.os.Build; -import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; @@ -34,7 +33,7 @@ class MainLayoutNumpad extends BaseMainLayout { LinearLayout container = view.findViewById(R.id.numpad_container); if (container != null) { - container.setGravity(tt9.getSettings().getNumpadKeyAlignment()); + container.setGravity(tt9.getSettings().getNumpadAlignment()); } } 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 2762b2d5..3c992a05 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 @@ -1,5 +1,6 @@ package io.github.sspanak.tt9.ui.main; +import android.view.Gravity; import android.view.View; import android.view.ViewGroup; @@ -84,6 +85,24 @@ public class ResizableMainView extends MainView implements View.OnAttachStateCha } + public void onAlign(float deltaX) { + boolean right = deltaX > 0; + SettingsStore settings = tt9.getSettings(); + + if (settings.getNumpadAlignment() == Gravity.START && right) { + settings.setNumpadAlignment(Gravity.CENTER_HORIZONTAL); + } else if (settings.getNumpadAlignment() == Gravity.END && !right) { + settings.setNumpadAlignment(Gravity.CENTER_HORIZONTAL); + } else if (settings.getNumpadAlignment() == Gravity.CENTER_HORIZONTAL && right) { + settings.setNumpadAlignment(Gravity.END); + } else if (settings.getNumpadAlignment() == Gravity.CENTER_HORIZONTAL && !right) { + settings.setNumpadAlignment(Gravity.START); + } + + render(); + } + + public void onResizeStart(float startY) { resizeStartY = startY; } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/ResizeHandle.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/ResizeHandle.java index 7b376d5f..bcc92178 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/ResizeHandle.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/ResizeHandle.java @@ -13,12 +13,17 @@ public class ResizeHandle implements View.OnTouchListener { @NonNull private final Runnable onClick; private ResizableMainView mainView; + private final float ALIGN_THRESHOLD; private final float RESIZE_THRESHOLD; - private boolean dragging; + + private boolean aligning; + private boolean resizing; + private float startX; private float startY; ResizeHandle(@NonNull Context context, @NonNull Runnable onClick) { + ALIGN_THRESHOLD = context.getResources().getDimensionPixelSize(R.dimen.numpad_key_height) * 0.75f; RESIZE_THRESHOLD = context.getResources().getDimensionPixelSize(R.dimen.numpad_key_height) / 4.0f; this.onClick = onClick; } @@ -45,27 +50,34 @@ public class ResizeHandle implements View.OnTouchListener { } private void handlePress(MotionEvent event) { + startX = event.getRawX(); startY = event.getRawY(); } private void handleDrag(MotionEvent event) { if (mainView == null) { - dragging = false; + aligning = false; + resizing = false; return; } - if (!dragging && Math.abs(event.getRawY() - startY) >= RESIZE_THRESHOLD) { + if (!resizing && Math.abs(event.getRawY() - startY) >= RESIZE_THRESHOLD) { mainView.onResizeStart(event.getRawY()); - dragging = true; - } else if (dragging) { + resizing = true; + } else if (resizing) { mainView.onResizeThrottled(event.getRawY()); + } else if (!aligning && Math.abs(event.getRawX() - startX) >= ALIGN_THRESHOLD) { + mainView.onAlign(event.getRawX() - startX); + aligning = true; } } private void handleRelease(MotionEvent event) { - if (mainView != null && dragging) { + if (mainView != null && resizing) { mainView.onResize(event.getRawY()); - dragging = false; + resizing = false; + } else if (mainView != null && aligning) { + aligning = false; } else { onClick.run(); }