Skip to content

Commit 6a0cda1

Browse files
committed
feat: added in lyricist for localisation and migrated usage of strings.xml in composables to use lyricist
1 parent 7819602 commit 6a0cda1

23 files changed

+474
-218
lines changed

.idea/inspectionProfiles/Project_Default.xml

+28
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/kotlinc.xml

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle.kts

+9-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ plugins {
66
id("com.google.gms.google-services")
77
id("org.jetbrains.kotlin.plugin.parcelize")
88
id("com.google.firebase.crashlytics")
9+
id("com.google.devtools.ksp")
10+
}
11+
12+
ksp {
13+
arg("lyricist.generateStringsProperty", "true")
914
}
1015

1116
android {
@@ -54,7 +59,7 @@ android {
5459
}
5560

5661
composeOptions {
57-
kotlinCompilerExtensionVersion = "1.5.3"
62+
kotlinCompilerExtensionVersion = "1.5.8"
5863
}
5964

6065
packagingOptions {
@@ -132,4 +137,7 @@ dependencies {
132137
implementation(libs.androidx.compose.runtime.saveable)
133138
implementation(libs.androidx.compose.runtime.livedata)
134139
androidTestImplementation(libs.androidx.compose.ui.test)
140+
141+
implementation(libs.lyricist)
142+
ksp(libs.lyricist.processor)
135143
}

app/src/main/java/com/timilehinaregbesola/mathalarm/presentation/MainActivity.kt

+10-2
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ import androidx.compose.ui.ExperimentalComposeUiApi
1111
import androidx.compose.ui.graphics.toArgb
1212
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
1313
import androidx.core.view.WindowInsetsControllerCompat
14+
import cafe.adriel.lyricist.Lyricist
15+
import cafe.adriel.lyricist.ProvideStrings
16+
import cafe.adriel.lyricist.rememberStrings
1417
import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
1518
import com.timilehinaregbesola.mathalarm.navigation.NavGraph
1619
import com.timilehinaregbesola.mathalarm.presentation.appsettings.AlarmPreferencesImpl
1720
import com.timilehinaregbesola.mathalarm.presentation.appsettings.shouldUseDarkColors
1821
import com.timilehinaregbesola.mathalarm.presentation.ui.MathAlarmTheme
1922
import com.timilehinaregbesola.mathalarm.presentation.ui.darkPrimary
23+
import com.timilehinaregbesola.mathalarm.utils.strings.Strings
2024
import dagger.hilt.android.AndroidEntryPoint
2125
import kotlinx.coroutines.InternalCoroutinesApi
2226
import javax.inject.Inject
@@ -30,6 +34,7 @@ import javax.inject.Inject
3034
class MainActivity : AppCompatActivity() {
3135
@Inject
3236
lateinit var preferences: AlarmPreferencesImpl
37+
private lateinit var lyricist: Lyricist<Strings>
3338

3439
@OptIn(ExperimentalMaterialNavigationApi::class)
3540
override fun onCreate(savedInstanceState: Bundle?) {
@@ -46,10 +51,13 @@ class MainActivity : AppCompatActivity() {
4651
// }
4752
// }
4853
setContent {
54+
lyricist = rememberStrings()
4955
val isDarkTheme = preferences.shouldUseDarkColors()
5056
updateTheme(isDarkTheme)
51-
MathAlarmTheme(darkTheme = isDarkTheme) {
52-
NavGraph(preferences)
57+
ProvideStrings(lyricist) {
58+
MathAlarmTheme(darkTheme = isDarkTheme) {
59+
NavGraph(preferences)
60+
}
5361
}
5462
}
5563
}

app/src/main/java/com/timilehinaregbesola/mathalarm/presentation/alarmlist/components/AlarmItem.kt

+17-31
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,19 @@ import androidx.compose.foundation.layout.fillMaxWidth
1212
import androidx.compose.foundation.layout.height
1313
import androidx.compose.foundation.layout.padding
1414
import androidx.compose.foundation.shape.CornerSize
15-
import androidx.compose.material3.Card
16-
import androidx.compose.material3.Divider
17-
import androidx.compose.material3.ExperimentalMaterial3Api
18-
import androidx.compose.material3.Icon
19-
import androidx.compose.material3.MaterialTheme
20-
import androidx.compose.material3.Switch
21-
import androidx.compose.material3.Text
2215
import androidx.compose.material.icons.Icons
2316
import androidx.compose.material.icons.filled.Edit
2417
import androidx.compose.material.icons.filled.KeyboardArrowDown
2518
import androidx.compose.material.icons.filled.KeyboardArrowUp
2619
import androidx.compose.material.icons.outlined.Delete
20+
import androidx.compose.material3.Card
2721
import androidx.compose.material3.CardDefaults
28-
import androidx.compose.material3.CardElevation
22+
import androidx.compose.material3.ExperimentalMaterial3Api
23+
import androidx.compose.material3.HorizontalDivider
24+
import androidx.compose.material3.Icon
25+
import androidx.compose.material3.MaterialTheme
26+
import androidx.compose.material3.Switch
27+
import androidx.compose.material3.Text
2928
import androidx.compose.runtime.Composable
3029
import androidx.compose.runtime.getValue
3130
import androidx.compose.runtime.mutableStateOf
@@ -42,6 +41,7 @@ import androidx.compose.ui.text.font.FontWeight.Companion.Normal
4241
import androidx.compose.ui.tooling.preview.Preview
4342
import androidx.compose.ui.unit.dp
4443
import androidx.compose.ui.unit.sp
44+
import cafe.adriel.lyricist.strings
4545
import com.timilehinaregbesola.mathalarm.domain.model.Alarm
4646
import com.timilehinaregbesola.mathalarm.presentation.alarmlist.components.AlarmItem.ACTUAL_TIME_FONT_SIZE
4747
import com.timilehinaregbesola.mathalarm.presentation.alarmlist.components.AlarmItem.ALARM_INFO_FONT_SIZE
@@ -53,8 +53,6 @@ import com.timilehinaregbesola.mathalarm.presentation.alarmlist.components.Alarm
5353
import com.timilehinaregbesola.mathalarm.presentation.alarmlist.components.AlarmItem.DIVIDER_THICKNESS
5454
import com.timilehinaregbesola.mathalarm.presentation.alarmlist.components.AlarmItem.EQUAL_WEIGHT
5555
import com.timilehinaregbesola.mathalarm.presentation.alarmlist.components.AlarmItem.EXPANDED_SECTION_DIVIDER_SPACING
56-
import com.timilehinaregbesola.mathalarm.presentation.alarmlist.components.AlarmItem.FIVE_OCLOCK
57-
import com.timilehinaregbesola.mathalarm.presentation.alarmlist.components.AlarmItem.NOON
5856
import com.timilehinaregbesola.mathalarm.presentation.alarmlist.components.AlarmItem.THREE_QUARTERS_WEIGHT
5957
import com.timilehinaregbesola.mathalarm.presentation.alarmlist.components.AlarmItem.TIME_LENGTH_INDEX
6058
import com.timilehinaregbesola.mathalarm.presentation.alarmlist.components.AlarmItem.TIME_OF_DAY_FONT_SIZE
@@ -177,20 +175,10 @@ fun AlarmItem(
177175
val alarmInfoText = if (daysSet < DAYS_SET_LIMIT) {
178176
sb.dropLast(TWO).toString()
179177
} else {
180-
"Multiple Days"
178+
strings.multipleDays
181179
}
182180

183-
val moreInfo = when {
184-
alarm.hour < NOON -> {
185-
"Good morning"
186-
}
187-
alarm.hour in NOON..FIVE_OCLOCK -> {
188-
"Afternoon"
189-
}
190-
else -> {
191-
"Good Evening"
192-
}
193-
}
181+
val moreInfo = strings.greeting(alarm.hour)
194182

195183
Text(
196184
text = "$alarmInfoText | $moreInfo",
@@ -200,7 +188,7 @@ fun AlarmItem(
200188
if (!expandItem) {
201189
Icon(
202190
imageVector = Icons.Default.KeyboardArrowDown,
203-
contentDescription = "Expand",
191+
contentDescription = strings.expand,
204192
modifier = Modifier
205193
.weight(EQUAL_WEIGHT)
206194
.align(CenterVertically)
@@ -232,7 +220,7 @@ private fun AlarmItemExpandableSection(
232220
with(MaterialTheme.spacing) {
233221
Column {
234222
Spacer(modifier = Modifier.height(small))
235-
Divider(
223+
HorizontalDivider(
236224
thickness = DIVIDER_THICKNESS,
237225
modifier = Modifier
238226
.padding(
@@ -256,13 +244,13 @@ private fun AlarmItemExpandableSection(
256244
) {
257245
Icon(
258246
imageVector = Icons.Outlined.Delete,
259-
contentDescription = "Delete",
247+
contentDescription = strings.delete,
260248
modifier = Modifier
261249
.padding(end = extraSmall)
262250
.clickable(onClick = onDeleteAlarm),
263251
)
264252
Text(
265-
text = "Delete",
253+
text = strings.delete,
266254
modifier = Modifier
267255
.align(CenterVertically),
268256
)
@@ -272,20 +260,20 @@ private fun AlarmItemExpandableSection(
272260
) {
273261
Icon(
274262
imageVector = Icons.Default.Edit,
275-
contentDescription = "Edit",
263+
contentDescription = strings.edit,
276264
modifier = Modifier
277265
.padding(end = extraSmall),
278266
)
279267
Text(
280-
text = "Edit",
268+
text = strings.edit,
281269
modifier = Modifier
282270
.align(CenterVertically),
283271
)
284272
}
285273
}
286274
Icon(
287275
imageVector = Icons.Default.KeyboardArrowUp,
288-
contentDescription = "Collapse",
276+
contentDescription = strings.collapse,
289277
modifier = Modifier
290278
.weight(EQUAL_WEIGHT)
291279
.align(CenterVertically)
@@ -326,8 +314,6 @@ private object AlarmItem {
326314
const val TIME_LENGTH_INDEX = 5
327315
const val EQUAL_WEIGHT = 1f
328316
const val ALARM_ITEM_LIGHT_BACKGROUND_HEX = 0x99FFFFFF
329-
const val NOON = 12
330-
const val FIVE_OCLOCK = 17
331317
const val THREE_QUARTERS_WEIGHT = 3f
332318
val ALARM_ITEM_ELEVATION = 4.dp
333319
val ALARM_TITLE_FONT_SIZE = 15.sp

app/src/main/java/com/timilehinaregbesola/mathalarm/presentation/alarmlist/components/AlarmListHeader.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import androidx.compose.ui.graphics.Color.Companion.LightGray
1515
import androidx.compose.ui.tooling.preview.Preview
1616
import androidx.compose.ui.unit.dp
1717
import androidx.compose.ui.unit.sp
18+
import cafe.adriel.lyricist.strings
1819
import com.timilehinaregbesola.mathalarm.domain.model.Alarm
1920
import com.timilehinaregbesola.mathalarm.presentation.alarmlist.components.AlarmListHeader.LIST_HEADER_ALPHA
2021
import com.timilehinaregbesola.mathalarm.presentation.alarmlist.components.AlarmListHeader.LIST_HEADER_ELEVATION
@@ -59,9 +60,9 @@ fun ListHeader(
5960
with(MaterialTheme.spacing) {
6061
Text(
6162
text = if (enabled && nearestAlarmMessage != null) {
62-
"Next alarm in $nearestAlarmMessage"
63+
"${strings.nextAlarmText} $nearestAlarmMessage"
6364
} else {
64-
"No upcoming alarms"
65+
strings.noUpcomingAlarms
6566
},
6667
modifier = Modifier
6768
.padding(

app/src/main/java/com/timilehinaregbesola/mathalarm/presentation/alarmlist/components/AlarmListScreen.kt

+7-6
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ import androidx.compose.ui.Modifier
3737
import androidx.compose.ui.graphics.Color.Companion.LightGray
3838
import androidx.compose.ui.platform.LocalContext
3939
import androidx.compose.ui.res.painterResource
40-
import androidx.compose.ui.res.stringResource
4140
import androidx.compose.ui.tooling.preview.Preview
4241
import androidx.compose.ui.unit.dp
4342
import androidx.hilt.navigation.compose.hiltViewModel
4443
import androidx.lifecycle.Lifecycle
4544
import androidx.lifecycle.LifecycleEventObserver
4645
import androidx.lifecycle.LifecycleOwner
4746
import androidx.navigation.NavHostController
47+
import cafe.adriel.lyricist.strings
4848
import com.squareup.moshi.Moshi
4949
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
5050
import com.timilehinaregbesola.mathalarm.R
@@ -210,6 +210,7 @@ fun ListDisplayScreen(
210210
),
211211
contentAlignment = TopStart,
212212
) {
213+
val alarmSetText = strings.alarmSet
213214
AlarmListContent(
214215
alarmList = alarmList,
215216
calendar = viewModel.calender.getCurrentCalendar(),
@@ -241,7 +242,7 @@ fun ListDisplayScreen(
241242
viewModel.scheduleAlarm(
242243
alarm = curAlarm,
243244
reschedule = b,
244-
message = "Alarm set for ${
245+
message = "$alarmSetText ${
245246
curAlarm.getTimeLeft(
246247
getCalendarFromAlarm(
247248
curAlarm,
@@ -368,10 +369,10 @@ private fun AlarmPermissionDialog(
368369
onCloseDialog: () -> Unit,
369370
) {
370371
val arguments = DialogArguments(
371-
title = stringResource(id = R.string.task_alarm_permission_dialog_title),
372-
text = stringResource(id = R.string.task_alarm_permission_dialog_text),
373-
confirmText = stringResource(id = R.string.task_alarm_permission_dialog_confirm),
374-
dismissText = stringResource(id = R.string.task_alarm_permission_dialog_cancel),
372+
title = strings.alarms,
373+
text = strings.taskAlarmPermissionDialogText,
374+
confirmText = strings.taskAlarmPermissionDialogConfirm,
375+
dismissText = strings.taskAlarmPermissionDialogCancel,
375376
onConfirmAction = {
376377
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
377378
val intent = Intent().apply {

app/src/main/java/com/timilehinaregbesola/mathalarm/presentation/alarmlist/components/MathAlarmDialogs.kt

+25-17
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,29 @@ fun MathAlarmDialog(
2121
onDismissRequest: () -> Unit,
2222
) {
2323
if (isDialogOpen) {
24-
AlertDialog(
25-
onDismissRequest = onDismissRequest,
26-
title = { Text(text = arguments.title) },
27-
text = { Text(text = arguments.text) },
28-
confirmButton = {
29-
Button(onClick = arguments.onConfirmAction) {
30-
Text(text = arguments.confirmText)
31-
}
32-
},
33-
dismissButton = {
34-
Button(onClick = onDismissRequest) {
35-
Text(text = arguments.dismissText)
36-
}
37-
},
38-
)
24+
with(arguments) {
25+
AlertDialog(
26+
onDismissRequest = onDismissRequest,
27+
title = if (title != null) {
28+
{ Text(text = title) }
29+
} else {
30+
null
31+
},
32+
text = { Text(text = text) },
33+
confirmButton = {
34+
Button(onClick = onConfirmAction) {
35+
Text(text = confirmText)
36+
}
37+
},
38+
dismissButton = if (dismissText != null) {
39+
{
40+
Button(onClick = onDismissRequest) {
41+
Text(text = dismissText)
42+
}
43+
}
44+
} else null,
45+
)
46+
}
3947
}
4048
}
4149

@@ -49,10 +57,10 @@ fun MathAlarmDialog(
4957
* @property onConfirmAction the action to be executed when the user confirms the dialog
5058
*/
5159
data class DialogArguments(
52-
val title: String,
60+
val title: String?,
5361
val text: String,
5462
val confirmText: String,
55-
val dismissText: String,
63+
val dismissText: String?,
5664
val onConfirmAction: () -> Unit,
5765
)
5866

0 commit comments

Comments
 (0)