aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt
blob: 61a3e641203536c875fee355459fd0bfa477f517 (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
package net.lacolaco.smileessence.view

import android.app.Activity
import android.text.Html
import android.view.LayoutInflater
import android.view.View
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.Tweet
import net.lacolaco.smileessence.twitter.TwitterTaskException
import net.lacolaco.smileessence.twitter.getTweetAsync
import net.lacolaco.smileessence.util.launchUi
import net.lacolaco.smileessence.util.toCompactString
import net.lacolaco.smileessence.view.dialog.StatusDetailDialogFragment
import net.lacolaco.smileessence.view.dialog.UserDetailDialogFragment

object Partials {
    fun getTweetView(tweet: Tweet, world: World, activity: Activity, view: View,
                     maxRecursion: Int = 2): View {
        view.setOnClickListener {
            DialogHelper.showDialog(activity, StatusDetailDialogFragment.newInstance(tweet))
        }

        // Display source
        val user = tweet.originalTweet.user
        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

        // Display tweet body
        view.textview_status_text.text = tweet.text
        var footerText = tweet.originalTweet.createdAt.toCompactString()
        footerText += " via ${Html.fromHtml(tweet.originalTweet.source)}"
        view.textview_status_footer.text = footerText

        (view as TweetStateFrameLayout).isMention =
                tweet.entities.mentions.contains(world.user.screenName)
        view.isRetweet = tweet.isRetweet
        view.isMine = tweet.originalTweet.user == world.user

        // Display reactions
        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
        }

        // Display embedded tweets
        val layout = view.tweet_embedded_items
        if (maxRecursion > 0 && tweet.embeddedStatusIDs.isNotEmpty()) {
            layout.visibility = View.VISIBLE
            if (layout.childCount < tweet.embeddedStatusIDs.size) {
                val inflater = LayoutInflater.from(layout.context)
                for (i in layout.childCount until tweet.embeddedStatusIDs.size)
                    layout.addView(inflater.inflate(R.layout.list_item_tweet, layout, false))
            }

            tweet.embeddedStatusIDs.forEachIndexed { i, id ->
                val itemView = layout.getChildAt(i)
                val cached = Tweet.cached(id)
                if (cached != null) {
                    getTweetView(cached, world, activity, itemView, maxRecursion - 1)
                    itemView.visibility = View.VISIBLE
                } else {
                    itemView.tag = id
                    itemView.visibility = View.GONE
                    launchUi {
                        try {
                            val fetched = world.getTweetAsync(id, false).await()
                            if (activity.isDestroyed)
                                return@launchUi
                            if (itemView.tag != id)
                                return@launchUi
                            getTweetView(fetched, world, activity, itemView, maxRecursion - 1)
                            itemView.visibility = View.VISIBLE
                        } catch (e: TwitterTaskException) {
                        }
                    }
                }
            }

            for (i in tweet.embeddedStatusIDs.size until layout.childCount)
                layout.getChildAt(i).visibility = View.GONE
        } else
            layout.visibility = View.GONE

        return view
    }
}