Merge branch 'develop' into navigation-servers

This commit is contained in:
Nite 2021-10-20 19:48:41 +02:00 committed by GitHub
commit 949e7e58ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 189 additions and 283 deletions

View File

@ -34,7 +34,7 @@ ext.versions = [
junit4 : "4.13.2", junit4 : "4.13.2",
junit5 : "5.8.1", junit5 : "5.8.1",
mockito : "3.12.4", mockito : "4.0.0",
mockitoKotlin : "3.2.0", mockitoKotlin : "3.2.0",
kluent : "1.68", kluent : "1.68",
apacheCodecs : "1.15", apacheCodecs : "1.15",

View File

@ -59,24 +59,13 @@ object Settings {
return preferences.getBoolean(Constants.PREFERENCES_KEY_ALWAYS_SHOW_NOTIFICATION, false) return preferences.getBoolean(Constants.PREFERENCES_KEY_ALWAYS_SHOW_NOTIFICATION, false)
} }
val isLockScreenEnabled: Boolean var isLockScreenEnabled by BooleanSetting(Constants.PREFERENCES_KEY_SHOW_LOCK_SCREEN_CONTROLS)
get() {
val preferences = preferences
return preferences.getBoolean(
Constants.PREFERENCES_KEY_SHOW_LOCK_SCREEN_CONTROLS,
false
)
}
@JvmStatic @JvmStatic
val theme: String? var theme by StringSetting(
get() { Constants.PREFERENCES_KEY_THEME,
val preferences = preferences Constants.PREFERENCES_KEY_THEME_DARK
return preferences.getString( )
Constants.PREFERENCES_KEY_THEME,
Constants.PREFERENCES_KEY_THEME_DARK
)
}
@JvmStatic @JvmStatic
val maxBitRate: Int val maxBitRate: Int
@ -102,23 +91,6 @@ object Settings {
return if (preloadCount == -1) Int.MAX_VALUE else preloadCount return if (preloadCount == -1) Int.MAX_VALUE else preloadCount
} }
@JvmStatic
var cacheLocation: String
get() {
return preferences.getString(
Constants.PREFERENCES_KEY_CACHE_LOCATION,
FileUtil.defaultMusicDirectory.path
)!!
}
set(location) {
val editor = preferences.edit()
editor.putString(
Constants.PREFERENCES_KEY_CACHE_LOCATION,
location
)
editor.apply()
}
@JvmStatic @JvmStatic
val cacheSizeMB: Int val cacheSizeMB: Int
get() { get() {
@ -130,138 +102,88 @@ object Settings {
return if (cacheSize == -1) Int.MAX_VALUE else cacheSize return if (cacheSize == -1) Int.MAX_VALUE else cacheSize
} }
val isWifiRequiredForDownload: Boolean @JvmStatic
get() { var cacheLocation by StringSetting(
val preferences = preferences Constants.PREFERENCES_KEY_CACHE_LOCATION,
return preferences.getBoolean( FileUtil.defaultMusicDirectory.path
Constants.PREFERENCES_KEY_WIFI_REQUIRED_FOR_DOWNLOAD, )
false
)
}
val shouldDisplayBitrateWithArtist: Boolean
get() {
val preferences = preferences
return preferences.getBoolean(
Constants.PREFERENCES_KEY_DISPLAY_BITRATE_WITH_ARTIST,
true
)
}
@JvmStatic @JvmStatic
val shouldUseFolderForArtistName: Boolean var isWifiRequiredForDownload by BooleanSetting(
get() { Constants.PREFERENCES_KEY_WIFI_REQUIRED_FOR_DOWNLOAD,
val preferences = preferences false
return preferences.getBoolean( )
Constants.PREFERENCES_KEY_USE_FOLDER_FOR_ALBUM_ARTIST,
false
)
}
val shouldShowTrackNumber: Boolean
get() {
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_TRACK_NUMBER, false)
}
@JvmStatic @JvmStatic
val defaultAlbums: Int var shareOnServer by BooleanSetting(Constants.PREFERENCES_KEY_SHARE_ON_SERVER, true)
get() {
val preferences = preferences
return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_ALBUMS, "5")!!
.toInt()
}
@JvmStatic @JvmStatic
val maxAlbums: Int var shouldDisplayBitrateWithArtist by BooleanSetting(
get() { Constants.PREFERENCES_KEY_DISPLAY_BITRATE_WITH_ARTIST,
val preferences = preferences true
return preferences.getString(Constants.PREFERENCES_KEY_MAX_ALBUMS, "20")!! )
.toInt()
}
@JvmStatic @JvmStatic
val defaultSongs: Int var shouldUseFolderForArtistName
get() { by BooleanSetting(Constants.PREFERENCES_KEY_USE_FOLDER_FOR_ALBUM_ARTIST, false)
val preferences = preferences
return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SONGS, "10")!!
.toInt()
}
@JvmStatic @JvmStatic
val maxSongs: Int var shouldShowTrackNumber
get() { by BooleanSetting(Constants.PREFERENCES_KEY_SHOW_TRACK_NUMBER, false)
val preferences = preferences
return preferences.getString(Constants.PREFERENCES_KEY_MAX_SONGS, "25")!!
.toInt()
}
@JvmStatic @JvmStatic
val maxArtists: Int var defaultAlbums
get() { by StringIntSetting(Constants.PREFERENCES_KEY_DEFAULT_ALBUMS, "5")
val preferences = preferences
return preferences.getString(Constants.PREFERENCES_KEY_MAX_ARTISTS, "10")!!
.toInt()
}
@JvmStatic @JvmStatic
val defaultArtists: Int var maxAlbums
get() { by StringIntSetting(Constants.PREFERENCES_KEY_MAX_ALBUMS, "20")
val preferences = preferences
return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_ARTISTS, "3")!!
.toInt()
}
@JvmStatic @JvmStatic
val bufferLength: Int var defaultSongs
get() { by StringIntSetting(Constants.PREFERENCES_KEY_DEFAULT_SONGS, "10")
val preferences = preferences
return preferences.getString(Constants.PREFERENCES_KEY_BUFFER_LENGTH, "5")!!
.toInt()
}
@JvmStatic @JvmStatic
val incrementTime: Int var maxSongs
get() { by StringIntSetting(Constants.PREFERENCES_KEY_MAX_SONGS, "25")
val preferences = preferences
return preferences.getString(Constants.PREFERENCES_KEY_INCREMENT_TIME, "5")!!
.toInt()
}
@JvmStatic @JvmStatic
val mediaButtonsEnabled: Boolean var maxArtists
get() { by StringIntSetting(Constants.PREFERENCES_KEY_MAX_ARTISTS, "10")
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_MEDIA_BUTTONS, true)
}
@JvmStatic @JvmStatic
val showNowPlaying: Boolean var defaultArtists
get() { by StringIntSetting(Constants.PREFERENCES_KEY_DEFAULT_ARTISTS, "3")
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_NOW_PLAYING, true)
}
@JvmStatic @JvmStatic
val gaplessPlayback: Boolean var bufferLength
get() { by StringIntSetting(Constants.PREFERENCES_KEY_BUFFER_LENGTH, "5")
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_GAPLESS_PLAYBACK, false)
}
@JvmStatic @JvmStatic
val shouldTransitionOnPlayback: Boolean var incrementTime
get() { by StringIntSetting(Constants.PREFERENCES_KEY_INCREMENT_TIME, "5")
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_DOWNLOAD_TRANSITION, true)
}
@JvmStatic @JvmStatic
val shouldUseId3Tags: Boolean var mediaButtonsEnabled
get() { by BooleanSetting(Constants.PREFERENCES_KEY_MEDIA_BUTTONS, true)
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_ID3_TAGS, false) @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)
val shouldShowArtistPicture: Boolean val shouldShowArtistPicture: Boolean
get() { get() {
@ -274,109 +196,52 @@ object Settings {
} }
@JvmStatic @JvmStatic
val chatRefreshInterval: Int var chatRefreshInterval by StringIntSetting(
get() { Constants.PREFERENCES_KEY_CHAT_REFRESH_INTERVAL,
val preferences = preferences "5000"
return preferences.getString( )
Constants.PREFERENCES_KEY_CHAT_REFRESH_INTERVAL,
"5000"
)!!.toInt()
}
val directoryCacheTime: Int var directoryCacheTime by StringIntSetting(
get() { Constants.PREFERENCES_KEY_DIRECTORY_CACHE_TIME,
val preferences = preferences "300"
return preferences.getString( )
Constants.PREFERENCES_KEY_DIRECTORY_CACHE_TIME,
"300"
)!!.toInt()
}
val shouldClearPlaylist: Boolean var shouldClearPlaylist
get() { by BooleanSetting(Constants.PREFERENCES_KEY_CLEAR_PLAYLIST, false)
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_CLEAR_PLAYLIST, false)
}
val shouldSortByDisc: Boolean var shouldSortByDisc
get() { by BooleanSetting(Constants.PREFERENCES_KEY_DISC_SORT, false)
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_DISC_SORT, false)
}
val shouldClearBookmark: Boolean var shouldClearBookmark
get() { by BooleanSetting(Constants.PREFERENCES_KEY_CLEAR_BOOKMARK, false)
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_CLEAR_BOOKMARK, false)
}
val singleButtonPlayPause: Boolean var singleButtonPlayPause
get() { by BooleanSetting(
val preferences = preferences Constants.PREFERENCES_KEY_SINGLE_BUTTON_PLAY_PAUSE,
return preferences.getBoolean(Constants.PREFERENCES_KEY_SINGLE_BUTTON_PLAY_PAUSE, false) false
} )
// Inverted for readability // Inverted for readability
val shouldSendBluetoothNotifications: Boolean var shouldSendBluetoothNotifications by BooleanSetting(
get() { Constants.PREFERENCES_KEY_SEND_BLUETOOTH_NOTIFICATIONS,
val preferences = preferences true
return preferences.getBoolean( )
Constants.PREFERENCES_KEY_SEND_BLUETOOTH_NOTIFICATIONS,
true
)
}
val shouldSendBluetoothAlbumArt: Boolean var shouldSendBluetoothAlbumArt
get() { by BooleanSetting(Constants.PREFERENCES_KEY_SEND_BLUETOOTH_ALBUM_ART, true)
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_SEND_BLUETOOTH_ALBUM_ART, true)
}
val shouldDisableNowPlayingListSending: Boolean var shouldDisableNowPlayingListSending
get() { by BooleanSetting(Constants.PREFERENCES_KEY_DISABLE_SEND_NOW_PLAYING_LIST, false)
val preferences = preferences
return preferences.getBoolean(
Constants.PREFERENCES_KEY_DISABLE_SEND_NOW_PLAYING_LIST, false
)
}
@JvmStatic @JvmStatic
val viewRefreshInterval: Int var viewRefreshInterval
get() { by StringIntSetting(Constants.PREFERENCES_KEY_VIEW_REFRESH, "1000")
val preferences = preferences
return preferences.getString(Constants.PREFERENCES_KEY_VIEW_REFRESH, "1000")!!
.toInt()
}
var shouldAskForShareDetails: Boolean var shouldAskForShareDetails
get() { by BooleanSetting(Constants.PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS, true)
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS, true)
}
set(shouldAskForShareDetails) {
val preferences = preferences
val editor = preferences.edit()
editor.putBoolean(
Constants.PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS,
shouldAskForShareDetails
)
editor.apply()
}
var defaultShareDescription: String? var defaultShareDescription
get() { by StringSetting(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION, "")
val preferences = preferences
return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION, "")
}
set(defaultShareDescription) {
val preferences = preferences
val editor = preferences.edit()
editor.putString(
Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION,
defaultShareDescription
)
editor.apply()
}
@JvmStatic @JvmStatic
val shareGreeting: String? val shareGreeting: String?
@ -393,35 +258,10 @@ object Settings {
) )
} }
var shareOnServer: Boolean var defaultShareExpiration by StringSetting(
get() { Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION,
val preferences = preferences "0"
return preferences.getBoolean(Constants.PREFERENCES_KEY_SHARE_ON_SERVER, true)!! )
}
set(shareOnServer) {
val preferences = preferences
val editor = preferences.edit()
editor.putBoolean(
Constants.PREFERENCES_KEY_SHARE_ON_SERVER,
shareOnServer
)
editor.apply()
}
var defaultShareExpiration: String
get() {
val preferences = preferences
return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION, "0")!!
}
set(defaultShareExpiration) {
val preferences = preferences
val editor = preferences.edit()
editor.putString(
Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION,
defaultShareExpiration
)
editor.apply()
}
val defaultShareExpirationInMillis: Long val defaultShareExpirationInMillis: Long
get() { get() {
@ -439,37 +279,24 @@ object Settings {
return 0 return 0
} }
val shouldShowAllSongsByArtist: Boolean var shouldShowAllSongsByArtist by BooleanSetting(
get() { Constants.PREFERENCES_KEY_SHOW_ALL_SONGS_BY_ARTIST,
val preferences = preferences false
return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_ALL_SONGS_BY_ARTIST, false) )
}
@JvmStatic @JvmStatic
val resumeOnBluetoothDevice: Int var resumeOnBluetoothDevice by IntSetting(
get() { Constants.PREFERENCES_KEY_RESUME_ON_BLUETOOTH_DEVICE,
val preferences = preferences Constants.PREFERENCE_VALUE_DISABLED
return preferences.getInt( )
Constants.PREFERENCES_KEY_RESUME_ON_BLUETOOTH_DEVICE,
Constants.PREFERENCE_VALUE_DISABLED
)
}
@JvmStatic @JvmStatic
val pauseOnBluetoothDevice: Int var pauseOnBluetoothDevice by IntSetting(
get() { Constants.PREFERENCES_KEY_PAUSE_ON_BLUETOOTH_DEVICE,
val preferences = preferences Constants.PREFERENCE_VALUE_A2DP
return preferences.getInt( )
Constants.PREFERENCES_KEY_PAUSE_ON_BLUETOOTH_DEVICE,
Constants.PREFERENCE_VALUE_A2DP
)
}
val debugLogToFile: Boolean var debugLogToFile by BooleanSetting(Constants.PREFERENCES_KEY_DEBUG_LOG_TO_FILE, false)
get() {
val preferences = preferences
return preferences.getBoolean(Constants.PREFERENCES_KEY_DEBUG_LOG_TO_FILE, false)
}
@JvmStatic @JvmStatic
val preferences: SharedPreferences val preferences: SharedPreferences

View File

@ -0,0 +1,79 @@
package org.moire.ultrasonic.util
import android.content.SharedPreferences
import androidx.core.content.edit
import androidx.preference.PreferenceManager
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
import org.moire.ultrasonic.app.UApp
/**
* Yet another implementation of Shared Preferences using Delegated Properties
*
* Check out https://medium.com/@FrostRocketInc/delegated-shared-preferences-in-kotlin-45b82d6e52d0
* for a detailed walkthrough.
*
* @author Matthew Groves
*/
abstract class SettingsDelegate<T> : ReadWriteProperty<Any, T> {
protected val sharedPreferences: SharedPreferences by lazy {
PreferenceManager.getDefaultSharedPreferences(UApp.applicationContext())
}
}
class StringSetting(private val key: String, private val defaultValue: String = "") :
SettingsDelegate<String>() {
override fun getValue(thisRef: Any, property: KProperty<*>) =
sharedPreferences.getString(key, defaultValue)!!
override fun setValue(thisRef: Any, property: KProperty<*>, value: String) =
sharedPreferences.edit { putString(key, value) }
}
class IntSetting(private val key: String, private val defaultValue: Int = 0) :
SettingsDelegate<Int>() {
override fun getValue(thisRef: Any, property: KProperty<*>) =
sharedPreferences.getInt(key, defaultValue)
override fun setValue(thisRef: Any, property: KProperty<*>, value: Int) =
sharedPreferences.edit { putInt(key, value) }
}
class StringIntSetting(private val key: String, private val defaultValue: String = "0") :
SettingsDelegate<Int>() {
override fun getValue(thisRef: Any, property: KProperty<*>) =
sharedPreferences.getString(key, defaultValue)!!.toInt()
override fun setValue(thisRef: Any, property: KProperty<*>, value: Int) =
sharedPreferences.edit { putString(key, value.toString()) }
}
class LongSetting(private val key: String, private val defaultValue: Long = 0.toLong()) :
SettingsDelegate<Long>() {
override fun getValue(thisRef: Any, property: KProperty<*>) =
sharedPreferences.getLong(key, defaultValue)
override fun setValue(thisRef: Any, property: KProperty<*>, value: Long) =
sharedPreferences.edit { putLong(key, value) }
}
class FloatSetting(
private val key: String,
private val defaultValue: Float = 0.toFloat()
) : SettingsDelegate<Float>() {
override fun getValue(thisRef: Any, property: KProperty<*>) =
sharedPreferences.getFloat(key, defaultValue)
override fun setValue(thisRef: Any, property: KProperty<*>, value: Float) =
sharedPreferences.edit { putFloat(key, value) }
}
class BooleanSetting(private val key: String, private val defaultValue: Boolean = false) :
SettingsDelegate<Boolean>() {
override fun getValue(thisRef: Any, property: KProperty<*>) =
sharedPreferences.getBoolean(key, defaultValue)
override fun setValue(thisRef: Any, property: KProperty<*>, value: Boolean) =
sharedPreferences.edit { putBoolean(key, value) }
}