respect spoiler/sensitive settings in conversations (#2891)
* respect spoiler/sensitive settings in conversations * fix code formatting
This commit is contained in:
parent
a4727716c9
commit
f6a5510841
3 changed files with 40 additions and 12 deletions
|
@ -146,7 +146,11 @@ fun TimelineAccount.toEntity() =
|
|||
emojis = emojis ?: emptyList()
|
||||
)
|
||||
|
||||
fun Status.toEntity() =
|
||||
fun Status.toEntity(
|
||||
expanded: Boolean,
|
||||
contentShowing: Boolean,
|
||||
contentCollapsed: Boolean
|
||||
) =
|
||||
ConversationStatusEntity(
|
||||
id = id,
|
||||
url = url,
|
||||
|
@ -165,20 +169,30 @@ fun Status.toEntity() =
|
|||
attachments = attachments,
|
||||
mentions = mentions,
|
||||
tags = tags,
|
||||
showingHiddenContent = false,
|
||||
expanded = false,
|
||||
collapsed = true,
|
||||
showingHiddenContent = contentShowing,
|
||||
expanded = expanded,
|
||||
collapsed = contentCollapsed,
|
||||
muted = muted ?: false,
|
||||
poll = poll,
|
||||
language = language,
|
||||
)
|
||||
|
||||
fun Conversation.toEntity(accountId: Long, order: Int) =
|
||||
fun Conversation.toEntity(
|
||||
accountId: Long,
|
||||
order: Int,
|
||||
expanded: Boolean,
|
||||
contentShowing: Boolean,
|
||||
contentCollapsed: Boolean
|
||||
) =
|
||||
ConversationEntity(
|
||||
accountId = accountId,
|
||||
id = id,
|
||||
order = order,
|
||||
accounts = accounts.map { it.toEntity() },
|
||||
unread = unread,
|
||||
lastStatus = lastStatus!!.toEntity()
|
||||
lastStatus = lastStatus!!.toEntity(
|
||||
expanded = expanded,
|
||||
contentShowing = contentShowing,
|
||||
contentCollapsed = contentCollapsed
|
||||
)
|
||||
)
|
||||
|
|
|
@ -5,6 +5,7 @@ import androidx.paging.LoadType
|
|||
import androidx.paging.PagingState
|
||||
import androidx.paging.RemoteMediator
|
||||
import androidx.room.withTransaction
|
||||
import com.keylesspalace.tusky.db.AccountManager
|
||||
import com.keylesspalace.tusky.db.AppDatabase
|
||||
import com.keylesspalace.tusky.network.MastodonApi
|
||||
import com.keylesspalace.tusky.util.HttpHeaderLink
|
||||
|
@ -12,15 +13,17 @@ import retrofit2.HttpException
|
|||
|
||||
@OptIn(ExperimentalPagingApi::class)
|
||||
class ConversationsRemoteMediator(
|
||||
private val accountId: Long,
|
||||
private val api: MastodonApi,
|
||||
private val db: AppDatabase
|
||||
private val db: AppDatabase,
|
||||
accountManager: AccountManager,
|
||||
) : RemoteMediator<Int, ConversationEntity>() {
|
||||
|
||||
private var nextKey: String? = null
|
||||
|
||||
private var order: Int = 0
|
||||
|
||||
private val activeAccount = accountManager.activeAccount!!
|
||||
|
||||
override suspend fun load(
|
||||
loadType: LoadType,
|
||||
state: PagingState<Int, ConversationEntity>
|
||||
|
@ -46,7 +49,7 @@ class ConversationsRemoteMediator(
|
|||
db.withTransaction {
|
||||
|
||||
if (loadType == LoadType.REFRESH) {
|
||||
db.conversationDao().deleteForAccount(accountId)
|
||||
db.conversationDao().deleteForAccount(activeAccount.id)
|
||||
}
|
||||
|
||||
val linkHeader = conversationsResponse.headers()["Link"]
|
||||
|
@ -56,8 +59,19 @@ class ConversationsRemoteMediator(
|
|||
db.conversationDao().insert(
|
||||
conversations
|
||||
.filterNot { it.lastStatus == null }
|
||||
.map {
|
||||
it.toEntity(accountId, order++)
|
||||
.map { conversation ->
|
||||
|
||||
val expanded = activeAccount.alwaysOpenSpoiler
|
||||
val contentShowing = activeAccount.alwaysShowSensitiveMedia || !conversation.lastStatus!!.sensitive
|
||||
val contentCollapsed = true
|
||||
|
||||
conversation.toEntity(
|
||||
accountId = activeAccount.id,
|
||||
order = order++,
|
||||
expanded = expanded,
|
||||
contentShowing = contentShowing,
|
||||
contentCollapsed = contentCollapsed
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ class ConversationsViewModel @Inject constructor(
|
|||
@OptIn(ExperimentalPagingApi::class)
|
||||
val conversationFlow = Pager(
|
||||
config = PagingConfig(pageSize = 30),
|
||||
remoteMediator = ConversationsRemoteMediator(accountManager.activeAccount!!.id, api, database),
|
||||
remoteMediator = ConversationsRemoteMediator(api, database, accountManager),
|
||||
pagingSourceFactory = { database.conversationDao().conversationsForAccount(accountManager.activeAccount!!.id) }
|
||||
)
|
||||
.flow
|
||||
|
|
Loading…
Reference in a new issue