aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt
blob: c24eb5cd6badcbcdda72541abe48ac127cbef99b (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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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.source_user_protected.visibility =
                if (user.isProtected)
                    View.VISIBLE
                else
                    View.INVISIBLE
        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.entities.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 = world.id in tweet.retweets
        } 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 = world.id in tweet.favoriters
        } 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
    }
}