Skip to content

Commit 026efe0

Browse files
committed
feat: add group assets features
1 parent daa0bac commit 026efe0

File tree

2 files changed

+85
-18
lines changed

2 files changed

+85
-18
lines changed

compose_image_picker/src/main/java/com/huhx/picker/view/AssetDisplayScreen.kt

Lines changed: 53 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ import androidx.compose.foundation.layout.PaddingValues
1313
import androidx.compose.foundation.layout.Row
1414
import androidx.compose.foundation.layout.fillMaxSize
1515
import androidx.compose.foundation.layout.fillMaxWidth
16+
import androidx.compose.foundation.layout.heightIn
1617
import androidx.compose.foundation.layout.padding
1718
import androidx.compose.foundation.layout.statusBarsPadding
19+
import androidx.compose.foundation.lazy.LazyColumn
1820
import androidx.compose.foundation.lazy.grid.GridCells
1921
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
2022
import androidx.compose.foundation.lazy.grid.itemsIndexed
@@ -45,6 +47,7 @@ import androidx.compose.ui.Alignment
4547
import androidx.compose.ui.Modifier
4648
import androidx.compose.ui.graphics.Color
4749
import androidx.compose.ui.res.stringResource
50+
import androidx.compose.ui.text.font.FontWeight
4851
import androidx.compose.ui.unit.dp
4952
import androidx.compose.ui.unit.sp
5053
import com.huhx.picker.R
@@ -87,16 +90,16 @@ internal fun AssetDisplayScreen(
8790

8891
Column {
8992
AssetTab(tabs = tabs, pagerState = pagerState)
90-
HorizontalPager(state = pagerState, userScrollEnabled = true) { page ->
93+
HorizontalPager(state = pagerState, userScrollEnabled = false) { page ->
9194
tabs[page].screen(viewModel)
9295
}
9396
}
9497
}
9598
}
9699
}
97100

98-
@OptIn(ExperimentalMaterial3Api::class)
99101
@Composable
102+
@OptIn(ExperimentalMaterial3Api::class)
100103
private fun DisplayTopAppBar(
101104
directory: String,
102105
selectedList: List<AssetInfo>,
@@ -186,24 +189,56 @@ private fun AssetTab(tabs: List<TabItem>, pagerState: PagerState) {
186189

187190
@Composable
188191
private fun AssetContent(viewModel: AssetViewModel, requestType: RequestType) {
189-
val assets = viewModel.getAssets(requestType)
192+
val assets = viewModel.getGroupedAssets(requestType)
190193
val gridCount = LocalAssetConfig.current.gridCount
191194

192-
LazyVerticalGrid(
193-
modifier = Modifier.fillMaxSize(),
194-
columns = GridCells.Fixed(gridCount),
195-
contentPadding = PaddingValues(horizontal = 1.dp),
196-
verticalArrangement = Arrangement.spacedBy(1.dp),
197-
horizontalArrangement = Arrangement.spacedBy(1.dp),
198-
userScrollEnabled = true
199-
) {
200-
itemsIndexed(assets, key = { _, it -> it.id }) { index, assetInfo ->
201-
AssetImage(
202-
assetInfo = assetInfo,
203-
navigateToPreview = { viewModel.navigateToPreview(index, requestType) },
204-
selectedList = viewModel.selectedList,
205-
onLongClick = { selected -> viewModel.toggleSelect(selected, assetInfo) }
206-
)
195+
LazyColumn {
196+
assets.forEach { (dateString, resources) ->
197+
val allSelected = viewModel.isAllSelected(resources)
198+
item {
199+
Row(
200+
modifier = Modifier
201+
.fillMaxWidth()
202+
.padding(start = 16.dp),
203+
horizontalArrangement = Arrangement.SpaceBetween,
204+
verticalAlignment = Alignment.CenterVertically
205+
) {
206+
Text(
207+
text = dateString,
208+
style = MaterialTheme.typography.bodyLarge.copy(fontWeight = FontWeight.Medium)
209+
)
210+
211+
TextButton(onClick = {
212+
if (allSelected) {
213+
viewModel.unSelectAll(resources)
214+
} else {
215+
viewModel.selectAll(resources)
216+
}
217+
}) {
218+
Text(text = if (allSelected) "取消全选" else "全选")
219+
}
220+
}
221+
}
222+
223+
item {
224+
LazyVerticalGrid(
225+
modifier = Modifier.heightIn(0.dp, 600.dp),
226+
columns = GridCells.Fixed(gridCount),
227+
contentPadding = PaddingValues(horizontal = 1.dp),
228+
verticalArrangement = Arrangement.spacedBy(1.dp),
229+
horizontalArrangement = Arrangement.spacedBy(1.dp),
230+
userScrollEnabled = false
231+
) {
232+
itemsIndexed(resources, key = { _, it -> it.id }) { index, assetInfo ->
233+
AssetImage(
234+
assetInfo = assetInfo,
235+
navigateToPreview = { viewModel.navigateToPreview(index, requestType) },
236+
selectedList = viewModel.selectedList,
237+
onLongClick = { selected -> viewModel.toggleSelect(selected, assetInfo) }
238+
)
239+
}
240+
}
241+
}
207242
}
208243
}
209244
}

compose_image_picker/src/main/java/com/huhx/picker/viewmodel/AssetViewModel.kt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,27 @@ internal class AssetViewModel(
8282
}
8383
}
8484

85+
86+
fun getGroupedAssets(requestType: RequestType): Map<String, List<AssetInfo>> {
87+
val assetList = _directoryGroup.first { it.directory == directory }.assets
88+
89+
return assetList.filter {
90+
when (requestType) {
91+
RequestType.COMMON -> true
92+
RequestType.IMAGE -> it.isImage()
93+
RequestType.VIDEO -> it.isVideo()
94+
}
95+
}
96+
.sortedByDescending { it.date }
97+
.groupBy { it.dateString }
98+
}
99+
100+
fun isAllSelected(assets: List<AssetInfo>): Boolean {
101+
val selectedIds = selectedList.map { it.id }
102+
val ids = assets.map { it.id }
103+
return selectedIds.containsAll(ids)
104+
}
105+
85106
fun navigateToPreview(index: Int, requestType: RequestType) {
86107
navController.navigate(AssetRoute.preview(index, requestType))
87108
}
@@ -93,4 +114,15 @@ internal class AssetViewModel(
93114
fun getUri(): Uri? {
94115
return assetPickerRepository.insertImage()
95116
}
117+
118+
fun unSelectAll(resources: List<AssetInfo>) {
119+
selectedList -= resources.toSet()
120+
}
121+
122+
fun selectAll(resources: List<AssetInfo>) {
123+
val selectedIds = selectedList.map { it.id }
124+
val newSelectedList = resources.filterNot { selectedIds.contains(it.id) }
125+
126+
selectedList += newSelectedList
127+
}
96128
}

0 commit comments

Comments
 (0)