Browse Source

Worked on Add driver license screen and completed its UI

Khubaib 4 months ago
parent
commit
37308001f8

+ 1 - 0
app/build.gradle.kts

@@ -63,6 +63,7 @@ dependencies {
     implementation(libs.androidx.material3)
     implementation(libs.hilt.android)
     implementation(libs.androidx.navigation.fragment)
+    implementation(libs.androidx.core.i18n)
     kapt(libs.hilt.compiler)
     kapt(libs.hilt.navigation)
     implementation(libs.lifecycle.viewmodel.compose)

+ 7 - 0
app/src/main/java/com/fastest/pass/home/domain/model/CountryInfo.kt

@@ -0,0 +1,7 @@
+package com.fastest.pass.home.domain.model
+
+data class CountryInfo(
+    val name: String,
+    val flag: String,
+    val timezone: String
+)

+ 87 - 4
app/src/main/java/com/fastest/pass/home/presentation/ui/components/AddContactInfoScreen.kt

@@ -1,5 +1,8 @@
 package com.fastest.pass.home.presentation.ui.components
 
+import android.os.Build
+import android.util.Log
+import androidx.annotation.RequiresApi
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
 import androidx.compose.foundation.clickable
@@ -52,7 +55,10 @@ import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.KeyboardType
 import androidx.compose.ui.unit.dp
 import com.fastest.pass.R
+import com.fastest.pass.home.domain.model.CountryInfo
 import java.text.SimpleDateFormat
+import java.time.OffsetDateTime
+import java.time.ZoneId
 import java.util.Date
 import java.util.Locale
 import java.util.TimeZone
@@ -68,10 +74,10 @@ fun AddContactInfoScreen() {
     countriesList.addAll(list)
     countriesList.add(0, "Please Select")
 
-    val timezone = getTimeZonesWithOffsets()
-    val timezoneList = ArrayList<String>()
-    timezoneList.addAll(timezone)
-    timezoneList.add(0, "Please Select")
+//    val timezone = getTimeZonesWithOffsets()
+//    val timezoneList = ArrayList<String>()
+//    timezoneList.addAll(timezone)
+//    timezoneList.add(0, "Please Select")
 
     val gender = listOf("Please Select", "Male", "Female", "Other")
 
@@ -481,8 +487,85 @@ fun getAllCountriesList() : List<String> {
         .sorted()
 }
 
+fun getCountriesWithFlagsAndTimezones(): List<CountryInfo> {
+    return Locale.getISOCountries().mapNotNull { countryCode ->
+        val locale = Locale("", countryCode)
+        val countryName = locale.displayCountry
+        val flag = countryCodeToFlag(countryCode)
+        var timezone: String? = ""
+
+//        timezone = getRepresentativeTimezone(countryName)
+
+        Log.d("country_list_det", "country => $countryName, $flag, $timezone")
+
+        CountryInfo(
+            name = countryName,
+            flag = flag,
+            timezone = timezone ?: ""
+        )
+
+    }.sortedBy { it.name }
+}
+
+@RequiresApi(Build.VERSION_CODES.O)
+fun getCountriesWithFlagsAndTimezones2(): List<CountryInfo> {
+    val offsetFormatter = java.time.format.DateTimeFormatter.ofPattern("xxx") // To format offsets like "+02:00"
+    return Locale.getISOCountries().mapNotNull { countryCode ->
+        val locale = Locale("", countryCode)
+        val countryName = locale.displayCountry
+        val flag = countryCodeToFlag(countryCode)
+        val timezone = getRepresentativeTimezone(countryCode)?.let { zoneId ->
+            val offsetToday = ZoneId.of(zoneId).rules.getOffset(java.time.Instant.now())
+            val formattedOffset = offsetFormatter.format(offsetToday)
+            "$formattedOffset $zoneId"
+        } ?: "Unknown"
+
+        Log.d("country_list_det", "country => $countryName, $flag, $timezone")
+
+
+        CountryInfo(
+            name = countryName,
+            flag = flag,
+            timezone = timezone
+        )
+    }.sortedBy { it.name }
+}
+
+
+fun countryCodeToFlag(countryCode: String): String {
+    return countryCode.uppercase().map { char ->
+        Character.toChars(0x1F1E6 + (char.code - 'A'.code)).concatToString()
+    }.joinToString("")
+}
+
+@RequiresApi(Build.VERSION_CODES.O)
+fun getRepresentativeTimezone(countryCode: String): String? {
+    return ZoneId.getAvailableZoneIds().find { it.startsWith(countryCode, ignoreCase = true) }
+}
+
+@RequiresApi(Build.VERSION_CODES.O)
+fun getRepresentativeTimezoneId(countryCode: String): String {
+    val zone = ZoneId.of(countryCode)
+
+    // Get current offset for the timezone
+    val offsetToday = OffsetDateTime.now(zone).offset
+    val offset = String.format(Locale.US, "GMT%+03d:%02d", offsetToday.totalSeconds / 3600, (offsetToday.totalSeconds % 3600) / 60)
+
+    // Format name from country code
+    val tokens = countryCode.replace("_", " ").split("/")
+    val name = if (tokens.size == 2) {
+        val (region, city) = tokens
+        "$city ($region)"
+    } else {
+        countryCode
+    }
+
+    return "$offset $name"
+}
+
 fun getTimeZonesWithOffsets() : List<String> {
     val groupedTimeZone = TimeZone.getAvailableIDs().groupBy { timeZoneId ->
+        Log.d("timeZoneId", "timeZoneId => $timeZoneId")
         val timeZone = TimeZone.getTimeZone(timeZoneId)
         val rawOffSetInMillis = timeZone.rawOffset
         val hours = rawOffSetInMillis / (60 * 60 * 1000)

+ 462 - 0
app/src/main/java/com/fastest/pass/home/presentation/ui/components/AddDriverLicenseFormScreen.kt

@@ -0,0 +1,462 @@
+package com.fastest.pass.home.presentation.ui.components
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.BoxScope
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.ColumnScope
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.defaultMinSize
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.wrapContentHeight
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.text.KeyboardActions
+import androidx.compose.foundation.text.KeyboardOptions
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.DateRange
+import androidx.compose.material3.Button
+import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.DatePicker
+import androidx.compose.material3.DatePickerDefaults
+import androidx.compose.material3.DatePickerDialog
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Text
+import androidx.compose.material3.TextButton
+import androidx.compose.material3.TextField
+import androidx.compose.material3.TextFieldDefaults
+import androidx.compose.material3.rememberDatePickerState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusManager
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalFocusManager
+import androidx.compose.ui.platform.LocalSoftwareKeyboardController
+import androidx.compose.ui.platform.SoftwareKeyboardController
+import androidx.compose.ui.res.colorResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.input.ImeAction
+import androidx.compose.ui.text.input.KeyboardType
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import com.fastest.pass.R
+
+@Composable
+fun AddDriverLicenseFormScreen() {
+    val keyboardController = LocalSoftwareKeyboardController.current
+    val focusManager = LocalFocusManager.current
+
+    Box(
+        modifier = Modifier
+            .fillMaxSize()
+            .padding(horizontal = 30.dp)
+            .padding(bottom = 20.dp)
+            .background(Color.Transparent)
+    ) {
+        SaveButtonADLFS(buttonText = R.string.save)
+
+        Column(
+            modifier = Modifier
+                .fillMaxSize()
+                .padding(horizontal = 0.dp)
+                .padding(bottom = 80.dp)
+                .background(Color.Transparent)
+                .verticalScroll(rememberScrollState())
+        ) {
+            Spacer(modifier = Modifier.height(20.dp))
+            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.title)
+            Spacer(modifier = Modifier.height(20.dp))
+            TextNumberTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.number, "L123456789")
+
+            Spacer(modifier = Modifier.height(20.dp))
+            DatePickerADLFS(labelText = R.string.expiration_date) {}
+
+            Spacer(modifier = Modifier.height(20.dp))
+            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.license_class)
+            Spacer(modifier = Modifier.height(20.dp))
+            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.name)
+            Spacer(modifier = Modifier.height(20.dp))
+            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.address)
+            Spacer(modifier = Modifier.height(20.dp))
+            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.city_town)
+            Spacer(modifier = Modifier.height(20.dp))
+            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.state)
+            Spacer(modifier = Modifier.height(20.dp))
+            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.zip_postal_code)
+            Spacer(modifier = Modifier.height(20.dp))
+            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.country)
+
+            Spacer(modifier = Modifier.height(20.dp))
+            DatePickerADLFS(labelText = R.string.date_of_birth) {}
+
+            Spacer(modifier = Modifier.height(20.dp))
+            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.sex)
+            Spacer(modifier = Modifier.height(20.dp))
+            NameTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager, labelText = R.string.height)
+
+            Spacer(modifier = Modifier.height(20.dp))
+            NotesTextFieldADLFS(keyboardController = keyboardController, focusManager = focusManager)
+        }
+    }
+}
+
+@Composable
+fun BoxScope.SaveButtonADLFS(buttonText: Int) {
+    Button(
+        modifier = Modifier
+            .background(colorResource(id = R.color.transparent))
+            .fillMaxWidth()
+            .height(60.dp)
+            .align(Alignment.BottomCenter)
+            .clickable() { },
+        onClick = {},
+        shape = RoundedCornerShape(15.dp),
+//            border = BorderStroke(25.dp, colorResource(id = R.color.black)),
+        colors = ButtonDefaults.buttonColors(
+            contentColor = colorResource(id = R.color.white),
+            containerColor = colorResource(id = R.color.red_login_button),
+        ),
+    )
+    {
+        Text(
+            text = stringResource(id = buttonText),
+            style = MaterialTheme.typography.bodyMedium.copy(
+                fontSize = 20.sp,
+                color = colorResource(id = R.color.white)
+            ),
+            textAlign = TextAlign.Center
+        )
+    }
+}
+
+@Composable
+fun ColumnScope.NameTextFieldADLFS(
+    keyboardController: SoftwareKeyboardController?,
+    focusManager: FocusManager,
+    labelText: Int
+) {
+    var text by remember { mutableStateOf("") }
+
+    TextField(
+        value = text,
+        onValueChange = {
+            text = it
+        },
+        textStyle = MaterialTheme.typography.displayMedium,
+        modifier = Modifier
+            .align(Alignment.Start)
+            .fillMaxWidth()
+            .defaultMinSize(minHeight = 60.dp)
+            .wrapContentHeight()
+            .border(
+                1.dp,
+                color = colorResource(id = R.color.gray_border_textfield),
+                shape = RoundedCornerShape(16.dp)
+            )
+            .background(color = colorResource(id = R.color.transparent)),
+        shape = RoundedCornerShape(16.dp),
+//        placeholder = {
+//            Text(
+//                text = stringResource(id = R.string.enter_email_address),
+//                color = colorResource(id = R.color.gray_splash),
+//                style = MaterialTheme.typography.displayMedium
+//            )
+//        },
+        label = {
+            Text(text = stringResource(id = labelText),
+                style = MaterialTheme.typography.titleSmall.copy(
+                    color = colorResource(id = R.color.gray_text)
+                )
+            )
+        },
+//        leadingIcon = {
+//            Image(
+//                painter = painterResource(id = R.drawable.profile_circle),
+//                contentDescription = "Title Logo",
+//                modifier = Modifier
+//                    .size(24.dp, 24.dp)
+//            )
+//        },
+        colors = TextFieldDefaults.colors(
+            focusedLabelColor = colorResource(id = R.color.gray_splash),
+            unfocusedContainerColor = colorResource(id = R.color.transparent),
+            focusedContainerColor = colorResource(id = R.color.transparent),
+            focusedIndicatorColor = colorResource(id = R.color.transparent),
+            disabledIndicatorColor = colorResource(id = R.color.transparent),
+            unfocusedIndicatorColor = colorResource(id = R.color.transparent),
+            cursorColor = colorResource(id = R.color.gray_splash),
+        ),
+        keyboardOptions = KeyboardOptions(
+            keyboardType = KeyboardType.Text,
+            imeAction = ImeAction.Next
+        ),
+        keyboardActions = KeyboardActions(
+            onDone = {
+                focusManager.clearFocus()
+                keyboardController?.hide()
+            }
+        ),
+    )
+}
+
+@Composable
+fun ColumnScope.TextNumberTextFieldADLFS(
+    keyboardController: SoftwareKeyboardController?,
+    focusManager: FocusManager,
+    labelText: Int,
+    placeholder: String
+) {
+    var text by remember { mutableStateOf("") }
+
+    TextField(
+        value = text,
+        onValueChange = {
+            text = it
+        },
+        textStyle = MaterialTheme.typography.displayMedium,
+        modifier = Modifier
+            .align(Alignment.Start)
+            .fillMaxWidth()
+            .defaultMinSize(minHeight = 60.dp)
+            .wrapContentHeight()
+            .border(
+                1.dp,
+                color = colorResource(id = R.color.gray_border_textfield),
+                shape = RoundedCornerShape(16.dp)
+            )
+            .background(color = colorResource(id = R.color.transparent)),
+        shape = RoundedCornerShape(16.dp),
+        placeholder = {
+            Text(
+                text = placeholder,
+                style = MaterialTheme.typography.titleSmall.copy(
+                    color = colorResource(id = R.color.gray_text)
+                )
+            )
+        },
+        label = {
+            Text(text = stringResource(id = labelText),
+                style = MaterialTheme.typography.titleSmall.copy(
+                    color = colorResource(id = R.color.gray_text)
+                )
+            )
+        },
+//        leadingIcon = {
+//            Image(
+//                painter = painterResource(id = R.drawable.profile_circle),
+//                contentDescription = "Title Logo",
+//                modifier = Modifier
+//                    .size(24.dp, 24.dp)
+//            )
+//        },
+        colors = TextFieldDefaults.colors(
+            focusedLabelColor = colorResource(id = R.color.gray_splash),
+            unfocusedContainerColor = colorResource(id = R.color.transparent),
+            focusedContainerColor = colorResource(id = R.color.transparent),
+            focusedIndicatorColor = colorResource(id = R.color.transparent),
+            disabledIndicatorColor = colorResource(id = R.color.transparent),
+            unfocusedIndicatorColor = colorResource(id = R.color.transparent),
+            cursorColor = colorResource(id = R.color.gray_splash),
+        ),
+        keyboardOptions = KeyboardOptions(
+            keyboardType = KeyboardType.Text,
+            imeAction = ImeAction.Next
+        ),
+        keyboardActions = KeyboardActions(
+            onDone = {
+                focusManager.clearFocus()
+                keyboardController?.hide()
+            }
+        ),
+    )
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun ColumnScope.DatePickerADLFS(
+    labelText: Int,
+    onDateSelected: (String) -> Unit
+) {
+    var selectedDate by remember { mutableStateOf("Select Date") }
+    var selectedDateMillis by remember { mutableStateOf<Long?>(null) }
+    var showDatePicker by remember { mutableStateOf(false) }
+
+    Column(
+        modifier = Modifier
+            .fillMaxWidth()
+            .background(color = colorResource(id = R.color.white)),
+    ) {
+        TextField(
+            value = selectedDate,
+            onValueChange = {},
+            textStyle = MaterialTheme.typography.displayMedium.copy(
+                color = colorResource(id = R.color.blue_text)
+            ),
+            readOnly = true,
+            label = { Text(
+                stringResource(id = labelText),
+                style = MaterialTheme.typography.titleSmall.copy(
+                    color = colorResource(id = R.color.gray_text)
+                )
+            ) },
+            leadingIcon = {
+                Icon(
+                    imageVector = Icons.Default.DateRange,
+                    contentDescription = "Calendar",
+                    tint = colorResource(id = R.color.blue_text)
+                )
+            },
+            modifier = Modifier
+                .align(Alignment.Start)
+                .fillMaxWidth()
+                .defaultMinSize(minHeight = 60.dp)
+                .wrapContentHeight()
+                .border(
+                    1.dp,
+                    color = colorResource(id = R.color.gray_border_textfield),
+                    shape = RoundedCornerShape(16.dp)
+                )
+                .background(color = colorResource(id = R.color.transparent))
+                .clickable {
+                    showDatePicker = true
+                },
+            shape = RoundedCornerShape(16.dp),
+            enabled = false,
+            colors = TextFieldDefaults.colors(
+                disabledContainerColor = colorResource(id = R.color.transparent),
+                focusedLabelColor = colorResource(id = R.color.gray_splash),
+                unfocusedContainerColor = colorResource(id = R.color.transparent),
+                focusedContainerColor = colorResource(id = R.color.transparent),
+                focusedIndicatorColor = colorResource(id = R.color.transparent),
+                disabledIndicatorColor = colorResource(id = R.color.transparent),
+                unfocusedIndicatorColor = colorResource(id = R.color.transparent),
+                cursorColor = colorResource(id = R.color.gray_splash),
+            ),
+            keyboardOptions = KeyboardOptions(
+                keyboardType = KeyboardType.Password
+            )
+        )
+
+        if (showDatePicker) {
+            val datePickerState = rememberDatePickerState(
+                initialSelectedDateMillis = selectedDateMillis ?: System.currentTimeMillis()
+            )
+
+            DatePickerDialog(
+                onDismissRequest = {
+                    showDatePicker = false
+                },
+                confirmButton = {
+                    TextButton(onClick = {
+                        val selectedMillis = datePickerState.selectedDateMillis
+                        if (selectedMillis != null) {
+                            val formattedDate = convertMillisToFormattedDate(selectedMillis)
+                            selectedDate = formattedDate
+                            onDateSelected(selectedDate)
+                            selectedDateMillis = selectedMillis
+                            showDatePicker = false
+                        }
+
+                    }) {
+                        Text(text = "OK")
+                    }
+                },
+                dismissButton = {
+                    TextButton(onClick = { showDatePicker = false }) {
+                        Text(text = "Cancel")
+                    }
+                },
+                colors = DatePickerDefaults.colors(
+                    containerColor = colorResource(id = R.color.white)
+                )
+            ) {
+                DatePicker(state = datePickerState)
+            }
+        }
+    }
+
+}
+
+@Composable
+fun ColumnScope.NotesTextFieldADLFS(
+    keyboardController: SoftwareKeyboardController?,
+    focusManager: FocusManager
+) {
+    var notesText by remember { mutableStateOf("") }
+
+    TextField(
+        value = notesText,
+        onValueChange = {
+            notesText = it
+        },
+        textStyle = MaterialTheme.typography.displayMedium,
+        modifier = Modifier
+            .align(Alignment.Start)
+            .fillMaxWidth()
+            .defaultMinSize(minHeight = 60.dp)
+            .wrapContentHeight()
+            .border(
+                1.dp,
+                color = colorResource(id = R.color.gray_border_textfield),
+                shape = RoundedCornerShape(16.dp)
+            )
+            .background(color = colorResource(id = R.color.transparent))
+        ,
+        shape = RoundedCornerShape(16.dp),
+//        placeholder = {
+//            Text(
+//                text = stringResource(id = R.string.enter_email_address),
+//                color = colorResource(id = R.color.gray_splash),
+//                style = MaterialTheme.typography.displayMedium
+//            )
+//        },
+        label = {
+            Text(text = stringResource(R.string.notes),
+                style = MaterialTheme.typography.titleSmall.copy(
+                    color = colorResource(id = R.color.gray_text)
+                )
+            )
+        },
+//        leadingIcon = {
+//            Image(
+//                painter = painterResource(id = R.drawable.profile_circle),
+//                contentDescription = "Title Logo",
+//                modifier = Modifier
+//                    .size(24.dp, 24.dp)
+//            )
+//        },
+        colors = TextFieldDefaults.colors(
+            focusedLabelColor = colorResource(id = R.color.gray_splash),
+            unfocusedContainerColor = colorResource(id = R.color.transparent),
+            focusedContainerColor = colorResource(id = R.color.transparent),
+            focusedIndicatorColor = colorResource(id = R.color.transparent),
+            disabledIndicatorColor = colorResource(id = R.color.transparent),
+            unfocusedIndicatorColor = colorResource(id = R.color.transparent),
+            cursorColor = colorResource(id = R.color.gray_splash),
+        ),
+        keyboardOptions = KeyboardOptions(
+            keyboardType = KeyboardType.Text,
+            imeAction = ImeAction.Done
+        ),
+        keyboardActions = KeyboardActions(
+            onDone = {
+                focusManager.clearFocus()
+                keyboardController?.hide()
+            }
+        ),
+    )
+}

+ 1 - 1
app/src/main/java/com/fastest/pass/home/presentation/ui/components/NewItemFormScreen.kt

@@ -76,7 +76,7 @@ fun NewItemFormScreen(screenName: String, screenNameType: ClickTypeAddNewItem, c
                 AddContactInfoScreen()
             }
             ClickTypeAddNewItem.Driver -> {
-
+                AddDriverLicenseFormScreen()
             }
             ClickTypeAddNewItem.Passport -> {
 

+ 6 - 0
app/src/main/res/values/strings.xml

@@ -100,6 +100,7 @@
     <string name="first_name">First Name</string>
     <string name="middle_name">Middle Name</string>
     <string name="last_name">Last Name</string>
+    <string name="address">Address</string>
     <string name="address1">Address 1</string>
     <string name="address2">Address 2</string>
     <string name="address3">Address 3</string>
@@ -112,5 +113,10 @@
     <string name="company">Company</string>
     <string name="gender">Gender</string>
     <string name="birthday">Birthday</string>
+    <string name="license_class">License Class</string>
+    <string name="name">Name</string>
+    <string name="date_of_birth">Date of Birth</string>
+    <string name="sex">Sex</string>
+    <string name="height">Height</string>
 
 </resources>

+ 2 - 0
gradle/libs.versions.toml

@@ -20,6 +20,7 @@ runtime-livedata = "1.7.5"
 androidx-fragment = "1.8.5"
 navigationFragment = "2.8.4"
 accompanist-pager = "0.31.3-beta"
+coreI18n = "1.0.0-alpha01"
 
 [libraries]
 androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
@@ -51,6 +52,7 @@ androidx-fragment = { module = "androidx.fragment:fragment-ktx", version.ref = "
 androidx-navigation-fragment = { group = "androidx.navigation", name = "navigation-fragment", version.ref = "navigationFragment" }
 accompanist-pager= { module = "com.google.accompanist:accompanist-pager", version.ref = "accompanist-pager" }
 accompanist-pager-indicators = { module = "com.google.accompanist:accompanist-pager-indicators", version.ref = "accompanist-pager" }
+androidx-core-i18n = { group = "androidx.core", name = "core-i18n", version.ref = "coreI18n" }
 
 
 [plugins]