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" />