diff options
9 files changed, 53 insertions, 74 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/ExpandedListView.kt b/app/src/main/java/net/lacolaco/smileessence/view/ExpandedListView.kt deleted file mode 100644 index 794b4ea6..00000000 --- a/app/src/main/java/net/lacolaco/smileessence/view/ExpandedListView.kt +++ /dev/null @@ -1,22 +0,0 @@ -package net.lacolaco.smileessence.view - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.widget.ListView - -class ExpandedListView : ListView { - constructor(context: Context) : super(context) - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) - - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) - - public override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { - val expandSpec = View.MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE shr 2, View.MeasureSpec.AT_MOST) - super.onMeasure(widthMeasureSpec, expandSpec) - - val params = layoutParams - params.height = measuredHeight - } -} 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 3a42af8c..82da5358 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt @@ -2,23 +2,23 @@ package net.lacolaco.smileessence.view import android.app.Activity import android.text.Html +import android.view.LayoutInflater 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.Tweet import net.lacolaco.smileessence.entity.User +import net.lacolaco.smileessence.twitter.TwitterTaskException import net.lacolaco.smileessence.twitter.task.getTweetAsync -import net.lacolaco.smileessence.util.launchBg +import net.lacolaco.smileessence.util.launchUi import net.lacolaco.smileessence.util.toCompactString -import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter 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 { + fun getTweetView(tweet: Tweet, world: World, activity: Activity, convertView: View?): View { val view: View = convertView ?: activity.layoutInflater.inflate(R.layout.list_item_status, null) view.setOnClickListener { @@ -27,36 +27,39 @@ object Partials { updateViewUser(tweet.originalTweet.user, activity, view) updateViewBody(tweet, world, activity, view) updateTweetReactionsViews(tweet, world, view) - updateViewEmbeddeds(tweet, world, activity, view, expandEmbeddedTweets) + updateViewEmbeddeds(tweet, world, activity, view) return view } - private fun updateViewEmbeddeds(tweet: Tweet, world: World, activity: Activity, view: View, expandEmbeddedTweets: Boolean) { - if (expandEmbeddedTweets && tweet.embeddedStatusIDs.isNotEmpty()) { - val embeddedTweetsAdapter = object : UnorderedCustomListAdapter<Tweet>() { - override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - return Partials.getTweetView(getItem(position), world, activity, convertView, false) - } - } + private fun updateViewEmbeddeds(tweet: Tweet, world: World, activity: Activity, view: View) { + val layout = view.tweet_embedded_items + layout.visibility = if (tweet.embeddedStatusIDs.isNotEmpty()) View.VISIBLE else View.GONE + if (layout.childCount < tweet.embeddedStatusIDs.size) { + val inflater = LayoutInflater.from(layout.context) + layout.addView(inflater.inflate(R.layout.list_item_status, layout, false)) + } + for (i in 0 until layout.childCount) + layout.getChildAt(i).visibility = View.GONE - 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() + launchUi { + tweet.embeddedStatusIDs.mapIndexed { i, id -> + val itemView = layout.getChildAt(i) + itemView.tag = id + Triple(i, id, world.getTweetAsync(id, false)) + }.forEach { (i, id, task) -> + try { + val tweet = task.await() + if (activity.isDestroyed) + return@forEach + val itemView = layout.getChildAt(i) + if (itemView.tag != id) + return@forEach + getTweetView(tweet, world, activity, itemView) + itemView.visibility = View.VISIBLE + } catch (e: TwitterTaskException) { } } - 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 } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/TimelineAdapter.kt b/app/src/main/java/net/lacolaco/smileessence/view/adapter/TimelineAdapter.kt index 362e183b..f2b640c8 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/adapter/TimelineAdapter.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/adapter/TimelineAdapter.kt @@ -23,6 +23,6 @@ class TimelineAdapter(private val activity: Activity, private val world: World) } override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - return Partials.getTweetView(getItem(position), world, activity, convertView, true) + return Partials.getTweetView(getItem(position), world, activity, convertView) } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.kt index ea2fa461..26621ec7 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.kt @@ -16,6 +16,7 @@ import net.lacolaco.smileessence.view.Partials import net.lacolaco.smileessence.view.PopupMenu import net.lacolaco.smileessence.view.adapter.TimelineAdapter import net.lacolaco.smileessence.view.confirm +import twitter4j.Twitter class StatusDetailDialogFragment : StackableDialogFragment() { private lateinit var tweet: Tweet @@ -44,25 +45,20 @@ class StatusDetailDialogFragment : StackableDialogFragment() { updateViewButtons(view) setupViewMenu(view) - val adapter = TimelineAdapter(activity, world) - view.listview_status_detail_reply_to.adapter = adapter - if (tweet.inReplyToStatusId != null) { + view.tweet_in_reply_to.visibility = View.VISIBLE view.detail_dialog_divider_top.visibility = View.VISIBLE - view.listview_status_detail_reply_to.visibility = View.VISIBLE - - bg { - val inreply = try { - world.getTweetAsync(tweet.inReplyToStatusId!!, false).await() - } catch (e: Exception) { - return@bg + Partials.getTweetView(Tweet.placeHolder, world, activity, 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) + } catch (e: TwitterTaskException) { } - adapter.add(inreply) - adapter.update() } } else { + view.tweet_in_reply_to.visibility = View.GONE view.detail_dialog_divider_top.visibility = View.GONE - view.listview_status_detail_reply_to.visibility = View.GONE } return view } 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 492d241e..c149d762 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 @@ -63,7 +63,7 @@ class ListPageFragment : RefreshableTimelinePageFragment<Tweet, PageInfo.ListPag } override fun onBindItemView(item: Tweet, itemView: View) { - Partials.getTweetView(item, world, activity, itemView, true) + Partials.getTweetView(item, world, activity, itemView) } override fun onCreateItemView(parent: ViewGroup): View { 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 9491eb05..1ee32215 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 @@ -130,7 +130,7 @@ class SearchPageFragment : RefreshableTimelinePageFragment<Tweet, PageInfo.Searc } override fun onBindItemView(item: Tweet, itemView: View) { - Partials.getTweetView(item, world, activity, itemView, true) + Partials.getTweetView(item, world, activity, itemView) } override fun onCreateItemView(parent: ViewGroup): View { 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 0b445e12..4faaa7be 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,7 +26,7 @@ class TweetsPageFragment : TimelinePageFragment<Tweet, PageInfo.TweetsPageInfo>( } override fun onBindItemView(item: Tweet, itemView: View) { - Partials.getTweetView(item, world, activity, itemView, true) + Partials.getTweetView(item, world, activity, itemView) } override fun onCreateItemView(parent: ViewGroup): View { diff --git a/app/src/main/res/layout/dialog_status_detail.xml b/app/src/main/res/layout/dialog_status_detail.xml index 3e6f4ba8..0a96f1ce 100644 --- a/app/src/main/res/layout/dialog_status_detail.xml +++ b/app/src/main/res/layout/dialog_status_detail.xml @@ -7,10 +7,11 @@ android:layout_height="wrap_content" android:orientation="vertical"> - <net.lacolaco.smileessence.view.ExpandedListView - android:id="@+id/listview_status_detail_reply_to" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> + <include + android:id="@+id/tweet_in_reply_to" + layout="@layout/list_item_status" + android:layout_height="wrap_content" + android:layout_width="match_parent" /> <FrameLayout android:id="@+id/detail_dialog_divider_top" diff --git a/app/src/main/res/layout/item_status_base.xml b/app/src/main/res/layout/item_status_base.xml index bc52dbcd..ad63de69 100644 --- a/app/src/main/res/layout/item_status_base.xml +++ b/app/src/main/res/layout/item_status_base.xml @@ -64,7 +64,7 @@ android:layout_marginStart="8dp" android:textColor="?attr/color_status_text_footer" android:textSize="@dimen/status_meta_text_size" - app:layout_constraintBottom_toTopOf="@+id/listview_status_embedded_status" + app:layout_constraintBottom_toTopOf="@+id/tweet_embedded_items" app:layout_constraintStart_toEndOf="@+id/imageview_status_icon" app:layout_goneMarginBottom="5dp" tools:text="2017-01-01 00:00:00 via !!!VIA!!!" /> @@ -117,16 +117,17 @@ app:layout_constraintTop_toTopOf="@+id/textview_status_footer" tools:text="999999" /> - <net.lacolaco.smileessence.view.ExpandedListView - android:id="@+id/listview_status_embedded_status" + <LinearLayout + android:id="@+id/tweet_embedded_items" android:layout_width="0dp" android:layout_height="wrap_content" + android:orientation="vertical" android:layout_marginBottom="5dp" android:layout_marginEnd="5dp" android:layout_marginStart="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/imageview_status_icon" /> + app:layout_constraintStart_toEndOf="@+id/imageview_status_icon"/> <TextView android:id="@+id/textview_status_text" |