Skip to content

Commit ad99d8c

Browse files
committed
feat: fix the BackHandler issue and SelectedAssetImageItem position
1 parent c2a081e commit ad99d8c

File tree

10 files changed

+104
-78
lines changed

10 files changed

+104
-78
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
android:name="android.hardware.camera"
77
android:required="false" />
88

9-
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
9+
<uses-permission
10+
android:name="android.permission.READ_EXTERNAL_STORAGE"
1011
android:maxSdkVersion="32" />
1112
<uses-permission android:name="android.permission.CAMERA" />
1213
<uses-permission android:name="android.permission.INTERNET" />

app/src/main/java/com/huhx/picker/AppRoute.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ import com.huhx.picker.view.MomentListScreen
1616
@Composable
1717
fun AppRoute(
1818
navController: NavHostController,
19-
viewModel: MomentViewModel
19+
viewModel: MomentViewModel,
2020
) {
2121
NavHost(
2222
navController = navController,
23-
startDestination = "moment_list",
23+
startDestination = "asset_picker",
2424
) {
2525
composable("moment_list") {
2626
MomentListScreen(viewModel) { navController.navigate("moment_add") }

app/src/main/java/com/huhx/picker/MainActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,6 @@ fun AssetPreviewScreenPreview() {
189189
selectedList.add(assetInfo)
190190

191191
Compose_image_pickerTheme {
192-
SelectorBottomBar(assetInfo = assetInfo, selectedList = selectedList, onClick = {}, onSelectedClick = {})
192+
SelectorBottomBar(assetInfo = assetInfo, selectedList = selectedList, onClick = {})
193193
}
194194
}

app/src/main/java/com/huhx/picker/ui/theme/Theme.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,14 @@ fun Compose_image_pickerTheme(
4545
darkTheme: Boolean = isSystemInDarkTheme(),
4646
// Dynamic color is available on Android 12+
4747
dynamicColor: Boolean = true,
48-
content: @Composable () -> Unit
48+
content: @Composable () -> Unit,
4949
) {
5050
val colorScheme = when {
5151
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
5252
val context = LocalContext.current
5353
if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
5454
}
55+
5556
darkTheme -> DarkColorScheme
5657
else -> LightColorScheme
5758
}

app/src/main/java/com/huhx/picker/view/MomentAddScreen.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ import com.huhx.picker.data.MomentViewModel
4848
import com.huhx.picker.data.imageUrl
4949
import com.huhx.picker.data.username
5050
import java.text.SimpleDateFormat
51-
import java.util.*
51+
import java.util.Locale
5252

5353
@Composable
5454
fun MomentAddScreen(
5555
viewModel: MomentViewModel,
5656
navController: NavHostController,
57-
navigateUp: () -> Unit
57+
navigateUp: () -> Unit,
5858
) {
5959

6060
Scaffold(
@@ -164,7 +164,7 @@ fun MomentAddContent(viewModel: MomentViewModel, navController: NavHostControlle
164164
fun ImageAdd(
165165
modifier: Modifier,
166166
viewModel: MomentViewModel,
167-
navController: NavHostController
167+
navController: NavHostController,
168168
) {
169169
LazyVerticalGrid(
170170
modifier = Modifier.heightIn(0.dp, 600.dp),
@@ -196,7 +196,7 @@ fun ImageAdd(
196196
@Composable
197197
internal fun CameraIcon(
198198
modifier: Modifier,
199-
navController: NavHostController
199+
navController: NavHostController,
200200
) {
201201
Box(
202202
contentAlignment = Alignment.Center,

app/src/main/java/com/huhx/picker/view/MomentListScreen.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,10 @@ import androidx.compose.ui.unit.dp
3232
import com.huhx.picker.data.Moment
3333
import com.huhx.picker.data.MomentViewModel
3434

35-
@OptIn(ExperimentalMaterial3Api::class)
3635
@Composable
3736
fun MomentListScreen(
3837
viewModel: MomentViewModel,
39-
navigateToAdd: () -> Unit
38+
navigateToAdd: () -> Unit,
4039
) {
4140

4241
Scaffold(

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,13 @@ internal fun AssetDisplayScreen(
6161
onPicked: (List<AssetInfo>) -> Unit,
6262
onClose: (List<AssetInfo>) -> Unit,
6363
) {
64-
BackHandler { viewModel.clear() }
64+
BackHandler {
65+
if (viewModel.selectedList.isNotEmpty()) {
66+
viewModel.clear()
67+
} else {
68+
onClose(viewModel.selectedList)
69+
}
70+
}
6571

6672
Scaffold(
6773
topBar = {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import androidx.compose.runtime.mutableStateOf
88
import androidx.compose.runtime.remember
99
import androidx.compose.ui.platform.LocalContext
1010
import androidx.lifecycle.viewmodel.compose.viewModel
11+
import androidx.media3.common.util.UnstableApi
1112
import androidx.navigation.compose.rememberNavController
1213
import com.huhx.picker.AssetPickerRoute
1314
import com.huhx.picker.model.AssetInfo
@@ -16,6 +17,7 @@ import com.huhx.picker.provider.AssetPickerRepository
1617
import com.huhx.picker.viewmodel.AssetViewModel
1718
import com.huhx.picker.viewmodel.AssetViewModelFactory
1819

20+
@UnstableApi
1921
@Composable
2022
fun AssetPicker(
2123
assetPickerConfig: AssetPickerConfig,

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

Lines changed: 65 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,6 @@ fun AssetPreviewScreen(
111111
SelectorBottomBar(
112112
selectedList = selectedList,
113113
assetInfo = assets[pageState.currentPage],
114-
onSelectedClick = { asset ->
115-
val selectedIndex = assets.indexOfFirst { it.id == asset.id }
116-
scope.launch {
117-
pageState.animateScrollToPage(selectedIndex)
118-
}
119-
}
120114
) {
121115
navigateUp()
122116
if (selectedList.isEmpty()) selectedList.add(it)
@@ -126,9 +120,36 @@ fun AssetPreviewScreen(
126120
Box(
127121
modifier = Modifier
128122
.padding(it)
129-
.background(Color.Black)
123+
.background(Color.Black),
124+
contentAlignment = Alignment.BottomCenter
130125
) {
131126
AssetPreview(assets = assets, pagerState = pageState)
127+
128+
if (selectedList.isNotEmpty()) {
129+
val assetInfo = assets[pageState.currentPage]
130+
LazyRow(
131+
modifier = Modifier
132+
.fillMaxWidth()
133+
.background(Color.Black.copy(alpha = 0.8F))
134+
.padding(horizontal = 2.dp, vertical = 2.dp)
135+
) {
136+
itemsIndexed(selectedList) { _, resource ->
137+
SelectedAssetImageItem(
138+
assetInfo = resource,
139+
isSelected = resource.id == assetInfo.id,
140+
resourceType = resource.resourceType,
141+
durationString = resource.formatDuration(),
142+
modifier = Modifier.size(64.dp),
143+
onClick = { asset ->
144+
val selectedIndex = assets.indexOfFirst { item -> item.id == asset.id }
145+
scope.launch {
146+
pageState.animateScrollToPage(selectedIndex)
147+
}
148+
}
149+
)
150+
}
151+
}
152+
}
132153
}
133154
}
134155
}
@@ -138,57 +159,35 @@ fun AssetPreviewScreen(
138159
fun SelectorBottomBar(
139160
assetInfo: AssetInfo,
140161
selectedList: SnapshotStateList<AssetInfo>,
141-
onSelectedClick: (AssetInfo) -> Unit,
142162
onClick: (AssetInfo) -> Unit,
143163
) {
144-
Column {
145-
if (selectedList.isNotEmpty()) {
146-
LazyRow(
147-
modifier = Modifier
148-
.fillMaxWidth()
149-
.background(Color.Black.copy(alpha = 0.8F))
150-
.padding(horizontal = 2.dp, vertical = 2.dp)
151-
) {
152-
itemsIndexed(selectedList) { _, resource ->
153-
SelectedAssetImageItem(
154-
assetInfo = resource,
155-
isSelected = resource.id == assetInfo.id,
156-
resourceType = resource.resourceType,
157-
modifier = Modifier.size(64.dp),
158-
onClick = onSelectedClick
159-
)
160-
}
161-
}
164+
Row(
165+
modifier = Modifier
166+
.fillMaxWidth()
167+
.background(color = Color.Black.copy(alpha = 0.9F))
168+
.padding(horizontal = 10.dp, vertical = 8.dp),
169+
horizontalArrangement = Arrangement.SpaceBetween,
170+
verticalAlignment = Alignment.CenterVertically
171+
) {
172+
Row(verticalAlignment = Alignment.CenterVertically) {
173+
AssetImageIndicator(
174+
assetInfo = assetInfo,
175+
selected = selectedList.any { it == assetInfo },
176+
assetSelected = selectedList,
177+
fontSize = 14.sp,
178+
size = 22.dp
179+
)
180+
Spacer(modifier = Modifier.width(6.dp))
181+
Text(text = stringResource(R.string.text_asset_select), color = Color.White, fontSize = 14.sp)
162182
}
163-
164-
Row(
165-
modifier = Modifier
166-
.fillMaxWidth()
167-
.background(color = Color.Black.copy(alpha = 0.9F))
168-
.padding(horizontal = 10.dp, vertical = 8.dp),
169-
horizontalArrangement = Arrangement.SpaceBetween,
170-
verticalAlignment = Alignment.CenterVertically
183+
Button(
184+
modifier = Modifier.defaultMinSize(minHeight = 1.dp, minWidth = 1.dp),
185+
shape = RoundedCornerShape(5.dp),
186+
enabled = true,
187+
contentPadding = PaddingValues(horizontal = 20.dp, vertical = 6.dp),
188+
onClick = { onClick(assetInfo) }
171189
) {
172-
Row(verticalAlignment = Alignment.CenterVertically) {
173-
AssetImageIndicator(
174-
assetInfo = assetInfo,
175-
selected = selectedList.any { it == assetInfo },
176-
assetSelected = selectedList,
177-
fontSize = 14.sp,
178-
size = 22.dp
179-
)
180-
Spacer(modifier = Modifier.width(6.dp))
181-
Text(text = stringResource(R.string.text_asset_select), color = Color.White, fontSize = 14.sp)
182-
}
183-
Button(
184-
modifier = Modifier.defaultMinSize(minHeight = 1.dp, minWidth = 1.dp),
185-
shape = RoundedCornerShape(5.dp),
186-
enabled = true,
187-
contentPadding = PaddingValues(horizontal = 20.dp, vertical = 6.dp),
188-
onClick = { onClick(assetInfo) }
189-
) {
190-
Text(stringResource(R.string.text_done), color = Color.White, fontSize = 15.sp)
191-
}
190+
Text(stringResource(R.string.text_done), color = Color.White, fontSize = 15.sp)
192191
}
193192
}
194193
}
@@ -246,14 +245,16 @@ fun VideoPreview(uriString: String) {
246245
}
247246
}
248247

249-
AndroidView(factory = {
250-
PlayerView(it).apply {
251-
this.player = player
252-
setShowPreviousButton(false)
253-
setShowNextButton(false)
254-
setShowFastForwardButton(false)
255-
setShowRewindButton(false)
256-
setShowSubtitleButton(false)
257-
}
258-
})
248+
AndroidView(
249+
modifier = Modifier.fillMaxSize(),
250+
factory = {
251+
PlayerView(it).apply {
252+
this.player = player
253+
setShowPreviousButton(false)
254+
setShowNextButton(false)
255+
setShowFastForwardButton(false)
256+
setShowRewindButton(false)
257+
setShowSubtitleButton(false)
258+
}
259+
})
259260
}

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,30 @@ import coil.request.ImageRequest
3636
import com.huhx.picker.model.AssetDirectory
3737

3838
@Composable
39+
@OptIn(ExperimentalMaterial3Api::class)
3940
internal fun AssetSelectorScreen(
4041
directory: String,
4142
assetDirectories: List<AssetDirectory>,
4243
navigateUp: () -> Unit,
4344
onSelected: (String) -> Unit,
4445
) {
4546
Scaffold(
46-
topBar = { DirectoryTopAppBar(directory = directory, navigateUp = navigateUp) }
47+
topBar = {
48+
CenterAlignedTopAppBar(
49+
modifier = Modifier.statusBarsPadding(),
50+
navigationIcon = {
51+
IconButton(onClick = navigateUp) {
52+
Icon(Icons.Filled.Close, contentDescription = "")
53+
}
54+
},
55+
title = {
56+
Row(modifier = Modifier.clickable(onClick = navigateUp)) {
57+
Text(text = directory, fontSize = 18.sp)
58+
Icon(Icons.Default.KeyboardArrowUp, contentDescription = "")
59+
}
60+
}
61+
)
62+
}
4763
) { padding ->
4864
Box(modifier = Modifier.padding(padding)) {
4965
LazyColumn {
@@ -62,7 +78,7 @@ internal fun AssetSelectorScreen(
6278
.aspectRatio(1.0F),
6379
filterQuality = FilterQuality.Low,
6480
contentScale = ContentScale.Crop,
65-
contentDescription = ""
81+
contentDescription = null
6682
)
6783
},
6884
headlineContent = {

0 commit comments

Comments
 (0)