From e8140579e04e778ffda3209dd9ce991e0a4b15e8 Mon Sep 17 00:00:00 2001 From: AllenTom Date: Wed, 14 Aug 2024 00:04:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/aiosman/riderpro/ui/account/edit.kt | 4 ++- .../aiosman/riderpro/ui/composables/Image.kt | 26 +++++++++++++++++++ .../riderpro/ui/composables/RelPostCard.kt | 5 +++- .../riderpro/ui/imageviewer/imageviewer.kt | 7 +++-- .../riderpro/ui/index/tabs/moment/Moment.kt | 10 +++++-- .../riderpro/ui/index/tabs/profile/Profile.kt | 10 +++++-- .../com/aiosman/riderpro/ui/post/NewPost.kt | 4 ++- .../java/com/aiosman/riderpro/ui/post/Post.kt | 15 ++++++++--- .../java/com/aiosman/riderpro/utils/Utils.kt | 16 ++++++++++++ 9 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/com/aiosman/riderpro/ui/composables/Image.kt diff --git a/app/src/main/java/com/aiosman/riderpro/ui/account/edit.kt b/app/src/main/java/com/aiosman/riderpro/ui/account/edit.kt index fdc5311..9456e2e 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/account/edit.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/account/edit.kt @@ -40,6 +40,7 @@ import com.aiosman.riderpro.data.TestAccountServiceImpl import com.aiosman.riderpro.data.TestUserServiceImpl import com.aiosman.riderpro.data.UploadImage import com.aiosman.riderpro.data.UserService +import com.aiosman.riderpro.ui.composables.CustomAsyncImage import com.aiosman.riderpro.ui.modifiers.noRippleClickable import com.aiosman.riderpro.ui.post.NewPostViewModel.uriToFile import kotlinx.coroutines.launch @@ -144,7 +145,8 @@ fun AccountEditScreen() { .padding(padding).padding(horizontal = 24.dp), horizontalAlignment = Alignment.CenterHorizontally ) { - AsyncImage( + CustomAsyncImage( + context, if (imageUrl != null) { imageUrl.toString() } else { diff --git a/app/src/main/java/com/aiosman/riderpro/ui/composables/Image.kt b/app/src/main/java/com/aiosman/riderpro/ui/composables/Image.kt new file mode 100644 index 0000000..c00d73a --- /dev/null +++ b/app/src/main/java/com/aiosman/riderpro/ui/composables/Image.kt @@ -0,0 +1,26 @@ +package com.aiosman.riderpro.ui.composables + +import android.content.Context +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import coil.compose.AsyncImage +import com.aiosman.riderpro.utils.Utils.getImageLoader + +@Composable +fun CustomAsyncImage( + context: Context, + imageUrl: String, + contentDescription: String?, + modifier: Modifier = Modifier, + contentScale: ContentScale = ContentScale.Crop +) { + val imageLoader = getImageLoader(context) + AsyncImage( + model = imageUrl, + contentDescription = contentDescription, + modifier = modifier, + contentScale = contentScale, + imageLoader = imageLoader + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/aiosman/riderpro/ui/composables/RelPostCard.kt b/app/src/main/java/com/aiosman/riderpro/ui/composables/RelPostCard.kt index 7f7a6f2..81054da 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/composables/RelPostCard.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/composables/RelPostCard.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import com.aiosman.riderpro.model.MomentEntity @@ -18,6 +19,7 @@ fun RelPostCard( modifier: Modifier = Modifier, ) { val image = momentEntity.images.firstOrNull() + val context = LocalContext.current Column( modifier = modifier ) { @@ -26,7 +28,8 @@ fun RelPostCard( modifier=Modifier.padding(horizontal = 16.dp, vertical = 8.dp) ) { image?.let { - AsyncImage( + CustomAsyncImage( + context, image, contentDescription = null, modifier = Modifier.size(100.dp), diff --git a/app/src/main/java/com/aiosman/riderpro/ui/imageviewer/imageviewer.kt b/app/src/main/java/com/aiosman/riderpro/ui/imageviewer/imageviewer.kt index c501221..030850a 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/imageviewer/imageviewer.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/imageviewer/imageviewer.kt @@ -10,10 +10,12 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext import coil.compose.AsyncImage import com.aiosman.riderpro.LocalAnimatedContentScope import com.aiosman.riderpro.LocalNavController import com.aiosman.riderpro.LocalSharedTransitionScope +import com.aiosman.riderpro.ui.composables.CustomAsyncImage import com.aiosman.riderpro.ui.composables.StatusBarMaskLayout import com.aiosman.riderpro.ui.imageviewer.ImageViewerViewModel import com.google.accompanist.systemuicontroller.rememberSystemUiController @@ -31,7 +33,7 @@ fun ImageViewer() { val navController = LocalNavController.current val sharedTransitionScope = LocalSharedTransitionScope.current val animatedVisibilityScope = LocalAnimatedContentScope.current - + val context = LocalContext.current LaunchedEffect(Unit) { systemUiController.setStatusBarColor(Color.Black) systemUiController.setNavigationBarColor(Color.Black) @@ -50,7 +52,8 @@ fun ImageViewer() { ) { page -> val zoomState = rememberZoomState() with(sharedTransitionScope) { - AsyncImage( + CustomAsyncImage( + context, images[page], contentDescription = null, modifier = Modifier.sharedElement( diff --git a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/moment/Moment.kt b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/moment/Moment.kt index c19db96..b485865 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/moment/Moment.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/moment/Moment.kt @@ -44,6 +44,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight @@ -63,6 +64,7 @@ import com.aiosman.riderpro.ui.comment.CommentModalContent import com.aiosman.riderpro.ui.composables.AnimatedCounter import com.aiosman.riderpro.ui.composables.AnimatedFavouriteIcon import com.aiosman.riderpro.ui.composables.AnimatedLikeIcon +import com.aiosman.riderpro.ui.composables.CustomAsyncImage import com.aiosman.riderpro.ui.composables.RelPostCard import com.aiosman.riderpro.ui.modifiers.noRippleClickable import com.aiosman.riderpro.ui.post.NewPostViewModel @@ -265,12 +267,14 @@ fun MomentPostTime(time: String) { @Composable fun MomentTopRowGroup(momentEntity: MomentEntity) { val navController = LocalNavController.current + val context = LocalContext.current Row( modifier = Modifier .height(40.dp) .padding(top = 0.dp, bottom = 0.dp, start = 24.dp, end = 24.dp) ) { - AsyncImage( + CustomAsyncImage( + context, momentEntity.avatar, contentDescription = "", modifier = Modifier @@ -320,6 +324,7 @@ fun MomentContentGroup( val displayImageUrl = momentEntity.images.firstOrNull() val sharedTransitionScope = LocalSharedTransitionScope.current val animatedVisibilityScope = LocalAnimatedContentScope.current + val context = LocalContext.current Text( text = "${momentEntity.momentTextContent}", modifier = Modifier @@ -335,7 +340,8 @@ fun MomentContentGroup( } else { displayImageUrl?.let { with(sharedTransitionScope) { - AsyncImage( + CustomAsyncImage( + context, it, modifier = Modifier .sharedElement( diff --git a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/Profile.kt b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/Profile.kt index a147777..a8da066 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/Profile.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/Profile.kt @@ -38,6 +38,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight @@ -54,6 +55,7 @@ import com.aiosman.riderpro.R import com.aiosman.riderpro.data.AccountProfileEntity import com.aiosman.riderpro.model.MomentEntity import com.aiosman.riderpro.ui.NavigationRoute +import com.aiosman.riderpro.ui.composables.CustomAsyncImage import com.aiosman.riderpro.ui.modifiers.noRippleClickable import kotlinx.coroutines.launch @@ -246,6 +248,7 @@ fun UserInformationFollowers(modifier: Modifier, accountProfileEntity: AccountPr @Composable fun UserInformationBasic(modifier: Modifier, accountProfileEntity: AccountProfileEntity) { + val context = LocalContext.current Column( horizontalAlignment = Alignment.CenterHorizontally ) { @@ -257,7 +260,8 @@ fun UserInformationBasic(modifier: Modifier, accountProfileEntity: AccountProfil modifier = Modifier.fillMaxSize(), painter = painterResource(id = R.drawable.avatar_bold), contentDescription = "" ) - AsyncImage( + CustomAsyncImage( + context, accountProfileEntity.avatar, modifier = Modifier .size(width = 88.dp, height = 88.dp) @@ -571,8 +575,10 @@ fun MomentCardPicture(imageUrl: String, momentId: Int) { val navController = LocalNavController.current val sharedTransitionScope = LocalSharedTransitionScope.current val animatedVisibilityScope = LocalAnimatedContentScope.current + val context = LocalContext.current with(sharedTransitionScope) { - AsyncImage( + CustomAsyncImage( + context, imageUrl, modifier = Modifier .sharedElement( diff --git a/app/src/main/java/com/aiosman/riderpro/ui/post/NewPost.kt b/app/src/main/java/com/aiosman/riderpro/ui/post/NewPost.kt index 8a5f8c8..a7ad4f8 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/post/NewPost.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/post/NewPost.kt @@ -51,6 +51,7 @@ import androidx.lifecycle.viewModelScope import coil.compose.AsyncImage import com.aiosman.riderpro.LocalNavController import com.aiosman.riderpro.R +import com.aiosman.riderpro.ui.composables.CustomAsyncImage import com.aiosman.riderpro.ui.composables.RelPostCard import com.aiosman.riderpro.ui.composables.StatusBarMaskLayout import com.aiosman.riderpro.ui.modifiers.noRippleClickable @@ -199,7 +200,8 @@ fun AddImageGrid() { horizontalArrangement = Arrangement.spacedBy(8.dp) ) { model.imageUriList.forEach { - AsyncImage( + CustomAsyncImage( + context, it, contentDescription = "Image", modifier = Modifier diff --git a/app/src/main/java/com/aiosman/riderpro/ui/post/Post.kt b/app/src/main/java/com/aiosman/riderpro/ui/post/Post.kt index f08fe59..0ef5dbf 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/post/Post.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/post/Post.kt @@ -53,6 +53,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight @@ -90,6 +91,7 @@ import com.aiosman.riderpro.model.MomentEntity import com.aiosman.riderpro.ui.NavigationRoute import com.aiosman.riderpro.ui.composables.StatusBarMaskLayout import com.aiosman.riderpro.ui.composables.BottomNavigationPlaceholder +import com.aiosman.riderpro.ui.composables.CustomAsyncImage import com.aiosman.riderpro.ui.composables.EditCommentBottomModal import com.aiosman.riderpro.ui.imageviewer.ImageViewerViewModel import com.aiosman.riderpro.ui.index.tabs.moment.MomentViewModel @@ -353,6 +355,7 @@ fun Header( onFollowClick: () -> Unit ) { val navController = LocalNavController.current + val context = LocalContext.current Row( modifier = Modifier .fillMaxWidth() @@ -370,7 +373,8 @@ fun Header( ) Spacer(modifier = Modifier.width(8.dp)) avatar?.let { - AsyncImage( + CustomAsyncImage( + context, it, contentDescription = "Profile Picture", modifier = Modifier @@ -428,6 +432,8 @@ fun PostImageView( val navController = LocalNavController.current val sharedTransitionScope = LocalSharedTransitionScope.current val animatedVisibilityScope = LocalAnimatedContentScope.current + val context = LocalContext.current + Column { HorizontalPager( state = pagerState, @@ -437,7 +443,8 @@ fun PostImageView( ) { page -> val image = images[page] with(sharedTransitionScope) { - AsyncImage( + CustomAsyncImage( + context, image, contentDescription = "Image", contentScale = ContentScale.Fit, @@ -547,9 +554,11 @@ fun CommentsSection( @Composable fun CommentItem(commentEntity: CommentEntity, onLike: () -> Unit = {}) { + val context = LocalContext.current Column { Row(modifier = Modifier.padding(vertical = 8.dp)) { - AsyncImage( + CustomAsyncImage( + context, commentEntity.avatar, contentDescription = "Comment Profile Picture", modifier = Modifier diff --git a/app/src/main/java/com/aiosman/riderpro/utils/Utils.kt b/app/src/main/java/com/aiosman/riderpro/utils/Utils.kt index d10f672..150c965 100644 --- a/app/src/main/java/com/aiosman/riderpro/utils/Utils.kt +++ b/app/src/main/java/com/aiosman/riderpro/utils/Utils.kt @@ -1,5 +1,10 @@ package com.aiosman.riderpro.utils +import android.content.Context +import coil.ImageLoader +import coil.request.CachePolicy +import com.aiosman.riderpro.data.api.getUnsafeOkHttpClient + object Utils { fun generateRandomString(length: Int): String { val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9') @@ -7,4 +12,15 @@ object Utils { .map { allowedChars.random() } .joinToString("") } + fun getImageLoader(context: Context): ImageLoader { + val okHttpClient = getUnsafeOkHttpClient() + return ImageLoader.Builder(context) + .okHttpClient(okHttpClient) + .diskCachePolicy(CachePolicy.ENABLED) + .memoryCachePolicy(CachePolicy.ENABLED) + .components { + + } + .build() + } } \ No newline at end of file