Add setting to enable dynamic Material You colors

This commit is contained in:
Niko Diamadis 2025-09-19 21:45:36 +02:00
parent 3f5b006c0a
commit 219eba1261
No known key found for this signature in database
GPG key ID: 27D69B8D68305327
7 changed files with 50 additions and 1 deletions

View file

@ -15,7 +15,9 @@ class Application : Application() {
}
override fun onCreate() {
DynamicColors.applyToActivitiesIfAvailable(this)
if (repository.getDynamicColorsEnabled()) {
DynamicColors.applyToActivitiesIfAvailable(this)
}
super.onCreate()
}
}

View file

@ -68,6 +68,9 @@ class Backuper(val context: Context) {
if (settings.darkMode != null) {
repository.setDarkMode(settings.darkMode)
}
if (settings.dynamicColors != null) {
repository.setDynamicColorsEnabled(settings.dynamicColors)
}
if (settings.connectionProtocol != null) {
repository.setConnectionProtocol(settings.connectionProtocol)
}
@ -234,6 +237,7 @@ class Backuper(val context: Context) {
autoDownloadMaxSize = repository.getAutoDownloadMaxSize(),
autoDeleteSeconds = repository.getAutoDeleteSeconds(),
darkMode = repository.getDarkMode(),
dynamicColors = repository.getDynamicColorsEnabled(),
connectionProtocol = repository.getConnectionProtocol(),
broadcastEnabled = repository.getBroadcastEnabled(),
recordLogs = repository.getRecordLogs(),
@ -357,6 +361,7 @@ data class Settings(
val autoDownloadMaxSize: Long?,
val autoDeleteSeconds: Long?,
val darkMode: Int?,
val dynamicColors: Boolean?,
val connectionProtocol: String?,
val broadcastEnabled: Boolean?,
val recordLogs: Boolean?,

View file

@ -272,6 +272,16 @@ class Repository(private val sharedPrefs: SharedPreferences, private val databas
return sharedPrefs.getInt(SHARED_PREFS_DARK_MODE, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
}
fun setDynamicColorsEnabled(enabled: Boolean) {
sharedPrefs.edit()
.putBoolean(SHARED_PREFS_DYNAMIC_COLORS, enabled)
.apply()
}
fun getDynamicColorsEnabled(): Boolean {
return sharedPrefs.getBoolean(SHARED_PREFS_DYNAMIC_COLORS, false)
}
fun setConnectionProtocol(connectionProtocol: String) {
sharedPrefs.edit()
.putString(SHARED_PREFS_CONNECTION_PROTOCOL, connectionProtocol)
@ -496,6 +506,7 @@ class Repository(private val sharedPrefs: SharedPreferences, private val databas
const val SHARED_PREFS_AUTO_DELETE_SECONDS = "AutoDelete"
const val SHARED_PREFS_CONNECTION_PROTOCOL = "ConnectionProtocol"
const val SHARED_PREFS_DARK_MODE = "DarkMode"
const val SHARED_PREFS_DYNAMIC_COLORS = "DynamicColors"
const val SHARED_PREFS_BROADCAST_ENABLED = "BroadcastEnabled"
const val SHARED_PREFS_UNIFIEDPUSH_ENABLED = "UnifiedPushEnabled"
const val SHARED_PREFS_INSISTENT_MAX_PRIORITY_ENABLED = "InsistentMaxPriority"

View file

@ -327,6 +327,29 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere
}
}
// Dynamic colors
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
val dynamicColorsEnabledPrefId = context?.getString(R.string.settings_general_dynamic_colors_key) ?: return
val dynamicColorsEnabled: SwitchPreferenceCompat? = findPreference(dynamicColorsEnabledPrefId)
dynamicColorsEnabled?.isChecked = repository.getDynamicColorsEnabled()
dynamicColorsEnabled?.preferenceDataStore = object : PreferenceDataStore() {
override fun putBoolean(key: String?, value: Boolean) {
repository.setDynamicColorsEnabled(value)
}
override fun getBoolean(key: String?, defValue: Boolean): Boolean {
return repository.getDynamicColorsEnabled()
}
}
dynamicColorsEnabled?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { pref ->
if (pref.isChecked) {
getString(R.string.settings_general_dynamic_colors_summary_enabled)
} else {
getString(R.string.settings_general_dynamic_colors_summary_disabled)
}
}
dynamicColorsEnabled?.isVisible = true
}
// Default Base URL
val appBaseUrl = getString(R.string.app_base_url)
val defaultBaseUrlPrefId = context?.getString(R.string.settings_general_default_base_url_key) ?: return

View file

@ -310,6 +310,9 @@
<string name="settings_general_dark_mode_entry_system">Use system default</string>
<string name="settings_general_dark_mode_entry_light">Light mode</string>
<string name="settings_general_dark_mode_entry_dark">Dark mode</string>
<string name="settings_general_dynamic_colors_title">Dynamic colors</string>
<string name="settings_general_dynamic_colors_summary_enabled">Using the dynamic system colors</string>
<string name="settings_general_dynamic_colors_summary_disabled">Using the ntfy theme colors</string>
<string name="settings_backup_restore_header">Backup &amp; Restore</string>
<string name="settings_backup_restore_backup_title">Back up to file</string>
<string name="settings_backup_restore_backup_summary">Export config, notifications, and users</string>

View file

@ -22,6 +22,7 @@
<string name="settings_general_default_base_url_key" translatable="false">DefaultBaseURL</string>
<string name="settings_general_users_key" translatable="false">ManageUsers</string>
<string name="settings_general_dark_mode_key" translatable="false">DarkMode</string>
<string name="settings_general_dynamic_colors_key" translatable="false">DynamicColors</string>
<string name="settings_backup_restore_backup_key" translatable="false">Backup</string>
<string name="settings_backup_restore_restore_key" translatable="false">Restore</string>
<string name="settings_advanced_broadcast_key" translatable="false">BroadcastEnabled</string>

View file

@ -51,6 +51,10 @@
app:entries="@array/settings_general_dark_mode_entries"
app:entryValues="@array/settings_general_dark_mode_values"
app:defaultValue="-1"/>
<SwitchPreferenceCompat
app:key="@string/settings_general_dynamic_colors_key"
app:title="@string/settings_general_dynamic_colors_title"
app:isPreferenceVisible="false"/>
</PreferenceCategory>
<PreferenceCategory app:title="@string/settings_backup_restore_header">
<ListPreference