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.kt174
1 files changed, 165 insertions, 9 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
index fd73b447..b2c6a6cf 100644
--- a/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt
+++ b/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt
@@ -3,30 +3,37 @@ 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 kotlinx.android.synthetic.main.list_item_tweet_rich.view.*
import net.lacolaco.smileessence.R
import net.lacolaco.smileessence.World
import net.lacolaco.smileessence.activity.MainActivity
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.twitter.*
+import net.lacolaco.smileessence.util.*
object Partials {
- fun getTweetView(tweet: Tweet, world: World, activity: FragmentActivity, view: View,
- maxRecursion: Int = 2): View {
+ fun getTweetView(tweet: Tweet, world: World, activity: MainActivity, view: View,
+ maxRecursion: Int = 2, defaultExpanded: Boolean = false): View {
+ var isExpanded = defaultExpanded
+ val updateExpansionVisibility = {
+ view.layout_status_expansion?.visibility = if (isExpanded) View.VISIBLE else View.GONE
+ }
view.setOnClickListener {
- (activity as MainActivity).addEphemeralTweetPage(tweet.id)
+ isExpanded = !isExpanded
+ updateExpansionVisibility()
+ }
+ view.setOnLongClickListener {
+ activity.addEphemeralTweetPage(tweet.id)
+ true
}
// Display source
val user = tweet.originalTweet.user
Glide.with(view).load(user.profileImageUrl).into(view.imageview_status_icon)
view.imageview_status_icon.setOnClickListener {
- (activity as MainActivity).addEphemeralUserPage(user.id)
+ activity.addEphemeralUserPage(user.id)
}
view.source_user_protected.visibility =
if (user.isProtected) View.VISIBLE else View.INVISIBLE
@@ -103,6 +110,155 @@ object Partials {
} else
layout.visibility = View.GONE
+ // Expansions
+ if (view.layout_status_expansion != null) {
+ view.button_status_detail_favorite.isActivated = world.id in tweet.favoriters
+ view.button_status_detail_retweet.isActivated = world.id in tweet.retweets
+ updateViewButtons(tweet, world, activity, view)
+ setupViewMenu(tweet, world, activity, view)
+ updateExpansionVisibility()
+ }
+
return view
}
+
+ private fun updateViewButtons(tweet: Tweet, world: World, activity: MainActivity, view: View) {
+ view.button_status_detail_reply.setOnClickListener {
+ val originalTweet = tweet.originalTweet
+
+ val builder = StringBuilder()
+ builder.append("@${originalTweet.user.screenName} ")
+
+ originalTweet.entities.mentions
+ .filter { it != world.user.screenName }
+ .forEach { builder.append("@$it ") }
+ val text = builder.toString()
+ val selStart = originalTweet.user.screenName.length + 2 // "@" and " "
+
+ activity.openPostPageAndReplyTo(originalTweet, text)
+ }
+ view.button_status_detail_retweet.setOnClickListener {
+ activity.confirm(R.string.dialog_confirm_commands) {
+ if (world.id in tweet.retweets) {
+ launchUi {
+ try {
+ world.deleteTweetAsync(tweet.retweets[world.id]!!).await()
+ world.notify(R.string.notice_status_delete_succeeded)
+ updateViewButtons(tweet, world, activity, view)
+ } catch (e: TwitterTaskException) {
+ world.notifyError(R.string.notice_status_delete_failed)
+ }
+ }
+ } else {
+ launchUi {
+ try {
+ world.retweetAsync(tweet.id).await()
+ world.notify(R.string.notice_retweet_succeeded)
+ updateViewButtons(tweet, world, activity, view)
+ } catch (e: TwitterTaskException) {
+ world.notifyError(R.string.notice_retweet_failed)
+ }
+ }
+ }
+ }
+ }
+ view.button_status_detail_favorite.setOnClickListener {
+ val favoriting = world.id !in tweet.favoriters
+
+ launchUi {
+ try {
+ if (favoriting) {
+ world.favoriteAsync(tweet.id).await()
+ world.notify(R.string.notice_favorite_succeeded)
+ } else {
+ world.unfavoriteAsync(tweet.id).await()
+ world.notify(R.string.notice_unfavorite_succeeded)
+ }
+ } catch (e: TwitterTaskException) {
+ if (favoriting)
+ world.notifyError(R.string.notice_favorite_failed)
+ else
+ world.notifyError(R.string.notice_unfavorite_failed)
+ }
+ }
+ }
+ if (tweet.originalTweet.user === world.user)
+ view.button_status_detail_delete.visibility = View.VISIBLE
+ else
+ view.button_status_detail_delete.visibility = View.GONE
+ view.button_status_detail_delete.setOnClickListener {
+ activity.confirm(R.string.dialog_confirm_commands) {
+ launchBg {
+ try {
+ world.deleteTweetAsync(tweet.originalTweet.id).await()
+ world.notify(R.string.notice_status_delete_succeeded)
+ } catch (e: TwitterTaskException) {
+ world.notifyError(R.string.notice_status_delete_failed)
+ }
+ }
+ activity.closeCurrentEphemeralPage()
+ }
+ }
+ view.button_status_detail_menu.setOnClickListener {
+ val popup = PopupMenu(activity, view.button_status_detail_menu)
+ popup.add(R.string.command_status_add_to_reply) {
+ val text = String.format("@%s ", tweet.originalTweet.user.screenName)
+ activity.openPostPageAndAppendText(text)
+ world.notify(R.string.notice_add_to_reply)
+ }
+ popup.add(R.string.command_status_open_in_browser) {
+ activity.browse("https://twitter.com/${tweet.originalTweet.user.screenName}/status/${tweet.originalTweet.id}")
+ }
+ popup.add(R.string.command_status_copy_text_to_clipboard) {
+ SystemServiceHelper.copyToClipboard(activity, "tweet text", tweet.originalTweet.text)
+ world.notify(R.string.notice_copy_clipboard)
+ }
+ popup.add(R.string.command_status_copy_url_to_clipboard) {
+ SystemServiceHelper.copyToClipboard(activity, "tweet url", "https://twitter.com/${tweet.originalTweet.user.screenName}/status/${tweet.originalTweet.id}")
+ world.notify(R.string.notice_copy_clipboard)
+ }
+ popup.show()
+ }
+ }
+
+ private fun setupViewMenu(tweet: Tweet, world: World, activity: MainActivity, view: View) {
+ view.embedded_menu_items.removeAllViews()
+ val addUserItem = { screenName: String, title: String ->
+ view.embedded_menu_items.add("@$screenName", title) {
+ val ref = ref(activity)
+ launchUi {
+ try {
+ val user = world.getUserAsync(screenName).await()
+ ref.get().addEphemeralUserPage(user.id)
+ } catch (e: TwitterTaskException) {
+ world.notifyError(R.string.notice_error_show_user)
+ }
+ }
+ }
+ }
+ if (tweet.user !== tweet.originalTweet.user)
+ addUserItem(tweet.user.screenName, "RT by")
+ for (screenName in tweet.entities.mentions.distinct().minus(tweet.user.screenName))
+ addUserItem(screenName, "Mention")
+ for (hashtag in tweet.entities.hashtags)
+ view.embedded_menu_items.add("#$hashtag", "Hashtag") {
+ // XXX
+ activity.openPostPageAndAppendText(" #$hashtag")
+ }
+ for (url in tweet.entities.urlsExpanded)
+ view.embedded_menu_items.add(url, "URL") {
+ activity.browse(url)
+ }
+ for (url in tweet.entities.mediaUrls)
+ view.embedded_menu_items.add(url, "Media") {
+ activity.browse(url)
+ }
+ if (view.embedded_menu_items.childCount != 0) {
+ view.detail_dialog_divider_bottom.visibility = View.VISIBLE
+ view.embedded_menu_items.visibility = View.VISIBLE
+ } else {
+ view.detail_dialog_divider_bottom.visibility = View.GONE
+ view.embedded_menu_items.visibility = View.GONE
+ }
+ }
}