Skip to content

Commit db5e0d4

Browse files
committed
feat: Add MaterialTheme to BottomAppBar and make minor code adjustments
1 parent 4bc3c8c commit db5e0d4

File tree

5 files changed

+62
-65
lines changed

5 files changed

+62
-65
lines changed

feature/screenshot-gallery/src/main/kotlin/com/espressodev/gptmap/feature/screenshot_gallery/ScreenshotGalleryScreen.kt

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.espressodev.gptmap.feature.screenshot_gallery
22

3-
import android.util.Log
43
import androidx.activity.compose.BackHandler
54
import androidx.compose.animation.core.FastOutSlowInEasing
65
import androidx.compose.animation.core.animateFloatAsState
@@ -29,7 +28,6 @@ import androidx.compose.foundation.pager.HorizontalPager
2928
import androidx.compose.foundation.pager.PagerState
3029
import androidx.compose.foundation.pager.rememberPagerState
3130
import androidx.compose.foundation.shape.CircleShape
32-
import androidx.compose.foundation.shape.RoundedCornerShape
3331
import androidx.compose.material3.Card
3432
import androidx.compose.material3.ExperimentalMaterial3Api
3533
import androidx.compose.material3.MaterialTheme
@@ -48,7 +46,6 @@ import androidx.compose.ui.Modifier
4846
import androidx.compose.ui.draw.clip
4947
import androidx.compose.ui.draw.shadow
5048
import androidx.compose.ui.graphics.Color
51-
import androidx.compose.ui.graphics.Shape
5249
import androidx.compose.ui.graphics.graphicsLayer
5350
import androidx.compose.ui.platform.LocalDensity
5451
import androidx.compose.ui.text.style.TextAlign
@@ -63,12 +60,14 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
6360
import com.espressodev.gptmap.core.designsystem.GmIcons
6461
import com.espressodev.gptmap.core.designsystem.IconType
6562
import com.espressodev.gptmap.core.designsystem.TextType
63+
import com.espressodev.gptmap.core.designsystem.component.GmAlertDialog
6664
import com.espressodev.gptmap.core.designsystem.component.GmEditAlertDialog
6765
import com.espressodev.gptmap.core.designsystem.component.GmTopAppBar
6866
import com.espressodev.gptmap.core.designsystem.component.LottieAnimationPlaceholder
6967
import com.espressodev.gptmap.core.designsystem.component.ShimmerImage
7068
import com.espressodev.gptmap.core.designsystem.component.darkBottomOverlayBrush
7169
import com.espressodev.gptmap.core.designsystem.theme.GptmapTheme
70+
import com.espressodev.gptmap.core.model.EditableItemUiEvent
7271
import com.espressodev.gptmap.core.model.ImageSummary
7372
import com.espressodev.gptmap.core.model.Response
7473
import kotlinx.collections.immutable.PersistentList
@@ -77,6 +76,7 @@ import kotlin.math.absoluteValue
7776
import com.espressodev.gptmap.core.designsystem.R.raw as AppRaw
7877
import com.espressodev.gptmap.core.designsystem.R.string as AppText
7978

79+
8080
@OptIn(ExperimentalMaterial3Api::class)
8181
@Composable
8282
fun ScreenshotGalleryRoute(
@@ -91,11 +91,11 @@ fun ScreenshotGalleryRoute(
9191
text = TextType.Res(AppText.screenshot_gallery),
9292
icon = IconType.Vector(GmIcons.ImageSearchDefault),
9393
onBackClick = popUp,
94-
editText = uiState.selectedImageSummary.title,
94+
editText = uiState.selectedItem.title,
9595
isInEditMode = uiState.uiIsInEditMode,
96-
onEditClick = { viewModel.onEvent(ScreenshotGalleryUiEvent.OnEditClick) },
97-
onDeleteClick = { viewModel.onEvent(ScreenshotGalleryUiEvent.OnDeleteClick) },
98-
onCancelClick = { viewModel.onEvent(ScreenshotGalleryUiEvent.OnCancelClick) }
96+
onEditClick = { viewModel.onEvent(EditableItemUiEvent.OnEditClick) },
97+
onDeleteClick = { viewModel.onEvent(EditableItemUiEvent.OnDeleteClick) },
98+
onCancelClick = { viewModel.onEvent(EditableItemUiEvent.OnCancelClick) }
9999
)
100100
}
101101
) {
@@ -112,10 +112,11 @@ fun ScreenshotGalleryRoute(
112112
images = result.data,
113113
onLongClick = { imageSummary ->
114114
viewModel.onEvent(
115-
ScreenshotGalleryUiEvent.OnLongClickToImage(imageSummary)
115+
EditableItemUiEvent.OnLongClickToItem(imageSummary)
116116
)
117117
},
118-
selectedId = uiState.selectedImageSummary.id
118+
selectedId = uiState.selectedItem.id,
119+
isUiInEditMode = uiState.uiIsInEditMode
119120
)
120121
} else {
121122
LottieAnimationPlaceholder(
@@ -129,16 +130,24 @@ fun ScreenshotGalleryRoute(
129130

130131
BackHandler {
131132
if (uiState.uiIsInEditMode) {
132-
viewModel.onEvent(ScreenshotGalleryUiEvent.Reset)
133+
viewModel.onEvent(EditableItemUiEvent.Reset)
133134
}
134135
}
135136

136137
if (uiState.editDialogState) {
137138
GmEditAlertDialog(
138-
title = AppText.screenshot_gallery_edit_dialog_title,
139+
title = AppText.rename,
139140
textFieldLabel = AppText.screenshot_gallery_edit_dialog_text_field_placeholder,
140-
onConfirm = { viewModel.onEvent(ScreenshotGalleryUiEvent.OnEditDialogConfirm(it)) },
141-
onDismiss = { viewModel.onEvent(ScreenshotGalleryUiEvent.OnEditDialogDismiss) }
141+
onConfirm = { viewModel.onEvent(EditableItemUiEvent.OnEditDialogConfirm(it)) },
142+
onDismiss = { viewModel.onEvent(EditableItemUiEvent.OnEditDialogDismiss) }
143+
)
144+
}
145+
146+
if (uiState.deleteDialogState) {
147+
GmAlertDialog(
148+
title = AppText.screenshot_gallery_delete_dialog_title,
149+
onConfirm = { viewModel.onEvent(EditableItemUiEvent.OnDeleteDialogConfirm) },
150+
onDismiss = { viewModel.onEvent(EditableItemUiEvent.OnDeleteDialogDismiss) }
142151
)
143152
}
144153
}
@@ -150,6 +159,7 @@ fun ScreenshotGalleryScreen(
150159
onLongClick: (ImageSummary) -> Unit,
151160
selectedId: String,
152161
modifier: Modifier = Modifier,
162+
isUiInEditMode: Boolean,
153163
) {
154164
var currentPage by rememberSaveable { mutableIntStateOf(0) }
155165
var dialogState by rememberSaveable { mutableStateOf(false) }
@@ -171,8 +181,12 @@ fun ScreenshotGalleryScreen(
171181
ImageCard(
172182
imageSummary = imageSummary,
173183
onClick = {
174-
currentPage = index
175-
dialogState = true
184+
if (isUiInEditMode) {
185+
onLongClick(imageSummary)
186+
} else {
187+
currentPage = index
188+
dialogState = true
189+
}
176190
},
177191
onLongClick = { onLongClick(imageSummary) },
178192
isSelected = selectedId == imageSummary.id
@@ -186,20 +200,19 @@ fun ScreenshotGalleryScreen(
186200
fun ImageCard(
187201
imageSummary: ImageSummary,
188202
modifier: Modifier = Modifier,
189-
shape: Shape = RoundedCornerShape(16.dp),
190203
isSelected: Boolean = false,
191204
onClick: () -> Unit = {},
192205
onLongClick: () -> Unit = {}
193206
) {
194207
var isImageLoaded by remember { mutableStateOf(value = false) }
195208
val borderStroke = if (isSelected) 3.dp else 0.dp
196209
val elevation = if (isSelected) 8.dp else 0.dp
210+
val borderColor = if (isSelected) MaterialTheme.colorScheme.primary else Color.Transparent
197211

198212
Box(
199213
modifier = modifier
200-
.shadow(elevation, shape)
201-
.clip(shape)
202-
.border(borderStroke, MaterialTheme.colorScheme.primary, shape)
214+
.shadow(elevation)
215+
.border(borderStroke, borderColor)
203216
.combinedClickable(
204217
onClick = onClick,
205218
onLongClick = onLongClick
@@ -239,7 +252,6 @@ private fun GalleryView(
239252
onDismiss: () -> Unit,
240253
modifier: Modifier = Modifier
241254
) {
242-
Log.d("GalleryView", "images: $images")
243255
Dialog(onDismissRequest = onDismiss) {
244256
Box(
245257
modifier = modifier

feature/screenshot-gallery/src/main/kotlin/com/espressodev/gptmap/feature/screenshot_gallery/ScreenshotGalleryUiState.kt

Lines changed: 0 additions & 20 deletions
This file was deleted.

feature/screenshot-gallery/src/main/kotlin/com/espressodev/gptmap/feature/screenshot_gallery/ScreenshotGalleryViewModel.kt

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ package com.espressodev.gptmap.feature.screenshot_gallery
33
import androidx.lifecycle.viewModelScope
44
import com.espressodev.gptmap.core.common.GmViewModel
55
import com.espressodev.gptmap.core.data.LogService
6+
import com.espressodev.gptmap.core.model.EditableItemUiEvent
67
import com.espressodev.gptmap.core.model.Exceptions
78
import com.espressodev.gptmap.core.model.ImageAnalysis
89
import com.espressodev.gptmap.core.model.ImageSummary
910
import com.espressodev.gptmap.core.model.Response
11+
import com.espressodev.gptmap.core.model.ScreenshotGalleryUiState
1012
import com.espressodev.gptmap.core.mongodb.RealmSyncService
1113
import dagger.hilt.android.lifecycle.HiltViewModel
1214
import kotlinx.collections.immutable.PersistentList
@@ -45,29 +47,32 @@ class ScreenshotGalleryViewModel @Inject constructor(
4547
Response.Loading
4648
)
4749

48-
private val _uiState = MutableStateFlow(ScreenshotGalleryUiState())
50+
private val _uiState =
51+
MutableStateFlow(ScreenshotGalleryUiState(selectedItem = ImageSummary()))
4952
val uiState = _uiState.asStateFlow()
5053

5154
private val imageSummaryId
52-
get() = uiState.value.selectedImageSummary.id
55+
get() = uiState.value.selectedItem.id
5356

54-
55-
fun onEvent(event: ScreenshotGalleryUiEvent) {
57+
fun onEvent(event: EditableItemUiEvent) {
5658
when (event) {
57-
ScreenshotGalleryUiEvent.OnCancelClick -> reset()
58-
ScreenshotGalleryUiEvent.OnDeleteClick -> onDeleteClick()
59-
ScreenshotGalleryUiEvent.OnEditClick -> _uiState.update { it.copy(uiIsInEditMode = true) }
60-
ScreenshotGalleryUiEvent.OnEditDialogDismiss -> _uiState.update {
61-
it.copy(editDialogState = false)
62-
}
63-
64-
is ScreenshotGalleryUiEvent.OnLongClickToImage -> _uiState.update {
65-
it.copy(selectedImageSummary = event.imageSummary, uiIsInEditMode = true)
66-
}
59+
EditableItemUiEvent.OnCancelClick -> reset()
60+
EditableItemUiEvent.OnDeleteClick -> _uiState.update { it.copy(deleteDialogState = true) }
61+
EditableItemUiEvent.OnDeleteDialogConfirm -> onDeleteDialogConfirmClick()
62+
EditableItemUiEvent.OnDeleteDialogDismiss -> _uiState.update { it.copy(deleteDialogState = false) }
63+
EditableItemUiEvent.OnEditClick -> _uiState.update { it.copy(editDialogState = true) }
64+
is EditableItemUiEvent.OnEditDialogConfirm -> onEditDialogConfirmClick(event.text)
65+
EditableItemUiEvent.OnEditDialogDismiss -> _uiState.update { it.copy(editDialogState = false) }
66+
is EditableItemUiEvent.OnLongClickToItem<*> -> _uiState.update { it.copy(uiIsInEditMode = true, selectedItem = event.item as ImageSummary) }
67+
EditableItemUiEvent.Reset -> reset()
68+
}
69+
}
6770

68-
ScreenshotGalleryUiEvent.Reset -> reset()
69-
is ScreenshotGalleryUiEvent.OnEditDialogConfirm -> onEditDialogConfirmClick(event.text)
71+
private fun onDeleteDialogConfirmClick() = launchCatching {
72+
withContext(ioDispatcher) {
73+
realmSyncService.deleteImageAnalysis(imageSummaryId).getOrThrow()
7074
}
75+
reset()
7176
}
7277

7378
private fun onEditDialogConfirmClick(text: String) = launchCatching {
@@ -78,12 +83,6 @@ class ScreenshotGalleryViewModel @Inject constructor(
7883
}
7984

8085
private fun reset() {
81-
_uiState.update { ScreenshotGalleryUiState() }
82-
}
83-
private fun onDeleteClick() = launchCatching {
84-
withContext(ioDispatcher) {
85-
realmSyncService.deleteImageAnalysis(imageSummaryId).getOrThrow()
86-
}
87-
reset()
86+
_uiState.update { ScreenshotGalleryUiState(selectedItem = ImageSummary()) }
8887
}
8988
}

feature/screenshot/src/main/kotlin/com/espressodev/gptmap/feature/screenshot/ScreenshotScreen.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import androidx.compose.material3.BottomAppBar
2323
import androidx.compose.material3.Button
2424
import androidx.compose.material3.ExperimentalMaterial3Api
2525
import androidx.compose.material3.Icon
26+
import androidx.compose.material3.MaterialTheme
2627
import androidx.compose.material3.OutlinedButton
2728
import androidx.compose.material3.Scaffold
2829
import androidx.compose.material3.Text
@@ -98,7 +99,10 @@ fun ScreenshotRoute(
9899
)
99100
},
100101
bottomBar = {
101-
BottomAppBar {
102+
BottomAppBar(
103+
containerColor = MaterialTheme.colorScheme.surfaceVariant,
104+
contentColor = MaterialTheme.colorScheme.onSurfaceVariant
105+
) {
102106
Row(
103107
modifier = Modifier
104108
.fillMaxWidth(),

feature/screenshot/src/main/kotlin/com/espressodev/gptmap/feature/screenshot/ScreenshotViewModel.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.espressodev.gptmap.core.common.GmViewModel
44
import com.espressodev.gptmap.core.data.LogService
55
import com.espressodev.gptmap.core.domain.SaveImageAnalysisToStorageUseCase
66
import dagger.hilt.android.lifecycle.HiltViewModel
7+
import kotlinx.coroutines.delay
78
import kotlinx.coroutines.flow.MutableStateFlow
89
import kotlinx.coroutines.flow.asStateFlow
910
import kotlinx.coroutines.flow.update
@@ -51,13 +52,14 @@ class ScreenshotViewModel @Inject constructor(
5152
if (image is ImageResult.Success) {
5253
saveImageAnalysisToStorageUseCase(image.data, uiState.value.title)
5354
.onSuccess {
55+
_uiState.update { it.copy(isSaveStateStarted = false) }
56+
delay(25L)
5457
navigateToMap()
5558
}.onFailure { throwable ->
5659
_uiState.update { it.copy(isSaveStateStarted = false) }
5760
throw throwable
5861
}
5962
}
60-
_uiState.update { it.copy(isSaveStateStarted = false) }
6163
}
6264

6365
}

0 commit comments

Comments
 (0)