aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2019-03-26 00:17:31 +0900
committerKazuki Yamaguchi <k@rhe.jp>2019-03-26 00:17:31 +0900
commit12638e2e17ed84c6cc12cb836cea53d87703cd24 (patch)
treec0e41b5368b4890b5cfd1c3f01681790f4da93ea
parentfedd5082d627a9f732887be26ce0a8f95eb5ca20 (diff)
downloadSmileEssence-master.tar.gz
expandable tweetsHEADmaster
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/Partials.kt174
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/page/ComposePageFragment.kt2
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/page/ListPageFragment.kt4
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/page/PageFragment.kt2
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt4
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/page/TweetPageFragment.kt154
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/page/TweetsPageFragment.kt4
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/view/page/UserPageFragment.kt4
-rw-r--r--app/src/main/res/layout/list_item_tweet_rich.xml104
-rw-r--r--app/src/main/res/layout/page_fragment_tweet.xml97
10 files changed, 286 insertions, 263 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
+ }
+ }
}
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/ComposePageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/ComposePageFragment.kt
index 417e6174..81ffda73 100644
--- a/app/src/main/java/net/lacolaco/smileessence/view/page/ComposePageFragment.kt
+++ b/app/src/main/java/net/lacolaco/smileessence/view/page/ComposePageFragment.kt
@@ -88,7 +88,7 @@ class ComposePageFragment : PageFragment<PageInfo.ComposePageInfo>(), TextWatche
if (postState.inReplyTo != null) {
layout_post_reply_status.visibility = View.VISIBLE
button_post_reply_delete.visibility = View.VISIBLE
- val header = Partials.getTweetView(postState.inReplyTo!!, world, activity!!,
+ val header = Partials.getTweetView(postState.inReplyTo!!, world, mainActivity,
layout_post_reply_status)
header.isClickable = false
} else {
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/ListPageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/ListPageFragment.kt
index 9b7b1708..6c282c5a 100644
--- a/app/src/main/java/net/lacolaco/smileessence/view/page/ListPageFragment.kt
+++ b/app/src/main/java/net/lacolaco/smileessence/view/page/ListPageFragment.kt
@@ -67,12 +67,12 @@ class ListPageFragment : RefreshableTimelinePageFragment<Tweet, PageInfo.ListPag
}
override fun onBindItemView(item: Tweet, itemView: View) {
- Partials.getTweetView(item, world, activity!!, itemView)
+ Partials.getTweetView(item, world, mainActivity, itemView)
}
override fun onCreateItemView(parent: ViewGroup): View {
val layoutInflater = LayoutInflater.from(parent.context)
- return layoutInflater.inflate(R.layout.list_item_tweet, parent, false)
+ return layoutInflater.inflate(R.layout.list_item_tweet_rich, parent, false)
}
private fun runRefreshTask(task: Deferred<List<Tweet>>, onFinish: () -> Unit) = launchUi {
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/PageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/PageFragment.kt
index 49ffad87..37bbfd4a 100644
--- a/app/src/main/java/net/lacolaco/smileessence/view/page/PageFragment.kt
+++ b/app/src/main/java/net/lacolaco/smileessence/view/page/PageFragment.kt
@@ -20,7 +20,7 @@ abstract class PageFragment<out T : PageInfo> : Fragment() {
world.getPageById(uid) as T
}
- val mainActivity
+ protected val mainActivity
get() = super.getActivity() as MainActivity
// Invoked when user click the refresh button.
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt
index 32b9a2aa..5a61db51 100644
--- a/app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt
+++ b/app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt
@@ -125,12 +125,12 @@ class SearchPageFragment : RefreshableTimelinePageFragment<Tweet, PageInfo.Searc
}
override fun onBindItemView(item: Tweet, itemView: View) {
- Partials.getTweetView(item, world, activity!!, itemView)
+ Partials.getTweetView(item, world, mainActivity, itemView)
}
override fun onCreateItemView(parent: ViewGroup): View {
val layoutInflater = LayoutInflater.from(parent.context)
- return layoutInflater.inflate(R.layout.list_item_tweet, parent, false)
+ return layoutInflater.inflate(R.layout.list_item_tweet_rich, parent, false)
}
private fun saveQuery() = launchUi {
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/TweetPageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/TweetPageFragment.kt
index cbe8ea80..f748f68b 100644
--- a/app/src/main/java/net/lacolaco/smileessence/view/page/TweetPageFragment.kt
+++ b/app/src/main/java/net/lacolaco/smileessence/view/page/TweetPageFragment.kt
@@ -6,14 +6,11 @@ import android.view.View
import android.view.ViewGroup
import kotlinx.android.synthetic.main.page_fragment_tweet.view.*
import net.lacolaco.smileessence.R
-import net.lacolaco.smileessence.activity.MainActivity
import net.lacolaco.smileessence.data.PageInfo
import net.lacolaco.smileessence.entity.Tweet
import net.lacolaco.smileessence.twitter.*
import net.lacolaco.smileessence.util.*
import net.lacolaco.smileessence.view.Partials
-import net.lacolaco.smileessence.view.PopupMenu
-import net.lacolaco.smileessence.view.confirm
class TweetPageFragment : PageFragment<PageInfo.TweetPageInfo>() {
private lateinit var tweet: Tweet
@@ -36,27 +33,22 @@ class TweetPageFragment : PageFragment<PageInfo.TweetPageInfo>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- val statusHeader = Partials.getTweetView(tweet, world, activity!!, view.detail_current_status)
+ val statusHeader = Partials.getTweetView(tweet, world, mainActivity, view.detail_current_status,
+ defaultExpanded = true)
statusHeader.isClickable = false
- // XXX
- view.button_status_detail_favorite.isActivated = world.id in tweet.favoriters
- view.button_status_detail_retweet.isActivated = world.id in tweet.retweets
- updateViewButtons(view)
- setupViewMenu(view)
-
if (tweet.inReplyToStatusId != null) {
view.tweet_in_reply_to.visibility = View.VISIBLE
view.detail_dialog_divider_top.visibility = View.VISIBLE
val cached = Tweet.cached(tweet.inReplyToStatusId!!)
if (cached != null)
- Partials.getTweetView(cached, world, activity!!, view.tweet_in_reply_to)
+ Partials.getTweetView(cached, world, mainActivity, view.tweet_in_reply_to)
else {
- Partials.getTweetView(Tweet.placeHolder, world, activity!!, view.tweet_in_reply_to)
+ Partials.getTweetView(Tweet.placeHolder, world, mainActivity, view.tweet_in_reply_to)
launchUi {
try {
val tweet = world.getTweetAsync(tweet.inReplyToStatusId!!, false).await()
- Partials.getTweetView(tweet, world, activity!!, view.tweet_in_reply_to)
+ Partials.getTweetView(tweet, world, mainActivity, view.tweet_in_reply_to)
} catch (e: TwitterTaskException) {
}
}
@@ -66,140 +58,4 @@ class TweetPageFragment : PageFragment<PageInfo.TweetPageInfo>() {
view.detail_dialog_divider_top.visibility = View.GONE
}
}
-
- private fun updateViewButtons(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 as MainActivity).openPostPageAndReplyTo(originalTweet, text)
- }
- view.button_status_detail_retweet.setOnClickListener {
- 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(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(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 {
- 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 as MainActivity).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 as MainActivity).openPostPageAndAppendText(text)
- world.notify(R.string.notice_add_to_reply)
- }
- popup.add(R.string.command_status_open_in_browser) {
- 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(view: View) {
- val addUserItem = { screenName: String, title: String ->
- view.embedded_menu_items.add("@$screenName", title) {
- val ref = ref(activity as MainActivity)
- launchUi {
- try {
- val user = world.getUserAsync(screenName).await()
- (activity as MainActivity).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 as MainActivity).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.GONE
- view.embedded_menu_items.visibility = View.GONE
- }
- }
}
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/TweetsPageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/TweetsPageFragment.kt
index f2ad1998..f9a58ca0 100644
--- a/app/src/main/java/net/lacolaco/smileessence/view/page/TweetsPageFragment.kt
+++ b/app/src/main/java/net/lacolaco/smileessence/view/page/TweetsPageFragment.kt
@@ -26,11 +26,11 @@ class TweetsPageFragment : TimelinePageFragment<Tweet, PageInfo.TweetsPageInfo>(
}
override fun onBindItemView(item: Tweet, itemView: View) {
- Partials.getTweetView(item, world, activity!!, itemView)
+ Partials.getTweetView(item, world, mainActivity, itemView)
}
override fun onCreateItemView(parent: ViewGroup): View {
val layoutInflater = LayoutInflater.from(parent.context)
- return layoutInflater.inflate(R.layout.list_item_tweet, parent, false)
+ return layoutInflater.inflate(R.layout.list_item_tweet_rich, parent, false)
}
}
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/UserPageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/UserPageFragment.kt
index f417aeb8..703ca9b3 100644
--- a/app/src/main/java/net/lacolaco/smileessence/view/page/UserPageFragment.kt
+++ b/app/src/main/java/net/lacolaco/smileessence/view/page/UserPageFragment.kt
@@ -221,11 +221,11 @@ class UserPageFragment : RefreshableTimelinePageFragment<Tweet, PageInfo.UserPag
}
override fun onBindItemView(item: Tweet, itemView: View) {
- Partials.getTweetView(item, world, activity!!, itemView)
+ Partials.getTweetView(item, world, mainActivity, itemView)
}
override fun onCreateItemView(parent: ViewGroup): View {
val layoutInflater = LayoutInflater.from(parent.context)
- return layoutInflater.inflate(R.layout.list_item_tweet, parent, false)
+ return layoutInflater.inflate(R.layout.list_item_tweet_rich, parent, false)
}
}
diff --git a/app/src/main/res/layout/list_item_tweet_rich.xml b/app/src/main/res/layout/list_item_tweet_rich.xml
new file mode 100644
index 00000000..0aa8dcc8
--- /dev/null
+++ b/app/src/main/res/layout/list_item_tweet_rich.xml
@@ -0,0 +1,104 @@
+<net.lacolaco.smileessence.view.TweetStateFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?status_item_background"
+ android:descendantFocusability="blocksDescendants"
+ android:foreground="?attr/selectableItemBackground">
+
+ <FrameLayout
+ android:layout_width="2dp"
+ android:layout_height="match_parent"
+ android:background="?status_item_accent"
+ android:duplicateParentState="true" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:duplicateParentState="true"
+ android:orientation="vertical">
+
+ <include
+ android:id="@+id/layout_status_header"
+ layout="@layout/item_status_base" />
+
+ <LinearLayout
+ android:id="@+id/layout_status_expansion"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="end">
+
+ <ImageButton
+ android:id="@+id/button_status_detail_reply"
+ android:layout_width="32dp"
+ android:layout_height="32dp"
+ android:layout_marginBottom="8dp"
+ android:layout_marginEnd="8dp"
+ android:layout_marginTop="8dp"
+ android:background="?selectableItemBackgroundBorderless"
+ app:srcCompat="@drawable/ic_reply_all_black_24dp"
+ android:tint="?android:textColorSecondary" />
+
+ <ImageButton
+ android:id="@+id/button_status_detail_retweet"
+ android:layout_width="32dp"
+ android:layout_height="32dp"
+ android:layout_marginBottom="8dp"
+ android:layout_marginEnd="8dp"
+ android:layout_marginTop="8dp"
+ android:background="?selectableItemBackgroundBorderless"
+ app:srcCompat="@drawable/ic_repeat_black_24dp"
+ android:tint="@color/green_activatable" />
+
+ <ImageButton
+ android:id="@+id/button_status_detail_favorite"
+ android:layout_width="32dp"
+ android:layout_height="32dp"
+ android:layout_marginBottom="8dp"
+ android:layout_marginEnd="8dp"
+ android:layout_marginTop="8dp"
+ android:background="?selectableItemBackgroundBorderless"
+ app:srcCompat="@drawable/ic_star_black_24dp"
+ android:tint="@color/orange_activatable" />
+
+ <ImageButton
+ android:id="@+id/button_status_detail_delete"
+ android:layout_width="32dp"
+ android:layout_height="32dp"
+ android:layout_marginBottom="8dp"
+ android:layout_marginEnd="8dp"
+ android:layout_marginTop="8dp"
+ android:background="?selectableItemBackgroundBorderless"
+ app:srcCompat="@drawable/ic_delete_forever_black_24dp"
+ android:tint="?android:textColorSecondary" />
+
+ <ImageButton
+ android:id="@+id/button_status_detail_menu"
+ android:layout_width="32dp"
+ android:layout_height="32dp"
+ android:layout_marginBottom="8dp"
+ android:layout_marginEnd="8dp"
+ android:layout_marginTop="8dp"
+ android:background="?selectableItemBackgroundBorderless"
+ app:srcCompat="@drawable/ic_more_vert_black_24dp"
+ android:tint="?android:textColorSecondary" />
+ </LinearLayout>
+
+ <FrameLayout
+ android:id="@+id/detail_dialog_divider_bottom"
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="?app_divider" />
+
+ <net.lacolaco.smileessence.view.EmbeddedMenuLayout
+ android:id="@+id/embedded_menu_items"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+ </LinearLayout>
+ </LinearLayout>
+</net.lacolaco.smileessence.view.TweetStateFrameLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/page_fragment_tweet.xml b/app/src/main/res/layout/page_fragment_tweet.xml
index 41fcac1f..7038f263 100644
--- a/app/src/main/res/layout/page_fragment_tweet.xml
+++ b/app/src/main/res/layout/page_fragment_tweet.xml
@@ -1,5 +1,4 @@
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -20,100 +19,8 @@
android:layout_height="1dp"
android:background="?app_divider" />
- <net.lacolaco.smileessence.view.TweetStateFrameLayout
+ <include
android:id="@+id/detail_current_status"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="?status_item_background">
-
- <FrameLayout
- android:layout_width="2dp"
- android:layout_height="match_parent"
- android:background="?status_item_accent"
- android:duplicateParentState="true" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:duplicateParentState="true"
- android:orientation="vertical">
-
- <include
- android:id="@+id/layout_status_header"
- layout="@layout/item_status_base" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="end">
-
- <ImageButton
- android:id="@+id/button_status_detail_reply"
- android:layout_width="32dp"
- android:layout_height="32dp"
- android:layout_marginBottom="8dp"
- android:layout_marginEnd="8dp"
- android:layout_marginTop="8dp"
- android:background="?selectableItemBackgroundBorderless"
- app:srcCompat="@drawable/ic_reply_all_black_24dp"
- android:tint="?android:textColorSecondary" />
-
- <ImageButton
- android:id="@+id/button_status_detail_retweet"
- android:layout_width="32dp"
- android:layout_height="32dp"
- android:layout_marginBottom="8dp"
- android:layout_marginEnd="8dp"
- android:layout_marginTop="8dp"
- android:background="?selectableItemBackgroundBorderless"
- app:srcCompat="@drawable/ic_repeat_black_24dp"
- android:tint="@color/green_activatable" />
-
- <ImageButton
- android:id="@+id/button_status_detail_favorite"
- android:layout_width="32dp"
- android:layout_height="32dp"
- android:layout_marginBottom="8dp"
- android:layout_marginEnd="8dp"
- android:layout_marginTop="8dp"
- android:background="?selectableItemBackgroundBorderless"
- app:srcCompat="@drawable/ic_star_black_24dp"
- android:tint="@color/orange_activatable" />
-
- <ImageButton
- android:id="@+id/button_status_detail_delete"
- android:layout_width="32dp"
- android:layout_height="32dp"
- android:layout_marginBottom="8dp"
- android:layout_marginEnd="8dp"
- android:layout_marginTop="8dp"
- android:background="?selectableItemBackgroundBorderless"
- app:srcCompat="@drawable/ic_delete_forever_black_24dp"
- android:tint="?android:textColorSecondary" />
-
- <ImageButton
- android:id="@+id/button_status_detail_menu"
- android:layout_width="32dp"
- android:layout_height="32dp"
- android:layout_marginBottom="8dp"
- android:layout_marginEnd="8dp"
- android:layout_marginTop="8dp"
- android:background="?selectableItemBackgroundBorderless"
- app:srcCompat="@drawable/ic_more_vert_black_24dp"
- android:tint="?android:textColorSecondary" />
- </LinearLayout>
-
- <FrameLayout
- android:id="@+id/detail_dialog_divider_bottom"
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:background="?app_divider" />
-
- <net.lacolaco.smileessence.view.EmbeddedMenuLayout
- android:id="@+id/embedded_menu_items"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </LinearLayout>
- </net.lacolaco.smileessence.view.TweetStateFrameLayout>
+ layout="@layout/list_item_tweet_rich" />
</LinearLayout>
</ScrollView>