From 6b31f8dc3b72822b48fb1f2bf95b795083b32213 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Fri, 1 Nov 2024 23:16:27 +0100 Subject: [PATCH] implemented #56: configurable edge width for edge gestures --- .../LauncherPreferences$Config.java | 1 + .../jrpie/android/launcher/ui/HomeActivity.kt | 15 ++-- .../GestureAreaIndicatorOverlayView.kt | 87 +++++++++++++++++++ app/src/main/res/layout/settings.xml | 20 +++-- app/src/main/res/values/donottranslate.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/preferences.xml | 10 +++ 7 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/de/jrpie/android/launcher/ui/settings/GestureAreaIndicatorOverlayView.kt diff --git a/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java b/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java index 970e97f..904893b 100644 --- a/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java +++ b/app/src/main/java/de/jrpie/android/launcher/preferences/LauncherPreferences$Config.java @@ -60,6 +60,7 @@ import eu.jonahbauer.android.preference.annotations.serializer.PreferenceSeriali @PreferenceGroup(name = "enabled_gestures", prefix = "settings_enabled_gestures_", suffix = "_key", value = { @Preference(name = "double_swipe", type = boolean.class, defaultValue = "true"), @Preference(name = "edge_swipe", type = boolean.class, defaultValue = "true"), + @Preference(name = "edge_swipe_edge_width", type = int.class, defaultValue = "15"), }), }) public final class LauncherPreferences$Config { diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt index f23d25e..5cee25e 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/HomeActivity.kt @@ -57,6 +57,8 @@ class HomeActivity : UIObject, AppCompatActivity(), } } + private var edgeWidth = 0.15f + private var bufferedPointerCount = 1 // how many fingers on screen private var pointerBufferTimer = Timer() @@ -99,6 +101,7 @@ class HomeActivity : UIObject, AppCompatActivity(), LauncherPreferences.getSharedPreferences() .registerOnSharedPreferenceChangeListener(sharedPreferencesListener) + } private fun updateClock() { @@ -161,6 +164,9 @@ class HomeActivity : UIObject, AppCompatActivity(), override fun onResume() { super.onResume() + + edgeWidth = LauncherPreferences.enabled_gestures().edgeSwipeEdgeWidth() / 100f + updateClock() } @@ -200,7 +206,6 @@ class HomeActivity : UIObject, AppCompatActivity(), val doubleActions = LauncherPreferences.enabled_gestures().doubleSwipe() val edgeActions = LauncherPreferences.enabled_gestures().edgeSwipe() - val edgeStrictness = 0.15 val threshold = ViewConfiguration.get(this).scaledTouchSlop @@ -227,15 +232,15 @@ class HomeActivity : UIObject, AppCompatActivity(), } if (edgeActions) { - if (max(e1.x, e2.x) < edgeStrictness * width) { + if (max(e1.x, e2.x) < edgeWidth * width) { gesture = gesture?.let { it.getEdgeVariant(Gesture.Edge.LEFT) } - } else if (min(e1.x, e2.x) > (1 - edgeStrictness) * width) { + } else if (min(e1.x, e2.x) > (1 - edgeWidth) * width) { gesture = gesture?.let { it.getEdgeVariant(Gesture.Edge.RIGHT) } } - if (max(e1.y, e2.y) < edgeStrictness * height) { + if (max(e1.y, e2.y) < edgeWidth * height) { gesture = gesture?.let { it.getEdgeVariant(Gesture.Edge.TOP) } - } else if (min(e1.y, e2.y) > (1 - edgeStrictness) * height) { + } else if (min(e1.y, e2.y) > (1 - edgeWidth) * height) { gesture = gesture?.let { it.getEdgeVariant(Gesture.Edge.BOTTOM) } } } diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/settings/GestureAreaIndicatorOverlayView.kt b/app/src/main/java/de/jrpie/android/launcher/ui/settings/GestureAreaIndicatorOverlayView.kt new file mode 100644 index 0000000..7ee475f --- /dev/null +++ b/app/src/main/java/de/jrpie/android/launcher/ui/settings/GestureAreaIndicatorOverlayView.kt @@ -0,0 +1,87 @@ +package de.jrpie.android.launcher.ui.settings + +import android.animation.AnimatorListenerAdapter +import android.content.Context +import android.content.SharedPreferences +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.util.AttributeSet +import android.view.View +import android.view.animation.AccelerateInterpolator +import android.view.animation.AlphaAnimation +import android.view.animation.Animation +import de.jrpie.android.launcher.preferences.LauncherPreferences + +/* + * An overlay to indicate the areas where edge-gestures are detected + */ +class GestureAreaIndicatorOverlayView(context: Context?, attrs: AttributeSet?) : View(context, attrs) { + + private var horizontalWidth = 0.1f + private var verticalWidth = 0.1f + + private lateinit var edgeLeft: Rect + private lateinit var edgeRight: Rect + private lateinit var edgeTop: Rect + private lateinit var edgeBottom: Rect + + private val hideTask = Runnable { + visibility = INVISIBLE + } + + private var sharedPreferencesListener = + SharedPreferences.OnSharedPreferenceChangeListener { _, prefKey -> + if (prefKey == LauncherPreferences.enabled_gestures().keys().edgeSwipeEdgeWidth()) { + + this.removeCallbacks(hideTask) + visibility = VISIBLE + + update() + + requestLayout() + invalidate() + + this.postDelayed(hideTask, 3000) + } + } + + + constructor(context: Context) : this(context, null) { } + + private val overlayPaint = Paint() + init { + overlayPaint.setARGB(50,255,0,0) + overlayPaint.strokeWidth = 10f + + update() + } + + private fun update() { + horizontalWidth = LauncherPreferences.enabled_gestures().edgeSwipeEdgeWidth() / 100f + verticalWidth = horizontalWidth + + edgeTop = Rect(0,0,(width * horizontalWidth).toInt(), height) + edgeBottom = Rect((width * (1 - horizontalWidth)).toInt(),0,width, height) + edgeLeft = Rect(0,0, width, (height * verticalWidth).toInt()) + edgeRight = Rect(0,(height * (1-verticalWidth)).toInt(), width, height) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + LauncherPreferences.getSharedPreferences().registerOnSharedPreferenceChangeListener(sharedPreferencesListener) + } + + override fun onDetachedFromWindow() { + LauncherPreferences.getSharedPreferences().unregisterOnSharedPreferenceChangeListener(sharedPreferencesListener) + super.onDetachedFromWindow() + } + + override fun onDraw(canvas: Canvas) { + + arrayOf(edgeLeft, + edgeRight, edgeTop, edgeBottom).forEach { e -> + canvas.drawRect(e, overlayPaint) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/settings.xml b/app/src/main/res/layout/settings.xml index 68d1d9a..f7d5c6e 100644 --- a/app/src/main/res/layout/settings.xml +++ b/app/src/main/res/layout/settings.xml @@ -1,6 +1,5 @@ - + custom:type="solid" /> + + + + diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 093a28c..3a3a569 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -97,6 +97,7 @@ enabled_gestures.double_actions enabled_gestures.edge_actions + enabled_gestures.edge_actions.edge_width functionality.search_auto_launch functionality.search_auto_keyboard diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 09ecd60..49e11fc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -109,6 +109,7 @@ Double swipe actions Edge swipe actions + Edge width Launch search results Start keyboard for search diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 740cb5a..3bdccfc 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -95,6 +95,16 @@ android:key="@string/settings_enabled_gestures_edge_swipe_key" android:defaultValue="true" android:title="@string/settings_enabled_gestures_edge_swipe"/> + + + +