From bdd8a9bab6be112dbe98a64818028aad48f3aac7 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Sun, 31 Dec 2017 03:36:19 +0800 Subject: [PATCH] use LiveData for status activity summary --- .../ktextension/TextViewExtensions.kt | 2 +- .../twidere/adapter/StatusDetailsAdapter.kt | 5 +- .../dagger/component/GeneralComponent.kt | 2 +- .../status/StatusActivitySummaryLiveData.kt | 137 ++++++++++++++++++ .../{impl => user}/RelationshipLiveData.kt | 4 +- .../data/{impl => user}/UserLiveData.kt | 2 +- .../twidere/extension/DrawableExtensions.kt | 8 + .../extension/model/api/StatusExtensions.kt | 2 +- .../twidere/fragment/UserFragment.kt | 4 +- .../fragment/UserProfileEditorFragment.kt | 2 +- .../twidere/fragment/status/StatusFragment.kt | 129 ++--------------- .../twidere/view/DrawableTintTextView.kt | 22 +-- .../holder/status/DetailStatusViewHolder.kt | 9 +- .../view/holder/status/StatusViewHolder.kt | 6 +- 14 files changed, 193 insertions(+), 141 deletions(-) create mode 100644 twidere/src/main/kotlin/org/mariotaku/twidere/data/status/StatusActivitySummaryLiveData.kt rename twidere/src/main/kotlin/org/mariotaku/twidere/data/{impl => user}/RelationshipLiveData.kt (99%) rename twidere/src/main/kotlin/org/mariotaku/twidere/data/{impl => user}/UserLiveData.kt (99%) diff --git a/twidere/src/main/kotlin/org/mariotaku/ktextension/TextViewExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/ktextension/TextViewExtensions.kt index 1c0a89871..ae1b664d2 100644 --- a/twidere/src/main/kotlin/org/mariotaku/ktextension/TextViewExtensions.kt +++ b/twidere/src/main/kotlin/org/mariotaku/ktextension/TextViewExtensions.kt @@ -40,4 +40,4 @@ fun TextView.hideIfEmpty(hideVisibility: Int = View.GONE) { } else { View.VISIBLE } -} \ No newline at end of file +} diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/StatusDetailsAdapter.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/StatusDetailsAdapter.kt index 9631d3721..f9ce5b1e4 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/StatusDetailsAdapter.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/StatusDetailsAdapter.kt @@ -38,6 +38,7 @@ import org.mariotaku.twidere.adapter.iface.IStatusesAdapter import org.mariotaku.twidere.annotation.LoadMorePosition import org.mariotaku.twidere.annotation.TimelineStyle import org.mariotaku.twidere.constant.* +import org.mariotaku.twidere.data.status.StatusActivitySummaryLiveData import org.mariotaku.twidere.extension.model.originalId import org.mariotaku.twidere.extension.model.retweet_sort_id import org.mariotaku.twidere.fragment.status.StatusFragment @@ -86,7 +87,7 @@ class StatusDetailsAdapter( } notifyDataSetChanged() } - var statusActivity: StatusFragment.StatusActivity? = null + var statusActivity: StatusActivitySummaryLiveData.StatusActivity? = null internal set(value) { val status = status ?: return if (value != null && !value.isStatus(status)) { @@ -302,7 +303,7 @@ class StatusDetailsAdapter( holder as DetailStatusViewHolder payloads.forEach { it -> when (it) { - is StatusFragment.StatusActivity -> { + is StatusActivitySummaryLiveData.StatusActivity -> { holder.updateStatusActivity(it) } is ParcelableStatus -> { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/dagger/component/GeneralComponent.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/dagger/component/GeneralComponent.kt index 77cc17305..9dd2d68a8 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/dagger/component/GeneralComponent.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/dagger/component/GeneralComponent.kt @@ -27,7 +27,7 @@ import org.mariotaku.twidere.app.TwidereApplication import org.mariotaku.twidere.dagger.DependencyHolder import org.mariotaku.twidere.dagger.module.ApplicationModule import org.mariotaku.twidere.dagger.module.ChannelModule -import org.mariotaku.twidere.data.impl.UserLiveData +import org.mariotaku.twidere.data.user.UserLiveData import org.mariotaku.twidere.extension.get import org.mariotaku.twidere.fragment.BaseDialogFragment import org.mariotaku.twidere.fragment.BaseFragment diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/data/status/StatusActivitySummaryLiveData.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/data/status/StatusActivitySummaryLiveData.kt new file mode 100644 index 000000000..4812f6a9b --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/data/status/StatusActivitySummaryLiveData.kt @@ -0,0 +1,137 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2017 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.data.status + +import android.accounts.AccountManager +import android.content.ContentValues +import android.content.Context +import org.mariotaku.ktextension.addAllTo +import org.mariotaku.microblog.library.Twitter +import org.mariotaku.microblog.library.model.Paging +import org.mariotaku.sqliteqb.library.Expression +import org.mariotaku.twidere.annotation.AccountType +import org.mariotaku.twidere.data.ComputableExceptionLiveData +import org.mariotaku.twidere.exception.APINotSupportedException +import org.mariotaku.twidere.exception.RequiredFieldNotFoundException +import org.mariotaku.twidere.extension.getDetailsOrThrow +import org.mariotaku.twidere.extension.model.api.key +import org.mariotaku.twidere.extension.model.api.toParcelable +import org.mariotaku.twidere.extension.model.isOfficial +import org.mariotaku.twidere.extension.model.newMicroBlogInstance +import org.mariotaku.twidere.model.AccountDetails +import org.mariotaku.twidere.model.ParcelableStatus +import org.mariotaku.twidere.model.ParcelableUser +import org.mariotaku.twidere.model.UserKey +import org.mariotaku.twidere.provider.TwidereDataStore +import org.mariotaku.twidere.util.DataStoreUtils +import org.mariotaku.twidere.util.updateStatusInfo + +class StatusActivitySummaryLiveData(val context: Context) : ComputableExceptionLiveData(false) { + + var accountKey: UserKey? = null + var statusId: String? = null + + override fun compute(): StatusActivity { + val context = this.context + val accountKey = this.accountKey ?: throw RequiredFieldNotFoundException("account_key") + val statusId = this.statusId ?: throw RequiredFieldNotFoundException("status_id") + val account = AccountManager.get(context).getDetailsOrThrow(accountKey, true) + if (AccountType.TWITTER != account.type) { + throw APINotSupportedException() + } + val twitter = account.newMicroBlogInstance(context, Twitter::class.java) + val activitySummary = if (account.isOfficial(context)) { + twitter.getActivitySummaryOfficial(statusId, account) + } else { + twitter.getActivitySummary(statusId, account) + } + val countValues = ContentValues() + countValues.put(TwidereDataStore.Statuses.REPLY_COUNT, activitySummary.replyCount) + countValues.put(TwidereDataStore.Statuses.FAVORITE_COUNT, activitySummary.favoriteCount) + countValues.put(TwidereDataStore.Statuses.RETWEET_COUNT, activitySummary.retweetCount) + + val cr = context.contentResolver + val statusWhere = Expression.and( + Expression.equalsArgs(TwidereDataStore.Statuses.ACCOUNT_KEY), + Expression.or( + Expression.equalsArgs(TwidereDataStore.Statuses.ID), + Expression.equalsArgs(TwidereDataStore.Statuses.RETWEET_ID))) + val statusWhereArgs = arrayOf(accountKey.toString(), statusId, statusId) + cr.update(TwidereDataStore.Statuses.HomeTimeline.CONTENT_URI, countValues, statusWhere.sql, statusWhereArgs) + cr.updateStatusInfo(DataStoreUtils.STATUSES_ACTIVITIES_URIS, TwidereDataStore.Statuses.COLUMNS, + accountKey, statusId, ParcelableStatus::class.java) { item -> + item.favorite_count = activitySummary.favoriteCount + item.reply_count = activitySummary.replyCount + item.retweet_count = activitySummary.retweetCount + return@updateStatusInfo item + } + + return activitySummary + } + + private fun Twitter.getActivitySummary(statusId: String, account: AccountDetails): StatusActivity { + val relatedUsers = getRetweets(statusId, Paging().count(10)) + .filterNot { DataStoreUtils.isFilteringUser(context, it.user.key) } + .distinctBy { it.user.id } + .map { it.user.toParcelable(account) } + val result = StatusActivity(statusId, relatedUsers) + + val status = showStatus(statusId) + result.favoriteCount = status.favoriteCount + result.retweetCount = status.retweetCount + result.replyCount = status.descendentReplyCount + return result + } + + private fun Twitter.getActivitySummaryOfficial(statusId: String, account: AccountDetails): StatusActivity { + val summary = getStatusActivitySummary(statusId) + val relatedIds = mutableSetOf() + summary.favoriters?.iDs?.let { + it.slice(0 until (10.coerceAtMost(it.size))) + }?.addAllTo(relatedIds) + summary.retweeters?.iDs?.let { + it.slice(0 until (10.coerceAtMost(it.size))) + }?.addAllTo(relatedIds) + + val relatedUsers = lookupUsers(relatedIds.toTypedArray()) + .filterNot { DataStoreUtils.isFilteringUser(context, it.key) } + .map { it.toParcelable(account) } + val result = StatusActivity(statusId, relatedUsers) + + result.favoriteCount = summary.favoritersCount + result.retweetCount = summary.retweetersCount + result.replyCount = summary.descendentReplyCount + return result + } + + data class StatusActivity( + var statusId: String, + var relatedUsers: List, + var favoriteCount: Long = 0, + var replyCount: Long = -1, + var retweetCount: Long = 0 + ) { + + fun isStatus(status: ParcelableStatus): Boolean { + return statusId == status.retweet_id ?: status.id + } + } + +} \ No newline at end of file diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/data/impl/RelationshipLiveData.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/data/user/RelationshipLiveData.kt similarity index 99% rename from twidere/src/main/kotlin/org/mariotaku/twidere/data/impl/RelationshipLiveData.kt rename to twidere/src/main/kotlin/org/mariotaku/twidere/data/user/RelationshipLiveData.kt index 1b82635e5..49a5c0cd6 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/data/impl/RelationshipLiveData.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/data/user/RelationshipLiveData.kt @@ -17,13 +17,13 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.data.impl +package org.mariotaku.twidere.data.user import android.accounts.AccountManager import android.content.Context +import org.mariotaku.microblog.library.Mastodon import org.mariotaku.microblog.library.MicroBlog import org.mariotaku.microblog.library.MicroBlogException -import org.mariotaku.microblog.library.Mastodon import org.mariotaku.twidere.annotation.AccountType import org.mariotaku.twidere.data.ComputableExceptionLiveData import org.mariotaku.twidere.exception.RequiredFieldNotFoundException diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/data/impl/UserLiveData.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/data/user/UserLiveData.kt similarity index 99% rename from twidere/src/main/kotlin/org/mariotaku/twidere/data/impl/UserLiveData.kt rename to twidere/src/main/kotlin/org/mariotaku/twidere/data/user/UserLiveData.kt index b12ab0e04..1779e836b 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/data/impl/UserLiveData.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/data/user/UserLiveData.kt @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.data.impl +package org.mariotaku.twidere.data.user import android.accounts.AccountManager import android.content.Context diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/DrawableExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/DrawableExtensions.kt index 77dd35e1f..c0539669f 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/DrawableExtensions.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/DrawableExtensions.kt @@ -20,6 +20,7 @@ package org.mariotaku.twidere.extension import android.graphics.drawable.Drawable +import android.widget.TextView fun Drawable.setBoundsFitCenter(left: Int, top: Int, right: Int, bottom: Int) { val boundsWidth = right - left @@ -43,6 +44,13 @@ fun Drawable.setBoundsFitCenter(left: Int, top: Int, right: Int, bottom: Int) { } } +fun Drawable.applyCompoundDrawableBounds(textView: TextView) { + val iconSize = textView.textSize.toInt() + val top = (intrinsicHeight - iconSize) / 2 + val left = (intrinsicWidth - iconSize) / 2 + setBounds(left, top, left + iconSize, top + iconSize) +} + var Drawable.isActivated: Boolean get() = android.R.attr.state_activated in state set(value) { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/api/StatusExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/api/StatusExtensions.kt index f84a95d2d..1e7966af4 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/api/StatusExtensions.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/api/StatusExtensions.kt @@ -143,7 +143,7 @@ fun Status.applyTo(accountKey: UserKey, accountType: String, profileImageSize: S result.addFilterFlag(ParcelableStatus.FilterFlags.QUOTE_NOT_AVAILABLE) } - result.reply_count = status.replyCount + result.reply_count = status.descendentReplyCount result.retweet_count = status.retweetCount result.favorite_count = status.favoriteCount diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt index 8c972f260..042d0126d 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt @@ -91,8 +91,8 @@ import org.mariotaku.twidere.annotation.DisplayOption import org.mariotaku.twidere.annotation.TimelineStyle import org.mariotaku.twidere.constant.* import org.mariotaku.twidere.constant.KeyboardShortcutConstants.* -import org.mariotaku.twidere.data.impl.RelationshipLiveData -import org.mariotaku.twidere.data.impl.UserLiveData +import org.mariotaku.twidere.data.user.RelationshipLiveData +import org.mariotaku.twidere.data.user.UserLiveData import org.mariotaku.twidere.extension.* import org.mariotaku.twidere.extension.data.observe import org.mariotaku.twidere.extension.model.* diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserProfileEditorFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserProfileEditorFragment.kt index d212b0ecd..93635492a 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserProfileEditorFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserProfileEditorFragment.kt @@ -40,7 +40,7 @@ import org.mariotaku.twidere.activity.ColorPickerDialogActivity import org.mariotaku.twidere.activity.ThemedMediaPickerActivity import org.mariotaku.twidere.annotation.AccountType import org.mariotaku.twidere.annotation.ImageShapeStyle -import org.mariotaku.twidere.data.impl.UserLiveData +import org.mariotaku.twidere.data.user.UserLiveData import org.mariotaku.twidere.extension.* import org.mariotaku.twidere.extension.data.observe import org.mariotaku.twidere.extension.model.urlPreferred diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/status/StatusFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/status/StatusFragment.kt index e27cace20..6459bc43d 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/status/StatusFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/status/StatusFragment.kt @@ -19,10 +19,8 @@ package org.mariotaku.twidere.fragment.status -import android.accounts.AccountManager import android.app.Activity import android.app.Dialog -import android.content.ContentValues import android.content.Context import android.content.DialogInterface import android.content.Intent @@ -34,7 +32,6 @@ import android.nfc.NfcAdapter.CreateNdefMessageCallback import android.os.Bundle import android.support.v4.app.LoaderManager.LoaderCallbacks import android.support.v4.app.hasRunningLoadersSafe -import android.support.v4.content.FixedAsyncTaskLoader import android.support.v4.content.Loader import android.support.v7.app.AlertDialog import android.support.v7.widget.FixedLinearLayoutManager @@ -53,25 +50,21 @@ import nl.komponents.kovenant.ui.alwaysUi import nl.komponents.kovenant.ui.successUi import org.mariotaku.kpreferences.get import org.mariotaku.ktextension.* -import org.mariotaku.microblog.library.MicroBlog import org.mariotaku.microblog.library.MicroBlogException import org.mariotaku.microblog.library.Twitter -import org.mariotaku.microblog.library.model.Paging import org.mariotaku.microblog.library.model.twitter.TranslationResult -import org.mariotaku.sqliteqb.library.Expression import org.mariotaku.twidere.Constants.* import org.mariotaku.twidere.R import org.mariotaku.twidere.activity.ColorPickerDialogActivity import org.mariotaku.twidere.adapter.StatusDetailsAdapter import org.mariotaku.twidere.adapter.decorator.ExtendedDividerItemDecoration -import org.mariotaku.twidere.annotation.AccountType import org.mariotaku.twidere.annotation.LoadMorePosition import org.mariotaku.twidere.constant.KeyboardShortcutConstants.* import org.mariotaku.twidere.constant.displaySensitiveContentsKey import org.mariotaku.twidere.constant.newDocumentApiKey +import org.mariotaku.twidere.data.status.StatusActivitySummaryLiveData import org.mariotaku.twidere.extension.* -import org.mariotaku.twidere.extension.model.api.key -import org.mariotaku.twidere.extension.model.api.toParcelable +import org.mariotaku.twidere.extension.data.observe import org.mariotaku.twidere.extension.model.newMicroBlogInstance import org.mariotaku.twidere.extension.model.originalId import org.mariotaku.twidere.extension.view.calculateSpaceItemHeight @@ -85,8 +78,6 @@ import org.mariotaku.twidere.model.event.FavoriteTaskEvent import org.mariotaku.twidere.model.event.StatusListChangedEvent import org.mariotaku.twidere.model.pagination.Pagination import org.mariotaku.twidere.model.pagination.SinceMaxPagination -import org.mariotaku.twidere.provider.TwidereDataStore.CachedStatuses -import org.mariotaku.twidere.provider.TwidereDataStore.Statuses import org.mariotaku.twidere.task.AbsAccountRequestTask import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.ContentScrollHandler.ContentListSupport @@ -118,7 +109,6 @@ class StatusFragment : BaseFragment(), LoaderCallbacks { - override fun onCreateLoader(id: Int, args: Bundle): Loader { - val accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY) - val statusId = args.getString(EXTRA_STATUS_ID) - return StatusActivitySummaryLoader(activity!!, accountKey, statusId) - } - - override fun onLoadFinished(loader: Loader, data: StatusActivity?) { - adapter.updateItemDecoration() - adapter.statusActivity = data - } - - override fun onLoaderReset(loader: Loader) { - - } - } + private lateinit var statusActivitySummaryLiveData: StatusActivitySummaryLiveData override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { val activity = activity ?: return @@ -244,6 +219,13 @@ class StatusFragment : BaseFragment(), LoaderCallbacks + adapter.updateItemDecoration() + adapter.statusActivity = data + }, fail = { + DebugLog.w(tr = it) + }) loaderManager.initLoader(LOADER_ID_DETAIL_STATUS, arguments, this) } @@ -460,16 +442,9 @@ class StatusFragment : BaseFragment(), LoaderCallbacks(context) { - - override fun loadInBackground(): StatusActivity? { - val context = context - val details = AccountManager.get(context).getDetails(accountKey, true) ?: return null - if (AccountType.TWITTER != details.type) { - return null - } - val paging = Paging() - paging.setCount(10) - val activitySummary = StatusActivity(statusId, emptyList()) - try { - val twitter = details.newMicroBlogInstance(context, MicroBlog::class.java) - activitySummary.retweeters = twitter.getRetweets(statusId, paging) - .filterNot { DataStoreUtils.isFilteringUser(context, it.user.key) } - .distinctBy { it.user.id } - .map { it.user.toParcelable(details) } - val countValues = ContentValues() - val status = twitter.showStatus(statusId) - activitySummary.favoriteCount = status.favoriteCount - activitySummary.retweetCount = status.retweetCount - activitySummary.replyCount = status.replyCount - - countValues.put(Statuses.REPLY_COUNT, activitySummary.replyCount) - countValues.put(Statuses.FAVORITE_COUNT, activitySummary.favoriteCount) - countValues.put(Statuses.RETWEET_COUNT, activitySummary.retweetCount) - - val cr = context.contentResolver - val statusWhere = Expression.and( - Expression.equalsArgs(Statuses.ACCOUNT_KEY), - Expression.or( - Expression.equalsArgs(Statuses.ID), - Expression.equalsArgs(Statuses.RETWEET_ID))) - val statusWhereArgs = arrayOf(accountKey.toString(), statusId, statusId) - cr.update(Statuses.HomeTimeline.CONTENT_URI, countValues, statusWhere.sql, statusWhereArgs) - cr.updateStatusInfo(DataStoreUtils.STATUSES_ACTIVITIES_URIS, Statuses.COLUMNS, - accountKey, statusId, ParcelableStatus::class.java) { item -> - item.favorite_count = activitySummary.favoriteCount - item.reply_count = activitySummary.replyCount - item.retweet_count = activitySummary.retweetCount - return@updateStatusInfo item - } - val pStatus = status.toParcelable(details) - cr.insert(CachedStatuses.CONTENT_URI, pStatus, ParcelableStatus::class.java) - - return activitySummary - } catch (e: MicroBlogException) { - return null - } - - } - - override fun onStartLoading() { - forceLoad() - } - } - - data class StatusActivity( - var statusId: String, - var retweeters: List, - var favoriteCount: Long = 0, - var replyCount: Long = -1, - var retweetCount: Long = 0 - ) { - - fun isStatus(status: ParcelableStatus): Boolean { - return statusId == status.retweet_id ?: status.id - } - } - data class ReadPosition(var statusId: Long, var offsetTop: Int) private class StatusListLinearLayoutManager(context: Context, private val recyclerView: RecyclerView) : FixedLinearLayoutManager(context) { @@ -901,7 +801,6 @@ class StatusFragment : BaseFragment(), LoaderCallbacks= Build.VERSION_CODES.M) return compoundDrawables.forEach { drawable -> - if (drawable == null) return@forEach - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - DrawableCompat.setTintList(drawable, compoundDrawableTintListCompat) + if (drawable == null) { + return@forEach } - if (iconWidth > 0 && iconHeight > 0) { - val top = (drawable.intrinsicHeight - iconHeight) / 2 - val left = (drawable.intrinsicWidth - iconWidth) / 2 - drawable.setBounds(left, top, left + iconWidth, top + iconHeight) + DrawableCompat.setTintList(drawable, compoundDrawableTintListCompat) + } + TextViewCompat.getCompoundDrawablesRelative(this).forEach { drawable -> + if (drawable == null) { + return@forEach } + DrawableCompat.setTintList(drawable, compoundDrawableTintListCompat) } } + } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/status/DetailStatusViewHolder.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/status/DetailStatusViewHolder.kt index 2754f4138..55aaf32b8 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/status/DetailStatusViewHolder.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/status/DetailStatusViewHolder.kt @@ -49,6 +49,7 @@ import org.mariotaku.twidere.adapter.StatusDetailsAdapter import org.mariotaku.twidere.annotation.ProfileImageSize import org.mariotaku.twidere.constant.displaySensitiveContentsKey import org.mariotaku.twidere.constant.newDocumentApiKey +import org.mariotaku.twidere.data.status.StatusActivitySummaryLiveData import org.mariotaku.twidere.extension.loadProfileImage import org.mariotaku.twidere.extension.model.* import org.mariotaku.twidere.fragment.status.StatusFragment @@ -94,7 +95,7 @@ class DetailStatusViewHolder( @UiThread fun displayStatus(account: AccountDetails?, status: ParcelableStatus?, - statusActivity: StatusFragment.StatusActivity?, translation: TranslationResult?) { + statusActivity: StatusActivitySummaryLiveData.StatusActivity?, translation: TranslationResult?) { if (account == null || status == null) return val fragment = adapter.fragment val context = adapter.context @@ -422,9 +423,9 @@ class DetailStatusViewHolder( preferences, manager, status, item) } - internal fun updateStatusActivity(activity: StatusFragment.StatusActivity) { + internal fun updateStatusActivity(activity: StatusActivitySummaryLiveData.StatusActivity) { val adapter = itemView.countsUsers.adapter as CountsUsersAdapter - adapter.setUsers(activity.retweeters) + adapter.setUsers(activity.relatedUsers) adapter.setCounts(activity) } @@ -585,7 +586,7 @@ class DetailStatusViewHolder( notifyDataSetChanged() } - fun setCounts(activity: StatusFragment.StatusActivity?) { + fun setCounts(activity: StatusActivitySummaryLiveData.StatusActivity?) { if (activity != null) { val counts = ArrayList() val replyCount = activity.replyCount diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/status/StatusViewHolder.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/status/StatusViewHolder.kt index 95bf59560..a7bc61e49 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/status/StatusViewHolder.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/status/StatusViewHolder.kt @@ -709,8 +709,10 @@ class StatusViewHolder(private val adapter: IStatusesAdapter, itemView: View) : } private fun TextView.setLabelIcon(@DrawableRes icon: Int) { - TextViewCompat.setCompoundDrawablesRelative(this, ContextCompat.getDrawable(context, icon), - null, null, null) + val drawable = ContextCompat.getDrawable(context, icon)?.also { +// it.applyCompoundDrawableBounds(this) + } + TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(this, drawable, null, null, null) } private val Array.type: Int