Skip to content

Commit 21ee33f

Browse files
committed
(am): changed a way to recieve photo, added kige state
1 parent 6773b87 commit 21ee33f

File tree

14 files changed

+247
-44
lines changed

14 files changed

+247
-44
lines changed

.idea/appInsightsSettings.xml

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/inspectionProfiles/Project_Default.xml

Lines changed: 41 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gradle/libs.versions.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
accompanist-permissions = "0.33.1-alpha"
33
agp = "8.3.0-alpha01"
44
coil-compose = "2.4.0"
5+
github-landscapist-coil = "2.2.8"
56
kotlin = "1.8.10"
67
core-ktx = "1.10.1"
78
junit = "4.13.2"
89
androidx-test-ext-junit = "1.1.5"
910
espresso-core = "3.5.1"
11+
landscapist-placeholder = "2.2.8"
1012
lifecycle-runtime-ktx = "2.6.1"
1113
activity-compose = "1.7.2"
1214
material3 = "1.2.0-alpha06"
@@ -23,6 +25,8 @@ espresso-core = { group = "androidx.test.espresso", name = "espresso-core", vers
2325
lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle-runtime-ktx" }
2426
activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activity-compose" }
2527
compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" }
28+
skydoves-landscapist-coil = { module = "com.github.skydoves:landscapist-coil", version.ref = "github-landscapist-coil" }
29+
skydoves-landscapist-placeholder = { module = "com.github.skydoves:landscapist-placeholder", version.ref = "landscapist-placeholder" }
2630
ui = { group = "androidx.compose.ui", name = "ui", version.ref = "ui" }
2731
ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }
2832
ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }

kige/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ android {
4747

4848
dependencies {
4949
implementation(libs.coil.compose)
50-
50+
implementation(libs.skydoves.landscapist.coil)
51+
implementation(libs.skydoves.landscapist.placeholder)
5152
implementation(libs.accompanist.permissions)
5253
implementation(libs.core.ktx)
5354
implementation(libs.lifecycle.runtime.ktx)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.kiko.kige.data.remembers
2+
3+
import androidx.compose.material3.ExperimentalMaterial3Api
4+
import androidx.compose.material3.rememberModalBottomSheetState
5+
import androidx.compose.runtime.Composable
6+
import androidx.compose.runtime.mutableStateOf
7+
import androidx.compose.runtime.remember
8+
import com.kiko.kige.data.state.GalleryState
9+
import com.kiko.kige.data.state.KigeState
10+
import com.kiko.kige.data.state.PermissionState
11+
import com.kiko.kige.ui.states.GalleryUIState
12+
13+
@OptIn(ExperimentalMaterial3Api::class)
14+
@Composable
15+
fun rememberKigeState(
16+
isVisibleOnInit: Boolean = false,
17+
rememberGalleryState: GalleryState = rememberKigeGalleryState(),
18+
rememberPermissionState: PermissionState = rememberKigePermissionState()
19+
): KigeState {
20+
val visibleState = remember { mutableStateOf(isVisibleOnInit) }
21+
return remember {
22+
KigeState(visibleState, rememberGalleryState, rememberPermissionState)
23+
}
24+
}

kige/src/main/java/com/kiko/kige/data/state/GalleryState.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package com.kiko.kige.data.state
77
import androidx.compose.material3.ExperimentalMaterial3Api
88
import androidx.compose.material3.SheetState
99
import androidx.compose.runtime.MutableState
10+
import androidx.compose.runtime.mutableStateOf
1011
import com.kiko.kige.ui.states.GalleryUIState
1112
import kotlinx.coroutines.CoroutineScope
1213
import kotlinx.coroutines.launch
@@ -15,18 +16,29 @@ import kotlinx.coroutines.launch
1516
data class GalleryState @OptIn(ExperimentalMaterial3Api::class) constructor(
1617
val sheetState: SheetState,
1718
val galleryUIState: GalleryUIState = GalleryUIState(),
18-
val visibleState: MutableState<Boolean>,
19+
val visibleState: MutableState<Boolean>
1920
) {
20-
fun expand() {
21+
internal fun expand() {
2122
this.visibleState.value = true
2223
}
2324

2425
@OptIn(ExperimentalMaterial3Api::class)
25-
fun hide(coroutineScope: CoroutineScope) {
26+
internal fun hide(coroutineScope: CoroutineScope) {
2627
coroutineScope.launch {
2728
sheetState.hide()
2829
}.invokeOnCompletion {
2930
this.visibleState.value = false
3031
}
3132
}
33+
34+
@OptIn(ExperimentalMaterial3Api::class)
35+
internal fun hide(coroutineScope: CoroutineScope, onHided: () -> Unit) {
36+
coroutineScope.launch {
37+
sheetState.hide()
38+
}.invokeOnCompletion {
39+
this.visibleState.value = false
40+
onHided()
41+
}
42+
}
43+
3244
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright (c) 2023. Created by Kiko
3+
*/
4+
5+
package com.kiko.kige.data.state
6+
7+
import androidx.compose.material3.ExperimentalMaterial3Api
8+
import androidx.compose.material3.SheetState
9+
import androidx.compose.runtime.MutableState
10+
import androidx.compose.runtime.State
11+
import androidx.compose.runtime.mutableStateOf
12+
import com.kiko.kige.ui.states.GalleryUIState
13+
import kotlinx.coroutines.CoroutineScope
14+
import kotlinx.coroutines.launch
15+
16+
17+
data class KigeState(
18+
val visibleState: MutableState<Boolean>,
19+
val rememberGalleryState: GalleryState,
20+
val rememberPermissionState: PermissionState,
21+
private val _photoUri: MutableState<String> = mutableStateOf(""),
22+
val photoUri: State<String> = _photoUri,
23+
) {
24+
fun expand() {
25+
this.visibleState.value = true
26+
}
27+
28+
29+
fun hide(coroutineScope: CoroutineScope) {
30+
coroutineScope.launch {
31+
rememberGalleryState.hide(coroutineScope)
32+
}.invokeOnCompletion {
33+
this.visibleState.value = false
34+
}
35+
}
36+
37+
fun hide(coroutineScope: CoroutineScope, onHided: () -> Unit) {
38+
rememberGalleryState.hide(coroutineScope, onHided)
39+
}
40+
41+
fun choosePhoto(newImageUri: String) {
42+
_photoUri.value = newImageUri
43+
}
44+
}

kige/src/main/java/com/kiko/kige/ui/components/GallerySheet.kt

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.compose.foundation.lazy.grid.GridCells
1212
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
1313
import androidx.compose.foundation.lazy.grid.items
1414
import androidx.compose.material3.ExperimentalMaterial3Api
15+
import androidx.compose.material3.MaterialTheme
1516
import androidx.compose.material3.ModalBottomSheet
1617
import androidx.compose.material3.Text
1718
import androidx.compose.runtime.Composable
@@ -21,20 +22,29 @@ import androidx.compose.ui.Modifier
2122
import androidx.compose.ui.layout.ContentScale
2223
import androidx.compose.ui.platform.LocalContext
2324
import androidx.compose.ui.unit.dp
24-
import coil.compose.AsyncImage
25-
import com.google.accompanist.permissions.ExperimentalPermissionsApi
25+
import com.kiko.kige.data.remembers.rememberKigeState
2626
import com.kiko.kige.data.state.GalleryState
27+
import com.kiko.kige.data.state.KigeState
2728
import com.kiko.kige.data.utils.GalleryUtils
29+
import com.skydoves.landscapist.ImageOptions
30+
import com.skydoves.landscapist.coil.CoilImage
31+
import com.skydoves.landscapist.components.rememberImageComponent
32+
import com.skydoves.landscapist.placeholder.shimmer.ShimmerPlugin
2833

29-
@OptIn(ExperimentalMaterial3Api::class, ExperimentalPermissionsApi::class)
34+
@OptIn(ExperimentalMaterial3Api::class)
3035
@Composable
31-
fun GallerySheet(rememberGalleryState: GalleryState, onPick: (String) -> Unit) {
36+
internal fun GallerySheet(
37+
rememberGalleryState: GalleryState,
38+
rememberKigeState: KigeState,
39+
) {
3240
val coroutineScope = rememberCoroutineScope()
3341

3442
if (rememberGalleryState.visibleState.value) {
3543
ModalBottomSheet(
3644
sheetState = rememberGalleryState.sheetState,
37-
onDismissRequest = { rememberGalleryState.hide(coroutineScope) }) {
45+
onDismissRequest = {
46+
rememberKigeState.hide(coroutineScope)
47+
}) {
3848
Column(
3949
modifier = Modifier.padding(16.dp),
4050
horizontalAlignment = Alignment.CenterHorizontally,
@@ -53,15 +63,25 @@ fun GallerySheet(rememberGalleryState: GalleryState, onPick: (String) -> Unit) {
5363
verticalArrangement = Arrangement.spacedBy(8.dp)
5464
) {
5565
items(photos) { photoUri ->
56-
AsyncImage(
66+
CoilImage(
5767
modifier = rememberGalleryState.galleryUIState.imagesModifier
5868
.clickable {
59-
onPick(photoUri)
60-
rememberGalleryState.hide(coroutineScope)
69+
rememberKigeState.hide(coroutineScope) {
70+
rememberKigeState.choosePhoto(photoUri)
71+
}
6172
},
62-
model = photoUri,
63-
contentDescription = null,
64-
contentScale = ContentScale.Crop
73+
component = rememberImageComponent {
74+
// shows a shimmering effect when loading an image.
75+
+ShimmerPlugin(
76+
baseColor = MaterialTheme.colorScheme.secondaryContainer,
77+
highlightColor = MaterialTheme.colorScheme.secondary
78+
)
79+
},
80+
imageModel = { photoUri }, // loading a network image or local resource using an URL.
81+
imageOptions = ImageOptions(
82+
contentScale = ContentScale.Crop,
83+
alignment = Alignment.Center
84+
)
6585
)
6686
}
6787
}

kige/src/main/java/com/kiko/kige/ui/components/KigePicker.kt

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,47 +10,57 @@ import com.google.accompanist.permissions.isGranted
1010
import com.google.accompanist.permissions.rememberPermissionState
1111
import com.kiko.kige.data.remembers.rememberKigeGalleryState
1212
import com.kiko.kige.data.remembers.rememberKigePermissionState
13+
import com.kiko.kige.data.remembers.rememberKigeState
1314
import com.kiko.kige.data.state.GalleryState
15+
import com.kiko.kige.data.state.KigeState
1416
import com.kiko.kige.data.state.PermissionState
1517
import kotlinx.coroutines.CoroutineScope
1618
import kotlinx.coroutines.launch
1719

1820
@OptIn(ExperimentalPermissionsApi::class)
1921
@Composable
2022
fun KigePicker(
21-
rememberKigeGalleryState: GalleryState = rememberKigeGalleryState(),
22-
rememberKigePermissionState: PermissionState = rememberKigePermissionState(),
23-
onPick: (String) -> Unit
23+
rememberKigeState: KigeState = rememberKigeState()
2424
) {
25-
val readExternalPermission = if (Build.VERSION.SDK_INT < 33)
26-
rememberPermissionState(Manifest.permission.READ_EXTERNAL_STORAGE)
27-
else
28-
rememberPermissionState(Manifest.permission.READ_MEDIA_IMAGES)
25+
if (rememberKigeState.visibleState.value) {
26+
val readExternalPermission = if (Build.VERSION.SDK_INT < 33)
27+
rememberPermissionState(Manifest.permission.READ_EXTERNAL_STORAGE)
28+
else
29+
rememberPermissionState(Manifest.permission.READ_MEDIA_IMAGES)
2930

30-
val coroutineScope = rememberCoroutineScope()
31+
val coroutineScope = rememberCoroutineScope()
3132

32-
if (readExternalPermission.status.isGranted) {
33-
CreateGallerySheet(onPick, coroutineScope, rememberKigeGalleryState)
34-
} else {
35-
PermissionSheet(rememberKigePermissionState) {
36-
CreateGallerySheet(onPick, coroutineScope, rememberKigeGalleryState)
37-
}
33+
if (readExternalPermission.status.isGranted) {
34+
CreateGallerySheet(
35+
coroutineScope,
36+
rememberKigeState.rememberGalleryState,
37+
rememberKigeState
38+
)
39+
} else {
40+
PermissionSheet(rememberKigeState.rememberPermissionState) {
41+
CreateGallerySheet(
42+
coroutineScope,
43+
rememberKigeState.rememberGalleryState,
44+
rememberKigeState
45+
)
46+
}
3847

39-
LaunchedEffect(true) {
40-
coroutineScope.launch {
41-
rememberKigePermissionState.expand()
48+
LaunchedEffect(true) {
49+
coroutineScope.launch {
50+
rememberKigeState.rememberPermissionState.expand()
51+
}
4252
}
4353
}
4454
}
4555
}
4656

4757
@Composable
4858
private fun CreateGallerySheet(
49-
onPick: (String) -> Unit,
5059
coroutineScope: CoroutineScope,
51-
rememberKigeGalleryState: GalleryState
60+
rememberKigeGalleryState: GalleryState,
61+
rememberKigeState: KigeState
5262
) {
53-
GallerySheet(rememberKigeGalleryState, onPick)
63+
GallerySheet(rememberKigeGalleryState, rememberKigeState)
5464

5565
LaunchedEffect(true) {
5666
coroutineScope.launch {

0 commit comments

Comments
 (0)