use LiveData for status activity summary
This commit is contained in:
parent
e8774425a7
commit
bdd8a9bab6
|
@ -40,4 +40,4 @@ fun TextView.hideIfEmpty(hideVisibility: Int = View.GONE) {
|
|||
} else {
|
||||
View.VISIBLE
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 -> {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1,137 @@
|
|||
/*
|
||||
* Twidere - Twitter client for Android
|
||||
*
|
||||
* Copyright (C) 2012-2017 Mariotaku Lee <mariotaku.lee@gmail.com>
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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<StatusActivitySummaryLiveData.StatusActivity>(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<String>()
|
||||
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<ParcelableUser>,
|
||||
var favoriteCount: Long = 0,
|
||||
var replyCount: Long = -1,
|
||||
var retweetCount: Long = 0
|
||||
) {
|
||||
|
||||
fun isStatus(status: ParcelableStatus): Boolean {
|
||||
return statusId == status.retweet_id ?: status.id
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -17,13 +17,13 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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
|
|
@ -17,7 +17,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.mariotaku.twidere.data.impl
|
||||
package org.mariotaku.twidere.data.user
|
||||
|
||||
import android.accounts.AccountManager
|
||||
import android.content.Context
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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.*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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<SingleResponse<Parcelable
|
|||
// Data fields
|
||||
private var conversationLoaderInitialized: Boolean = false
|
||||
|
||||
private var activityLoaderInitialized: Boolean = false
|
||||
private var hasMoreConversation = true
|
||||
|
||||
// Listeners
|
||||
|
@ -139,7 +129,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
|
|||
val adapter = this@StatusFragment.adapter
|
||||
adapter.updateItemDecoration()
|
||||
val conversationLoader = loader as ConversationLoader
|
||||
var supportedPositions: Int = 0
|
||||
var supportedPositions = 0
|
||||
if (data != null && !data.isEmpty()) {
|
||||
val sinceSortId = (conversationLoader.pagination as? SinceMaxPagination)?.sinceSortId ?: -1
|
||||
if (sinceSortId < data[data.size - 1].sort_id) {
|
||||
|
@ -166,22 +156,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
|
|||
}
|
||||
}
|
||||
|
||||
private val statusActivityLoaderCallback = object : LoaderCallbacks<StatusActivity?> {
|
||||
override fun onCreateLoader(id: Int, args: Bundle): Loader<StatusActivity?> {
|
||||
val accountKey = args.getParcelable<UserKey>(EXTRA_ACCOUNT_KEY)
|
||||
val statusId = args.getString(EXTRA_STATUS_ID)
|
||||
return StatusActivitySummaryLoader(activity!!, accountKey, statusId)
|
||||
}
|
||||
|
||||
override fun onLoadFinished(loader: Loader<StatusActivity?>, data: StatusActivity?) {
|
||||
adapter.updateItemDecoration()
|
||||
adapter.statusActivity = data
|
||||
}
|
||||
|
||||
override fun onLoaderReset(loader: Loader<StatusActivity?>) {
|
||||
|
||||
}
|
||||
}
|
||||
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<SingleResponse<Parcelable
|
|||
|
||||
setState(STATE_LOADING)
|
||||
|
||||
statusActivitySummaryLiveData = StatusActivitySummaryLiveData(context!!)
|
||||
statusActivitySummaryLiveData.observe(this, success = { data ->
|
||||
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<SingleResponse<Parcelable
|
|||
|
||||
private fun loadActivity(status: ParcelableStatus?) {
|
||||
if (status == null || host == null || isDetached) return
|
||||
val args = Bundle {
|
||||
this[EXTRA_ACCOUNT_KEY] = status.account_key
|
||||
this[EXTRA_STATUS_ID] = status.originalId
|
||||
}
|
||||
if (activityLoaderInitialized) {
|
||||
loaderManager.restartLoader(LOADER_ID_STATUS_ACTIVITY, args, statusActivityLoaderCallback)
|
||||
return
|
||||
}
|
||||
loaderManager.initLoader(LOADER_ID_STATUS_ACTIVITY, args, statusActivityLoaderCallback)
|
||||
activityLoaderInitialized = true
|
||||
statusActivitySummaryLiveData.accountKey = status.account_key
|
||||
statusActivitySummaryLiveData.statusId = status.id
|
||||
statusActivitySummaryLiveData.load()
|
||||
}
|
||||
|
||||
internal fun loadTranslation(status: ParcelableStatus?) {
|
||||
|
@ -671,81 +646,6 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
class StatusActivitySummaryLoader(
|
||||
context: Context,
|
||||
private val accountKey: UserKey,
|
||||
private val statusId: String
|
||||
) : FixedAsyncTaskLoader<StatusActivity>(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<ParcelableUser>,
|
||||
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<SingleResponse<Parcelable
|
|||
// Constants
|
||||
private val LOADER_ID_DETAIL_STATUS = 1
|
||||
private val LOADER_ID_STATUS_CONVERSATIONS = 2
|
||||
private val LOADER_ID_STATUS_ACTIVITY = 3
|
||||
private val STATE_LOADED = 1
|
||||
private val STATE_LOADING = 2
|
||||
private val STATE_ERROR = 3
|
||||
|
|
|
@ -23,6 +23,7 @@ import android.content.Context
|
|||
import android.content.res.ColorStateList
|
||||
import android.os.Build
|
||||
import android.support.v4.graphics.drawable.DrawableCompat
|
||||
import android.support.v4.widget.TextViewCompat
|
||||
import android.util.AttributeSet
|
||||
import org.mariotaku.twidere.R
|
||||
|
||||
|
@ -47,9 +48,9 @@ class DrawableTintTextView(
|
|||
val a = context.obtainStyledAttributes(attrs, R.styleable.DrawableTintTextView)
|
||||
if (a.hasValue(R.styleable.DrawableTintTextView_drawableTint)) {
|
||||
compoundDrawableTintListCompat = a.getColorStateList(R.styleable.DrawableTintTextView_drawableTint)
|
||||
iconWidth = a.getDimensionPixelSize(R.styleable.DrawableTintTextView_iabIconWidth, 0)
|
||||
iconHeight = a.getDimensionPixelSize(R.styleable.DrawableTintTextView_iabIconHeight, 0)
|
||||
}
|
||||
iconWidth = a.getDimensionPixelSize(R.styleable.DrawableTintTextView_iabIconWidth, 0)
|
||||
iconHeight = a.getDimensionPixelSize(R.styleable.DrawableTintTextView_iabIconHeight, 0)
|
||||
a.recycle()
|
||||
updateDrawableCompat()
|
||||
}
|
||||
|
@ -60,16 +61,19 @@ class DrawableTintTextView(
|
|||
}
|
||||
|
||||
private fun updateDrawableCompat() {
|
||||
if (Build.VERSION.SDK_INT >= 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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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<LabeledCount>()
|
||||
val replyCount = activity.replyCount
|
||||
|
|
|
@ -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<ParcelableMedia?>.type: Int
|
||||
|
|
Loading…
Reference in New Issue