From 40915c032525d7af6a00585a85a5b78bdac97381 Mon Sep 17 00:00:00 2001 From: HuanCheng65 <22636177+HuanCheng65@users.noreply.github.com> Date: Sat, 30 Sep 2023 18:56:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BC=A9=E7=95=A5=E5=9B=BE=E9=95=BF?= =?UTF-8?q?=E6=8C=89=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tieba/post/ui/utils/PhotoViewUtils.kt | 6 +- .../tieba/post/ui/widgets/compose/Images.kt | 68 +++++++++++++------ .../tieba/post/ui/widgets/compose/Menu.kt | 16 ++--- app/src/main/protos/PhotoViewData.proto | 1 + 4 files changed, 56 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/utils/PhotoViewUtils.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/utils/PhotoViewUtils.kt index 0ff6722d..064a5397 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/utils/PhotoViewUtils.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/utils/PhotoViewUtils.kt @@ -30,7 +30,8 @@ fun getPhotoViewData( objType = "pb", picId = picId, picIndex = 1, - seeLz = seeLz + seeLz = seeLz, + originUrl = originUrl, ), picItems = listOf( PicItem( @@ -84,7 +85,8 @@ fun getPhotoViewData( seeLz = false, objType = "index", picId = ImageUtil.getPicId(media.originPic), - picIndex = index + 1 + picIndex = index + 1, + originUrl = media.originPic ), picItems = medias.mapIndexed { mediaIndex, mediaItem -> PicItem( diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/Images.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/Images.kt index 4161d070..340f3347 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/Images.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/Images.kt @@ -2,8 +2,13 @@ package com.huanchengfly.tieba.post.ui.widgets.compose import android.content.Context import android.os.Parcelable -import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.width +import androidx.compose.material.DropdownMenuItem +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -15,9 +20,11 @@ import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ColorMatrix import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import com.github.panpf.sketch.compose.AsyncImage import com.github.panpf.sketch.request.Depth import com.github.panpf.sketch.request.DisplayRequest +import com.huanchengfly.tieba.post.R import com.huanchengfly.tieba.post.arch.ImmutableHolder import com.huanchengfly.tieba.post.goToActivity import com.huanchengfly.tieba.post.models.protos.PhotoViewData @@ -50,20 +57,8 @@ fun NetworkImage( ) { val context = LocalContext.current var shouldLoad by remember { mutableStateOf(shouldLoadImage(context, skipNetworkCheck)) } - val clickableModifier = if (photoViewData != null || !shouldLoad) { - Modifier.clickable( - indication = null, - interactionSource = remember { MutableInteractionSource() } - ) { - if (!shouldLoad) { - shouldLoad = true - } else if (photoViewData != null) { - context.goToActivity { - putExtra(EXTRA_PHOTO_VIEW_DATA, photoViewData.get() as Parcelable) - } - } - } - } else Modifier + val enableClick = remember(photoViewData, shouldLoad) { photoViewData != null || !shouldLoad } + val request = remember(imageUri, shouldLoad) { DisplayRequest(context, imageUri) { placeholder(ImageUtil.getPlaceHolder(context, 0)) @@ -89,13 +84,42 @@ fun NetworkImage( ) } else null - AsyncImage( - request = request, - contentDescription = contentDescription, - modifier = modifier.then(clickableModifier), - contentScale = contentScale, - colorFilter = colorFilter, - ) + LongClickMenu( + enabled = enableClick, + indication = null, + interactionSource = remember { MutableInteractionSource() }, + onClick = { + if (!shouldLoad) { + shouldLoad = true + } else if (photoViewData != null) { + context.goToActivity { + putExtra(EXTRA_PHOTO_VIEW_DATA, photoViewData.get() as Parcelable) + } + } + }, + menuContent = { + DropdownMenuItem( + onClick = { + ImageUtil.download( + context, + photoViewData?.get { this.data_?.originUrl } ?: imageUri) + } + ) { + Text(text = stringResource(id = R.string.title_save_image)) + } + }, + modifier = modifier + .width(IntrinsicSize.Min) + .height(IntrinsicSize.Min), + ) { + AsyncImage( + request = request, + modifier = Modifier.fillMaxSize(), + contentDescription = contentDescription, + contentScale = contentScale, + colorFilter = colorFilter, + ) + } } @Composable diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/Menu.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/Menu.kt index fccbaa5a..65a2c3ea 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/Menu.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/Menu.kt @@ -1,6 +1,5 @@ package com.huanchengfly.tieba.post.ui.widgets.compose -import android.util.Log import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Indication import androidx.compose.foundation.LocalIndication @@ -119,7 +118,7 @@ fun LongClickMenu( indication: Indication? = LocalIndication.current, content: @Composable () -> Unit, ) { - LaunchedEffect(key1 = null) { + LaunchedEffect(Unit) { launch { interactionSource.interactions .filterIsInstance() @@ -127,16 +126,9 @@ fun LongClickMenu( menuState.offset = it.pressPosition } } - launch { - interactionSource.interactions - .collect { - Log.i("Indication", "$it") - } - } } Box( - modifier = Modifier - .clip(shape) + modifier = modifier .combinedClickable( interactionSource = interactionSource, indication = indication, @@ -161,7 +153,9 @@ fun LongClickMenu( DropdownMenu( expanded = menuState.expanded, onDismissRequest = { menuState.expanded = false }, - modifier = modifier.background(color = ExtendedTheme.colors.menuBackground) + modifier = Modifier + .clip(shape) + .background(color = ExtendedTheme.colors.menuBackground) ) { ProvideContentColor(color = ExtendedTheme.colors.text) { menuContent() diff --git a/app/src/main/protos/PhotoViewData.proto b/app/src/main/protos/PhotoViewData.proto index a95bb3e5..9de46307 100644 --- a/app/src/main/protos/PhotoViewData.proto +++ b/app/src/main/protos/PhotoViewData.proto @@ -17,6 +17,7 @@ message LoadPicPageData { uint32 picIndex = 6; int64 postId = 7; int64 threadId = 8; + optional string originUrl = 9; } message PicItem {