diff --git a/README.md b/README.md index 016b362..ce1d0d0 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ The following gestures are available: - swipe up / down / left / right, - swipe with two fingers, - swipe on the left / right resp. top / bottom edge, + - tap, then swipe up / down / left / right, - draw < / > / V / Λ - click on date / time, - double click, diff --git a/app/src/main/java/de/jrpie/android/launcher/Functions.kt b/app/src/main/java/de/jrpie/android/launcher/Functions.kt index d162a79..8fc95a3 100644 --- a/app/src/main/java/de/jrpie/android/launcher/Functions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/Functions.kt @@ -104,7 +104,6 @@ fun removeUnusedShortcuts(context: Context) { .toSet() try { userManager.userProfiles.filter { !userManager.isQuietModeEnabled(it) }.forEach { profile -> - Log.e("Shortcuts", "$profile : ${getShortcuts(profile)?.size} shortcuts") getShortcuts(profile)?.groupBy { it.`package` }?.forEach { (p, shortcuts) -> launcherApps.pinShortcuts(p, shortcuts.filter { boundActions.contains(PinnedShortcutInfo(it)) } @@ -114,7 +113,6 @@ fun removeUnusedShortcuts(context: Context) { } } } catch (_: SecurityException) { } - } fun openInBrowser(url: String, context: Context) { diff --git a/app/src/main/java/de/jrpie/android/launcher/actions/Gesture.kt b/app/src/main/java/de/jrpie/android/launcher/actions/Gesture.kt index a4f25b4..110e4f8 100644 --- a/app/src/main/java/de/jrpie/android/launcher/actions/Gesture.kt +++ b/app/src/main/java/de/jrpie/android/launcher/actions/Gesture.kt @@ -79,6 +79,13 @@ enum class Gesture( R.array.default_up_right, R.anim.bottom_up ), + TAP_AND_SWIPE_UP( + "action.tap_up", + R.string.settings_gesture_tap_up, + R.string.settings_gesture_description_tap_up, + R.array.default_up, + R.anim.bottom_up + ), SWIPE_UP_DOUBLE( "action.double_up", R.string.settings_gesture_double_up, @@ -107,6 +114,13 @@ enum class Gesture( R.array.default_down_right, R.anim.top_down ), + TAP_AND_SWIPE_DOWN( + "action.tap_down", + R.string.settings_gesture_tap_down, + R.string.settings_gesture_description_tap_down, + R.array.default_down, + R.anim.bottom_up + ), SWIPE_DOWN_DOUBLE( "action.double_down", R.string.settings_gesture_double_down, @@ -135,6 +149,13 @@ enum class Gesture( R.array.default_messengers, R.anim.right_left ), + TAP_AND_SWIPE_LEFT( + "action.tap_left", + R.string.settings_gesture_tap_left, + R.string.settings_gesture_description_tap_left, + R.array.default_messengers, + R.anim.right_left + ), SWIPE_LEFT_DOUBLE( "action.double_left", R.string.settings_gesture_double_left, @@ -163,6 +184,13 @@ enum class Gesture( R.array.default_right_bottom, R.anim.left_right ), + TAP_AND_SWIPE_RIGHT( + "action.tap_right", + R.string.settings_gesture_tap_right, + R.string.settings_gesture_description_tap_right, + R.array.default_right, + R.anim.left_right + ), SWIPE_RIGHT_DOUBLE( "action.double_right", R.string.settings_gesture_double_right, @@ -279,6 +307,17 @@ enum class Gesture( } } + fun getTapComboVariant(): Gesture { + return when (this) { + SWIPE_UP -> TAP_AND_SWIPE_UP + SWIPE_DOWN -> TAP_AND_SWIPE_DOWN + SWIPE_LEFT -> TAP_AND_SWIPE_LEFT + SWIPE_RIGHT -> TAP_AND_SWIPE_RIGHT + else -> this + } + + } + fun isDoubleVariant(): Boolean { return when (this) { SWIPE_UP_DOUBLE, diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/PinShortcutActivity.kt b/app/src/main/java/de/jrpie/android/launcher/ui/PinShortcutActivity.kt index 27684b7..d19fe04 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/PinShortcutActivity.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/PinShortcutActivity.kt @@ -2,6 +2,7 @@ package de.jrpie.android.launcher.ui import android.app.AlertDialog import android.app.Service +import android.content.Context import android.content.pm.LauncherApps import android.content.pm.LauncherApps.PinItemRequest import android.content.res.Resources @@ -27,8 +28,11 @@ import de.jrpie.android.launcher.preferences.LauncherPreferences class PinShortcutActivity : AppCompatActivity(), UIObject { private lateinit var binding: ActivityPinShortcutBinding + private var isBound = false + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + super.onCreate() enableEdgeToEdge() if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { @@ -47,10 +51,12 @@ class PinShortcutActivity : AppCompatActivity(), UIObject { return } - request.accept() - binding.pinShortcutLabel.text = request.shortcutInfo!!.shortLabel ?: "?" - binding.pinShortcutIcon.setImageDrawable(launcherApps.getShortcutBadgedIconDrawable(request.shortcutInfo, 0)) + binding.pinShortcutLabel.setCompoundDrawables( + launcherApps.getShortcutBadgedIconDrawable(request.shortcutInfo, 0).also { + val size = (40 * resources.displayMetrics.density).toInt() + it.setBounds(0,0, size, size) + }, null, null, null) binding.pinShortcutButtonBind.setOnClickListener { AlertDialog.Builder(this, R.style.AlertDialogCustom) @@ -59,7 +65,11 @@ class PinShortcutActivity : AppCompatActivity(), UIObject { .setNegativeButton(android.R.string.cancel, null) .create().also { it.show() }.let { dialog -> val viewManager = LinearLayoutManager(dialog.context) - val viewAdapter = GestureRecyclerAdapter { gesture -> + val viewAdapter = GestureRecyclerAdapter (dialog.context) { gesture -> + if (!isBound) { + isBound = true + request.accept() + } val editor = LauncherPreferences.getSharedPreferences().edit() ShortcutAction(PinnedShortcutInfo(request.shortcutInfo!!)).bindToGesture(editor, gesture.id) editor.apply() @@ -72,6 +82,8 @@ class PinShortcutActivity : AppCompatActivity(), UIObject { } } } + + binding.pinShortcutClose.setOnClickListener { finish() } } override fun onStart() { @@ -83,7 +95,7 @@ class PinShortcutActivity : AppCompatActivity(), UIObject { return modifyTheme(super.getTheme()) } - inner class GestureRecyclerAdapter(val onClick: (Gesture) -> Unit): RecyclerView.Adapter() { + inner class GestureRecyclerAdapter(val context: Context, val onClick: (Gesture) -> Unit): RecyclerView.Adapter() { val gestures = Gesture.entries.filter { it.isEnabled() }.toList() inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val label = itemView.findViewById(R.id.dialog_select_gesture_row_name) @@ -99,10 +111,10 @@ class PinShortcutActivity : AppCompatActivity(), UIObject { override fun onBindViewHolder(holder: ViewHolder, position: Int) { val gesture = gestures[position] - holder.label.text = gesture.getLabel(applicationContext) - holder.description.text = gesture.getDescription(applicationContext) + holder.label.text = gesture.getLabel(context) + holder.description.text = gesture.getDescription(context) holder.icon.setImageDrawable( - Action.forGesture(gesture)?.getIcon(applicationContext) + Action.forGesture(gesture)?.getIcon(context) ) holder.itemView.setOnClickListener { onClick(gesture) diff --git a/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt b/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt index 0ddbfd1..00629a5 100644 --- a/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt +++ b/app/src/main/java/de/jrpie/android/launcher/ui/TouchGestureDetector.kt @@ -240,6 +240,10 @@ class TouchGestureDetector( gesture = gesture?.getEdgeVariant(Gesture.Edge.BOTTOM) } } + + if (timeStart - lastTappedTime < 2 * DOUBLE_TAP_TIMEOUT) { + gesture = gesture?.getTapComboVariant() + } gesture?.invoke(context) } } diff --git a/app/src/main/res/drawable/baseline_close_24.xml b/app/src/main/res/drawable/baseline_close_24.xml index 41350ac..2ab439d 100644 --- a/app/src/main/res/drawable/baseline_close_24.xml +++ b/app/src/main/res/drawable/baseline_close_24.xml @@ -1,7 +1,6 @@ diff --git a/app/src/main/res/drawable/baseline_favorite_24.xml b/app/src/main/res/drawable/baseline_favorite_24.xml index 4f9b020..5a612d2 100644 --- a/app/src/main/res/drawable/baseline_favorite_24.xml +++ b/app/src/main/res/drawable/baseline_favorite_24.xml @@ -1,7 +1,6 @@ diff --git a/app/src/main/res/drawable/baseline_favorite_border_24.xml b/app/src/main/res/drawable/baseline_favorite_border_24.xml index cecc9b0..14875dd 100644 --- a/app/src/main/res/drawable/baseline_favorite_border_24.xml +++ b/app/src/main/res/drawable/baseline_favorite_border_24.xml @@ -1,7 +1,6 @@ diff --git a/app/src/main/res/drawable/baseline_flashlight_on_24.xml b/app/src/main/res/drawable/baseline_flashlight_on_24.xml index e1326ae..16654cd 100644 --- a/app/src/main/res/drawable/baseline_flashlight_on_24.xml +++ b/app/src/main/res/drawable/baseline_flashlight_on_24.xml @@ -1,7 +1,6 @@ diff --git a/app/src/main/res/drawable/baseline_lock_24.xml b/app/src/main/res/drawable/baseline_lock_24.xml index 1e96180..8cb2d1f 100644 --- a/app/src/main/res/drawable/baseline_lock_24.xml +++ b/app/src/main/res/drawable/baseline_lock_24.xml @@ -2,9 +2,8 @@ android:width="24dp" android:height="24dp" android:viewportWidth="960" - android:viewportHeight="960" - android:tint="?attr/colorControlNormal"> - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/baseline_lock_open_24.xml b/app/src/main/res/drawable/baseline_lock_open_24.xml index f0f6ea3..8d8e09b 100644 --- a/app/src/main/res/drawable/baseline_lock_open_24.xml +++ b/app/src/main/res/drawable/baseline_lock_open_24.xml @@ -1,7 +1,6 @@ + - + diff --git a/app/src/main/res/drawable/baseline_more_horiz_24.xml b/app/src/main/res/drawable/baseline_more_horiz_24.xml index a370298..061fae2 100644 --- a/app/src/main/res/drawable/baseline_more_horiz_24.xml +++ b/app/src/main/res/drawable/baseline_more_horiz_24.xml @@ -1,5 +1,11 @@ - + - + diff --git a/app/src/main/res/drawable/baseline_not_interested_24.xml b/app/src/main/res/drawable/baseline_not_interested_24.xml index 48ab05d..875f546 100644 --- a/app/src/main/res/drawable/baseline_not_interested_24.xml +++ b/app/src/main/res/drawable/baseline_not_interested_24.xml @@ -1,7 +1,6 @@ diff --git a/app/src/main/res/drawable/baseline_notifications_24.xml b/app/src/main/res/drawable/baseline_notifications_24.xml index b695693..ca969df 100644 --- a/app/src/main/res/drawable/baseline_notifications_24.xml +++ b/app/src/main/res/drawable/baseline_notifications_24.xml @@ -1,7 +1,6 @@ diff --git a/app/src/main/res/drawable/baseline_search_24.xml b/app/src/main/res/drawable/baseline_search_24.xml index ca9cbc0..9ba30e3 100644 --- a/app/src/main/res/drawable/baseline_search_24.xml +++ b/app/src/main/res/drawable/baseline_search_24.xml @@ -1,7 +1,6 @@ diff --git a/app/src/main/res/drawable/baseline_security_24.xml b/app/src/main/res/drawable/baseline_security_24.xml index 3c260ff..cd38b06 100644 --- a/app/src/main/res/drawable/baseline_security_24.xml +++ b/app/src/main/res/drawable/baseline_security_24.xml @@ -1,6 +1,5 @@ diff --git a/app/src/main/res/drawable/baseline_settings_24.xml b/app/src/main/res/drawable/baseline_settings_24.xml index 7cb5b17..4200acc 100644 --- a/app/src/main/res/drawable/baseline_settings_24.xml +++ b/app/src/main/res/drawable/baseline_settings_24.xml @@ -1,7 +1,6 @@ diff --git a/app/src/main/res/drawable/baseline_settings_applications_24.xml b/app/src/main/res/drawable/baseline_settings_applications_24.xml index f2d03cc..dd30af7 100644 --- a/app/src/main/res/drawable/baseline_settings_applications_24.xml +++ b/app/src/main/res/drawable/baseline_settings_applications_24.xml @@ -1,7 +1,6 @@ diff --git a/app/src/main/res/drawable/baseline_skip_next_24.xml b/app/src/main/res/drawable/baseline_skip_next_24.xml index 0091e03..9e203e0 100644 --- a/app/src/main/res/drawable/baseline_skip_next_24.xml +++ b/app/src/main/res/drawable/baseline_skip_next_24.xml @@ -1,7 +1,6 @@ diff --git a/app/src/main/res/drawable/baseline_skip_previous_24.xml b/app/src/main/res/drawable/baseline_skip_previous_24.xml index 0029a3e..832a188 100644 --- a/app/src/main/res/drawable/baseline_skip_previous_24.xml +++ b/app/src/main/res/drawable/baseline_skip_previous_24.xml @@ -1,7 +1,6 @@ diff --git a/app/src/main/res/drawable/baseline_volume_down_24.xml b/app/src/main/res/drawable/baseline_volume_down_24.xml index 78b51d3..1a34ad9 100644 --- a/app/src/main/res/drawable/baseline_volume_down_24.xml +++ b/app/src/main/res/drawable/baseline_volume_down_24.xml @@ -2,7 +2,6 @@ android:width="24dp" android:height="24dp" android:autoMirrored="true" - android:tint="?attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/baseline_volume_up_24.xml b/app/src/main/res/drawable/baseline_volume_up_24.xml index 6737fa6..f147499 100644 --- a/app/src/main/res/drawable/baseline_volume_up_24.xml +++ b/app/src/main/res/drawable/baseline_volume_up_24.xml @@ -2,7 +2,6 @@ android:width="24dp" android:height="24dp" android:autoMirrored="true" - android:tint="?attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/layout/activity_pin_shortcut.xml b/app/src/main/res/layout/activity_pin_shortcut.xml index 20889aa..c401b42 100644 --- a/app/src/main/res/layout/activity_pin_shortcut.xml +++ b/app/src/main/res/layout/activity_pin_shortcut.xml @@ -21,50 +21,65 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - + android:layout_height="wrap_content"> + + + + + + + + android:layout_height="wrap_content" + app:layout_constraintTop_toBottomOf="@id/pin_shortcut_appbar"> - + + - - - - - + android:drawablePadding="10dp" + android:gravity="center_vertical" + android:minHeight="40dp" + tools:drawableLeft="@drawable/baseline_settings_24" + tools:text="Shortcut name" />