From a0bd1a87387fe8561ebafa3570eb25643a310c0c Mon Sep 17 00:00:00 2001 From: tom5079 Date: Thu, 21 Apr 2022 17:26:58 +0900 Subject: [PATCH] Pupil-116 Add favorite tags backup --- .../ui/fragment/ManageFavoritesFragment.kt | 21 ++++++++++++--- .../main/java/xyz/quaver/pupil/util/update.kt | 26 ++++++++++++------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/xyz/quaver/pupil/ui/fragment/ManageFavoritesFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/fragment/ManageFavoritesFragment.kt index cba64dfa..108472e7 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/fragment/ManageFavoritesFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/ManageFavoritesFragment.kt @@ -27,10 +27,11 @@ import androidx.core.content.ContextCompat import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import com.google.android.material.snackbar.Snackbar +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.buildJsonObject import okhttp3.* import xyz.quaver.pupil.R import xyz.quaver.pupil.client -import xyz.quaver.pupil.favorites import xyz.quaver.pupil.util.restore import java.io.File import java.io.IOException @@ -47,11 +48,25 @@ class ManageFavoritesFragment : PreferenceFragmentCompat() { val context = context ?: return findPreference("backup")?.setOnPreferenceClickListener { + val favorites = runCatching { + Json.parseToJsonElement(File(ContextCompat.getDataDir(context), "favorites.json").readText()) + }.getOrNull() + val favoriteTags = kotlin.runCatching { + Json.parseToJsonElement(File(ContextCompat.getDataDir(context), "favorites_tags.json").readText()) + }.getOrNull() + val request = Request.Builder() .url(context.getString(R.string.backup_url)) .post( FormBody.Builder() - .add("f:1", File(ContextCompat.getDataDir(context), "favorites.json").readText()) + .add("f:1", buildJsonObject { + favorites?.let { + put("favorites", it) + } + favoriteTags?.let { + put("favorite_tags", it) + } + }.toString()) .build() ).build() @@ -93,7 +108,7 @@ class ManageFavoritesFragment : PreferenceFragmentCompat() { Snackbar.make(view, R.string.settings_restore_failed, Snackbar.LENGTH_LONG).show() }, onSuccess = onSuccess@{ val view = view ?: return@onSuccess - Snackbar.make(view, context.getString(R.string.settings_restore_success, it.size), Snackbar.LENGTH_LONG).show() + Snackbar.make(view, context.getString(R.string.settings_restore_success, it), Snackbar.LENGTH_LONG).show() }) }.setNegativeButton(android.R.string.cancel) { _, _ -> // Do Nothing diff --git a/app/src/main/java/xyz/quaver/pupil/util/update.kt b/app/src/main/java/xyz/quaver/pupil/util/update.kt index aaced41a..4b058b9b 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/update.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/update.kt @@ -27,17 +27,14 @@ import androidx.preference.PreferenceManager import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.* import okhttp3.Call import okhttp3.Callback import okhttp3.Request import okhttp3.Response import ru.noties.markwon.Markwon -import xyz.quaver.pupil.BuildConfig -import xyz.quaver.pupil.R -import xyz.quaver.pupil.client -import xyz.quaver.pupil.favorites +import xyz.quaver.pupil.* +import xyz.quaver.pupil.types.Tag import java.io.File import java.io.IOException import java.net.URL @@ -173,7 +170,7 @@ fun checkUpdate(context: Context, force: Boolean = false) { } } -fun restore(url: String, onFailure: ((Throwable) -> Unit)? = null, onSuccess: ((List) -> Unit)? = null) { +fun restore(url: String, onFailure: ((Throwable) -> Unit)? = null, onSuccess: ((Int) -> Unit)? = null) { if (!URLUtil.isValidUrl(url)) { onFailure?.invoke(IllegalArgumentException()) return @@ -191,9 +188,20 @@ fun restore(url: String, onFailure: ((Throwable) -> Unit)? = null, onSuccess: (( override fun onResponse(call: Call, response: Response) { kotlin.runCatching { - Json.decodeFromString>(response.also { if (it.code() != 200) throw IOException() }.body().use { it?.string() } ?: "[]").let { - favorites.addAll(it) - onSuccess?.invoke(it) + val data = Json.parseToJsonElement(response.also { if (it.code() != 200) throw IOException() }.body().use { it?.string() } ?: "[]") + + when (data) { + is JsonArray -> favorites.addAll(data.map { it.jsonPrimitive.int }) + is JsonObject -> { + val newFavorites = data["favorites"]?.let { Json.decodeFromJsonElement>(it) }.orEmpty() + val newFavoriteTags = data["favorite_tags"]?.let { Json.decodeFromJsonElement>(it) }.orEmpty() + + favorites.addAll(newFavorites) + favoriteTags.addAll(newFavoriteTags) + + onSuccess?.invoke(favorites.size + favoriteTags.size) + } + else -> error("data is neither JsonArray or JsonObject") } }.onFailure { onFailure?.invoke(it) } }