From d9da3fd80ccf97319493a6e4679a5fb8be81d65c Mon Sep 17 00:00:00 2001 From: Ivo Berger Date: Wed, 8 May 2019 21:52:32 +0200 Subject: [PATCH] starts implementing #75 --- app/src/main/AndroidManifest.xml | 2 - .../enq/{utils => logging}/EnQDebugTree.kt | 2 +- .../enq/{utils => logging}/FirebaseTree.kt | 2 +- .../com/ivoberger/enq/model/ServerInfo.kt | 17 ++++++++ .../ivoberger/enq/persistence/AppSettings.kt | 39 +++++++++++++------ .../java/com/ivoberger/enq/ui/MainActivity.kt | 13 ++++++- .../main/java/com/ivoberger/enq/utils/List.kt | 5 +++ jmusicbot/proguard-rules.pro | 4 +- .../ivoberger/jmusicbot/model/VersionInfo.kt | 9 +++++ 9 files changed, 73 insertions(+), 20 deletions(-) rename app/src/main/java/com/ivoberger/enq/{utils => logging}/EnQDebugTree.kt (88%) rename app/src/main/java/com/ivoberger/enq/{utils => logging}/FirebaseTree.kt (97%) create mode 100644 app/src/main/java/com/ivoberger/enq/model/ServerInfo.kt create mode 100644 app/src/main/java/com/ivoberger/enq/utils/List.kt create mode 100644 jmusicbot/src/main/java/com/ivoberger/jmusicbot/model/VersionInfo.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8c8fbb0..d68d497 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,8 +14,6 @@ - - diff --git a/app/src/main/java/com/ivoberger/enq/utils/EnQDebugTree.kt b/app/src/main/java/com/ivoberger/enq/logging/EnQDebugTree.kt similarity index 88% rename from app/src/main/java/com/ivoberger/enq/utils/EnQDebugTree.kt rename to app/src/main/java/com/ivoberger/enq/logging/EnQDebugTree.kt index 960efad..b1c9ddc 100644 --- a/app/src/main/java/com/ivoberger/enq/utils/EnQDebugTree.kt +++ b/app/src/main/java/com/ivoberger/enq/logging/EnQDebugTree.kt @@ -1,4 +1,4 @@ -package com.ivoberger.enq.utils +package com.ivoberger.enq.logging import timber.log.Timber diff --git a/app/src/main/java/com/ivoberger/enq/utils/FirebaseTree.kt b/app/src/main/java/com/ivoberger/enq/logging/FirebaseTree.kt similarity index 97% rename from app/src/main/java/com/ivoberger/enq/utils/FirebaseTree.kt rename to app/src/main/java/com/ivoberger/enq/logging/FirebaseTree.kt index 9acaca2..aab8627 100644 --- a/app/src/main/java/com/ivoberger/enq/utils/FirebaseTree.kt +++ b/app/src/main/java/com/ivoberger/enq/logging/FirebaseTree.kt @@ -1,4 +1,4 @@ -package com.ivoberger.enq.utils +package com.ivoberger.enq.logging import android.content.Context import android.util.Log diff --git a/app/src/main/java/com/ivoberger/enq/model/ServerInfo.kt b/app/src/main/java/com/ivoberger/enq/model/ServerInfo.kt new file mode 100644 index 0000000..3a353ac --- /dev/null +++ b/app/src/main/java/com/ivoberger/enq/model/ServerInfo.kt @@ -0,0 +1,17 @@ +package com.ivoberger.enq.model + +import com.ivoberger.jmusicbot.model.VersionInfo +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +import com.squareup.moshi.Types +import java.lang.reflect.Type + +@JsonClass(generateAdapter = true) +data class ServerInfo( + @Json(name = "baseUrl") val baseUrl: String, + @Json(name = "versionInfo") val versionInfo: VersionInfo +) { + companion object { + val listMoshiType: Type = Types.newParameterizedType(List::class.java, ServerInfo::class.java) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ivoberger/enq/persistence/AppSettings.kt b/app/src/main/java/com/ivoberger/enq/persistence/AppSettings.kt index d82f7eb..a31a788 100644 --- a/app/src/main/java/com/ivoberger/enq/persistence/AppSettings.kt +++ b/app/src/main/java/com/ivoberger/enq/persistence/AppSettings.kt @@ -7,6 +7,8 @@ import androidx.core.content.edit import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import com.ivoberger.enq.R +import com.ivoberger.enq.model.ServerInfo +import com.ivoberger.enq.utils.addIfNotExistent import com.ivoberger.jmusicbot.model.* import com.squareup.moshi.Moshi import kotlinx.coroutines.* @@ -21,23 +23,26 @@ object AppSettings { private const val KEY_LAST_PROVIDER = "lastProvider" private const val KEY_LAST_SUGGESTER = "lastSuggester" private const val KEY_SAVED_USERS = "savedUsers" + private const val KEY_SAVED_SERVERS = "savedServers" private const val KEY_FAVORITES = "favorites" + // serialization util vars private val mMoshi by lazy { Moshi.Builder().build() } private val mMusicBotPluginAdapter: MusicBotPluginJsonAdapter by lazy { MusicBotPluginJsonAdapter(mMoshi) } private val mUserListAdapter by lazy { mMoshi.adapter>(MoshiTypes.UserList) } private val mFavoritesAdapter by lazy { mMoshi.adapter>(MoshiTypes.SongList) } + private val mServerInfoAdapter by lazy { mMoshi.adapter>(ServerInfo.listMoshiType) } var lastProvider: MusicBotPlugin? - get() = loadString(KEY_LAST_PROVIDER)?.let { - Timber.d("Getting provider") - mMusicBotPluginAdapter.fromJson(it) - } + get() = loadString(KEY_LAST_PROVIDER)?.let { mMusicBotPluginAdapter.fromJson(it) } set(value) = saveString(KEY_LAST_PROVIDER, mMusicBotPluginAdapter.toJson(value)) var lastSuggester: MusicBotPlugin? get() = loadString(KEY_LAST_SUGGESTER)?.let { mMusicBotPluginAdapter.fromJson(it) } set(value) = value?.let { saveString(KEY_LAST_SUGGESTER, mMusicBotPluginAdapter.toJson(it)) } ?: Unit + + // favorites management + var favorites: List get() = loadString(KEY_FAVORITES)?.let { mFavoritesAdapter.fromJson(it) } ?: listOf() set(value) { @@ -63,22 +68,34 @@ object AppSettings { } } + + // saved user management + private var savedUsers: List get() = loadString(KEY_SAVED_USERS)?.let { mUserListAdapter.fromJson(it) } ?: listOf() set(value) = saveString(KEY_SAVED_USERS, mUserListAdapter.toJson(value)) fun addUser(newUser: User) { - if (!savedUsers.contains(newUser)) { - Timber.d("Adding user ${newUser.name}") - savedUsers = savedUsers + newUser - } + Timber.d("Adding user ${newUser.name}") + savedUsers = savedUsers.addIfNotExistent(newUser) } fun getLatestUser(): User? = savedUsers.lastOrNull() - fun clearSavedUsers() { - savedUsers = listOf() - } + fun clearSavedUsers() = run { savedUsers = listOf() } + + + // saved server management + + private var savedServers: List + get() = loadString(KEY_SAVED_SERVERS)?.let { mServerInfoAdapter.fromJson(it) } ?: listOf() + set(value) = saveString(KEY_SAVED_SERVERS, mServerInfoAdapter.toJson(value)) + + fun addServer(newServer: ServerInfo) = run { savedServers = savedServers.addIfNotExistent(newServer) } + fun isServerKnown(toCheck: ServerInfo) = savedServers.contains(toCheck) + + + // utils private fun saveString(key: String, value: String) = preferences.edit { putString(key, value) } private fun loadString(key: String): String? = preferences.getString(key, null) diff --git a/app/src/main/java/com/ivoberger/enq/ui/MainActivity.kt b/app/src/main/java/com/ivoberger/enq/ui/MainActivity.kt index 3128d7e..615118e 100644 --- a/app/src/main/java/com/ivoberger/enq/ui/MainActivity.kt +++ b/app/src/main/java/com/ivoberger/enq/ui/MainActivity.kt @@ -15,12 +15,17 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.ui.setupWithNavController import com.ivoberger.enq.BuildConfig import com.ivoberger.enq.R +import com.ivoberger.enq.logging.EnQDebugTree +import com.ivoberger.enq.logging.FirebaseTree import com.ivoberger.enq.persistence.AppSettings import com.ivoberger.enq.ui.fragments.PlayerFragment import com.ivoberger.enq.ui.listener.ConnectionListener import com.ivoberger.enq.ui.listener.MainNavigationListener import com.ivoberger.enq.ui.viewmodel.MainViewModel -import com.ivoberger.enq.utils.* +import com.ivoberger.enq.utils.awaitEnd +import com.ivoberger.enq.utils.icon +import com.ivoberger.enq.utils.showLoginDialog +import com.ivoberger.enq.utils.showServerDiscoveryDialog import com.ivoberger.jmusicbot.JMusicBot import com.mikepenz.community_material_typeface_library.CommunityMaterial import com.mikepenz.iconics.typeface.IIcon @@ -54,7 +59,11 @@ class MainActivity : AppCompatActivity() { // general setup lifecycleScope.launch(Dispatchers.Default) { // logging (and crash reporting) - Timber.plant(if (BuildConfig.DEBUG) EnQDebugTree() else FirebaseTree(this@MainActivity)) + Timber.plant( + if (BuildConfig.DEBUG) EnQDebugTree() else FirebaseTree( + this@MainActivity + ) + ) } mNavController.addOnDestinationChangedListener(MainNavigationListener(this)) diff --git a/app/src/main/java/com/ivoberger/enq/utils/List.kt b/app/src/main/java/com/ivoberger/enq/utils/List.kt new file mode 100644 index 0000000..81ad97e --- /dev/null +++ b/app/src/main/java/com/ivoberger/enq/utils/List.kt @@ -0,0 +1,5 @@ +package com.ivoberger.enq.utils + +fun List.addIfNotExistent(new: T): List = + if (!contains(new)) this + new + else this diff --git a/jmusicbot/proguard-rules.pro b/jmusicbot/proguard-rules.pro index 82a7014..15b09c0 100644 --- a/jmusicbot/proguard-rules.pro +++ b/jmusicbot/proguard-rules.pro @@ -22,9 +22,7 @@ # don't obfuscate data classes -keep @kotlin.Metadata class com.ivoberger.jmusicbot.model.** --keep class com.ivoberger.jmusicbot.model.** { - ; -} +-keep class com.ivoberger.jmusicbot.model.** {*;} #### RETROFIT #### # Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and diff --git a/jmusicbot/src/main/java/com/ivoberger/jmusicbot/model/VersionInfo.kt b/jmusicbot/src/main/java/com/ivoberger/jmusicbot/model/VersionInfo.kt new file mode 100644 index 0000000..776a96c --- /dev/null +++ b/jmusicbot/src/main/java/com/ivoberger/jmusicbot/model/VersionInfo.kt @@ -0,0 +1,9 @@ +package com.ivoberger.jmusicbot.model + +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +data class VersionInfo(val apiVersion: String, val implementation: ImplementationInfo) { + @JsonClass(generateAdapter = true) + data class ImplementationInfo(val name: String, val version: String, val projectInfo: String? = null) +} \ No newline at end of file