diff --git a/app/build.gradle b/app/build.gradle index 7c254e0..65fde12 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -62,5 +62,5 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' - debugImplementation 'androidx.compose.ui:ui-tooling:1.6.1' + debugImplementation 'androidx.compose.ui:ui-tooling:1.6.2' } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 51c33a4..965a69c 100644 --- a/build.gradle +++ b/build.gradle @@ -6,13 +6,13 @@ buildscript { kotlin_version = '1.9.22' accompanist_version = '0.34.0' - coil_version = '2.5.0' + coil_version = '2.6.0' exoplayer_version = '2.19.1' } }// Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '8.2.2' apply false - id 'com.android.library' version '8.2.2' apply false + id 'com.android.application' version '8.3.0' apply false + id 'com.android.library' version '8.3.0' apply false id 'org.jetbrains.kotlin.android' version "$kotlin_version" apply false id "org.jlleitschuh.gradle.ktlint" version "11.6.0" } diff --git a/compose_image_picker/build.gradle b/compose_image_picker/build.gradle index ff86be2..56e953d 100644 --- a/compose_image_picker/build.gradle +++ b/compose_image_picker/build.gradle @@ -114,7 +114,7 @@ dependencies { implementation "io.coil-kt:coil-video:$coil_version" implementation "io.coil-kt:coil-gif:$coil_version" - def media3_version = "1.3.0-beta01" + def media3_version = '1.3.0-rc01' implementation "androidx.media3:media3-exoplayer:$media3_version" implementation "androidx.media3:media3-ui:$media3_version" diff --git a/compose_image_picker/src/main/java/com/huhx/picker/component/AssetImageItem.kt b/compose_image_picker/src/main/java/com/huhx/picker/component/AssetImageItem.kt index 9342b4f..9b4ea58 100644 --- a/compose_image_picker/src/main/java/com/huhx/picker/component/AssetImageItem.kt +++ b/compose_image_picker/src/main/java/com/huhx/picker/component/AssetImageItem.kt @@ -42,6 +42,7 @@ import com.huhx.picker.model.AssetResourceType @OptIn(ExperimentalFoundationApi::class) @Composable fun AssetImageItem( + modifier: Modifier = Modifier, urlString: String, onDelete: (() -> Unit)? = null, isSelected: Boolean, @@ -64,7 +65,8 @@ fun AssetImageItem( modifier = Modifier .fillMaxSize() .background(backgroundColor) - .alpha(alpha), + .alpha(alpha) + .then(modifier), ) { AsyncImage( model = ImageRequest.Builder(context) diff --git a/compose_image_picker/src/main/java/com/huhx/picker/view/AssetDisplayScreen.kt b/compose_image_picker/src/main/java/com/huhx/picker/view/AssetDisplayScreen.kt index 32fb666..f847a34 100644 --- a/compose_image_picker/src/main/java/com/huhx/picker/view/AssetDisplayScreen.kt +++ b/compose_image_picker/src/main/java/com/huhx/picker/view/AssetDisplayScreen.kt @@ -1,6 +1,7 @@ package com.huhx.picker.view import android.net.Uri +import android.widget.Toast import androidx.activity.compose.BackHandler import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts @@ -46,8 +47,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.FilterQuality import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -66,7 +69,7 @@ internal fun AssetDisplayScreen( onClose: (List) -> Unit, ) { BackHandler { - if (viewModel.selectedList.isNotEmpty()) { + if (viewModel.selectedList.isNotEmpty()) { viewModel.clear() } else { onClose(viewModel.selectedList) @@ -193,7 +196,22 @@ private fun AssetTab(tabs: List, pagerState: PagerState) { @Composable private fun AssetContent(viewModel: AssetViewModel, requestType: RequestType) { val assets = viewModel.getGroupedAssets(requestType) + val context = LocalContext.current val gridCount = LocalAssetConfig.current.gridCount + val maxAssets = LocalAssetConfig.current.maxAssets + val errorMessage = stringResource(R.string.message_selected_exceed, maxAssets) + + if (assets.isEmpty()) { + return Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Text( + text = "对应的资源为空", + textAlign = TextAlign.Center + ) + } + } LazyColumn { assets.forEach { (dateString, resources) -> @@ -215,7 +233,9 @@ private fun AssetContent(viewModel: AssetViewModel, requestType: RequestType) { if (allSelected) { viewModel.unSelectAll(resources) } else { - viewModel.selectAll(resources) + if (viewModel.selectAll(resources, maxAssets)) { + Toast.makeText(context, errorMessage, Toast.LENGTH_SHORT).show() + } } }) { Text( @@ -258,6 +278,9 @@ private fun AssetImage( onLongClick: (Boolean) -> Unit, ) { val selected = selectedList.any { it.id == assetInfo.id } + val context = LocalContext.current + val maxAssets = LocalAssetConfig.current.maxAssets + val errorMessage = stringResource(R.string.message_selected_exceed, maxAssets) Box( modifier = modifier.fillMaxSize(), @@ -270,7 +293,14 @@ private fun AssetImage( resourceType = assetInfo.resourceType, durationString = assetInfo.formatDuration(), navigateToPreview = navigateToPreview, - onLongClick = { onLongClick(!selected) } + onLongClick = { + val selectResult = !selected + if (!selectResult || selectedList.size < maxAssets) { + onLongClick(selectResult) + } else { + Toast.makeText(context, errorMessage, Toast.LENGTH_SHORT).show() + } + } ) AssetImageIndicator(assetInfo = assetInfo, selected = selected, assetSelected = selectedList) } diff --git a/compose_image_picker/src/main/java/com/huhx/picker/viewmodel/AssetViewModel.kt b/compose_image_picker/src/main/java/com/huhx/picker/viewmodel/AssetViewModel.kt index b518833..4d984e2 100644 --- a/compose_image_picker/src/main/java/com/huhx/picker/viewmodel/AssetViewModel.kt +++ b/compose_image_picker/src/main/java/com/huhx/picker/viewmodel/AssetViewModel.kt @@ -106,10 +106,11 @@ internal class AssetViewModel( selectedList -= resources.toSet() } - fun selectAll(resources: List) { + fun selectAll(resources: List, maxAssets: Int) : Boolean{ val selectedIds = selectedList.map { it.id } val newSelectedList = resources.filterNot { selectedIds.contains(it.id) } - selectedList += newSelectedList + selectedList += newSelectedList.subList(0, minOf(maxAssets - selectedIds.size, newSelectedList.size)) + return maxAssets - selectedIds.size < newSelectedList.size } } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index eb7e740..2457610 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Sat Jul 23 19:28:55 CST 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME