diff options
Diffstat (limited to 'app/src/main/java/net/lacolaco/smileessence/World.kt')
-rw-r--r-- | app/src/main/java/net/lacolaco/smileessence/World.kt | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/World.kt b/app/src/main/java/net/lacolaco/smileessence/World.kt index 3b9a6c30..5beef673 100644 --- a/app/src/main/java/net/lacolaco/smileessence/World.kt +++ b/app/src/main/java/net/lacolaco/smileessence/World.kt @@ -7,6 +7,7 @@ import android.graphics.drawable.Drawable import android.support.annotation.StringRes import android.support.design.widget.Snackbar import android.view.View +import com.beust.klaxon.* import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.SimpleTarget @@ -38,7 +39,8 @@ import kotlin.coroutines.experimental.suspendCoroutine */ class World private constructor(private val persistentData: PersistentData) { val id = persistentData.id - val user: User = User.makeSkeletonForInternalUseOnly(id, persistentData.screenName, persistentData.profileImageUrl) + val user: User = User.makeSkeletonForInternalUseOnly(id, persistentData.screenName, + persistentData.profileImageUrl) // XXX: Workaround for a bug in Android var mainActivityIntent: Intent? = null // Timelines @@ -317,13 +319,13 @@ class World private constructor(private val persistentData: PersistentData) { } } - private data class PersistentData( + private class PersistentData( val id: Long, var oauthToken: String, var oauthTokenSecret: String, var screenName: String, var profileImageUrl: String = "https://abs.twimg.com/sticky/default_profile_images/default_profile.png", - var pageInfos: List<PageInfo> = makeDefaultPageInfos(screenName), + var pageInfos: MutableList<PageInfo> = makeDefaultPageInfos(screenName), var themeIndex: Int = 0, var themeColor: Int = 0 ) { @@ -334,16 +336,32 @@ class World private constructor(private val persistentData: PersistentData) { values.put("oauth_token_secret", oauthTokenSecret) values.put("screen_name", screenName) values.put("profile_image_url", profileImageUrl) - Logger.error("pageinfo saving: ${PageInfo.stringifyList(pageInfos)}") - values.put("page_infos", PageInfo.stringifyList(pageInfos)) + values.put("page_infos", stringifyPageInfos()) values.put("theme", themeIndex) values.put("theme_color", themeColor) if (Application.instance.db.replaceOrThrow("profiles", null, values) == -1L) throw RuntimeException("SQLiteDatabase#replaceOrThrow failed") } + private fun stringifyPageInfos(): String { + return json { + array(pageInfos.mapNotNull { + if (it.ephemeral) + return@mapNotNull null + val kind = when (it) { + is PageInfo.ComposePageInfo -> "compose" + is PageInfo.TweetsPageInfo -> "tweets" + is PageInfo.EventsPageInfo -> "events" + is PageInfo.SearchPageInfo -> "search" + is PageInfo.ListPageInfo -> "list" + } + obj("kind" to kind, "data" to it.toJson()) + }) + }.toJsonString() + } + companion object { - private fun makeDefaultPageInfos(screenName: String): List<PageInfo> { + private fun makeDefaultPageInfos(screenName: String): MutableList<PageInfo> { val ret = arrayListOf<PageInfo>() ret.add(PageInfo.EventsPageInfo()) ret.add(PageInfo.ComposePageInfo()) @@ -354,6 +372,26 @@ class World private constructor(private val persistentData: PersistentData) { return ret } + private fun parsePageInfos(input: String): MutableList<PageInfo> { + val parser = Parser() + val json = parser.parse(StringBuilder(input)) as JsonArray<*> + return json.mapNotNull { + it as JsonObject + val kind = it.string("kind")!! + if (kind == "message") + return@mapNotNull null + val data = it.obj("data")!! + when (kind) { + "compose" -> PageInfo.ComposePageInfo(data) + "tweets" -> PageInfo.TweetsPageInfo(data) + "events" -> PageInfo.EventsPageInfo(data) + "search" -> PageInfo.SearchPageInfo(data) + "list" -> PageInfo.ListPageInfo(data) + else -> throw RuntimeException("Recognized PageInfo kind: $kind") + } + }.toMutableList() + } + fun fetchAll(): List<PersistentData> { val ret = arrayListOf<PersistentData>() Application.instance.db.query("profiles", null, null, null, null, null, null).use { cursor -> @@ -369,7 +407,7 @@ class World private constructor(private val persistentData: PersistentData) { cursor.getColumnIndexOrThrow("screen_name")), profileImageUrl = cursor.getString( cursor.getColumnIndexOrThrow("profile_image_url")), - pageInfos = PageInfo.parseList(cursor.getString( + pageInfos = parsePageInfos(cursor.getString( cursor.getColumnIndexOrThrow("page_infos"))), themeIndex = cursor.getInt( cursor.getColumnIndexOrThrow("theme")), |