aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/World.kt
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/net/lacolaco/smileessence/World.kt')
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/World.kt52
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")),