Final Cleanup - Refactor Deprecated Libraries & Apply Custom Lint (#1752)

* Final Cleanup - Refactor Deprecated Libraries & Apply Custom Lint

* Fix - [:ci] Fixed id of run_check job

* Fix - [:ci] Fixed id of run_check job

* Fix - [:mifospay] Updated splash screen icon

Updated the splash screen icon to use the correct drawable and adjusted the size of the icon in the drawable
.
Also, disabled the `ResourceName` lint rule until the libraries are shipped to Maven.
Finally, updated the CI workflow to include the dependency guard job in the build job's needs.

* Refactor - AccountsScreen Icons to MifosIcons

* - Fixing DesignSystem Lint Error

* - Uploading Lint Baseline

* - Fixing Formatting
This commit is contained in:
Sk Niyaj Ali 2024-08-26 05:04:39 +05:30 committed by GitHub
parent 2a6dafec5c
commit dc95c55df4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
211 changed files with 10061 additions and 3992 deletions

View File

@ -54,7 +54,7 @@ jobs:
fi
- name: Upload Detekt Reports
if: ${{ matrix.check }} == 'detekt' && steps.run_check.outcome == 'success'
if: ${{ matrix.check == 'detekt' && steps.run_check.outcome == 'success' }}
uses: actions/upload-artifact@v4
with:
name: detekt-reports
@ -79,7 +79,6 @@ jobs:
- name: Prevent updating Dependency Guard baselines if this is a fork
id: checkfork_dependencyguard
continue-on-error: true
if: steps.dependencyguard_verify.outcome == 'failure' && github.event.pull_request.head.repo.full_name != github.repository
run: |
echo "::error::Dependency Guard failed, please update baselines with: ./gradlew dependencyGuardBaseline" && exit 1
@ -99,7 +98,6 @@ jobs:
disable_globbing: true
commit_message: "🤖 Updates baselines for Dependency Guard"
tests_and_lint:
needs: setup
runs-on: ubuntu-latest
@ -111,7 +109,7 @@ jobs:
java-version: 17
- name: Run tests
run: |
./gradlew testDemoDebug lintProdRelease
./gradlew testDemoDebug :lint:test :mifospay:lintProdRelease :lint:lint
- name: Upload reports
if: always()
uses: actions/upload-artifact@v4
@ -122,7 +120,7 @@ jobs:
**/build/test-results/test*UnitTest/**.xml
build:
needs: [ checks, tests_and_lint ]
needs: [ checks, dependency_guard, tests_and_lint ]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

View File

@ -98,20 +98,23 @@ Before you begin, you should have already downloaded the Android Studio SDK and
4. **Perform a Gradle Check**
All your pull requests must pass the CI build only then, it will be allowed to merge. Sometimes, when the build doesn't pass you can use these commands in your local terminal and check for the errors,</br>
All your pull requests must pass the CI build only then, it will be allowed to merge.
Sometimes, when the build doesn't pass you can use these commands in your local terminal and check for the errors,</br>
For Mac OS, you can use the following commands:
**We've commited to use Material3 design in our project. And added lint check for not to use any M2 libraries in our project.</br>**
**And when adding new library, please make sure to follow the naming convention and place in sequential order(A->Z).**
* `./gradlew check` quality checks on your projects code using Checkstyle and generates reports from these checks.</br>
* `./gradlew spotlessApply` an check and apply formatting to any plain-text file.</br>
* `./gradlew build` provides a command line to execute build script.</br>
In MacOS, Windows or Linux, you should run the following commands before opening a PR, and make sure to pass all the commands:
* `./gradlew check -p build-logic` this checks build-logic configured properly.</br>
* `./gradlew spotlessApply --no-configuration-cache` an check and apply formatting to any file.</br>
* `./gradlew dependencyGuardBaseline` to generate dependency-guard baseline.</br>
* `./gradlew detekt` to check detekt error.</br>
* `./gradlew testDemoDebug :lint:test :mifospay:lintProdRelease :lint:lint` to check lint and test error.</br>
* `./gradlew build` to build the project.</br>
* `./gradlew updateProdReleaseBadging` to update the badging for the project.</br>
For Windows, you can use the following commands:
* `gradlew check` quality checks on your projects code using Checkstyle and generates reports from these checks.</br>
* `gradlew spotlessApply` an check and apply formatting to any plain-text file.</br>
* `gradlew build` provides a command line to execute build script.</br>
*Or Run the `ci-prebuild.sh` or `ci-prebuild.bat` script to run all the above commands in one go.*
### **Committing Your Changes**

View File

@ -4,6 +4,7 @@ import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.kotlin
import org.mifospay.libs
class AndroidFeatureConventionPlugin : Plugin<Project> {
@ -24,16 +25,25 @@ class AndroidFeatureConventionPlugin : Plugin<Project> {
dependencies {
add("implementation", project(":core:ui"))
add("implementation", project(":core:designsystem"))
add("implementation", project(":shared"))
add("implementation", project(":desktop"))
add("implementation", libs.findLibrary("androidx.material.navigation").get())
add("implementation", project(":libs:material3-navigation"))
add("implementation", libs.findLibrary("kotlinx.collections.immutable").get())
add("implementation", libs.findLibrary("androidx.hilt.navigation.compose").get())
add("implementation", libs.findLibrary("androidx.lifecycle.runtimeCompose").get())
add("implementation", libs.findLibrary("androidx.lifecycle.viewModelCompose").get())
add("implementation", libs.findLibrary("androidx.tracing.ktx").get())
add("androidTestImplementation", libs.findLibrary("androidx.lifecycle.runtimeTesting").get())
add("testImplementation", kotlin("test"))
add("testImplementation", libs.findLibrary("hilt.android.testing").get())
add("debugImplementation", libs.findLibrary("androidx.compose.ui.test.manifest").get())
add("androidTestImplementation", libs.findLibrary("androidx.navigation.testing").get())
add("androidTestImplementation", libs.findLibrary("androidx.compose.ui.test").get())
add("androidTestImplementation", libs.findLibrary("hilt.android.testing").get())
add("androidTestImplementation", libs.findLibrary("androidx.lifecycle.runtimeTesting").get())
}
}
}

View File

@ -4,6 +4,7 @@ import com.android.build.api.dsl.Lint
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
import java.io.File
class AndroidLintConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
@ -27,4 +28,10 @@ class AndroidLintConventionPlugin : Plugin<Project> {
private fun Lint.configure() {
xmlReport = true
checkDependencies = true
abortOnError = false
// Disable this rule until we ship the libraries to some maven.
disable += "ResourceName"
baseline = File("lint-baseline.xml")
explainIssues = true
htmlReport = true
}

View File

@ -13,8 +13,7 @@ call :run_gradle_task "check -p build-logic"
call :run_gradle_task "spotlessApply --no-configuration-cache"
call :run_gradle_task "dependencyGuardBaseline"
call :run_gradle_task "detekt"
call :run_gradle_task "testDemoDebug"
call :run_gradle_task "lintProdRelease"
call :run_gradle_task "testDemoDebug :lint:test :mifospay:lintProdRelease :lint:lint"
call :run_gradle_task "build"
call :run_gradle_task "updateProdReleaseBadging"

View File

@ -8,23 +8,52 @@ fi
echo "Starting all checks and tests..."
failed_tasks=()
successful_tasks=()
run_gradle_task() {
echo "Running: $1"
"./gradlew" $1
if [ $? -ne 0 ]; then
echo "Error: Task $1 failed"
exit 1
echo "Warning: Task $1 failed"
failed_tasks+=("$1")
else
echo "Task $1 completed successfully"
successful_tasks+=("$1")
fi
}
run_gradle_task "check -p build-logic"
run_gradle_task "spotlessApply --no-configuration-cache"
run_gradle_task "dependencyGuardBaseline"
run_gradle_task "detekt"
run_gradle_task "testDemoDebug"
run_gradle_task "lintProdRelease"
run_gradle_task "build"
run_gradle_task "updateProdReleaseBadging"
tasks=(
"check -p build-logic"
"spotlessApply --no-configuration-cache"
"dependencyGuardBaseline"
"detekt"
"testDemoDebug :lint:test :lint:lint :mifospay:lintProdRelease"
"build"
"updateProdReleaseBadging"
)
echo "All checks and tests completed successfully."
exit 0
for task in "${tasks[@]}"; do
run_gradle_task "$task"
done
echo "All tasks have finished."
echo "Successful tasks:"
for task in "${successful_tasks[@]}"; do
echo "- $task"
done
if [ ${#failed_tasks[@]} -eq 0 ]; then
echo "All checks and tests completed successfully."
else
echo "Failed tasks:"
for task in "${failed_tasks[@]}"; do
echo "- $task"
done
echo "Please review the output above for more details on the failures."
fi
echo "Total tasks: ${#tasks[@]}"
echo "Successful tasks: ${#successful_tasks[@]}"
echo "Failed tasks: ${#failed_tasks[@]}"

View File

@ -16,11 +16,4 @@ android {
namespace = "org.mifospay.common"
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.test.ext.junit)
androidTestImplementation(libs.espresso.core)
}
dependencies {}

View File

@ -9,31 +9,17 @@
*/
package org.mifospay.common
import android.app.Activity
import android.content.Context
import android.content.res.Resources
import android.view.inputmethod.InputMethodManager
import java.text.NumberFormat
import java.util.Currency
object Utils {
@JvmStatic
fun hideSoftKeyboard(activity: Activity) {
val view = activity.currentFocus
val inputMethodManager =
activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view?.windowToken, 0)
}
@JvmStatic
fun Int.dp2px() = (this * Resources.getSystem().displayMetrics.density + 0.5f).toInt()
@JvmStatic
fun String.isBlank() = this.isEmpty() || indices.all { this[it].isWhitespace() }
@JvmStatic
fun getFormattedAccountBalance(balance: Double?, currencyCode: String?, maximumFractionDigits: Int? = 0): String {
fun getFormattedAccountBalance(
balance: Double?,
currencyCode: String?,
maximumFractionDigits: Int? = 0,
): String {
val accountBalanceFormatter = NumberFormat.getCurrencyInstance()
accountBalanceFormatter.maximumFractionDigits = maximumFractionDigits ?: 0
accountBalanceFormatter.currency = Currency.getInstance(currencyCode)

View File

@ -20,8 +20,11 @@ android {
}
dependencies {
lintPublish(projects.lint)
implementation(projects.core.model)
api(libs.androidx.compose.ui)
api(libs.androidx.compose.foundation)
api(libs.androidx.compose.foundation.layout)
api(libs.androidx.compose.material.iconsExtended)

View File

@ -18,7 +18,9 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.sizeIn
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonColors
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ButtonElevation
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
@ -27,6 +29,7 @@ import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.unit.dp
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.core.designsystem.theme.MifosTheme
@ -61,6 +64,29 @@ fun MifosButton(
)
}
@Composable
fun MifosButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
shape: Shape = ButtonDefaults.shape,
contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
elevation: ButtonElevation? = ButtonDefaults.buttonElevation(),
colors: ButtonColors = ButtonDefaults.buttonColors(),
content: @Composable RowScope.() -> Unit = {},
) {
Button(
onClick = onClick,
modifier = modifier,
enabled = enabled,
colors = colors,
shape = shape,
elevation = elevation,
contentPadding = contentPadding,
content = content,
)
}
/**
* Mifos Wallet filled button with text and icon content slots.
*
@ -114,6 +140,9 @@ fun MifosOutlinedButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
shape: Shape = ButtonDefaults.outlinedShape,
border: BorderStroke? = ButtonDefaults.outlinedButtonBorder,
colors: ButtonColors = ButtonDefaults.outlinedButtonColors(),
contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
content: @Composable RowScope.() -> Unit = {},
) {
@ -121,19 +150,9 @@ fun MifosOutlinedButton(
onClick = onClick,
modifier = modifier,
enabled = enabled,
colors = ButtonDefaults.outlinedButtonColors(
contentColor = MaterialTheme.colorScheme.onBackground,
),
border = BorderStroke(
width = MifosButtonDefaults.OutlinedButtonBorderWidth,
color = if (enabled) {
MaterialTheme.colorScheme.outline
} else {
MaterialTheme.colorScheme.onSurface.copy(
alpha = MifosButtonDefaults.DISABLED_OUTLINED_BUTTON_BORDER_ALPHA,
)
},
),
shape = shape,
colors = colors,
border = border,
contentPadding = contentPadding,
content = content,
)

View File

@ -0,0 +1,41 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package org.mifospay.core.designsystem.component
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Tab
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@Composable
fun MifosTab(
text: String,
selected: Boolean,
onClick: () -> Unit,
modifier: Modifier = Modifier,
selectedContentColor: Color = MaterialTheme.colorScheme.onSurface,
unselectedContentColor: Color = Color.LightGray,
) {
Tab(
text = {
Text(
text = text,
color = MaterialTheme.colorScheme.onSurface,
)
},
selected = selected,
modifier = modifier,
selectedContentColor = selectedContentColor,
unselectedContentColor = unselectedContentColor,
onClick = onClick,
)
}

View File

@ -12,8 +12,12 @@ package org.mifospay.core.designsystem.icon
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.outlined.ArrowBack
import androidx.compose.material.icons.filled.ArrowDropDown
import androidx.compose.material.icons.filled.ArrowOutward
import androidx.compose.material.icons.filled.Camera
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.ChevronRight
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.ContentCopy
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Edit
@ -22,8 +26,11 @@ import androidx.compose.material.icons.filled.FlashOn
import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.filled.Photo
import androidx.compose.material.icons.filled.PhotoLibrary
import androidx.compose.material.icons.filled.QrCode
import androidx.compose.material.icons.filled.QrCode2
import androidx.compose.material.icons.filled.Share
import androidx.compose.material.icons.filled.Visibility
import androidx.compose.material.icons.filled.VisibilityOff
import androidx.compose.material.icons.outlined.AccountCircle
import androidx.compose.material.icons.outlined.Cancel
import androidx.compose.material.icons.outlined.Home
@ -46,6 +53,13 @@ import androidx.compose.ui.graphics.vector.ImageVector
* Mifos icons. Material icons are [ImageVector]s, custom icons are drawable resource IDs.
*/
object MifosIcons {
val ChevronRight: ImageVector = Icons.Filled.ChevronRight
val QrCode: ImageVector = Icons.Filled.QrCode
val Close: ImageVector = Icons.Filled.Close
val VisibilityOff: ImageVector = Icons.Filled.VisibilityOff
val Visibility: ImageVector = Icons.Filled.Visibility
val Check: ImageVector = Icons.Default.Check
val ArrowDropDown: ImageVector = Icons.Default.ArrowDropDown
val Home = Icons.Outlined.Home
val HomeBoarder = Icons.Rounded.Home
val Payment = Icons.Rounded.SwapHoriz

View File

@ -26,8 +26,12 @@ dependencies {
api(libs.androidx.metrics)
api(projects.core.analytics)
implementation(libs.androidx.compose.runtime)
implementation(libs.accompanist.pager)
implementation(libs.androidx.browser)
implementation(libs.coil.kt)
implementation(libs.coil.kt.compose)
testImplementation(libs.androidx.compose.ui.test)
androidTestImplementation(libs.bundles.androidx.compose.ui.test)
}

View File

@ -15,8 +15,8 @@ import androidx.compose.ui.tooling.preview.Preview
* Multipreview annotation that represents various device sizes. Add this annotation to a composable
* to render various devices.
*/
@Preview(name = "phone", device = "spec:shape=Normal,width=360,height=640,unit=dp,dpi=480")
@Preview(name = "landscape", device = "spec:shape=Normal,width=640,height=360,unit=dp,dpi=480")
@Preview(name = "foldable", device = "spec:shape=Normal,width=673,height=841,unit=dp,dpi=480")
@Preview(name = "tablet", device = "spec:shape=Normal,width=1280,height=800,unit=dp,dpi=480")
@Preview(name = "phone", device = "spec:width=360dp,height=640dp,dpi=480")
@Preview(name = "landscape", device = "spec:width=640dp,height=360dp,dpi=480")
@Preview(name = "foldable", device = "spec:width=673dp,height=841dp,dpi=480")
@Preview(name = "tablet", device = "spec:width=1280dp,height=800dp,dpi=480")
annotation class DevicePreviews

View File

@ -18,8 +18,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Search
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@ -35,6 +33,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.core.designsystem.theme.MifosTheme
@Composable
@ -115,7 +114,7 @@ fun EmptyContentScreen(
subTitle: String,
modifier: Modifier = Modifier,
iconTint: Color = MaterialTheme.colorScheme.surfaceTint,
iconImageVector: ImageVector = Icons.Rounded.Search,
iconImageVector: ImageVector = MifosIcons.Search,
) {
EmptyContentScreen(
title = title,
@ -155,7 +154,7 @@ fun EmptyContentScreenImageVectorPreview() {
subTitle = "Please check you connection or try again",
modifier = Modifier,
iconTint = MaterialTheme.colorScheme.primary,
iconImageVector = Icons.Rounded.Search,
iconImageVector = MifosIcons.Search,
)
}
}

View File

@ -19,8 +19,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDropDown
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@ -35,6 +33,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.scale
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import org.mifospay.core.designsystem.icon.MifosIcons
@Composable
fun FaqItemScreen(
@ -67,7 +66,7 @@ fun FaqItemScreen(
)
Icon(
imageVector = Icons.Default.ArrowDropDown,
imageVector = MifosIcons.ArrowDropDown,
contentDescription = "drop down",
tint = MaterialTheme.colorScheme.onSurface,
modifier = Modifier

View File

@ -13,8 +13,6 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@ -29,6 +27,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.core.designsystem.theme.MifosTheme
@Composable
@ -57,7 +56,7 @@ fun VerifyStepHeader(
) {
if (isVerified) {
Icon(
imageVector = Icons.Default.Check,
imageVector = MifosIcons.Check,
contentDescription = null,
tint = if (isVerified) MaterialTheme.colorScheme.onSurface else Color.Gray,
modifier = Modifier.size(24.dp),

View File

@ -11,8 +11,6 @@ package org.mifospay.core.ui
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ScrollableTabRow
import androidx.compose.material3.Tab
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
@ -22,6 +20,7 @@ import androidx.compose.ui.unit.dp
import com.google.accompanist.pager.HorizontalPager
import com.google.accompanist.pager.PagerState
import kotlinx.coroutines.launch
import org.mifospay.core.designsystem.component.MifosTab
import org.mifospay.core.ui.utility.TabContent
@Suppress("MultipleEmitters")
@ -44,13 +43,8 @@ fun MifosScrollableTabRow(
edgePadding = edgePadding,
) {
tabContents.forEachIndexed { index, currentTab ->
Tab(
text = {
Text(
text = currentTab.tabName,
color = MaterialTheme.colorScheme.onSurface,
)
},
MifosTab(
text = currentTab.tabName,
selected = pagerState.currentPage == index,
selectedContentColor = selectedContentColor,
unselectedContentColor = unselectedContentColor,

View File

@ -11,8 +11,6 @@ package org.mifospay.core.ui.utility
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material3.AssistChip
import androidx.compose.material3.AssistChipDefaults
import androidx.compose.material3.Icon
@ -23,6 +21,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import org.mifospay.core.designsystem.icon.MifosIcons
@Composable
fun AddCardChip(
@ -46,7 +45,7 @@ fun AddCardChip(
},
leadingIcon = {
Icon(
imageVector = Icons.Filled.Add,
imageVector = MifosIcons.Add,
contentDescription = stringResource(btnText),
modifier = Modifier.size(16.dp),
tint = MaterialTheme.colorScheme.onPrimary,

View File

@ -18,7 +18,6 @@ android {
dependencies {
implementation(projects.core.data)
// TODO:: this should be removed
implementation(libs.compose.material)
// implementation(projects.feature.upiSetup)
implementation(projects.libs.pullrefresh)
}

View File

@ -17,12 +17,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Info
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@ -36,8 +30,12 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.mifos.library.pullrefresh.PullRefreshIndicator
import com.mifos.library.pullrefresh.pullRefresh
import com.mifos.library.pullrefresh.rememberPullRefreshState
import com.mifospay.core.model.domain.BankAccountDetails
import org.mifospay.core.designsystem.component.MfLoadingWheel
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.core.ui.EmptyContentScreen
import org.mifospay.core.ui.utility.AddCardChip
@ -70,7 +68,6 @@ fun AccountsScreen(
)
}
@OptIn(ExperimentalMaterialApi::class)
@Composable
private fun AccountScreen(
accountsUiState: AccountsUiState,
@ -97,7 +94,7 @@ private fun AccountScreen(
subTitle = stringResource(id = R.string.feature_accounts_unexpected_error_subtitle),
modifier = Modifier,
iconTint = MaterialTheme.colorScheme.onSurface,
iconImageVector = Icons.Rounded.Info,
iconImageVector = MifosIcons.Info,
)
}

View File

@ -17,9 +17,6 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ChevronRight
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@ -31,7 +28,9 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.mifospay.core.model.domain.BankAccountDetails
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.component.MifosTopBar
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.feature.bank.accounts.R
@Composable
@ -194,7 +193,7 @@ private fun BankAccountDetailButton(
hasTrailingIcon: Boolean = false,
) {
if (isUpiEnabled) {
Button(
MifosButton(
onClick = { onClick.invoke() },
colors = ButtonDefaults.buttonColors(MaterialTheme.colorScheme.primary),
modifier = modifier
@ -213,7 +212,7 @@ private fun BankAccountDetailButton(
)
if (hasTrailingIcon) {
Icon(
imageVector = Icons.Filled.ChevronRight,
imageVector = MifosIcons.ChevronRight,
contentDescription = null,
tint = MaterialTheme.colorScheme.onPrimary,
)

View File

@ -28,8 +28,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Search
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
@ -183,7 +181,7 @@ private fun BankListScreenContent(
.fillMaxWidth()
.padding(horizontal = 16.dp),
trailingIcon = {
Icon(imageVector = Icons.Filled.Search, contentDescription = null)
Icon(imageVector = MifosIcons.Search, contentDescription = null)
},
)

View File

@ -22,9 +22,7 @@ android {
dependencies {
implementation(projects.core.data)
implementation(libs.compose.country.code.picker)
// TODO:: this should be removed
implementation(libs.compose.material)
implementation(projects.libs.countryCodePicker)
// Credentials Manager
implementation(libs.androidx.credentials)

View File

@ -23,11 +23,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Visibility
import androidx.compose.material.icons.filled.VisibilityOff
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@ -51,7 +46,9 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import org.mifospay.core.designsystem.component.MfOverlayLoadingWheel
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.component.MifosOutlinedTextField
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.core.designsystem.theme.MifosTheme
import org.mifospay.core.designsystem.theme.grey
import org.mifospay.core.designsystem.theme.styleNormal18sp
@ -161,20 +158,19 @@ private fun LoginScreenContent(
},
trailingIcon = {
val image = if (passwordVisibility) {
Icons.Filled.Visibility
MifosIcons.Visibility
} else {
Icons.Filled.VisibilityOff
MifosIcons.VisibilityOff
}
IconButton(onClick = { passwordVisibility = !passwordVisibility }) {
Icon(imageVector = image, null)
}
},
)
Button(
MifosButton(
modifier = Modifier
.fillMaxWidth()
.padding(top = 16.dp),
colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.primary),
enabled = userName.text.isNotEmpty() && password.text.isNotEmpty(),
onClick = {
login.invoke(userName.text, password.text)

View File

@ -22,10 +22,8 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@ -43,8 +41,9 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.togitech.ccp.component.TogiCountryCodePicker
import com.mifos.library.countrycodepicker.CountryCodePicker
import org.mifospay.common.Constants
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.component.MifosLoadingWheel
import org.mifospay.core.designsystem.component.MifosOutlinedTextField
import org.mifospay.core.designsystem.theme.MifosTheme
@ -167,11 +166,11 @@ private fun MobileVerificationScreen(
}
}
Button(
MifosButton(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 32.dp, vertical = 16.dp),
colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.primary),
color = MaterialTheme.colorScheme.primary,
enabled = if (uiState == MobileVerificationUiState.VerifyPhone) {
isNumberValid
} else {
@ -204,10 +203,10 @@ private fun EnterPhoneScreen(
modifier: Modifier = Modifier,
) {
val keyboardController = LocalSoftwareKeyboardController.current
TogiCountryCodePicker(
CountryCodePicker(
modifier = modifier,
shape = RoundedCornerShape(8.dp),
colors = TextFieldDefaults.outlinedTextFieldColors(
colors = OutlinedTextFieldDefaults.colors(
focusedBorderColor = MaterialTheme.colorScheme.primary,
),
onValueChange = { (code, phone), isValid ->

View File

@ -21,8 +21,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api
@ -53,6 +51,7 @@ import org.mifospay.core.data.util.Constants.MIFOS_MERCHANT_SAVINGS_PRODUCT_ID
import org.mifospay.core.designsystem.component.MfOutlinedTextField
import org.mifospay.core.designsystem.component.MfOverlayLoadingWheel
import org.mifospay.core.designsystem.component.MfPasswordTextField
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.theme.styleMedium16sp
import org.mifospay.feature.auth.R
import org.mifospay.feature.auth.utils.ValidateUtil.isValidEmail
@ -333,12 +332,11 @@ private fun SignupScreenContent(
selectedState = it
}
HorizontalDivider(thickness = 24.dp, color = Color.White)
Button(
modifier =
Modifier
MifosButton(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.primary),
color = MaterialTheme.colorScheme.primary,
enabled = true,
onClick = {
validateAllFields()

View File

@ -32,7 +32,6 @@ import androidx.compose.material3.CheckboxDefaults
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@ -63,6 +62,8 @@ import org.mifospay.common.Constants
import org.mifospay.core.data.util.Constants.MIFOS_CONSUMER_SAVINGS_PRODUCT_ID
import org.mifospay.core.data.util.Constants.MIFOS_MERCHANT_SAVINGS_PRODUCT_ID
import org.mifospay.core.designsystem.component.MifosBottomSheet
import org.mifospay.core.designsystem.component.MifosOutlinedButton
import org.mifospay.core.designsystem.theme.MifosTheme
import org.mifospay.feature.auth.R
const val TAG = "Social Login"
@ -215,14 +216,16 @@ private fun SignupMethodContentScreen(
modifier = Modifier.padding(top = 16.dp),
text = stringResource(id = R.string.feature_auth_create_an_account),
)
OutlinedButton(
MifosOutlinedButton(
modifier = Modifier.padding(top = 48.dp),
onClick = {
onSignUpAsMerchant.invoke(checkedGoogleAccountState)
},
border = BorderStroke(1.dp, Color.LightGray),
shape = RoundedCornerShape(4.dp),
colors = ButtonDefaults.outlinedButtonColors(contentColor = MaterialTheme.colorScheme.primary),
colors = ButtonDefaults.outlinedButtonColors(
contentColor = MaterialTheme.colorScheme.primary,
),
) {
Text(
text = stringResource(id = R.string.feature_auth_sign_up_as_merchant).uppercase(),
@ -254,14 +257,16 @@ private fun SignupMethodContentScreen(
thickness = 1.dp,
)
}
OutlinedButton(
MifosOutlinedButton(
modifier = Modifier.padding(top = 24.dp),
onClick = {
onSignupAsCustomer.invoke(checkedGoogleAccountState)
},
border = BorderStroke(1.dp, Color.LightGray),
shape = RoundedCornerShape(4.dp),
colors = ButtonDefaults.outlinedButtonColors(contentColor = MaterialTheme.colorScheme.primary),
colors = ButtonDefaults.outlinedButtonColors(
contentColor = MaterialTheme.colorScheme.primary,
),
) {
Text(
text = stringResource(id = R.string.feature_auth_sign_up_as_customer).uppercase(),
@ -322,7 +327,11 @@ private fun GoogleIdTokenCredential?.signUpWithMifos(
@Preview
@Composable
private fun SignupMethodContentScreenPreview() {
MaterialTheme {
SignupMethodContentScreen(true, {}, {})
MifosTheme {
SignupMethodContentScreen(
showProgress = true,
onSignUpAsMerchant = {},
onSignupAsCustomer = {},
)
}
}

View File

@ -21,10 +21,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Info
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@ -47,7 +43,9 @@ import com.mifospay.core.model.domain.Transaction
import com.mifospay.core.model.domain.TransactionType
import com.mifospay.core.model.entity.accounts.savings.TransferDetail
import org.mifospay.core.designsystem.component.MifosBottomSheet
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.component.MifosLoadingWheel
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.core.designsystem.theme.lightGrey
import org.mifospay.core.ui.EmptyContentScreen
import org.mifospay.core.ui.TransactionItemScreen
@ -89,7 +87,7 @@ private fun HistoryScreen(
subTitle = stringResource(id = R.string.feature_history_empty_no_transaction_history_title),
modifier = Modifier,
iconTint = MaterialTheme.colorScheme.primary,
iconImageVector = Icons.Rounded.Info,
iconImageVector = MifosIcons.Info,
)
}
@ -99,7 +97,7 @@ private fun HistoryScreen(
subTitle = stringResource(id = R.string.feature_history_unexpected_error_subtitle),
modifier = Modifier,
iconTint = MaterialTheme.colorScheme.primary,
iconImageVector = Icons.Rounded.Info,
iconImageVector = MifosIcons.Info,
)
}
@ -183,13 +181,13 @@ private fun Chip(
) {
val context = LocalContext.current
val backgroundColor = if (selected) MaterialTheme.colorScheme.primary else lightGrey
Button(
MifosButton(
modifier = modifier,
onClick = {
onClick()
Toast.makeText(context, label, Toast.LENGTH_SHORT).show()
},
colors = ButtonDefaults.buttonColors(backgroundColor),
color = backgroundColor,
) {
Text(
modifier = Modifier.padding(top = 4.dp, bottom = 4.dp, start = 16.dp, end = 16.dp),

View File

@ -20,15 +20,13 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Info
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
@ -42,7 +40,6 @@ import com.mifospay.core.model.domain.Transaction
import com.mifospay.core.model.domain.TransactionType
import com.mifospay.core.model.domain.client.Client
import com.mifospay.core.model.entity.accounts.savings.SavingAccount
import org.mifospay.common.Utils.toArrayList
import org.mifospay.core.designsystem.component.MfLoadingWheel
import org.mifospay.core.designsystem.component.MifosScaffold
import org.mifospay.core.designsystem.icon.MifosIcons
@ -56,22 +53,15 @@ import org.mifospay.feature.history.R
@Composable
internal fun SpecificTransactionsScreen(
accountNumber: String,
transactions: List<Transaction>,
backPress: () -> Unit,
transactionItemClicked: (String) -> Unit,
modifier: Modifier = Modifier,
viewModel: SpecificTransactionsViewModel = hiltViewModel(),
) {
val uiState = viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(key1 = Unit) {
viewModel.setArguments(transactions.toArrayList(), accountNumber)
viewModel.getSpecificTransactions()
}
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
SpecificTransactionsScreen(
uiState = uiState.value,
uiState = uiState,
backPress = backPress,
transactionItemClicked = transactionItemClicked,
modifier = modifier,
@ -115,7 +105,7 @@ internal fun SpecificTransactionsScreen(
subTitle = stringResource(id = R.string.feature_history_no_transactions_found),
modifier = Modifier,
iconTint = MaterialTheme.colorScheme.onSurface,
iconImageVector = Icons.Rounded.Info,
iconImageVector = MifosIcons.Info,
)
} else {
SpecificTransactionsContent(

View File

@ -9,38 +9,44 @@
*/
package org.mifospay.feature.specific.transactions
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import com.mifospay.core.model.domain.Transaction
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import org.mifospay.core.data.base.TaskLooper
import org.mifospay.core.data.base.UseCase
import org.mifospay.core.data.base.UseCaseFactory
import org.mifospay.core.data.domain.usecase.account.FetchAccountTransfer
import org.mifospay.core.data.util.Constants
import org.mifospay.feature.specific.transactions.SpecificTransactionsUiState.Loading
import org.mifospay.feature.specific.transactions.navigation.ACCOUNT_NUMBER_ARG
import org.mifospay.feature.specific.transactions.navigation.TRANSACTIONS_ARG
import javax.inject.Inject
@HiltViewModel
class SpecificTransactionsViewModel @Inject constructor(
private val mUseCaseFactory: UseCaseFactory,
private var mTaskLooper: TaskLooper? = null,
savedStateHandle: SavedStateHandle,
) : ViewModel() {
private val _uiState: MutableStateFlow<SpecificTransactionsUiState> =
MutableStateFlow(SpecificTransactionsUiState.Loading)
val uiState get() = _uiState
private val _uiState: MutableStateFlow<SpecificTransactionsUiState> = MutableStateFlow(Loading)
val uiState = _uiState.asStateFlow()
private val _transactions: MutableStateFlow<ArrayList<Transaction>> =
MutableStateFlow(ArrayList())
private val transactions get() = _transactions
private val _accountNumber: MutableStateFlow<String> = MutableStateFlow("")
private val accountNumber get() = _accountNumber
fun getSpecificTransactions(): ArrayList<Transaction> {
val transactions = transactions.value
val accountNumber = accountNumber.value
init {
savedStateHandle.get<String>(ACCOUNT_NUMBER_ARG)?.let { accountNumber ->
savedStateHandle.get<ArrayList<Transaction>>(TRANSACTIONS_ARG)?.let { transactions ->
getSpecificTransactions(accountNumber, transactions)
}
}
}
private fun getSpecificTransactions(
accountNumber: String,
transactions: ArrayList<Transaction>,
): ArrayList<Transaction> {
val specificTransactions = ArrayList<Transaction>()
if (transactions.size > 0) {
for (i in transactions.indices) {
@ -56,44 +62,41 @@ class SpecificTransactionsViewModel @Inject constructor(
),
)
}
mTaskLooper!!.listen(object : TaskLooper.Listener {
override fun <R : UseCase.ResponseValue?> onTaskSuccess(
taskData: TaskLooper.TaskData,
response: R,
) {
when (taskData.taskName) {
org.mifospay.common.Constants.TRANSFER_DETAILS -> {
val responseValue = response as FetchAccountTransfer.ResponseValue
val index = taskData.taskId
transactions[index].transferDetail = responseValue.transferDetail
mTaskLooper!!.listen(
object : TaskLooper.Listener {
override fun <R : UseCase.ResponseValue?> onTaskSuccess(
taskData: TaskLooper.TaskData,
response: R,
) {
when (taskData.taskName) {
org.mifospay.common.Constants.TRANSFER_DETAILS -> {
val responseValue = response as FetchAccountTransfer.ResponseValue
val index = taskData.taskId
transactions[index].transferDetail = responseValue.transferDetail
}
}
}
}
override fun onComplete() {
for (transaction in transactions) {
if (
transaction.transferDetail.fromAccount.accountNo == accountNumber ||
transaction.transferDetail.toAccount.accountNo == accountNumber
) {
specificTransactions.add(transaction)
override fun onComplete() {
for (transaction in transactions) {
if (
transaction.transferDetail.fromAccount.accountNo == accountNumber ||
transaction.transferDetail.toAccount.accountNo == accountNumber
) {
specificTransactions.add(transaction)
}
}
_uiState.value = SpecificTransactionsUiState.Success(specificTransactions)
}
_uiState.value = SpecificTransactionsUiState.Success(specificTransactions)
}
override fun onFailure(message: String?) {
_uiState.value = SpecificTransactionsUiState.Error
}
})
override fun onFailure(message: String?) {
_uiState.value = SpecificTransactionsUiState.Error
}
},
)
}
return specificTransactions
}
fun setArguments(transactions: ArrayList<Transaction>, accountNumber: String) {
_accountNumber.value = accountNumber
_transactions.value = transactions
}
}
sealed class SpecificTransactionsUiState {

View File

@ -17,30 +17,28 @@ import androidx.navigation.NavType
import androidx.navigation.compose.composable
import androidx.navigation.navArgument
import com.mifospay.core.model.domain.Transaction
import org.mifospay.common.Constants
import org.mifospay.feature.specific.transactions.SpecificTransactionsScreen
const val SPECIFIC_TRANSACTIONS_ROUTE = "specific_transactions_route"
const val SPECIFIC_TRANSACTIONS_BASE_ROUTE = "specific_transactions_route"
const val ACCOUNT_NUMBER_ARG = "accountNumber"
const val TRANSACTIONS_ARG = "transactions"
const val SPECIFIC_TRANSACTIONS_ROUTE = SPECIFIC_TRANSACTIONS_BASE_ROUTE +
"?${ACCOUNT_NUMBER_ARG}={$ACCOUNT_NUMBER_ARG}" +
"&${TRANSACTIONS_ARG}={$TRANSACTIONS_ARG}"
fun NavGraphBuilder.specificTransactionsScreen(
onBackClick: () -> Unit,
onTransactionItemClicked: (String) -> Unit,
) {
composable(
route = "$SPECIFIC_TRANSACTIONS_ROUTE?${Constants.ACCOUNT_NUMBER}={accountNumber}&${Constants.TRANSACTIONS}={transactions}",
route = SPECIFIC_TRANSACTIONS_ROUTE,
arguments = listOf(
navArgument(Constants.ACCOUNT_NUMBER) { type = NavType.StringType },
navArgument(Constants.TRANSACTIONS) { type = NavType.StringType },
navArgument(ACCOUNT_NUMBER_ARG) { type = NavType.StringType },
navArgument(ACCOUNT_NUMBER_ARG) { type = NavType.StringType },
),
) { backStackEntry ->
val accountNumber = backStackEntry.arguments?.getString(Constants.ACCOUNT_NUMBER) ?: ""
val transactions =
backStackEntry.arguments?.getParcelableArrayList<Transaction>(Constants.TRANSACTIONS)
?: arrayListOf()
) {
SpecificTransactionsScreen(
accountNumber = accountNumber,
transactions = transactions.toList(),
backPress = onBackClick,
transactionItemClicked = onTransactionItemClicked,
)
@ -51,5 +49,5 @@ fun NavController.navigateToSpecificTransactions(
accountNumber: String,
transactions: ArrayList<Transaction>,
) {
this.navigate("$SPECIFIC_TRANSACTIONS_ROUTE?${Constants.ACCOUNT_NUMBER}=$accountNumber&${Constants.TRANSACTIONS}=$transactions")
this.navigate("$SPECIFIC_TRANSACTIONS_BASE_ROUTE?${ACCOUNT_NUMBER_ARG}=$accountNumber&${TRANSACTIONS_ARG}=$transactions")
}

View File

@ -18,10 +18,13 @@ android {
dependencies {
implementation(projects.core.data)
implementation(libs.compose.material)
implementation(projects.libs.countryCodePicker)
implementation(projects.libs.pullrefresh)
implementation(libs.sheets.compose.dialogs.core)
implementation(libs.sheets.compose.dialogs.calender)
implementation(libs.compose.country.code.picker)
// TODO:: this should be removed
implementation(libs.squareup.okhttp)
}

View File

@ -22,14 +22,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.rounded.Info
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@ -51,8 +43,13 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.mifos.library.pullrefresh.PullRefreshIndicator
import com.mifos.library.pullrefresh.pullRefresh
import com.mifos.library.pullrefresh.rememberPullRefreshState
import com.mifospay.core.model.entity.kyc.KYCLevel1Details
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.component.MifosOverlayLoadingWheel
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.core.ui.EmptyContentScreen
import org.mifospay.kyc.R
@ -87,7 +84,6 @@ fun KYCScreen(
)
}
@OptIn(ExperimentalMaterialApi::class)
@Composable
private fun KYCDescriptionScreen(
kUiState: KYCDescriptionUiState,
@ -114,7 +110,7 @@ private fun KYCDescriptionScreen(
subTitle = stringResource(id = R.string.feature_kyc_unexpected_error_subtitle),
modifier = Modifier,
iconTint = MaterialTheme.colorScheme.primary,
iconImageVector = Icons.Rounded.Info,
iconImageVector = MifosIcons.Info,
)
}
@ -224,7 +220,7 @@ private fun ButtonComponent(
onButtonClicked: () -> Unit,
modifier: Modifier = Modifier,
) {
Button(
MifosButton(
modifier = modifier
.width(130.dp)
.heightIn(38.dp)
@ -269,7 +265,7 @@ private fun IconComponent(
.height(23.dp),
) {
Icon(
Icons.Filled.Check,
imageVector = MifosIcons.Check,
contentDescription = stringResource(R.string.feature_kyc_check),
modifier = Modifier
.size(20.dp),

View File

@ -20,10 +20,9 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@ -46,8 +45,9 @@ import com.maxkeppeler.sheets.calendar.CalendarDialog
import com.maxkeppeler.sheets.calendar.models.CalendarConfig
import com.maxkeppeler.sheets.calendar.models.CalendarSelection
import com.maxkeppeler.sheets.calendar.models.CalendarStyle
import com.togitech.ccp.component.TogiCountryCodePicker
import com.mifos.library.countrycodepicker.CountryCodePicker
import org.mifospay.core.designsystem.component.MfOverlayLoadingWheel
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.component.MifosOutlinedTextField
import org.mifospay.core.designsystem.theme.MifosTheme
import org.mifospay.kyc.R
@ -187,10 +187,10 @@ private fun Kyc1Form(
.padding(vertical = 7.dp),
) {
val keyboardController = LocalSoftwareKeyboardController.current
TogiCountryCodePicker(
CountryCodePicker(
modifier = Modifier,
shape = RoundedCornerShape(3.dp),
colors = TextFieldDefaults.outlinedTextFieldColors(
colors = OutlinedTextFieldDefaults.colors(
focusedBorderColor = MaterialTheme.colorScheme.primary,
),
onValueChange = { (code, phone), isValid ->
@ -236,7 +236,7 @@ private fun Kyc1Form(
)
}
Button(
MifosButton(
onClick = {
submitData(kycDetails)
},

View File

@ -26,7 +26,6 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarDuration
@ -46,7 +45,6 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
@ -55,9 +53,11 @@ import androidx.core.content.ContextCompat
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import kotlinx.coroutines.launch
import org.mifospay.core.designsystem.component.MfOverlayLoadingWheel
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.component.MifosOutlinedTextField
import org.mifospay.core.designsystem.theme.MifosTheme
import org.mifospay.kyc.R
@ -269,7 +269,7 @@ private fun Kyc2Form(
)
Row {
Button(
MifosButton(
onClick = {
if (storagePermissionGranted) {
docLauncher.launch(arrayOf("application/pdf", "image/*"))
@ -294,7 +294,7 @@ private fun Kyc2Form(
}
}
Button(
MifosButton(
modifier = Modifier.align(Alignment.CenterHorizontally),
onClick = {
result?.let { uri ->

View File

@ -14,7 +14,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@ -29,6 +28,7 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import org.mifospay.core.designsystem.component.MfOverlayLoadingWheel
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.component.MifosOutlinedTextField
import org.mifospay.core.designsystem.theme.MifosTheme
import org.mifospay.kyc.R
@ -91,7 +91,7 @@ private fun Kyc3Form(
.padding(vertical = 8.dp),
)
Button(
MifosButton(
onClick = {},
modifier = Modifier
.align(Alignment.CenterHorizontally)

View File

@ -1,136 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/levelcontainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/feature_kyc_value_40dp"
android:text="@string/feature_kyc_complete_kyc"
android:textAlignment="center"
android:textSize="@dimen/feature_kyc_value_15sp" />
<LinearLayout
android:id="@+id/lv1"
android:layout_width="match_parent"
android:layout_height="@dimen/feature_kyc_value_70dp"
android:layout_marginTop="130dp">
<Button
android:id="@+id/blv1"
style="@style/Widget.MaterialComponents.Button"
android:background="@color/feature_kyc_colorAccent"
android:layout_width="@dimen/feature_kyc_value_100dp"
android:layout_height="@dimen/feature_kyc_value_50dp"
android:layout_marginLeft="@dimen/feature_kyc_value_20dp"
android:layout_marginRight="@dimen/feature_kyc_value_50dp"
android:text="@string/feature_kyc_level_1" />
<ImageView
android:id="@+id/tickimg1"
android:layout_width="@dimen/feature_kyc_value_20sp"
android:layout_height="@dimen/feature_kyc_value_20sp"
android:layout_marginTop="@dimen/feature_kyc_value_13sp"
/>
<TextView
android:id="@+id/completedtx1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/feature_kyc_value_20dp"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/lv2"
android:layout_width="match_parent"
android:layout_height="@dimen/feature_kyc_value_70dp"
android:layout_marginTop="210dp">
<Button
android:id="@+id/blv2"
style="@style/Widget.MaterialComponents.Button"
android:layout_width="@dimen/feature_kyc_value_100dp"
android:layout_height="@dimen/feature_kyc_value_50dp"
android:layout_marginLeft="@dimen/feature_kyc_value_20dp"
android:layout_marginRight="@dimen/feature_kyc_value_50dp"
android:text="@string/feature_kyc_level_2" />
<ImageView
android:id="@+id/tickimg2"
android:layout_width="@dimen/feature_kyc_value_20sp"
android:layout_height="@dimen/feature_kyc_value_20sp"
android:layout_marginTop="@dimen/feature_kyc_value_13sp" />
<TextView
android:id="@+id/completedtx2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/feature_kyc_value_20dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/lv3"
android:layout_width="match_parent"
android:layout_height="@dimen/feature_kyc_value_70dp"
android:layout_marginTop="290dp">
<Button
android:id="@+id/blv3"
style="@style/Widget.MaterialComponents.Button"
android:layout_width="@dimen/feature_kyc_value_100dp"
android:layout_height="@dimen/feature_kyc_value_50dp"
android:layout_marginLeft="@dimen/feature_kyc_value_20dp"
android:layout_marginRight="@dimen/feature_kyc_value_50dp"
android:text="@string/feature_kyc_level_3" />
<ImageView
android:id="@+id/tickimg3"
android:layout_width="@dimen/feature_kyc_value_20sp"
android:layout_height="@dimen/feature_kyc_value_20sp"
android:layout_marginTop="@dimen/feature_kyc_value_13sp" />
<TextView
android:id="@+id/completedtx3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/feature_kyc_value_20dp" />
</LinearLayout>
</FrameLayout>
<ProgressBar
android:id="@+id/pb_kyc"
style="@style/Widget.AppCompat.ProgressBar"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<include
android:id="@+id/inc_state_view"
layout="@layout/feature_kyc_placeholder_state"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="@dimen/feature_kyc_marginItemsInSectionLarge"
android:visibility="gone" />
</layout>

View File

@ -1,51 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:id="@+id/llPlaceHolderState"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_empty_no_transaction_history"
android:layout_width="@dimen/feature_kyc_emptyStateImageSize"
android:layout_height="@dimen/feature_kyc_emptyStateImageSize"
android:scaleType="fitCenter"
app:srcCompat="@drawable/feature_kyc_ic_error_state"
android:contentDescription="@string/feature_kyc_content_description_placeholder" />
<TextView
android:id="@+id/tv_empty_no_transaction_history_title"
android:layout_marginTop="@dimen/feature_kyc_marginItemsInSectionLarge"
android:text="@string/feature_kyc_error_oops"
android:textColor="@color/feature_kyc_colorTextPrimary"
android:textSize="@dimen/feature_kyc_textBody1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_empty_no_transaction_history_subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/feature_kyc_marginItemsInSectionLarge"
android:layout_marginTop="8dp"
android:layout_marginRight="@dimen/feature_kyc_marginItemsInSectionLarge"
android:layout_marginBottom="@dimen/feature_kyc_marginItemsInSectionLarge"
android:text="@string/feature_kyc_unexpected_error_subtitle"
android:textAlignment="center"
android:textColor="@color/feature_kyc_colorTextSecondary"
android:textSize="@dimen/feature_kyc_textBody2" />
</LinearLayout>
</layout>

View File

@ -20,7 +20,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material3.BottomSheetDefaults
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@ -45,6 +44,7 @@ import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import org.mifospay.common.Constants
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.component.MifosLoadingWheel
@Composable
@ -246,7 +246,7 @@ private fun MakeTransferContent(
.fillMaxWidth(),
horizontalArrangement = Arrangement.End,
) {
Button(
MifosButton(
onClick = onCloseBottomSheet,
modifier = Modifier
.width(100.dp)
@ -257,7 +257,7 @@ private fun MakeTransferContent(
Spacer(modifier = Modifier.width(20.dp))
Button(
MifosButton(
onClick = {
makeTransfer(
toClientId,

View File

@ -9,12 +9,12 @@
*/
package org.mifospay.feature.make.transfer.navigation
import androidx.compose.material.navigation.bottomSheet
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
import androidx.navigation.NavType
import androidx.navigation.navArgument
import com.mifos.library.material3.navigation.bottomSheet
import org.mifospay.common.PAYEE_EXTERNAL_ID_ARG
import org.mifospay.common.TRANSFER_AMOUNT_ARG
import org.mifospay.feature.make.transfer.MakeTransferScreenRoute

View File

@ -18,5 +18,5 @@ android {
dependencies {
implementation(projects.core.data)
implementation(libs.compose.material)
implementation(projects.libs.pullrefresh)
}

View File

@ -17,14 +17,6 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.rounded.Info
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@ -46,8 +38,12 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.compose.rememberNavController
import com.mifos.library.pullrefresh.PullRefreshIndicator
import com.mifos.library.pullrefresh.pullRefresh
import com.mifos.library.pullrefresh.rememberPullRefreshState
import com.mifospay.core.model.entity.accounts.savings.SavingsWithAssociations
import org.mifospay.core.designsystem.component.MfLoadingWheel
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.core.designsystem.theme.MifosTheme
import org.mifospay.core.ui.EmptyContentScreen
import org.mifospay.feature.merchants.MerchantUiState
@ -74,7 +70,6 @@ fun MerchantScreen(
)
}
@OptIn(ExperimentalMaterialApi::class)
@Composable
@VisibleForTesting
internal fun MerchantScreen(
@ -99,7 +94,7 @@ internal fun MerchantScreen(
subTitle = stringResource(id = R.string.feature_merchants_empty_no_merchants_subtitle),
modifier = Modifier,
iconTint = MaterialTheme.colorScheme.primary,
iconImageVector = Icons.Rounded.Info,
iconImageVector = MifosIcons.Info,
)
}
@ -109,7 +104,7 @@ internal fun MerchantScreen(
subTitle = stringResource(id = R.string.feature_merchants_unexpected_error_subtitle),
modifier = Modifier,
iconTint = MaterialTheme.colorScheme.primary,
iconImageVector = Icons.Rounded.Info,
iconImageVector = MifosIcons.Info,
)
}
@ -224,7 +219,7 @@ private fun SearchBarScreen(
},
leadingIcon = {
Icon(
imageVector = Icons.Filled.Search,
imageVector = MifosIcons.Search,
contentDescription = stringResource(R.string.feature_merchants_search),
)
},
@ -233,7 +228,7 @@ private fun SearchBarScreen(
onClick = onClearQuery,
) {
Icon(
imageVector = Icons.Filled.Close,
imageVector = MifosIcons.Close,
contentDescription = stringResource(R.string.feature_merchants_close),
)
}

View File

@ -27,7 +27,6 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
@ -60,6 +59,7 @@ import com.mifospay.core.model.entity.accounts.savings.SavingAccount
import org.mifospay.core.designsystem.component.MfLoadingWheel
import org.mifospay.core.designsystem.component.MfOutlinedTextField
import org.mifospay.core.designsystem.component.MifosBottomSheet
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.component.MifosScaffold
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.core.designsystem.theme.ElectricViolet
@ -235,7 +235,7 @@ private fun MerchantBottomSheet(
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
)
Spacer(modifier = Modifier.height(24.dp))
Button(
MifosButton(
onClick = {
checkBalanceAvailability(
merchantName,

View File

@ -18,8 +18,5 @@ android {
dependencies {
implementation(projects.core.data)
implementation(libs.androidx.appcompat)
//we need this for pull to refresh implementation
implementation(libs.compose.material)
implementation(projects.libs.pullrefresh)
}

View File

@ -1,34 +0,0 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package org.mifospay.feature.notification
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import dagger.hilt.android.AndroidEntryPoint
import org.mifospay.core.designsystem.theme.MifosTheme
/**
* This activity is to view notifications record.
* Notifications Datatable is populated automatically by server when an event happens.
* This feature is yet to be implemented on the server side.
*/
@AndroidEntryPoint
class NotificationActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MifosTheme {
NotificationScreen()
}
}
}
}

View File

@ -0,0 +1,26 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package org.mifospay.feature.notification
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
const val NOTIFICATION_ROUTE = "notification_route"
fun NavGraphBuilder.notificationScreen() {
composable(NOTIFICATION_ROUTE) {
NotificationScreen()
}
}
fun NavController.navigateToNotification() {
navigate(NOTIFICATION_ROUTE)
}

View File

@ -18,10 +18,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
@ -38,6 +34,9 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.mifos.library.pullrefresh.PullRefreshIndicator
import com.mifos.library.pullrefresh.pullRefresh
import com.mifos.library.pullrefresh.rememberPullRefreshState
import com.mifospay.core.model.domain.NotificationPayload
import org.mifospay.core.designsystem.component.MfLoadingWheel
import org.mifospay.core.designsystem.component.MifosTopAppBar
@ -61,7 +60,7 @@ fun NotificationScreen(
)
}
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@VisibleForTesting
internal fun NotificationScreen(

View File

@ -33,7 +33,7 @@ class NotificationViewModel @Inject constructor(
private val mNotificationUiState: MutableStateFlow<NotificationUiState> =
MutableStateFlow(Loading)
val notificationUiState: StateFlow<NotificationUiState> = mNotificationUiState
val notificationUiState = mNotificationUiState.asStateFlow()
private val _isRefreshing = MutableStateFlow(false)
val isRefreshing: StateFlow<Boolean> get() = _isRefreshing.asStateFlow()

View File

@ -1,21 +0,0 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<string name="feature_passcode_title">Passcode will be reset, are you sure?</string>
<string name="feature_passcode_cancel">Cancel</string>
<string name="feature_passcode_yes">Yes</string>
<string name="feature_passcode_pref_name">Passcode</string>
<string name="feature_passcode_has_passcode">hasPasscode</string>
<string name="feature_passcode_has_drag_passcode">hasDragPasscode</string>
<string name="feature_passcode">passcode</string>
<string name="feature_passcode_drag_passcode">drag_passcode</string>
<string name="feature_passcode_create_passcode">Create Passcode</string>
<string name="feature_passcode_confirm_passcode">Confirm Passcode</string>
<string name="feature_passcode_enter_your_passcode">Enter your Passcode</string>
<string name="feature_passcode_forgot_passcode">Forgot Passcode</string>
<string name="feature_passcode_delete_passcode">Delete Passcode Key Button</string>
<string name="feature_passcode_drag_guide">Drag your finger here only in one direction.</string>
<string name="feature_passcode_drag_your_pattern">Drag your Pattern</string>
<string name="feature_passcode_exit">Exit</string>
<string name="feature_passcode_skip">Skip</string>
<string name="feature_passcode_login_manually">Forgot Passcode, Login Manually</string>
<string name="feature_passcode_try_again">Try again</string>
<string name="feature_passcode_do_not_match">Passcode do not match!</string>
<string name="feature_passcode_exit_message">Are you sure you want to exit?</string>
</resources>

View File

@ -15,8 +15,6 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.QrCode
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@ -30,6 +28,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.core.designsystem.theme.MifosTheme
@Composable
@ -109,7 +108,7 @@ internal fun RequestScreenContent(
onClick = { showQr(vpa) },
) {
Icon(
imageVector = Icons.Default.QrCode,
imageVector = MifosIcons.QrCode,
tint = MaterialTheme.colorScheme.primary,
contentDescription = stringResource(id = R.string.feature_payments_show_code),
)

View File

@ -23,8 +23,7 @@ android {
dependencies {
implementation(projects.core.data)
implementation(libs.compose.country.code.picker)
// TODO:: this should be removed
implementation(libs.compose.material)
implementation(projects.libs.countryCodePicker)
implementation(libs.coil.kt.compose)
}

View File

@ -19,8 +19,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDropDown
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@ -97,7 +95,7 @@ fun ProfileScreenContent(
)
IconButton(onClick = { showDetails = !showDetails }) {
Icon(
imageVector = Icons.Default.ArrowDropDown,
imageVector = MifosIcons.ArrowDropDown,
tint = MaterialTheme.colorScheme.onSurface,
contentDescription = null,
)

View File

@ -31,11 +31,10 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@ -54,10 +53,11 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.togitech.ccp.component.TogiCountryCodePicker
import com.mifos.library.countrycodepicker.CountryCodePicker
import org.mifospay.core.designsystem.component.MfLoadingWheel
import org.mifospay.core.designsystem.component.MfOutlinedTextField
import org.mifospay.core.designsystem.component.MifosBottomSheet
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.component.MifosDialogBox
import org.mifospay.core.designsystem.component.MifosScaffold
import org.mifospay.core.designsystem.component.PermissionBox
@ -296,13 +296,12 @@ private fun EditProfileScreenContent(
if (LocalInspectionMode.current) {
Text("Placeholder for TogiCountryCodePicker")
} else {
TogiCountryCodePicker(
CountryCodePicker(
modifier = Modifier,
initialPhoneNumber = " ",
autoDetectCode = true,
shape = RoundedCornerShape(3.dp),
colors =
TextFieldDefaults.outlinedTextFieldColors(
colors = OutlinedTextFieldDefaults.colors(
focusedBorderColor = MaterialTheme.colorScheme.onSurface,
),
onValueChange = { (code, phone), isValid ->
@ -414,11 +413,10 @@ private fun EditProfileSaveButton(
buttonText: Int,
modifier: Modifier = Modifier,
) {
Button(
MifosButton(
onClick = onClick,
colors = ButtonDefaults.buttonColors(MaterialTheme.colorScheme.primary),
modifier =
modifier
modifier = modifier
.fillMaxWidth()
.padding(16.dp),
shape = RoundedCornerShape(10.dp),

View File

@ -44,7 +44,6 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
@ -52,6 +51,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.content.ContextCompat
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import org.mifospay.core.designsystem.component.MfLoadingWheel
import org.mifospay.core.designsystem.component.MifosScaffold

View File

@ -7,12 +7,13 @@
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package org.mifospay.feature.request.money
import android.graphics.Bitmap
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@ -40,6 +41,7 @@ import com.google.zxing.WriterException
import com.google.zxing.qrcode.QRCodeWriter
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.theme.green
import org.mifospay.core.designsystem.theme.grey
import org.mifospay.core.designsystem.theme.styleMedium16sp
@ -87,14 +89,13 @@ fun PayVpsMobileScreen(
)
},
)
Button(
MifosButton(
modifier = Modifier
.fillMaxWidth()
.padding(top = 16.dp),
colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.primary),
enabled = amount.isNotEmpty() && description.isNotEmpty(),
onClick = {
},
onClick = {},
) {
Text(
text = "Create Payment Request",

View File

@ -23,10 +23,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.rounded.Info
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.DropdownMenu
@ -55,6 +51,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.mifospay.core.model.entity.savedcards.Card
import org.mifospay.core.designsystem.component.MfLoadingWheel
import org.mifospay.core.designsystem.component.MifosDialogBox
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.core.designsystem.theme.MifosTheme
import org.mifospay.core.ui.EmptyContentScreen
import org.mifospay.core.ui.utility.AddCardChip
@ -158,7 +155,7 @@ internal fun CardsScreen(
subTitle = stringResource(id = R.string.feature_savedcards_unexpected_error_subtitle),
modifier = Modifier,
iconTint = MaterialTheme.colorScheme.primary,
iconImageVector = Icons.Rounded.Info,
iconImageVector = MifosIcons.Info,
)
}
@ -281,7 +278,7 @@ private fun SearchBarScreen(
},
leadingIcon = {
Icon(
imageVector = Icons.Filled.Search,
imageVector = MifosIcons.Search,
contentDescription = stringResource(R.string.feature_savedcards_search),
)
},
@ -290,7 +287,7 @@ private fun SearchBarScreen(
onClick = onClearQuery,
) {
Icon(
imageVector = Icons.Filled.Close,
imageVector = MifosIcons.Close,
contentDescription = stringResource(R.string.feature_savedcards_close),
)
}

View File

@ -9,10 +9,10 @@
*/
package org.mifospay.feature.savedcards.navigation
import androidx.compose.material.navigation.bottomSheet
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
import com.mifos.library.material3.navigation.bottomSheet
import com.mifospay.core.model.entity.savedcards.Card
import org.mifospay.feature.savedcards.AddCardDialogSheet

View File

@ -13,9 +13,9 @@ plugins {
}
android {
namespace = "org.mifos.mobilewallet.mifospay.feature.passcode"
namespace = "org.mifospay.feature.search"
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(projects.core.data)
}

View File

@ -8,7 +8,4 @@
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<integer name="telephone_numbers_max_length_standard">10</integer>
<integer name="bottom_view_transition_duration">200</integer>
</resources>
<manifest />

View File

@ -0,0 +1,28 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package org.mifospay.feature.search
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
const val SEARCH_ROUTE = "search_route"
fun NavGraphBuilder.searchScreen(
onBackClick: () -> Unit,
) {
composable(route = SEARCH_ROUTE) {
SearchScreenRoute(
onBackClick = onBackClick,
)
}
}
fun NavController.navigateToSearch() = navigate(SEARCH_ROUTE)

View File

@ -7,7 +7,7 @@
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package org.mifospay.common.ui
package org.mifospay.feature.search
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@ -41,9 +41,6 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import com.mifospay.core.model.domain.SearchResult
import org.mifospay.R
import org.mifospay.common.presenter.SearchResultState
import org.mifospay.common.presenter.SearchViewModel
import org.mifospay.core.designsystem.component.MfLoadingWheel
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.core.designsystem.theme.MifosTheme
@ -89,7 +86,7 @@ fun SearchScreen(
SearchResultState.Idle -> {}
SearchResultState.Loading -> {
MfLoadingWheel(
contentDesc = stringResource(R.string.feature_accounts_loading),
contentDesc = stringResource(R.string.feature_search_loading),
backgroundColor = MaterialTheme.colorScheme.surface,
)
}
@ -121,10 +118,10 @@ private fun SearchToolbar(
verticalAlignment = Alignment.CenterVertically,
modifier = modifier.fillMaxWidth(),
) {
IconButton(onClick = { onBackClick() }) {
IconButton(onClick = onBackClick) {
Icon(
imageVector = MifosIcons.ArrowBack,
contentDescription = R.string.navigateBack.toString(),
contentDescription = "Back",
)
}
SearchTextField(

View File

@ -7,7 +7,7 @@
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package org.mifospay.common.presenter
package org.mifospay.feature.search
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
@ -23,7 +23,7 @@ import javax.inject.Inject
@HiltViewModel
class SearchViewModel @Inject constructor(
private val mUsecaseHandler: UseCaseHandler,
private val mUseCaseHandler: UseCaseHandler,
private val searchClient: SearchClient,
private val savedStateHandle: SavedStateHandle,
) : ViewModel() {
@ -43,7 +43,7 @@ class SearchViewModel @Inject constructor(
}
private fun performSearch(query: String) {
mUsecaseHandler.execute(
mUseCaseHandler.execute(
searchClient,
SearchClient.RequestValues(query),
object : UseCase.UseCaseCallback<SearchClient.ResponseValue> {

View File

@ -9,6 +9,6 @@
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<dimen name="appBarTopMargin">24dp</dimen>
<string name="feature_search_loading">Loading</string>
</resources>

View File

@ -20,8 +20,7 @@ dependencies {
implementation(projects.core.data)
// we need it for country picker library
implementation(libs.compose.material)
implementation(libs.compose.country.code.picker) // remove after moving auth code to module
implementation(projects.libs.countryCodePicker)
// Google Bar code scanner
implementation(libs.google.play.services.code.scanner)

View File

@ -29,12 +29,10 @@ import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.QrCode2
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -56,13 +54,14 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.google.mlkit.vision.barcode.common.Barcode
import com.google.mlkit.vision.codescanner.GmsBarcodeScannerOptions
import com.google.mlkit.vision.codescanner.GmsBarcodeScanning
import com.togitech.ccp.component.TogiCountryCodePicker
import com.mifos.library.countrycodepicker.CountryCodePicker
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.mifospay.core.designsystem.component.MfOutlinedTextField
import org.mifospay.core.designsystem.component.MfOverlayLoadingWheel
import org.mifospay.core.designsystem.component.MifosButton
import org.mifospay.core.designsystem.component.MifosNavigationTopAppBar
import org.mifospay.core.designsystem.icon.MifosIcons
import org.mifospay.core.designsystem.theme.styleMedium16sp
import org.mifospay.core.designsystem.theme.styleNormal18sp
@ -244,7 +243,7 @@ internal fun SendMoneyScreen(
},
) {
Icon(
imageVector = Icons.Filled.QrCode2,
imageVector = MifosIcons.QrCode2,
contentDescription = "Scan QR",
tint = MaterialTheme.colorScheme.primary,
)
@ -316,11 +315,10 @@ private fun EnterPhoneScreen(
initialPhoneNumber: String? = null,
) {
val keyboardController = LocalSoftwareKeyboardController.current
TogiCountryCodePicker(
CountryCodePicker(
modifier = modifier,
shape = RoundedCornerShape(8.dp),
colors =
TextFieldDefaults.outlinedTextFieldColors(
colors = OutlinedTextFieldDefaults.colors(
focusedBorderColor = MaterialTheme.colorScheme.primary,
),
initialPhoneNumber = initialPhoneNumber,

View File

@ -15,8 +15,6 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Info
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
@ -82,7 +80,7 @@ internal fun StandingInstructionScreen(
subTitle = stringResource(id = R.string.feature_standing_instruction_empty_standing_instructions),
modifier = Modifier,
iconTint = MaterialTheme.colorScheme.primary,
iconImageVector = Icons.Rounded.Info,
iconImageVector = MifosIcons.Info,
)
}

View File

@ -14,7 +14,7 @@ androidxLifecycle = "2.8.4"
androidxComposeMaterial3Adaptive = "1.0.0-rc01"
androidxComposeRuntimeTracing = "1.0.0-beta01"
androidxCoreSplashscreen = "1.0.1"
androidxNavigation = "2.7.7"
androidxNavigation = "2.8.0-rc01"
androidxProfileinstaller = "1.3.1"
androidxTracing = "1.3.0-alpha02"
androidxMetrics = "1.0.0-beta01"
@ -23,73 +23,50 @@ activityVersion = "1.9.1"
androidDesugarJdkLibs = "2.0.4"
androidx-test-ext-junit = "1.2.1"
androidxDataStore = "1.1.1"
coil = "2.6.0"
checkstyleVersion = "10.16.0"
constraintlayoutVersion = "2.1.4"
coreKtxVersion = "1.13.1"
credentialsVersion = "1.2.2"
compose_country_code_picker = "2.2.8"
composeMaterial = "1.6.8"
cameraViewVersion = "1.3.4"
cameraLifecycleVersion = "1.3.4"
dependencyGuard = "0.5.0"
detekt = "1.23.5"
espresso-core = "3.6.1"
firebaseBom = "33.1.2"
firebaseCrashlyticsPlugin = "3.0.2"
fragmentVersion = "1.8.2"
firebasePerfPlugin = "1.4.2"
gmsPlugin = "4.4.2"
googleOss = "17.1.0"
googleOssPlugin = "0.10.6"
googleidVersion = "1.1.1"
hilt = "2.52"
junitVersion = "4.13.2"
kotlin = "2.0.20"
ksp = "2.0.20-1.0.24"
kotlinxDatetime = "0.6.0"
kotlinxSerializationJson = "1.7.1"
kotlinxCoroutines = "1.8.1"
kotlinxImmutable = "0.3.7"
libphonenumberAndroidVersion = "8.13.35"
lifecycleVersion = "2.8.4"
lifecycleExtensionsVersion = "2.2.0"
material = "1.12.0"
moduleGraph = "2.5.0"
materialNavigationVersion = "1.7.0-beta01"
okHttp3Version = "4.12.0"
playServicesAuthVersion = "21.2.0"
playServicesCodeScanner = "16.1.0"
protobuf = "4.26.0"
protobufPlugin = "0.9.4"
retrofitVersion = "2.11.0"
rxandroidVersion = "1.1.0"
rxjavaVersion = "1.3.8"
room = "2.6.1"
roborazzi = "1.26.0"
retrofitKotlinxSerializationJson = "1.0.0"
spotlessVersion = "6.23.3"
swiperefreshLayoutVersion = "1.1.0"
sheets_compose_dialogs_core = "1.3.0"
secrets = "2.0.1"
truth = "1.4.2"
twitter-detekt-compose = "0.0.26"
zxingVersion = "3.5.3"
# Multiplatform Dependencies
compose-plugin = "1.6.11"
@ -97,93 +74,117 @@ compileSdk = "34"
minSdk = "24"
targetSdk = "34"
[bundles]
androidx-compose-ui-test = ["androidx-compose-ui-test", "androidx-compose-ui-test-manifest"]
[libraries]
accompanist-pager = { module = "com.google.accompanist:accompanist-pager", version.ref = "accompanistPagerVersion" }
androidx-activity-ktx = { module = "androidx.activity:activity-ktx", version.ref = "activityVersion" }
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidxActivity" }
androidx-compose-compiler = { module = "androidx.compose.compiler:compiler", version.ref = "androidxComposeCompiler" }
androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompatVersion" }
androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayoutVersion" }
androidx-swiperefresh-layout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swiperefreshLayoutVersion" }
androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "coreKtxVersion" }
androidx-credentials = { module = "androidx.credentials:credentials", version.ref = "credentialsVersion" }
androidx-credentials-play-services-auth = { module = "androidx.credentials:credentials-play-services-auth", version.ref = "credentialsVersion" }
androidx-fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref = "fragmentVersion" }
android-desugarJdkLibs = { group = "com.android.tools", name = "desugar_jdk_libs", version.ref = "androidDesugarJdkLibs" }
androidx-metrics = { group = "androidx.metrics", name = "metrics-performance", version.ref = "androidxMetrics" }
androidx-browser = { group = "androidx.browser", name = "browser", version.ref = "androidxBrowser" }
androidx-core-splashscreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "androidxCoreSplashscreen" }
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "androidxNavigation" }
androidx-navigation-testing = { group = "androidx.navigation", name = "navigation-testing", version.ref = "androidxNavigation" }
androidx-profileinstaller = { group = "androidx.profileinstaller", name = "profileinstaller", version.ref = "androidxProfileinstaller" }
androidx-dataStore-core = { group = "androidx.datastore", name = "datastore", version.ref = "androidxDataStore" }
androidx-tracing-ktx = { group = "androidx.tracing", name = "tracing-ktx", version.ref = "androidxTracing" }
androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" }
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "androidxComposeBom" }
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidxActivity" }
androidx-compose-compiler = { module = "androidx.compose.compiler:compiler", version.ref = "androidxComposeCompiler" }
androidx-compose-material3-adaptive = { group = "androidx.compose.material3.adaptive", name = "adaptive", version.ref = "androidxComposeMaterial3Adaptive" }
androidx-compose-material3-adaptive-layout = { group = "androidx.compose.material3.adaptive", name = "adaptive-layout", version.ref = "androidxComposeMaterial3Adaptive" }
androidx-compose-material3-adaptive-navigation = { group = "androidx.compose.material3.adaptive", name = "adaptive-navigation", version.ref = "androidxComposeMaterial3Adaptive" }
androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" }
androidx-compose-foundation-layout = { group = "androidx.compose.foundation", name = "foundation-layout" }
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" }
compose-material = { group = "androidx.compose.material", name = "material", version.ref = "composeMaterial" }
androidx-compose-material-iconsExtended = { group = "androidx.compose.material", name = "material-icons-extended" }
androidx-compose-material3-windowSizeClass = { group = "androidx.compose.material3", name = "material3-window-size-class" }
androidx-compose-animation = { group = "androidx.compose.animation", name = "animation" }
androidx-compose-ui = { group = "androidx.compose.ui", name = "ui", version.ref="androidxComposeUi" }
androidx-compose-ui-test = { group = "androidx.compose.ui", name = "ui-test-junit4", version.ref = "androidxComposeUiTest" }
androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
androidx-compose-runtime = { group = "androidx.compose.runtime", name = "runtime", version.ref="androidxComposeRuntime" }
androidx-material-navigation = { module = "androidx.compose.material:material-navigation", version.ref = "materialNavigationVersion" }
checkstyle = { module = "com.puppycrawl.tools:checkstyle", version.ref = "checkstyleVersion" }
googleid = { module = "com.google.android.libraries.identity.googleid:googleid", version.ref = "googleidVersion" }
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
hilt-android-testing = { group = "com.google.dagger", name = "hilt-android-testing", version.ref = "hilt" }
hilt-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt" }
androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
androidx-compose-ui-util = { group = "androidx.compose.ui", name = "ui-util", version.ref="androidxComposeUi" }
androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" }
androidx-compose-material-iconsExtended = { group = "androidx.compose.material", name = "material-icons-extended" }
androidx-compose-material3-windowSizeClass = { group = "androidx.compose.material3", name = "material3-window-size-class" }
androidx-compose-material3-adaptive = { group = "androidx.compose.material3.adaptive", name = "adaptive", version.ref = "androidxComposeMaterial3Adaptive" }
androidx-compose-material3-adaptive-layout = { group = "androidx.compose.material3.adaptive", name = "adaptive-layout", version.ref = "androidxComposeMaterial3Adaptive" }
androidx-compose-material3-adaptive-navigation = { group = "androidx.compose.material3.adaptive", name = "adaptive-navigation", version.ref = "androidxComposeMaterial3Adaptive" }
androidx-compose-runtime = { group = "androidx.compose.runtime", name = "runtime", version.ref="androidxComposeRuntime" }
androidx-compose-runtime-tracing = { group = "androidx.compose.runtime", name = "runtime-tracing", version.ref = "androidxComposeRuntimeTracing" }
androidx-hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "androidxHilt" }
androidx-lifecycle-runtimeCompose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "androidxLifecycle" }
androidx-lifecycle-viewModelCompose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "androidxLifecycle" }
androidx-lifecycle-runtimeTesting = { group = "androidx.lifecycle", name = "lifecycle-runtime-testing", version.ref = "androidxLifecycle" }
androidx-lifecycle-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycleVersion" }
androidx-lifecycle-extensions = { module = "androidx.lifecycle:lifecycle-extensions", version.ref = "lifecycleExtensionsVersion" }
play-services-auth = { module = "com.google.android.gms:play-services-auth", version.ref = "playServicesAuthVersion" }
squareup-retrofit2 = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofitVersion" }
squareup-retrofit-adapter-rxjava = { module = "com.squareup.retrofit2:adapter-rxjava", version.ref = "retrofitVersion" }
squareup-retrofit-converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofitVersion" }
squareup-okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okHttp3Version" }
squareup-logging-interceptor = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okHttp3Version" }
reactivex-rxjava-android = { module = "io.reactivex:rxandroid", version.ref = "rxandroidVersion" }
reactivex-rxjava = { module = "io.reactivex:rxjava", version.ref = "rxjavaVersion" }
truth = { group = "com.google.truth", name = "truth", version.ref = "truth" }
junit = { module = "junit:junit", version.ref = "junitVersion" }
google-oss-licenses = { group = "com.google.android.gms", name = "play-services-oss-licenses", version.ref = "googleOss" }
google-oss-licenses-plugin = { group = "com.google.android.gms", name = "oss-licenses-plugin", version.ref = "googleOssPlugin" }
coil-kt = { group = "io.coil-kt", name = "coil", version.ref = "coil" }
coil-kt-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" }
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" }
firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebaseBom" }
firebase-analytics = { group = "com.google.firebase", name = "firebase-analytics-ktx" }
firebase-cloud-messaging = { group = "com.google.firebase", name = "firebase-messaging-ktx" }
firebase-crashlytics = { group = "com.google.firebase", name = "firebase-crashlytics-ktx" }
firebase-performance = { group = "com.google.firebase", name = "firebase-perf-ktx" }
google-oss-licenses = { group = "com.google.android.gms", name = "play-services-oss-licenses", version.ref = "googleOss" }
google-oss-licenses-plugin = { group = "com.google.android.gms", name = "oss-licenses-plugin", version.ref = "googleOssPlugin" }
googleid = { module = "com.google.android.libraries.identity.googleid:googleid", version.ref = "googleidVersion" }
google-play-services-code-scanner = { group = "com.google.android.gms", name = "play-services-code-scanner", version.ref = "playServicesCodeScanner" }
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
hilt-android-testing = { group = "com.google.dagger", name = "hilt-android-testing", version.ref = "hilt" }
hilt-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt" }
junit = { module = "junit:junit", version.ref = "junitVersion" }
kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlin" }
kotlinx-datetime = { group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version.ref = "kotlinxDatetime" }
kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" }
retrofit-kotlin-serialization = { group = "com.jakewharton.retrofit", name = "retrofit2-kotlinx-serialization-converter", version.ref = "retrofitKotlinxSerializationJson" }
kotlinx-coroutines-guava = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-guava", version.ref = "kotlinxCoroutines" }
kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "kotlinxCoroutines" }
kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" }
kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinxCoroutines" }
work-testing = { group = "androidx.work", name = "work-testing", version = "2.8.1" }
androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" }
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
compose-country-code-picker = { group = "com.github.jump-sdk", name = "jetpack_compose_country_code_picker_emoji", version.ref = "compose_country_code_picker" }
sheets-compose-dialogs-core = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "core", version.ref = "sheets_compose_dialogs_core" }
sheets-compose-dialogs-calender = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "calendar", version.ref = "sheets_compose_dialogs_core" }
kotlinx-collections-immutable = { group = "org.jetbrains.kotlinx", name = "kotlinx-collections-immutable", version.ref = "kotlinxImmutable" }
lint-api = { group = "com.android.tools.lint", name = "lint-api", version.ref = "androidTools" }
lint-checks = { group = "com.android.tools.lint", name = "lint-checks", version.ref = "androidTools" }
lint-tests = { group = "com.android.tools.lint", name = "lint-tests", version.ref = "androidTools" }
libphonenumber-android = { module = "io.michaelrocks:libphonenumber-android", version.ref = "libphonenumberAndroidVersion" }
play-services-auth = { module = "com.google.android.gms:play-services-auth", version.ref = "playServicesAuthVersion" }
protobuf-kotlin-lite = { group = "com.google.protobuf", name = "protobuf-kotlin-lite", version.ref = "protobuf" }
protobuf-protoc = { group = "com.google.protobuf", name = "protoc", version.ref = "protobuf" }
androidx-dataStore-core = { group = "androidx.datastore", name = "datastore", version.ref = "androidxDataStore" }
androidx-compose-runtime-tracing = { group = "androidx.compose.runtime", name = "runtime-tracing", version.ref = "androidxComposeRuntimeTracing" }
androidx-core-splashscreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "androidxCoreSplashscreen" }
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "androidxNavigation" }
androidx-navigation-testing = { group = "androidx.navigation", name = "navigation-testing", version.ref = "androidxNavigation" }
androidx-profileinstaller = { group = "androidx.profileinstaller", name = "profileinstaller", version.ref = "androidxProfileinstaller" }
androidx-tracing-ktx = { group = "androidx.tracing", name = "tracing-ktx", version.ref = "androidxTracing" }
coil-kt = { group = "io.coil-kt", name = "coil", version.ref = "coil" }
coil-kt-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" }
androidx-metrics = { group = "androidx.metrics", name = "metrics-performance", version.ref = "androidxMetrics" }
androidx-browser = { group = "androidx.browser", name = "browser", version.ref = "androidxBrowser" }
google-play-services-code-scanner = { group = "com.google.android.gms", name = "play-services-code-scanner", version.ref = "playServicesCodeScanner" }
reactivex-rxjava-android = { module = "io.reactivex:rxandroid", version.ref = "rxandroidVersion" }
reactivex-rxjava = { module = "io.reactivex:rxjava", version.ref = "rxjavaVersion" }
retrofit-kotlin-serialization = { group = "com.jakewharton.retrofit", name = "retrofit2-kotlinx-serialization-converter", version.ref = "retrofitKotlinxSerializationJson" }
sheets-compose-dialogs-core = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "core", version.ref = "sheets_compose_dialogs_core" }
sheets-compose-dialogs-calender = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "calendar", version.ref = "sheets_compose_dialogs_core" }
squareup-retrofit2 = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofitVersion" }
squareup-retrofit-adapter-rxjava = { module = "com.squareup.retrofit2:adapter-rxjava", version.ref = "retrofitVersion" }
squareup-retrofit-converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofitVersion" }
squareup-okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okHttp3Version" }
squareup-logging-interceptor = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okHttp3Version" }
truth = { group = "com.google.truth", name = "truth", version.ref = "truth" }
#Detekt
detekt-formatting = { group = "io.gitlab.arturbosch.detekt", name = "detekt-formatting", version.ref = "detekt" }
@ -210,7 +211,6 @@ android-library = { id = "com.android.library", version.ref = "androidGradlePlug
android-test = { id = "com.android.test", version.ref = "androidGradlePlugin" }
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
detekt-compiler = { id = "io.github.detekt.gradle.compiler-plugin", version.ref = "detekt" }
dependencyGuard = { id = "com.dropbox.dependency-guard", version.ref = "dependencyGuard" }
firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebaseCrashlyticsPlugin" }
firebase-perf = { id = "com.google.firebase.firebase-perf", version.ref = "firebasePerfPlugin" }
@ -222,7 +222,6 @@ kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", versi
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
module-graph = { id = "com.jraska.module.graph.assertion", version.ref = "moduleGraph" }
protobuf = { id = "com.google.protobuf", version.ref = "protobufPlugin" }
roborazzi = { id = "io.github.takahirom.roborazzi", version.ref = "roborazzi" }

1
libs/country-code-picker/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

View File

@ -0,0 +1,5 @@
## A local fork of the country-code-picker library
Source: https://github.com/jump-sdk/jetpack_compose_country_code_picker_emoji
Forked so that we can make use of it while not bringing in m2 dependencies in our project unecessarily

View File

@ -0,0 +1,33 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
plugins {
alias(libs.plugins.mifospay.android.library)
alias(libs.plugins.mifospay.android.library.compose)
}
android {
namespace = "com.mifos.library.countrycodepicker"
}
dependencies {
implementation(libs.androidx.compose.foundation)
implementation(libs.androidx.compose.foundation.layout)
implementation(libs.androidx.compose.material.iconsExtended)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.runtime)
implementation(libs.androidx.compose.ui.util)
implementation(libs.kotlinx.collections.immutable)
implementation(libs.libphonenumber.android)
testImplementation(libs.androidx.compose.ui.test)
androidTestImplementation(libs.androidx.compose.ui.test)
}

View File

@ -8,10 +8,6 @@
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<array name="preloaded_fonts" translatable="false">
<item>@font/montserrat</item>
<item>@font/roboto</item>
<item>@font/roboto_medium</item>
</array>
</resources>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>

View File

@ -0,0 +1,368 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package com.mifos.library.countrycodepicker
import android.content.Context
import android.util.Log
import androidx.compose.foundation.focusable
import androidx.compose.foundation.interaction.InteractionSource
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsFocusedAsState
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Clear
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.Text
import androidx.compose.material3.TextFieldColors
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.autofill.AutofillType
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.mifos.library.countrycodepicker.component.CountryCodeDialog
import com.mifos.library.countrycodepicker.component.autofill
import com.mifos.library.countrycodepicker.data.CountryData
import com.mifos.library.countrycodepicker.data.Iso31661alpha2
import com.mifos.library.countrycodepicker.data.PhoneCode
import com.mifos.library.countrycodepicker.data.utils.ValidatePhoneNumber
import com.mifos.library.countrycodepicker.data.utils.extractCountryCode
import com.mifos.library.countrycodepicker.data.utils.getCountryFromPhoneCode
import com.mifos.library.countrycodepicker.data.utils.getUserIsoCode
import com.mifos.library.countrycodepicker.data.utils.numberHint
import com.mifos.library.countrycodepicker.transformation.PhoneNumberTransformation
import kotlinx.collections.immutable.ImmutableSet
import kotlinx.coroutines.launch
private val DEFAULT_TEXT_FIELD_SHAPE = RoundedCornerShape(24.dp)
private const val TAG = "CountryCodePicker"
/**
* @param onValueChange Called when the text in the text field changes.
* The first parameter is string pair of (country phone code, phone number) and the second parameter is
* a boolean indicating whether the phone number is valid.
* @param modifier Modifier to be applied to the inner OutlinedTextField.
* @param autoDetectCode Boolean indicating if will auto detect the code from initial phone number
* @param enabled Boolean indicating whether the field is enabled.
* @param shape Shape of the text field.
* @param showCountryCode Whether to show the country code in the text field.
* @param showCountryFlag Whether to show the country flag in the text field.
* @param colors TextFieldColors to be used for the text field.
* @param fallbackCountry The country to be used as a fallback if the user's country cannot be determined.
* Defaults to the United States.
* @param showPlaceholder Whether to show the placeholder number hint in the text field.
* @param includeOnly A set of 2 digit country codes to be included in the list of countries.
* Set to null to include all supported countries.
* @param clearIcon ImageVector to be used for the clear button. Set to null to disable the clear button.
* Defaults to Icons.Filled.Clear
* @param initialPhoneNumber an optional phone number to be initial value of the input field
* @param initialCountryIsoCode Optional ISO-3166-1 alpha-2 country code to set the initially selected country.
* Note that if a valid initialCountryPhoneCode is provided, this will be ignored.
* @param initialCountryPhoneCode Optional country phone code to set the initially selected country.
* This takes precedence over [initialCountryIsoCode].
* @param label An optional composable to be used as a label for input field
* @param textStyle An optional [TextStyle] for customizing text style of phone number input field.
* Defaults to MaterialTheme.typography.body1
* @param [keyboardOptions] An optional [KeyboardOptions] to customize keyboard options.
* @param [keyboardActions] An optional [KeyboardActions] to customize keyboard actions.
* @param [showError] Whether to show error on field when number is invalid, default true.
*/
@OptIn(ExperimentalComposeUiApi::class)
@Suppress("LongMethod", "LongParameterList")
@Composable
fun CountryCodePicker(
onValueChange: (Pair<PhoneCode, String>, Boolean) -> Unit,
modifier: Modifier = Modifier,
autoDetectCode: Boolean = false,
enabled: Boolean = true,
shape: Shape = DEFAULT_TEXT_FIELD_SHAPE,
showCountryCode: Boolean = true,
showCountryFlag: Boolean = true,
colors: TextFieldColors = OutlinedTextFieldDefaults.colors(),
fallbackCountry: CountryData = CountryData.UnitedStates,
showPlaceholder: Boolean = true,
includeOnly: ImmutableSet<String>? = null,
clearIcon: ImageVector? = Icons.Filled.Clear,
initialPhoneNumber: String? = null,
initialCountryIsoCode: Iso31661alpha2? = null,
initialCountryPhoneCode: PhoneCode? = null,
label: @Composable (() -> Unit)? = null,
textStyle: TextStyle = LocalTextStyle.current,
keyboardOptions: KeyboardOptions? = null,
keyboardActions: KeyboardActions? = null,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
showError: Boolean = true,
) {
val context = LocalContext.current
val focusRequester = remember { FocusRequester() }
val countryCode = autoDetectedCountryCode(
autoDetectCode = autoDetectCode,
initialPhoneNumber = initialPhoneNumber,
)
val phoneNumberWithoutCode = if (countryCode != null) {
initialPhoneNumber?.replace(countryCode, "")
} else {
initialPhoneNumber
}
var phoneNumber by remember {
mutableStateOf(
TextFieldValue(
text = phoneNumberWithoutCode.orEmpty(),
selection = TextRange(phoneNumberWithoutCode?.length ?: 0),
),
)
}
val keyboardController = LocalSoftwareKeyboardController.current
var country: CountryData by rememberSaveable(
context,
countryCode,
initialCountryPhoneCode,
initialCountryIsoCode,
) {
mutableStateOf(
configureInitialCountry(
initialCountryPhoneCode = countryCode ?: initialCountryPhoneCode,
context = context,
initialCountryIsoCode = initialCountryIsoCode,
fallbackCountry = fallbackCountry,
),
)
}
val phoneNumberTransformation = remember(country) {
PhoneNumberTransformation(country.countryIso, context)
}
val validatePhoneNumber = remember(context) { ValidatePhoneNumber(context) }
var isNumberValid: Boolean by rememberSaveable(country, phoneNumber) {
mutableStateOf(
validatePhoneNumber(
fullPhoneNumber = country.countryPhoneCode + phoneNumber.text,
),
)
}
val coroutineScope = rememberCoroutineScope()
OutlinedTextField(
value = phoneNumber,
onValueChange = { enteredPhoneNumber ->
val preFilteredPhoneNumber = phoneNumberTransformation.preFilter(enteredPhoneNumber)
phoneNumber = TextFieldValue(
text = preFilteredPhoneNumber,
selection = TextRange(preFilteredPhoneNumber.length),
)
isNumberValid = validatePhoneNumber(
fullPhoneNumber = country.countryPhoneCode + phoneNumber.text,
)
onValueChange(country.countryPhoneCode to phoneNumber.text, isNumberValid)
},
modifier = modifier
.fillMaxWidth()
.focusable()
.autofill(
autofillTypes = listOf(AutofillType.PhoneNumberNational),
onFill = { filledPhoneNumber ->
val preFilteredPhoneNumber =
phoneNumberTransformation.preFilter(filledPhoneNumber)
phoneNumber = TextFieldValue(
text = preFilteredPhoneNumber,
selection = TextRange(preFilteredPhoneNumber.length),
)
isNumberValid = validatePhoneNumber(
fullPhoneNumber = country.countryPhoneCode + phoneNumber.text,
)
onValueChange(country.countryPhoneCode to phoneNumber.text, isNumberValid)
keyboardController?.hide()
coroutineScope.launch {
focusRequester.safeFreeFocus()
}
},
focusRequester = focusRequester,
)
.focusRequester(focusRequester = focusRequester),
enabled = enabled,
textStyle = textStyle,
label = label,
placeholder = {
if (showPlaceholder) {
PlaceholderNumberHint(country.countryIso)
}
},
leadingIcon = {
CountryCodeDialog(
selectedCountry = country,
includeOnly = includeOnly,
onCountryChange = { countryData ->
country = countryData
isNumberValid = validatePhoneNumber(
fullPhoneNumber = country.countryPhoneCode + phoneNumber.text,
)
onValueChange(country.countryPhoneCode to phoneNumber.text, isNumberValid)
},
showCountryCode = showCountryCode,
showFlag = showCountryFlag,
textStyle = textStyle,
)
},
trailingIcon = {
if (clearIcon != null) {
ClearIconButton(
imageVector = clearIcon,
colors = colors,
isNumberValid = !showError || isNumberValid,
) {
phoneNumber = TextFieldValue("")
isNumberValid = false
onValueChange(country.countryPhoneCode to phoneNumber.text, isNumberValid)
}
}
},
isError = showError && !isNumberValid,
interactionSource = interactionSource,
visualTransformation = phoneNumberTransformation,
keyboardOptions = keyboardOptions ?: KeyboardOptions.Default.copy(
keyboardType = KeyboardType.Phone,
autoCorrect = true,
imeAction = ImeAction.Done,
),
keyboardActions = keyboardActions ?: KeyboardActions(
onDone = {
keyboardController?.hide()
coroutineScope.launch {
focusRequester.safeFreeFocus()
}
},
),
singleLine = true,
shape = shape,
colors = colors,
)
}
private fun configureInitialCountry(
initialCountryPhoneCode: PhoneCode?,
context: Context,
initialCountryIsoCode: Iso31661alpha2?,
fallbackCountry: CountryData,
): CountryData {
if (initialCountryPhoneCode?.run { !startsWith("+") } == true) {
Log.e(TAG, "initialCountryPhoneCode must start with +")
}
return initialCountryPhoneCode?.let { getCountryFromPhoneCode(it, context) }
?: CountryData.entries.firstOrNull { it.countryIso == initialCountryIsoCode }
?: CountryData.isoMap[getUserIsoCode(context)]
?: fallbackCountry
}
private fun FocusRequester.safeFreeFocus() {
try {
this.freeFocus()
} catch (exception: IllegalStateException) {
Log.e(TAG, "Unable to free focus", exception)
}
}
@Composable
private fun PlaceholderNumberHint(countryIso: Iso31661alpha2) {
Text(
text = stringResource(
id = numberHint.getOrDefault(countryIso, R.string.unknown),
),
)
}
@Composable
private fun ClearIconButton(
imageVector: ImageVector,
colors: TextFieldColors,
isNumberValid: Boolean,
onClick: () -> Unit,
) = IconButton(onClick = onClick) {
Icon(
imageVector = imageVector,
contentDescription = stringResource(id = R.string.clear),
tint = colors.trailingIconColor(
enabled = true,
isError = !isNumberValid,
interactionSource = remember { MutableInteractionSource() },
).value,
)
}
@Composable
private fun autoDetectedCountryCode(autoDetectCode: Boolean, initialPhoneNumber: String?): String? =
if (initialPhoneNumber?.startsWith("+") == true && autoDetectCode) {
extractCountryCode(initialPhoneNumber)
} else {
null
}
@Composable
private fun TextFieldColors.trailingIconColor(
enabled: Boolean,
isError: Boolean,
interactionSource: InteractionSource,
): State<Color> {
val focused by interactionSource.collectIsFocusedAsState()
return rememberUpdatedState(
when {
!enabled -> disabledTrailingIconColor
isError -> errorTrailingIconColor
focused -> focusedTrailingIconColor
else -> unfocusedTrailingIconColor
},
)
}
@Preview
@Composable
private fun CountryCodePickerPreview() {
CountryCodePicker(
onValueChange = { _, _ -> },
showCountryCode = true,
showCountryFlag = true,
showPlaceholder = true,
includeOnly = null,
)
}

View File

@ -0,0 +1,52 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package com.mifos.library.countrycodepicker.component
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.autofill.AutofillNode
import androidx.compose.ui.autofill.AutofillType
import androidx.compose.ui.composed
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.layout.boundsInWindow
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalAutofill
import androidx.compose.ui.platform.LocalAutofillTree
@ExperimentalComposeUiApi
internal fun Modifier.autofill(
autofillTypes: List<AutofillType>,
onFill: (String) -> Unit,
focusRequester: FocusRequester,
): Modifier = this then composed {
val autofill = LocalAutofill.current
val autofillNode = AutofillNode(onFill = onFill, autofillTypes = autofillTypes)
LocalAutofillTree.current += autofillNode
LaunchedEffect(Unit) {
focusRequester.requestFocus()
}
this
.onGloballyPositioned {
autofillNode.boundingBox = it.boundsInWindow()
}
.onFocusChanged { focusState ->
autofill?.run {
if (focusState.isFocused) {
requestAutofillForNode(autofillNode)
} else {
cancelAutofillForNode(autofillNode)
}
}
}
}

View File

@ -0,0 +1,162 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package com.mifos.library.countrycodepicker.component
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDropDown
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
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.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.mifos.library.countrycodepicker.data.CountryData
import com.mifos.library.countrycodepicker.data.utils.emojiFlag
import com.mifos.library.countrycodepicker.data.utils.sortedByLocalizedName
import kotlinx.collections.immutable.ImmutableSet
import kotlinx.collections.immutable.toImmutableList
internal val DEFAULT_PADDING = 10.dp
@Composable
internal fun CountryCodeDialog(
selectedCountry: CountryData,
includeOnly: ImmutableSet<String>?,
onCountryChange: (CountryData) -> Unit,
showCountryCode: Boolean,
showFlag: Boolean,
textStyle: TextStyle,
modifier: Modifier = Modifier,
backgroundColor: Color = MaterialTheme.colorScheme.surface,
) {
val context = LocalContext.current
var country by remember { mutableStateOf(selectedCountry) }
var isOpenDialog by remember { mutableStateOf(false) }
val interactionSource = remember { MutableInteractionSource() }
val countryList by remember(context, includeOnly) {
derivedStateOf {
val allCountries = CountryData.entries.sortedByLocalizedName(context)
includeOnly?.run {
val includeUppercase = map { it.uppercase() }
allCountries.filter { it.countryIso in includeUppercase }
} ?: allCountries
}
}
Column(
modifier = modifier
.clickable(
interactionSource = interactionSource,
indication = null,
) {
isOpenDialog = true
},
) {
CountryRow(
modifier = Modifier.padding(DEFAULT_PADDING),
showCountryCode = showCountryCode,
showFlag = showFlag,
country = country,
textStyle = textStyle,
)
if (isOpenDialog) {
CountryDialog(
modifier = Modifier
.fillMaxWidth()
.clip(RoundedCornerShape(DEFAULT_ROUNDING)),
onDismissRequest = { isOpenDialog = false },
onSelect = { countryItem ->
onCountryChange(countryItem)
country = countryItem
isOpenDialog = false
},
countryList = countryList.toImmutableList(),
textStyle = if (textStyle.color != Color.Unspecified) {
textStyle
} else {
textStyle.copy(color = MaterialTheme.colorScheme.onSurface)
},
backgroundColor = backgroundColor,
)
}
}
}
@Composable
private fun CountryRow(
showCountryCode: Boolean,
showFlag: Boolean,
country: CountryData,
textStyle: TextStyle,
modifier: Modifier = Modifier,
) = Row(
modifier = modifier,
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = emojiCodeText(
showFlag = showFlag,
isPickCountry = country,
showCountryCode = showCountryCode,
),
modifier = Modifier.padding(start = DEFAULT_PADDING),
style = textStyle.copy(color = textStyle.color.copy(alpha = 1f)),
)
Icon(
imageVector = Icons.Default.ArrowDropDown,
contentDescription = null,
tint = textStyle.color,
)
}
@Composable
private fun emojiCodeText(
showFlag: Boolean,
isPickCountry: CountryData,
showCountryCode: Boolean,
) = (if (showFlag) isPickCountry.emojiFlag else "") +
(if (showCountryCode && showFlag) " " else "") +
(if (showCountryCode) isPickCountry.countryPhoneCode else "")
@Preview
@Composable
private fun CountryCodeDialogPreview() {
CountryCodeDialog(
selectedCountry = CountryData.UnitedStates,
includeOnly = null,
onCountryChange = {},
showCountryCode = true,
showFlag = true,
textStyle = TextStyle(),
backgroundColor = Color.White,
)
}

View File

@ -0,0 +1,291 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package com.mifos.library.countrycodepicker.component
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
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.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Clear
import androidx.compose.material.icons.filled.Search
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import com.mifos.library.countrycodepicker.R
import com.mifos.library.countrycodepicker.data.CountryData
import com.mifos.library.countrycodepicker.data.utils.countryNames
import com.mifos.library.countrycodepicker.data.utils.emojiFlag
import com.mifos.library.countrycodepicker.data.utils.searchCountry
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
internal val DEFAULT_ROUNDING = 10.dp
private val DEFAULT_ROW_PADDING = 16.dp
private const val ROW_PADDING_VERTICAL_SCALING = 1.1f
private val SEARCH_ICON_PADDING = 5.dp
private const val HEADER_TEXT_SIZE_MULTIPLE = 1.5
private val MIN_TAP_DIMENSION = 48.dp
private const val DIVIDER_ALPHA = 0.12f
/**
* @param onDismissRequest Executes when the user tries to dismiss the dialog.
* @param onSelect Executes when the user selects a country from the list.
* @param textStyle A [TextStyle] for customizing text style of search input field and country rows.
* @param modifier The modifier to be applied to the dialog surface.
* @param countryList The list of countries to display in the dialog.
* @param rowPadding The padding to be applied to each row.
* @param backgroundColor The [Color] of the dialog background.
* @param dividerColor The [Color] of the country row dividers.
*/
@Composable
fun CountryDialog(
onDismissRequest: () -> Unit,
onSelect: (item: CountryData) -> Unit,
textStyle: TextStyle,
modifier: Modifier = Modifier,
countryList: ImmutableList<CountryData> = persistentListOf(),
rowPadding: Dp = DEFAULT_ROW_PADDING,
backgroundColor: Color = MaterialTheme.colorScheme.surface,
dividerColor: Color = MaterialTheme.colorScheme.onSurface.copy(alpha = DIVIDER_ALPHA),
) {
val context = LocalContext.current
var searchValue by rememberSaveable { mutableStateOf("") }
val filteredCountries by remember(context, searchValue) {
derivedStateOf {
if (searchValue.isEmpty()) {
countryList
} else {
countryList.searchCountry(
searchValue,
context,
)
}
}
}
Dialog(
onDismissRequest = onDismissRequest,
content = {
@Suppress("ReusedModifierInstance")
Surface(
color = backgroundColor,
modifier = modifier,
) {
Column(modifier = Modifier.fillMaxSize()) {
HeaderRow(textStyle, onDismissRequest)
SearchTextField(
value = searchValue,
onValueChange = { searchValue = it },
textStyle = textStyle,
leadingIcon = {
Icon(
imageVector = Icons.Filled.Search,
contentDescription = stringResource(id = R.string.search),
tint = textStyle.color,
modifier = Modifier.padding(horizontal = SEARCH_ICON_PADDING),
)
},
)
Spacer(modifier = Modifier.height(DEFAULT_ROW_PADDING))
LazyColumn {
items(
filteredCountries,
key = { it.countryIso },
) { countryItem ->
HorizontalDivider(color = dividerColor)
CountryRowItem(
rowPadding = rowPadding,
onSelect = { onSelect(countryItem) },
countryItem = countryItem,
textStyle = textStyle,
)
}
}
}
}
},
)
}
@Composable
private fun HeaderRow(
textStyle: TextStyle,
onDismissRequest: () -> Unit,
modifier: Modifier = Modifier,
) {
Row(
modifier = modifier,
verticalAlignment = Alignment.CenterVertically,
) {
Spacer(modifier = Modifier.width(DEFAULT_ROW_PADDING))
Text(
text = stringResource(id = R.string.select_country),
style = textStyle.copy(
fontSize = textStyle
.fontSize
.takeIf { it != TextUnit.Unspecified }
?.let { it * HEADER_TEXT_SIZE_MULTIPLE }
?: MaterialTheme.typography.labelSmall.fontSize,
),
)
Spacer(modifier = Modifier.weight(1f))
IconButton(
onClick = { onDismissRequest() },
) {
Icon(
imageVector = Icons.Filled.Clear,
contentDescription = "Close",
tint = textStyle.color,
)
}
}
}
@Composable
private fun CountryRowItem(
rowPadding: Dp,
onSelect: () -> Unit,
countryItem: CountryData,
textStyle: TextStyle,
modifier: Modifier = Modifier,
) {
Row(
modifier = modifier
.fillMaxWidth()
.clickable(onClick = { onSelect() })
.padding(
horizontal = rowPadding,
vertical = rowPadding * ROW_PADDING_VERTICAL_SCALING,
),
horizontalArrangement = Arrangement.Start,
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = countryItem.emojiFlag + " " +
stringResource(
id = countryNames.getOrDefault(
countryItem.countryIso,
R.string.unknown,
),
),
style = textStyle,
overflow = TextOverflow.Ellipsis,
)
}
}
@Composable
private fun SearchTextField(
value: String,
onValueChange: (String) -> Unit,
textStyle: TextStyle,
modifier: Modifier = Modifier,
leadingIcon: (@Composable () -> Unit)? = null,
hint: String = stringResource(id = R.string.search),
) {
val requester = remember { FocusRequester() }
LaunchedEffect(Unit) {
requester.requestFocus()
}
BasicTextField(
modifier = modifier
.fillMaxWidth()
.height(MIN_TAP_DIMENSION)
.padding(horizontal = DEFAULT_ROW_PADDING)
.focusRequester(requester),
value = value,
onValueChange = onValueChange,
singleLine = true,
cursorBrush = SolidColor(textStyle.color),
textStyle = textStyle,
decorationBox = { innerTextField ->
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
) {
leadingIcon?.invoke()
Box(
modifier = Modifier
.padding(start = DEFAULT_ROUNDING)
.weight(1f),
contentAlignment = Alignment.CenterStart,
) {
if (value.isEmpty()) {
Text(
text = hint,
maxLines = 1,
style = textStyle.copy(color = textStyle.color.copy(alpha = 0.5f)),
)
}
innerTextField()
}
}
},
)
}
@Preview
@Composable
private fun CountryDialogPreview() {
CountryDialog(
onDismissRequest = {},
onSelect = {},
countryList = CountryData.entries.toImmutableList(),
modifier = Modifier
.fillMaxWidth()
.clip(RoundedCornerShape(DEFAULT_ROUNDING)),
textStyle = TextStyle(),
)
}

View File

@ -0,0 +1,263 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package com.mifos.library.countrycodepicker.data
typealias Iso31661alpha2 = String
typealias PhoneCode = String
enum class CountryData(val countryIso: Iso31661alpha2, val countryPhoneCode: PhoneCode) {
Andorra("AD", "+376"),
UnitedArabEmirates("AE", "+971"),
Afghanistan("AF", "+93"),
AntiguaAndBarbuda("AG", "+1"),
Anguilla("AI", "+1"),
Albania("AL", "+355"),
Armenia("AM", "+374"),
Angola("AO", "+244"),
Antarctica("AQ", "+672"),
Argentina("AR", "+54"),
AmericanSamoa("AS", "+1"),
Austria("AT", "+43"),
Australia("AU", "+61"),
Aruba("AW", "+297"),
AlandIslands("AX", "+358"),
Azerbaijan("AZ", "+994"),
BosniaAndHerzegovina("BA", "+387"),
Barbados("BB", "+1"),
Bangladesh("BD", "+880"),
Belgium("BE", "+32"),
BurkinaFaso("BF", "+226"),
Bulgaria("BG", "+359"),
Bahrain("BH", "+973"),
Burundi("BI", "+257"),
Benin("BJ", "+229"),
SaintBarthelemy("BL", "+590"),
Bermuda("BM", "+1"),
BruneiDarussalam("BN", "+673"),
Bolivia("BO", "+591"),
Brazil("BR", "+55"),
Bahamas("BS", "+1"),
Bhutan("BT", "+975"),
Botswana("BW", "+267"),
Belarus("BY", "+375"),
Belize("BZ", "+501"),
Canada("CA", "+1"),
CocosKeelingIslands("CC", "+61"),
CongoKinshasaDRC("CD", "+243"),
CentralAfricanRepublic("CF", "+236"),
CongoBrazzavilleRepublic("CG", "+242"),
Switzerland("CH", "+41"),
CoteDivoire("CI", "+225"),
CookIslands("CK", "+682"),
Chile("CL", "+56"),
Cameroon("CM", "+237"),
China("CN", "+86"),
Colombia("CO", "+57"),
CostaRica("CR", "+506"),
Cuba("CU", "+53"),
CapeVerde("CV", "+238"),
Curacao("CW", "+599"),
Christmas("CX", "+61"),
CyprusIsland("CY", "+357"),
CzechRepublic("CZ", "+420"),
Germany("DE", "+49"),
Djibouti("DJ", "+253"),
Denmark("DK", "+45"),
Dominica("DM", "+1"),
DominicanRepublic("DO", "+1"),
Algeria("DZ", "+213"),
Ecuador("EC", "+593"),
Estonia("EE", "+372"),
Egypt("EG", "+20"),
Eritrea("ER", "+291"),
Spain("ES", "+34"),
Ethiopia("ET", "+251"),
Finland("FI", "+358"),
Fiji("FJ", "+679"),
FalklandIslands("FK", "+500"),
Micronesia("FM", "+691"),
FaroeIslands("FO", "+298"),
France("FR", "+33"),
Gabon("GA", "+241"),
UnitedKingdom("GB", "+44"),
Grenada("GD", "+1"),
Georgia("GE", "+995"),
FrenchGuyana("GF", "+594"),
Ghana("GH", "+233"),
Gibraltar("GI", "+350"),
Greenland("GL", "+299"),
Gambia("GM", "+220"),
Guinea("GN", "+224"),
Guadeloupe("GP", "+590"),
EquatorialGuinea("GQ", "+240"),
Greece("GR", "+30"),
Guatemala("GT", "+502"),
Guam("GU", "+1"),
GuineaBissau("GW", "+245"),
Guyana("GY", "+592"),
HongKong("HK", "+852"),
Honduras("HN", "+504"),
Croatia("HR", "+385"),
Haiti("HT", "+509"),
Hungary("HU", "+36"),
Indonesia("ID", "+62"),
Ireland("IE", "+353"),
Israel("IL", "+972"),
IsleOfMan("IM", "+44"),
India("IN", "+91"),
BritishIndianOceanTerritory("IO", "+246"),
Iraq("IQ", "+964"),
Iran("IR", "+98"),
Iceland("IS", "+354"),
Italy("IT", "+39"),
Jersey("JE", "+44"),
Jamaica("JM", "+1"),
Jordan("JO", "+962"),
Japan("JP", "+81"),
Kenya("KE", "+254"),
Kyrgyzstan("KG", "+996"),
Cambodia("KH", "+855"),
Kiribati("KI", "+686"),
Comoros("KM", "+269"),
SaintKittsAndNevis("KN", "+1"),
NorthKorea("KP", "+850"),
SouthKorea("KR", "+82"),
Kuwait("KW", "+965"),
CaymanIslands("KY", "+1"),
Kazakhstan("KZ", "+7"),
Lao("LA", "+856"),
Lebanon("LB", "+961"),
SaintLucia("LC", "+1"),
Liechtenstein("LI", "+423"),
SriLanka("LK", "+94"),
Liberia("LR", "+231"),
Lesotho("LS", "+266"),
Lithuania("LT", "+370"),
Luxembourg("LU", "+352"),
Latvia("LV", "+371"),
Libya("LY", "+218"),
Morocco("MA", "+212"),
Monaco("MC", "+377"),
Moldova("MD", "+373"),
Montenegro("ME", "+382"),
SaintMartin("MF", "+590"),
Madagascar("MG", "+261"),
MarshallIslands("MH", "+692"),
NorthMacedonia("MK", "+389"),
Mali("ML", "+223"),
Myanmar("MM", "+95"),
Mongolia("MN", "+976"),
Macau("MO", "+853"),
NorthernMarianaIslands("MP", "+1"),
Martinique("MQ", "+596"),
Mauritania("MR", "+222"),
Montserrat("MS", "+1"),
Malta("MT", "+356"),
Mauritius("MU", "+230"),
Maldives("MV", "+960"),
Malawi("MW", "+265"),
Mexico("MX", "+52"),
Malaysia("MY", "+60"),
Mozambique("MZ", "+258"),
Namibia("NA", "+264"),
NewCaledonia("NC", "+687"),
Niger("NE", "+227"),
NorfolkIslands("NF", "+672"),
Nigeria("NG", "+234"),
Nicaragua("NI", "+505"),
Netherlands("NL", "+31"),
Norway("NO", "+47"),
Nepal("NP", "+977"),
Nauru("NR", "+674"),
Niue("NU", "+683"),
NewZealand("NZ", "+64"),
Oman("OM", "+968"),
Panama("PA", "+507"),
Peru("PE", "+51"),
FrenchPolynesia("PF", "+689"),
PapuaNewGuinea("PG", "+675"),
Philippines("PH", "+63"),
Pakistan("PK", "+92"),
Poland("PL", "+48"),
SaintPierreAndMiquelon("PM", "+508"),
PitcairnIslands("PN", "+870"),
PuertoRico("PR", "+1"),
Palestine("PS", "+970"),
Portugal("PT", "+351"),
Palau("PW", "+680"),
Paraguay("PY", "+595"),
Qatar("QA", "+974"),
Reunion("RE", "+262"),
Romania("RO", "+40"),
Serbia("RS", "+381"),
RussianFederation("RU", "+7"),
Rwanda("RW", "+250"),
SaudiArabia("SA", "+966"),
SolomonIslands("SB", "+677"),
Seychelles("SC", "+248"),
Sudan("SD", "+249"),
Sweden("SE", "+46"),
Singapore("SG", "+65"),
SaintHelena("SH", "+290"),
Slovenia("SI", "+386"),
Slovakia("SK", "+421"),
SierraLeone("SL", "+232"),
SanMarino("SM", "+378"),
Senegal("SN", "+221"),
Somalia("SO", "+252"),
Suriname("SR", "+597"),
SouthSudan("SS", "+211"),
SaoTomeAndPrincipe("ST", "+239"),
ElSalvador("SV", "+503"),
SintMaarten("SX", "+1"),
Syria("SY", "+963"),
Swaziland("SZ", "+268"),
TurksAndCaicosIslands("TC", "+1"),
Chad("TD", "+235"),
Togo("TG", "+228"),
Thailand("TH", "+66"),
Tajikistan("TJ", "+992"),
Tokelau("TK", "+690"),
TimorLeste("TL", "+670"),
Turkmenistan("TM", "+993"),
Tunisia("TN", "+216"),
Tonga("TO", "+676"),
Turkey("TR", "+90"),
TrinidadAndTobago("TT", "+1"),
Tuvalu("TV", "+688"),
Taiwan("TW", "+886"),
Tanzania("TZ", "+255"),
Ukraine("UA", "+380"),
Uganda("UG", "+256"),
UnitedStates("US", "+1"),
Uruguay("UY", "+598"),
Uzbekistan("UZ", "+998"),
HolySee("VA", "+379"),
SaintVincentAndTheGrenadines("VC", "+1"),
Venezuela("VE", "+58"),
BritishVirginIslands("VG", "+1"),
USVirginIslands("VI", "+1"),
Vietnam("VN", "+84"),
Vanuatu("VU", "+678"),
WallisAndFutuna("WF", "+681"),
Samoa("WS", "+685"),
Kosovo("XK", "+383"),
Yemen("YE", "+967"),
Mayotte("YT", "+262"),
SouthAfrica("ZA", "+27"),
Zambia("ZM", "+260"),
Zimbabwe("ZW", "+263"),
;
companion object {
val isoMap: Map<Iso31661alpha2, CountryData> = entries.associateBy { it.countryIso }
internal val phoneCodeMap: Map<PhoneCode, CountryData> = entries.associateBy { it.countryPhoneCode }
}
}

View File

@ -0,0 +1,64 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package com.mifos.library.countrycodepicker.data.utils
import android.content.Context
import android.telephony.TelephonyManager
import com.mifos.library.countrycodepicker.data.CountryData
import com.mifos.library.countrycodepicker.data.Iso31661alpha2
import com.mifos.library.countrycodepicker.data.PhoneCode
import kotlin.math.min
private const val EMOJI_UNICODE = 0x1F1A5
private const val MAX_LENGTH_COUNTRY_CODE = 3
internal fun getCountryFromPhoneCode(code: PhoneCode, context: Context): CountryData? {
val countries = CountryData.entries.filter { it.countryPhoneCode == code }
return when (countries.size) {
0 -> null
1 -> countries.firstOrNull()
else -> {
val userIso = getUserIsoCode(context)
countries.firstOrNull { it.countryIso == userIso }
?: if (code == "+1") CountryData.UnitedStates else countries.firstOrNull()
}
}
}
@Suppress("SwallowedException", "TooGenericExceptionCaught", "Deprecation")
internal fun getUserIsoCode(context: Context): Iso31661alpha2 = try {
val telephonyManager = context.telephonyManager
telephonyManager?.networkCountryIso ?: telephonyManager?.simCountryIso
} catch (ex: Exception) {
null
}.takeIf { !it.isNullOrBlank() } ?: context.resources.configuration.locale.country
val CountryData.emojiFlag: String get() = countryCodeToEmojiFlag(countryIso)
fun countryCodeToEmojiFlag(countryCode: Iso31661alpha2): String =
countryCode
.uppercase()
.map { char -> Character.codePointAt("$char", 0) + EMOJI_UNICODE }
.joinToString("") { String(Character.toChars(it)) }
private val Context.telephonyManager: TelephonyManager?
get() = getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager
internal fun extractCountryCode(fullNumber: String): String? {
val numberLength = fullNumber.length
val minLength = min(a = numberLength, b = MAX_LENGTH_COUNTRY_CODE)
for (i in 1..minLength) {
val potentialCountryCode = fullNumber.substring(0, i)
if (CountryData.phoneCodeMap.containsKey(potentialCountryCode)) {
return potentialCountryCode
}
}
return null
}

View File

@ -0,0 +1,258 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package com.mifos.library.countrycodepicker.data.utils
import com.mifos.library.countrycodepicker.R
import com.mifos.library.countrycodepicker.data.Iso31661alpha2
internal val countryNames: Map<Iso31661alpha2, Int> = mapOf(
"AD" to R.string.andorra,
"AE" to R.string.united_arab_emirates,
"AF" to R.string.afghanistan,
"AG" to R.string.antigua_and_barbuda,
"AI" to R.string.anguilla,
"AL" to R.string.albania,
"AM" to R.string.armenia,
"AO" to R.string.angola,
"AQ" to R.string.antarctica,
"AR" to R.string.argentina,
"AS" to R.string.american_samoa,
"AT" to R.string.austria,
"AU" to R.string.australia,
"AW" to R.string.aruba,
"AX" to R.string.aland_islands,
"AZ" to R.string.azerbaijan,
"BA" to R.string.bosnia,
"BB" to R.string.barbados,
"BD" to R.string.bangladesh,
"BE" to R.string.belgium,
"BF" to R.string.burkina_faso,
"BG" to R.string.bulgaria,
"BH" to R.string.bahrain,
"BI" to R.string.burundi,
"BJ" to R.string.benin,
"BL" to R.string.saint_barhelemy,
"BM" to R.string.bermuda,
"BN" to R.string.brunei_darussalam,
"BO" to R.string.bolivia,
"BR" to R.string.brazil,
"BS" to R.string.bahamas,
"BT" to R.string.bhutan,
"BW" to R.string.botswana,
"BY" to R.string.belarus,
"BZ" to R.string.belize,
"CA" to R.string.canada,
"CC" to R.string.cocos,
"CD" to R.string.congo_democratic,
"CF" to R.string.central_african,
"CG" to R.string.congo,
"CH" to R.string.switzerland,
"CI" to R.string.cote_dlvoire,
"CK" to R.string.cook_islands,
"CL" to R.string.chile,
"CM" to R.string.cameroon,
"CN" to R.string.china,
"CO" to R.string.colombia,
"CR" to R.string.costa_rica,
"CU" to R.string.cuba,
"CV" to R.string.cape_verde,
"CW" to R.string.curacao,
"CX" to R.string.christmas_island,
"CY" to R.string.cyprus,
"CZ" to R.string.czech_republic,
"DE" to R.string.germany,
"DJ" to R.string.djibouti,
"DK" to R.string.denmark,
"DM" to R.string.dominica,
"DO" to R.string.dominican_republic,
"DZ" to R.string.algeria,
"EC" to R.string.ecuador,
"EE" to R.string.estonia,
"EG" to R.string.egypt,
"ER" to R.string.eritrea,
"ES" to R.string.spain,
"ET" to R.string.ethiopia,
"FI" to R.string.finland,
"FJ" to R.string.fiji,
"FK" to R.string.falkland_islands,
"FM" to R.string.micronesia,
"FO" to R.string.faroe_islands,
"FR" to R.string.france,
"GA" to R.string.gabon,
"GB" to R.string.united_kingdom,
"GD" to R.string.grenada,
"GE" to R.string.georgia,
"GF" to R.string.french_guiana,
"GG" to R.string.guernsey,
"GH" to R.string.ghana,
"GI" to R.string.gibraltar,
"GL" to R.string.greenland,
"GM" to R.string.gambia,
"GN" to R.string.guinea,
"GP" to R.string.guadeloupe,
"GQ" to R.string.equatorial_guinea,
"GR" to R.string.greece,
"GT" to R.string.guatemala,
"GU" to R.string.guam,
"GW" to R.string.guinea_bissau,
"GY" to R.string.guyana,
"HK" to R.string.hong_kong,
"HN" to R.string.honduras,
"HR" to R.string.croatia,
"HT" to R.string.haiti,
"HU" to R.string.hungary,
"ID" to R.string.indonesia,
"IE" to R.string.ireland,
"IL" to R.string.israil,
"IM" to R.string.isle_of_man,
"IN" to R.string.india,
"IO" to R.string.british_indian_ocean,
"IQ" to R.string.iraq,
"IR" to R.string.iran,
"IS" to R.string.iceland,
"IT" to R.string.italia,
"JE" to R.string.jersey,
"JM" to R.string.jamaica,
"JO" to R.string.jordan,
"JP" to R.string.japan,
"KE" to R.string.kenya,
"KG" to R.string.kyrgyzstan,
"KH" to R.string.cambodia,
"KI" to R.string.kiribati,
"KM" to R.string.comoros,
"KN" to R.string.saint_kitts,
"KP" to R.string.north_korea,
"KR" to R.string.south_korea,
"KW" to R.string.kuwait,
"KY" to R.string.cayman_islands,
"KZ" to R.string.kazakhstan,
"LA" to R.string.laos,
"LB" to R.string.lebanon,
"LC" to R.string.saint_lucia,
"LI" to R.string.liechtenstein,
"LK" to R.string.siri_lanka,
"LR" to R.string.liberia,
"LS" to R.string.lesotho,
"LT" to R.string.lithuania,
"LU" to R.string.luxembourg,
"LV" to R.string.latvia,
"LY" to R.string.libya,
"MA" to R.string.morocco,
"MC" to R.string.monaco,
"MD" to R.string.moldova,
"ME" to R.string.montenegro,
"MF" to R.string.saint_martin,
"MG" to R.string.madagascar,
"MH" to R.string.marshall_islands,
"MK" to R.string.north_macedonia,
"ML" to R.string.mali,
"MM" to R.string.myanmar,
"MN" to R.string.mongolia,
"MO" to R.string.macau,
"MP" to R.string.northern_mariana,
"MQ" to R.string.martinique,
"MR" to R.string.mauritania,
"MS" to R.string.montserrat,
"MT" to R.string.malta,
"MU" to R.string.mauritius,
"MV" to R.string.maldives,
"MW" to R.string.malawi,
"MX" to R.string.mexico,
"MY" to R.string.malaysia,
"MZ" to R.string.mozambique,
"NA" to R.string.namibia,
"NC" to R.string.new_caledonia,
"NE" to R.string.niger,
"NF" to R.string.norfolk,
"NG" to R.string.nigeria,
"NI" to R.string.nicaragua,
"NL" to R.string.netherlands,
"NO" to R.string.norway,
"NP" to R.string.nepal,
"NR" to R.string.nauru,
"NU" to R.string.niue,
"NZ" to R.string.new_zealand,
"OM" to R.string.oman,
"PA" to R.string.panama,
"PE" to R.string.peru,
"PF" to R.string.french_polynesia,
"PG" to R.string.papua_new_guinea,
"PH" to R.string.philippines,
"PK" to R.string.pakistan,
"PL" to R.string.poland,
"PM" to R.string.saint_pierre,
"PN" to R.string.pitcairn,
"PR" to R.string.puerto_rico,
"PS" to R.string.state_of_palestine,
"PT" to R.string.portugal,
"PW" to R.string.palau,
"PY" to R.string.paraguay,
"QA" to R.string.qatar,
"RE" to R.string.reunion,
"RO" to R.string.romania,
"RS" to R.string.serbia,
"RU" to R.string.russia,
"RW" to R.string.rwanda,
"SA" to R.string.saudi_arabia,
"SB" to R.string.solomon_islands,
"SC" to R.string.seychelles,
"SD" to R.string.sudan,
"SE" to R.string.sweden,
"SG" to R.string.singapore,
"SH" to R.string.saint_helena,
"SI" to R.string.slovenia,
"SK" to R.string.slovakia,
"SL" to R.string.sierra_leone,
"SM" to R.string.san_marino,
"SN" to R.string.senegal,
"SO" to R.string.somalia,
"SR" to R.string.suriname,
"SS" to R.string.south_sudan,
"ST" to R.string.sao_tome,
"SV" to R.string.el_salvador,
"SX" to R.string.sint_maarten,
"SY" to R.string.syria,
"SZ" to R.string.swaziland,
"TC" to R.string.turks_and_caicos,
"TD" to R.string.chad,
"TG" to R.string.togo,
"TH" to R.string.thailand,
"TJ" to R.string.taijikistan,
"TK" to R.string.tokelau,
"TL" to R.string.timor_leste,
"TM" to R.string.turkmenistan,
"TN" to R.string.tunisia,
"TO" to R.string.tonga,
"TR" to R.string.turkey,
"TT" to R.string.trinidad_and_tobago,
"TV" to R.string.tuvalu,
"TW" to R.string.taiwan,
"TZ" to R.string.tazmania,
"UA" to R.string.ukraine,
"UG" to R.string.uganda,
"US" to R.string.united_states_america,
"UY" to R.string.uruguay,
"UZ" to R.string.uzbekistan,
"VA" to R.string.holy_see,
"VC" to R.string.saint_vincent,
"VE" to R.string.venezuela,
"VG" to R.string.virgin_islands,
"VI" to R.string.virgin_islands_us,
"VN" to R.string.vietnam,
"VU" to R.string.vanuatu,
"WF" to R.string.wallis_and_futuna,
"WS" to R.string.samoa,
"XK" to R.string.kosovo,
"YE" to R.string.yemen,
"YT" to R.string.mayotte,
"ZA" to R.string.south_africa,
"ZM" to R.string.zambia,
"ZW" to R.string.zimbabwe,
)

View File

@ -0,0 +1,259 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package com.mifos.library.countrycodepicker.data.utils
import com.mifos.library.countrycodepicker.R
import com.mifos.library.countrycodepicker.data.Iso31661alpha2
@Suppress("LongMethod", "CyclomaticComplexMethod")
internal val numberHint: Map<Iso31661alpha2, Int> = mapOf(
"AD" to R.string.andorra_hint,
"AE" to R.string.united_arab_emirates_hint,
"AF" to R.string.afganistan_hint,
"AG" to R.string.antigua_and_barbuda_hint,
"AI" to R.string.anguilla_hint,
"AL" to R.string.albania_hint,
"AM" to R.string.armenia_hint,
"AO" to R.string.angola_hint,
"AQ" to R.string.antarctica_hint,
"AR" to R.string.argentina_hint,
"AS" to R.string.american_samoa_hint,
"AT" to R.string.austria_hint,
"AU" to R.string.australia_hint,
"AW" to R.string.aruba_hint,
"AX" to R.string.aland_islands_hint,
"AZ" to R.string.azerbaijan_hint,
"BA" to R.string.bosnia_hint,
"BB" to R.string.barbados_hint,
"BD" to R.string.bangladesh_hint,
"BE" to R.string.belgium_hint,
"BF" to R.string.burkina_faso_hint,
"BG" to R.string.bulgaria_hint,
"BH" to R.string.bahrain_hint,
"BI" to R.string.burundi_hint,
"BJ" to R.string.benin_hint,
"BL" to R.string.saint_barhelemy_hint,
"BM" to R.string.bermuda_hint,
"BN" to R.string.brunei_darussalam_hint,
"BO" to R.string.bolivia_hint,
"BR" to R.string.brazil_hint,
"BS" to R.string.bahamas_hint,
"BT" to R.string.bhutan_hint,
"BW" to R.string.botswana_hint,
"BY" to R.string.belarus_hint,
"BZ" to R.string.belize_hint,
"CA" to R.string.canada_hint,
"CC" to R.string.cocos_hint,
"CD" to R.string.congo_democratic_hint,
"CF" to R.string.central_african_hint,
"CG" to R.string.congo_hint,
"CH" to R.string.switzerland_hint,
"CI" to R.string.cote_dlvoire_hint,
"CK" to R.string.cook_islands_hint,
"CL" to R.string.chile_hint,
"CM" to R.string.cameroon_hint,
"CN" to R.string.china_hint,
"CO" to R.string.colombia_hint,
"CR" to R.string.costa_rica_hint,
"CU" to R.string.cuba_hint,
"CV" to R.string.cape_verde_hint,
"CW" to R.string.curacao_hint,
"CX" to R.string.christmas_island_hint,
"CY" to R.string.cyprus_hint,
"CZ" to R.string.czech_republic_hint,
"DE" to R.string.germany_hint,
"DJ" to R.string.djibouti_hint,
"DK" to R.string.denmark_hint,
"DM" to R.string.dominica_hint,
"DO" to R.string.dominician_republic_hint,
"DZ" to R.string.algeria_hint,
"EC" to R.string.ecuador_hint,
"EE" to R.string.estonia_hint,
"EG" to R.string.egypt_hint,
"ER" to R.string.eritrea_hint,
"ES" to R.string.spain_hint,
"ET" to R.string.ethiopia_hint,
"FI" to R.string.finland_hint,
"FJ" to R.string.fiji_hint,
"FK" to R.string.falkland_islands_hint,
"FM" to R.string.micro_hint,
"FO" to R.string.faroe_islands_hint,
"FR" to R.string.france_hint,
"GA" to R.string.gabon_hint,
"GB" to R.string.united_kingdom_hint,
"GD" to R.string.grenada_hint,
"GE" to R.string.georgia_hint,
"GF" to R.string.french_guyana_hint,
"GG" to R.string.guernsey_hint,
"GH" to R.string.ghana_hint,
"GI" to R.string.gibraltar_hint,
"GL" to R.string.greenland_hint,
"GM" to R.string.gambia_hint,
"GN" to R.string.guinea_hint,
"GP" to R.string.guadeloupe_hint,
"GQ" to R.string.equatorial_guinea_hint,
"GR" to R.string.greece_hint,
"GT" to R.string.guatemala_hint,
"GU" to R.string.guam_hint,
"GW" to R.string.guinea_bissau_hint,
"GY" to R.string.guyana_hint,
"HK" to R.string.hong_kong_hint,
"HN" to R.string.honduras_hint,
"HR" to R.string.croatia_hint,
"HT" to R.string.haiti_hint,
"HU" to R.string.hungary_hint,
"ID" to R.string.indonesia_hint,
"IE" to R.string.ireland_hint,
"IL" to R.string.israil_hint,
"IM" to R.string.isle_of_man_hint,
"IS" to R.string.iceland_hint,
"IN" to R.string.india_hint,
"IO" to R.string.british_indian_ocean_hint,
"IQ" to R.string.iraq_hint,
"IR" to R.string.iran_hint,
"IT" to R.string.italia_hint,
"JE" to R.string.jersey_hint,
"JM" to R.string.jamaica_hint,
"JO" to R.string.jordan_hint,
"JP" to R.string.japan_hint,
"KE" to R.string.kenya_hint,
"KG" to R.string.kyrgyzstan_hint,
"KH" to R.string.cambodia_hint,
"KI" to R.string.kiribati_hint,
"KM" to R.string.comoros_hint,
"KN" to R.string.saint_kitts_hint,
"KP" to R.string.north_korea_hint,
"KR" to R.string.south_korea_hint,
"KW" to R.string.kuwait_hint,
"KY" to R.string.cayman_islands_hint,
"KZ" to R.string.kazakhstan_hint,
"LA" to R.string.laos_hint,
"LB" to R.string.lebanon_hint,
"LC" to R.string.saint_lucia_hint,
"LI" to R.string.liechtenstein_hint,
"LK" to R.string.siri_lanka_hint,
"LR" to R.string.liberia_hint,
"LS" to R.string.lesotho_hint,
"LT" to R.string.lithuania_hint,
"LU" to R.string.luxembourg_hint,
"LV" to R.string.latvia_hint,
"LY" to R.string.libya_hint,
"MA" to R.string.marocco_hint,
"MC" to R.string.monaco_hint,
"MD" to R.string.moldova_hint,
"ME" to R.string.montenegro_hint,
"MF" to R.string.saint_martin_hint,
"MG" to R.string.madagascar_hint,
"MH" to R.string.marshall_islands_hint,
"MK" to R.string.north_macedonia_hint,
"ML" to R.string.mali_hint,
"MM" to R.string.myanmar_hint,
"MN" to R.string.mongolia_hint,
"MO" to R.string.macau_hint,
"MP" to R.string.northern_mariana_hint,
"MQ" to R.string.martinique_hint,
"MR" to R.string.mauriatana_hint,
"MS" to R.string.montserrat_hint,
"MT" to R.string.malta_hint,
"MU" to R.string.mauritius_hint,
"MV" to R.string.maldives_hint,
"MW" to R.string.malawi_hint,
"MX" to R.string.mexico_hint,
"MY" to R.string.malaysia_hint,
"MZ" to R.string.mozambique_hint,
"NA" to R.string.namibia_hint,
"NC" to R.string.new_caledonia_hint,
"NE" to R.string.niger_hint,
"NF" to R.string.norfolk_hint,
"NG" to R.string.nigeria_hint,
"NI" to R.string.nicaragua_hint,
"NL" to R.string.netherlands_hint,
"NO" to R.string.norway_hint,
"NP" to R.string.nepal_hint,
"NR" to R.string.nauru_hint,
"NU" to R.string.niue_hint,
"NZ" to R.string.new_zealand_hint,
"OM" to R.string.oman_hint,
"PA" to R.string.panama_hint,
"PE" to R.string.peru_hint,
"PF" to R.string.french_polynesia_hint,
"PG" to R.string.papua_new_guinea_hint,
"PH" to R.string.philippinies_hint,
"PK" to R.string.pakistan_hint,
"PL" to R.string.poland_hint,
"PM" to R.string.saint_pierre_hint,
"PN" to R.string.pitcairn_hint,
"PR" to R.string.puerto_rico_hint,
"PS" to R.string.state_of_palestine_hint,
"PT" to R.string.portugal_hint,
"PW" to R.string.palau_hint,
"PY" to R.string.paraguay_hint,
"QA" to R.string.qatar_hint,
"RE" to R.string.reunion_hint,
"RO" to R.string.romania_hint,
"RS" to R.string.serbia_hint,
"RU" to R.string.russia_hint,
"RW" to R.string.rwanda_hint,
"SA" to R.string.saudi_arabia_hint,
"SB" to R.string.solomon_islands_hint,
"SC" to R.string.seychelles_hint,
"SD" to R.string.sudan_hint,
"SE" to R.string.sweden_hint,
"SG" to R.string.singapore_hint,
"SH" to R.string.saint_helena_hint,
"SI" to R.string.slovenia_hint,
"SK" to R.string.slovakia_hint,
"SL" to R.string.sierra_leone_hint,
"SM" to R.string.san_marino_hint,
"SN" to R.string.senegal_hint,
"SO" to R.string.somali_hint,
"SR" to R.string.suriname_hint,
"SS" to R.string.south_sudan_hint,
"ST" to R.string.sao_tome_hint,
"SV" to R.string.el_salvador_hint,
"SX" to R.string.sint_maarten_hint,
"SY" to R.string.syrian_hint,
"SZ" to R.string.swaziland_hint,
"TC" to R.string.turks_and_caicos_hint,
"TD" to R.string.chad_hint,
"TG" to R.string.togo_hint,
"TH" to R.string.thailand_hint,
"TJ" to R.string.taijikistan_hint,
"TK" to R.string.tokelau_hint,
"TL" to R.string.timor_leste_hint,
"TM" to R.string.turkmenistan_hint,
"TN" to R.string.tunisia_hint,
"TO" to R.string.tonga_hint,
"TR" to R.string.turkey_hint,
"TT" to R.string.trinidad_and_tobago_hint,
"TV" to R.string.tuvalu_hint,
"TW" to R.string.taiwan_hint,
"TZ" to R.string.tazmania_hint,
"UA" to R.string.ukraina_hint,
"UG" to R.string.uganda_hint,
"US" to R.string.united_states_america_hint,
"UY" to R.string.uruguay_hint,
"UZ" to R.string.uzbekistan_hint,
"VA" to R.string.holy_see_hint,
"VC" to R.string.saint_vincent_hint,
"VE" to R.string.venezuela_hint,
"VG" to R.string.virgin_islands_hint,
"VI" to R.string.virgin_islands_us_hint,
"VN" to R.string.vietnam_hint,
"VU" to R.string.vanuatu_hint,
"WF" to R.string.walli_and_fatuna_hint,
"WS" to R.string.samoa_hint,
"XK" to R.string.kosovo_hint,
"YE" to R.string.yemen_hint,
"YT" to R.string.mayotte_hint,
"ZA" to R.string.south_africa_hint,
"ZM" to R.string.zambia_hint,
"ZW" to R.string.zimbabwe_hint,
)

View File

@ -0,0 +1,37 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package com.mifos.library.countrycodepicker.data.utils
import android.content.Context
import com.mifos.library.countrycodepicker.R
import com.mifos.library.countrycodepicker.data.CountryData
internal fun List<CountryData>.searchCountry(key: String, context: Context): List<CountryData> =
this.mapNotNull { countryData ->
countryNames[countryData.countryIso]?.let { countryName ->
val localizedCountryName = context.resources.getString(countryName).lowercase()
if (localizedCountryName.contains(key.lowercase())) {
countryData to localizedCountryName
} else {
null
}
}
}
.partition { it.second.startsWith(key.lowercase()) }
.let { (startWith, contains) ->
startWith.map { it.first } + contains.map { it.first }
}
internal fun List<CountryData>.sortedByLocalizedName(context: Context): List<CountryData> =
this.sortedBy {
context.resources.getString(
countryNames.getOrDefault(it.countryIso, R.string.unknown),
)
}

View File

@ -0,0 +1,31 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package com.mifos.library.countrycodepicker.data.utils
import android.content.Context
import io.michaelrocks.libphonenumber.android.NumberParseException
import io.michaelrocks.libphonenumber.android.PhoneNumberUtil
private const val MIN_PHONE_LENGTH = 6
internal class ValidatePhoneNumber(private val context: Context) {
private val phoneUtil: PhoneNumberUtil by lazy { PhoneNumberUtil.createInstance(context) }
operator fun invoke(fullPhoneNumber: String): Boolean =
if (fullPhoneNumber.length > MIN_PHONE_LENGTH) {
try {
phoneUtil.isValidNumber(phoneUtil.parse(fullPhoneNumber, null))
} catch (ex: NumberParseException) {
false
}
} else {
false
}
}

View File

@ -0,0 +1,109 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
package com.mifos.library.countrycodepicker.transformation
import android.content.Context
import android.telephony.PhoneNumberUtils
import android.text.Selection
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.input.OffsetMapping
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.TransformedText
import androidx.compose.ui.text.input.VisualTransformation
import io.michaelrocks.libphonenumber.android.PhoneNumberUtil
// https://medium.com/google-developer-experts/hands-on-jetpack-compose-visualtransformation-to-create-a-phone-number-formatter-99b0347fc4f6
class PhoneNumberTransformation(countryCode: String, context: Context) : VisualTransformation {
private val phoneNumberFormatter by lazy {
PhoneNumberUtil.createInstance(context).getAsYouTypeFormatter(countryCode)
}
fun preFilter(text: String): String = text.filter { PhoneNumberUtils.isReallyDialable(it) }
fun preFilter(textValue: TextFieldValue): String = preFilter(textValue.text)
override fun filter(text: AnnotatedString): TransformedText {
val transformation = reformat(text, Selection.getSelectionEnd(text))
return TransformedText(
AnnotatedString(transformation.formatted.orEmpty()),
object : OffsetMapping {
@Suppress("TooGenericExceptionCaught", "SwallowedException")
override fun originalToTransformed(offset: Int): Int {
return try {
transformation.originalToTransformed[offset]
} catch (ex: IndexOutOfBoundsException) {
transformation.transformedToOriginal.lastIndex
}
}
override fun transformedToOriginal(offset: Int): Int =
transformation.transformedToOriginal[offset]
},
)
}
@Suppress("AvoidMutableCollections", "AvoidVarsExceptWithDelegate")
private fun reformat(s: CharSequence, cursor: Int): Transformation {
phoneNumberFormatter.clear()
val curIndex = cursor - 1
var formatted: String? = null
var lastNonSeparator = 0.toChar()
var hasCursor = false
s.forEachIndexed { index, char ->
if (PhoneNumberUtils.isNonSeparator(char)) {
if (lastNonSeparator.code != 0) {
formatted = getFormattedNumber(lastNonSeparator, hasCursor)
hasCursor = false
}
lastNonSeparator = char
}
if (index == curIndex) {
hasCursor = true
}
}
if (lastNonSeparator.code != 0) {
formatted = getFormattedNumber(lastNonSeparator, hasCursor)
}
val originalToTransformed = mutableListOf<Int>()
val transformedToOriginal = mutableListOf<Int>()
var specialCharsCount = 0
formatted?.forEachIndexed { index, char ->
if (!PhoneNumberUtils.isNonSeparator(char)) {
specialCharsCount++
} else {
originalToTransformed.add(index)
}
transformedToOriginal.add(index - specialCharsCount)
}
originalToTransformed.add(originalToTransformed.maxOrNull()?.plus(1) ?: 0)
transformedToOriginal.add(transformedToOriginal.maxOrNull()?.plus(1) ?: 0)
return Transformation(formatted, originalToTransformed, transformedToOriginal)
}
private fun getFormattedNumber(lastNonSeparator: Char, hasCursor: Boolean): String? {
return if (hasCursor) {
phoneNumberFormatter.inputDigitAndRememberPosition(lastNonSeparator)
} else {
phoneNumberFormatter.inputDigit(lastNonSeparator)
}
}
private data class Transformation(
val formatted: String?,
val originalToTransformed: List<Int>,
val transformedToOriginal: List<Int>,
)
}

View File

@ -0,0 +1,260 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<string name="afghanistan">أفغانستان</string>
<string name="aland_islands">جزر أولند</string>
<string name="albania">ألبانيا</string>
<string name="algeria">الجزائر</string>
<string name="american_samoa">ساموا-الأمريكي</string>
<string name="andora">أندورا</string>
<string name="andorra">أندورا</string>
<string name="angola">أنجولا</string>
<string name="anguilla">أنجويلا</string>
<string name="antarctica">المنطقة القطبية الجنوبية</string>
<string name="antigua_and_barbuda">أنتيغوا وباربودا</string>
<string name="argentina">الأرجنتين</string>
<string name="armenia">أرمينيا</string>
<string name="aruba">أروبا</string>
<string name="australia">أستراليا</string>
<string name="austria">النمسا</string>
<string name="azerbaijan">أذربيجان</string>
<string name="bahamas">باهاماس</string>
<string name="bahrain">البحرين</string>
<string name="bangladesh">بنجلاديش</string>
<string name="barbados">باربادوس</string>
<string name="belarus">بيلاروس</string>
<string name="belgium">بلجيكا</string>
<string name="belize">بيليز</string>
<string name="benin">بنين</string>
<string name="bermuda">برمودا</string>
<string name="bhutan">بوتان</string>
<string name="bolivia">بوليفيا</string>
<string name="bosnia">البوسنة والهرسك</string>
<string name="botswana">بوتسوانا</string>
<string name="brazil">البرازيل</string>
<string name="british_indian_ocean">إقليم المحيط البريطاني الهندي</string>
<string name="brunei_darussalam">بروناي</string>
<string name="bulgaria">بلغاريا</string>
<string name="burkina_faso">بوركينا فاسو</string>
<string name="burundi">بوروندي</string>
<string name="cambodia">كمبوديا</string>
<string name="cameroon">كاميرون</string>
<string name="canada">كندا</string>
<string name="cape_verde">الرأس الأخضر</string>
<string name="cayman_islands">جزر كايمان</string>
<string name="central_african">جمهورية أفريقيا الوسطى</string>
<string name="chad">تشاد</string>
<string name="chile">تشيلي</string>
<string name="china">الصين</string>
<string name="christmas_island">جزيرة كريسماس</string>
<string name="cocos">جزر كوكس(كيلينغ)</string>
<string name="colombia">كولومبيا</string>
<string name="comoros">جزر القمر</string>
<string name="congo">جمهورية الكونغو</string>
<string name="congo_democratic">جمهورية الكونغو الديمقراطية</string>
<string name="cook_islands">جزر كوك</string>
<string name="costa_rica">كوستاريكا</string>
<string name="cote_dlvoire">ساحل العاج</string>
<string name="croatia">كرواتيا</string>
<string name="cuba">كوبا</string>
<string name="curacao">Curaçao</string>
<string name="cyprus">قبرص</string>
<string name="czech_republic">التشيك</string>
<string name="denmark">الدنمارك</string>
<string name="djibouti">جيبوتي</string>
<string name="dominica">دومينيكا</string>
<string name="dominican_republic">جمهورية الدومينيكان</string>
<string name="ecuador">الإكوادور</string>
<string name="egypt">مصر</string>
<string name="el_salvador">السلفادور</string>
<string name="equatorial_guinea">غينيا الاستوائية</string>
<string name="eritrea">إريتريا</string>
<string name="estonia">إستونيا</string>
<string name="ethiopia">إثيوبيا</string>
<string name="falkland_islands">جزر فوكلاند</string>
<string name="faroe_islands">جزر فارو</string>
<string name="fiji">فيجي</string>
<string name="finland">فنلندا</string>
<string name="france">فرنسا</string>
<string name="french_guiana">غينيا الفرنسية</string>
<string name="french_polynesia">بولينيزيا الفرنسية</string>
<string name="gabon">الغابون</string>
<string name="gambia">غامبيا</string>
<string name="georgia">جورجيا</string>
<string name="germany">ألمانيا</string>
<string name="ghana">غانا</string>
<string name="gibraltar">جبل طارق</string>
<string name="greece">اليونان</string>
<string name="greenland">جرينلاند</string>
<string name="grenada">غرينادا</string>
<string name="guadeloupe">غوادلوب</string>
<string name="guam">غوام</string>
<string name="guatemala">غواتيمال</string>
<string name="guernsey">غيرنزي</string>
<string name="guinea">غينيا</string>
<string name="guinea_bissau">غينيا بيساو</string>
<string name="guyana">غيانا</string>
<string name="haiti">هايتي</string>
<string name="holy_see">الفاتيكان</string>
<string name="honduras">هندوراس</string>
<string name="hong_kong">هونغ كونغ</string>
<string name="hungary">المجر</string>
<string name="iceland">أيسلندا</string>
<string name="india">الهند</string>
<string name="indonesia">إندونيسيا</string>
<string name="iran">إيران</string>
<string name="iraq">العراق</string>
<string name="ireland">جمهورية أيرلندا</string>
<string name="isle_of_man">جزيرة مان</string>
<string name="israil">إسرائيل</string>
<string name="italia">إيطاليا</string>
<string name="jamaica">جامايكا</string>
<string name="japan">اليابان</string>
<string name="jersey">جيرسي</string>
<string name="jordan">الأردن</string>
<string name="kazakhstan">كازاخستان</string>
<string name="kenya">كينيا</string>
<string name="kiribati">كيريباتي</string>
<string name="kosovo">كوسوفو</string>
<string name="kuwait">الكويت</string>
<string name="kyrgyzstan">قيرغيزستان</string>
<string name="laos">لاوس</string>
<string name="latvia">لاتفيا</string>
<string name="lebanon">لبنان</string>
<string name="lesotho">ليسوتو</string>
<string name="liberia">ليبيريا</string>
<string name="libya">ليبيا</string>
<string name="liechtenstein">ليختنشتاين</string>
<string name="lithuania">ليتوانيا</string>
<string name="luxembourg">لوكسمبورغ</string>
<string name="macau">ماكاو</string>
<string name="madagascar">مدغشقر</string>
<string name="malawi">مالاوي</string>
<string name="malaysia">ماليزيا</string>
<string name="maldives">المالديف</string>
<string name="mali">مالي</string>
<string name="malta">مالطا</string>
<string name="marshall_islands">جزر مارشال</string>
<string name="martinique">مارتينيك</string>
<string name="mauritania">موريتانيا</string>
<string name="mauritius">موريشيوس</string>
<string name="mayotte">مايوت</string>
<string name="mexico">المكسيك</string>
<string name="micronesia">ميكرونيسيا</string>
<string name="moldova">مولدوفا</string>
<string name="monaco">موناكو</string>
<string name="mongolia">منغوليا</string>
<string name="montenegro">الجبل الأسو</string>
<string name="montserrat">مونتسرات</string>
<string name="morocco">المغرب</string>
<string name="mozambique">موزمبيق</string>
<string name="myanmar">(بورما) ميانمار</string>
<string name="namibia">ناميبيا</string>
<string name="nauru">ناورو</string>
<string name="nepal">نيبال</string>
<string name="netherlands">هولندا</string>
<string name="new_caledonia">كاليدونيا الجديدة</string>
<string name="new_zealand">نيوزيلندا</string>
<string name="nicaragua">نيكاراجوا</string>
<string name="niger">النيجر</string>
<string name="nigeria">نيجيريا</string>
<string name="niue">نيوي</string>
<string name="norfolk">جزيرة نورفولك</string>
<string name="north_korea">كوريا الشمالية</string>
<string name="north_macedonia">مقدونيا الشمالية</string>
<string name="northern_mariana">جزر ماريانا الشمالية</string>
<string name="norway">النرويج</string>
<string name="oman">عُمان</string>
<string name="pakistan">باكستان</string>
<string name="palau">بالاو</string>
<string name="panama">بنما</string>
<string name="papua_new_guinea">بابوا غينيا الجديدة</string>
<string name="paraguay">باراغواي</string>
<string name="peru">بيرو</string>
<string name="philippines">الفلبين</string>
<string name="pitcairn">بيتكيرن</string>
<string name="poland">بولندا</string>
<string name="portugal">البرتغال</string>
<string name="puerto_rico">بورتوريكو</string>
<string name="qatar">قطر</string>
<string name="reunion">ريونيون</string>
<string name="romania">رومانيا</string>
<string name="russia">روسيا</string>
<string name="rwanda">رواندا</string>
<string name="saint_barhelemy">سانت بارتليمي</string>
<string name="saint_helena">سانت هيلانة</string>
<string name="saint_kitts">سانت كيتس ونيفيس</string>
<string name="saint_lucia">سانت لوسيا</string>
<string name="saint_martin">سانت مارتن</string>
<string name="saint_pierre">سانت بيير/ميكلون</string>
<string name="saint_vincent">سانت فينسنت والغرينادين</string>
<string name="samoa">ساموا</string>
<string name="san_marino">سان مارينو</string>
<string name="sao_tome">او تومي وبرينسيب</string>
<string name="saudi_arabia">السعودية</string>
<string name="senegal">السنغال</string>
<string name="serbia">صربيا</string>
<string name="seychelles">سيشل</string>
<string name="sierra_leone">سيراليون</string>
<string name="singapore">سنغافورة</string>
<string name="sint_maarten">سانت مارتن</string>
<string name="siri_lanka">سريلانكا</string>
<string name="slovakia">سلوفاكيا</string>
<string name="slovenia">سلوفينيا</string>
<string name="solomon_islands">جزر سليمان</string>
<string name="somalia">الصومال</string>
<string name="south_africa">جنوب أفريقيا</string>
<string name="south_korea">كوريا الجنوبية</string>
<string name="south_sudan">جنوب السودان</string>
<string name="spain">إسبانيا</string>
<string name="state_of_palestine">دولة فلسطين</string>
<string name="sudan">السودان</string>
<string name="suriname">سورينام</string>
<string name="swaziland">سوازيلند (إسواتيني)</string>
<string name="sweden">السويد</string>
<string name="switzerland">سويسرا</string>
<string name="syria">سوريا</string>
<string name="taijikistan">طاجيكستان</string>
<string name="taiwan">تايوان</string>
<string name="tazmania">تنزانيا</string>
<string name="thailand">تايلاند</string>
<string name="timor_leste">تيمور الشرقية</string>
<string name="togo">توغو</string>
<string name="tokelau">توكيلاو</string>
<string name="tonga">تونغا</string>
<string name="trinidad_and_tobago">ترينيداد وتوباغو </string>
<string name="tunisia">تونس</string>
<string name="turkey">تركيا</string>
<string name="turkmenistan">تركمانستان</string>
<string name="turks_and_caicos">جزر توركس/كايكوس</string>
<string name="tuvalu">توفالو</string>
<string name="uganda">أوغندا</string>
<string name="ukraine">أوكرانيا</string>
<string name="united_arab_emirates">الإمارات العربية المتحدة</string>
<string name="united_kingdom">المملكة المتحدة</string>
<string name="united_states_america">الولايات المتحدة</string>
<string name="uruguay">أوروغواي</string>
<string name="uzbekistan">أوزبكستان</string>
<string name="vanuatu">فانواتو</string>
<string name="venezuela">فنزويلا</string>
<string name="vietnam">فيتنام</string>
<string name="virgin_islands">جزر العذراء البريطانية</string>
<string name="virgin_islands_us">جزر العذراء الأمريكية</string>
<string name="wallis_and_futuna">واليس وفوتونا</string>
<string name="yemen">اليمن</string>
<string name="zambia">زامبيا</string>
<string name="zimbabwe">زيمبابوي</string>
<string name="unknown">غير معروف</string>
<string name="search">بحث</string>
<string name="select_country">أختر دولة</string>
<string name="invalid_number">رقم الهاتف غير صحيح</string>
<string name="clear">محو</string>
</resources>

View File

@ -0,0 +1,260 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<string name="afghanistan">Afganistán</string>
<string name="aland_islands">Islas Åland</string>
<string name="albania">Albania</string>
<string name="algeria">Argelia</string>
<string name="american_samoa">Samoa Americana</string>
<string name="andora">Andorra</string>
<string name="andorra">Andorra</string>
<string name="angola">Angola</string>
<string name="anguilla">Anguila</string>
<string name="antarctica">Antártida</string>
<string name="antigua_and_barbuda">Antigua y Barbuda</string>
<string name="argentina">Argentina</string>
<string name="armenia">Armenia</string>
<string name="aruba">Aruba</string>
<string name="australia">Australia</string>
<string name="austria">Austria</string>
<string name="azerbaijan">Azerbaiyán</string>
<string name="bahamas">Bahamas</string>
<string name="bahrain">Baréin</string>
<string name="bangladesh">Bangladesh</string>
<string name="barbados">Barbados</string>
<string name="belarus">Bielorrusia</string>
<string name="belgium">Bélgica</string>
<string name="belize">Belice</string>
<string name="benin">Benín</string>
<string name="bermuda">Bermudas</string>
<string name="bhutan">Bután</string>
<string name="bolivia">Bolivia</string>
<string name="bosnia">Bosnia y Herzegovina</string>
<string name="botswana">Botsuana</string>
<string name="brazil">Brasil</string>
<string name="british_indian_ocean">Territorio Británico del Océano Índico</string>
<string name="brunei_darussalam">Brunei Darussalam</string>
<string name="bulgaria">Bulgaria</string>
<string name="burkina_faso">Burkina Faso</string>
<string name="burundi">Burundi</string>
<string name="cambodia">Camboya</string>
<string name="cameroon">Camerún</string>
<string name="canada">Canadá</string>
<string name="cape_verde">Cabo Verde</string>
<string name="cayman_islands">Islas Caimán</string>
<string name="central_african">República Centroafricana</string>
<string name="chad">Chad</string>
<string name="chile">Chile</string>
<string name="china">China</string>
<string name="christmas_island">Isla de Navidad</string>
<string name="cocos">Islas Cocos (Keeling)</string>
<string name="colombia">Colombia</string>
<string name="comoros">Comoras</string>
<string name="congo">Congo</string>
<string name="congo_democratic">República Democrática del Congo</string>
<string name="cook_islands">Islas Cook</string>
<string name="costa_rica">Costa Rica</string>
<string name="cote_dlvoire">Costa de Marfil</string>
<string name="croatia">Croacia</string>
<string name="cuba">Cuba</string>
<string name="curacao">Curaçao</string>
<string name="cyprus">Chipre</string>
<string name="czech_republic">República Checa</string>
<string name="denmark">Dinamarca</string>
<string name="djibouti">Yibuti</string>
<string name="dominica">Dominica</string>
<string name="dominican_republic">República Dominicana</string>
<string name="ecuador">Ecuador</string>
<string name="egypt">Egipto</string>
<string name="el_salvador">El Salvador</string>
<string name="equatorial_guinea">Guinea Ecuatorial</string>
<string name="eritrea">Eritrea</string>
<string name="estonia">Estonia</string>
<string name="ethiopia">Etiopía</string>
<string name="falkland_islands">Islas Malvinas</string>
<string name="faroe_islands">Islas Faroe</string>
<string name="fiji">Fiyi</string>
<string name="finland">Finlandia</string>
<string name="france">Francia</string>
<string name="french_guiana">Guayana Francesa</string>
<string name="french_polynesia">Polinesia Francesa</string>
<string name="gabon">Gabón</string>
<string name="gambia">Gambia</string>
<string name="georgia">Georgia</string>
<string name="germany">Alemania</string>
<string name="ghana">Ghana</string>
<string name="gibraltar">Gibraltar</string>
<string name="greece">Grecia</string>
<string name="greenland">Groenlandia</string>
<string name="grenada">Granada</string>
<string name="guadeloupe">Guadalupe</string>
<string name="guam">Guam</string>
<string name="guatemala">Guatemala</string>
<string name="guernsey">Guernsey</string>
<string name="guinea">Guinea</string>
<string name="guinea_bissau">Guinea-Bissau</string>
<string name="guyana">Guyana</string>
<string name="haiti">Haití</string>
<string name="holy_see">Santa Sede (Ciudad del Vaticano)</string>
<string name="honduras">Honduras</string>
<string name="hong_kong">Hong Kong</string>
<string name="hungary">Hungría</string>
<string name="iceland">Islandia</string>
<string name="india">India</string>
<string name="indonesia">Indonesia</string>
<string name="iran">Irán, República Islámica de</string>
<string name="iraq">Irak</string>
<string name="ireland">Irlanda</string>
<string name="isle_of_man">Isla de Man</string>
<string name="israil">Israel</string>
<string name="italia">Italia</string>
<string name="jamaica">Jamaica</string>
<string name="japan">Japón</string>
<string name="jersey">Jersey</string>
<string name="jordan">Jordania</string>
<string name="kazakhstan">Kazajstán</string>
<string name="kenya">Kenia</string>
<string name="kiribati">Kiribati</string>
<string name="kosovo">Kosovo</string>
<string name="kuwait">Kuwait</string>
<string name="kyrgyzstan">Kirguistán</string>
<string name="laos">República Democrática Popular Lao</string>
<string name="latvia">Letonia</string>
<string name="lebanon">Líbano</string>
<string name="lesotho">Lesoto</string>
<string name="liberia">Liberia</string>
<string name="libya">Libia</string>
<string name="liechtenstein">Liechtenstein</string>
<string name="lithuania">Lituania</string>
<string name="luxembourg">Luxemburgo</string>
<string name="macau">Macao</string>
<string name="madagascar">Madagascar</string>
<string name="malawi">Malaui</string>
<string name="malaysia">Malasia</string>
<string name="maldives">Maldivas</string>
<string name="mali">Malí</string>
<string name="malta">Malta</string>
<string name="marshall_islands">Islas Marshall</string>
<string name="martinique">Martinica</string>
<string name="mauritania">Mauritania</string>
<string name="mauritius">Mauricio</string>
<string name="mayotte">Mayotte</string>
<string name="mexico">México</string>
<string name="micronesia">Micronesia, Estados Federados de</string>
<string name="moldova">Moldavia, República de</string>
<string name="monaco">Mónaco</string>
<string name="mongolia">Mongolia</string>
<string name="montenegro">Montenegro</string>
<string name="montserrat">Montserrat</string>
<string name="morocco">Marruecos</string>
<string name="mozambique">Mozambique</string>
<string name="myanmar">Birmania</string>
<string name="namibia">Namibia</string>
<string name="nauru">Nauru</string>
<string name="nepal">Nepal</string>
<string name="netherlands">Países Bajos</string>
<string name="new_caledonia">Nueva Caledonia</string>
<string name="new_zealand">Nueva Zelanda</string>
<string name="nicaragua">Nicaragua</string>
<string name="niger">Níger</string>
<string name="nigeria">Nigeria</string>
<string name="niue">Niue</string>
<string name="norfolk">Islas Norfolk</string>
<string name="north_korea">Corea del Norte</string>
<string name="north_macedonia">Macedonia del Norte</string>
<string name="northern_mariana">Islas Marianas del Norte</string>
<string name="norway">Noruega</string>
<string name="oman">Omán</string>
<string name="pakistan">Pakistán</string>
<string name="palau">Palau</string>
<string name="panama">Panamá</string>
<string name="papua_new_guinea">Papúa Nueva Guinea</string>
<string name="paraguay">Paraguay</string>
<string name="peru">Perú</string>
<string name="philippines">Filipinas</string>
<string name="pitcairn">Islas Pitcairn</string>
<string name="poland">Polonia</string>
<string name="portugal">Portugal</string>
<string name="puerto_rico">Puerto Rico</string>
<string name="qatar">Qatar</string>
<string name="reunion">Reunión</string>
<string name="romania">Rumania</string>
<string name="russia">Federación Rusa</string>
<string name="rwanda">Ruanda</string>
<string name="saint_barhelemy">San Bartolomé</string>
<string name="saint_helena">Santa Elena, Ascensión y Tristán de Acuña</string>
<string name="saint_kitts">San Cristóbal y Nieves</string>
<string name="saint_lucia">Santa Lucía</string>
<string name="saint_martin">San Martín</string>
<string name="saint_pierre">San Pedro y Miquelón</string>
<string name="saint_vincent"><![CDATA[Saint Vincent y las Granadinas]]></string>
<string name="samoa">Samoa</string>
<string name="san_marino">San Marino</string>
<string name="sao_tome">Santo Tomé y Príncipe</string>
<string name="saudi_arabia">Arabia Saudita</string>
<string name="senegal">Senegal</string>
<string name="serbia">Serbia</string>
<string name="seychelles">Seychelles</string>
<string name="sierra_leone">Sierra Leona</string>
<string name="singapore">Singapur</string>
<string name="sint_maarten">Sint Maarten</string>
<string name="siri_lanka">Sri Lanka</string>
<string name="slovakia">Eslovaquia</string>
<string name="slovenia">Eslovenia</string>
<string name="solomon_islands">Islas Salomón</string>
<string name="somalia">Somalia</string>
<string name="south_africa">Sudáfrica</string>
<string name="south_korea">Corea del Sur</string>
<string name="south_sudan">Sudán del Sur</string>
<string name="spain">España</string>
<string name="state_of_palestine">Palestina</string>
<string name="sudan">Sudán</string>
<string name="suriname">Surinam</string>
<string name="swaziland">Suazilandia</string>
<string name="sweden">Suecia</string>
<string name="switzerland">Suiza</string>
<string name="syria">República Árabe Siria</string>
<string name="taijikistan">Tayikistán</string>
<string name="taiwan">Taiwán</string>
<string name="tazmania">Tanzania, República Unida de</string>
<string name="thailand">Tailandia</string>
<string name="timor_leste">Timor Oriental</string>
<string name="togo">Togo</string>
<string name="tokelau">Tokelau</string>
<string name="tonga">Tonga</string>
<string name="trinidad_and_tobago"><![CDATA[Trinidad y Tobago]]></string>
<string name="tunisia">Túnez</string>
<string name="turkey">Turquía</string>
<string name="turkmenistan">Turkmenistán</string>
<string name="turks_and_caicos">Islas Turcas y Caicos</string>
<string name="tuvalu">Tuvalu</string>
<string name="uganda">Uganda</string>
<string name="ukraine">Ucrania</string>
<string name="united_arab_emirates">Emiratos Árabes Unidos (EAU)</string>
<string name="united_kingdom">Reino Unido</string>
<string name="united_states_america">Estados Unidos de América</string>
<string name="uruguay">Uruguay</string>
<string name="uzbekistan">Uzbekistán</string>
<string name="vanuatu">Vanuatu</string>
<string name="venezuela">Venezuela, República Bolivariana de</string>
<string name="vietnam">Vietnam</string>
<string name="virgin_islands">Islas Vírgenes Británicas</string>
<string name="virgin_islands_us">Islas Vírgenes de los Estados Unidos</string>
<string name="wallis_and_futuna">Wallis y Futuna</string>
<string name="yemen">Yemen</string>
<string name="zambia">Zambia</string>
<string name="zimbabwe">Zimbabue</string>
<string name="unknown">Desconocido</string>
<string name="search">Buscar\u2026</string>
<string name="select_country">Seleccionar país</string>
<string name="invalid_number">Numero de telefono invalido</string>
<string name="clear">Borrar</string>
</resources>

View File

@ -0,0 +1,260 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<string name="afghanistan">Afghanistan</string>
<string name="aland_islands">Îles Åland</string>
<string name="albania">Albanie</string>
<string name="algeria">Algérie</string>
<string name="american_samoa">Samoa américaines</string>
<string name="andora">Andorre</string>
<string name="andorra">Andorre</string>
<string name="angola">Angola</string>
<string name="anguilla">Anguilla</string>
<string name="antarctica">Antarctique</string>
<string name="antigua_and_barbuda">Antigua-et-Barbuda</string>
<string name="argentina">Argentine</string>
<string name="armenia">Arménie</string>
<string name="aruba">Aruba</string>
<string name="australia">Australie</string>
<string name="austria">Autriche</string>
<string name="azerbaijan">Azerbaïdjan</string>
<string name="bahamas">Bahamas</string>
<string name="bahrain">Bahreïn</string>
<string name="bangladesh">Bangladesh</string>
<string name="barbados">Barbade</string>
<string name="belarus">Biélorussie</string>
<string name="belgium">Belgique</string>
<string name="belize">Belize</string>
<string name="benin">Bénin</string>
<string name="bermuda">Bermudes</string>
<string name="bhutan">Bhoutan</string>
<string name="bolivia">Bolivie</string>
<string name="bosnia">Bosnie-Herzégovine</string>
<string name="botswana">Botswana</string>
<string name="brazil">Brésil</string>
<string name="british_indian_ocean">Territoire britannique de l\'océan Indien</string>
<string name="brunei_darussalam">Brunei Darussalam</string>
<string name="bulgaria">Bulgarie</string>
<string name="burkina_faso">Burkina Faso</string>
<string name="burundi">Burundi</string>
<string name="cambodia">Cambodge</string>
<string name="cameroon">Cameroun</string>
<string name="canada">Canada</string>
<string name="cape_verde">Cap-Vert</string>
<string name="cayman_islands">Îles Caïmans</string>
<string name="central_african">République centrafricaine</string>
<string name="chad">Tchad</string>
<string name="chile">Chili</string>
<string name="china">Chine</string>
<string name="christmas_island">Île Christmas</string>
<string name="cocos">Îles Cocos (Keeling)</string>
<string name="colombia">Colombie</string>
<string name="comoros">Comores</string>
<string name="congo">Congo</string>
<string name="congo_democratic">Congo, la République démocratique du</string>
<string name="cook_islands">Îles Cook</string>
<string name="costa_rica">Costa Rica</string>
<string name="cote_dlvoire">Côte d\'Ivoire</string>
<string name="croatia">Croatie</string>
<string name="cuba">Cuba</string>
<string name="curacao">Curaçao</string>
<string name="cyprus">Chypre</string>
<string name="czech_republic">Tchéquie (République tchèque)</string>
<string name="denmark">Danemark</string>
<string name="djibouti">Djibouti</string>
<string name="dominica">Dominique</string>
<string name="dominican_republic">République dominicaine</string>
<string name="ecuador">Équateur</string>
<string name="egypt">Égypte</string>
<string name="el_salvador">Salvador</string>
<string name="equatorial_guinea">Guinée équatoriale</string>
<string name="eritrea">Érythrée</string>
<string name="estonia">Estonie</string>
<string name="ethiopia">Éthiopie</string>
<string name="falkland_islands">Îles Falkland (Malouines)</string>
<string name="faroe_islands">Îles Féroé</string>
<string name="fiji">Fidji</string>
<string name="finland">Finlande</string>
<string name="france">France</string>
<string name="french_guiana">Guyane française</string>
<string name="french_polynesia">Polynésie française</string>
<string name="gabon">Gabon</string>
<string name="gambia">Gambie</string>
<string name="georgia">Géorgie</string>
<string name="germany">Allemagne</string>
<string name="ghana">Ghana</string>
<string name="gibraltar">Gibraltar</string>
<string name="greece">Grèce</string>
<string name="greenland">Groenland</string>
<string name="grenada">Grenade</string>
<string name="guadeloupe">Guadeloupe</string>
<string name="guam">Guam</string>
<string name="guatemala">Guatemala</string>
<string name="guernsey">Guernesey</string>
<string name="guinea">Guinée</string>
<string name="guinea_bissau">Guinée-Bissau</string>
<string name="guyana">Guyana</string>
<string name="haiti">Haïti</string>
<string name="holy_see">Saint-Siège (État de la Cité du Vatican)</string>
<string name="honduras">Honduras</string>
<string name="hong_kong">Hong Kong</string>
<string name="hungary">Hongrie</string>
<string name="iceland">Islande</string>
<string name="india">Inde</string>
<string name="indonesia">Indonésie</string>
<string name="iran">Iran, République islamique d\'</string>
<string name="iraq">Irak</string>
<string name="ireland">Irlande</string>
<string name="isle_of_man">Île de Man</string>
<string name="israil">Israël</string>
<string name="italia">Italie</string>
<string name="jamaica">Jamaïque</string>
<string name="japan">Japon</string>
<string name="jersey">Jersey</string>
<string name="jordan">Jordanie</string>
<string name="kazakhstan">Kazakhstan</string>
<string name="kenya">Kenya</string>
<string name="kiribati">Kiribati</string>
<string name="kosovo">Kosovo</string>
<string name="kuwait">Koweït</string>
<string name="kyrgyzstan">Kirghizistan</string>
<string name="laos">République démocratique populaire lao</string>
<string name="latvia">Lettonie</string>
<string name="lebanon">Liban</string>
<string name="lesotho">Lesotho</string>
<string name="liberia">Libéria</string>
<string name="libya">Libye</string>
<string name="liechtenstein">Liechtenstein</string>
<string name="lithuania">Lituanie</string>
<string name="luxembourg">Luxembourg</string>
<string name="macau">Macao</string>
<string name="madagascar">Madagascar</string>
<string name="malawi">Malawi</string>
<string name="malaysia">Malaisie</string>
<string name="maldives">Maldives</string>
<string name="mali">Mali</string>
<string name="malta">Malte</string>
<string name="marshall_islands">Îles Marshall</string>
<string name="martinique">Martinique</string>
<string name="mauritania">Mauritanie</string>
<string name="mauritius">Maurice</string>
<string name="mayotte">Mayotte</string>
<string name="mexico">Mexique</string>
<string name="micronesia">Micronésie, États fédérés de</string>
<string name="moldova">Moldova, République de</string>
<string name="monaco">Monaco</string>
<string name="mongolia">Mongolie</string>
<string name="montenegro">Monténégro</string>
<string name="montserrat">Montserrat</string>
<string name="morocco">Maroc</string>
<string name="mozambique">Mozambique</string>
<string name="myanmar">Myanmar</string>
<string name="namibia">Namibie</string>
<string name="nauru">Nauru</string>
<string name="nepal">Népal</string>
<string name="netherlands">Pays-Bas</string>
<string name="new_caledonia">Nouvelle-Calédonie</string>
<string name="new_zealand">Nouvelle-Zélande</string>
<string name="nicaragua">Nicaragua</string>
<string name="niger">Niger</string>
<string name="nigeria">Nigéria</string>
<string name="niue">Niué</string>
<string name="norfolk">Île Norfolk</string>
<string name="north_korea">Corée du Nord</string>
<string name="north_macedonia">Macédoine du Nord</string>
<string name="northern_mariana">Îles Mariannes du Nord</string>
<string name="norway">Norvège</string>
<string name="oman">Oman</string>
<string name="pakistan">Pakistan</string>
<string name="palau">Palaos</string>
<string name="panama">Panama</string>
<string name="papua_new_guinea">Papouasie-Nouvelle-Guinée</string>
<string name="paraguay">Paraguay</string>
<string name="peru">Pérou</string>
<string name="philippines">Philippines</string>
<string name="pitcairn">Pitcairn</string>
<string name="poland">Pologne</string>
<string name="portugal">Portugal</string>
<string name="puerto_rico">Porto Rico</string>
<string name="qatar">Qatar</string>
<string name="reunion">Réunion</string>
<string name="romania">Roumanie</string>
<string name="russia">Fédération de Russie</string>
<string name="rwanda">Rwanda</string>
<string name="saint_barhelemy">Saint-Barthélemy</string>
<string name="saint_helena">Sainte-Hélène, Ascension et Tristan da Cunha</string>
<string name="saint_kitts">Saint-Kitts-et-Nevis</string>
<string name="saint_lucia">Sainte-Lucie</string>
<string name="saint_martin">Saint-Martin (partie française)</string>
<string name="saint_pierre">Saint-Pierre-et-Miquelon</string>
<string name="saint_vincent">Saint-Vincent-et-les-Grenadines</string>
<string name="samoa">Samoa</string>
<string name="san_marino">Saint-Marin</string>
<string name="sao_tome">Sao Tomé-et-Principe</string>
<string name="saudi_arabia">Arabie saoudite</string>
<string name="senegal">Sénégal</string>
<string name="serbia">Serbie</string>
<string name="seychelles">Seychelles</string>
<string name="sierra_leone">Sierra Leone</string>
<string name="singapore">Singapour</string>
<string name="sint_maarten">Saint-Martin (partie néerlandaise)</string>
<string name="siri_lanka">Sri Lanka</string>
<string name="slovakia">Slovaquie</string>
<string name="slovenia">Slovénie</string>
<string name="solomon_islands">Îles Salomon</string>
<string name="somalia">Somalie</string>
<string name="south_africa">Afrique du Sud</string>
<string name="south_korea">Corée du Sud</string>
<string name="south_sudan">Soudan du Sud</string>
<string name="spain">Espagne</string>
<string name="state_of_palestine">Palestine</string>
<string name="sudan">Soudan</string>
<string name="suriname">Suriname</string>
<string name="swaziland">Eswatini</string>
<string name="sweden">Suède</string>
<string name="switzerland">Suisse</string>
<string name="syria">République arabe syrienne</string>
<string name="taijikistan">Tadjikistan</string>
<string name="taiwan">Taïwan</string>
<string name="tazmania">Tanzanie, République unie de</string>
<string name="thailand">Thaïlande</string>
<string name="timor_leste">Timor oriental</string>
<string name="togo">Togo</string>
<string name="tokelau">Tokelau</string>
<string name="tonga">Tonga</string>
<string name="trinidad_and_tobago"><![CDATA[Trinité-et-Tobago]]></string>
<string name="tunisia">Tunisie</string>
<string name="turkey">Turquie</string>
<string name="turkmenistan">Turkménistan</string>
<string name="turks_and_caicos">Îles Turks et Caïques</string>
<string name="tuvalu">Tuvalu</string>
<string name="uganda">Ouganda</string>
<string name="ukraine">Ukraine</string>
<string name="united_arab_emirates">Émirats Arabes Unis (EAU)</string>
<string name="united_kingdom">Royaume-Uni</string>
<string name="united_states_america">États-Unis</string>
<string name="uruguay">Uruguay</string>
<string name="uzbekistan">Ouzbékistan</string>
<string name="vanuatu">Vanuatu</string>
<string name="venezuela">Venezuela</string>
<string name="vietnam">Viet Nam</string>
<string name="virgin_islands">Îles Vierges britanniques</string>
<string name="virgin_islands_us">Îles Vierges des États-Unis</string>
<string name="wallis_and_futuna">Wallis-et-Futuna</string>
<string name="yemen">Yémen</string>
<string name="zambia">Zambie</string>
<string name="zimbabwe">Zimbabwe</string>
<string name="unknown">Inconnu</string>
<string name="search">Recherche\u2026</string>
<string name="select_country">Sélectionnez votre pays</string>
<string name="invalid_number">Numéro de téléphone invalide</string>
<string name="clear">Effacer</string>
</resources>

View File

@ -0,0 +1,260 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<string name="afghanistan">अफ़ग़ानिस्तान</string>
<string name="aland_islands">ऑलैण्ड द्वीपसमूह</string>
<string name="albania">अल्बानिया</string>
<string name="algeria">अल्जीरिया</string>
<string name="american_samoa">अमेरिकी समोआ</string>
<string name="andora">अण्डोरा</string>
<string name="andorra">अण्डोरा</string>
<string name="angola">अंगोला</string>
<string name="anguilla">एंगुइला</string>
<string name="antarctica">अंटार्कटिका</string>
<string name="antigua_and_barbuda">अण्टीगुआ और बारबूडा</string>
<string name="argentina">अर्जेंटीना</string>
<string name="armenia">आर्मीनिया</string>
<string name="aruba">अरूबा</string>
<string name="australia">ऑस्ट्रेलिया</string>
<string name="austria">ऑस्ट्रिया</string>
<string name="azerbaijan">आज़रबाइजान</string>
<string name="bahamas">बहामस</string>
<string name="bahrain">बहरीन</string>
<string name="bangladesh">बांग्लादेश</string>
<string name="barbados">बारबाडोस</string>
<string name="belarus">बेलारूस</string>
<string name="belgium">बेल्जियम</string>
<string name="belize">बेलीज़</string>
<string name="benin">बेनिन</string>
<string name="bermuda">बरमूडा</string>
<string name="bhutan">भूटान</string>
<string name="bolivia">बोलीविया</string>
<string name="bosnia">बोस्निया और हर्जेगोविना</string>
<string name="botswana">बोत्सवाना</string>
<string name="brazil">ब्राज़िल</string>
<string name="british_indian_ocean">ब्रिटिश हिंद महासागर क्षेत्र</string>
<string name="brunei_darussalam">ब्रुनेई</string>
<string name="bulgaria">बुल्गारिया</string>
<string name="burkina_faso">बुर्किना फासो</string>
<string name="burundi">बुरुन्डी</string>
<string name="cambodia">कंबोडिया</string>
<string name="cameroon">कैमरुन</string>
<string name="canada">कनाडा</string>
<string name="cape_verde">केप वर्दे</string>
<string name="cayman_islands">केमन द्वीपसमूह</string>
<string name="central_african">मध्य अफ़्रीकी गणराज्य</string>
<string name="chad">चाड</string>
<string name="chile">चिली</string>
<string name="china">चीन</string>
<string name="christmas_island">क्रिसमस द्वीप</string>
<string name="cocos">कोकोस द्वीपसमूह</string>
<string name="colombia">कोलंबिया</string>
<string name="comoros">कोमोरोस</string>
<string name="congo">कांगो</string>
<string name="congo_democratic">कांगो लोकतान्त्रिक गणराज्य</string>
<string name="cook_islands">कुक द्वीपसमूह</string>
<string name="costa_rica">कोस्टा रिका</string>
<string name="cote_dlvoire">कोत दिव्वार</string>
<string name="croatia">क्रोएशिया</string>
<string name="cuba">क्यूबा</string>
<string name="curacao">क्युरासाओ</string>
<string name="cyprus">साइप्रस</string>
<string name="czech_republic">चेक गणराज्य</string>
<string name="denmark">डेनमार्क</string>
<string name="djibouti">जिबूती</string>
<string name="dominica">डोमिनिका</string>
<string name="dominican_republic">डोमिनिकन गणराज्य</string>
<string name="ecuador">इक्वेडोर</string>
<string name="egypt">मिस्र</string>
<string name="el_salvador">एल साल्वाडोर</string>
<string name="equatorial_guinea">भूमध्यरेखीय गिनी</string>
<string name="eritrea">इरिट्रिया</string>
<string name="estonia">एस्तोनिया</string>
<string name="ethiopia">इथियोपिया</string>
<string name="falkland_islands">फ़ॉकलैंड द्वीपसमूह</string>
<string name="faroe_islands">फरो द्वीपसमूह</string>
<string name="fiji">फ़िजी</string>
<string name="finland">फिनलैंड</string>
<string name="france">फ्रांस</string>
<string name="french_guiana">फ्रेंच गुयाना</string>
<string name="french_polynesia">फ़्रेंच पोलिनेशिया</string>
<string name="gabon">Gabon</string>
<string name="gambia">जाम्बिया</string>
<string name="georgia">जॉर्जिया</string>
<string name="germany">जर्मनी</string>
<string name="ghana">घाना</string>
<string name="gibraltar">जिब्राल्टर</string>
<string name="greece">यूनान</string>
<string name="greenland">ग्रीनलैंड</string>
<string name="grenada">ग्रेनेडा</string>
<string name="guadeloupe">ग्वाडलूप</string>
<string name="guam">Guam</string>
<string name="guatemala">ग्वाटेमाला</string>
<string name="guernsey">ग्वेर्नसे</string>
<string name="guinea">गिनी</string>
<string name="guinea_bissau">गिनी-बिसाऊ</string>
<string name="guyana">गुयाना</string>
<string name="haiti">हाइती</string>
<string name="holy_see">वैटिकन शहर</string>
<string name="honduras">हौन्डुरस</string>
<string name="hong_kong">हांगकांग</string>
<string name="hungary">हंगरी</string>
<string name="iceland">आइसलैंड</string>
<string name="india">भारत</string>
<string name="indonesia">इंडोनेशिया</string>
<string name="iran">ईरान</string>
<string name="iraq">इराक</string>
<string name="ireland">आयरलैंड</string>
<string name="isle_of_man">आइल ऑफ मैन</string>
<string name="israil">इजराइल</string>
<string name="italia">इटली</string>
<string name="jamaica">जमैका</string>
<string name="japan">जापान</string>
<string name="jersey">जर्सी</string>
<string name="jordan">जॉर्डन</string>
<string name="kazakhstan">कज़ाख़िस्तान</string>
<string name="kenya">कीनिया</string>
<string name="kiribati">किरिबाती</string>
<string name="kosovo">कोसोवो</string>
<string name="kuwait">कुवैत</string>
<string name="kyrgyzstan">किर्ग़िज़स्तान</string>
<string name="laos">लाओस</string>
<string name="latvia">लातविया</string>
<string name="lebanon">लेबनान</string>
<string name="lesotho">लिसूतू / लेसोथो</string>
<string name="liberia">लाइबेरिया</string>
<string name="libya">लीबिया</string>
<string name="liechtenstein">लिकटेंस्टाइन</string>
<string name="lithuania">लिथुआनिया</string>
<string name="luxembourg">लक्समबर्ग</string>
<string name="macau">मकाउ</string>
<string name="madagascar">मेडागास्कर</string>
<string name="malawi">मलावी</string>
<string name="malaysia">मलेशिया</string>
<string name="maldives">मालदीव</string>
<string name="mali">माली</string>
<string name="malta">माल्टा</string>
<string name="marshall_islands">मार्शल द्वीपसमूह</string>
<string name="martinique">मार्टीनिक</string>
<string name="mauritania">मॉरीतानिया</string>
<string name="mauritius">मॉरीशस</string>
<string name="mayotte">मायोत</string>
<string name="mexico">मेक्सिको</string>
<string name="micronesia">माइक्रोनेशियाf</string>
<string name="moldova">मॉल्डोवा</string>
<string name="monaco">मोनैको</string>
<string name="mongolia">मंगोलिया</string>
<string name="montenegro">मॉन्टेनीग्रो</string>
<string name="montserrat">मोंटेसेराट</string>
<string name="morocco">मोरक्को</string>
<string name="mozambique">मोज़ाम्बीक</string>
<string name="myanmar">म्यांमार</string>
<string name="namibia">नाम्बिया</string>
<string name="nauru">नाउरु</string>
<string name="nepal">नेपाल</string>
<string name="netherlands">नीदरलैंड</string>
<string name="new_caledonia">नया केलडोनिया</string>
<string name="new_zealand">न्यूज़ीलैंड</string>
<string name="nicaragua">निकारागुआ</string>
<string name="niger">नाइजर</string>
<string name="nigeria">नाईजीरिया</string>
<string name="niue">निउए</string>
<string name="norfolk">नॉर्फ़ोक द्वीपसमूह</string>
<string name="north_korea">उत्तर कोरिया</string>
<string name="north_macedonia">उत्तरी मैसेडोनिया</string>
<string name="northern_mariana">उत्तरी मरीयाना द्वीपसमूह</string>
<string name="norway">नॉर्वे</string>
<string name="oman">ओमान</string>
<string name="pakistan">पाकिस्तान</string>
<string name="palau">पलाउ</string>
<string name="panama">पनामा</string>
<string name="papua_new_guinea">पापुआ न्यू गिनी</string>
<string name="paraguay">पैराग्वे</string>
<string name="peru">पेरू</string>
<string name="philippines">फिलिपींस</string>
<string name="pitcairn">पिटकेर्न द्वीपसमूह</string>
<string name="poland">पोलैंड</string>
<string name="portugal">पुर्तगाल</string>
<string name="puerto_rico">पोर्टो रिको</string>
<string name="qatar">क़तर</string>
<string name="reunion">रेयूनियों</string>
<string name="romania">रोमानिया</string>
<string name="russia">रूस</string>
<string name="rwanda">रवांडा</string>
<string name="saint_barhelemy">सेंट बार्थेलेमी</string>
<string name="saint_helena">सेंट हेलेना</string>
<string name="saint_kitts">सेंट किट्स और नेविस</string>
<string name="saint_lucia">सेंट लूसिया</string>
<string name="saint_martin">सेंट मार्टिन</string>
<string name="saint_pierre">संत पियर एवं मिकलान</string>
<string name="saint_vincent">सेंट विंसेंट एंड ग्रेनाडाइन्स</string>
<string name="samoa">समोआ</string>
<string name="san_marino">सान मारिनो</string>
<string name="sao_tome">साओ तोमे और प्रिन्सिपी</string>
<string name="saudi_arabia">सउदी अरब</string>
<string name="senegal">सेनेगल</string>
<string name="serbia">सर्बिया</string>
<string name="seychelles">सेशेल्स</string>
<string name="sierra_leone">सिएरा लियोन</string>
<string name="singapore">सिंगापुर</string>
<string name="sint_maarten">सिंट मार्टेन</string>
<string name="siri_lanka">श्रीलंका</string>
<string name="slovakia">स्लोवाकिया</string>
<string name="slovenia">स्लोवेनिया</string>
<string name="solomon_islands">सोलोमन द्वीपसमूह</string>
<string name="somalia">सोमालिया</string>
<string name="south_africa">दक्षिण अफ्रीका</string>
<string name="south_korea">दक्षिण कोरिया</string>
<string name="south_sudan">दक्षिण सूडान</string>
<string name="spain">स्पेन</string>
<string name="state_of_palestine">फ़िलिस्तीन</string>
<string name="sudan">सूडान</string>
<string name="suriname">सूरीनाम</string>
<string name="swaziland">स्वाज़ीलैण्ड/एस्वातीनी</string>
<string name="sweden">स्वीडन</string>
<string name="switzerland">स्विट्ज़रलैंड</string>
<string name="syria">सीरिया</string>
<string name="taijikistan">तजाकिस्तान</string>
<string name="taiwan">ताइवान</string>
<string name="tazmania">तंजानिया</string>
<string name="thailand">थाईलैंड</string>
<string name="timor_leste">तिमोर-लेस्ते</string>
<string name="togo">टोगो</string>
<string name="tokelau">टोकेलाऊ</string>
<string name="tonga">टोंगा</string>
<string name="trinidad_and_tobago">त्रिनिदाद और टोबैगो</string>
<string name="tunisia">ट्यूनीशिया</string>
<string name="turkey">तुर्की</string>
<string name="turkmenistan">तुर्कमेनिस्तान</string>
<string name="turks_and_caicos">तुर्क एंड कैकोस द्वीपसमूह</string>
<string name="tuvalu">तुवालू</string>
<string name="uganda">युगांडा</string>
<string name="ukraine">यूक्रेन</string>
<string name="united_arab_emirates">संयुक्त अरब अमीरात</string>
<string name="united_kingdom">संयुक्त ब्रिटेन </string>
<string name="united_states_america">संयुक्त राज्य अमेरिका</string>
<string name="uruguay">उरुग्वे</string>
<string name="uzbekistan">उज़्बेकिस्तान</string>
<string name="vanuatu">वानूआतू</string>
<string name="venezuela">वेनेज़ुएला</string>
<string name="vietnam">वियतनाम</string>
<string name="virgin_islands">ब्रिटिश वर्जिन द्वीपसमूह</string>
<string name="virgin_islands_us">यूएस वर्जिन द्वीपसमूह</string>
<string name="wallis_and_futuna">वालिस और फ़्यूचूना</string>
<string name="yemen">यमन</string>
<string name="zambia">जाम्बिया</string>
<string name="zimbabwe">ज़िम्बाब्वे</string>
<string name="unknown">अज्ञात</string>
<string name="search">खोजें\u2026</string>
<string name="select_country">देश चुनें</string>
<string name="invalid_number">अवैध फोन नंबर</string>
<string name="clear">स्पष्ट</string>
</resources>

View File

@ -0,0 +1,260 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<string name="afghanistan">"Afghanistan "</string>
<string name="aland_islands">"Isole Aland "</string>
<string name="albania">"Albania "</string>
<string name="algeria">"Algeria "</string>
<string name="american_samoa">"Samoa americane "</string>
<string name="andora">Andorra</string>
<string name="andorra">"Andorra "</string>
<string name="angola">"Angola "</string>
<string name="anguilla">Anguilla</string>
<string name="antarctica">"Antartide "</string>
<string name="antigua_and_barbuda">"Antigua e Barbuda "</string>
<string name="argentina">"Argentina "</string>
<string name="armenia">"Armenia "</string>
<string name="aruba">Aruba</string>
<string name="australia">"Australia "</string>
<string name="austria">"Austria "</string>
<string name="azerbaijan">"Azerbaigian "</string>
<string name="bahamas">"Bahamas "</string>
<string name="bahrain">"Bahrein "</string>
<string name="bangladesh">"Bangladesh "</string>
<string name="barbados">"Barbados "</string>
<string name="belarus">"Bielorussia "</string>
<string name="belgium">"Belgio "</string>
<string name="belize">"Belize "</string>
<string name="benin">Benin</string>
<string name="bermuda">Bermuda</string>
<string name="bhutan">Bhutan</string>
<string name="bolivia">"Bolivia "</string>
<string name="bosnia">"Bosnia Erzegovina "</string>
<string name="botswana">"Botswana "</string>
<string name="brazil">"Brasile "</string>
<string name="british_indian_ocean">"Territorio britannico dell'Oceano Indiano "</string>
<string name="brunei_darussalam">Brunei Darussalam</string>
<string name="bulgaria">"Bulgaria "</string>
<string name="burkina_faso">"Burkina Faso "</string>
<string name="burundi">Burundi</string>
<string name="cambodia">"Cambogia "</string>
<string name="cameroon">"Camerun "</string>
<string name="canada">"Canada "</string>
<string name="cape_verde">"Isole di Capo Verde "</string>
<string name="cayman_islands">"Isole Cayman "</string>
<string name="central_african">"Repubblica Centrafricana "</string>
<string name="chad">"Chad "</string>
<string name="chile">"Chile "</string>
<string name="china">"Cinese "</string>
<string name="christmas_island">"Isola di Natale "</string>
<string name="cocos">"Isole Cocos (a chiglia). "</string>
<string name="colombia">"Colombia "</string>
<string name="comoros">"Comore "</string>
<string name="congo">"Congo "</string>
<string name="congo_democratic">"Repubblica Democratica del Congo "</string>
<string name="cook_islands">"Isole Cook "</string>
<string name="costa_rica">"Costa Rica "</string>
<string name="cote_dlvoire">"Costa d'Avorio "</string>
<string name="croatia">"Croazia "</string>
<string name="cuba">"Cuba "</string>
<string name="curacao">Curacao </string>
<string name="cyprus">"Cipro "</string>
<string name="czech_republic">"Repubblica Ceca "</string>
<string name="denmark">"Danimarca "</string>
<string name="djibouti">"Gibuti "</string>
<string name="dominica">"Domenicano "</string>
<string name="dominican_republic">"Repubblica Dominicana "</string>
<string name="ecuador">"Ecuador "</string>
<string name="egypt">" Egitto"</string>
<string name="el_salvador">El Salvador </string>
<string name="equatorial_guinea">"Guinea Equatoriale "</string>
<string name="eritrea">Eritrea</string>
<string name="estonia">"Estonia "</string>
<string name="ethiopia">"Etiopia "</string>
<string name="falkland_islands">"Isole Falkland (malvine) "</string>
<string name="faroe_islands">"Isole Faroe "</string>
<string name="fiji">"Figi "</string>
<string name="finland">"Finlandia "</string>
<string name="france">"Francia "</string>
<string name="french_guiana">"Guiana francese "</string>
<string name="french_polynesia">"Polinesia francese "</string>
<string name="gabon">Gabon </string>
<string name="gambia">"Gambia "</string>
<string name="georgia">"Georgia "</string>
<string name="germany">"Germania "</string>
<string name="ghana">"Ghana "</string>
<string name="gibraltar">"Gibilterra "</string>
<string name="greece">"Grecia "</string>
<string name="greenland">"Groenlandia "</string>
<string name="grenada">"Granata "</string>
<string name="guadeloupe">"Guadalupa "</string>
<string name="guam">Guam </string>
<string name="guatemala">Guatemala </string>
<string name="guernsey">Guernsey </string>
<string name="guinea">"Guinea "</string>
<string name="guinea_bissau">Gine-bissau </string>
<string name="guyana">Guyana</string>
<string name="haiti">Haiti</string>
<string name="holy_see">Santa Sede (Stato Città del Vaticano)</string>
<string name="honduras">Honduras</string>
<string name="hong_kong">Hong Kong</string>
<string name="hungary">"Ungheria "</string>
<string name="iceland">"Islanda "</string>
<string name="india">"India "</string>
<string name="indonesia">Indonesia</string>
<string name="iran">"Repubblica Islamica dell'Iran "</string>
<string name="iraq">"Iraq "</string>
<string name="ireland">Irlanda</string>
<string name="isle_of_man">"Isola di Man "</string>
<string name="israil">"Israele "</string>
<string name="italia">"Italia "</string>
<string name="jamaica">"Giamaica "</string>
<string name="japan">"Giappone "</string>
<string name="jersey">Jersey</string>
<string name="jordan">"Giordania "</string>
<string name="kazakhstan">"Kazakistan "</string>
<string name="kenya">"Kenia "</string>
<string name="kiribati">Kiribati </string>
<string name="kosovo">Kosovo</string>
<string name="kuwait">"Kuwait "</string>
<string name="kyrgyzstan">"Kirghizistan "</string>
<string name="laos">"Repubblica Democratica Popolare del Laos "</string>
<string name="latvia">"Lettonia "</string>
<string name="lebanon">"Libano "</string>
<string name="lesotho">Lesotho</string>
<string name="liberia">"Liberia "</string>
<string name="libya">"Libia "</string>
<string name="liechtenstein">"Liechtenstein "</string>
<string name="lithuania">"Lituania "</string>
<string name="luxembourg">"Lussemburgo "</string>
<string name="macau">"Macao "</string>
<string name="madagascar">"Madagascar "</string>
<string name="malawi">Malawi</string>
<string name="malaysia">"Malaysia "</string>
<string name="maldives">"Maldive "</string>
<string name="mali">Mali</string>
<string name="malta">"Malta "</string>
<string name="marshall_islands">"Isole Marshall "</string>
<string name="martinique">"Martinica "</string>
<string name="mauritania">"Mauritania "</string>
<string name="mauritius">"Maurizio "</string>
<string name="mayotte">Mayotte</string>
<string name="mexico">"Messicano "</string>
<string name="micronesia">"Micronesia, Stati Federati "</string>
<string name="moldova">"Repubblica di Moldova "</string>
<string name="monaco">"Monaco "</string>
<string name="mongolia">"Mongolia "</string>
<string name="montenegro">"Montenegro "</string>
<string name="montserrat">Montserrat </string>
<string name="morocco">"Marocco "</string>
<string name="mozambique">"Mozambico "</string>
<string name="myanmar">"Birmania "</string>
<string name="namibia">"Namibia "</string>
<string name="nauru">Nauru</string>
<string name="nepal">Nepal</string>
<string name="netherlands">"Olanda "</string>
<string name="new_caledonia">"Nuova Caledonia "</string>
<string name="new_zealand">"Nuova Zelanda "</string>
<string name="nicaragua">"Nicaragua "</string>
<string name="niger">"Niger "</string>
<string name="nigeria">"Nigeria "</string>
<string name="niue">"Niue "</string>
<string name="norfolk">"Isole Norfolk "</string>
<string name="north_korea">"Corea del nord "</string>
<string name="north_macedonia">"Macedonia "</string>
<string name="northern_mariana">"Isole Marianne settentrionali "</string>
<string name="norway">"Norvegia "</string>
<string name="oman">"Oman "</string>
<string name="pakistan">"Pakistan "</string>
<string name="palau">Palau</string>
<string name="panama">"Panama "</string>
<string name="papua_new_guinea">"Papua Nuova Guinea "</string>
<string name="paraguay">"Paraguay "</string>
<string name="peru">"Perù "</string>
<string name="philippines">Filippine</string>
<string name="pitcairn">"Isole Pitcairn "</string>
<string name="poland">Polonia</string>
<string name="portugal">"Portogallo "</string>
<string name="puerto_rico">"Porto Rico "</string>
<string name="qatar">Qatar</string>
<string name="reunion">"Riunione "</string>
<string name="romania">Romania</string>
<string name="russia">"Federazione Russa "</string>
<string name="rwanda">Ruanda </string>
<string name="saint_barhelemy">"San Bartolomeo "</string>
<string name="saint_helena">"Sant'Elena, Ascensione e Tristano Da Cunha "</string>
<string name="saint_kitts">"Saint Kitts e Nevis "</string>
<string name="saint_lucia">"Santa Lucia "</string>
<string name="saint_martin">"San Martino "</string>
<string name="saint_pierre">"Santi Pietro e Miquelon "</string>
<string name="saint_vincent">St. Vincent e Grenadine</string>
<string name="samoa">Samoa</string>
<string name="san_marino">San Marino</string>
<string name="sao_tome">"Sao Tomé e Principe "</string>
<string name="saudi_arabia">"Arabia Saudita "</string>
<string name="senegal">"Senegal "</string>
<string name="serbia">"Serbia "</string>
<string name="seychelles">"Seychelles "</string>
<string name="sierra_leone">Sierra Leone </string>
<string name="singapore">"Singapore "</string>
<string name="sint_maarten">"Sint Maarten "</string>
<string name="siri_lanka">Sri Lanka</string>
<string name="slovakia">"Slovacchia "</string>
<string name="slovenia">"Slovenia "</string>
<string name="solomon_islands">"Isole Salomone "</string>
<string name="somalia">Somali</string>
<string name="south_africa">Sud Africa</string>
<string name="south_korea">"Corea del Sud "</string>
<string name="south_sudan">"Sudan del Sud "</string>
<string name="spain">"Spagna "</string>
<string name="state_of_palestine">"Palestina "</string>
<string name="sudan">"Sudan "</string>
<string name="suriname">"Suriname "</string>
<string name="swaziland">"Swaziland "</string>
<string name="sweden">"Svezia "</string>
<string name="switzerland">"Svizzera "</string>
<string name="syria">"Repubblica Araba Siriana "</string>
<string name="taijikistan">"Tagikistan "</string>
<string name="taiwan">"Taiwan "</string>
<string name="tazmania">"Tanzania, Repubblica Unita "</string>
<string name="thailand">"Tailandia "</string>
<string name="timor_leste">"Timor Est "</string>
<string name="togo">"Andare "</string>
<string name="tokelau">Tokelau </string>
<string name="tonga">"Tongano "</string>
<string name="trinidad_and_tobago">"Trinidad e Tobago "</string>
<string name="tunisia">"Tunisia "</string>
<string name="turkey">Turchia</string>
<string name="turkmenistan">"Turkmenistan "</string>
<string name="turks_and_caicos">"Isole Turks e Caicos "</string>
<string name="tuvalu">"Tuvalù "</string>
<string name="uganda">"Uganda "</string>
<string name="ukraine">"Ucraina "</string>
<string name="united_arab_emirates">"Unità degli Emirati Arabi "</string>
<string name="united_kingdom">"Regno Unito "</string>
<string name="united_states_america">"Stati Uniti d'America "</string>
<string name="uruguay">"Uruguay "</string>
<string name="uzbekistan">"Uzbekistan "</string>
<string name="vanuatu">Vanuatu</string>
<string name="venezuela">Venezuela, Repubblica Bolivariana</string>
<string name="vietnam">Vietnam</string>
<string name="virgin_islands">Isole Vergini Britanniche</string>
<string name="virgin_islands_us">Isole Vergini americane</string>
<string name="wallis_and_futuna">Wallis ve Futuna</string>
<string name="yemen">Yemen</string>
<string name="zambia">Zambia</string>
<string name="zimbabwe">Zimbabwe </string>
<string name="unknown">Sconosciuto</string>
<string name="search">Ricerca\u2026</string>
<string name="select_country">Seleziona il paese</string>
<string name="invalid_number">Numero di telefono sbagliato</string>
<string name="clear">Pulisci</string>
</resources>

View File

@ -0,0 +1,260 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<string name="afghanistan">Afghanistan</string>
<string name="aland_islands">Åland</string>
<string name="albania">Albanië</string>
<string name="algeria">Algerije</string>
<string name="american_samoa">Amerikaans-Samoa</string>
<string name="andora">Andorra</string>
<string name="andorra">Andorra</string>
<string name="angola">Angola</string>
<string name="anguilla">Anguilla</string>
<string name="antarctica">Antarctica</string>
<string name="antigua_and_barbuda">Antigua en Barbuda</string>
<string name="argentina">Argentinië</string>
<string name="armenia">Armenië</string>
<string name="aruba">Aruba</string>
<string name="australia">Australië</string>
<string name="austria">Oostenrijk</string>
<string name="azerbaijan">Azerbeidzjan</string>
<string name="bahamas">Bahamas</string>
<string name="bahrain">Bahrein</string>
<string name="bangladesh">Bangladesh</string>
<string name="barbados">Barbados</string>
<string name="belarus">Wit-Rusland</string>
<string name="belgium">België</string>
<string name="belize">Belize</string>
<string name="benin">Benin</string>
<string name="bermuda">Bermuda</string>
<string name="bhutan">Bhutan</string>
<string name="bolivia">Bolivia</string>
<string name="bosnia">Bosnië en Herzegovina</string>
<string name="botswana">Botswana</string>
<string name="brazil">Brazilië</string>
<string name="british_indian_ocean">Brits Indische Oceaanterritorium</string>
<string name="brunei_darussalam">Brunei Darussalam</string>
<string name="bulgaria">Bulgarije</string>
<string name="burkina_faso">Burkina Faso</string>
<string name="burundi">Burundi</string>
<string name="cambodia">Cambodja</string>
<string name="cameroon">Kameroen</string>
<string name="canada">Canada</string>
<string name="cape_verde">Kaapverdië</string>
<string name="cayman_islands">Kaaimaneilanden</string>
<string name="central_african">Centraal-Afrikaanse Republiek</string>
<string name="chad">Tsjaad</string>
<string name="chile">Chili</string>
<string name="china">China</string>
<string name="christmas_island">Christmaseiland</string>
<string name="cocos">Cocoseilanden (Keeling)</string>
<string name="colombia">Colombia</string>
<string name="comoros">Comoren</string>
<string name="congo">Republiek Congo</string>
<string name="congo_democratic">Democratische Republiek Congo</string>
<string name="cook_islands">Cookeilanden</string>
<string name="costa_rica">Costa Rica</string>
<string name="cote_dlvoire">Ivoorkust</string>
<string name="croatia">Kroatië</string>
<string name="cuba">Cuba</string>
<string name="curacao">Curaçao</string>
<string name="cyprus">Cyprus</string>
<string name="czech_republic">Tsjechische Republiek</string>
<string name="denmark">Denemarken</string>
<string name="djibouti">Djibouti</string>
<string name="dominica">Dominica</string>
<string name="dominican_republic">Dominicaanse Republiek</string>
<string name="ecuador">Ecuador</string>
<string name="egypt">Egypte</string>
<string name="el_salvador">El Salvador</string>
<string name="equatorial_guinea">Equatoriaal-Guinea</string>
<string name="eritrea">Eritrea</string>
<string name="estonia">Estland</string>
<string name="ethiopia">Ethiopië</string>
<string name="falkland_islands">Falklandeilanden</string>
<string name="faroe_islands">Faeröer Eilanden</string>
<string name="fiji">Fiji</string>
<string name="finland">Finland</string>
<string name="france">Frankrijk</string>
<string name="french_guiana">Frans-Guyana</string>
<string name="french_polynesia">Frans-Polynesië</string>
<string name="gabon">Gabon</string>
<string name="gambia">Gambia</string>
<string name="georgia">Georgië</string>
<string name="germany">Duitsland</string>
<string name="ghana">Ghana</string>
<string name="gibraltar">Gibraltar</string>
<string name="greece">Griekenland</string>
<string name="greenland">Groenland</string>
<string name="grenada">Grenada</string>
<string name="guadeloupe">Guadeloupe</string>
<string name="guam">Guam</string>
<string name="guatemala">Guatemala</string>
<string name="guernsey">Guernsey</string>
<string name="guinea">Guinee</string>
<string name="guinea_bissau">Guinee-Bissau</string>
<string name="guyana">Guyana</string>
<string name="haiti">Haïti</string>
<string name="holy_see">Vaticaanstad (Heilige Stoel)</string>
<string name="honduras">Honduras</string>
<string name="hong_kong">Hongkong</string>
<string name="hungary">Hongarije</string>
<string name="iceland">IJsland</string>
<string name="india">India</string>
<string name="indonesia">Indonesië</string>
<string name="iran">Iran, Islamitische Republiek</string>
<string name="iraq">Irak</string>
<string name="ireland">Ierland</string>
<string name="isle_of_man">Eiland Man</string>
<string name="israil">Israël</string>
<string name="italia">Italië</string>
<string name="jamaica">Jamaica</string>
<string name="japan">Japan</string>
<string name="jersey">Jersey</string>
<string name="jordan">Jordanië</string>
<string name="kazakhstan">Kazachstan</string>
<string name="kenya">Kenia</string>
<string name="kiribati">Kiribati</string>
<string name="kosovo">Kosovo</string>
<string name="kuwait">Koeweit</string>
<string name="kyrgyzstan">Kirgizië</string>
<string name="laos">Laos, Democratische Volksrepubliek</string>
<string name="latvia">Letland</string>
<string name="lebanon">Libanon</string>
<string name="lesotho">Lesotho</string>
<string name="liberia">Liberia</string>
<string name="libya">Libië</string>
<string name="liechtenstein">Liechtenstein</string>
<string name="lithuania">Litouwen</string>
<string name="luxembourg">Luxemburg</string>
<string name="macau">Macau</string>
<string name="madagascar">Madagaskar</string>
<string name="malawi">Malawi</string>
<string name="malaysia">Maleisië</string>
<string name="maldives">Maldiven</string>
<string name="mali">Mali</string>
<string name="malta">Malta</string>
<string name="marshall_islands">Marshalleilanden</string>
<string name="martinique">Martinique</string>
<string name="mauritania">Mauritanië</string>
<string name="mauritius">Mauritius</string>
<string name="mayotte">Mayotte</string>
<string name="mexico">Mexico</string>
<string name="micronesia">Micronesië, Federale Staten van</string>
<string name="moldova">Moldavië, Republiek</string>
<string name="monaco">Monaco</string>
<string name="mongolia">Mongolië</string>
<string name="montenegro">Montenegro</string>
<string name="montserrat">Montserrat</string>
<string name="morocco">Marokko</string>
<string name="mozambique">Mozambique</string>
<string name="myanmar">Myanmar (Birma)</string>
<string name="namibia">Namibië</string>
<string name="nauru">Nauru</string>
<string name="nepal">Nepal</string>
<string name="netherlands">Nederland</string>
<string name="new_caledonia">Nieuw-Caledonië</string>
<string name="new_zealand">Nieuw-Zeeland</string>
<string name="nicaragua">Nicaragua</string>
<string name="niger">Niger</string>
<string name="nigeria">Nigeria</string>
<string name="niue">Niue</string>
<string name="norfolk">Norfolkeilanden</string>
<string name="north_korea">Noord-Korea</string>
<string name="north_macedonia">Noord-Macedonië</string>
<string name="northern_mariana">Noordelijke Marianen</string>
<string name="norway">Noorwegen</string>
<string name="oman">Oman</string>
<string name="pakistan">Pakistan</string>
<string name="palau">Palau</string>
<string name="panama">Panama</string>
<string name="papua_new_guinea">Papoea-Nieuw-Guinea</string>
<string name="paraguay">Paraguay</string>
<string name="peru">Peru</string>
<string name="philippines">Filipijnen</string>
<string name="pitcairn">Pitcairneilanden</string>
<string name="poland">Polen</string>
<string name="portugal">Portugal</string>
<string name="puerto_rico">Puerto Rico</string>
<string name="qatar">Qatar</string>
<string name="reunion">Réunion</string>
<string name="romania">Roemenië</string>
<string name="russia">Russische Federatie</string>
<string name="rwanda">Rwanda</string>
<string name="saint_barhelemy">Sint-Bartholomeus</string>
<string name="saint_helena">Sint-Helena, Ascension en Tristan da Cunha</string>
<string name="saint_kitts">Saint Kitts en Nevis</string>
<string name="saint_lucia">Saint Lucia</string>
<string name="saint_martin">Collectiviteit van Sint-Maarten</string>
<string name="saint_pierre">Saint-Pierre en Miquelon</string>
<string name="saint_vincent"><![CDATA[Sint Vincent en de Grenadines]]></string>
<string name="samoa">Samoa</string>
<string name="san_marino">San Marino</string>
<string name="sao_tome">Sao Tomé en Principe</string>
<string name="saudi_arabia">Saoedi-Arabië</string>
<string name="senegal">Senegal</string>
<string name="serbia">Servië</string>
<string name="seychelles">Seychellen</string>
<string name="sierra_leone">Sierra Leone</string>
<string name="singapore">Singapore</string>
<string name="sint_maarten">Sint Maarten</string>
<string name="siri_lanka">Sri Lanka</string>
<string name="slovakia">Slowakije</string>
<string name="slovenia">Slovenië</string>
<string name="solomon_islands">Salomonseilanden</string>
<string name="somalia">Somalië</string>
<string name="south_africa">Zuid-Afrika</string>
<string name="south_korea">Zuid-Korea</string>
<string name="south_sudan">Zuid-Soedan</string>
<string name="spain">Spanje</string>
<string name="state_of_palestine">Palestina</string>
<string name="sudan">Soedan</string>
<string name="suriname">Suriname</string>
<string name="swaziland">Swaziland</string>
<string name="sweden">Zweden</string>
<string name="switzerland">Zwitserland</string>
<string name="syria">Syrische Arabische Republiek</string>
<string name="taijikistan">Tadzjikistan</string>
<string name="taiwan">Taiwan</string>
<string name="tazmania">Tanzania, Verenigde Republiek</string>
<string name="thailand">Thailand</string>
<string name="timor_leste">Oost-Timor</string>
<string name="togo">Togolese Republiek</string>
<string name="tokelau">Tokelau</string>
<string name="tonga">Tonga</string>
<string name="trinidad_and_tobago"><![CDATA[Trinidad en Tobago]]></string>
<string name="tunisia">Tunesië</string>
<string name="turkey">Turkije</string>
<string name="turkmenistan">Turkmenistan</string>
<string name="turks_and_caicos">Turks- en Caicoseilanden</string>
<string name="tuvalu">Tuvalu</string>
<string name="uganda">Oeganda</string>
<string name="ukraine">Oekraïne</string>
<string name="united_arab_emirates">Verenigde Arabische Emiraten (UAE)</string>
<string name="united_kingdom">Verenigd Koninkrijk</string>
<string name="united_states_america">Verenigde Staten van Amerika</string>
<string name="uruguay">Uruguay</string>
<string name="uzbekistan">Oezbekistan</string>
<string name="vanuatu">Vanuatu</string>
<string name="venezuela">Venezuela, Bolivariaanse Republiek</string>
<string name="vietnam">Vietnam</string>
<string name="virgin_islands">Britse Maagdeneilanden</string>
<string name="virgin_islands_us">Amerikaanse Maagdeneilanden</string>
<string name="wallis_and_futuna">Wallis en Futuna</string>
<string name="yemen">Jemen</string>
<string name="zambia">Zambia</string>
<string name="zimbabwe">Zimbabwe</string>
<string name="unknown">Onbekend</string>
<string name="search">Zoeken\u2026</string>
<string name="select_country">Selecteer land</string>
<string name="invalid_number">Ongeldig telefoonnummer</string>
<string name="clear">Wissen</string>
</resources>

View File

@ -0,0 +1,260 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<string name="afghanistan">Афганистан</string>
<string name="aland_islands">Аландские острова</string>
<string name="albania">Албания</string>
<string name="algeria">Алжир</string>
<string name="american_samoa">Американское Самоа</string>
<string name="andora">Андорра</string>
<string name="andorra">Андорра</string>
<string name="angola">Ангола</string>
<string name="anguilla">Ангилья</string>
<string name="antarctica">Антарктика</string>
<string name="antigua_and_barbuda">Антигуа и Барбуда</string>
<string name="argentina">Аргентина</string>
<string name="armenia">Армения</string>
<string name="aruba">Аруба</string>
<string name="australia">Австралия</string>
<string name="austria">Австрия</string>
<string name="azerbaijan">Азербайджан</string>
<string name="bahamas">Багамы</string>
<string name="bahrain">Бахрейн</string>
<string name="bangladesh">Бангладеш</string>
<string name="barbados">Барбадос</string>
<string name="belarus">Беларусь</string>
<string name="belgium">Бельгия</string>
<string name="belize">Белиз</string>
<string name="benin">Бенин</string>
<string name="bermuda">Бермуды</string>
<string name="bhutan">Бутан</string>
<string name="bolivia">Боливия</string>
<string name="bosnia">Босния и Герцеговина</string>
<string name="botswana">Ботсвана</string>
<string name="brazil">Бразилия</string>
<string name="british_indian_ocean">Британская территория Индийского океана</string>
<string name="brunei_darussalam">Бруней-Даруссалам</string>
<string name="bulgaria">Болгария</string>
<string name="burkina_faso">Буркина-Фасо</string>
<string name="burundi">Бурунди</string>
<string name="cambodia">Камбоджа</string>
<string name="cameroon">Камерун</string>
<string name="canada">Канада</string>
<string name="cape_verde">Кабо-Верде</string>
<string name="cayman_islands">Кайманы</string>
<string name="central_african">Центральноафриканская республика</string>
<string name="chad">Чад</string>
<string name="chile">Чили</string>
<string name="china">Китай</string>
<string name="christmas_island">Остров Рождества</string>
<string name="cocos">Кокосовые острова (острова Килинг)</string>
<string name="colombia">Колумбия</string>
<string name="comoros">Коморские острова</string>
<string name="congo">Конго</string>
<string name="congo_democratic">Демократическая республика Конго</string>
<string name="cook_islands">Острова Кука</string>
<string name="costa_rica">Коста-Рика</string>
<string name="cote_dlvoire">Кот-д-Ивуар</string>
<string name="croatia">Хорватия</string>
<string name="cuba">Куба</string>
<string name="curacao">Курасао</string>
<string name="cyprus">Кипр</string>
<string name="czech_republic">Чехия</string>
<string name="denmark">Дания</string>
<string name="djibouti">Джибути</string>
<string name="dominica">Доминика</string>
<string name="dominican_republic">Доминиканская республика</string>
<string name="ecuador">Эквадор</string>
<string name="egypt">Египет</string>
<string name="el_salvador">Сальвадор</string>
<string name="equatorial_guinea">Экваториальная Гвинея</string>
<string name="eritrea">Эритрея</string>
<string name="estonia">Эстония</string>
<string name="ethiopia">Эфиопия</string>
<string name="falkland_islands">Фолклендские острова (Мальвинские острова)</string>
<string name="faroe_islands">Фарерские острова</string>
<string name="fiji">Фиджи</string>
<string name="finland">Финляндия</string>
<string name="france">Франция</string>
<string name="french_guiana">Французская Гвиана</string>
<string name="french_polynesia">Французская Полинезия</string>
<string name="gabon">Габон</string>
<string name="gambia">Гамбия</string>
<string name="georgia">Грузия</string>
<string name="germany">Германия</string>
<string name="ghana">Гана</string>
<string name="gibraltar">Гибралтар</string>
<string name="greece">Греция</string>
<string name="greenland">Гренландия</string>
<string name="grenada">Гренада</string>
<string name="guadeloupe">Гваделупа</string>
<string name="guam">Гуам</string>
<string name="guatemala">Гватемала</string>
<string name="guernsey">Гернси</string>
<string name="guinea">Гвинея</string>
<string name="guinea_bissau">Гвинея-Бисау</string>
<string name="guyana">Гайана</string>
<string name="haiti">Гаити</string>
<string name="holy_see">город-государство Ватикан</string>
<string name="honduras">Гондурас</string>
<string name="hong_kong">Гонконг</string>
<string name="hungary">Венгрия</string>
<string name="iceland">Исландия</string>
<string name="india">Индия</string>
<string name="indonesia">Индонезия</string>
<string name="iran">Исламская Республика Иран</string>
<string name="iraq">Ирак</string>
<string name="ireland">Ирландия</string>
<string name="isle_of_man">Остров Мэн</string>
<string name="israil">Израиль</string>
<string name="italia">Италия</string>
<string name="jamaica">Ямайка</string>
<string name="japan">Япония</string>
<string name="jersey">Джерси</string>
<string name="jordan">Иордания</string>
<string name="kazakhstan">Казахстан</string>
<string name="kenya">Кения</string>
<string name="kiribati">Кирибати</string>
<string name="kosovo">Косово</string>
<string name="kuwait">Кувейт</string>
<string name="kyrgyzstan">Кыргызстан</string>
<string name="laos">Лаосская Народно-Демократическая Республика</string>
<string name="latvia">Латвия</string>
<string name="lebanon">Ливан</string>
<string name="lesotho">Лесото</string>
<string name="liberia">Либерия</string>
<string name="libya">Ливия</string>
<string name="liechtenstein">Лихтенштейн</string>
<string name="lithuania">Литва</string>
<string name="luxembourg">Люксембург</string>
<string name="macau">Макао</string>
<string name="madagascar">Мадагаскар</string>
<string name="malawi">Малави</string>
<string name="malaysia">Малайзия</string>
<string name="maldives">Мальдивы</string>
<string name="mali">Мали</string>
<string name="malta">Мальта</string>
<string name="marshall_islands">Маршалловы острова</string>
<string name="martinique">Мартиника</string>
<string name="mauritania">Мавритания</string>
<string name="mauritius">Маврикий</string>
<string name="mayotte">Майотта</string>
<string name="mexico">Мексика</string>
<string name="micronesia">Федеративные Штаты Микронезии</string>
<string name="moldova">Молдова</string>
<string name="monaco">Монако</string>
<string name="mongolia">Монголия</string>
<string name="montenegro">Черногория</string>
<string name="montserrat">Монтсеррат</string>
<string name="morocco">Марокко</string>
<string name="mozambique">Мозамбик</string>
<string name="myanmar">Мьянма</string>
<string name="namibia">Намибия</string>
<string name="nauru">Науру</string>
<string name="nepal">Непал</string>
<string name="netherlands">Нидерланды</string>
<string name="new_caledonia">Новая Каледония</string>
<string name="new_zealand">Новая Зеландия</string>
<string name="nicaragua">Никарагуа</string>
<string name="niger">Нигер</string>
<string name="nigeria">Нигерия</string>
<string name="niue">Ниуэ</string>
<string name="norfolk">Норфолкские острова</string>
<string name="north_korea">Корейская Народно-Демократическая Республика</string>
<string name="north_macedonia">Северная Македония</string>
<string name="northern_mariana">Северные Марианские острова</string>
<string name="norway">Норвегия</string>
<string name="oman">Оман</string>
<string name="pakistan">Пакистан</string>
<string name="palau">Палау</string>
<string name="panama">Панама</string>
<string name="papua_new_guinea">Папуа-Новая Гвинея</string>
<string name="paraguay">Парагвай</string>
<string name="peru">Перу</string>
<string name="philippines">Филиппины</string>
<string name="pitcairn">Острова Питкэрн</string>
<string name="poland">Польша</string>
<string name="portugal">Португалия</string>
<string name="puerto_rico">Пуэрто-Рико</string>
<string name="qatar">Катар</string>
<string name="reunion">Реюньон</string>
<string name="romania">Румыния</string>
<string name="russia">Российская Федерация</string>
<string name="rwanda">Руанда</string>
<string name="saint_barhelemy">Сен-Бартельми</string>
<string name="saint_helena">Святая Елена, Вознесение и Тристан да Кунья</string>
<string name="saint_kitts">Сент-Китс и Невис</string>
<string name="saint_lucia">Сент-Люсия</string>
<string name="saint_martin">Сент-Мартин</string>
<string name="saint_pierre">Сен-Пьер и Микелон</string>
<string name="saint_vincent">Сент-Винсент и Гренадины</string>
<string name="samoa">Самоа</string>
<string name="san_marino">Сан-Марино</string>
<string name="sao_tome">Сан-Томе и Принсипи</string>
<string name="saudi_arabia">Саудовская Аравия</string>
<string name="senegal">Сенегал</string>
<string name="serbia">Сербия</string>
<string name="seychelles">Сейшелы</string>
<string name="sierra_leone">Сьерра-Леоне</string>
<string name="singapore">Сингапур</string>
<string name="sint_maarten">Синт-Мартен</string>
<string name="siri_lanka">Шри-Ланка</string>
<string name="slovakia">Словакия</string>
<string name="slovenia">Словения</string>
<string name="solomon_islands">Соломоновы острова</string>
<string name="somalia">Сомали</string>
<string name="south_africa">Южноафриканская республика</string>
<string name="south_korea">Республика Корея</string>
<string name="south_sudan">Южный Судан</string>
<string name="spain">Испания</string>
<string name="state_of_palestine">Палестина</string>
<string name="sudan">Судан</string>
<string name="suriname">Суринам</string>
<string name="swaziland">Свазиленд</string>
<string name="sweden">Швеция</string>
<string name="switzerland">Швейцария</string>
<string name="syria">Сирийская Арабская Республика</string>
<string name="taijikistan">Таджикистан</string>
<string name="taiwan">Тайвань</string>
<string name="tazmania">Танзания</string>
<string name="thailand">Тайланд</string>
<string name="timor_leste">Тимор-Лешти</string>
<string name="togo">Того</string>
<string name="tokelau">Токелау</string>
<string name="tonga">Тонга</string>
<string name="trinidad_and_tobago">Тринидад и Тобаго</string>
<string name="tunisia">Тунис</string>
<string name="turkey">Турция</string>
<string name="turkmenistan">Туркменистан</string>
<string name="turks_and_caicos">острова Теркс и Кайкос</string>
<string name="tuvalu">Тувалу</string>
<string name="uganda">Уганда</string>
<string name="ukraine">Украина</string>
<string name="united_arab_emirates">Объединённые Арабские Эмираты (ОАЭ)</string>
<string name="united_kingdom">Великобритания</string>
<string name="united_states_america">Соединённые Штаты Америки</string>
<string name="uruguay">Уругвай</string>
<string name="uzbekistan">Узбекистан</string>
<string name="vanuatu">Вануату</string>
<string name="venezuela">Боливарианская Республика Венесуэла</string>
<string name="vietnam">Вьетнам</string>
<string name="virgin_islands">Британские Виргинские Острова</string>
<string name="virgin_islands_us">Виргинские острова США</string>
<string name="wallis_and_futuna">Уоллис и Футуна</string>
<string name="yemen">Йемен</string>
<string name="zambia">Замбия</string>
<string name="zimbabwe">Зимбабве</string>
<string name="unknown">Неизвестный</string>
<string name="search">Поиск\u2026</string>
<string name="select_country">Выберите страну</string>
<string name="invalid_number">Неверный номер телефона</string>
<string name="clear">Очистить</string>
</resources>

View File

@ -0,0 +1,260 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<string name="afghanistan">Afgaanistaan</string>
<string name="aland_islands">Jasiiradaha Aaland</string>
<string name="albania">Albaaniya</string>
<string name="algeria">Aljeeriya</string>
<string name="american_samoa">Samowada Ameerika</string>
<string name="andora">Andora</string>
<string name="andorra">Andora</string>
<string name="angola">Angoola</string>
<string name="anguilla">Anguilla</string>
<string name="antarctica">Antarctica</string>
<string name="antigua_and_barbuda">Antigua iyo Barbuda</string>
<string name="argentina">Arjentiina</string>
<string name="armenia">Armeeniya</string>
<string name="aruba">Aruba</string>
<string name="australia">Awstaraaliya</string>
<string name="austria">Awsteriya</string>
<string name="azerbaijan">Axerbayjaan</string>
<string name="bahamas">Bahaamas</string>
<string name="bahrain">Baareen</string>
<string name="bangladesh">Bangladesh</string>
<string name="barbados">Barbados</string>
<string name="belarus">Belaarus</string>
<string name="belgium">Biljam</string>
<string name="belize">Beliis</string>
<string name="benin">Biniin</string>
<string name="bermuda">Bermuuda</string>
<string name="bhutan">Buutan</string>
<string name="bolivia">Boliiviya</string>
<string name="bosnia">Bosniya iyo Hargaysa</string>
<string name="botswana">Botswana</string>
<string name="brazil">Baraasiil</string>
<string name="british_indian_ocean">Xeebta Hindiya ee Biritishka</string>
<string name="brunei_darussalam">Brunayi Darussalam</string>
<string name="bulgaria">Bulgaariya</string>
<string name="burkina_faso">Burkiina Faaso</string>
<string name="burundi">Burundi</string>
<string name="cambodia">Kamboja</string>
<string name="cameroon">Kameruun</string>
<string name="canada">Kanada</string>
<string name="cape_verde">Cape Verde</string>
<string name="cayman_islands">Cayman Islands</string>
<string name="central_african">Jamhuuriyadda Afrikada Dhexe</string>
<string name="chad">Chad</string>
<string name="chile">Jiili</string>
<string name="china">Shiinaha</string>
<string name="christmas_island">Jasiirada Kiristmas</string>
<string name="cocos">Jasiiradaha Cocos (Keeling)</string>
<string name="colombia">Kolombiya</string>
<string name="comoros">Komoros</string>
<string name="congo">Congo</string>
<string name="congo_democratic">Jamhuuriyadda Dimuqraadiga Congo</string>
<string name="cook_islands">Jasiiradaha Cook</string>
<string name="costa_rica">Costa Rica</string>
<string name="cote_dlvoire">Koot Divuaar</string>
<string name="croatia">Koratia</string>
<string name="cuba">Kuba</string>
<string name="curacao">Curaçao</string>
<string name="cyprus">Qubrus</string>
<string name="czech_republic">Jamhuuriyadda Jek</string>
<string name="denmark">Denmark</string>
<string name="djibouti">Jabuuti</string>
<string name="dominica">Dominica</string>
<string name="dominican_republic">Jamhuuriyadda Dimuqraadiga Dominika</string>
<string name="ecuador">Ikwadoor</string>
<string name="egypt">Masar</string>
<string name="el_salvador">El Salvador</string>
<string name="equatorial_guinea">Giniiga Guine</string>
<string name="eritrea">Eritrea</string>
<string name="estonia">Estooniya</string>
<string name="ethiopia">Itoobiya</string>
<string name="falkland_islands">Jasiiradaha Falkland (Malvinas)</string>
<string name="faroe_islands">Jasiiradaha Faroe</string>
<string name="fiji">Fiji</string>
<string name="finland">Finland</string>
<string name="france">Faransiiska</string>
<string name="french_guiana">Guyana Faransiiska</string>
<string name="french_polynesia">French Polynesia</string>
<string name="gabon">Gaboon</string>
<string name="gambia">Gambia</string>
<string name="georgia">Joorjiya</string>
<string name="germany">Jarmal</string>
<string name="ghana">Ghana</string>
<string name="gibraltar">Gibraltar</string>
<string name="greece">Giriigga</string>
<string name="greenland">Greenland</string>
<string name="grenada">Grenada</string>
<string name="guadeloupe">Guadeloupe</string>
<string name="guam">Guam</string>
<string name="guatemala">Guatemala</string>
<string name="guernsey">Guernsey</string>
<string name="guinea">Gini</string>
<string name="guinea_bissau">Gini-Bisaawu</string>
<string name="guyana">Guyana</string>
<string name="haiti">Haiti</string>
<string name="holy_see">Maka Mokha (Madaxweyne) Mar Vatican City</string>
<string name="honduras">Honduras</string>
<string name="hong_kong">Hong Kong</string>
<string name="hungary">Hungari</string>
<string name="iceland">Aisland</string>
<string name="india">Hindiya</string>
<string name="indonesia">Indoneesiya</string>
<string name="iran">Iiraan</string>
<string name="iraq">Ciraaq</string>
<string name="ireland">Ayrlaand</string>
<string name="isle_of_man">Jasiirada Man</string>
<string name="israil">Israa\'iil</string>
<string name="italia">Talyaani</string>
<string name="jamaica">Jamaaika</string>
<string name="japan">Jabbaan</string>
<string name="jersey">Jersey</string>
<string name="jordan">Jordan</string>
<string name="kazakhstan">Kazakhstan</string>
<string name="kenya">Kenya</string>
<string name="kiribati">Kiribati</string>
<string name="kosovo">Kosovo</string>
<string name="kuwait">Kuwait</string>
<string name="kyrgyzstan">Kyrgyzstan</string>
<string name="laos">Jamhuuriyadda Dimuqraadiga Lac</string>
<string name="latvia">Latvia</string>
<string name="lebanon">Lebanon</string>
<string name="lesotho">Lesotho</string>
<string name="liberia">Liberia</string>
<string name="libya">Libya</string>
<string name="liechtenstein">Liechtenstein</string>
<string name="lithuania">Lithuania</string>
<string name="luxembourg">Luxembourg</string>
<string name="macau">Macau</string>
<string name="madagascar">Madagascar</string>
<string name="malawi">Malawi</string>
<string name="malaysia">Malaysia</string>
<string name="maldives">Maldives</string>
<string name="mali">Mali</string>
<string name="malta">Malta</string>
<string name="marshall_islands">Marshall Islands</string>
<string name="martinique">Martinique</string>
<string name="mauritania">Mauritania</string>
<string name="mauritius">Mauritius</string>
<string name="mayotte">Mayotte</string>
<string name="mexico">Meksiko</string>
<string name="micronesia">Mikroneesiya, Qoomiyadda Federaalka</string>
<string name="moldova">Moldova, Jamhuuriyadda</string>
<string name="monaco">Monaco</string>
<string name="mongolia">Mongolia</string>
<string name="montenegro">Montenegro</string>
<string name="montserrat">Montserrat</string>
<string name="morocco">Morocco</string>
<string name="mozambique">Mozambique</string>
<string name="myanmar">Myanmar</string>
<string name="namibia">Namibiya</string>
<string name="nauru">Nauru</string>
<string name="nepal">Nepal</string>
<string name="netherlands">Netherlands</string>
<string name="new_caledonia">New Caledonia</string>
<string name="new_zealand">New Zealand</string>
<string name="nicaragua">Nikaraguwa</string>
<string name="niger">Niger</string>
<string name="nigeria">Nayjeriya</string>
<string name="niue">Niue</string>
<string name="norfolk">Jasiiradaha Norfolk</string>
<string name="north_korea">Korega Waqooyi</string>
<string name="north_macedonia">Macedonia Waqooyi</string>
<string name="northern_mariana">Northern Mariana Islands</string>
<string name="norway">Norway</string>
<string name="oman">Cumaan</string>
<string name="pakistan">Pakistan</string>
<string name="palau">Belaw</string>
<string name="panama">Panama</string>
<string name="papua_new_guinea">Papua New Guinea</string>
<string name="paraguay">Baragway</string>
<string name="peru">Piru</string>
<string name="philippines">Filibiin</string>
<string name="pitcairn">Jasiiradaha Pitcairn</string>
<string name="poland">Booland</string>
<string name="portugal">Bortuqaal</string>
<string name="puerto_rico">Puerto Rico</string>
<string name="qatar">Qadar</string>
<string name="reunion">Riyuuniyon</string>
<string name="romania">Rumaaniya</string>
<string name="russia">Ruushka</string>
<string name="rwanda">Ruwanda</string>
<string name="saint_barhelemy">Saint Barthélemy</string>
<string name="saint_helena">St. Helena, Ascension iyo Tristan da Cunha</string>
<string name="saint_kitts">Saint Kitts iyo Nevis</string>
<string name="saint_lucia">Saint Lucia</string>
<string name="saint_martin">Saint Martin</string>
<string name="saint_pierre">Saint Pierre iyo Miquelon</string>
<string name="saint_vincent"><![CDATA[St. Vincent iyo The Grenadines]]></string>
<string name="samoa">Samoa</string>
<string name="san_marino">San Marino</string>
<string name="sao_tome">Sao Tome iyo Principe</string>
<string name="saudi_arabia">Sacuudi Carabiya</string>
<string name="senegal">Sinigaal</string>
<string name="serbia">Sarbijiya</string>
<string name="seychelles">Seyshelis</string>
<string name="sierra_leone">Siyara Liyoon</string>
<string name="singapore">Singabuur</string>
<string name="sint_maarten">Sint Maarten</string>
<string name="siri_lanka">Sri Lanka</string>
<string name="slovakia">Slovakia</string>
<string name="slovenia">Sloveniya</string>
<string name="solomon_islands">Jasiiradaha Solomon</string>
<string name="somalia">Soomaaliya</string>
<string name="south_africa">Koonfur Afrika</string>
<string name="south_korea">Korega Koonfurta</string>
<string name="south_sudan">Sudan Koonfurta</string>
<string name="spain">Isbaaniya</string>
<string name="state_of_palestine">Falastiin</string>
<string name="sudan">Suudaan</string>
<string name="suriname">Surinaam</string>
<string name="swaziland">Swaasilaan</string>
<string name="sweden">Iswidhan</string>
<string name="switzerland">Switzerland</string>
<string name="syria">Jamhuuriyadda Kuuriya Ee Shiinaha</string>
<string name="taijikistan">Tajikistan</string>
<string name="taiwan">Taiwan</string>
<string name="tazmania">Tanzaniya, Jamhuuriyadda Muuminadaha</string>
<string name="thailand">Taylaand</string>
<string name="timor_leste">Timor-Leste</string>
<string name="togo">Togo</string>
<string name="tokelau">Tokelau</string>
<string name="tonga">Tonga</string>
<string name="trinidad_and_tobago"><![CDATA[Trinidad iyo Tobago]]></string>
<string name="tunisia">Tunisiya</string>
<string name="turkey">Turki</string>
<string name="turkmenistan">Turkmenistan</string>
<string name="turks_and_caicos">Turks iyo Caicos Islands</string>
<string name="tuvalu">Tuvalu</string>
<string name="uganda">Ugaanda</string>
<string name="ukraine">Ukrayn</string>
<string name="united_arab_emirates">Imaaraadka Carabta (UAE)</string>
<string name="united_kingdom">"Boqortooyada Midowday "</string>
<string name="united_states_america">Maraykanka</string>
<string name="uruguay">Uruguay</string>
<string name="uzbekistan">Uzbekistan</string>
<string name="vanuatu">Vanuatu</string>
<string name="venezuela">Fenisuweela, Jamhuuriyadda Bolivarian</string>
<string name="vietnam">Fiyetnaam</string>
<string name="virgin_islands">Jasiiradaha Biritishka ee Fadhiyaan</string>
<string name="virgin_islands_us">Jasiiradaha Mareykanka ee Fadhiyaan</string>
<string name="wallis_and_futuna">Wallis iyo Futuna</string>
<string name="yemen">Yaman</string>
<string name="zambia">Zambiya</string>
<string name="zimbabwe">Simbabwe</string>
<string name="unknown">Aan la garanayn</string>
<string name="search">Raadi\u2026</string>
<string name="select_country">Xulo waddanka</string>
<string name="invalid_number">Lambarka Taleefanka aan sax ahayn</string>
<string name="clear">Nadiifi</string>
</resources>

View File

@ -0,0 +1,260 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<string name="afghanistan">Afganistan</string>
<string name="aland_islands">Åland Adaları</string>
<string name="albania">Arnavutluk</string>
<string name="algeria">Cezayir </string>
<string name="american_samoa">Amerikan Samoası</string>
<string name="andora">Andorra</string>
<string name="andorra">Andorra</string>
<string name="angola">Angola</string>
<string name="anguilla">Anguilla</string>
<string name="antarctica">Antartika</string>
<string name="antigua_and_barbuda">Antigua and Barbuda</string>
<string name="argentina">Arjantin</string>
<string name="armenia">Ermenistan</string>
<string name="aruba">Aruba</string>
<string name="australia">Avustralya</string>
<string name="austria">Avusturya</string>
<string name="azerbaijan">Azerbaycan</string>
<string name="bahamas">Bahamalar</string>
<string name="bahrain">Bahreyn</string>
<string name="bangladesh">Bangladeş</string>
<string name="barbados">Barbados</string>
<string name="belarus">Beyaz Rusya</string>
<string name="belgium">Belçika</string>
<string name="belize">Belize</string>
<string name="benin">Benin</string>
<string name="bermuda">Bermuda</string>
<string name="bhutan">Bhutan</string>
<string name="bolivia">Bolivya</string>
<string name="bosnia">Bosna Hersek</string>
<string name="botswana">Botsvana</string>
<string name="brazil">Brezilya</string>
<string name="british_indian_ocean">Britanya Hint Okyanusu Toprakları</string>
<string name="brunei_darussalam">Brunei Darussalam</string>
<string name="bulgaria">Bulgaristan</string>
<string name="burkina_faso">Burkina Faso</string>
<string name="burundi">Burundi</string>
<string name="cambodia">Kamboçya </string>
<string name="cameroon">Kamerun </string>
<string name="canada">Kanada</string>
<string name="cape_verde">Yeşil Burun Adaları </string>
<string name="cayman_islands">Cayman Adaları </string>
<string name="central_african">Orta Afrika Cumhuriyeti</string>
<string name="chad">Çad </string>
<string name="chile">Şili </string>
<string name="china">Çin</string>
<string name="christmas_island">Noel Adası </string>
<string name="cocos">Cocos (keeling) Adaları</string>
<string name="colombia">Kolombiya</string>
<string name="comoros">Comoros</string>
<string name="congo">Kongo</string>
<string name="congo_democratic">Kongo Demoktratik Cumhuriyeti</string>
<string name="cook_islands">Cook Adaları </string>
<string name="costa_rica">Kosta Rika </string>
<string name="cote_dlvoire">Fildişi Sahili </string>
<string name="croatia">Hırvatistan </string>
<string name="cuba">Küba</string>
<string name="curacao">Curacao </string>
<string name="cyprus">Kıbrıs</string>
<string name="czech_republic">Çek Cumhuriyeti </string>
<string name="denmark">Danimarka</string>
<string name="djibouti">Cibuti </string>
<string name="dominica">Dominik</string>
<string name="dominican_republic">Dominik Cumhuriyeti </string>
<string name="ecuador">Ekvador </string>
<string name="egypt">Mısır</string>
<string name="el_salvador">El Salvador </string>
<string name="equatorial_guinea">Ekvator Ginesi </string>
<string name="eritrea">Eritre </string>
<string name="estonia">Estonya </string>
<string name="ethiopia">Etiyopya </string>
<string name="falkland_islands">Falkland Adaları (malvinas) </string>
<string name="faroe_islands">Faroe Adaları </string>
<string name="fiji">Fiji</string>
<string name="finland">Finlandiya</string>
<string name="france">Fransa</string>
<string name="french_guiana">Fransız Guyanası </string>
<string name="french_polynesia">Fransız Polinezyası </string>
<string name="gabon">Gabon </string>
<string name="gambia">Gambiya </string>
<string name="georgia">Gürcistan </string>
<string name="germany">Almanya</string>
<string name="ghana">Gana </string>
<string name="gibraltar">Cebelitarık </string>
<string name="greece">Yunanistan</string>
<string name="greenland">Grönland </string>
<string name="grenada">Grenada </string>
<string name="guadeloupe">Guadelup </string>
<string name="guam">Guam </string>
<string name="guatemala">Guatemala </string>
<string name="guernsey">Guernsey </string>
<string name="guinea">Gine</string>
<string name="guinea_bissau">Gine-bissau </string>
<string name="guyana">Guyana</string>
<string name="haiti">Haiti</string>
<string name="holy_see">Holy See (vatikan Şehir Devleti) </string>
<string name="honduras">Honduras</string>
<string name="hong_kong">Hong Kong</string>
<string name="hungary">Macaristan</string>
<string name="iceland">İzlanda </string>
<string name="india">Hindistan</string>
<string name="indonesia">Endonezya</string>
<string name="iran">İran İslam Cumhuriyeti </string>
<string name="iraq">Irak</string>
<string name="ireland">İrlanda</string>
<string name="isle_of_man">Man Adası </string>
<string name="israil">İsrail</string>
<string name="italia">İtalya</string>
<string name="jamaica">Jamaika </string>
<string name="japan">Japonya</string>
<string name="jersey">Jersey</string>
<string name="jordan">Ürdün</string>
<string name="kazakhstan">Kazakistan</string>
<string name="kenya">Kenya</string>
<string name="kiribati">Kiribati </string>
<string name="kosovo">Kosova </string>
<string name="kuwait">Kuveyt </string>
<string name="kyrgyzstan">Kırgızistan</string>
<string name="laos">Lao Demokratik Halk Cumhuriyeti </string>
<string name="latvia">Letonya </string>
<string name="lebanon">Lübnan</string>
<string name="lesotho">Lesoto </string>
<string name="liberia">Liberya </string>
<string name="libya">Libya</string>
<string name="liechtenstein">Lihtenştayn </string>
<string name="lithuania">Litvanya </string>
<string name="luxembourg">Lüksemburg </string>
<string name="macau">Makao </string>
<string name="madagascar">Madagaskar </string>
<string name="malawi">Malawi</string>
<string name="malaysia">Malezya </string>
<string name="maldives">Maldivler</string>
<string name="mali">Mali</string>
<string name="malta">Malta</string>
<string name="marshall_islands">Marşal Adaları </string>
<string name="martinique">Martinik </string>
<string name="mauritania">Moritanya </string>
<string name="mauritius">Mauritius</string>
<string name="mayotte">Mayotte</string>
<string name="mexico">Meksika</string>
<string name="micronesia">Mikronezya, Federal Devletler </string>
<string name="moldova">Moldova Cumhuriyeti </string>
<string name="monaco">Monako </string>
<string name="mongolia">Mongolistan</string>
<string name="montenegro">Karadağ </string>
<string name="montserrat">Montserrat </string>
<string name="morocco">Fas </string>
<string name="mozambique">Mozambik </string>
<string name="myanmar">Myanmar </string>
<string name="namibia">Namibya </string>
<string name="nauru">Nauru</string>
<string name="nepal">Nepal</string>
<string name="netherlands">Hollanda</string>
<string name="new_caledonia">Yeni Kaledonya </string>
<string name="new_zealand">Yeni Zelanda</string>
<string name="nicaragua">Nikaragua </string>
<string name="niger">Nijer </string>
<string name="nigeria">Nijerya </string>
<string name="niue">Niue</string>
<string name="norfolk">Norfolk Adaları </string>
<string name="north_korea">Kuzey Kore </string>
<string name="north_macedonia">Makedonya</string>
<string name="northern_mariana">Kuzey Mariana Adaları </string>
<string name="norway">Norveç </string>
<string name="oman">Umman </string>
<string name="pakistan">Pakistan</string>
<string name="palau">Palau</string>
<string name="panama">Panama</string>
<string name="papua_new_guinea">Papua Yeni Gine </string>
<string name="paraguay">Paraguay</string>
<string name="peru">Peru</string>
<string name="philippines">Filipinler </string>
<string name="pitcairn">Pitcairn Adaları </string>
<string name="poland">Polonya </string>
<string name="portugal">Portekiz</string>
<string name="puerto_rico">Porto Riko </string>
<string name="qatar">Katar </string>
<string name="reunion">Réunion</string>
<string name="romania">Romanya</string>
<string name="russia">Rusya Federasyonu</string>
<string name="rwanda">Ruanda </string>
<string name="saint_barhelemy">Saint Barthélemy</string>
<string name="saint_helena">Saint Helena, Yükseliş ve Tristan Da Cunha </string>
<string name="saint_kitts">Saint Kitts ve Nevis </string>
<string name="saint_lucia">Aziz Lucia </string>
<string name="saint_martin">Aziz Martin </string>
<string name="saint_pierre">Aziz Pierre ve Miquelon </string>
<string name="saint_vincent"><![CDATA[Saint Vincent &amp; The Grenadines]]></string>
<string name="samoa">Samoa</string>
<string name="san_marino">San Marino</string>
<string name="sao_tome">Sao Tome ve Principe </string>
<string name="saudi_arabia">Suudi Arabistan </string>
<string name="senegal">Senegal</string>
<string name="serbia">Sırbistan</string>
<string name="seychelles">Seyşeller </string>
<string name="sierra_leone">Sierra Leone </string>
<string name="singapore">Singapur </string>
<string name="sint_maarten">Sint Maarten</string>
<string name="siri_lanka">Sri Lanka</string>
<string name="slovakia">Slovakya</string>
<string name="slovenia">Slovenya </string>
<string name="solomon_islands">Solomon Adaları</string>
<string name="somalia">Somali</string>
<string name="south_africa">Güney Afrika </string>
<string name="south_korea">Güney Kore</string>
<string name="south_sudan">Güney Sudan </string>
<string name="spain">İspanya</string>
<string name="state_of_palestine">Filistin</string>
<string name="sudan">Sudan</string>
<string name="suriname">Surinam </string>
<string name="swaziland">Svaziland</string>
<string name="sweden">İsveç </string>
<string name="switzerland">İsviçre</string>
<string name="syria">Suriye Arap Cumhuriyeti </string>
<string name="taijikistan">Tacikistan </string>
<string name="taiwan">Tayvan</string>
<string name="tazmania">Tanzanya, Birleşik Cumhuriyeti </string>
<string name="thailand">Tayland </string>
<string name="timor_leste">Timor-leste</string>
<string name="togo">Togo</string>
<string name="tokelau">Tokelau </string>
<string name="tonga">Tonga</string>
<string name="trinidad_and_tobago"><![CDATA[Trinidad &amp; Tobago]]></string>
<string name="tunisia">Tunus </string>
<string name="turkey">Türkiye</string>
<string name="turkmenistan">Türkmenistan </string>
<string name="turks_and_caicos">Turks ve Caicos Adaları </string>
<string name="tuvalu">Tuvalu</string>
<string name="uganda">Uganda</string>
<string name="ukraine">Ukrayna </string>
<string name="united_arab_emirates">Birleşik Arap Emirlikleri</string>
<string name="united_kingdom">Birleşik Krallık </string>
<string name="united_states_america">Amerika Birleşik Devletleri </string>
<string name="uruguay">Uruguay</string>
<string name="uzbekistan">Özbekistan </string>
<string name="vanuatu">Vanuatu </string>
<string name="venezuela">Venezuela, Bolivarcı Cumhuriyeti </string>
<string name="vietnam">Vietnam </string>
<string name="virgin_islands">Britanya Virjin Adaları </string>
<string name="virgin_islands_us">Amerika Birleşik Devletleri Virgin Adaları </string>
<string name="wallis_and_futuna">Wallis ve Futuna </string>
<string name="yemen">Yemen</string>
<string name="zambia">Zambiya </string>
<string name="zimbabwe">Zimbabve </string>
<string name="unknown">Bilinmiyor</string>
<string name="search">Ara\u2026</string>
<string name="select_country">Ülke Seçiniz</string>
<string name="invalid_number">Hatalı Telefon Numarası</string>
<string name="clear">Temizle</string>
</resources>

View File

@ -0,0 +1,260 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<string name="afghanistan">阿富汗</string>
<string name="aland_islands">奥兰群岛</string>
<string name="albania">阿尔巴尼亚</string>
<string name="algeria">阿尔及利亚</string>
<string name="american_samoa">美属萨摩亚</string>
<string name="andora">安道尔</string>
<string name="andorra">安道尔</string>
<string name="angola">安哥拉</string>
<string name="anguilla">安圭拉</string>
<string name="antarctica">南极洲</string>
<string name="antigua_and_barbuda">安提瓜和巴布达</string>
<string name="argentina">阿根廷</string>
<string name="armenia">亚美尼亚</string>
<string name="aruba">阿鲁巴</string>
<string name="australia">澳大利亚</string>
<string name="austria">奥地利</string>
<string name="azerbaijan">阿塞拜疆</string>
<string name="bahamas">巴哈马</string>
<string name="bahrain">巴林</string>
<string name="bangladesh">孟加拉国</string>
<string name="barbados">巴巴多斯</string>
<string name="belarus">白俄罗斯</string>
<string name="belgium">比利时</string>
<string name="belize">伯利兹</string>
<string name="benin">贝宁</string>
<string name="bermuda">百慕大</string>
<string name="bhutan">不丹</string>
<string name="bolivia">玻利维亚</string>
<string name="bosnia">波斯尼亚和黑塞哥维那</string>
<string name="botswana">博茨瓦纳</string>
<string name="brazil">巴西</string>
<string name="british_indian_ocean">英属印度洋领地</string>
<string name="brunei_darussalam">文莱达鲁萨兰国</string>
<string name="bulgaria">保加利亚</string>
<string name="burkina_faso">布基纳法索</string>
<string name="burundi">布隆迪</string>
<string name="cambodia">柬埔寨</string>
<string name="cameroon">喀麦隆</string>
<string name="canada">加拿大</string>
<string name="cape_verde">佛得角</string>
<string name="cayman_islands">开曼群岛</string>
<string name="central_african">中非共和国</string>
<string name="chad">乍得</string>
<string name="chile">智利</string>
<string name="china">中国</string>
<string name="christmas_island">圣诞岛</string>
<string name="cocos">科科斯(基林)群岛</string>
<string name="colombia">哥伦比亚</string>
<string name="comoros">科摩罗</string>
<string name="congo">刚果</string>
<string name="congo_democratic">刚果民主共和国</string>
<string name="cook_islands">库克群岛</string>
<string name="costa_rica">哥斯达黎加</string>
<string name="cote_dlvoire">科特迪瓦</string>
<string name="croatia">克罗地亚</string>
<string name="cuba">古巴</string>
<string name="curacao">库拉索</string>
<string name="cyprus">塞浦路斯</string>
<string name="czech_republic">捷克共和国</string>
<string name="denmark">丹麦</string>
<string name="djibouti">吉布提</string>
<string name="dominica">多米尼加</string>
<string name="dominican_republic">多米尼加共和国</string>
<string name="ecuador">厄瓜多尔</string>
<string name="egypt">埃及</string>
<string name="el_salvador">萨尔瓦多</string>
<string name="equatorial_guinea">赤道几内亚</string>
<string name="eritrea">厄立特里亚</string>
<string name="estonia">爱沙尼亚</string>
<string name="ethiopia">埃塞俄比亚</string>
<string name="falkland_islands">福克兰群岛</string>
<string name="faroe_islands">法罗群岛</string>
<string name="fiji">斐济</string>
<string name="finland">芬兰</string>
<string name="france">法国</string>
<string name="french_guiana">法属圭亚那</string>
<string name="french_polynesia">法属波利尼西亚</string>
<string name="gabon">加蓬</string>
<string name="gambia">冈比亚</string>
<string name="georgia">格鲁吉亚</string>
<string name="germany">德国</string>
<string name="ghana">加纳</string>
<string name="gibraltar">直布罗陀</string>
<string name="greece">希腊</string>
<string name="greenland">格陵兰</string>
<string name="grenada">格林纳达</string>
<string name="guadeloupe">瓜德罗普</string>
<string name="guam">关岛</string>
<string name="guatemala">危地马拉</string>
<string name="guernsey">根西岛</string>
<string name="guinea">几内亚</string>
<string name="guinea_bissau">几内亚比绍</string>
<string name="guyana">圭亚那</string>
<string name="haiti">海地</string>
<string name="holy_see">梵蒂冈</string>
<string name="honduras">洪都拉斯</string>
<string name="hong_kong">香港</string>
<string name="hungary">匈牙利</string>
<string name="iceland">冰岛</string>
<string name="india">印度</string>
<string name="indonesia">印度尼西亚</string>
<string name="iran">伊朗伊斯兰共和国</string>
<string name="iraq">伊拉克</string>
<string name="ireland">爱尔兰</string>
<string name="isle_of_man">曼岛</string>
<string name="israil">以色列</string>
<string name="italia">意大利</string>
<string name="jamaica">牙买加</string>
<string name="japan">日本</string>
<string name="jersey">澤西</string>
<string name="jordan">约旦</string>
<string name="kazakhstan">哈萨克斯坦</string>
<string name="kenya">肯尼亚</string>
<string name="kiribati">基里巴斯</string>
<string name="kosovo">科索沃</string>
<string name="kuwait">科威特</string>
<string name="kyrgyzstan">吉尔吉斯斯坦</string>
<string name="laos">老挝人民民主共和国</string>
<string name="latvia">拉脱维亚</string>
<string name="lebanon">黎巴嫩</string>
<string name="lesotho">莱索托</string>
<string name="liberia">利比里亚</string>
<string name="libya">利比亚</string>
<string name="liechtenstein">列支敦士登</string>
<string name="lithuania">立陶宛</string>
<string name="luxembourg">卢森堡</string>
<string name="macau">澳门</string>
<string name="madagascar">马达加斯加</string>
<string name="malawi">马拉维</string>
<string name="malaysia">马来西亚</string>
<string name="maldives">马尔代夫</string>
<string name="mali">马里</string>
<string name="malta">马耳他</string>
<string name="marshall_islands">马绍尔群岛</string>
<string name="martinique">马提尼克</string>
<string name="mauritania">毛里塔尼亚</string>
<string name="mauritius">毛里求斯</string>
<string name="mayotte">马约特</string>
<string name="mexico">墨西哥</string>
<string name="micronesia">密克罗尼西亚</string>
<string name="moldova">摩尔多瓦</string>
<string name="monaco">摩纳哥</string>
<string name="mongolia">蒙古</string>
<string name="montenegro">黑山</string>
<string name="montserrat">蒙特塞拉特</string>
<string name="morocco">摩洛哥</string>
<string name="mozambique">莫桑比克</string>
<string name="myanmar">缅甸</string>
<string name="namibia">纳米比亚</string>
<string name="nauru">瑙鲁</string>
<string name="nepal">尼泊尔</string>
<string name="netherlands">荷兰</string>
<string name="new_caledonia">新喀里多尼亚</string>
<string name="new_zealand">新西兰</string>
<string name="nicaragua">尼加拉瓜</string>
<string name="niger">尼日尔</string>
<string name="nigeria">尼日利亚</string>
<string name="niue">纽埃</string>
<string name="norfolk">诺福克岛</string>
<string name="north_korea">朝鲜</string>
<string name="north_macedonia">北馬其頓</string>
<string name="northern_mariana">北马里亚纳群岛</string>
<string name="norway">挪威</string>
<string name="oman">阿曼</string>
<string name="pakistan">巴基斯坦</string>
<string name="palau">帕劳</string>
<string name="panama">巴拿马</string>
<string name="papua_new_guinea">巴布亚新几内亚</string>
<string name="paraguay">巴拉圭</string>
<string name="peru">秘鲁</string>
<string name="philippines">菲律宾</string>
<string name="pitcairn">皮特凯恩</string>
<string name="poland">波兰</string>
<string name="portugal">葡萄牙</string>
<string name="puerto_rico">波多黎各</string>
<string name="qatar">卡塔尔</string>
<string name="reunion">留尼汪</string>
<string name="romania">罗马尼亚</string>
<string name="russia">俄罗斯</string>
<string name="rwanda">卢旺达</string>
<string name="saint_barhelemy">圣巴泰勒米</string>
<string name="saint_helena">圣赫勒拿、阿森松岛和特里斯坦达库尼亚群岛</string>
<string name="saint_kitts">圣基茨和尼维斯</string>
<string name="saint_lucia">圣卢西亚</string>
<string name="saint_martin">圣马丁</string>
<string name="saint_pierre">圣皮埃尔和密克隆</string>
<string name="saint_vincent"><![CDATA[圣文森特和格林纳丁斯]]></string>
<string name="samoa">萨摩亚</string>
<string name="san_marino">圣马力诺</string>
<string name="sao_tome">圣多美和普林西比</string>
<string name="saudi_arabia">沙特阿拉伯</string>
<string name="senegal">塞内加尔</string>
<string name="serbia">塞尔维亚</string>
<string name="seychelles">塞舌尔</string>
<string name="sierra_leone">塞拉利昂</string>
<string name="singapore">新加坡</string>
<string name="sint_maarten">荷属圣马丁</string>
<string name="siri_lanka">斯里兰卡</string>
<string name="slovakia">斯洛伐克</string>
<string name="slovenia">斯洛文尼亚</string>
<string name="solomon_islands">所罗门群岛</string>
<string name="somalia">索马里</string>
<string name="south_africa">南非</string>
<string name="south_korea">韩国</string>
<string name="south_sudan">南苏丹</string>
<string name="spain">西班牙</string>
<string name="state_of_palestine">巴勒斯坦</string>
<string name="sudan">苏丹</string>
<string name="suriname">苏里南</string>
<string name="swaziland">斯威士兰</string>
<string name="sweden">瑞典</string>
<string name="switzerland">瑞士</string>
<string name="syria">叙利亚</string>
<string name="taijikistan">塔吉克斯坦</string>
<string name="taiwan">台湾</string>
<string name="tazmania">坦桑尼亚联合共和国</string>
<string name="thailand">泰国</string>
<string name="timor_leste">东帝汶</string>
<string name="togo">多哥</string>
<string name="tokelau">托克劳</string>
<string name="tonga">汤加</string>
<string name="trinidad_and_tobago"><![CDATA[特立尼达和多巴哥]]></string>
<string name="tunisia">突尼斯</string>
<string name="turkey">土耳其</string>
<string name="turkmenistan">土库曼斯坦</string>
<string name="turks_and_caicos">特克斯和凯科斯群岛</string>
<string name="tuvalu">图瓦卢</string>
<string name="uganda">乌干达</string>
<string name="ukraine">乌克兰</string>
<string name="united_arab_emirates">阿拉伯联合酋长国</string>
<string name="united_kingdom">英国</string>
<string name="united_states_america">美国</string>
<string name="uruguay">乌拉圭</string>
<string name="uzbekistan">乌兹别克斯坦</string>
<string name="vanuatu">瓦努阿图</string>
<string name="venezuela">委内瑞拉</string>
<string name="vietnam">越南</string>
<string name="virgin_islands">英属维京群岛</string>
<string name="virgin_islands_us">美属维京群岛</string>
<string name="wallis_and_futuna">瓦利斯和富图纳</string>
<string name="yemen">也门</string>
<string name="zambia">赞比亚</string>
<string name="zimbabwe">津巴布韦</string>
<string name="unknown">未知</string>
<string name="search">搜索</string>
<string name="select_country">选择国家</string>
<string name="invalid_number">无效的电话号码</string>
<string name="clear">清空</string>
</resources>

View File

@ -0,0 +1,502 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
If a copy of the MPL was not distributed with this file,
You can obtain one at https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
-->
<resources>
<string name="afghanistan">Afghanistan</string>
<string name="aland_islands">Åland Islands</string>
<string name="albania">Albania</string>
<string name="algeria">Algeria</string>
<string name="american_samoa">American Samoa</string>
<string name="andora">Andorra</string>
<string name="andorra">Andorra</string>
<string name="angola">Angola</string>
<string name="anguilla">Anguilla</string>
<string name="antarctica">Antarctica</string>
<string name="antigua_and_barbuda">Antigua and Barbuda</string>
<string name="argentina">Argentina</string>
<string name="armenia">Armenia</string>
<string name="aruba">Aruba</string>
<string name="australia">Australia</string>
<string name="austria">Austria</string>
<string name="azerbaijan">Azerbaijan</string>
<string name="bahamas">Bahamas</string>
<string name="bahrain">Bahrain</string>
<string name="bangladesh">Bangladesh</string>
<string name="barbados">Barbados</string>
<string name="belarus">Belarus</string>
<string name="belgium">Belgium</string>
<string name="belize">Belize</string>
<string name="benin">Benin</string>
<string name="bermuda">Bermuda</string>
<string name="bhutan">Bhutan</string>
<string name="bolivia">Bolivia</string>
<string name="bosnia">Bosnia And Herzegovina</string>
<string name="botswana">Botswana</string>
<string name="brazil">Brazil</string>
<string name="british_indian_ocean">British Indian Ocean Territory</string>
<string name="brunei_darussalam">Brunei Darussalam</string>
<string name="bulgaria">Bulgaria</string>
<string name="burkina_faso">Burkina Faso</string>
<string name="burundi">Burundi</string>
<string name="cambodia">Cambodia</string>
<string name="cameroon">Cameroon</string>
<string name="canada">Canada</string>
<string name="cape_verde">Cape Verde</string>
<string name="cayman_islands">Cayman Islands</string>
<string name="central_african">Central African Republic</string>
<string name="chad">Chad</string>
<string name="chile">Chile</string>
<string name="china">China</string>
<string name="christmas_island">Christmas Island</string>
<string name="cocos">Cocos (Keeling) Islands</string>
<string name="colombia">Colombia</string>
<string name="comoros">Comoros</string>
<string name="congo">Congo Republic</string>
<string name="congo_democratic">Congo, The Democratic Republic Of The</string>
<string name="cook_islands">Cook Islands</string>
<string name="costa_rica">Costa Rica</string>
<string name="cote_dlvoire">Côte D\'ivoire</string>
<string name="croatia">Croatia</string>
<string name="cuba">Cuba</string>
<string name="curacao">Curaçao</string>
<string name="cyprus">Cyprus</string>
<string name="czech_republic">Czech Republic</string>
<string name="denmark">Denmark</string>
<string name="djibouti">Djibouti</string>
<string name="dominica">Dominica</string>
<string name="dominican_republic">Dominican Republic</string>
<string name="ecuador">Ecuador</string>
<string name="egypt">Egypt</string>
<string name="el_salvador">El Salvador</string>
<string name="equatorial_guinea">Equatorial Guinea</string>
<string name="eritrea">Eritrea</string>
<string name="estonia">Estonia</string>
<string name="ethiopia">Ethiopia</string>
<string name="falkland_islands">Falkland Islands (malvinas)</string>
<string name="faroe_islands">Faroe Islands</string>
<string name="fiji">Fiji</string>
<string name="finland">Finland</string>
<string name="france">France</string>
<string name="french_guiana">French Guyana</string>
<string name="french_polynesia">French Polynesia</string>
<string name="gabon">Gabon</string>
<string name="gambia">Gambia</string>
<string name="georgia">Georgia</string>
<string name="germany">Germany</string>
<string name="ghana">Ghana</string>
<string name="gibraltar">Gibraltar</string>
<string name="greece">Greece</string>
<string name="greenland">Greenland</string>
<string name="grenada">Grenada</string>
<string name="guadeloupe">Guadeloupe</string>
<string name="guam">Guam</string>
<string name="guatemala">Guatemala</string>
<string name="guernsey">Guernsey</string>
<string name="guinea">Guinea</string>
<string name="guinea_bissau">Guinea-bissau</string>
<string name="guyana">Guyana</string>
<string name="haiti">Haiti</string>
<string name="holy_see">Holy See (vatican City State)</string>
<string name="honduras">Honduras</string>
<string name="hong_kong">Hong Kong</string>
<string name="hungary">Hungary</string>
<string name="iceland">Iceland</string>
<string name="india">India</string>
<string name="indonesia">Indonesia</string>
<string name="iran">Iran, Islamic Republic Of</string>
<string name="iraq">Iraq</string>
<string name="ireland">Ireland</string>
<string name="isle_of_man">Isle Of Man</string>
<string name="israil">Israel</string>
<string name="italia">Italy</string>
<string name="jamaica">Jamaica</string>
<string name="japan">Japan</string>
<string name="jersey">Jersey</string>
<string name="jordan">Jordan</string>
<string name="kazakhstan">Kazakhstan</string>
<string name="kenya">Kenya</string>
<string name="kiribati">Kiribati</string>
<string name="kosovo">Kosovo</string>
<string name="kuwait">Kuwait</string>
<string name="kyrgyzstan">Kyrgyzstan</string>
<string name="laos">Lao People\'s Democratic Republic</string>
<string name="latvia">Latvia</string>
<string name="lebanon">Lebanon</string>
<string name="lesotho">Lesotho</string>
<string name="liberia">Liberia</string>
<string name="libya">Libya</string>
<string name="liechtenstein">Liechtenstein</string>
<string name="lithuania">Lithuania</string>
<string name="luxembourg">Luxembourg</string>
<string name="macau">Macau</string>
<string name="madagascar">Madagascar</string>
<string name="malawi">Malawi</string>
<string name="malaysia">Malaysia</string>
<string name="maldives">Maldives</string>
<string name="mali">Mali</string>
<string name="malta">Malta</string>
<string name="marshall_islands">Marshall Islands</string>
<string name="martinique">Martinique</string>
<string name="mauritania">Mauritania</string>
<string name="mauritius">Mauritius</string>
<string name="mayotte">Mayotte</string>
<string name="mexico">Mexico</string>
<string name="micronesia">Micronesia, Federated States Of</string>
<string name="moldova">Moldova, Republic Of</string>
<string name="monaco">Monaco</string>
<string name="mongolia">Mongolia</string>
<string name="montenegro">Montenegro</string>
<string name="montserrat">Montserrat</string>
<string name="morocco">Morocco</string>
<string name="mozambique">Mozambique</string>
<string name="myanmar">Myanmar</string>
<string name="namibia">Namibia</string>
<string name="nauru">Nauru</string>
<string name="nepal">Nepal</string>
<string name="netherlands">Netherlands</string>
<string name="new_caledonia">New Caledonia</string>
<string name="new_zealand">New Zealand</string>
<string name="nicaragua">Nicaragua</string>
<string name="niger">Niger</string>
<string name="nigeria">Nigeria</string>
<string name="niue">Niue</string>
<string name="norfolk">Norfolk Islands</string>
<string name="north_korea">North Korea</string>
<string name="north_macedonia">Macedonia (FYROM)</string>
<string name="northern_mariana">Northern Mariana Islands</string>
<string name="norway">Norway</string>
<string name="oman">Oman</string>
<string name="pakistan">Pakistan</string>
<string name="palau">Palau</string>
<string name="panama">Panama</string>
<string name="papua_new_guinea">Papua New Guinea</string>
<string name="paraguay">Paraguay</string>
<string name="peru">Peru</string>
<string name="philippines">Philippines</string>
<string name="pitcairn">Pitcairn Islands</string>
<string name="poland">Poland</string>
<string name="portugal">Portugal</string>
<string name="puerto_rico">Puerto Rico</string>
<string name="qatar">Qatar</string>
<string name="reunion">Réunion</string>
<string name="romania">Romania</string>
<string name="russia">Russian Federation</string>
<string name="rwanda">Rwanda</string>
<string name="saint_barhelemy">Saint Barthélemy</string>
<string name="saint_helena">Saint Helena, Ascension And Tristan Da Cunha</string>
<string name="saint_kitts">Saint Kitts and Nevis</string>
<string name="saint_lucia">Saint Lucia</string>
<string name="saint_martin">Saint Martin</string>
<string name="saint_pierre">Saint Pierre And Miquelon</string>
<string name="saint_vincent"><![CDATA[Saint Vincent &amp; The Grenadines]]></string>
<string name="samoa">Samoa</string>
<string name="san_marino">San Marino</string>
<string name="sao_tome">Sao Tome And Principe</string>
<string name="saudi_arabia">Saudi Arabia</string>
<string name="senegal">Senegal</string>
<string name="serbia">Serbia</string>
<string name="seychelles">Seychelles</string>
<string name="sierra_leone">Sierra Leone</string>
<string name="singapore">Singapore</string>
<string name="sint_maarten">Sint Maarten</string>
<string name="siri_lanka">Sri Lanka</string>
<string name="slovakia">Slovakia</string>
<string name="slovenia">Slovenia</string>
<string name="solomon_islands">Solomon Islands</string>
<string name="somalia">Somalia</string>
<string name="south_africa">South Africa</string>
<string name="south_korea">South Korea</string>
<string name="south_sudan">South Sudan</string>
<string name="spain">Spain</string>
<string name="state_of_palestine">Palestine</string>
<string name="sudan">Sudan</string>
<string name="suriname">Suriname</string>
<string name="swaziland">Swaziland</string>
<string name="sweden">Sweden</string>
<string name="switzerland">Switzerland</string>
<string name="syria">Syrian Arab Republic</string>
<string name="taijikistan">Tajikistan</string>
<string name="taiwan">Taiwan</string>
<string name="tazmania">Tanzania, United Republic Of</string>
<string name="thailand">Thailand</string>
<string name="timor_leste">Timor-leste</string>
<string name="togo">Togo</string>
<string name="tokelau">Tokelau</string>
<string name="tonga">Tonga</string>
<string name="trinidad_and_tobago"><![CDATA[Trinidad &amp; Tobago]]></string>
<string name="tunisia">Tunisia</string>
<string name="turkey">Türkiye</string>
<string name="turkmenistan">Turkmenistan</string>
<string name="turks_and_caicos">Turks and Caicos Islands</string>
<string name="tuvalu">Tuvalu</string>
<string name="uganda">Uganda</string>
<string name="ukraine">Ukraine</string>
<string name="united_arab_emirates">United Arab Emirates (UAE)</string>
<string name="united_kingdom">United Kingdom</string>
<string name="united_states_america">United States Of America</string>
<string name="uruguay">Uruguay</string>
<string name="uzbekistan">Uzbekistan</string>
<string name="vanuatu">Vanuatu</string>
<string name="venezuela">Venezuela, Bolivarian Republic Of</string>
<string name="vietnam">Vietnam</string>
<string name="virgin_islands">British Virgin Islands</string>
<string name="virgin_islands_us">US Virgin Islands</string>
<string name="wallis_and_futuna">Wallis And Futuna</string>
<string name="yemen">Yemen</string>
<string name="zambia">Zambia</string>
<string name="zimbabwe">Zimbabwe</string>
<string name="unknown">Unknown</string>
<string name="search">Search\u2026</string>
<string name="select_country">Select Country</string>
<string name="invalid_number">Invalid Phone Number</string>
<string name="clear">Clear</string>
<string name="afganistan_hint" translatable="false">70 123 4567</string>
<string name="algeria_hint" translatable="false">551 23 45 67</string>
<string name="american_samoa_hint" translatable="false">684-733-1234</string>
<string name="united_arab_emirates_hint" translatable="false">50 123 4567</string>
<string name="aland_islands_hint" translatable="false">41 2345678</string>
<string name="united_states_america_hint" translatable="false">(xxx) xxx-xxxx</string>
<string name="andorra_hint" translatable="false">312 345</string>
<string name="angola_hint" translatable="false">923 123 456</string>
<string name="antigua_and_barbuda_hint" translatable="false">268-464-1234</string>
<string name="argentina_hint" translatable="false">9 11 2345-6789</string>
<string name="albania_hint" translatable="false">67 212 3456</string>
<string name="aruba_hint" translatable="false">560 1234</string>
<string name="australia_hint" translatable="false">412 345 678</string>
<string name="austria_hint" translatable="false">664 123456</string>
<string name="azerbaijan_hint" translatable="false">40 123 45 67</string>
<string name="saint_martin_hint" translatable="false">690 00 12 34</string>
<string name="bahamas_hint" translatable="false">242-359-1234</string>
<string name="bahrain_hint" translatable="false">3600 1234</string>
<string name="bangladesh_hint" translatable="false">1812-345678</string>
<string name="barbados_hint" translatable="false">246-250-1234</string>
<string name="belarus_hint" translatable="false">29 491-19-11</string>
<string name="belgium_hint" translatable="false">470 12 34 56</string>
<string name="belize_hint" translatable="false">622-1234</string>
<string name="benin_hint" translatable="false">90 01 12 34</string>
<string name="bermuda_hint" translatable="false">441-370-1234</string>
<string name="bhutan_hint" translatable="false">17 12 34 56</string>
<string name="united_kingdom_hint" translatable="false">7400 123456</string>
<string name="bolivia_hint" translatable="false">71234567</string>
<string name="bosnia_hint" translatable="false">61 123 456</string>
<string name="botswana_hint" translatable="false">71 123 456</string>
<string name="brazil_hint" translatable="false">11 96123-4567</string>
<string name="brunei_darussalam_hint" translatable="false">712 3456</string>
<string name="bulgaria_hint" translatable="false">48 123 456</string>
<string name="burkina_faso_hint" translatable="false">70 12 34 56</string>
<string name="cape_verde_hint" translatable="false">991 12 34</string>
<string name="cayman_islands_hint" translatable="false">345-323-1234</string>
<string name="djibouti_hint" translatable="false">77 83 10 01</string>
<string name="cocos_hint" translatable="false">412 345 678</string>
<string name="cook_islands_hint" translatable="false">71 234</string>
<string name="curacao_hint" translatable="false">9 518 1234</string>
<string name="chad_hint" translatable="false">63 01 23 45</string>
<string name="czech_republic_hint" translatable="false">601 123 456</string>
<string name="china_hint" translatable="false">131 2345 6789</string>
<string name="denmark_hint" translatable="false">32 12 34 56</string>
<string name="dominician_republic_hint" translatable="false">809-234-5678</string>
<string name="dominica_hint" translatable="false">767-225-1234</string>
<string name="ecuador_hint" translatable="false">99 123 4567</string>
<string name="equatorial_guinea_hint" translatable="false">222 123 456</string>
<string name="el_salvador_hint" translatable="false">7012 3456</string>
<string name="eritrea_hint" translatable="false">7 123 456</string>
<string name="armenia_hint" translatable="false">77 123456</string>
<string name="estonia_hint" translatable="false">5123 4567</string>
<string name="ethiopia_hint" translatable="false">91 123 4567</string>
<string name="falkland_islands_hint" translatable="false">51234</string>
<string name="faroe_islands_hint" translatable="false">211234</string>
<string name="marocco_hint" translatable="false">650-123456</string>
<string name="turkey_hint" translatable="false">501 234 56 78</string>
<string name="philippinies_hint" translatable="false">905 123 4567</string>
<string name="state_of_palestine_hint" translatable="false">599 123 456</string>
<string name="france_hint" translatable="false">6 12 34 56 78</string>
<string name="french_guyana_hint" translatable="false">694 20 12 34</string>
<string name="french_polynesia_hint" translatable="false">87 12 34 56</string>
<string name="gabon_hint" translatable="false">6 03 12 34</string>
<string name="gambia_hint" translatable="false">301 2345</string>
<string name="ghana_hint" translatable="false">23 123 4567</string>
<string name="guinea_hint" translatable="false">601 12 34 56</string>
<string name="guinea_bissau_hint" translatable="false">955 012 345</string>
<string name="grenada_hint" translatable="false">473-403-1234</string>
<string name="greenland_hint" translatable="false">22 12 34</string>
<string name="guadeloupe_hint" translatable="false">690 00 12 34</string>
<string name="guam_hint" translatable="false">671-300-1234</string>
<string name="guatemala_hint" translatable="false">5123 4567</string>
<string name="guernsey_hint" translatable="false">7781 123456</string>
<string name="guyana_hint" translatable="false">609 1234</string>
<string name="south_africa_hint" translatable="false">71 123 4567</string>
<string name="south_korea_hint" translatable="false">-2000-0000</string>
<string name="south_sudan_hint" translatable="false">977 123 456</string>
<string name="georgia_hint" translatable="false">555 12 34 56</string>
<string name="haiti_hint" translatable="false">34 10 1234</string>
<string name="croatia_hint" translatable="false">92 123 4567</string>
<string name="netherlands_hint" translatable="false">6 12345678</string>
<string name="honduras_hint" translatable="false">9123-4567</string>
<string name="hong_kong_hint" translatable="false">5123 4567</string>
<string name="virgin_islands_hint" translatable="false">284-300-1234</string>
<string name="spain_hint" translatable="false">612 34 56 78</string>
<string name="sweden_hint" translatable="false">70 123 45 67</string>
<string name="switzerland_hint" translatable="false">78 123 45 67</string>
<string name="japan_hint" translatable="false">-1234-5678</string>
<string name="jersey_hint" translatable="false">7797 712345</string>
<string name="cambodia_hint" translatable="false">91 234 567</string>
<string name="cameroon_hint" translatable="false">6 71 23 45 67</string>
<string name="canada_hint" translatable="false">(xxx) xxx-xxxx</string>
<string name="montenegro_hint" translatable="false">67 622 901</string>
<string name="qatar_hint" translatable="false">3312 3456</string>
<string name="kazakhstan_hint" translatable="false">771 000 9998</string>
<string name="kenya_hint" translatable="false">712 123456</string>
<string name="cyprus_hint" translatable="false">96 123456</string>
<string name="kyrgyzstan_hint" translatable="false">700 123 456</string>
<string name="colombia_hint" translatable="false">321 1234567</string>
<string name="comoros_hint" translatable="false">321 23 45</string>
<string name="congo_hint" translatable="false">61234567</string>
<string name="congo_democratic_hint" translatable="false">991 234 567</string>
<string name="kosovo_hint" translatable="false">43 201 234</string>
<string name="costa_rica_hint" translatable="false">8312 3456</string>
<string name="kuwait_hint" translatable="false">500 12345</string>
<string name="north_korea_hint" translatable="false">192 123 4567</string>
<string name="north_macedonia_hint" translatable="false">72 345 678</string>
<string name="northern_mariana_hint" translatable="false">670-234-5678</string>
<string name="cuba_hint" translatable="false">5 1234567</string>
<string name="laos_hint" translatable="false">20 23 123 456</string>
<string name="lesotho_hint" translatable="false">5012 3456</string>
<string name="latvia_hint" translatable="false">21 234 567</string>
<string name="liberia_hint" translatable="false">77 012 3456</string>
<string name="libya_hint" translatable="false">91-2345678</string>
<string name="lithuania_hint" translatable="false">612 34567</string>
<string name="lebanon_hint" translatable="false">71 123 456</string>
<string name="luxembourg_hint" translatable="false">628 123 456</string>
<string name="hungary_hint" translatable="false">20 123 4567</string>
<string name="macau_hint" translatable="false">6612 3456</string>
<string name="madagascar_hint" translatable="false">32 12 345 67</string>
<string name="malawi_hint" translatable="false">991 23 45 67</string>
<string name="maldives_hint" translatable="false">771-2345</string>
<string name="malaysia_hint" translatable="false">12-345 6789</string>
<string name="mali_hint" translatable="false">65 01 23 45</string>
<string name="malta_hint" translatable="false">9696 1234</string>
<string name="marshall_islands_hint" translatable="false">235-1234</string>
<string name="martinique_hint" translatable="false">696 20 12 34</string>
<string name="mauritius_hint" translatable="false">5251 2345</string>
<string name="mayotte_hint" translatable="false">639 01 23 45</string>
<string name="mexico_hint" translatable="false">222 123 4567</string>
<string name="egypt_hint" translatable="false">100 123 4567</string>
<string name="micro_hint" translatable="false">350 1234</string>
<string name="mongolia_hint" translatable="false">8812 3456</string>
<string name="moldova_hint" translatable="false">621 12 345</string>
<string name="monaco_hint" translatable="false">6 12 34 56 78</string>
<string name="montserrat_hint" translatable="false">664-492-3456</string>
<string name="mauriatana_hint" translatable="false">22 12 34 56</string>
<string name="mozambique_hint" translatable="false">82 123 4567</string>
<string name="myanmar_hint" translatable="false">9 712 345 678</string>
<string name="namibia_hint" translatable="false">81 123 4567</string>
<string name="nauru_hint" translatable="false">555 1234</string>
<string name="nepal_hint" translatable="false">984-1234567</string>
<string name="niger_hint" translatable="false">93 12 34 56</string>
<string name="nigeria_hint" translatable="false">802 123 4567</string>
<string name="niue_hint" translatable="false">888 4012</string>
<string name="christmas_island_hint" translatable="false">412 345 678</string>
<string name="norfolk_hint" translatable="false">3 81234</string>
<string name="norway_hint" translatable="false">406 12 345</string>
<string name="central_african_hint" translatable="false">70 01 23 45</string>
<string name="uzbekistan_hint" translatable="false">91 234 56 78</string>
<string name="pakistan_hint" translatable="false">301 2345678</string>
<string name="palau_hint" translatable="false">620 1234</string>
<string name="panama_hint" translatable="false">6123-4567</string>
<string name="papua_new_guinea_hint" translatable="false">7012 3456</string>
<string name="paraguay_hint" translatable="false">961 456789</string>
<string name="peru_hint" translatable="false">912 345 678</string>
<string name="poland_hint" translatable="false">512 345 678</string>
<string name="portugal_hint" translatable="false">912 345 678</string>
<string name="puerto_rico_hint" translatable="false">787-234-5678</string>
<string name="reunion_hint" translatable="false">692 12 34 56</string>
<string name="romania_hint" translatable="false">712 034 567</string>
<string name="rwanda_hint" translatable="false">720 123 456</string>
<string name="russia_hint" translatable="false">912 345-67-89</string>
<string name="saint_barhelemy_hint" translatable="false">690 00 12 34</string>
<string name="saint_helena_hint" translatable="false">51234</string>
<string name="saint_kitts_hint" translatable="false">869-765-2917</string>
<string name="saint_lucia_hint" translatable="false">758-284-5678</string>
<string name="saint_pierre_hint" translatable="false">55 12 34</string>
<string name="saint_vincent_hint" translatable="false">784-430-1234</string>
<string name="samoa_hint" translatable="false">72 12345</string>
<string name="san_marino_hint" translatable="false">66 66 12 12</string>
<string name="sao_tome_hint" translatable="false">981 2345</string>
<string name="senegal_hint" translatable="false">70 123 45 67</string>
<string name="seychelles_hint" translatable="false">2 510 123</string>
<string name="serbia_hint" translatable="false">60 1234567</string>
<string name="sierra_leone_hint" translatable="false">25 123456</string>
<string name="singapore_hint" translatable="false">8123 4567</string>
<string name="sint_maarten_hint" translatable="false">721-520-5678</string>
<string name="slovakia_hint" translatable="false">912 123 456</string>
<string name="solomon_islands_hint" translatable="false">74 21234</string>
<string name="somali_hint" translatable="false">7 1123456</string>
<string name="siri_lanka_hint" translatable="false">71 234 5678</string>
<string name="sudan_hint" translatable="false">91 123 1234</string>
<string name="suriname_hint" translatable="false">741-2345</string>
<string name="syrian_hint" translatable="false">944 567 890</string>
<string name="saudi_arabia_hint" translatable="false">51 234 5678</string>
<string name="swaziland_hint" translatable="false">7612 3456</string>
<string name="chile_hint" translatable="false">2 2123 4567</string>
<string name="taijikistan_hint" translatable="false">917 12 3456</string>
<string name="tazmania_hint" translatable="false">621 234 567</string>
<string name="thailand_hint" translatable="false">81 234 5678</string>
<string name="taiwan_hint" translatable="false">912 345 678</string>
<string name="timor_leste_hint" translatable="false">7721 2345</string>
<string name="togo_hint" translatable="false">90 11 23 45</string>
<string name="tokelau_hint" translatable="false">7290</string>
<string name="tonga_hint" translatable="false">771 5123</string>
<string name="trinidad_and_tobago_hint" translatable="false">868-291-1234</string>
<string name="tunisia_hint" translatable="false">20 123 456</string>
<string name="turks_and_caicos_hint" translatable="false">649-231-1234</string>
<string name="tuvalu_hint" translatable="false">901234</string>
<string name="turkmenistan_hint" translatable="false">66 123456</string>
<string name="uganda_hint" translatable="false">712 345678</string>
<string name="ukraina_hint" translatable="false">50 123 4567</string>
<string name="oman_hint" translatable="false">9212 3456</string>
<string name="uruguay_hint" translatable="false">94 231 234</string>
<string name="jordan_hint" translatable="false">7 9012 3456</string>
<string name="vanuatu_hint" translatable="false">591 2345</string>
<string name="venezuela_hint" translatable="false">412-1234567</string>
<string name="vietnam_hint" translatable="false">91 234 56 78</string>
<string name="walli_and_fatuna_hint" translatable="false">82 12 34</string>
<string name="yemen_hint" translatable="false">712 345 678</string>
<string name="new_caledonia_hint" translatable="false">75.12.34</string>
<string name="new_zealand_hint" translatable="false">21 123 4567</string>
<string name="greece_hint" translatable="false">691 234 5678</string>
<string name="zambia_hint" translatable="false">95 5123456</string>
<string name="zimbabwe_hint" translatable="false">71 234 5678</string>
<string name="anguilla_hint" translatable="false">(264) 123-1234</string>
<string name="antarctica_hint" translatable="false">xxx xxx</string>
<string name="burundi_hint" translatable="false">29 12 34 56</string>
<string name="cote_dlvoire_hint" translatable="false">02 12 34 56</string>
<string name="germany_hint" translatable="false">0171 123456</string>
<string name="gibraltar_hint" translatable="false">200 52200</string>
<string name="finland_hint" translatable="false">042 123456</string>
<string name="fiji_hint" translatable="false">665 1234</string>
<string name="israil_hint" translatable="false">03-123-4567</string>
<string name="ireland_hint" translatable="false">087 123 4567</string>
<string name="indonesia_hint" translatable="false">21 8379 6236</string>
<string name="india_hint" translatable="false">xxxxx xxxxx</string>
<string name="iran_hint" translatable="false">021 1234 5678</string>
<string name="italia_hint" translatable="false">388 123 4567</string>
<string name="jamaica_hint" translatable="false">(876) 123-4567</string>
<string name="iraq_hint" translatable="false">0777 123 4567</string>
<string name="slovenia_hint" translatable="false">070 123 456</string>
<string name="holy_see_hint" translatable="false">06 698xxxxx</string>
<string name="virgin_islands_us_hint" translatable="false">(340) xxx-xxxx</string>
<string name="british_indian_ocean_hint" translatable="false">3xx xxxx</string>
<string name="isle_of_man_hint" translatable="false">xxxx xxxxxx</string>
<string name="iceland_hint" translatable="false">xxx xxxx</string>
<string name="kiribati_hint" translatable="false">xxxxxxxx</string>
<string name="liechtenstein_hint" translatable="false">xxx xxxx</string>
<string name="nicaragua_hint" translatable="false">xxxx xxxx</string>
<string name="pitcairn_hint" translatable="false">xxxxxxxx(x)</string>
</resources>

1
libs/material3-navigation/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

View File

@ -0,0 +1,7 @@
## A local fork of the material-navigation functionality from androidx.material
This library provides a navigation solution for Compose projects using Material3 BottomSheets.
It allows you to define your BottomSheet as navigation routes,
eliminating the need for the androidx.compose.material.navigation and androidx.compose.material:material ! libraries.
This simplifies your app's dependencies and ensures a consistent Material3 experience.
This library also leverages the new functionality from androidx.navigation:navigation-compose:2.8.0-beta0X to allow you to define routes with serialized classes.

View File

@ -0,0 +1,24 @@
/*
* Copyright 2024 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md
*/
plugins {
alias(libs.plugins.mifospay.android.library)
alias(libs.plugins.mifospay.android.library.compose)
}
android {
namespace = "com.mifos.library.material3.navigation"
}
dependencies {
implementation(libs.androidx.navigation.compose)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.runtime)
implementation(libs.androidx.compose.ui.util)
}

Some files were not shown because too many files have changed in this diff Show More