aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/data/Account.kt
blob: b5327d5a25f2f879897bdd60cfbea7049e93abe8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package net.lacolaco.smileessence.data

import android.content.ContentValues
import net.lacolaco.smileessence.entity.User
import twitter4j.Twitter
import twitter4j.TwitterFactory
import twitter4j.TwitterStream
import twitter4j.TwitterStreamFactory
import twitter4j.auth.AccessToken
import twitter4j.conf.ConfigurationBuilder

class Account private constructor(
        val id: Long,
        private val oauthToken: String,
        private val oauthTokenSecret: String,
        private var screenName: String,
        private var profileImageUrl: String,
        private var themeIndex: Int,
        var themeColor: Int
) {
    val user: User by lazy { User.fetch(id) ?: User._makeSkeleton(id, screenName, profileImageUrl) }

    val twitter: Twitter
        get() {
            val cb = ConfigurationBuilder()
            cb.setTweetModeExtended(true)
            val twitter = TwitterFactory(cb.build()).instance
            twitter.oAuthAccessToken = AccessToken(oauthToken, oauthTokenSecret)
            return twitter
        }

    val twitterStream: TwitterStream
        get() {
            val stream = TwitterStreamFactory().instance
            stream.oAuthAccessToken = AccessToken(oauthToken, oauthTokenSecret)
            return stream
        }

    val useDarkTheme
        get() = themeIndex == 0

    fun syncProfileAndSaveIfNecessary() {
        if (user.screenName != screenName || user.profileImageUrl != profileImageUrl) {
            screenName = user.screenName
            profileImageUrl = user.profileImageUrl
            save()
        }
    }

    fun save() {
        DbHelper.instance.writableDatabase.use { db ->
            val values = ContentValues()
            values.put("screen_name", screenName)
            values.put("profile_image_url", profileImageUrl)
            values.put("theme", themeIndex)
            values.put("theme_color", themeColor)
            db.update("accounts", values, "id = ?", arrayOf(id.toString()))
        }
    }


    companion object {
        private val cache = LinkedHashMap<Long, Account>()

        operator fun get(i: Long) =
                cache[i] ?: throw IllegalStateException("[BUG] Account with id == $i not found")

        fun all(): List<Account> = ArrayList(cache.values)

        fun load() {
            if (cache.isNotEmpty())
                throw IllegalStateException("Account.load called twice")
            DbHelper.instance.readableDatabase.use { db ->
                db.query("accounts", null, null, null, null, null, null).use { cursor ->
                    while (cursor != null && cursor.moveToNext()) {
                        val id = cursor.getLong(cursor.getColumnIndexOrThrow("id"))
                        cache.put(id, Account(
                                id = id,
                                oauthToken = cursor.getString(cursor.getColumnIndexOrThrow("oauth_token")),
                                oauthTokenSecret = cursor.getString(cursor.getColumnIndexOrThrow("oauth_token_secret")),
                                screenName = cursor.getString(cursor.getColumnIndexOrThrow("screen_name")),
                                profileImageUrl = cursor.getString(cursor.getColumnIndexOrThrow("profile_image_url")),
                                themeIndex = cursor.getInt(cursor.getColumnIndexOrThrow("theme")),
                                themeColor = cursor.getInt(cursor.getColumnIndexOrThrow("theme_color"))
                        ))
                    }
                }
            }
        }

        fun register(token: String, tokenSecret: String, userId: Long, screenName: String): Account {
            val account = Account(
                    userId,
                    token,
                    tokenSecret,
                    screenName,
                    "https://abs.twimg.com/sticky/default_profile_images/default_profile.png",
                    0,
                    0)

            DbHelper.instance.writableDatabase.use { db ->
                val values = ContentValues()
                values.put("id", account.id)
                values.put("oauth_token", account.oauthToken)
                values.put("oauth_token_secret", account.oauthTokenSecret)
                values.put("screen_name", account.screenName)
                values.put("profile_image_url", account.profileImageUrl)
                values.put("theme", account.themeIndex)
                values.put("theme_color", account.themeColor)
                db.insertOrThrow("accounts", null, values)
            }
            cache[userId] = account

            return account
        }
    }
}