diff options
Diffstat (limited to 'app/src/main/java/net/lacolaco/smileessence/view/Partials.kt')
-rw-r--r-- | app/src/main/java/net/lacolaco/smileessence/view/Partials.kt | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt b/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt new file mode 100644 index 00000000..27d8c3cd --- /dev/null +++ b/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt @@ -0,0 +1,220 @@ +package net.lacolaco.smileessence.view + +import android.app.Activity +import android.text.Html +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.ListView +import android.widget.TextView +import com.android.volley.toolbox.NetworkImageView +import net.lacolaco.smileessence.Application +import net.lacolaco.smileessence.R +import net.lacolaco.smileessence.activity.MainActivity +import net.lacolaco.smileessence.data.Account +import net.lacolaco.smileessence.data.ImageCache +import net.lacolaco.smileessence.entity.DirectMessage +import net.lacolaco.smileessence.entity.RBinding +import net.lacolaco.smileessence.entity.Tweet +import net.lacolaco.smileessence.preference.UserPreferenceHelper +import net.lacolaco.smileessence.util.StringUtils +import net.lacolaco.smileessence.util.UIObserverBundle +import net.lacolaco.smileessence.view.adapter.CustomListAdapter +import net.lacolaco.smileessence.view.dialog.MessageDetailDialogFragment +import net.lacolaco.smileessence.view.dialog.StatusDetailDialogFragment +import net.lacolaco.smileessence.view.dialog.UserDetailDialogFragment +import net.lacolaco.smileessence.view.listener.ListItemClickListener + +import java.lang.ref.WeakReference +import java.util.ArrayList + +object Partials { + fun getTweetView(tweet: Tweet, activity: Activity, convertView: View?, expandEmbeddedTweets: Boolean): View { + var convertView: View = convertView ?: activity.layoutInflater.inflate(R.layout.list_item_status, null) + var bundle: UIObserverBundle? = convertView.tag as UIObserverBundle? + if (bundle != null) { + bundle.detachAll() + } else { + bundle = UIObserverBundle() + convertView.tag = bundle + } + + convertView.setOnClickListener(ListItemClickListener(activity) { DialogHelper.showDialog(activity, StatusDetailDialogFragment.newInstance(tweet)) }) + + updateViewUser(tweet, activity, convertView) + updateViewBody(tweet, activity, convertView) + updateViewFavorited(tweet, convertView) + updateViewEmbeddeds(tweet, activity, convertView, expandEmbeddedTweets) + + val weakView = WeakReference(convertView) + val weakActivity = WeakReference(activity) + bundle.attach(tweet.originalTweet) { changes -> + val strongView = weakView.get() + if (strongView != null && changes.contains(RBinding.FAVORITERS)) + updateViewFavorited(tweet, strongView) + } + bundle.attach(tweet.user) { changes -> + val strongView = weakView.get() + val strongActivity = weakActivity.get() + if (strongView != null && strongActivity != null && changes.contains(RBinding.BASIC)) + updateViewUser(tweet, strongActivity, strongView) + } + + return convertView + } + + + private fun updateViewEmbeddeds(tweet: Tweet, activity: Activity, convertView: View, expandEmbeddedTweets: Boolean) { + val embeddedStatus = convertView.findViewById(R.id.listview_status_embedded_status) as ListView + if (expandEmbeddedTweets) { + val list = ArrayList<Tweet>() + val embeddedTweetsAdapter = object : CustomListAdapter<Tweet>() { + override val list: List<Tweet> + get() = list + + override fun getView(position: Int, convertView: View, parent: ViewGroup): View { + return Partials.getTweetView(getItem(position), activity, convertView, false) + } + } + + val account = Application.currentWorld!!.account + for (id in tweet.embeddedStatusIDs) { + Tweet.fetchTask(id, account).onDone { t -> list.add(t) }.execute() + } + embeddedStatus.adapter = embeddedTweetsAdapter + embeddedStatus.visibility = View.VISIBLE + } else { + embeddedStatus.adapter = null // view may be reused, set null explicitly + embeddedStatus.visibility = View.GONE + } + } + + private fun updateViewUser(tweet: Tweet, activity: Activity, convertView: View) { + val textSize = UserPreferenceHelper.instance.textSize + + val icon = convertView.findViewById(R.id.imageview_status_icon) as NetworkImageView + val iconUrl = tweet.originalTweet.user.profileImageUrl + icon.setImageUrl(iconUrl, ImageCache.getImageLoader()) + icon.setOnClickListener { v -> onIconClick(tweet, activity) } + + val header = convertView.findViewById(R.id.textview_status_header) as TextView + header.textSize = textSize.toFloat() + header.text = tweet.originalTweet.user.formattedName + + (convertView as ColoredRelativeLayout).setAccentVisibility(tweet.user === Application.currentWorld!!.account.user) + } + + private fun updateViewBody(tweet: Tweet, activity: Activity, convertView: View) { + val textSize = UserPreferenceHelper.instance.textSize + + val content = convertView.findViewById(R.id.textview_status_text) as TextView + content.textSize = textSize.toFloat() + val rawText = tweet.originalTweet.text + content.text = rawText + val footer = convertView.findViewById(R.id.textview_status_footer) as TextView + footer.textSize = (textSize - 2).toFloat() + footer.text = getFooterText(tweet) + + val typedView = convertView as ColoredRelativeLayout + if (tweet.isRetweet) { + typedView.setHighlight(2) + } else if (tweet.originalTweet.mentions.contains(Application.currentWorld!!.account.user.screenName)) { + typedView.setHighlight(1) + } else { + typedView.setHighlight(0) + } + } + + private fun updateViewFavorited(tweet: Tweet, convertView: View) { + val favorited = convertView.findViewById(R.id.imageview_status_favorited) as ImageView + favorited.visibility = if (tweet.isFavoritedBy(Application.currentWorld!!.account.userId)) View.VISIBLE else View.GONE + } + + private fun onIconClick(tweet: Tweet, activity: Activity) { + DialogHelper.showDialog(activity, UserDetailDialogFragment.newInstance(tweet.originalTweet.user)) + } + + private fun getFooterText(tweet: Tweet): String { + val builder = StringBuilder() + if (tweet.isRetweet) { + builder + .append("(RT: ") + .append(tweet.user.screenName) + .append(") ") + } + builder.append(StringUtils.dateToString(tweet.originalTweet.createdAt)) + builder.append(" via ") + builder.append(Html.fromHtml(tweet.originalTweet.source)) + return builder.toString() + } + + fun getDirectMessageView(directMessage: DirectMessage, activity: Activity, convertView: View?): View { + var convertView = convertView + if (convertView == null) { + convertView = activity.layoutInflater.inflate(R.layout.list_item_status, null) + } + var bundle: UIObserverBundle? = convertView!!.tag as UIObserverBundle? + if (bundle != null) { + bundle.detachAll() + } else { + bundle = UIObserverBundle() + convertView.tag = bundle + } + + convertView.setOnClickListener(ListItemClickListener(activity) { DialogHelper.showDialog(activity, MessageDetailDialogFragment.newInstance(directMessage)) }) + + val favorited = convertView.findViewById(R.id.imageview_status_favorited) as ImageView + favorited.visibility = View.GONE + + updateViewSender(directMessage, activity, convertView) + updateViewBody(directMessage, activity, convertView) + + val weakView = WeakReference(convertView) + val weakActivity = WeakReference(activity as MainActivity) + bundle.attach(directMessage.sender) { changes -> + val strongView = weakView.get() + val strongActivity = weakActivity.get() + if (strongView != null && strongActivity != null && changes.contains(RBinding.BASIC)) + updateViewSender(directMessage, strongActivity, strongView) + } + + return convertView + } + + private fun getFooterText(directMessage: DirectMessage, account: Account): String { + val builder = StringBuilder() + builder.append(StringUtils.dateToString(directMessage.createdAt)) + if (directMessage.sender.id == account.userId) { + builder.append(" to @").append(directMessage.recipient.screenName) + } + return builder.toString() + } + + private fun updateViewSender(directMessage: DirectMessage, activity: Activity, convertView: View) { + val textSize = UserPreferenceHelper.instance.textSize + + val icon = convertView.findViewById(R.id.imageview_status_icon) as NetworkImageView + val iconUrl = directMessage.sender.profileImageUrl + icon.setImageUrl(iconUrl, ImageCache.getImageLoader()) + icon.setOnClickListener { v -> + DialogHelper.showDialog(activity, UserDetailDialogFragment.newInstance(directMessage.sender)) + } + + val header = convertView.findViewById(R.id.textview_status_header) as TextView + header.textSize = textSize.toFloat() + header.text = directMessage.sender.formattedName + + (convertView as ColoredRelativeLayout).setAccentVisibility(directMessage.sender === Application.currentWorld!!.account.user) + } + + private fun updateViewBody(directMessage: DirectMessage, activity: Activity, convertView: View) { + val textSize = UserPreferenceHelper.instance.textSize + + val content = convertView.findViewById(R.id.textview_status_text) as TextView + content.textSize = textSize.toFloat() + content.text = directMessage.text + val footer = convertView.findViewById(R.id.textview_status_footer) as TextView + footer.textSize = (textSize - 2).toFloat() + footer.text = getFooterText(directMessage, Application.currentWorld!!.account) + } +} |