ultrasonic-app-subsonic-and.../ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt

322 lines
9.8 KiB
Kotlin

/*
* Settings.kt
* Copyright (C) 2009-2021 Ultrasonic developers
*
* Distributed under terms of the GNU GPLv3 license.
*/
package org.moire.ultrasonic.util
import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import androidx.preference.PreferenceManager
import java.util.regex.Pattern
import org.moire.ultrasonic.R
import org.moire.ultrasonic.app.UApp
import org.moire.ultrasonic.data.ActiveServerProvider
import org.moire.ultrasonic.domain.RepeatMode
/**
* Contains convenience functions for reading and writing preferences
*/
object Settings {
private val PATTERN = Pattern.compile(":")
var repeatMode: RepeatMode
get() {
val preferences = preferences
return RepeatMode.valueOf(
preferences.getString(
Constants.PREFERENCES_KEY_REPEAT_MODE,
RepeatMode.OFF.name
)!!
)
}
set(repeatMode) {
val preferences = preferences
val editor = preferences.edit()
editor.putString(Constants.PREFERENCES_KEY_REPEAT_MODE, repeatMode.name)
editor.apply()
}
// After API26 foreground services must be used for music playback,
// and they must have a notification
val isNotificationEnabled: Boolean
get() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) return true
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_NOTIFICATION, false)
}
// After API26 foreground services must be used for music playback,
// and they must have a notification
val isNotificationAlwaysEnabled: Boolean
get() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) return true
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_ALWAYS_SHOW_NOTIFICATION, false)
}
var isLockScreenEnabled by BooleanSetting(Constants.PREFERENCES_KEY_SHOW_LOCK_SCREEN_CONTROLS)
@JvmStatic
var theme by StringSetting(
Constants.PREFERENCES_KEY_THEME,
Constants.PREFERENCES_KEY_THEME_DARK
)
@JvmStatic
val maxBitRate: Int
get() {
val network = Util.networkInfo()
if (!network.connected) return 0
if (network.unmetered) {
return maxWifiBitRate
} else {
return maxMobileBitRate
}
}
private var maxWifiBitRate by StringIntSetting(Constants.PREFERENCES_KEY_MAX_BITRATE_WIFI)
private var maxMobileBitRate by StringIntSetting(Constants.PREFERENCES_KEY_MAX_BITRATE_MOBILE)
@JvmStatic
val preloadCount: Int
get() {
val preferences = preferences
val preloadCount =
preferences.getString(Constants.PREFERENCES_KEY_PRELOAD_COUNT, "-1")!!
.toInt()
return if (preloadCount == -1) Int.MAX_VALUE else preloadCount
}
@JvmStatic
val cacheSizeMB: Int
get() {
val preferences = preferences
val cacheSize = preferences.getString(
Constants.PREFERENCES_KEY_CACHE_SIZE,
"-1"
)!!.toInt()
return if (cacheSize == -1) Int.MAX_VALUE else cacheSize
}
@JvmStatic
var cacheLocation by StringSetting(
Constants.PREFERENCES_KEY_CACHE_LOCATION,
FileUtil.defaultMusicDirectory.path
)
@JvmStatic
var isWifiRequiredForDownload by BooleanSetting(
Constants.PREFERENCES_KEY_WIFI_REQUIRED_FOR_DOWNLOAD,
false
)
@JvmStatic
var shareOnServer by BooleanSetting(Constants.PREFERENCES_KEY_SHARE_ON_SERVER, true)
@JvmStatic
var shouldDisplayBitrateWithArtist by BooleanSetting(
Constants.PREFERENCES_KEY_DISPLAY_BITRATE_WITH_ARTIST,
true
)
@JvmStatic
var shouldUseFolderForArtistName
by BooleanSetting(Constants.PREFERENCES_KEY_USE_FOLDER_FOR_ALBUM_ARTIST, false)
@JvmStatic
var shouldShowTrackNumber
by BooleanSetting(Constants.PREFERENCES_KEY_SHOW_TRACK_NUMBER, false)
@JvmStatic
var defaultAlbums
by StringIntSetting(Constants.PREFERENCES_KEY_DEFAULT_ALBUMS, "5")
@JvmStatic
var maxAlbums
by StringIntSetting(Constants.PREFERENCES_KEY_MAX_ALBUMS, "20")
@JvmStatic
var defaultSongs
by StringIntSetting(Constants.PREFERENCES_KEY_DEFAULT_SONGS, "10")
@JvmStatic
var maxSongs
by StringIntSetting(Constants.PREFERENCES_KEY_MAX_SONGS, "25")
@JvmStatic
var maxArtists
by StringIntSetting(Constants.PREFERENCES_KEY_MAX_ARTISTS, "10")
@JvmStatic
var defaultArtists
by StringIntSetting(Constants.PREFERENCES_KEY_DEFAULT_ARTISTS, "3")
@JvmStatic
var bufferLength
by StringIntSetting(Constants.PREFERENCES_KEY_BUFFER_LENGTH, "5")
@JvmStatic
var incrementTime
by StringIntSetting(Constants.PREFERENCES_KEY_INCREMENT_TIME, "5")
@JvmStatic
var mediaButtonsEnabled
by BooleanSetting(Constants.PREFERENCES_KEY_MEDIA_BUTTONS, true)
@JvmStatic
var showNowPlaying
by BooleanSetting(Constants.PREFERENCES_KEY_SHOW_NOW_PLAYING, true)
@JvmStatic
var gaplessPlayback
by BooleanSetting(Constants.PREFERENCES_KEY_GAPLESS_PLAYBACK, false)
@JvmStatic
var shouldTransitionOnPlayback by BooleanSetting(
Constants.PREFERENCES_KEY_DOWNLOAD_TRANSITION,
true
)
@JvmStatic
var shouldUseId3Tags
by BooleanSetting(Constants.PREFERENCES_KEY_ID3_TAGS, false)
@JvmStatic
var tempLoss by StringIntSetting(Constants.PREFERENCES_KEY_TEMP_LOSS, "1")
var activeServer by IntSetting(Constants.PREFERENCES_KEY_SERVER_INSTANCE, -1)
var serverScaling by BooleanSetting(Constants.PREFERENCES_KEY_SERVER_SCALING, false)
var firstRunExecuted by BooleanSetting(Constants.PREFERENCES_KEY_FIRST_RUN_EXECUTED, false)
val shouldShowArtistPicture: Boolean
get() {
val preferences = preferences
val isOffline = ActiveServerProvider.isOffline()
val isId3Enabled = preferences.getBoolean(Constants.PREFERENCES_KEY_ID3_TAGS, false)
val shouldShowArtistPicture =
preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_ARTIST_PICTURE, false)
return !isOffline && isId3Enabled && shouldShowArtistPicture
}
@JvmStatic
var chatRefreshInterval by StringIntSetting(
Constants.PREFERENCES_KEY_CHAT_REFRESH_INTERVAL,
"5000"
)
var directoryCacheTime by StringIntSetting(
Constants.PREFERENCES_KEY_DIRECTORY_CACHE_TIME,
"300"
)
var shouldClearPlaylist
by BooleanSetting(Constants.PREFERENCES_KEY_CLEAR_PLAYLIST, false)
var shouldSortByDisc
by BooleanSetting(Constants.PREFERENCES_KEY_DISC_SORT, false)
var shouldClearBookmark
by BooleanSetting(Constants.PREFERENCES_KEY_CLEAR_BOOKMARK, false)
var singleButtonPlayPause
by BooleanSetting(
Constants.PREFERENCES_KEY_SINGLE_BUTTON_PLAY_PAUSE,
false
)
// Inverted for readability
var shouldSendBluetoothNotifications by BooleanSetting(
Constants.PREFERENCES_KEY_SEND_BLUETOOTH_NOTIFICATIONS,
true
)
var shouldSendBluetoothAlbumArt
by BooleanSetting(Constants.PREFERENCES_KEY_SEND_BLUETOOTH_ALBUM_ART, true)
var shouldDisableNowPlayingListSending
by BooleanSetting(Constants.PREFERENCES_KEY_DISABLE_SEND_NOW_PLAYING_LIST, false)
@JvmStatic
var viewRefreshInterval
by StringIntSetting(Constants.PREFERENCES_KEY_VIEW_REFRESH, "1000")
var shouldAskForShareDetails
by BooleanSetting(Constants.PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS, true)
var defaultShareDescription
by StringSetting(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION, "")
@JvmStatic
val shareGreeting: String?
get() {
val preferences = preferences
val context = Util.appContext()
val defaultVal = String.format(
context.resources.getString(R.string.share_default_greeting),
context.resources.getString(R.string.common_appname)
)
return preferences.getString(
Constants.PREFERENCES_KEY_DEFAULT_SHARE_GREETING,
defaultVal
)
}
var defaultShareExpiration by StringSetting(
Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION,
"0"
)
val defaultShareExpirationInMillis: Long
get() {
val preferences = preferences
val preference =
preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION, "0")!!
val split = PATTERN.split(preference)
if (split.size == 2) {
val timeSpanAmount = split[0].toInt()
val timeSpanType = split[1]
val timeSpan =
TimeSpanPicker.calculateTimeSpan(appContext, timeSpanType, timeSpanAmount)
return timeSpan.totalMilliseconds
}
return 0
}
var shouldShowAllSongsByArtist by BooleanSetting(
Constants.PREFERENCES_KEY_SHOW_ALL_SONGS_BY_ARTIST,
false
)
@JvmStatic
var resumeOnBluetoothDevice by IntSetting(
Constants.PREFERENCES_KEY_RESUME_ON_BLUETOOTH_DEVICE,
Constants.PREFERENCE_VALUE_DISABLED
)
@JvmStatic
var pauseOnBluetoothDevice by IntSetting(
Constants.PREFERENCES_KEY_PAUSE_ON_BLUETOOTH_DEVICE,
Constants.PREFERENCE_VALUE_A2DP
)
var debugLogToFile by BooleanSetting(Constants.PREFERENCES_KEY_DEBUG_LOG_TO_FILE, false)
@JvmStatic
val preferences: SharedPreferences
get() = PreferenceManager.getDefaultSharedPreferences(Util.appContext())
private val appContext: Context
get() {
return UApp.applicationContext()
}
}