aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt
diff options
context:
space:
mode:
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.kt220
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)
+ }
+}