Use string references for the setting keys. Also make parallel downloads configurable

This commit is contained in:
birdbird 2022-07-11 08:53:41 +00:00
parent fbeacf0246
commit 0c64bd51a6
9 changed files with 244 additions and 198 deletions

@ -245,8 +245,7 @@ class ActiveServerProvider(
if (isOffline()) {
return false
}
val preferences = Settings.preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_SCROBBLE, false)
return Settings.scrobbleEnabled
}
/**

@ -99,36 +99,38 @@ class SettingsFragment :
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setTitle(this, R.string.menu_settings)
theme = findPreference(Constants.PREFERENCES_KEY_THEME)
maxBitrateWifi = findPreference(Constants.PREFERENCES_KEY_MAX_BITRATE_WIFI)
maxBitrateMobile = findPreference(Constants.PREFERENCES_KEY_MAX_BITRATE_MOBILE)
cacheSize = findPreference(Constants.PREFERENCES_KEY_CACHE_SIZE)
cacheLocation = findPreference(Constants.PREFERENCES_KEY_CACHE_LOCATION)
preloadCount = findPreference(Constants.PREFERENCES_KEY_PRELOAD_COUNT)
bufferLength = findPreference(Constants.PREFERENCES_KEY_BUFFER_LENGTH)
incrementTime = findPreference(Constants.PREFERENCES_KEY_INCREMENT_TIME)
networkTimeout = findPreference(Constants.PREFERENCES_KEY_NETWORK_TIMEOUT)
maxAlbums = findPreference(Constants.PREFERENCES_KEY_MAX_ALBUMS)
maxSongs = findPreference(Constants.PREFERENCES_KEY_MAX_SONGS)
maxArtists = findPreference(Constants.PREFERENCES_KEY_MAX_ARTISTS)
defaultArtists = findPreference(Constants.PREFERENCES_KEY_DEFAULT_ARTISTS)
defaultSongs = findPreference(Constants.PREFERENCES_KEY_DEFAULT_SONGS)
defaultAlbums = findPreference(Constants.PREFERENCES_KEY_DEFAULT_ALBUMS)
chatRefreshInterval = findPreference(Constants.PREFERENCES_KEY_CHAT_REFRESH_INTERVAL)
directoryCacheTime = findPreference(Constants.PREFERENCES_KEY_DIRECTORY_CACHE_TIME)
mediaButtonsEnabled = findPreference(Constants.PREFERENCES_KEY_MEDIA_BUTTONS)
theme = findPreference(getString(R.string.setting_key_theme))
maxBitrateWifi = findPreference(getString(R.string.setting_key_max_bitrate_wifi))
maxBitrateMobile = findPreference(getString(R.string.setting_key_max_bitrate_mobile))
cacheSize = findPreference(getString(R.string.setting_key_cache_size))
cacheLocation = findPreference(getString(R.string.setting_key_cache_location))
preloadCount = findPreference(getString(R.string.setting_key_preload_count))
bufferLength = findPreference(getString(R.string.setting_key_buffer_length))
incrementTime = findPreference(getString(R.string.setting_key_increment_time))
networkTimeout = findPreference(getString(R.string.setting_key_network_timeout))
maxAlbums = findPreference(getString(R.string.setting_key_max_albums))
maxSongs = findPreference(getString(R.string.setting_key_max_songs))
maxArtists = findPreference(getString(R.string.setting_key_max_artists))
defaultArtists = findPreference(getString(R.string.setting_key_default_artists))
defaultSongs = findPreference(getString(R.string.setting_key_default_songs))
defaultAlbums = findPreference(getString(R.string.setting_key_default_albums))
chatRefreshInterval = findPreference(getString(R.string.setting_key_chat_refresh_interval))
directoryCacheTime = findPreference(getString(R.string.setting_key_directory_cache_time))
mediaButtonsEnabled = findPreference(getString(R.string.setting_key_media_buttons))
sharingDefaultDescription =
findPreference(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION)
sharingDefaultGreeting = findPreference(Constants.PREFERENCES_KEY_DEFAULT_SHARE_GREETING)
findPreference(getString(R.string.setting_key_default_share_description))
sharingDefaultGreeting =
findPreference(getString(R.string.setting_key_default_share_greeting))
sharingDefaultExpiration =
findPreference(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION)
findPreference(getString(R.string.setting_key_default_share_expiration))
resumeOnBluetoothDevice =
findPreference(Constants.PREFERENCES_KEY_RESUME_ON_BLUETOOTH_DEVICE)
pauseOnBluetoothDevice = findPreference(Constants.PREFERENCES_KEY_PAUSE_ON_BLUETOOTH_DEVICE)
debugLogToFile = findPreference(Constants.PREFERENCES_KEY_DEBUG_LOG_TO_FILE)
showArtistPicture = findPreference(Constants.PREFERENCES_KEY_SHOW_ARTIST_PICTURE)
useId3TagsOffline = findPreference(Constants.PREFERENCES_KEY_ID3_TAGS_OFFLINE)
customCacheLocation = findPreference(Constants.PREFERENCES_KEY_CUSTOM_CACHE_LOCATION)
findPreference(getString(R.string.setting_key_resume_on_bluetooth_device))
pauseOnBluetoothDevice =
findPreference(getString(R.string.setting_key_pause_on_bluetooth_device))
debugLogToFile = findPreference(getString(R.string.setting_key_debug_log_to_file))
showArtistPicture = findPreference(getString(R.string.setting_key_show_artist_picture))
useId3TagsOffline = findPreference(getString(R.string.setting_key_id3_tags_offline))
customCacheLocation = findPreference(getString(R.string.setting_key_custom_cache_location))
sharingDefaultGreeting?.text = shareGreeting
@ -220,22 +222,22 @@ class SettingsFragment :
Timber.d("Preference changed: %s", key)
update()
when (key) {
Constants.PREFERENCES_KEY_HIDE_MEDIA -> {
getString(R.string.setting_key_hide_media) -> {
setHideMedia(sharedPreferences.getBoolean(key, false))
}
Constants.PREFERENCES_KEY_DEBUG_LOG_TO_FILE -> {
getString(R.string.setting_key_debug_log_to_file) -> {
setDebugLogToFile(sharedPreferences.getBoolean(key, false))
}
Constants.PREFERENCES_KEY_ID3_TAGS -> {
getString(R.string.setting_key_id3_tags) -> {
val enabled = sharedPreferences.getBoolean(key, false)
showArtistPicture?.isEnabled = enabled
useId3TagsOffline?.isEnabled = enabled
setupTextColors(enabled)
}
Constants.PREFERENCES_KEY_THEME -> {
getString(R.string.setting_key_theme) -> {
RxBus.themeChangedEventPublisher.onNext(Unit)
}
Constants.PREFERENCES_KEY_CUSTOM_CACHE_LOCATION -> {
getString(R.string.setting_key_custom_cache_location) -> {
if (Settings.customCacheLocation) {
selectCacheLocation()
} else {
@ -360,7 +362,7 @@ class SettingsFragment :
private fun setupClearSearchPreference() {
val clearSearchPreference =
findPreference<Preference>(Constants.PREFERENCES_KEY_CLEAR_SEARCH_HISTORY)
findPreference<Preference>(getString(R.string.setting_key_clear_search_history))
if (clearSearchPreference != null) {
clearSearchPreference.onPreferenceClickListener =
Preference.OnPreferenceClickListener {

@ -190,7 +190,7 @@ class Downloader(
}
// Fill up active List with waiting tasks
while (activelyDownloading.size < PARALLEL_DOWNLOADS && downloadQueue.size > 0) {
while (activelyDownloading.size < Settings.parallelDownloads && downloadQueue.size > 0) {
val task = downloadQueue.remove()
activelyDownloading.add(task)
startDownloadOnService(task)
@ -355,7 +355,6 @@ class Downloader(
}
companion object {
const val PARALLEL_DOWNLOADS = 2
const val CHECK_INTERVAL = 5000L
}

@ -52,63 +52,14 @@ object Constants {
const val CMD_PREVIOUS = "org.moire.ultrasonic.CMD_PREVIOUS"
const val CMD_NEXT = "org.moire.ultrasonic.CMD_NEXT"
// Preferences keys.
const val PREFERENCES_KEY_SERVER_INSTANCE = "serverInstanceId"
const val PREFERENCES_KEY_THEME = "theme"
const val PREFERENCES_KEY_THEME_LIGHT = "light"
const val PREFERENCES_KEY_THEME_DARK = "dark"
const val PREFERENCES_KEY_THEME_BLACK = "black"
const val PREFERENCES_KEY_DISPLAY_BITRATE_WITH_ARTIST = "displayBitrateWithArtist"
const val PREFERENCES_KEY_USE_FOLDER_FOR_ALBUM_ARTIST = "useFolderForAlbumArtist"
const val PREFERENCES_KEY_SHOW_TRACK_NUMBER = "showTrackNumber"
const val PREFERENCES_KEY_MAX_BITRATE_WIFI = "maxBitrateWifi"
const val PREFERENCES_KEY_MAX_BITRATE_MOBILE = "maxBitrateMobile"
const val PREFERENCES_KEY_CACHE_SIZE = "cacheSize"
const val PREFERENCES_KEY_CUSTOM_CACHE_LOCATION = "customCacheLocation"
const val PREFERENCES_KEY_CACHE_LOCATION = "cacheLocation"
const val PREFERENCES_KEY_PRELOAD_COUNT = "preloadCount"
const val PREFERENCES_KEY_HIDE_MEDIA = "hideMedia"
const val PREFERENCES_KEY_MEDIA_BUTTONS = "mediaButtons"
const val PREFERENCES_KEY_SCROBBLE = "scrobble"
const val PREFERENCES_KEY_SERVER_SCALING = "serverScaling"
const val PREFERENCES_KEY_WIFI_REQUIRED_FOR_DOWNLOAD = "wifiRequiredForDownload"
const val PREFERENCES_KEY_BUFFER_LENGTH = "bufferLength"
const val PREFERENCES_KEY_NETWORK_TIMEOUT = "networkTimeout"
const val PREFERENCES_KEY_MAX_ALBUMS = "maxAlbums"
const val PREFERENCES_KEY_MAX_SONGS = "maxSongs"
const val PREFERENCES_KEY_MAX_ARTISTS = "maxArtists"
const val PREFERENCES_KEY_DEFAULT_ALBUMS = "defaultAlbums"
const val PREFERENCES_KEY_DEFAULT_SONGS = "defaultSongs"
const val PREFERENCES_KEY_DEFAULT_ARTISTS = "defaultArtists"
const val PREFERENCES_KEY_SHOW_NOW_PLAYING = "showNowPlaying"
const val PREFERENCES_KEY_CLEAR_SEARCH_HISTORY = "clearSearchHistory"
const val PREFERENCES_KEY_DOWNLOAD_TRANSITION = "transitionToDownloadOnPlay"
const val PREFERENCES_KEY_INCREMENT_TIME = "incrementTime"
const val PREFERENCES_KEY_SHOW_NOW_PLAYING_DETAILS = "showNowPlayingDetails"
const val PREFERENCES_KEY_ID3_TAGS = "useId3Tags"
const val PREFERENCES_KEY_ID3_TAGS_OFFLINE = "useId3TagsOffline"
const val PREFERENCES_KEY_SHOW_ARTIST_PICTURE = "showArtistPicture"
const val PREFERENCES_KEY_CHAT_REFRESH_INTERVAL = "chatRefreshInterval"
const val PREFERENCES_KEY_DIRECTORY_CACHE_TIME = "directoryCacheTime"
const val PREFERENCES_KEY_CLEAR_BOOKMARK = "clearBookmark"
const val PREFERENCES_KEY_DISC_SORT = "discAndTrackSort"
const val PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS = "sharingAlwaysAskForDetails"
const val PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION = "sharingDefaultDescription"
const val PREFERENCES_KEY_DEFAULT_SHARE_GREETING = "sharingDefaultGreeting"
const val PREFERENCES_KEY_SHARE_ON_SERVER = "sharingCreateOnServer"
const val PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION = "sharingDefaultExpiration"
// Legacy Preferences keys
// Warning: Don't add any new here!
// Use setting_keys.xml
const val PREFERENCES_KEY_USE_FIVE_STAR_RATING = "use_five_star_rating"
const val PREFERENCES_KEY_HARDWARE_OFFLOAD = "use_hw_offload"
const val PREFERENCES_KEY_CATEGORY_NOTIFICATIONS = "notificationsCategory"
const val PREFERENCES_KEY_FIRST_RUN_EXECUTED = "firstRunExecuted"
const val PREFERENCES_KEY_RESUME_ON_BLUETOOTH_DEVICE = "resumeOnBluetoothDevice"
const val PREFERENCES_KEY_PAUSE_ON_BLUETOOTH_DEVICE = "pauseOnBluetoothDevice"
const val PREFERENCES_KEY_DEBUG_LOG_TO_FILE = "debugLogToFile"
const val PREFERENCES_KEY_OVERRIDE_LANGUAGE = "overrideLanguage"
const val PREFERENCES_FIRST_INSTALLED_VERSION = "firstInstalledVersion"
const val PREFERENCE_VALUE_ALL = 0
const val PREFERENCE_VALUE_A2DP = 1
const val PREFERENCE_VALUE_DISABLED = 2
const val FILENAME_PLAYLIST_SER = "downloadstate.ser"
const val ALBUM_ART_FILE = "folder.jpeg"
const val STARRED = "starred"

@ -22,8 +22,8 @@ object Settings {
@JvmStatic
var theme by StringSetting(
Constants.PREFERENCES_KEY_THEME,
Constants.PREFERENCES_KEY_THEME_DARK
getKey(R.string.setting_key_theme),
getKey(R.string.setting_key_theme_dark)
)
@JvmStatic
@ -40,26 +40,30 @@ object Settings {
}
}
private var maxWifiBitRate by StringIntSetting(Constants.PREFERENCES_KEY_MAX_BITRATE_WIFI)
private var maxWifiBitRate
by StringIntSetting(getKey(R.string.setting_key_max_bitrate_wifi))
private var maxMobileBitRate by StringIntSetting(Constants.PREFERENCES_KEY_MAX_BITRATE_MOBILE)
private var maxMobileBitRate
by StringIntSetting(getKey(R.string.setting_key_max_bitrate_mobile))
@JvmStatic
val preloadCount: Int
get() {
val preferences = preferences
val preloadCount =
preferences.getString(Constants.PREFERENCES_KEY_PRELOAD_COUNT, "-1")!!
preferences.getString(getKey(R.string.setting_key_preload_count), "-1")!!
.toInt()
return if (preloadCount == -1) Int.MAX_VALUE else preloadCount
}
val parallelDownloads by IntSetting(getKey(R.string.setting_key_parallel_downloads), 3)
@JvmStatic
val cacheSizeMB: Int
get() {
val preferences = preferences
val cacheSize = preferences.getString(
Constants.PREFERENCES_KEY_CACHE_SIZE,
getKey(R.string.setting_key_cache_size),
"-1"
)!!.toInt()
return if (cacheSize == -1) Int.MAX_VALUE else cacheSize
@ -67,139 +71,141 @@ object Settings {
@JvmStatic
var customCacheLocation by BooleanSetting(
Constants.PREFERENCES_KEY_CUSTOM_CACHE_LOCATION,
getKey(R.string.setting_key_custom_cache_location),
false
)
@JvmStatic
var cacheLocationUri by StringSetting(
Constants.PREFERENCES_KEY_CACHE_LOCATION, ""
getKey(R.string.setting_key_cache_location), ""
)
@JvmStatic
var isWifiRequiredForDownload by BooleanSetting(
Constants.PREFERENCES_KEY_WIFI_REQUIRED_FOR_DOWNLOAD,
getKey(R.string.setting_key_wifi_required_for_download),
false
)
@JvmStatic
var shareOnServer by BooleanSetting(Constants.PREFERENCES_KEY_SHARE_ON_SERVER, true)
var shareOnServer by BooleanSetting(getKey(R.string.setting_key_share_on_server), true)
@JvmStatic
var shouldDisplayBitrateWithArtist by BooleanSetting(
Constants.PREFERENCES_KEY_DISPLAY_BITRATE_WITH_ARTIST,
getKey(R.string.setting_key_display_bitrate_with_artist),
true
)
@JvmStatic
var shouldUseFolderForArtistName
by BooleanSetting(Constants.PREFERENCES_KEY_USE_FOLDER_FOR_ALBUM_ARTIST, false)
by BooleanSetting(getKey(R.string.setting_key_use_folder_for_album_artist), false)
@JvmStatic
var shouldShowTrackNumber
by BooleanSetting(Constants.PREFERENCES_KEY_SHOW_TRACK_NUMBER, false)
by BooleanSetting(getKey(R.string.setting_key_show_track_number), false)
@JvmStatic
var defaultAlbums
by StringIntSetting(Constants.PREFERENCES_KEY_DEFAULT_ALBUMS, "5")
by StringIntSetting(getKey(R.string.setting_key_default_albums), "5")
@JvmStatic
var maxAlbums
by StringIntSetting(Constants.PREFERENCES_KEY_MAX_ALBUMS, "20")
by StringIntSetting(getKey(R.string.setting_key_max_albums), "20")
@JvmStatic
var defaultSongs
by StringIntSetting(Constants.PREFERENCES_KEY_DEFAULT_SONGS, "10")
by StringIntSetting(getKey(R.string.setting_key_default_songs), "10")
@JvmStatic
var maxSongs
by StringIntSetting(Constants.PREFERENCES_KEY_MAX_SONGS, "25")
by StringIntSetting(getKey(R.string.setting_key_max_songs), "25")
@JvmStatic
var maxArtists
by StringIntSetting(Constants.PREFERENCES_KEY_MAX_ARTISTS, "10")
by StringIntSetting(getKey(R.string.setting_key_max_artists), "10")
@JvmStatic
var defaultArtists
by StringIntSetting(Constants.PREFERENCES_KEY_DEFAULT_ARTISTS, "3")
by StringIntSetting(getKey(R.string.setting_key_default_artists), "3")
@JvmStatic
var incrementTime
by StringIntSetting(Constants.PREFERENCES_KEY_INCREMENT_TIME, "5")
by StringIntSetting(getKey(R.string.setting_key_increment_time), "5")
@JvmStatic
var mediaButtonsEnabled
by BooleanSetting(Constants.PREFERENCES_KEY_MEDIA_BUTTONS, true)
by BooleanSetting(getKey(R.string.setting_key_media_buttons), true)
var resumePlayOnHeadphonePlug
by BooleanSetting(R.string.setting_keys_resume_play_on_headphones_plug, true)
by BooleanSetting(R.string.setting_key_resume_play_on_headphones_plug, true)
@JvmStatic
var resumeOnBluetoothDevice by IntSetting(
Constants.PREFERENCES_KEY_RESUME_ON_BLUETOOTH_DEVICE,
getKey(R.string.setting_key_resume_on_bluetooth_device),
Constants.PREFERENCE_VALUE_DISABLED
)
@JvmStatic
var pauseOnBluetoothDevice by IntSetting(
Constants.PREFERENCES_KEY_PAUSE_ON_BLUETOOTH_DEVICE,
getKey(R.string.setting_key_pause_on_bluetooth_device),
Constants.PREFERENCE_VALUE_A2DP
)
@JvmStatic
var showNowPlaying
by BooleanSetting(Constants.PREFERENCES_KEY_SHOW_NOW_PLAYING, true)
by BooleanSetting(getKey(R.string.setting_key_show_now_playing), true)
@JvmStatic
var shouldTransitionOnPlayback by BooleanSetting(
Constants.PREFERENCES_KEY_DOWNLOAD_TRANSITION,
getKey(R.string.setting_key_download_transition),
true
)
@JvmStatic
var showNowPlayingDetails
by BooleanSetting(Constants.PREFERENCES_KEY_SHOW_NOW_PLAYING_DETAILS, false)
by BooleanSetting(getKey(R.string.setting_key_show_now_playing_details), false)
var scrobbleEnabled by BooleanSetting(getKey(R.string.setting_key_scrobble), false)
// Normally you don't need to use these Settings directly,
// use ActiveServerProvider.isID3Enabled() instead
@JvmStatic
var shouldUseId3Tags by BooleanSetting(Constants.PREFERENCES_KEY_ID3_TAGS, false)
var shouldUseId3Tags by BooleanSetting(getKey(R.string.setting_key_id3_tags), false)
// See comment above.
@JvmStatic
var useId3TagsOffline by BooleanSetting(Constants.PREFERENCES_KEY_ID3_TAGS_OFFLINE, false)
var useId3TagsOffline by BooleanSetting(getKey(R.string.setting_key_id3_tags_offline), false)
var activeServer by IntSetting(Constants.PREFERENCES_KEY_SERVER_INSTANCE, -1)
var activeServer by IntSetting(getKey(R.string.setting_key_server_instance), -1)
var serverScaling by BooleanSetting(Constants.PREFERENCES_KEY_SERVER_SCALING, false)
var serverScaling by BooleanSetting(getKey(R.string.setting_key_server_scaling), false)
var firstRunExecuted by BooleanSetting(Constants.PREFERENCES_KEY_FIRST_RUN_EXECUTED, false)
var firstRunExecuted by BooleanSetting(getKey(R.string.setting_key_first_run_executed), false)
val shouldShowArtistPicture
by BooleanSetting(Constants.PREFERENCES_KEY_SHOW_ARTIST_PICTURE, false)
by BooleanSetting(getKey(R.string.setting_key_show_artist_picture), false)
@JvmStatic
var chatRefreshInterval by StringIntSetting(
Constants.PREFERENCES_KEY_CHAT_REFRESH_INTERVAL,
getKey(R.string.setting_key_chat_refresh_interval),
"5000"
)
var directoryCacheTime by StringIntSetting(
Constants.PREFERENCES_KEY_DIRECTORY_CACHE_TIME,
getKey(R.string.setting_key_directory_cache_time),
"300"
)
var shouldSortByDisc
by BooleanSetting(Constants.PREFERENCES_KEY_DISC_SORT, false)
by BooleanSetting(getKey(R.string.setting_key_disc_sort), false)
var shouldClearBookmark
by BooleanSetting(Constants.PREFERENCES_KEY_CLEAR_BOOKMARK, false)
by BooleanSetting(getKey(R.string.setting_key_clear_bookmark), false)
var shouldAskForShareDetails
by BooleanSetting(Constants.PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS, true)
by BooleanSetting(getKey(R.string.setting_key_ask_for_share_details), true)
var defaultShareDescription
by StringSetting(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION, "")
by StringSetting(getKey(R.string.setting_key_default_share_description), "")
@JvmStatic
val shareGreeting: String?
@ -211,13 +217,13 @@ object Settings {
context.resources.getString(R.string.common_appname)
)
return preferences.getString(
Constants.PREFERENCES_KEY_DEFAULT_SHARE_GREETING,
getKey(R.string.setting_key_default_share_greeting),
defaultVal
)
}
var defaultShareExpiration by StringSetting(
Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION,
getKey(R.string.setting_key_default_share_expiration),
"0"
)
@ -225,7 +231,7 @@ object Settings {
get() {
val preferences = preferences
val preference =
preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION, "0")!!
preferences.getString(getKey(R.string.setting_key_default_share_expiration), "0")!!
val split = PATTERN.split(preference)
if (split.size == 2) {
val timeSpanAmount = split[0].toInt()
@ -238,21 +244,27 @@ object Settings {
}
@JvmStatic
var debugLogToFile by BooleanSetting(Constants.PREFERENCES_KEY_DEBUG_LOG_TO_FILE, false)
var debugLogToFile by BooleanSetting(getKey(R.string.setting_key_debug_log_to_file), false)
@JvmStatic
val preferences: SharedPreferences
get() = PreferenceManager.getDefaultSharedPreferences(Util.appContext())
@JvmStatic
val overrideLanguage by StringSetting(Constants.PREFERENCES_KEY_OVERRIDE_LANGUAGE, "")
val overrideLanguage by StringSetting(getKey(R.string.setting_key_override_language), "")
var useFiveStarRating by BooleanSetting(Constants.PREFERENCES_KEY_USE_FIVE_STAR_RATING, false)
var useFiveStarRating by BooleanSetting(
getKey(R.string.setting_key_use_five_star_rating),
false
)
var useHwOffload by BooleanSetting(Constants.PREFERENCES_KEY_HARDWARE_OFFLOAD, false)
var useHwOffload by BooleanSetting(getKey(R.string.setting_key_hardware_offload), false)
@JvmStatic
var firstInstalledVersion by IntSetting(Constants.PREFERENCES_FIRST_INSTALLED_VERSION, 0)
var firstInstalledVersion by IntSetting(
getKey(R.string.setting_key_first_installed_version),
0
)
// TODO: Remove in December 2022
fun migrateFeatureStorage() {
@ -264,8 +276,10 @@ object Settings {
return preferences.contains(key)
}
fun getKey(key: Int): String {
return appContext.getString(key)
}
private val appContext: Context
get() {
return UApp.applicationContext()
}
get() = UApp.applicationContext()
}

@ -81,17 +81,35 @@ object Util {
@JvmStatic
fun applyTheme(context: Context?) {
if (context == null) return
val style = getStyleFromSettings(context)
context.setTheme(style)
}
private fun getStyleFromSettings(context: Context): Int {
// Migration
// TODO: Remove in June 2023
when (Settings.theme.lowercase()) {
Constants.PREFERENCES_KEY_THEME_DARK,
"fullscreen" -> {
context!!.setTheme(R.style.UltrasonicTheme_Dark)
Settings.theme = context.getString(R.string.setting_key_theme_dark)
}
Constants.PREFERENCES_KEY_THEME_BLACK -> {
context!!.setTheme(R.style.UltrasonicTheme_Black)
}
Constants.PREFERENCES_KEY_THEME_LIGHT,
"fullscreenlight" -> {
context!!.setTheme(R.style.UltrasonicTheme_Light)
Settings.theme = context.getString(R.string.setting_key_theme_light)
}
}
return when (Settings.theme.lowercase()) {
context.getString(R.string.setting_key_theme_dark) -> {
R.style.UltrasonicTheme_Dark
}
context.getString(R.string.setting_key_theme_black) -> {
R.style.UltrasonicTheme_Black
}
context.getString(R.string.setting_key_theme_light) -> {
R.style.UltrasonicTheme_Light
}
else -> {
R.style.UltrasonicTheme_Dark
}
}
}

@ -1,4 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="setting_keys.resume_play_on_headphones_plug" translatable="false">playback.resume_play_on_headphones_plug</string>
<string name="setting_key.resume_play_on_headphones_plug" translatable="false">playback.resume_play_on_headphones_plug</string>
<string name="setting_key.server_instance" translatable="false">serverInstanceId</string>
<string name="setting_key.theme" translatable="false">theme</string>
<string name="setting_key.theme_light" translatable="false">light</string>
<string name="setting_key.theme_dark" translatable="false">dark</string>
<string name="setting_key.theme_black" translatable="false">black</string>
<string name="setting_key.display_bitrate_with_artist" translatable="false">displayBitrateWithArtist</string>
<string name="setting_key.use_folder_for_album_artist" translatable="false">useFolderForAlbumArtist</string>
<string name="setting_key.show_track_number" translatable="false">showTrackNumber</string>
<string name="setting_key.max_bitrate_wifi" translatable="false">maxBitrateWifi</string>
<string name="setting_key.max_bitrate_mobile" translatable="false">maxBitrateMobile</string>
<string name="setting_key.cache_size" translatable="false">cacheSize</string>
<string name="setting_key.custom_cache_location" translatable="false">customCacheLocation</string>
<string name="setting_key.cache_location" translatable="false">cacheLocation</string>
<string name="setting_key.preload_count" translatable="false">preloadCount</string>
<string name="setting_key.parallel_downloads" translatable="false">parallelDownloads</string>
<string name="setting_key.hide_media" translatable="false">hideMedia</string>
<string name="setting_key.media_buttons" translatable="false">mediaButtons</string>
<string name="setting_key.scrobble" translatable="false">scrobble</string>
<string name="setting_key.server_scaling" translatable="false">serverScaling</string>
<string name="setting_key.wifi_required_for_download" translatable="false">wifiRequiredForDownload</string>
<string name="setting_key.buffer_length" translatable="false">bufferLength</string>
<string name="setting_key.network_timeout" translatable="false">networkTimeout</string>
<string name="setting_key.max_albums" translatable="false">maxAlbums</string>
<string name="setting_key.max_songs" translatable="false">maxSongs</string>
<string name="setting_key.max_artists" translatable="false">maxArtists</string>
<string name="setting_key.default_albums" translatable="false">defaultAlbums</string>
<string name="setting_key.default_songs" translatable="false">defaultSongs</string>
<string name="setting_key.default_artists" translatable="false">defaultArtists</string>
<string name="setting_key.show_now_playing" translatable="false">showNowPlaying</string>
<string name="setting_key.clear_search_history" translatable="false">clearSearchHistory</string>
<string name="setting_key.download_transition" translatable="false">transitionToDownloadOnPlay</string>
<string name="setting_key.increment_time" translatable="false">incrementTime</string>
<string name="setting_key.show_now_playing_details" translatable="false">showNowPlayingDetails</string>
<string name="setting_key.id3_tags" translatable="false">useId3Tags</string>
<string name="setting_key.id3_tags_offline" translatable="false">useId3TagsOffline</string>
<string name="setting_key.show_artist_picture" translatable="false">showArtistPicture</string>
<string name="setting_key.chat_refresh_interval" translatable="false">chatRefreshInterval</string>
<string name="setting_key.directory_cache_time" translatable="false">directoryCacheTime</string>
<string name="setting_key.clear_bookmark" translatable="false">clearBookmark</string>
<string name="setting_key.disc_sort" translatable="false">discAndTrackSort</string>
<string name="setting_key.ask_for_share_details" translatable="false">sharingAlwaysAskForDetails</string>
<string name="setting_key.default_share_description" translatable="false">sharingDefaultDescription</string>
<string name="setting_key.default_share_greeting" translatable="false">sharingDefaultGreeting</string>
<string name="setting_key.share_on_server" translatable="false">sharingCreateOnServer</string>
<string name="setting_key.default_share_expiration" translatable="false">sharingDefaultExpiration</string>
<string name="setting_key.use_five_star_rating" translatable="false">use_five_star_rating</string>
<string name="setting_key.hardware_offload" translatable="false">use_hw_offload</string>
<string name="setting_key.first_run_executed" translatable="false">firstRunExecuted</string>
<string name="setting_key.resume_on_bluetooth_device" translatable="false">resumeOnBluetoothDevice</string>
<string name="setting_key.pause_on_bluetooth_device" translatable="false">pauseOnBluetoothDevice</string>
<string name="setting_key.debug_log_to_file" translatable="false">debugLogToFile</string>
<string name="setting_key.override_language" translatable="false">overrideLanguage</string>
<string name="setting_key.first_installed_version" translatable="false">firstInstalledVersion</string>
</resources>

@ -264,6 +264,7 @@
<string name="settings.playback.resume_play_on_headphones_plug.title">Resume on headphones insertion</string>
<string name="settings.playback.resume_play_on_headphones_plug.summary">App will resume paused playback on wired headphones insertion into device.</string>
<string name="settings.preload">Songs To Preload</string>
<string name="settings.parallel_downloads">How many song to download in parallel</string>
<string name="settings.preload_1">1 song</string>
<string name="settings.preload_10">10 songs</string>
<string name="settings.preload_2">2 songs</string>

@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:a="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" a:title="@string/common.appname">
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
a:title="@string/common.appname">
<PreferenceCategory
a:title="@string/settings.appearance_title"
@ -9,83 +11,82 @@
a:defaultValue="@string/preferences_key_theme_dark"
a:entries="@array/themeNames"
a:entryValues="@array/themeValues"
a:key="theme"
a:key="@string/setting_key.theme"
a:title="@string/settings.theme_title"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="true"
a:key="serverScaling"
a:key="@string/setting_key.server_scaling"
a:summary="@string/settings.server_scaling_summary"
a:title="@string/settings.server_scaling_title"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="false"
a:key="displayBitrateWithArtist"
a:key="@string/setting_key.display_bitrate_with_artist"
a:summary="@string/settings.display_bitrate_summary"
a:title="@string/settings.display_bitrate"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="false"
a:key="useFolderForAlbumArtist"
a:key="@string/setting_key.use_folder_for_album_artist"
a:summary="@string/settings.use_folder_for_album_artist_summary"
a:title="@string/settings.use_folder_for_album_artist"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="true"
a:key="showTrackNumber"
a:key="@string/setting_key.show_track_number"
a:summary="@string/settings.show_track_number_summary"
a:title="@string/settings.show_track_number"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="false"
a:key="discAndTrackSort"
a:key="@string/setting_key.disc_sort"
a:summary="@string/settings.disc_sort_summary"
a:title="@string/settings.disc_sort"
app:iconSpaceReserved="false"/>
</PreferenceCategory>
<PreferenceCategory
a:title="@string/settings.playback_control_title"
a:key="playbackControlSettings"
app:iconSpaceReserved="false">
<CheckBoxPreference
a:defaultValue="false"
a:key="showNowPlayingDetails"
a:key="@string/setting_key.show_now_playing_details"
a:summary="@string/settings.show_now_playing_details_summary"
a:title="@string/settings.show_now_playing_details"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="true"
a:key="useId3Tags"
a:key="@string/setting_key.id3_tags"
a:summary="@string/settings.use_id3_summary"
a:title="@string/settings.use_id3"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="true"
a:key="useId3TagsOffline"
a:key="@string/setting_key.id3_tags_offline"
a:summary="@string/settings.use_id3_offline_summary"
a:title="@string/settings.use_id3_offline"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="true"
a:key="showArtistPicture"
a:key="@string/setting_key.show_artist_picture"
a:summary="@string/settings.show_artist_picture_summary"
a:title="@string/settings.show_artist_picture"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="true"
a:key="mediaButtons"
a:key="@string/setting_key.media_buttons"
a:summary="@string/settings.media_button_summary"
a:title="@string/settings.media_button_title"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="true"
a:key="transitionToDownloadOnPlay"
a:key="@string/setting_key.download_transition"
a:summary="@string/settings.download_transition_summary"
a:title="@string/settings.download_transition"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="false"
a:key="clearBookmark"
a:key="@string/setting_key.clear_bookmark"
a:summary="@string/settings.clear_bookmark_summary"
a:title="@string/settings.clear_bookmark"
app:iconSpaceReserved="false"/>
@ -93,43 +94,42 @@
a:defaultValue="5000"
a:entries="@array/bufferLengthNames"
a:entryValues="@array/incrementTimeValues"
a:key="incrementTime"
a:key="@string/setting_key.increment_time"
a:title="@string/settings.increment_time"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="false"
a:key="@string/setting_keys.resume_play_on_headphones_plug"
a:key="@string/setting_key.resume_play_on_headphones_plug"
a:title="@string/settings.playback.resume_play_on_headphones_plug.title"
a:summary="@string/settings.playback.resume_play_on_headphones_plug.summary"
app:iconSpaceReserved="false"/>
<Preference
a:key="resumeOnBluetoothDevice"
a:key="@string/setting_key.resume_on_bluetooth_device"
a:title="@string/settings.playback.resume_on_bluetooth_device"
app:iconSpaceReserved="false"/>
<Preference
a:key="pauseOnBluetoothDevice"
a:key="@string/setting_key.pause_on_bluetooth_device"
a:title="@string/settings.playback.pause_on_bluetooth_device"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="false"
a:key="use_five_star_rating"
a:key="@string/setting_key.use_five_star_rating"
a:summary="@string/settings.five_star_rating_description"
a:title="@string/settings.five_star_rating_title"
app:iconSpaceReserved="false" />
<CheckBoxPreference
a:defaultValue="false"
a:key="use_hw_offload"
a:key="@string/setting_key.hardware_offload"
a:summary="@string/settings.use_hw_offload_description"
a:title="@string/settings.use_hw_offload_title"
app:iconSpaceReserved="false" />
</PreferenceCategory>
<PreferenceCategory
a:title="@string/settings.notifications_title"
a:key="notificationsCategory"
app:iconSpaceReserved="false">
<CheckBoxPreference
a:defaultValue="true"
a:key="showNowPlaying"
a:key="@string/setting_key.show_now_playing"
a:summary="@string/settings.show_now_playing_summary"
a:title="@string/settings.show_now_playing"
app:iconSpaceReserved="false"/>
@ -138,28 +138,28 @@
a:title="@string/settings.sharing_title"
app:iconSpaceReserved="false">
<EditTextPreference
a:key="sharingDefaultGreeting"
a:key="@string/setting_key.default_share_greeting"
a:title="@string/settings.share_greeting_default"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="true"
a:key="sharingCreateOnServer"
a:key="@string/setting_key.share_on_server"
a:title="@string/share_on_server"
a:summary="@string/settings.share_on_server_summary"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="true"
a:key="sharingAlwaysAskForDetails"
a:key="@string/setting_key.ask_for_share_details"
a:summary="@string/settings.sharing_always_ask_for_details_summary"
a:title="@string/settings.sharing_always_ask_for_details"
app:iconSpaceReserved="false"/>
<EditTextPreference
a:key="sharingDefaultDescription"
a:key="@string/setting_key.default_share_description"
a:title="@string/settings.share_description_default"
app:iconSpaceReserved="false"/>
<org.moire.ultrasonic.util.TimeSpanPreference
a:defaultValue="0"
a:key="sharingDefaultExpiration"
a:key="@string/setting_key.default_share_expiration"
a:title="@string/settings.share_expiration_default"
app:iconSpaceReserved="false"/>
</PreferenceCategory>
@ -170,19 +170,19 @@
a:defaultValue="0"
a:entries="@array/maxBitrateNames"
a:entryValues="@array/maxBitrateValues"
a:key="maxBitrateWifi"
a:key="@string/setting_key.max_bitrate_wifi"
a:title="@string/settings.max_bitrate_wifi"
app:iconSpaceReserved="false"/>
<ListPreference
a:defaultValue="0"
a:entries="@array/maxBitrateNames"
a:entryValues="@array/maxBitrateValues"
a:key="maxBitrateMobile"
a:key="@string/setting_key.max_bitrate_mobile"
a:title="@string/settings.max_bitrate_mobile"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="false"
a:key="wifiRequiredForDownload"
a:key="@string/setting_key.wifi_required_for_download"
a:summary="@string/settings.wifi_required_summary"
a:title="@string/settings.wifi_required_title"
app:iconSpaceReserved="false"/>
@ -190,21 +190,21 @@
a:defaultValue="5"
a:entries="@array/bufferLengthNames"
a:entryValues="@array/bufferLengthValues"
a:key="bufferLength"
a:key="@string/setting_key.buffer_length"
a:title="@string/settings.buffer_length"
app:iconSpaceReserved="false"/>
<ListPreference
a:defaultValue="15000"
a:entries="@array/networkTimeoutNames"
a:entryValues="@array/networkTimeoutValues"
a:key="networkTimeout"
a:key="@string/setting_key.network_timeout"
a:title="@string/settings.network_timeout"
app:iconSpaceReserved="false"/>
<ListPreference
a:defaultValue="5000"
a:entries="@array/chatRefreshNames"
a:entryValues="@array/chatRefreshValues"
a:key="chatRefreshInterval"
a:key="@string/setting_key.chat_refresh_interval"
a:title="@string/settings.chat_refresh"
app:iconSpaceReserved="false"/>
</PreferenceCategory>
@ -215,29 +215,38 @@
a:defaultValue="500"
a:entries="@array/cacheSizeNames"
a:entryValues="@array/cacheSizeValues"
a:key="cacheSize"
a:key="@string/setting_key.cache_size"
a:title="@string/settings.cache_size"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:key="customCacheLocation"
a:key="@string/setting_key.custom_cache_location"
a:title="@string/settings.custom_cache_location"
app:iconSpaceReserved="false"/>
<Preference
a:key="cacheLocation"
a:key="@string/setting_key.cache_location"
a:title="@string/settings.cache_location"
app:iconSpaceReserved="false"/>
<ListPreference
a:defaultValue="3"
a:entries="@array/preloadCountNames"
a:entryValues="@array/preloadCountValues"
a:key="preloadCount"
a:key="@string/setting_key.preload_count"
a:title="@string/settings.preload"
app:iconSpaceReserved="false"/>
<SeekBarPreference
a:min="1"
a:defaultValue="3"
a:max="10"
app:showSeekBarValue="true"
a:key="@string/setting_key.parallel_downloads"
a:title="@string/settings.parallel_downloads"
app:iconSpaceReserved="false"
tools:ignore="UnusedAttribute" />
<ListPreference
a:defaultValue="300"
a:entries="@array/directoryCacheTimeNames"
a:entryValues="@array/directoryCacheTimeValues"
a:key="directoryCacheTime"
a:key="@string/setting_key.directory_cache_time"
a:title="@string/settings.directory_cache_time"
app:iconSpaceReserved="false"/>
</PreferenceCategory>
@ -248,46 +257,46 @@
a:defaultValue="3"
a:entries="@array/searchNames"
a:entryValues="@array/searchValues"
a:key="defaultArtists"
a:key="@string/setting_key.default_artists"
a:title="@string/settings.default_artists"
app:iconSpaceReserved="false"/>
<ListPreference
a:defaultValue="10"
a:entries="@array/searchNames"
a:entryValues="@array/searchValues"
a:key="maxArtists"
a:key="@string/setting_key.max_artists"
a:title="@string/settings.max_artists"
app:iconSpaceReserved="false"/>
<ListPreference
a:defaultValue="5"
a:entries="@array/searchNames"
a:entryValues="@array/searchValues"
a:key="defaultAlbums"
a:key="@string/setting_key.default_albums"
a:title="@string/settings.default_albums"
app:iconSpaceReserved="false"/>
<ListPreference
a:defaultValue="20"
a:entries="@array/searchNames"
a:entryValues="@array/searchValues"
a:key="maxAlbums"
a:key="@string/setting_key.max_albums"
a:title="@string/settings.max_albums"
app:iconSpaceReserved="false"/>
<ListPreference
a:defaultValue="10"
a:entries="@array/searchNames"
a:entryValues="@array/searchValues"
a:key="defaultSongs"
a:key="@string/setting_key.default_songs"
a:title="@string/settings.default_songs"
app:iconSpaceReserved="false"/>
<ListPreference
a:defaultValue="25"
a:entries="@array/searchNames"
a:entryValues="@array/searchValues"
a:key="maxSongs"
a:key="@string/setting_key.max_songs"
a:title="@string/settings.max_songs"
app:iconSpaceReserved="false"/>
<Preference
a:key="clearSearchHistory"
a:key="@string/setting_key.clear_search_history"
a:persistent="false"
a:title="@string/settings.clear_search_history"
app:iconSpaceReserved="false"/>
@ -297,13 +306,13 @@
app:iconSpaceReserved="false">
<CheckBoxPreference
a:defaultValue="false"
a:key="scrobble"
a:key="@string/setting_key.scrobble"
a:summary="@string/settings.scrobble_summary"
a:title="@string/settings.scrobble_title"
app:iconSpaceReserved="false"/>
<CheckBoxPreference
a:defaultValue="false"
a:key="hideMedia"
a:key="@string/setting_key.hide_media"
a:summary="@string/settings.hide_media_summary"
a:title="@string/settings.hide_media_title"
app:iconSpaceReserved="false"/>
@ -311,7 +320,7 @@
a:defaultValue=""
a:entries="@array/languageNames"
a:entryValues="@array/languageValues"
a:key="overrideLanguage"
a:key="@string/setting_key.override_language"
a:title="@string/settings.override_language"
a:summary="@string/settings.override_language_summary"
app:iconSpaceReserved="false"/>
@ -321,7 +330,7 @@
app:iconSpaceReserved="false">
<CheckBoxPreference
a:defaultValue="false"
a:key="debugLogToFile"
a:key="@string/setting_key.debug_log_to_file"
a:title="@string/settings.debug.log_to_file"
a:summary=""
app:iconSpaceReserved="false"/>