Skip to content

Commit a9bee67

Browse files
authored
Merge pull request #9775 from shamim-emon/fix-issue-9774
Add interactions subcategory and migrate volume navigation key Setting
2 parents f5d8904 + 39976a0 commit a9bee67

File tree

9 files changed

+103
-10
lines changed

9 files changed

+103
-10
lines changed

core/preference/api/src/commonMain/kotlin/net/thunderbird/core/preference/GeneralSettings.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package net.thunderbird.core.preference
22

33
import net.thunderbird.core.preference.debugging.DebuggingSettings
44
import net.thunderbird.core.preference.display.DisplaySettings
5+
import net.thunderbird.core.preference.interaction.InteractionSettings
56
import net.thunderbird.core.preference.network.NetworkSettings
67
import net.thunderbird.core.preference.notification.NotificationPreference
78
import net.thunderbird.core.preference.privacy.PrivacySettings
@@ -20,6 +21,7 @@ data class GeneralSettings(
2021
val display: DisplaySettings = DisplaySettings(),
2122
val privacy: PrivacySettings = PrivacySettings(),
2223
val debugging: DebuggingSettings = DebuggingSettings(),
24+
val interaction: InteractionSettings = InteractionSettings(),
2325
)
2426

2527
enum class BackgroundSync {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package net.thunderbird.core.preference.interaction
2+
3+
const val INTERACTION_SETTINGS_DEFAULT_USE_VOLUME_KEYS_NAVIGATION = false
4+
5+
data class InteractionSettings(
6+
val useVolumeKeysForNavigation: Boolean = INTERACTION_SETTINGS_DEFAULT_USE_VOLUME_KEYS_NAVIGATION,
7+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package net.thunderbird.core.preference.interaction
2+
3+
import net.thunderbird.core.preference.PreferenceManager
4+
5+
const val KEY_USE_VOLUME_KEYS_FOR_NAVIGATION = "useVolumeKeysForNavigation"
6+
interface InteractionSettingsPreferenceManager : PreferenceManager<InteractionSettings>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package net.thunderbird.core.preference.interaction
2+
3+
import kotlinx.coroutines.CoroutineDispatcher
4+
import kotlinx.coroutines.CoroutineScope
5+
import kotlinx.coroutines.Dispatchers
6+
import kotlinx.coroutines.SupervisorJob
7+
import kotlinx.coroutines.flow.Flow
8+
import kotlinx.coroutines.flow.MutableStateFlow
9+
import kotlinx.coroutines.flow.update
10+
import kotlinx.coroutines.launch
11+
import kotlinx.coroutines.sync.Mutex
12+
import kotlinx.coroutines.sync.withLock
13+
import net.thunderbird.core.logging.Logger
14+
import net.thunderbird.core.preference.storage.Storage
15+
import net.thunderbird.core.preference.storage.StorageEditor
16+
17+
private const val TAG = "DefaultInteractionSettingsPreferenceManager"
18+
19+
class DefaultInteractionSettingsPreferenceManager(
20+
private val logger: Logger,
21+
private val storage: Storage,
22+
private val storageEditor: StorageEditor,
23+
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO,
24+
private var scope: CoroutineScope = CoroutineScope(SupervisorJob()),
25+
) : InteractionSettingsPreferenceManager {
26+
private val configState: MutableStateFlow<InteractionSettings> = MutableStateFlow(value = loadConfig())
27+
private val mutex = Mutex()
28+
29+
override fun getConfig(): InteractionSettings = configState.value
30+
override fun getConfigFlow(): Flow<InteractionSettings> = configState
31+
32+
override fun save(config: InteractionSettings) {
33+
logger.debug(TAG) { "save() called with: config = $config" }
34+
writeConfig(config)
35+
configState.update { config }
36+
}
37+
38+
private fun loadConfig(): InteractionSettings = InteractionSettings(
39+
useVolumeKeysForNavigation = storage.getBoolean(
40+
KEY_USE_VOLUME_KEYS_FOR_NAVIGATION,
41+
INTERACTION_SETTINGS_DEFAULT_USE_VOLUME_KEYS_NAVIGATION,
42+
),
43+
)
44+
45+
private fun writeConfig(config: InteractionSettings) {
46+
logger.debug(TAG) { "writeConfig() called with: config = $config" }
47+
scope.launch(ioDispatcher) {
48+
mutex.withLock {
49+
storageEditor.putBoolean(KEY_USE_VOLUME_KEYS_FOR_NAVIGATION, config.useVolumeKeysForNavigation)
50+
storageEditor.commit().also { commited ->
51+
logger.verbose(TAG) { "writeConfig: storageEditor.commit() resulted in: $commited" }
52+
}
53+
}
54+
}
55+
}
56+
}

legacy/core/src/main/java/com/fsck/k9/K9.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,6 @@ object K9 : KoinComponent {
154154
var messageViewPostMarkAsUnreadNavigation: PostMarkAsUnreadNavigation =
155155
PostMarkAsUnreadNavigation.ReturnToMessageList
156156

157-
@JvmStatic
158-
var isUseVolumeKeysForNavigation = false
159-
160157
@JvmStatic
161158
var isShowAccountSelector = true
162159

@@ -239,7 +236,6 @@ object K9 : KoinComponent {
239236
@JvmStatic
240237
@Suppress("LongMethod")
241238
fun loadPrefs(storage: Storage) {
242-
isUseVolumeKeysForNavigation = storage.getBoolean("useVolumeKeysForNavigation", false)
243239
isShowAccountSelector = storage.getBoolean("showAccountSelector", true)
244240
messageListPreviewLines = storage.getInt("messageListPreviewLines", 2)
245241

@@ -304,7 +300,6 @@ object K9 : KoinComponent {
304300

305301
@Suppress("LongMethod")
306302
internal fun save(editor: StorageEditor) {
307-
editor.putBoolean("useVolumeKeysForNavigation", isUseVolumeKeysForNavigation)
308303
editor.putBoolean("notificationDuringQuietTimeEnabled", isNotificationDuringQuietTimeEnabled)
309304
editor.putEnum("messageListDensity", messageListDensity)
310305
editor.putBoolean("showAccountSelector", isShowAccountSelector)

legacy/core/src/main/java/com/fsck/k9/preferences/DefaultGeneralSettingsManager.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import net.thunderbird.core.preference.display.coreSettings.DisplayCoreSettingsP
2323
import net.thunderbird.core.preference.display.inboxSettings.DisplayInboxSettingsPreferenceManager
2424
import net.thunderbird.core.preference.display.miscSettings.DisplayMiscSettingsPreferenceManager
2525
import net.thunderbird.core.preference.display.visualSettings.DisplayVisualSettingsPreferenceManager
26+
import net.thunderbird.core.preference.interaction.InteractionSettingsPreferenceManager
2627
import net.thunderbird.core.preference.network.NetworkSettingsPreferenceManager
2728
import net.thunderbird.core.preference.notification.NotificationPreferenceManager
2829
import net.thunderbird.core.preference.privacy.PrivacySettingsPreferenceManager
@@ -51,6 +52,7 @@ internal class DefaultGeneralSettingsManager(
5152
private val displayMiscSettingsPreferenceManager: DisplayMiscSettingsPreferenceManager,
5253
private val networkSettingsPreferenceManager: NetworkSettingsPreferenceManager,
5354
private val debuggingSettingsPreferenceManager: DebuggingSettingsPreferenceManager,
55+
private val interactionSettingsPreferenceManager: InteractionSettingsPreferenceManager,
5456
private val debugLogConfigurator: DebugLogConfigurator,
5557
private val backgroundDispatcher: CoroutineDispatcher = Dispatchers.IO,
5658
) : GeneralSettingsManager {
@@ -107,6 +109,9 @@ internal class DefaultGeneralSettingsManager(
107109
debugLogConfigurator.updateSyncLogging(debuggingSettings.isSyncLoggingEnabled)
108110
}
109111
}
112+
.combine(interactionSettingsPreferenceManager.getConfigFlow()) { generalSettings, interactionSettings ->
113+
generalSettings.copy(interaction = interactionSettings)
114+
}
110115
.stateIn(
111116
scope = coroutineScope,
112117
started = SharingStarted.WhileSubscribed(),
@@ -159,6 +164,7 @@ internal class DefaultGeneralSettingsManager(
159164
displayMiscSettingsPreferenceManager.save(config.display.miscSettings)
160165
networkSettingsPreferenceManager.save(config.network)
161166
debuggingSettingsPreferenceManager.save(config.debugging)
167+
interactionSettingsPreferenceManager.save(config.interaction)
162168
}
163169
}
164170
}

legacy/core/src/main/java/com/fsck/k9/preferences/KoinModule.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import net.thunderbird.core.preference.display.miscSettings.DefaultDisplayMiscSe
1919
import net.thunderbird.core.preference.display.miscSettings.DisplayMiscSettingsPreferenceManager
2020
import net.thunderbird.core.preference.display.visualSettings.DefaultDisplayVisualSettingsPreferenceManager
2121
import net.thunderbird.core.preference.display.visualSettings.DisplayVisualSettingsPreferenceManager
22+
import net.thunderbird.core.preference.interaction.DefaultInteractionSettingsPreferenceManager
23+
import net.thunderbird.core.preference.interaction.InteractionSettingsPreferenceManager
2224
import net.thunderbird.core.preference.network.DefaultNetworkSettingsPreferenceManager
2325
import net.thunderbird.core.preference.network.NetworkSettingsPreferenceManager
2426
import net.thunderbird.core.preference.notification.DefaultNotificationPreferenceManager
@@ -88,6 +90,13 @@ val preferencesModule = module {
8890
storageEditor = get<Preferences>().createStorageEditor(),
8991
)
9092
}
93+
single<InteractionSettingsPreferenceManager> {
94+
DefaultInteractionSettingsPreferenceManager(
95+
logger = get(),
96+
storage = get<Preferences>().storage,
97+
storageEditor = get<Preferences>().createStorageEditor(),
98+
)
99+
}
91100
single<DisplaySettingsPreferenceManager> {
92101
DefaultDisplaySettingsPreferenceManager(
93102
logger = get(),
@@ -132,6 +141,7 @@ val preferencesModule = module {
132141
displayMiscSettingsPreferenceManager = get(),
133142
networkSettingsPreferenceManager = get(),
134143
debuggingSettingsPreferenceManager = get(),
144+
interactionSettingsPreferenceManager = get(),
135145
debugLogConfigurator = get(),
136146
)
137147
} bind GeneralSettingsManager::class

legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,7 @@ open class MessageList :
821821
KeyEvent.KEYCODE_VOLUME_UP -> {
822822
if (messageViewContainerFragment != null &&
823823
displayMode != DisplayMode.MESSAGE_LIST &&
824-
K9.isUseVolumeKeysForNavigation
824+
generalSettingsManager.getConfig().interaction.useVolumeKeysForNavigation
825825
) {
826826
showPreviousMessage()
827827
return true
@@ -831,7 +831,7 @@ open class MessageList :
831831
KeyEvent.KEYCODE_VOLUME_DOWN -> {
832832
if (messageViewContainerFragment != null &&
833833
displayMode != DisplayMode.MESSAGE_LIST &&
834-
K9.isUseVolumeKeysForNavigation
834+
generalSettingsManager.getConfig().interaction.useVolumeKeysForNavigation
835835
) {
836836
showNextMessage()
837837
return true
@@ -980,7 +980,7 @@ open class MessageList :
980980

981981
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
982982
// Swallow these events too to avoid the audible notification of a volume change
983-
if (K9.isUseVolumeKeysForNavigation) {
983+
if (generalSettingsManager.getConfig().interaction.useVolumeKeysForNavigation) {
984984
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
985985
Log.v("Swallowed key up.")
986986
return true

legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/general/GeneralSettingsDataStore.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class GeneralSettingsDataStore(
7575
"debug_logging" -> generalSettingsManager.getConfig().debugging.isDebugLoggingEnabled
7676
"sync_debug_logging" -> generalSettingsManager.getConfig().debugging.isSyncLoggingEnabled
7777
"sensitive_logging" -> generalSettingsManager.getConfig().debugging.isSensitiveLoggingEnabled
78-
"volume_navigation" -> K9.isUseVolumeKeysForNavigation
78+
"volume_navigation" -> generalSettingsManager.getConfig().interaction.useVolumeKeysForNavigation
7979
"enable_telemetry" -> K9.isTelemetryEnabled
8080
else -> defValue
8181
}
@@ -115,7 +115,7 @@ class GeneralSettingsDataStore(
115115
"debug_logging" -> setIsDebugLoggingEnabled(isDebugLoggingEnabled = value)
116116
"sync_debug_logging" -> setIsSyncLoggingEnabled(isSyncLoggingEnabled = value)
117117
"sensitive_logging" -> setIsSensitiveLoggingEnabled(isSensitiveLoggingEnabled = value)
118-
"volume_navigation" -> K9.isUseVolumeKeysForNavigation = value
118+
"volume_navigation" -> setUseVolumeKeysForNavigation(value)
119119
"enable_telemetry" -> setTelemetryEnabled(value)
120120
else -> return
121121
}
@@ -630,6 +630,17 @@ class GeneralSettingsDataStore(
630630
}
631631
}
632632

633+
private fun setUseVolumeKeysForNavigation(useVolumeKeysForNavigation: Boolean) {
634+
skipSaveSettings = true
635+
generalSettingsManager.update { settings ->
636+
settings.copy(
637+
interaction = settings.interaction.copy(
638+
useVolumeKeysForNavigation = useVolumeKeysForNavigation,
639+
),
640+
)
641+
}
642+
}
643+
633644
private fun setIsHideUserAgent(isHideUserAgent: Boolean) {
634645
skipSaveSettings = true
635646
generalSettingsManager.update { settings ->

0 commit comments

Comments
 (0)