diff --git a/app/src/main/java/org/lineageos/aperture/SettingsActivity.kt b/app/src/main/java/org/lineageos/aperture/SettingsActivity.kt
index 7af9e024..dd630506 100644
--- a/app/src/main/java/org/lineageos/aperture/SettingsActivity.kt
+++ b/app/src/main/java/org/lineageos/aperture/SettingsActivity.kt
@@ -30,6 +30,7 @@ import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreference
import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.appbar.MaterialToolbar
+import org.lineageos.aperture.ext.gestureActionToString
import org.lineageos.aperture.ext.setOffset
import org.lineageos.aperture.models.HardwareKey
import org.lineageos.aperture.utils.CameraSoundsUtils
@@ -224,6 +225,60 @@ class SettingsActivity : AppCompatActivity(R.layout.activity_settings) {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
super.onCreatePreferences(savedInstanceState, rootKey)
+ val context = requireContext()
+
+ for (hardwareKey in HardwareKey.entries) {
+ val actionPreference = ListPreference(context, null).apply {
+ key = "${hardwareKey.sharedPreferencesKeyPrefix}_action"
+ setTitle(hardwareKey.actionPreferenceTitleStringResId)
+ setDialogTitle(hardwareKey.actionPreferenceTitleStringResId)
+ when {
+ hardwareKey.supportsDefault && hardwareKey.isTwoWayKey -> {
+ setEntries(R.array.gesture_actions_entries)
+ setEntryValues(R.array.gesture_actions_values)
+ }
+ hardwareKey.supportsDefault && !hardwareKey.isTwoWayKey -> {
+ setEntries(R.array.gesture_actions_no_two_way_entries)
+ setEntryValues(R.array.gesture_actions_no_two_way_values)
+ }
+ !hardwareKey.supportsDefault && hardwareKey.isTwoWayKey -> {
+ setEntries(R.array.gesture_actions_no_two_way_entries)
+ setEntryValues(R.array.gesture_actions_no_two_way_values)
+ }
+ else -> {
+ setEntries(R.array.gesture_actions_no_default_no_two_way_entries)
+ setEntryValues(R.array.gesture_actions_no_default_no_two_way_values)
+ }
+ }
+ setDefaultValue(gestureActionToString(hardwareKey.defaultAction))
+ isIconSpaceReserved = false
+ summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
+ }
+
+ if (!hardwareKey.isTwoWayKey) {
+ singleButtonsPreferenceCategory?.addPreference(actionPreference)
+ } else {
+ val invertPreference = SwitchPreference(context, null).apply {
+ key = "${hardwareKey.sharedPreferencesKeyPrefix}_invert"
+ setTitle(hardwareKey.invertPreferenceTitleStringResId!!)
+ setSummary(hardwareKey.invertPreferenceSummaryStringResId!!)
+ setDefaultValue(false)
+ isIconSpaceReserved = false
+ }
+
+ val keyCategory = PreferenceCategory(context, null).apply {
+ key = hardwareKey.sharedPreferencesKeyPrefix
+ setTitle(hardwareKey.preferenceCategoryTitleStringResId!!)
+ isIconSpaceReserved = false
+ }
+
+ preferenceScreen.addPreference(keyCategory)
+
+ keyCategory.addPreference(actionPreference)
+ keyCategory.addPreference(invertPreference)
+ }
+ }
+
recheckKeys()
}
diff --git a/app/src/main/java/org/lineageos/aperture/ext/SharedPreferences.kt b/app/src/main/java/org/lineageos/aperture/ext/SharedPreferences.kt
index 6b2378b8..18502923 100644
--- a/app/src/main/java/org/lineageos/aperture/ext/SharedPreferences.kt
+++ b/app/src/main/java/org/lineageos/aperture/ext/SharedPreferences.kt
@@ -481,3 +481,11 @@ internal fun SharedPreferences.getHardwareKeyInvert(
) = hardwareKey.isTwoWayKey && getBoolean(
"${hardwareKey.sharedPreferencesKeyPrefix}_invert", false
)
+
+internal fun gestureActionToString(gestureAction: GestureAction) = when (gestureAction) {
+ GestureAction.SHUTTER -> "shutter"
+ GestureAction.FOCUS -> "focus"
+ GestureAction.ZOOM -> "zoom"
+ GestureAction.DEFAULT -> "default"
+ GestureAction.NOTHING -> "nothing"
+}
diff --git a/app/src/main/java/org/lineageos/aperture/models/HardwareKey.kt b/app/src/main/java/org/lineageos/aperture/models/HardwareKey.kt
index 5bceede6..2cdf2ab5 100644
--- a/app/src/main/java/org/lineageos/aperture/models/HardwareKey.kt
+++ b/app/src/main/java/org/lineageos/aperture/models/HardwareKey.kt
@@ -7,6 +7,8 @@ package org.lineageos.aperture.models
import android.content.SharedPreferences
import android.view.KeyEvent
+import androidx.annotation.StringRes
+import org.lineageos.aperture.R
/**
* Collection of keys that can be used to do things.
@@ -24,6 +26,10 @@ enum class HardwareKey(
val sharedPreferencesKeyPrefix: String,
val supportsDefault: Boolean,
val defaultAction: GestureAction,
+ @StringRes val actionPreferenceTitleStringResId: Int,
+ @StringRes val preferenceCategoryTitleStringResId: Int? = null,
+ @StringRes val invertPreferenceTitleStringResId: Int? = null,
+ @StringRes val invertPreferenceSummaryStringResId: Int? = null,
) {
CAMERA(
KeyEvent.KEYCODE_CAMERA,
@@ -31,6 +37,7 @@ enum class HardwareKey(
"camera_button",
false,
GestureAction.SHUTTER,
+ R.string.camera_button_action_title,
),
FOCUS(
KeyEvent.KEYCODE_FOCUS,
@@ -38,6 +45,7 @@ enum class HardwareKey(
"focus_button",
false,
GestureAction.FOCUS,
+ R.string.focus_button_action_title,
),
VOLUME(
KeyEvent.KEYCODE_VOLUME_UP,
@@ -45,6 +53,10 @@ enum class HardwareKey(
"volume_buttons",
true,
GestureAction.SHUTTER,
+ R.string.volume_buttons_action_title,
+ R.string.volume_buttons_title,
+ R.string.volume_buttons_invert_title,
+ R.string.volume_buttons_invert_summary,
),
ZOOM(
KeyEvent.KEYCODE_ZOOM_IN,
@@ -52,10 +64,22 @@ enum class HardwareKey(
"zoom_buttons",
false,
GestureAction.ZOOM,
+ R.string.zoom_buttons_action_title,
+ R.string.zoom_buttons_title,
+ R.string.zoom_buttons_invert_title,
+ R.string.zoom_buttons_invert_summary,
);
val isTwoWayKey = secondKeycode != null
+ init {
+ require(
+ !isTwoWayKey || (preferenceCategoryTitleStringResId != null
+ && invertPreferenceTitleStringResId != null
+ && invertPreferenceSummaryStringResId != null)
+ )
+ }
+
companion object {
/**
* keycode to ([HardwareKey], first or increase)
diff --git a/app/src/main/res/xml/gestures_preferences.xml b/app/src/main/res/xml/gestures_preferences.xml
index 7abba0c3..0278eca8 100644
--- a/app/src/main/res/xml/gestures_preferences.xml
+++ b/app/src/main/res/xml/gestures_preferences.xml
@@ -8,72 +8,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ app:title="@string/single_buttons_title" />