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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
package net.lacolaco.smileessence.view
import android.app.Activity
import android.text.Html
import android.view.View
import android.view.ViewGroup
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.item_status_base.view.*
import net.lacolaco.smileessence.R
import net.lacolaco.smileessence.World
import net.lacolaco.smileessence.entity.DirectMessage
import net.lacolaco.smileessence.entity.Tweet
import net.lacolaco.smileessence.entity.User
import net.lacolaco.smileessence.twitter.task.getTweetAsync
import net.lacolaco.smileessence.util.launchBg
import net.lacolaco.smileessence.util.toCompactString
import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter
import net.lacolaco.smileessence.view.dialog.MessageDetailDialogFragment
import net.lacolaco.smileessence.view.dialog.StatusDetailDialogFragment
import net.lacolaco.smileessence.view.dialog.UserDetailDialogFragment
object Partials {
fun getTweetView(tweet: Tweet, world: World, activity: Activity, convertView: View?, expandEmbeddedTweets: Boolean = true): View {
val view: View = convertView ?: activity.layoutInflater.inflate(R.layout.list_item_status, null)
view.setOnClickListener {
DialogHelper.showDialog(activity, StatusDetailDialogFragment.newInstance(tweet))
}
updateViewUser(tweet.originalTweet.user, activity, view)
updateViewBody(tweet, world, activity, view)
updateTweetReactionsViews(tweet, world, view)
updateViewEmbeddeds(tweet, world, activity, view, expandEmbeddedTweets)
return view
}
private fun updateViewEmbeddeds(tweet: Tweet, world: World, activity: Activity, view: View, expandEmbeddedTweets: Boolean) {
if (expandEmbeddedTweets && tweet.embeddedStatusIDs.isNotEmpty()) {
val embeddedTweetsAdapter = object : UnorderedCustomListAdapter<Tweet>() {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
return Partials.getTweetView(getItem(position), world, activity, convertView, false)
}
}
launchBg {
val tasks = tweet.embeddedStatusIDs.map { id -> world.getTweetAsync(id, false) }
for (task in tasks) {
val t = try {
task.await()
} catch (e: Exception) {
continue
}
embeddedTweetsAdapter.add(t)
embeddedTweetsAdapter.update()
}
}
view.listview_status_embedded_status.adapter = embeddedTweetsAdapter
view.listview_status_embedded_status.visibility = View.VISIBLE
} else {
view.listview_status_embedded_status.adapter = null // view may be reused, set null explicitly
view.listview_status_embedded_status.visibility = View.GONE
}
}
private fun updateViewUser(user: User, activity: Activity, view: View) {
Glide.with(view).load(user.profileImageUrl).into(view.imageview_status_icon)
view.imageview_status_icon.setOnClickListener {
DialogHelper.showDialog(activity, UserDetailDialogFragment.newInstance(user))
}
view.textview_status_header_username.text = user.screenName
view.textview_status_header_name.text = user.name
}
private fun updateViewBody(tweet: Tweet, world: World, activity: Activity, view: View) {
view.textview_status_text.text = tweet.text
var footerText = tweet.originalTweet.createdAt.toCompactString()
footerText += " via ${Html.fromHtml(tweet.originalTweet.source)}"
if (tweet.isRetweet)
footerText += " (RT by ${tweet.user.screenName})"
view.textview_status_footer.text = footerText
(view as TweetStateFrameLayout).isMention = tweet.mentions.contains(world.user.screenName)
view.isRetweet = tweet.isRetweet
view.isDirectMessage = false
view.isMine = tweet.originalTweet.user == world.user
}
private fun updateTweetReactionsViews(tweet: Tweet, world: World, view: View) {
if (tweet.retweetCount > 0) {
view.tweet_retweet_count.visibility = View.VISIBLE
view.tweet_retweet_count.text = tweet.retweetCount.toString()
view.imageview_status_retweeted.visibility = View.VISIBLE
view.imageview_status_retweeted.isActivated = tweet.isRetweetedBy(world.id)
} else {
view.tweet_retweet_count.visibility = View.INVISIBLE
view.imageview_status_retweeted.visibility = View.INVISIBLE
}
if (tweet.favoriteCount > 0) {
view.tweet_favorite_count.visibility = View.VISIBLE
view.tweet_favorite_count.text = tweet.favoriteCount.toString()
view.imageview_status_favorited.visibility = View.VISIBLE
view.imageview_status_favorited.isActivated = tweet.isFavoritedBy(world.id)
} else {
view.tweet_favorite_count.visibility = View.INVISIBLE
view.imageview_status_favorited.visibility = View.INVISIBLE
}
}
fun getDirectMessageView(directMessage: DirectMessage, world: World, activity: Activity, convertView: View?): View {
val view = convertView ?: activity.layoutInflater.inflate(R.layout.list_item_status, null)
view.setOnClickListener {
DialogHelper.showDialog(activity, MessageDetailDialogFragment.newInstance(directMessage))
}
view.imageview_status_favorited.visibility = View.GONE
view.tweet_favorite_count.visibility = View.GONE
view.imageview_status_retweeted.visibility = View.GONE
view.tweet_retweet_count.visibility = View.GONE
view.listview_status_embedded_status.visibility = View.GONE
//view.textview_status_header.setTextColor(getStyledColor(activity, world, R.attr.color_message_text_header))
(view as TweetStateFrameLayout).isDirectMessage = true
view.isMine = directMessage.sender == world.user
updateViewUser(directMessage.sender, activity, view)
view.textview_status_text.text = directMessage.text
var footerText = directMessage.createdAt.toCompactString()
if (directMessage.sender == world.user) {
footerText += " to @${directMessage.recipient.screenName}"
}
view.textview_status_footer.text = footerText
return view
}
}
|