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
}
}
}
|