322 lines
9.8 KiB
Kotlin
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()
|
|
}
|
|
}
|