Fix extra clicks on media tab (#3930)

If:

1. You're viewing an account's media tab
2. Some of the media was marked sensitivei
3. The `alwaysShowSensitiveMedia` setting was `true`

tapping on the image (once) would do nothing visible, because it was
treated as the "reveal sensitive media" tap. You had to tap on it a
second time to open it.

Fix this, by passing the preference value through to the relevant code.

---------

Co-authored-by: Tiga! <maxiinne@proton.me>
This commit is contained in:
Nik Clayton 2023-08-07 19:30:56 +02:00 committed by GitHub
parent 498c7646b0
commit 791092ef13
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 21 additions and 12 deletions

View File

@ -82,13 +82,10 @@ class AccountMediaFragment :
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED)
val alwaysShowSensitiveMedia = accountManager.activeAccount!!.alwaysShowSensitiveMedia
val preferences = PreferenceManager.getDefaultSharedPreferences(view.context) val preferences = PreferenceManager.getDefaultSharedPreferences(view.context)
val useBlurhash = preferences.getBoolean(PrefKeys.USE_BLURHASH, true) val useBlurhash = preferences.getBoolean(PrefKeys.USE_BLURHASH, true)
adapter = AccountMediaGridAdapter( adapter = AccountMediaGridAdapter(
alwaysShowSensitiveMedia = alwaysShowSensitiveMedia,
useBlurhash = useBlurhash, useBlurhash = useBlurhash,
context = view.context, context = view.context,
onAttachmentClickListener = ::onAttachmentClick onAttachmentClickListener = ::onAttachmentClick

View File

@ -24,7 +24,6 @@ import com.keylesspalace.tusky.viewdata.AttachmentViewData
import java.util.Random import java.util.Random
class AccountMediaGridAdapter( class AccountMediaGridAdapter(
private val alwaysShowSensitiveMedia: Boolean,
private val useBlurhash: Boolean, private val useBlurhash: Boolean,
context: Context, context: Context,
private val onAttachmentClickListener: (AttachmentViewData, View) -> Unit private val onAttachmentClickListener: (AttachmentViewData, View) -> Unit
@ -80,7 +79,7 @@ class AccountMediaGridAdapter(
.into(imageView) .into(imageView)
imageView.contentDescription = item.attachment.getFormattedDescription(context) imageView.contentDescription = item.attachment.getFormattedDescription(context)
} else if (item.sensitive && !item.isRevealed && !alwaysShowSensitiveMedia) { } else if (item.sensitive && !item.isRevealed) {
overlay.show() overlay.show()
overlay.setImageDrawable(mediaHiddenDrawable) overlay.setImageDrawable(mediaHiddenDrawable)

View File

@ -20,6 +20,7 @@ import androidx.paging.LoadType
import androidx.paging.PagingState import androidx.paging.PagingState
import androidx.paging.RemoteMediator import androidx.paging.RemoteMediator
import com.keylesspalace.tusky.components.timeline.util.ifExpected import com.keylesspalace.tusky.components.timeline.util.ifExpected
import com.keylesspalace.tusky.db.AccountEntity
import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.viewdata.AttachmentViewData import com.keylesspalace.tusky.viewdata.AttachmentViewData
import retrofit2.HttpException import retrofit2.HttpException
@ -27,9 +28,9 @@ import retrofit2.HttpException
@OptIn(ExperimentalPagingApi::class) @OptIn(ExperimentalPagingApi::class)
class AccountMediaRemoteMediator( class AccountMediaRemoteMediator(
private val api: MastodonApi, private val api: MastodonApi,
private val activeAccount: AccountEntity,
private val viewModel: AccountMediaViewModel private val viewModel: AccountMediaViewModel
) : RemoteMediator<String, AttachmentViewData>() { ) : RemoteMediator<String, AttachmentViewData>() {
override suspend fun load( override suspend fun load(
loadType: LoadType, loadType: LoadType,
state: PagingState<String, AttachmentViewData> state: PagingState<String, AttachmentViewData>
@ -58,7 +59,7 @@ class AccountMediaRemoteMediator(
} }
val attachments = statuses.flatMap { status -> val attachments = statuses.flatMap { status ->
AttachmentViewData.list(status) AttachmentViewData.list(status, activeAccount.alwaysShowSensitiveMedia ?: false)
} }
if (loadType == LoadType.REFRESH) { if (loadType == LoadType.REFRESH) {

View File

@ -21,11 +21,13 @@ import androidx.paging.ExperimentalPagingApi
import androidx.paging.Pager import androidx.paging.Pager
import androidx.paging.PagingConfig import androidx.paging.PagingConfig
import androidx.paging.cachedIn import androidx.paging.cachedIn
import com.keylesspalace.tusky.db.AccountManager
import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.viewdata.AttachmentViewData import com.keylesspalace.tusky.viewdata.AttachmentViewData
import javax.inject.Inject import javax.inject.Inject
class AccountMediaViewModel @Inject constructor( class AccountMediaViewModel @Inject constructor(
private val accountManager: AccountManager,
api: MastodonApi api: MastodonApi
) : ViewModel() { ) : ViewModel() {
@ -35,6 +37,8 @@ class AccountMediaViewModel @Inject constructor(
var currentSource: AccountMediaPagingSource? = null var currentSource: AccountMediaPagingSource? = null
val activeAccount = accountManager.activeAccount!!
@OptIn(ExperimentalPagingApi::class) @OptIn(ExperimentalPagingApi::class)
val media = Pager( val media = Pager(
config = PagingConfig( config = PagingConfig(
@ -48,7 +52,7 @@ class AccountMediaViewModel @Inject constructor(
currentSource = source currentSource = source
} }
}, },
remoteMediator = AccountMediaRemoteMediator(api, this) remoteMediator = AccountMediaRemoteMediator(api, activeAccount, this)
).flow ).flow
.cachedIn(viewModelScope) .cachedIn(viewModelScope)

View File

@ -518,7 +518,11 @@ class NotificationsFragment :
override fun onViewMedia(position: Int, attachmentIndex: Int, view: View?) { override fun onViewMedia(position: Int, attachmentIndex: Int, view: View?) {
val status = adapter.peek(position)?.statusViewData?.status ?: return val status = adapter.peek(position)?.statusViewData?.status ?: return
super.viewMedia(attachmentIndex, list(status), view) super.viewMedia(
attachmentIndex,
list(status, viewModel.statusDisplayOptions.value.showSensitiveMedia),
view
)
} }
override fun onViewThread(position: Int) { override fun onViewThread(position: Int) {

View File

@ -336,7 +336,11 @@ class ViewThreadFragment :
override fun onViewMedia(position: Int, attachmentIndex: Int, view: View?) { override fun onViewMedia(position: Int, attachmentIndex: Int, view: View?) {
val status = adapter.currentList[position].status val status = adapter.currentList[position].status
super.viewMedia(attachmentIndex, list(status), view) super.viewMedia(
attachmentIndex,
list(status, alwaysShowSensitiveMedia),
view
)
} }
override fun onViewThread(position: Int) { override fun onViewThread(position: Int) {

View File

@ -35,7 +35,7 @@ data class AttachmentViewData(
companion object { companion object {
@JvmStatic @JvmStatic
fun list(status: Status): List<AttachmentViewData> { fun list(status: Status, alwaysShowSensitiveMedia: Boolean = false): List<AttachmentViewData> {
val actionable = status.actionableStatus val actionable = status.actionableStatus
return actionable.attachments.map { attachment -> return actionable.attachments.map { attachment ->
AttachmentViewData( AttachmentViewData(
@ -43,7 +43,7 @@ data class AttachmentViewData(
statusId = actionable.id, statusId = actionable.id,
statusUrl = actionable.url!!, statusUrl = actionable.url!!,
sensitive = actionable.sensitive, sensitive = actionable.sensitive,
isRevealed = !actionable.sensitive isRevealed = alwaysShowSensitiveMedia || !actionable.sensitive
) )
} }
} }