package net.lacolaco.smileessence.view import android.text.Html import android.view.LayoutInflater import android.view.View import androidx.fragment.app.FragmentActivity 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: FragmentActivity, 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 } }