Skip to content

Commit 9525214

Browse files
authored
feat: allow changing preferred script from main screen (#11)
* feat: update select script screen to show preferred script and update it * feat: allow updating preferred script from camera screen * fix: use preferred script when analyzing image
1 parent e3b6e74 commit 9525214

6 files changed

Lines changed: 76 additions & 15 deletions

File tree

app/src/main/java/dev/androhit/natively/camera/ui/CameraScreen.kt

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import androidx.compose.material3.IconButton
2323
import androidx.compose.material3.IconButtonDefaults
2424
import androidx.compose.material3.MaterialTheme
2525
import androidx.compose.material3.Scaffold
26+
import androidx.compose.material3.Surface
2627
import androidx.compose.runtime.Composable
2728
import androidx.compose.runtime.DisposableEffect
2829
import androidx.compose.runtime.LaunchedEffect
@@ -61,15 +62,16 @@ fun CameraScreen(
6162
cameraController: CameraController,
6263
viewModel: CameraViewModel,
6364
onViewImage: () -> Unit = {},
64-
script: TextScript? = null,
65+
onChangeScript: () -> Unit = {},
6566
) {
6667
val selectedFeature by viewModel.selectedFeature.collectAsStateWithLifecycle()
6768
val detectedTextLines by viewModel.detectedTextLines.collectAsStateWithLifecycle()
6869
val translationState by viewModel.translationState.collectAsStateWithLifecycle()
70+
val userPrefs by viewModel.userPreferences.collectAsStateWithLifecycle()
6971

70-
LaunchedEffect(selectedFeature, script) {
72+
LaunchedEffect(selectedFeature, userPrefs?.preferredScript) {
7173
if (selectedFeature == CameraFeature.LiveTranslate) {
72-
script?.let { viewModel.updateScript(script) }
74+
userPrefs?.preferredScript?.let { viewModel.updateScript(it) }
7375
viewModel.attachTextAnalyzer()
7476
}
7577
}
@@ -139,6 +141,13 @@ fun CameraScreen(
139141
}
140142
}
141143

144+
ChangeScriptButton(
145+
script = userPrefs?.preferredScript ?: TextScript.Latin,
146+
onClick = onChangeScript,
147+
modifier = Modifier.align(Alignment.TopStart)
148+
.padding(16.dp)
149+
)
150+
142151
Column(
143152
modifier = Modifier
144153
.align(Alignment.BottomCenter)
@@ -187,6 +196,37 @@ fun CameraScreen(
187196
}
188197
}
189198

199+
@Composable
200+
fun ChangeScriptButton(
201+
script: TextScript,
202+
onClick: () -> Unit,
203+
modifier: Modifier = Modifier
204+
) {
205+
val symbol = when(script) {
206+
TextScript.Latin -> R.drawable.ic_latin_symbol
207+
TextScript.Devanagari -> R.drawable.ic_devanagari_symbol
208+
TextScript.Chinese -> R.drawable.ic_chinese_symbol
209+
TextScript.Japanese -> R.drawable.ic_japanese_symbol
210+
TextScript.Korean -> R.drawable.ic_korean_symbol
211+
}
212+
Surface(
213+
modifier = modifier.widthIn(max = 272.dp),
214+
shape = CircleShape,
215+
color = MaterialTheme.colorScheme.surface.copy(alpha = 0.9f),
216+
tonalElevation = 6.dp,
217+
shadowElevation = 12.dp
218+
) {
219+
IconButton(
220+
onClick = onClick,
221+
) {
222+
Icon(
223+
painter = painterResource(symbol),
224+
contentDescription = "Change Script",
225+
)
226+
}
227+
}
228+
}
229+
190230
@Composable
191231
fun DetectedTextChipsLayer(
192232
textLines: List<RecognizedText>,

app/src/main/java/dev/androhit/natively/camera/ui/CameraViewModel.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ class CameraViewModel(
6161
viewModelScope.launch { userPrefRepository.updateIsFirstLaunch(firstLaunch) }
6262
}
6363

64+
fun updatePreferredScript(script: TextScript) {
65+
viewModelScope.launch { userPrefRepository.updatePreferredScript(script) }
66+
}
67+
6468
fun onFeatureSelected(feature: CameraFeature) {
6569
_selectedFeature.value = feature
6670
_capturedImage.value = null
@@ -127,7 +131,8 @@ class CameraViewModel(
127131
fun analyzeCapturedImage() {
128132
_capturedImage.value?.let {
129133
viewModelScope.launch {
130-
val lines = textAnalyzer.analyzeImage(it)
134+
val script = userPreferences.value?.preferredScript ?: TextScript.Latin
135+
val lines = textAnalyzer.analyzeImage(it, script)
131136
_detectedTextLines.value = lines
132137
}
133138
}

app/src/main/java/dev/androhit/natively/camera/ui/ScriptSelectionScreen.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,11 @@ val scripts = TextScript.entries.map {
9797
@OptIn(ExperimentalMaterial3Api::class)
9898
@Composable
9999
fun ScriptSelectionScreen(
100+
isFirstLaunch: Boolean,
101+
script: TextScript,
100102
onProceed: (TextScript) -> Unit,
101103
) {
102-
var selectedScript by remember { mutableStateOf<TextScript?>(null) }
104+
var selectedScript by remember { mutableStateOf(script) }
103105
var error by remember { mutableStateOf<Int?>(null) }
104106

105107
Scaffold(
@@ -169,7 +171,10 @@ fun ScriptSelectionScreen(
169171
.padding(bottom = 8.dp)
170172
) {
171173
Text(
172-
text = stringResource(R.string.proceed),
174+
text = stringResource(
175+
if (isFirstLaunch) R.string.proceed
176+
else R.string.update_script
177+
),
173178
style = MaterialTheme.typography.titleMedium
174179
)
175180
}
@@ -233,7 +238,11 @@ private fun ScriptItem(
233238
@Composable
234239
fun ScriptSelectionScreenPreview() {
235240
NativelyTheme(dynamicColor = false) {
236-
ScriptSelectionScreen(onProceed = {})
241+
ScriptSelectionScreen(
242+
isFirstLaunch = false,
243+
script = TextScript.Latin,
244+
onProceed = {}
245+
)
237246
}
238247
}
239248

app/src/main/java/dev/androhit/natively/navigation/MainNavigation.kt

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ fun MainNavigation(modifier: Modifier = Modifier) {
2525

2626
val mainBackStack = rememberNavBackStack(
2727
if(userPres?.isFirstLaunch ?: false) Route.SelectScript
28-
else Route.Camera(userPres?.preferredScript ?: TextScript.Latin)
28+
else Route.Camera
2929
)
3030

3131
NavDisplay(
@@ -42,9 +42,11 @@ fun MainNavigation(modifier: Modifier = Modifier) {
4242
CameraScreen(
4343
cameraController = cameraController,
4444
viewModel = viewModel,
45-
script = it.script,
4645
onViewImage = {
4746
mainBackStack.add(Route.ViewImage)
47+
},
48+
onChangeScript = {
49+
mainBackStack.add(Route.SelectScript)
4850
}
4951
)
5052
}
@@ -59,10 +61,15 @@ fun MainNavigation(modifier: Modifier = Modifier) {
5961
}
6062

6163
entry<Route.SelectScript> {
62-
ScriptSelectionScreen {
63-
viewModel.updateIsFirstLaunch(false)
64-
mainBackStack.add(Route.Camera(it))
65-
}
64+
ScriptSelectionScreen(
65+
isFirstLaunch = userPres?.isFirstLaunch ?: true,
66+
script = userPres?.preferredScript ?: TextScript.Latin,
67+
onProceed = {
68+
viewModel.updatePreferredScript(it)
69+
viewModel.updateIsFirstLaunch(false)
70+
mainBackStack.add(Route.Camera)
71+
}
72+
)
6673
}
6774
}
6875
)

app/src/main/java/dev/androhit/natively/navigation/Route.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ sealed interface Route: NavKey {
1111
data object SelectScript: Route, NavKey
1212

1313
@Serializable
14-
data class Camera(val script: TextScript? = null) : Route, NavKey
14+
data object Camera : Route, NavKey
1515

1616
@Serializable
1717
data object ViewImage : Route, NavKey

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<string name="proceed">Proceed</string>
55
<string name="select_script_rationale">Select a script to improve text detection accuracy</string>
66
<string name="choose_text_script">Choose Text Script</string>
7-
7+
<string name="update_script">Update Script</string>
88
<string name="languages">Languages</string>
99
<string name="latin">Latin</string>
1010
<string name="devanagari">Devanagari</string>

0 commit comments

Comments
 (0)