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() { 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 } }