mirror of
https://github.com/oxen-io/session-android.git
synced 2023-12-14 02:53:01 +01:00
Add image click listener
This commit is contained in:
parent
d719660030
commit
6890f5c448
|
@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.conversation.v2
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||||
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
|
@ -51,12 +52,14 @@ import network.loki.messenger.R
|
||||||
import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment
|
import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment
|
||||||
import org.session.libsession.utilities.Util
|
import org.session.libsession.utilities.Util
|
||||||
import org.session.libsession.utilities.recipients.Recipient
|
import org.session.libsession.utilities.recipients.Recipient
|
||||||
|
import org.thoughtcrime.securesms.MediaPreviewActivity
|
||||||
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
|
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
|
||||||
import org.thoughtcrime.securesms.components.ProfilePictureView
|
import org.thoughtcrime.securesms.components.ProfilePictureView
|
||||||
import org.thoughtcrime.securesms.database.AttachmentDatabase
|
import org.thoughtcrime.securesms.database.AttachmentDatabase
|
||||||
import org.thoughtcrime.securesms.database.Storage
|
import org.thoughtcrime.securesms.database.Storage
|
||||||
import org.thoughtcrime.securesms.database.model.MessageRecord
|
import org.thoughtcrime.securesms.database.model.MessageRecord
|
||||||
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
|
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.dependencies.DatabaseComponent
|
import org.thoughtcrime.securesms.dependencies.DatabaseComponent
|
||||||
import org.thoughtcrime.securesms.mms.Slide
|
import org.thoughtcrime.securesms.mms.Slide
|
||||||
import org.thoughtcrime.securesms.ui.AppTheme
|
import org.thoughtcrime.securesms.ui.AppTheme
|
||||||
|
@ -69,6 +72,7 @@ import org.thoughtcrime.securesms.ui.ItemButton
|
||||||
import org.thoughtcrime.securesms.ui.SessionHorizontalPagerIndicator
|
import org.thoughtcrime.securesms.ui.SessionHorizontalPagerIndicator
|
||||||
import org.thoughtcrime.securesms.ui.colorDestructive
|
import org.thoughtcrime.securesms.ui.colorDestructive
|
||||||
import org.thoughtcrime.securesms.ui.destructiveButtonColors
|
import org.thoughtcrime.securesms.ui.destructiveButtonColors
|
||||||
|
import org.thoughtcrime.securesms.util.ActivityDispatcher
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
@ -106,6 +110,7 @@ class MessageDetailActivity : PassphraseRequiredActionBarActivity() {
|
||||||
|
|
||||||
_details.value = value?.run {
|
_details.value = value?.run {
|
||||||
MessageDetails(
|
MessageDetails(
|
||||||
|
mmsRecord = mmsRecord,
|
||||||
attachments = slides.map { slide ->
|
attachments = slides.map { slide ->
|
||||||
val duration = slide.takeIf { it.hasAudio() }
|
val duration = slide.takeIf { it.hasAudio() }
|
||||||
?.let { it.asAttachment() as? DatabaseAttachment }
|
?.let { it.asAttachment() as? DatabaseAttachment }
|
||||||
|
@ -190,7 +195,11 @@ class MessageDetailActivity : PassphraseRequiredActionBarActivity() {
|
||||||
details,
|
details,
|
||||||
onReply = { setResultAndFinish(ON_REPLY) },
|
onReply = { setResultAndFinish(ON_REPLY) },
|
||||||
onResend = { setResultAndFinish(ON_RESEND) },
|
onResend = { setResultAndFinish(ON_RESEND) },
|
||||||
onDelete = { setResultAndFinish(ON_DELETE) }
|
onDelete = { setResultAndFinish(ON_DELETE) },
|
||||||
|
onClickImage = { slide ->
|
||||||
|
MediaPreviewActivity.getPreviewIntent(this, slide, details.mmsRecord, details.sender)
|
||||||
|
.let(::startActivity)
|
||||||
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,6 +215,8 @@ class MessageDetailActivity : PassphraseRequiredActionBarActivity() {
|
||||||
|
|
||||||
data class MessageDetails(
|
data class MessageDetails(
|
||||||
val attachments: List<Attachment> = emptyList(),
|
val attachments: List<Attachment> = emptyList(),
|
||||||
|
val mmsRecord: MmsMessageRecord? = null,
|
||||||
|
|
||||||
val sent: TitledText? = null,
|
val sent: TitledText? = null,
|
||||||
val received: TitledText? = null,
|
val received: TitledText? = null,
|
||||||
val error: TitledText? = null,
|
val error: TitledText? = null,
|
||||||
|
@ -238,6 +249,7 @@ class MessageDetailActivity : PassphraseRequiredActionBarActivity() {
|
||||||
onReply: () -> Unit = {},
|
onReply: () -> Unit = {},
|
||||||
onResend: () -> Unit = {},
|
onResend: () -> Unit = {},
|
||||||
onDelete: () -> Unit = {},
|
onDelete: () -> Unit = {},
|
||||||
|
onClickImage: (Slide) -> Unit = {},
|
||||||
) {
|
) {
|
||||||
messageDetails.apply {
|
messageDetails.apply {
|
||||||
AppTheme {
|
AppTheme {
|
||||||
|
@ -245,7 +257,7 @@ class MessageDetailActivity : PassphraseRequiredActionBarActivity() {
|
||||||
modifier = Modifier.verticalScroll(rememberScrollState()),
|
modifier = Modifier.verticalScroll(rememberScrollState()),
|
||||||
verticalArrangement = Arrangement.spacedBy(16.dp)
|
verticalArrangement = Arrangement.spacedBy(16.dp)
|
||||||
) {
|
) {
|
||||||
Attachments(attachments)
|
Attachments(attachments) { onClickImage(it) }
|
||||||
if (sent != null || received != null || senderInfo != null) CellWithPaddingAndMargin {
|
if (sent != null || received != null || senderInfo != null) CellWithPaddingAndMargin {
|
||||||
Column(verticalArrangement = Arrangement.spacedBy(16.dp)) {
|
Column(verticalArrangement = Arrangement.spacedBy(16.dp)) {
|
||||||
sent?.let { titledText(it) }
|
sent?.let { titledText(it) }
|
||||||
|
@ -335,10 +347,10 @@ class MessageDetailActivity : PassphraseRequiredActionBarActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun Attachments(attachments: List<Attachment>) {
|
fun Attachments(attachments: List<Attachment>, onClick: (Slide) -> Unit) {
|
||||||
val slide = attachments.firstOrNull()?.slide ?: return
|
val slide = attachments.firstOrNull()?.slide ?: return
|
||||||
when {
|
when {
|
||||||
slide.hasImage() -> ImageAttachments(attachments)
|
slide.hasImage() -> ImageAttachments(attachments) { onClick(it) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,7 +359,7 @@ class MessageDetailActivity : PassphraseRequiredActionBarActivity() {
|
||||||
ExperimentalGlideComposeApi::class,
|
ExperimentalGlideComposeApi::class,
|
||||||
)
|
)
|
||||||
@Composable
|
@Composable
|
||||||
fun ImageAttachments(attachments: List<Attachment>) {
|
fun ImageAttachments(attachments: List<Attachment>, onClick: (Slide) -> Unit) {
|
||||||
val imageAttachments = attachments.filter { it.slide.hasImage() }
|
val imageAttachments = attachments.filter { it.slide.hasImage() }
|
||||||
val pagerState = rememberPagerState { imageAttachments.size }
|
val pagerState = rememberPagerState { imageAttachments.size }
|
||||||
|
|
||||||
|
@ -360,10 +372,13 @@ class MessageDetailActivity : PassphraseRequiredActionBarActivity() {
|
||||||
Box(modifier = Modifier.weight(1f)) {
|
Box(modifier = Modifier.weight(1f)) {
|
||||||
CellNoMargin {
|
CellNoMargin {
|
||||||
HorizontalPager(state = pagerState) { i ->
|
HorizontalPager(state = pagerState) { i ->
|
||||||
imageAttachments[i].slide.apply {
|
val slide = imageAttachments[i].slide
|
||||||
|
slide.apply {
|
||||||
GlideImage(
|
GlideImage(
|
||||||
contentScale = ContentScale.Crop,
|
contentScale = ContentScale.Crop,
|
||||||
modifier = Modifier.aspectRatio(1f),
|
modifier = Modifier
|
||||||
|
.aspectRatio(1f)
|
||||||
|
.clickable { onClick(slide) },
|
||||||
model = uri,
|
model = uri,
|
||||||
contentDescription = fileName.orNull() ?: "image"
|
contentDescription = fileName.orNull() ?: "image"
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue