diff --git a/.github/workflows/master_dev_ci.yml b/.github/workflows/master_dev_ci.yml index 3c98cf461..52c415509 100644 --- a/.github/workflows/master_dev_ci.yml +++ b/.github/workflows/master_dev_ci.yml @@ -1,158 +1,144 @@ name: Mobile-Wallet CI[Master/Dev] on: - pull_request: push: - branches: - - 'dev' - - 'master' - - 'payment_hub' + branches: [ dev, master, payment_hub ] + pull_request: + +concurrency: + group: build-${{ github.ref }} + cancel-in-progress: true jobs: - build: - name: Build APK + setup: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - # Set up JDK - - name: Set Up JDK 17 - uses: actions/setup-java@v1 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: + distribution: 'zulu' java-version: 17 + - uses: gradle/actions/setup-gradle@v4 - # Install NDK - #- name: Install NDK - # run: echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "ndk;20.0.5594570" --sdk_root=${ANDROID_SDK_ROOT} - - # Update Gradle Permission - - name: Change gradlew Permission - run: chmod +x gradlew - -# Turing off detekt check until migration finished -# - name: Check Dependency Guard -# id: dependencyguard_verify -# continue-on-error: true -# run: ./gradlew dependencyGuard -# -# - name: Prevent updating Dependency Guard baselines if this is a fork -# id: checkfork_dependencyguard -# continue-on-error: false -# 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 - - # Build App - - name: Build with Gradle - run: ./gradlew assemble - - # Upload Built APK - - name: Upload Build Artifacts - uses: actions/upload-artifact@v2.2.0 + - name: Cache Gradle and build outputs + uses: actions/cache@v4 with: - name: mobile-wallet - path: mifospay/build/outputs/apk/debug/ - -# Turing off detekt check until migration finished -# lintCheck: -# name: Static Analysis -# runs-on: ubuntu-latest -# steps: -# - uses: actions/checkout@v2 -# -# # Setup JDK 17 -# - name: Setup JDK 17 -# uses: actions/setup-java@v1 -# with: -# java-version: 17 -# -# - name: Detekt For All Modules -# run: ./gradlew detekt - - pmd: - name: PMD + path: | + ~/.gradle/caches + ~/.gradle/wrapper + build + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: ${{ runner.os }}-gradle- + + checks: + needs: setup runs-on: ubuntu-latest + strategy: + matrix: + check: [ build_logic, spotless, detekt ] steps: - - uses: actions/checkout@v2 - - # Setup JDK 17 - - name: Setup JDK 17 - uses: actions/setup-java@v1 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: + distribution: 'zulu' java-version: 17 - - - uses: actions/checkout@v4 - - name: PMD Check[MifosPay] - run: ./gradlew mifospay:pmd - - - name: Upload PMD Report[MifosPay] - uses: actions/upload-artifact@v3.1.3 - if: failure() + - name: Run ${{ matrix.check }} + id: run_check + run: | + if [ "${{ matrix.check }}" = "build_logic" ]; then + ./gradlew check -p build-logic + elif [ "${{ matrix.check }}" = "spotless" ]; then + ./gradlew spotlessCheck --no-configuration-cache --no-daemon + elif [ "${{ matrix.check }}" = "detekt" ]; then + ./gradlew detekt + fi + + - name: Upload Detekt Reports + if: ${{ matrix.check }} == 'detekt' && steps.run_check.outcome == 'success' + uses: actions/upload-artifact@v4 with: - name: PMD Report[MifosPay] - path: mifospay/build/reports/ - - - name: PMD Check[Core:Datastore] - run: ./gradlew core:datastore:pmd - - - name: PMD Check[Core:Data] - run: ./gradlew core:data:pmd - - - name: PMD Check[Core:DesignSystem] - run: ./gradlew core:designsystem:pmd - - - name: PMD Check[Core:Common] - run: ./gradlew core:common:pmd - - - name: PMD Check[Core:Network] - run: ./gradlew core:network:pmd - - - name: PMD Check[Core:Model] - run: ./gradlew core:model:pmd + name: detekt-reports + path: | + **/build/reports/detekt/detekt.md - - name: PMD Check[Feature:Auth] - run: ./gradlew feature:auth:pmd - checkstyle: - name: Checkstyle + dependency_guard: + needs: setup runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - # Setup JDK 17 - - name: Setup JDK 17 - uses: actions/setup-java@v1 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: + distribution: 'zulu' java-version: 17 - - uses: actions/checkout@v2 - - name: Checkstyle[MifosPay] - run: ./gradlew mifospay:checkstyle - - - name: Upload Checkstyle Report[MifosPay] - uses: actions/upload-artifact@v2.2.0 - if: failure() + - name: Check Dependency Guard + id: dependencyguard_verify + continue-on-error: true + run: ./gradlew dependencyGuard + + - name: Prevent updating Dependency Guard baselines if this is a fork + id: checkfork_dependencyguard + continue-on-error: false + 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 + + # Runs if previous job failed + - name: Generate new Dependency Guard baselines if verification failed and it's a PR + id: dependencyguard_baseline + if: steps.dependencyguard_verify.outcome == 'failure' && github.event_name == 'pull_request' + run: | + ./gradlew dependencyGuardBaseline + + - name: Push new Dependency Guard baselines if available + uses: stefanzweifel/git-auto-commit-action@v5 + if: steps.dependencyguard_baseline.outcome == 'success' with: - name: Checkstyle Report[MifosPay] - path: mifospay/build/reports/ + file_pattern: '**/dependencies/*.txt' + disable_globbing: true + commit_message: "🤖 Updates baselines for Dependency Guard" - - name: Static Analysis[Core:Datastore] - run: ./gradlew core:datastore:checkstyle - - name: Static Analysis[Core:Data] - run: ./gradlew core:data:checkstyle + tests_and_lint: + needs: setup + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + - name: Run tests + run: | + ./gradlew testDemoDebug + - name: Upload reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-and-lint-reports + path: | + **/build/test-results/test*UnitTest/**.xml - - name: Static Analysis[Core:DesignSystem] - run: ./gradlew core:designsystem:checkstyle + build: + needs: [ checks, tests_and_lint ] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 - - name: Static Analysis[Core:Common] - run: ./gradlew core:common:checkstyle + - name: Build APKs + run: ./gradlew :app:assemble - - name: Static Analysis[Core:Network] - run: ./gradlew core:network:checkstyle + - name: Check badging + run: ./gradlew :app:checkProdReleaseBadging - - name: Static Analysis[Core:Model] - run: ./gradlew core:model:checkstyle + - name: Upload APKs + uses: actions/upload-artifact@v4 + with: + name: APKs + path: '**/build/outputs/apk/**/*.apk' - - name: Static Analysis[Feature:Auth] - run: ./gradlew feature:auth:checkstyle \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index c480a08d7..981f2fe68 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -36,9 +36,6 @@ val detektFormatting = libs.detekt.formatting val twitterComposeRules = libs.twitter.detekt.compose val ktlintVersion = "1.0.1" -val reportMerge by tasks.registering(io.gitlab.arturbosch.detekt.report.ReportMergeTask::class) { - output.set(rootProject.layout.buildDirectory.file("reports/detekt/merge.html")) // or "reports/detekt/merge.sarif" -} subprojects { apply { @@ -49,7 +46,7 @@ subprojects { tasks.withType().configureEach { config.from(rootProject.files("config/detekt/detekt.yml")) reports.xml.required.set(true) - finalizedBy(reportMerge) + reports.html.required.set(true) } extensions.configure { @@ -77,12 +74,6 @@ subprojects { } } - reportMerge { - input.from(tasks.withType().map { - it.htmlReportFile } - ) - } - dependencies { detektPlugins(detektFormatting) detektPlugins(twitterComposeRules) diff --git a/core/data/src/main/java/org/mifospay/core/data/repository/auth/AuthenticationUserRepository.kt b/core/data/src/main/java/org/mifospay/core/data/repository/auth/AuthenticationUserRepository.kt index 0f5774a03..266f7f9c4 100644 --- a/core/data/src/main/java/org/mifospay/core/data/repository/auth/AuthenticationUserRepository.kt +++ b/core/data/src/main/java/org/mifospay/core/data/repository/auth/AuthenticationUserRepository.kt @@ -16,17 +16,21 @@ import org.mifospay.core.datastore.PreferencesHelper import javax.inject.Inject class AuthenticationUserRepository @Inject constructor( - preferencesHelper: PreferencesHelper, + private val preferencesHelper: PreferencesHelper, ) : UserDataRepository { override val userData: Flow = flow { emit( UserData( - isAuthenticated = !preferencesHelper.token.isNullOrBlank(), + isAuthenticated = !preferencesHelper.token.isNullOrEmpty(), userName = preferencesHelper.username, // user = preferencesHelper.user, clientId = preferencesHelper.clientId, ), ) } + + override fun logOut() { + preferencesHelper.clear() + } } diff --git a/core/data/src/main/java/org/mifospay/core/data/repository/auth/UserDataRepository.kt b/core/data/src/main/java/org/mifospay/core/data/repository/auth/UserDataRepository.kt index 96fc5ad3a..5241ba9ab 100644 --- a/core/data/src/main/java/org/mifospay/core/data/repository/auth/UserDataRepository.kt +++ b/core/data/src/main/java/org/mifospay/core/data/repository/auth/UserDataRepository.kt @@ -17,4 +17,6 @@ interface UserDataRepository { * Stream of [UserData] */ val userData: Flow + + fun logOut(): Unit } diff --git a/core/designsystem/src/main/kotlin/org/mifospay/core/designsystem/component/LoadingWheel.kt b/core/designsystem/src/main/kotlin/org/mifospay/core/designsystem/component/LoadingWheel.kt index 9d35fac24..db89435de 100644 --- a/core/designsystem/src/main/kotlin/org/mifospay/core/designsystem/component/LoadingWheel.kt +++ b/core/designsystem/src/main/kotlin/org/mifospay/core/designsystem/component/LoadingWheel.kt @@ -97,8 +97,8 @@ fun MifosLoadingWheel( animationSpec = infiniteRepeatable( animation = keyframes { durationMillis = ROTATION_TIME / 2 - progressLineColor at ROTATION_TIME / NUM_OF_LINES / 2 with LinearEasing - baseLineColor at ROTATION_TIME / NUM_OF_LINES with LinearEasing + progressLineColor at ROTATION_TIME / NUM_OF_LINES / 2 using LinearEasing + baseLineColor at ROTATION_TIME / NUM_OF_LINES using LinearEasing }, repeatMode = RepeatMode.Restart, initialStartOffset = StartOffset(ROTATION_TIME / NUM_OF_LINES / 2 * index), diff --git a/core/designsystem/src/main/kotlin/org/mifospay/core/designsystem/component/MifosTopBar.kt b/core/designsystem/src/main/kotlin/org/mifospay/core/designsystem/component/MifosTopBar.kt index da6ff044e..63fa5ea20 100644 --- a/core/designsystem/src/main/kotlin/org/mifospay/core/designsystem/component/MifosTopBar.kt +++ b/core/designsystem/src/main/kotlin/org/mifospay/core/designsystem/component/MifosTopBar.kt @@ -10,8 +10,6 @@ package org.mifospay.core.designsystem.component import androidx.compose.foundation.layout.RowScope -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -22,6 +20,7 @@ import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import org.mifospay.core.designsystem.icon.MifosIcons @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -42,7 +41,7 @@ fun MifosTopBar( navigationIcon = { IconButton(onClick = { backPress.invoke() }) { Icon( - imageVector = Icons.Filled.ArrowBack, + imageVector = MifosIcons.ArrowBack, contentDescription = "Back", tint = MaterialTheme.colorScheme.onSurface, ) diff --git a/core/designsystem/src/main/kotlin/org/mifospay/core/designsystem/theme/Theme.kt b/core/designsystem/src/main/kotlin/org/mifospay/core/designsystem/theme/Theme.kt index 5fa7b0ae2..2562a413b 100644 --- a/core/designsystem/src/main/kotlin/org/mifospay/core/designsystem/theme/Theme.kt +++ b/core/designsystem/src/main/kotlin/org/mifospay/core/designsystem/theme/Theme.kt @@ -81,12 +81,9 @@ private val DarkDefaultColorScheme = darkColorScheme( scrim = md_theme_dark_scrim, ) -@Suppress("UnusedParameter") @Composable fun MifosTheme( darkTheme: Boolean = isSystemInDarkTheme(), - // Dynamic color is available on Android 12+ - dynamicColor: Boolean = true, content: @Composable () -> Unit, ) { // Color scheme diff --git a/core/ui/src/main/kotlin/org/mifospay/core/ui/ExpiryDateInput.kt b/core/ui/src/main/kotlin/org/mifospay/core/ui/ExpiryDateInput.kt index 0fd2cc515..a758f3bc6 100644 --- a/core/ui/src/main/kotlin/org/mifospay/core/ui/ExpiryDateInput.kt +++ b/core/ui/src/main/kotlin/org/mifospay/core/ui/ExpiryDateInput.kt @@ -45,7 +45,7 @@ fun ExpiryDateInput( onDone: () -> Unit, modifier: Modifier = Modifier, ) { - val (a, b, c) = FocusRequester.createRefs() + val (b, c) = FocusRequester.createRefs() Row( modifier = modifier .fillMaxWidth() diff --git a/core/ui/src/main/kotlin/org/mifospay/core/ui/FaqItemScreen.kt b/core/ui/src/main/kotlin/org/mifospay/core/ui/FaqItemScreen.kt index 6072ad5fc..af565f2d6 100644 --- a/core/ui/src/main/kotlin/org/mifospay/core/ui/FaqItemScreen.kt +++ b/core/ui/src/main/kotlin/org/mifospay/core/ui/FaqItemScreen.kt @@ -21,7 +21,7 @@ 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.Divider +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -93,6 +93,6 @@ fun FaqItemScreen( ) } - Divider() + HorizontalDivider() } } diff --git a/core/ui/src/main/kotlin/org/mifospay/core/ui/MifosUserImage.kt b/core/ui/src/main/kotlin/org/mifospay/core/ui/MifosUserImage.kt index 47d265373..84f4ad55e 100644 --- a/core/ui/src/main/kotlin/org/mifospay/core/ui/MifosUserImage.kt +++ b/core/ui/src/main/kotlin/org/mifospay/core/ui/MifosUserImage.kt @@ -30,7 +30,7 @@ fun MifosUserImage( if (bitmap == null) { MifosTextUserImage( text = username?.firstOrNull()?.toString() ?: "J", - modifier = modifier + modifier = modifier, ) } else { Image( diff --git a/desktop/build.gradle.kts b/desktop/build.gradle.kts index 4c039b97e..af6587d32 100644 --- a/desktop/build.gradle.kts +++ b/desktop/build.gradle.kts @@ -17,7 +17,7 @@ plugins { kotlin { jvm { - jvmToolchain(17) + jvmToolchain(21) withJava() } diff --git a/feature/auth/build.gradle.kts b/feature/auth/build.gradle.kts index 3914d6d07..ed63d8f61 100644 --- a/feature/auth/build.gradle.kts +++ b/feature/auth/build.gradle.kts @@ -23,7 +23,6 @@ apply(from = "${project.rootDir}/config/quality/quality.gradle") dependencies { implementation(projects.core.data) - implementation(projects.feature.passcode) implementation(libs.compose.country.code.picker) // TODO:: this should be removed @@ -36,14 +35,5 @@ dependencies { implementation(libs.androidx.credentials.play.services.auth) implementation(libs.googleid) - implementation(libs.mifosPasscode) - implementation(libs.play.services.auth) - - 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) } \ No newline at end of file diff --git a/feature/auth/src/main/kotlin/org/mifospay/feature/auth/login/LoginActivity.kt b/feature/auth/src/main/kotlin/org/mifospay/feature/auth/login/LoginActivity.kt deleted file mode 100644 index 57e4d4e5b..000000000 --- a/feature/auth/src/main/kotlin/org/mifospay/feature/auth/login/LoginActivity.kt +++ /dev/null @@ -1,28 +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.auth.login - -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 - -@AndroidEntryPoint -class LoginActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - MifosTheme { - LoginScreen() - } - } - } -} diff --git a/feature/auth/src/main/kotlin/org/mifospay/feature/auth/login/LoginScreen.kt b/feature/auth/src/main/kotlin/org/mifospay/feature/auth/login/LoginScreen.kt index 6f253b7d0..03ae92473 100644 --- a/feature/auth/src/main/kotlin/org/mifospay/feature/auth/login/LoginScreen.kt +++ b/feature/auth/src/main/kotlin/org/mifospay/feature/auth/login/LoginScreen.kt @@ -9,7 +9,6 @@ */ package org.mifospay.feature.auth.login -import android.content.Context import android.widget.Toast import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -19,6 +18,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues 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.padding import androidx.compose.foundation.rememberScrollState @@ -48,10 +48,8 @@ import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.core.os.bundleOf import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.mifos.mobile.passcode.utils.PassCodeConstants import org.mifospay.core.designsystem.component.MfOverlayLoadingWheel import org.mifospay.core.designsystem.component.MifosOutlinedTextField import org.mifospay.core.designsystem.theme.MifosTheme @@ -59,10 +57,10 @@ import org.mifospay.core.designsystem.theme.grey import org.mifospay.core.designsystem.theme.styleNormal18sp import org.mifospay.feature.auth.R import org.mifospay.feature.auth.socialSignup.SocialSignupMethodContentScreen -import org.mifospay.feature.passcode.PassCodeActivity @Composable internal fun LoginScreen( + navigateToPasscodeScreen: () -> Unit, modifier: Modifier = Modifier, viewModel: LoginViewModel = hiltViewModel(), ) { @@ -70,10 +68,6 @@ internal fun LoginScreen( val showProgress by viewModel.showProgress.collectAsStateWithLifecycle() val isLoginSuccess by viewModel.isLoginSuccess.collectAsStateWithLifecycle() - if (viewModel.isPassCodeExist) { - startPassCodeActivity(context) - } - LoginScreenContent( modifier = modifier, showProgress = showProgress, @@ -89,7 +83,7 @@ internal fun LoginScreen( ) if (isLoginSuccess) { - startPassCodeActivity(context) + navigateToPasscodeScreen() } } @@ -120,11 +114,14 @@ private fun LoginScreenContent( } } - Box(modifier) { + Box( + modifier = modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.surface), + ) { Column( modifier = Modifier - .fillMaxWidth() - .background(MaterialTheme.colorScheme.surface) + .fillMaxSize() .verticalScroll(rememberScrollState()) .padding(top = 100.dp, start = 48.dp, end = 48.dp), horizontalAlignment = Alignment.Start, @@ -240,16 +237,6 @@ private fun LoginScreenContent( } } -/** - * Starts [PassCodeActivity] with `Constans.INTIAL_LOGIN` as true - */ -private fun startPassCodeActivity(context: Context) { - PassCodeActivity.startPassCodeActivity( - context = context, - bundle = bundleOf(Pair(PassCodeConstants.PASSCODE_INITIAL_LOGIN, true)), - ) -} - @Preview(showSystemUi = true, device = "id:pixel_5") @Composable private fun LoanScreenPreview() { diff --git a/feature/auth/src/main/kotlin/org/mifospay/feature/auth/login/LoginViewModel.kt b/feature/auth/src/main/kotlin/org/mifospay/feature/auth/login/LoginViewModel.kt index 509514d04..6ecde19a8 100644 --- a/feature/auth/src/main/kotlin/org/mifospay/feature/auth/login/LoginViewModel.kt +++ b/feature/auth/src/main/kotlin/org/mifospay/feature/auth/login/LoginViewModel.kt @@ -11,7 +11,7 @@ package org.mifospay.feature.auth.login import android.util.Log import androidx.lifecycle.ViewModel -import com.mifos.mobile.passcode.utils.PasscodePreferencesHelper +import com.mifospay.core.model.domain.client.Client import com.mifospay.core.model.domain.user.User import com.mifospay.core.model.entity.UserWithRole import dagger.hilt.android.lifecycle.HiltViewModel @@ -28,12 +28,11 @@ import javax.inject.Inject @HiltViewModel class LoginViewModel @Inject constructor( - private val mUsecaseHandler: UseCaseHandler, + private val mUseCaseHandler: UseCaseHandler, private val authenticateUserUseCase: AuthenticateUser, private val fetchClientDataUseCase: FetchClientData, private val fetchUserDetailsUseCase: FetchUserDetails, private val preferencesHelper: PreferencesHelper, - private val passcodePreferencesHelper: PasscodePreferencesHelper, ) : ViewModel() { private val _showProgress = MutableStateFlow(false) @@ -42,8 +41,6 @@ class LoginViewModel @Inject constructor( private val _isLoginSuccess = MutableStateFlow(false) val isLoginSuccess: StateFlow = _isLoginSuccess - val isPassCodeExist = passcodePreferencesHelper.passCode.isNotEmpty() - fun updateProgressState(isVisible: Boolean) { _showProgress.update { isVisible } } @@ -68,7 +65,7 @@ class LoginViewModel @Inject constructor( AuthenticateUser.RequestValues(username, password) val requestValue = authenticateUserUseCase.walletRequestValues - mUsecaseHandler.execute( + mUseCaseHandler.execute( authenticateUserUseCase, requestValue, object : UseCaseCallback { @@ -91,7 +88,7 @@ class LoginViewModel @Inject constructor( * @param user */ private fun fetchUserDetails(user: User) { - mUsecaseHandler.execute( + mUseCaseHandler.execute( fetchUserDetailsUseCase, FetchUserDetails.RequestValues(user.userId), object : UseCaseCallback { @@ -113,7 +110,7 @@ class LoginViewModel @Inject constructor( * @param user */ private fun fetchClientData(user: User) { - mUsecaseHandler.execute( + mUseCaseHandler.execute( fetchClientDataUseCase, FetchClientData.RequestValues(user.clients.firstOrNull()), object : UseCaseCallback { @@ -154,7 +151,7 @@ class LoginViewModel @Inject constructor( /** * TODO remove name, clientId and mobileNo from pref and use from saved Client */ - private fun saveClientDetails(client: com.mifospay.core.model.domain.client.Client?) { + private fun saveClientDetails(client: Client?) { preferencesHelper.saveFullName(client?.name) preferencesHelper.clientId = client?.clientId!! preferencesHelper.saveMobile(client.mobileNo) diff --git a/feature/auth/src/main/kotlin/org/mifospay/feature/auth/navigation/LoginScreenNavigation.kt b/feature/auth/src/main/kotlin/org/mifospay/feature/auth/navigation/LoginScreenNavigation.kt index a4ec2ab35..3bf537c10 100644 --- a/feature/auth/src/main/kotlin/org/mifospay/feature/auth/navigation/LoginScreenNavigation.kt +++ b/feature/auth/src/main/kotlin/org/mifospay/feature/auth/navigation/LoginScreenNavigation.kt @@ -16,16 +16,11 @@ import org.mifospay.feature.auth.login.LoginScreen const val LOGIN_ROUTE = "login_route" -@Suppress("UnusedParameter") fun NavGraphBuilder.loginScreen( - onDismissSignUp: () -> Unit, - onNavigateToMobileVerificationScreen: (Int, String, String, String, String) -> Unit, + onNavigateToPasscodeScreen: () -> Unit, ) { composable(route = LOGIN_ROUTE) { - LoginScreen( -// onDismissSignUp = onDismissSignUp, -// onNavigateToMobileVerificationScreen = onNavigateToMobileVerificationScreen - ) + LoginScreen(navigateToPasscodeScreen = onNavigateToPasscodeScreen) } } diff --git a/feature/auth/src/main/kotlin/org/mifospay/feature/auth/signup/SignupScreen.kt b/feature/auth/src/main/kotlin/org/mifospay/feature/auth/signup/SignupScreen.kt index 2ea88eedb..76bc47ae9 100644 --- a/feature/auth/src/main/kotlin/org/mifospay/feature/auth/signup/SignupScreen.kt +++ b/feature/auth/src/main/kotlin/org/mifospay/feature/auth/signup/SignupScreen.kt @@ -140,19 +140,19 @@ private fun SignupScreenContent( fun validateAllFields() { val isAnyFieldEmpty = firstName.isEmpty() || - lastName.isEmpty() || - email.isEmpty() || - userName.isEmpty() || - addressLine1.isEmpty() || - addressLine2.isEmpty() || - pinCode.isEmpty() || - password.isEmpty() || - confirmPassword.isEmpty() || - selectedState == null + lastName.isEmpty() || + email.isEmpty() || + userName.isEmpty() || + addressLine1.isEmpty() || + addressLine2.isEmpty() || + pinCode.isEmpty() || + password.isEmpty() || + confirmPassword.isEmpty() || + selectedState == null val isNameOfBusinessEmpty = data.mifosSavingsProductId == MIFOS_MERCHANT_SAVINGS_PRODUCT_ID && - nameOfBusiness.isEmpty() + nameOfBusiness.isEmpty() if (!email.isValidEmail()) { Toast @@ -195,17 +195,17 @@ private fun SignupScreenContent( Box(modifier) { Column( modifier = - Modifier - .fillMaxSize() - .background(color = MaterialTheme.colorScheme.surface) - .verticalScroll(rememberScrollState()) - .focusable(!showProgressState), + Modifier + .fillMaxSize() + .background(color = MaterialTheme.colorScheme.surface) + .verticalScroll(rememberScrollState()) + .focusable(!showProgressState), ) { Column( modifier = - Modifier - .fillMaxWidth() - .background(color = MaterialTheme.colorScheme.primary), + Modifier + .fillMaxWidth() + .background(color = MaterialTheme.colorScheme.primary), verticalArrangement = Arrangement.Top, ) { Text( @@ -215,12 +215,12 @@ private fun SignupScreenContent( ) Text( modifier = - Modifier.padding( - top = 4.dp, - bottom = 32.dp, - start = 24.dp, - end = 24.dp, - ), + Modifier.padding( + top = 4.dp, + bottom = 32.dp, + start = 24.dp, + end = 24.dp, + ), text = stringResource(id = R.string.feature_auth_all_fields_are_mandatory), style = MaterialTheme.typography.bodySmall.copy(color = Color.White), ) @@ -228,16 +228,16 @@ private fun SignupScreenContent( Column( modifier = - Modifier - .fillMaxWidth() - .padding(horizontal = 32.dp) - .focusable(!showProgressState), + Modifier + .fillMaxWidth() + .padding(horizontal = 32.dp) + .focusable(!showProgressState), ) { UserInfoTextField( modifier = - Modifier - .fillMaxWidth() - .padding(top = 16.dp), + Modifier + .fillMaxWidth() + .padding(top = 16.dp), label = stringResource(id = R.string.feature_auth_first_name), value = firstName, ) { @@ -245,9 +245,9 @@ private fun SignupScreenContent( } UserInfoTextField( modifier = - Modifier - .fillMaxWidth() - .padding(top = 8.dp), + Modifier + .fillMaxWidth() + .padding(top = 8.dp), label = stringResource(id = R.string.feature_auth_last_name), value = lastName, ) { @@ -255,9 +255,9 @@ private fun SignupScreenContent( } UserInfoTextField( modifier = - Modifier - .fillMaxWidth() - .padding(top = 8.dp), + Modifier + .fillMaxWidth() + .padding(top = 8.dp), label = stringResource(id = R.string.feature_auth_username), value = userName, ) { @@ -277,9 +277,9 @@ private fun SignupScreenContent( ) UserInfoTextField( modifier = - Modifier - .fillMaxWidth() - .padding(top = 8.dp), + Modifier + .fillMaxWidth() + .padding(top = 8.dp), label = stringResource(id = R.string.feature_auth_email), value = email, ) { @@ -288,9 +288,9 @@ private fun SignupScreenContent( if (data.mifosSavingsProductId == MIFOS_MERCHANT_SAVINGS_PRODUCT_ID) { UserInfoTextField( modifier = - Modifier - .fillMaxWidth() - .padding(top = 8.dp), + Modifier + .fillMaxWidth() + .padding(top = 8.dp), label = stringResource(id = R.string.feature_auth_name_of_business), value = nameOfBusiness, ) { @@ -299,9 +299,9 @@ private fun SignupScreenContent( } UserInfoTextField( modifier = - Modifier - .fillMaxWidth() - .padding(top = 8.dp), + Modifier + .fillMaxWidth() + .padding(top = 8.dp), label = stringResource(id = R.string.feature_auth_address_line_1), value = addressLine1, ) { @@ -309,9 +309,9 @@ private fun SignupScreenContent( } UserInfoTextField( modifier = - Modifier - .fillMaxWidth() - .padding(top = 8.dp), + Modifier + .fillMaxWidth() + .padding(top = 8.dp), label = stringResource(id = R.string.feature_auth_address_line_2), value = addressLine2, ) { @@ -335,9 +335,9 @@ private fun SignupScreenContent( HorizontalDivider(thickness = 24.dp, color = Color.White) Button( modifier = - Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), + Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.primary), enabled = true, onClick = { @@ -446,13 +446,13 @@ private fun PasswordAndConfirmPassword( onPasswordChange = onPasswordChange, modifier = Modifier.fillMaxWidth(), errorMessage = - if (password.isEmpty()) { - stringResource(id = R.string.feature_auth_password_cannot_be_empty) - } else if (password.length < 6) { - stringResource(id = R.string.feature_auth_password_must_be_least_6_characters) - } else { - null - }, + if (password.isEmpty()) { + stringResource(id = R.string.feature_auth_password_cannot_be_empty) + } else if (password.length < 6) { + stringResource(id = R.string.feature_auth_password_must_be_least_6_characters) + } else { + null + }, ) MfPasswordTextField( password = confirmPassword, @@ -463,13 +463,13 @@ private fun PasswordAndConfirmPassword( onPasswordChange = onConfirmPasswordChange, modifier = Modifier.fillMaxWidth(), errorMessage = - if (confirmPassword.isEmpty()) { - stringResource(id = R.string.feature_auth_confirm_password_cannot_empty) - } else if (password != confirmPassword) { - stringResource(id = R.string.feature_auth_passwords_do_not_match) - } else { - null - }, + if (confirmPassword.isEmpty()) { + stringResource(id = R.string.feature_auth_confirm_password_cannot_empty) + } else if (password != confirmPassword) { + stringResource(id = R.string.feature_auth_passwords_do_not_match) + } else { + null + }, ) if (password.length >= 6) { Text( diff --git a/feature/home/src/main/kotlin/org/mifospay/feature/home/HomeScreen.kt b/feature/home/src/main/kotlin/org/mifospay/feature/home/HomeScreen.kt index 419fd9f4a..d3ad4d895 100644 --- a/feature/home/src/main/kotlin/org/mifospay/feature/home/HomeScreen.kt +++ b/feature/home/src/main/kotlin/org/mifospay/feature/home/HomeScreen.kt @@ -16,9 +16,11 @@ 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.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -108,9 +110,9 @@ private fun HomeScreen( ) { LazyColumn( modifier = modifier - .fillMaxWidth() - .background(color = MaterialTheme.colorScheme.surface) - .padding(start = 32.dp, end = 32.dp), + .fillMaxSize() + .background(color = MaterialTheme.colorScheme.surface), + contentPadding = PaddingValues(start = 16.dp, end = 16.dp), ) { item { MifosWalletCardScreen(account = account) diff --git a/feature/home/src/main/kotlin/org/mifospay/feature/home/navigation/HomeNavigation.kt b/feature/home/src/main/kotlin/org/mifospay/feature/home/navigation/HomeNavigation.kt index aa44e66ae..ee30ef0b6 100644 --- a/feature/home/src/main/kotlin/org/mifospay/feature/home/navigation/HomeNavigation.kt +++ b/feature/home/src/main/kotlin/org/mifospay/feature/home/navigation/HomeNavigation.kt @@ -17,7 +17,7 @@ import org.mifospay.feature.home.HomeRoute const val HOME_ROUTE = "home_route" -fun NavController.navigateToHome(navOptions: NavOptions) = navigate(HOME_ROUTE, navOptions) +fun NavController.navigateToHome(navOptions: NavOptions? = null) = navigate(HOME_ROUTE, navOptions) fun NavGraphBuilder.homeScreen( onRequest: (String) -> Unit, diff --git a/feature/kyc/src/main/kotlin/org/mifospay/feature/kyc/KYCLevel2Screen.kt b/feature/kyc/src/main/kotlin/org/mifospay/feature/kyc/KYCLevel2Screen.kt index 99ec520f8..610dcef1e 100644 --- a/feature/kyc/src/main/kotlin/org/mifospay/feature/kyc/KYCLevel2Screen.kt +++ b/feature/kyc/src/main/kotlin/org/mifospay/feature/kyc/KYCLevel2Screen.kt @@ -139,13 +139,13 @@ private fun Kyc2Form( mutableStateOf( if (SDK_INT >= 33) { ContextCompat.checkSelfPermission(context, Manifest.permission.READ_MEDIA_IMAGES) == - PackageManager.PERMISSION_GRANTED + PackageManager.PERMISSION_GRANTED } else { ContextCompat.checkSelfPermission( context, Manifest.permission.READ_EXTERNAL_STORAGE, ) == - PackageManager.PERMISSION_GRANTED + PackageManager.PERMISSION_GRANTED }, ) } diff --git a/feature/merchants/src/main/kotlin/org/mifospay/feature/merchants/ui/MerchantTransferScreen.kt b/feature/merchants/src/main/kotlin/org/mifospay/feature/merchants/ui/MerchantTransferScreen.kt index 8d3cf269d..2f9f471dd 100644 --- a/feature/merchants/src/main/kotlin/org/mifospay/feature/merchants/ui/MerchantTransferScreen.kt +++ b/feature/merchants/src/main/kotlin/org/mifospay/feature/merchants/ui/MerchantTransferScreen.kt @@ -209,9 +209,9 @@ private fun MerchantBottomSheet( content = { Column( modifier = - Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 24.dp), + Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 24.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { Text( @@ -292,12 +292,12 @@ private fun MerchantInitialAvatar( Box( modifier = - modifier - .size(86.dp) - .background( - color = MaterialTheme.colorScheme.primary, - shape = CircleShape, - ), + modifier + .size(86.dp) + .background( + color = MaterialTheme.colorScheme.primary, + shape = CircleShape, + ), contentAlignment = Alignment.Center, ) { Text( @@ -346,11 +346,11 @@ private fun SpecificTransactionItem( ) Text( text = - when (transaction.transactionType) { - TransactionType.DEBIT -> stringResource(id = R.string.feature_merchants_debits) - TransactionType.CREDIT -> stringResource(id = R.string.feature_merchants_credits) - TransactionType.OTHER -> stringResource(id = R.string.feature_merchants_other) - }, + when (transaction.transactionType) { + TransactionType.DEBIT -> stringResource(id = R.string.feature_merchants_debits) + TransactionType.CREDIT -> stringResource(id = R.string.feature_merchants_credits) + TransactionType.OTHER -> stringResource(id = R.string.feature_merchants_other) + }, style = MaterialTheme.typography.bodyLarge, ) } @@ -359,11 +359,11 @@ private fun SpecificTransactionItem( text = "${transaction.currency.code}${transaction.amount}", style = MaterialTheme.typography.displaySmall, color = - when (transaction.transactionType) { - TransactionType.DEBIT -> debitTextColor - TransactionType.CREDIT -> creditTextColor - TransactionType.OTHER -> otherTextColor - }, + when (transaction.transactionType) { + TransactionType.DEBIT -> debitTextColor + TransactionType.CREDIT -> creditTextColor + TransactionType.OTHER -> otherTextColor + }, ) } } @@ -378,9 +378,9 @@ private fun SpecificTransactionAccountInfo( ) { Column( modifier = - modifier.clickable { - accountClicked(account.accountNo) - }, + modifier.clickable { + accountClicked(account.accountNo) + }, horizontalAlignment = Alignment.CenterHorizontally, ) { Icon(imageVector = MifosIcons.AccountCircle, contentDescription = null) diff --git a/feature/passcode/build.gradle.kts b/feature/passcode/build.gradle.kts index a97343107..9a6912f04 100644 --- a/feature/passcode/build.gradle.kts +++ b/feature/passcode/build.gradle.kts @@ -16,11 +16,6 @@ android { namespace = "org.mifos.mobilewallet.mifospay.feature.passcode" } -apply(from = "${project.rootDir}/config/quality/quality.gradle") - dependencies { - implementation(projects.core.data) implementation(libs.androidx.core.ktx) - implementation(libs.androidx.appcompat) - implementation(libs.mifosPasscode) } diff --git a/feature/passcode/src/main/AndroidManifest.xml b/feature/passcode/src/main/AndroidManifest.xml index 961389810..b9b046d65 100644 --- a/feature/passcode/src/main/AndroidManifest.xml +++ b/feature/passcode/src/main/AndroidManifest.xml @@ -9,5 +9,5 @@ See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md --> - + \ No newline at end of file diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/PassCodeActivity.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/PassCodeActivity.kt deleted file mode 100644 index 96371003a..000000000 --- a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/PassCodeActivity.kt +++ /dev/null @@ -1,128 +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.passcode - -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.view.View -import android.widget.Toast -import androidx.activity.OnBackPressedCallback -import androidx.appcompat.app.AlertDialog -import com.mifos.mobile.passcode.MifosPassCodeActivity -import com.mifos.mobile.passcode.utils.EncryptionUtil -import com.mifos.mobile.passcode.utils.PassCodeConstants -import com.mifos.mobile.passcode.utils.PasscodePreferencesHelper -import dagger.hilt.android.AndroidEntryPoint -import org.mifos.mobilewallet.mifospay.feature.passcode.R -import org.mifospay.common.Constants - -@AndroidEntryPoint -class PassCodeActivity : MifosPassCodeActivity() { - - private var deepLinkURI: String? = null - private var currPass: String? = "" - private var updatePassword = false - private var isInitialScreen = false - - companion object { - // We gonna remove it after implementing the Compose Passcode screen and compose navigation - const val MAIN_ACTIVITY = "org.mifospay.MainActivity" - const val LOGIN_ACTIVITY = "org.mifospay.feature.auth.login.LoginActivity" - const val RECEIPT_ACTIVITY = "org.mifospay.receipt.ui.ReceiptActivity" - - fun startPassCodeActivity(context: Context, bundle: Bundle) { - context.startActivity( - Intent(context, PassCodeActivity::class.java).apply { - putExtras(bundle) - }, - ) - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - isInitialScreen = intent.getBooleanExtra( - PassCodeConstants.PASSCODE_INITIAL_LOGIN, false, - ) - if (intent != null) { - currPass = intent.getStringExtra(Constants.CURRENT_PASSCODE) - updatePassword = intent.getBooleanExtra(Constants.UPDATE_PASSCODE, false) - } - - deepLinkURI = intent.getStringExtra("uri") - - onBackPressedDispatcher.addCallback( - this, - object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - saveCurrentPasscode() - finishAffinity() - } - }, - ) - } - - override fun getLogo(): Int { - return 0 - } - - override fun startNextActivity() { - // authenticate user with saved Preferences - if (deepLinkURI != null) { - val uri = Uri.parse(deepLinkURI) - val intent = Intent(this@PassCodeActivity, Class.forName(RECEIPT_ACTIVITY)) - intent.data = uri - startActivity(intent) - } else { - val intent = Intent(this@PassCodeActivity, Class.forName(MAIN_ACTIVITY)) - intent.addFlags( - Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK, - ) - startActivity(intent) - } - } - - override fun startLoginActivity() { - AlertDialog.Builder(this@PassCodeActivity) - .setTitle(R.string.feature_passcode_passcode_title) - .setPositiveButton(R.string.feature_passcode_yes) { _, _ -> - startActivity(Intent(this@PassCodeActivity, Class.forName(LOGIN_ACTIVITY))) - finish() - }.setNegativeButton(R.string.feature_passcode_cancel) { dialog, _ -> dialog.cancel() } - .create() - .show() - } - - override fun showToaster(view: View, msg: Int) { - Toast.makeText(applicationContext, getText(msg), Toast.LENGTH_SHORT).show() - } - - override fun getEncryptionType(): Int { - return EncryptionUtil.DEFAULT - } - - private fun saveCurrentPasscode() { - if (updatePassword && currPass?.isNotEmpty() == true) { - val helper = PasscodePreferencesHelper(this) - helper.savePassCode(currPass) - } - } - - override fun skip(v: View) { - saveCurrentPasscode() - if (isInitialScreen) { - startNextActivity() - } - finish() - } -} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/PassCodeScreen.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/PassCodeScreen.kt new file mode 100644 index 000000000..5c3edf3f6 --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/PassCodeScreen.kt @@ -0,0 +1,242 @@ +/* + * 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.passcode + +import androidx.compose.animation.animateColorAsState +import androidx.compose.animation.core.Animatable +import androidx.compose.foundation.background +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.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Visibility +import androidx.compose.material.icons.filled.VisibilityOff +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +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.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.mifospay.feature.passcode.component.MifosIcon +import org.mifospay.feature.passcode.component.PasscodeForgotButton +import org.mifospay.feature.passcode.component.PasscodeHeader +import org.mifospay.feature.passcode.component.PasscodeKeys +import org.mifospay.feature.passcode.component.PasscodeMismatchedDialog +import org.mifospay.feature.passcode.component.PasscodeSkipButton +import org.mifospay.feature.passcode.component.PasscodeToolbar +import org.mifospay.feature.passcode.theme.blueTint +import org.mifospay.feature.passcode.utility.Constants.PASSCODE_LENGTH +import org.mifospay.feature.passcode.utility.PreferenceManager +import org.mifospay.feature.passcode.utility.ShakeAnimation.performShakeAnimation +import org.mifospay.feature.passcode.utility.VibrationFeedback.vibrateFeedback +import org.mifospay.feature.passcode.viewmodels.PasscodeViewModel + +@Composable +internal fun PasscodeScreen( + onForgotButton: () -> Unit, + onSkipButton: () -> Unit, + onPasscodeConfirm: (String) -> Unit, + onPasscodeRejected: () -> Unit, + modifier: Modifier = Modifier, + viewModel: PasscodeViewModel = hiltViewModel(), +) { + val context = LocalContext.current + val preferenceManager = remember { PreferenceManager(context) } + + val activeStep by viewModel.activeStep.collectAsStateWithLifecycle() + val filledDots by viewModel.filledDots.collectAsStateWithLifecycle() + val passcodeVisible by viewModel.passcodeVisible.collectAsStateWithLifecycle() + val currentPasscode by viewModel.currentPasscodeInput.collectAsStateWithLifecycle() + + val xShake = remember { Animatable(initialValue = 0.0F) } + var passcodeRejectedDialogVisible by remember { mutableStateOf(false) } + + LaunchedEffect(key1 = viewModel.onPasscodeConfirmed) { + viewModel.onPasscodeConfirmed.collect { + onPasscodeConfirm(it) + } + } + + LaunchedEffect(key1 = viewModel.onPasscodeRejected) { + viewModel.onPasscodeRejected.collect { + passcodeRejectedDialogVisible = true + vibrateFeedback(context) + performShakeAnimation(xShake) + onPasscodeRejected() + } + } + + Scaffold( + modifier = modifier + .fillMaxSize(), + ) { paddingValues -> + Column( + modifier = Modifier + .fillMaxSize() + .background(Color.White) + .padding(paddingValues), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + PasscodeToolbar(activeStep = activeStep, preferenceManager.hasPasscode) + + PasscodeSkipButton( + hasPassCode = preferenceManager.hasPasscode, + onSkipButton = onSkipButton, + ) + + MifosIcon(modifier = Modifier.fillMaxWidth()) + + Column( + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp, bottom = 24.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + PasscodeHeader( + activeStep = activeStep, + isPasscodeAlreadySet = preferenceManager.hasPasscode, + ) + PasscodeView( + restart = { viewModel.restart() }, + togglePasscodeVisibility = { viewModel.togglePasscodeVisibility() }, + filledDots = filledDots, + passcodeVisible = passcodeVisible, + currentPasscode = currentPasscode, + passcodeRejectedDialogVisible = passcodeRejectedDialogVisible, + onDismissDialog = { passcodeRejectedDialogVisible = false }, + xShake = xShake, + ) + } + + Spacer(modifier = Modifier.height(6.dp)) + + PasscodeKeys( + enterKey = viewModel::enterKey, + deleteKey = viewModel::deleteKey, + deleteAllKeys = viewModel::deleteAllKeys, + modifier = Modifier.padding(horizontal = 12.dp), + ) + + Spacer(modifier = Modifier.height(8.dp)) + + PasscodeForgotButton( + hasPassCode = preferenceManager.hasPasscode, + onForgotButton = onForgotButton, + ) + } + } +} + +@Composable +private fun PasscodeView( + restart: () -> Unit, + togglePasscodeVisibility: () -> Unit, + filledDots: Int, + passcodeVisible: Boolean, + currentPasscode: String, + passcodeRejectedDialogVisible: Boolean, + onDismissDialog: () -> Unit, + xShake: Animatable, + modifier: Modifier = Modifier, +) { + PasscodeMismatchedDialog( + visible = passcodeRejectedDialogVisible, + onDismiss = { + onDismissDialog.invoke() + restart() + }, + ) + + Row( + modifier = modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + ) { + Row( + modifier = Modifier.offset { IntOffset(xShake.value.toInt(), 0) }, + horizontalArrangement = Arrangement.spacedBy( + space = 26.dp, + alignment = Alignment.CenterHorizontally, + ), + verticalAlignment = Alignment.CenterVertically, + ) { + repeat(PASSCODE_LENGTH) { dotIndex -> + if (passcodeVisible && dotIndex < currentPasscode.length) { + Text( + text = currentPasscode[dotIndex].toString(), + color = blueTint, + ) + } else { + val isFilledDot = dotIndex + 1 <= filledDots + val dotColor = animateColorAsState( + if (isFilledDot) blueTint else Color.Gray, + label = "", + ) + + Box( + modifier = Modifier + .size(14.dp) + .background( + color = dotColor.value, + shape = CircleShape, + ), + ) + } + } + } + + IconButton( + onClick = togglePasscodeVisibility, + modifier = Modifier.padding(start = 10.dp), + ) { + Icon( + imageVector = if (passcodeVisible) { + Icons.Filled.Visibility + } else { + Icons.Filled.VisibilityOff + }, + contentDescription = null, + ) + } + } +} + +@Preview(showBackground = true) +@Composable +private fun PasscodeScreenPreview() { + PasscodeScreen( + onForgotButton = {}, + onSkipButton = {}, + onPasscodeConfirm = {}, + onPasscodeRejected = {}, + ) +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/PasscodeNavigation.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/PasscodeNavigation.kt new file mode 100644 index 000000000..e35e0bfd2 --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/PasscodeNavigation.kt @@ -0,0 +1,39 @@ +/* + * 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.passcode + +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavOptions +import androidx.navigation.compose.composable + +const val PASSCODE_SCREEN = "passcode_screen" + +fun NavGraphBuilder.passcodeRoute( + onForgotButton: () -> Unit, + onSkipButton: () -> Unit, + onPasscodeConfirm: (String) -> Unit, + onPasscodeRejected: () -> Unit, +) { + composable( + route = PASSCODE_SCREEN, + ) { + PasscodeScreen( + onForgotButton = onForgotButton, + onSkipButton = onSkipButton, + onPasscodeConfirm = onPasscodeConfirm, + onPasscodeRejected = onPasscodeRejected, + ) + } +} + +fun NavController.navigateToPasscodeScreen(options: NavOptions? = null) { + navigate(PASSCODE_SCREEN, options) +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/MifosIcon.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/MifosIcon.kt new file mode 100644 index 000000000..bde6f14c9 --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/MifosIcon.kt @@ -0,0 +1,34 @@ +/* + * 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.passcode.component + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.size +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import org.mifos.mobilewallet.mifospay.feature.passcode.R + +@Composable +internal fun MifosIcon(modifier: Modifier = Modifier) { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.Center, + ) { + Image( + modifier = Modifier.size(180.dp), + painter = painterResource(id = R.drawable.mifos_logo), + contentDescription = null, + ) + } +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeButton.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeButton.kt new file mode 100644 index 000000000..4a99db737 --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeButton.kt @@ -0,0 +1,71 @@ +/* + * 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.passcode.component + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import org.mifos.mobilewallet.mifospay.feature.passcode.R +import org.mifospay.feature.passcode.theme.forgotButtonStyle +import org.mifospay.feature.passcode.theme.skipButtonStyle + +@Composable +internal fun PasscodeSkipButton( + hasPassCode: Boolean, + onSkipButton: () -> Unit, + modifier: Modifier = Modifier, +) { + if (!hasPassCode) { + Row( + modifier = modifier + .fillMaxWidth() + .padding(end = 16.dp), + horizontalArrangement = Arrangement.End, + ) { + TextButton( + onClick = { onSkipButton.invoke() }, + ) { + Text(text = stringResource(R.string.skip), style = skipButtonStyle) + } + } + } +} + +@Composable +internal fun PasscodeForgotButton( + hasPassCode: Boolean, + onForgotButton: () -> Unit, + modifier: Modifier = Modifier, +) { + if (hasPassCode) { + Row( + modifier = modifier + .fillMaxWidth() + .padding(end = 16.dp), + horizontalArrangement = Arrangement.Center, + ) { + TextButton( + onClick = { onForgotButton.invoke() }, + ) { + Text( + text = stringResource(R.string.forgot_passcode_login_manually), + style = forgotButtonStyle, + ) + } + } + } +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeHeader.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeHeader.kt new file mode 100644 index 000000000..b30e128fd --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeHeader.kt @@ -0,0 +1,121 @@ +/* + * 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.passcode.component + +import androidx.compose.animation.core.MutableTransitionState +import androidx.compose.animation.core.Transition +import androidx.compose.animation.core.animateFloat +import androidx.compose.animation.core.animateOffset +import androidx.compose.animation.core.rememberTransition +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.offset +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.scale +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import org.mifos.mobilewallet.mifospay.feature.passcode.R +import org.mifospay.feature.passcode.utility.Step + +@Composable +internal fun PasscodeHeader( + activeStep: Step, + isPasscodeAlreadySet: Boolean, + modifier: Modifier = Modifier, +) { + val transitionState = remember { MutableTransitionState(activeStep) } + transitionState.targetState = activeStep + + val transition: Transition = rememberTransition( + transitionState = transitionState, + label = "Headers Transition", + ) + + val offset = 200.0F + val zeroOffset = Offset(x = 0.0F, y = 0.0F) + val negativeOffset = Offset(x = -offset, y = 0.0F) + val positiveOffset = Offset(x = offset, y = 0.0F) + + val xTransitionHeader1 by transition.animateOffset(label = "Transition Offset Header 1") { + if (it == Step.Create) zeroOffset else negativeOffset + } + val xTransitionHeader2 by transition.animateOffset(label = "Transition Offset Header 2") { + if (it == Step.Confirm) zeroOffset else positiveOffset + } + val alphaHeader1 by transition.animateFloat(label = "Transition Alpha Header 1") { + if (it == Step.Create) 1.0F else 0.0F + } + val alphaHeader2 by transition.animateFloat(label = "Transition Alpha Header 2") { + if (it == Step.Confirm) 1.0F else 0.0F + } + val scaleHeader1 by transition.animateFloat(label = "Transition Alpha Header 1") { + if (it == Step.Create) 1.0F else 0.5F + } + val scaleHeader2 by transition.animateFloat(label = "Transition Alpha Header 2") { + if (it == Step.Confirm) 1.0F else 0.5F + } + + Box( + modifier = modifier.fillMaxWidth(), + contentAlignment = Alignment.Center, + ) { + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.Center, + ) { + if (isPasscodeAlreadySet) { + Text( + modifier = Modifier + .offset(x = xTransitionHeader1.x.dp) + .alpha(alpha = alphaHeader1) + .scale(scale = scaleHeader1), + text = stringResource(id = R.string.enter_your_passcode), + style = TextStyle(fontSize = 20.sp), + ) + } else { + if (activeStep == Step.Create) { + Text( + modifier = Modifier + .offset(x = xTransitionHeader1.x.dp) + .alpha(alpha = alphaHeader1) + .scale(scale = scaleHeader1), + text = stringResource(id = R.string.create_passcode), + style = TextStyle(fontSize = 20.sp), + ) + } else if (activeStep == Step.Confirm) { + Text( + modifier = Modifier + .offset(x = xTransitionHeader2.x.dp) + .alpha(alpha = alphaHeader2) + .scale(scale = scaleHeader2), + text = stringResource(id = R.string.confirm_passcode), + style = TextStyle(fontSize = 20.sp), + ) + } + } + } + } +} + +@Preview +@Composable +private fun PasscodeHeaderPreview() { + PasscodeHeader(activeStep = Step.Create, isPasscodeAlreadySet = true) +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeKeys.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeKeys.kt new file mode 100644 index 000000000..e3b01c54b --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeKeys.kt @@ -0,0 +1,198 @@ +/* + * 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.passcode.component + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.combinedClickable +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.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.Backspace +import androidx.compose.material3.Icon +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import org.mifos.mobilewallet.mifospay.feature.passcode.R +import org.mifospay.feature.passcode.theme.PasscodeKeyButtonStyle +import org.mifospay.feature.passcode.theme.blueTint + +@Composable +internal fun PasscodeKeys( + enterKey: (String) -> Unit, + deleteKey: () -> Unit, + deleteAllKeys: () -> Unit, + modifier: Modifier = Modifier, +) { + val onEnterKeyClick = { keyTitle: String -> + enterKey(keyTitle) + } + Column( + modifier = modifier + .fillMaxWidth() + .padding(16.dp), + ) { + Row(modifier = Modifier.fillMaxWidth()) { + PasscodeKey( + modifier = Modifier.weight(weight = 1.0F), + keyTitle = "1", + onClick = onEnterKeyClick, + ) + PasscodeKey( + modifier = Modifier.weight(weight = 1.0F), + keyTitle = "2", + onClick = onEnterKeyClick, + ) + PasscodeKey( + modifier = Modifier.weight(weight = 1.0F), + keyTitle = "3", + onClick = onEnterKeyClick, + ) + } + Row(modifier = Modifier.fillMaxWidth()) { + PasscodeKey( + modifier = Modifier.weight(weight = 1.0F), + keyTitle = "4", + onClick = onEnterKeyClick, + ) + PasscodeKey( + modifier = Modifier.weight(weight = 1.0F), + keyTitle = "5", + onClick = onEnterKeyClick, + ) + PasscodeKey( + modifier = Modifier.weight(weight = 1.0F), + keyTitle = "6", + onClick = onEnterKeyClick, + ) + } + Row(modifier = Modifier.fillMaxWidth()) { + PasscodeKey( + modifier = Modifier.weight(weight = 1.0F), + keyTitle = "7", + onClick = onEnterKeyClick, + ) + PasscodeKey( + modifier = Modifier.weight(weight = 1.0F), + keyTitle = "8", + onClick = onEnterKeyClick, + ) + PasscodeKey( + modifier = Modifier.weight(weight = 1.0F), + keyTitle = "9", + onClick = onEnterKeyClick, + ) + } + Row(modifier = Modifier.fillMaxWidth()) { + PasscodeKey(modifier = Modifier.weight(weight = 1.0F)) + PasscodeKey( + modifier = Modifier.weight(weight = 1.0F), + keyTitle = "0", + onClick = onEnterKeyClick, + ) + PasscodeKey( + modifier = Modifier.weight(weight = 1.0F), + keyIcon = ImageVector.vectorResource(id = R.drawable.ic_delete), + keyIconContentDescription = "Delete Passcode Key Button", + onClick = { + deleteKey() + }, + onLongClick = { + deleteAllKeys() + }, + ) + } + } +} + +@Composable +internal fun PasscodeKey( + modifier: Modifier = Modifier, + keyTitle: String = "", + keyIcon: ImageVector? = null, + keyIconContentDescription: String = "", + onClick: ((String) -> Unit)? = null, + onLongClick: (() -> Unit)? = null, +) { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.Center, + ) { + CombinedClickableIconButton( + onClick = { + onClick?.invoke(keyTitle) + }, + onLongClick = { + onLongClick?.invoke() + }, + modifier = Modifier + .padding(all = 4.dp), + ) { + if (keyIcon == null) { + Text( + text = keyTitle, + style = PasscodeKeyButtonStyle.copy(color = blueTint), + ) + } else { + Icon( + imageVector = Icons.AutoMirrored.Filled.Backspace, + contentDescription = keyIconContentDescription, + tint = blueTint, + ) + } + } + } +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +internal fun CombinedClickableIconButton( + onClick: () -> Unit, + onLongClick: () -> Unit, + modifier: Modifier = Modifier, + size: Dp = 48.dp, + enabled: Boolean = true, + content: @Composable () -> Unit, +) { + Column( + modifier = modifier + .size(size = size) + .combinedClickable( + onClick = onClick, + onLongClick = onLongClick, + enabled = enabled, + role = Role.Button, + ), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + val contentAlpha = + if (enabled) LocalContentColor.current else LocalContentColor.current.copy(alpha = 0f) + CompositionLocalProvider(LocalContentColor provides contentAlpha, content = content) + } +} + +@Preview +@Composable +private fun PasscodeKeysPreview() { + PasscodeKeys({}, {}, {}) +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeMismatchedDialog.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeMismatchedDialog.kt new file mode 100644 index 000000000..e2c23becf --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeMismatchedDialog.kt @@ -0,0 +1,44 @@ +/* + * 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.passcode.component + +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import org.mifos.mobilewallet.mifospay.feature.passcode.R + +@Composable +internal fun PasscodeMismatchedDialog( + visible: Boolean, + onDismiss: () -> Unit, +) { + if (visible) { + AlertDialog( + shape = MaterialTheme.shapes.large, + containerColor = Color.White, + title = { + Text( + text = stringResource(R.string.passcode_do_not_match), + color = Color.Black, + ) + }, + confirmButton = { + TextButton(onClick = onDismiss) { + Text(text = stringResource(R.string.try_again), color = Color.Black) + } + }, + onDismissRequest = onDismiss, + ) + } +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeStepIndicator.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeStepIndicator.kt new file mode 100644 index 000000000..5716c5370 --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeStepIndicator.kt @@ -0,0 +1,59 @@ +/* + * 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.passcode.component + +import androidx.compose.animation.animateColorAsState +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.size +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import org.mifospay.feature.passcode.theme.blueTint +import org.mifospay.feature.passcode.utility.Constants.STEPS_COUNT +import org.mifospay.feature.passcode.utility.Step + +@Composable +internal fun PasscodeStepIndicator( + activeStep: Step, + modifier: Modifier = Modifier, +) { + Row( + modifier = modifier, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy( + space = 6.dp, + alignment = Alignment.CenterHorizontally, + ), + ) { + repeat(STEPS_COUNT) { step -> + val isActiveStep = step <= activeStep.index + val stepColor = + animateColorAsState(if (isActiveStep) blueTint else Color.Gray, label = "") + + Box( + modifier = Modifier + .size( + width = 72.dp, + height = 4.dp, + ) + .background( + color = stepColor.value, + shape = MaterialTheme.shapes.medium, + ), + ) + } + } +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeToolbar.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeToolbar.kt new file mode 100644 index 000000000..5f7120e5a --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/component/PasscodeToolbar.kt @@ -0,0 +1,94 @@ +/* + * 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.passcode.component + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import org.mifos.mobilewallet.mifospay.feature.passcode.R +import org.mifospay.feature.passcode.utility.Step + +@Composable +internal fun PasscodeToolbar( + activeStep: Step, + hasPasscode: Boolean, + modifier: Modifier = Modifier, +) { + var exitWarningDialogVisible by remember { mutableStateOf(false) } + + AnimatedVisibility(exitWarningDialogVisible) { + ExitWarningDialog( + visible = exitWarningDialogVisible, + onConfirm = {}, + onDismiss = { + exitWarningDialogVisible = false + }, + ) + } + + Row( + modifier = modifier + .fillMaxWidth() + .padding(top = 8.dp), + horizontalArrangement = Arrangement.Center, + ) { + if (!hasPasscode) { + PasscodeStepIndicator( + activeStep = activeStep, + ) + } + } +} + +@Composable +private fun ExitWarningDialog( + visible: Boolean, + onConfirm: () -> Unit, + onDismiss: () -> Unit, +) { + if (visible) { + AlertDialog( + shape = MaterialTheme.shapes.large, + containerColor = Color.White, + title = { + Text( + text = stringResource(R.string.are_you_sure_you_want_to_exit), + color = Color.Black, + ) + }, + confirmButton = { + TextButton(onClick = onConfirm) { + Text(text = stringResource(R.string.exit)) + } + }, + dismissButton = { + TextButton(onClick = onDismiss) { + Text(text = stringResource(R.string.cancel)) + } + }, + onDismissRequest = onDismiss, + ) + } +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/data/PasscodeManager.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/data/PasscodeManager.kt new file mode 100644 index 000000000..d8ad27b54 --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/data/PasscodeManager.kt @@ -0,0 +1,34 @@ +/* + * 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.passcode.data + +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext +import org.mifospay.feature.passcode.utility.PreferenceManager +import javax.inject.Inject + +class PasscodeManager @Inject constructor( + @ApplicationContext + private val context: Context, +) { + private val passcodePreferencesHelper = PreferenceManager(context) + + val getPasscode = passcodePreferencesHelper.getSavedPasscode() + + val hasPasscode = passcodePreferencesHelper.hasPasscode + + fun savePasscode(passcode: String) { + passcodePreferencesHelper.savePasscode(passcode) + } + + fun clearPasscode() { + passcodePreferencesHelper.clearPasscode() + } +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/data/PasscodeRepository.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/data/PasscodeRepository.kt new file mode 100644 index 000000000..9bed3e4ae --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/data/PasscodeRepository.kt @@ -0,0 +1,18 @@ +/* + * 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.passcode.data + +interface PasscodeRepository { + val hasPasscode: Boolean + + fun getSavedPasscode(): String + + fun savePasscode(passcode: String) +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/data/PasscodeRepositoryImpl.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/data/PasscodeRepositoryImpl.kt new file mode 100644 index 000000000..9f5681372 --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/data/PasscodeRepositoryImpl.kt @@ -0,0 +1,29 @@ +/* + * 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.passcode.data + +import org.mifospay.feature.passcode.utility.PreferenceManager +import javax.inject.Inject + +class PasscodeRepositoryImpl @Inject constructor( + private val preferenceManager: PreferenceManager, +) : PasscodeRepository { + + override val hasPasscode: Boolean + get() = preferenceManager.hasPasscode + + override fun getSavedPasscode(): String { + return preferenceManager.getSavedPasscode() + } + + override fun savePasscode(passcode: String) { + preferenceManager.savePasscode(passcode) + } +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/di/ApplicationModule.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/di/ApplicationModule.kt new file mode 100644 index 000000000..8c034223a --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/di/ApplicationModule.kt @@ -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 org.mifospay.feature.passcode.di + +import android.content.Context +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import org.mifospay.feature.passcode.data.PasscodeRepository +import org.mifospay.feature.passcode.data.PasscodeRepositoryImpl +import org.mifospay.feature.passcode.utility.PreferenceManager +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object ApplicationModule { + @Provides + @Singleton + fun providePrefManager(@ApplicationContext context: Context): PreferenceManager { + return PreferenceManager(context) + } + + @Provides + @Singleton + fun providesPasscodeRepository(preferenceManager: PreferenceManager): PasscodeRepository { + return PasscodeRepositoryImpl(preferenceManager) + } +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/theme/Color.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/theme/Color.kt new file mode 100644 index 000000000..d618c6535 --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/theme/Color.kt @@ -0,0 +1,14 @@ +/* + * 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.passcode.theme + +import androidx.compose.ui.graphics.Color + +internal val blueTint = Color(0xFF03A9F4) diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/theme/Font.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/theme/Font.kt new file mode 100644 index 000000000..fdf11a189 --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/theme/Font.kt @@ -0,0 +1,34 @@ +/* + * 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.passcode.theme + +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import org.mifos.mobilewallet.mifospay.feature.passcode.R + +internal val LatoFonts = FontFamily( + Font( + resId = R.font.lato_regular, + weight = FontWeight.Normal, + style = FontStyle.Normal, + ), + Font( + resId = R.font.lato_bold, + weight = FontWeight.Bold, + style = FontStyle.Normal, + ), + Font( + resId = R.font.lato_black, + weight = FontWeight.Black, + style = FontStyle.Normal, + ), +) diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/theme/Theme.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/theme/Theme.kt new file mode 100644 index 000000000..ab7f3cb61 --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/theme/Theme.kt @@ -0,0 +1,49 @@ +/* + * 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.passcode.theme + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Color.Companion.Blue + +private val DarkColorPalette = darkColorScheme( + primary = Color.Cyan, + onPrimary = Color.Cyan, + secondary = Color.Black.copy(alpha = 0.2f), + background = Color.Black, +) +private val LightColorPalette = lightColorScheme( + primary = Blue, + onPrimary = Blue, + secondary = Color.Blue.copy(alpha = 0.4f), + background = Color.White, +) + +@Composable +internal fun MifosPasscodeTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + content: @Composable () -> Unit, +) { + val colors = if (darkTheme) { + DarkColorPalette + } else { + LightColorPalette + } + + MaterialTheme( + colorScheme = colors, + typography = Typography, + content = content, + ) +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/theme/Type.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/theme/Type.kt new file mode 100644 index 000000000..6502eef32 --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/theme/Type.kt @@ -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.feature.passcode.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +internal val Typography = Typography( + displayLarge = TextStyle( + fontFamily = LatoFonts, + fontWeight = FontWeight.Black, + fontSize = 34.sp, + ), +) + +internal val PasscodeKeyButtonStyle = TextStyle( + fontFamily = LatoFonts, + fontWeight = FontWeight.Bold, + fontSize = 24.sp, +) + +internal val skipButtonStyle = TextStyle( + color = blueTint, + fontSize = 20.sp, + fontFamily = LatoFonts, +) + +internal val forgotButtonStyle = TextStyle( + color = blueTint, + fontSize = 14.sp, + fontFamily = LatoFonts, +) diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/Constants.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/Constants.kt new file mode 100644 index 000000000..8aa501ecc --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/Constants.kt @@ -0,0 +1,16 @@ +/* + * 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.passcode.utility + +internal object Constants { + const val STEPS_COUNT = 2 + const val PASSCODE_LENGTH = 4 + const val VIBRATE_FEEDBACK_DURATION = 300L +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/PreferenceManager.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/PreferenceManager.kt new file mode 100644 index 000000000..02d592e25 --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/PreferenceManager.kt @@ -0,0 +1,39 @@ +/* + * 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.passcode.utility + +import android.content.Context +import org.mifos.mobilewallet.mifospay.feature.passcode.R + +class PreferenceManager(context: Context) { + private val sharedPreference = context.getSharedPreferences( + R.string.pref_name.toString(), + Context.MODE_PRIVATE, + ) + + var hasPasscode: Boolean + get() = sharedPreference.getBoolean(R.string.has_passcode.toString(), false) + set(value) = sharedPreference.edit().putBoolean(R.string.has_passcode.toString(), value) + .apply() + + fun savePasscode(passcode: String) { + sharedPreference.edit().putString(R.string.passcode.toString(), passcode).apply() + hasPasscode = true + } + + fun getSavedPasscode(): String { + return sharedPreference.getString(R.string.passcode.toString(), "").toString() + } + + fun clearPasscode() { + sharedPreference.edit().clear().apply() + hasPasscode = false + } +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/ShakeAnimation.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/ShakeAnimation.kt new file mode 100644 index 000000000..068bc230d --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/ShakeAnimation.kt @@ -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 org.mifospay.feature.passcode.utility + +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.LinearOutSlowInEasing +import androidx.compose.animation.core.keyframes +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +internal object ShakeAnimation { + + fun CoroutineScope.performShakeAnimation(xShake: Animatable) { + launch { + xShake.animateTo( + targetValue = 0f, + animationSpec = keyframes { + durationMillis = 280 + 0f at 0 using LinearOutSlowInEasing + 20f at 80 using LinearOutSlowInEasing + 20f at 120 using LinearOutSlowInEasing + 10f at 160 using LinearOutSlowInEasing + 10f at 200 using LinearOutSlowInEasing + 5f at 240 using LinearOutSlowInEasing + 0f at 280 + }, + ) + } + } +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/Step.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/Step.kt new file mode 100644 index 000000000..bb26052df --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/Step.kt @@ -0,0 +1,15 @@ +/* + * 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.passcode.utility + +internal enum class Step(var index: Int) { + Create(0), + Confirm(1), +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/VibrationFeedback.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/VibrationFeedback.kt new file mode 100644 index 000000000..032edb0d6 --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/utility/VibrationFeedback.kt @@ -0,0 +1,48 @@ +/* + * 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.passcode.utility + +import android.content.Context +import android.os.Build +import android.os.CombinedVibration +import android.os.VibrationEffect +import android.os.Vibrator +import android.os.VibratorManager +import org.mifospay.feature.passcode.utility.Constants.VIBRATE_FEEDBACK_DURATION + +internal object VibrationFeedback { + + @Suppress("DEPRECATION") + internal fun vibrateFeedback(context: Context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + (context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager).vibrate( + CombinedVibration.createParallel( + VibrationEffect.createOneShot( + VIBRATE_FEEDBACK_DURATION, + VibrationEffect.DEFAULT_AMPLITUDE, + ), + ), + ) + } else { + (context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator).let { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + it.vibrate( + VibrationEffect.createOneShot( + VIBRATE_FEEDBACK_DURATION, + VibrationEffect.DEFAULT_AMPLITUDE, + ), + ) + } else { + it.vibrate(VIBRATE_FEEDBACK_DURATION) + } + } + } + } +} diff --git a/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/viewmodels/PasscodeViewModel.kt b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/viewmodels/PasscodeViewModel.kt new file mode 100644 index 000000000..c468de74c --- /dev/null +++ b/feature/passcode/src/main/kotlin/org/mifospay/feature/passcode/viewmodels/PasscodeViewModel.kt @@ -0,0 +1,151 @@ +/* + * 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.passcode.viewmodels + +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import org.mifospay.feature.passcode.data.PasscodeRepository +import org.mifospay.feature.passcode.utility.Constants.PASSCODE_LENGTH +import org.mifospay.feature.passcode.utility.Step +import javax.inject.Inject + +@HiltViewModel +internal class PasscodeViewModel @Inject constructor( + private val passcodeRepository: PasscodeRepository, +) : ViewModel() { + + private val mOnPasscodeConfirmed = MutableSharedFlow() + val onPasscodeConfirmed = mOnPasscodeConfirmed.asSharedFlow() + + private val mOnPasscodeRejected = MutableSharedFlow() + val onPasscodeRejected = mOnPasscodeRejected.asSharedFlow() + + private val mActiveStep = MutableStateFlow(Step.Create) + val activeStep = mActiveStep.asStateFlow() + + private val mFilledDots = MutableStateFlow(0) + val filledDots = mFilledDots.asStateFlow() + + private var createPasscode: StringBuilder = StringBuilder() + private var confirmPasscode: StringBuilder = StringBuilder() + + private val mPasscodeVisible = MutableStateFlow(false) + val passcodeVisible = mPasscodeVisible.asStateFlow() + + private val mCurrentPasscodeInput = MutableStateFlow("") + val currentPasscodeInput = mCurrentPasscodeInput.asStateFlow() + + private var mIsPasscodeAlreadySet = mutableStateOf(passcodeRepository.hasPasscode) + + init { + resetData() + } + + private fun emitActiveStep(activeStep: Step) = viewModelScope.launch { + mActiveStep.emit(activeStep) + } + + private fun emitFilledDots(filledDots: Int) = viewModelScope.launch { + mFilledDots.emit(filledDots) + } + + private fun emitOnPasscodeConfirmed(confirmPassword: String) = viewModelScope.launch { + mOnPasscodeConfirmed.emit(confirmPassword) + } + + private fun emitOnPasscodeRejected() = viewModelScope.launch { + mOnPasscodeRejected.emit(Unit) + } + + fun togglePasscodeVisibility() { + mPasscodeVisible.value = !mPasscodeVisible.value + } + + private fun resetData() { + emitActiveStep(Step.Create) + emitFilledDots(0) + + createPasscode.clear() + confirmPasscode.clear() + } + + fun enterKey(key: String) { + if (mFilledDots.value >= PASSCODE_LENGTH) { + return + } + + val currentPasscode = + if (mActiveStep.value == Step.Create) createPasscode else confirmPasscode + currentPasscode.append(key) + mCurrentPasscodeInput.value = currentPasscode.toString() + emitFilledDots(currentPasscode.length) + + if (mFilledDots.value == PASSCODE_LENGTH) { + if (mIsPasscodeAlreadySet.value) { + if (passcodeRepository.getSavedPasscode() == createPasscode.toString()) { + emitOnPasscodeConfirmed(createPasscode.toString()) + createPasscode.clear() + } else { + emitOnPasscodeRejected() + // logic for retires can be written here + } + mCurrentPasscodeInput.value = "" + } else if (mActiveStep.value == Step.Create) { + emitActiveStep(Step.Confirm) + emitFilledDots(0) + mCurrentPasscodeInput.value = "" + } else { + if (createPasscode.toString() == confirmPasscode.toString()) { + emitOnPasscodeConfirmed(confirmPasscode.toString()) + passcodeRepository.savePasscode(confirmPasscode.toString()) + mIsPasscodeAlreadySet.value = true + resetData() + } else { + emitOnPasscodeRejected() + resetData() + } + mCurrentPasscodeInput.value = "" + } + } + } + + fun deleteKey() { + val currentPasscode = + if (mActiveStep.value == Step.Create) createPasscode else confirmPasscode + + if (currentPasscode.isNotEmpty()) { + currentPasscode.deleteAt(currentPasscode.length - 1) + mCurrentPasscodeInput.value = currentPasscode.toString() + emitFilledDots(currentPasscode.length) + } + } + + fun deleteAllKeys() { + if (mActiveStep.value == Step.Create) { + createPasscode.clear() + } else { + confirmPasscode.clear() + } + mCurrentPasscodeInput.value = "" + emitFilledDots(0) + } + + fun restart() { + resetData() + mPasscodeVisible.value = false + } +} diff --git a/mifospay/src/main/res/drawable/ic_download.xml b/feature/passcode/src/main/res/drawable/baseline_delete_forever_24.xml similarity index 52% rename from mifospay/src/main/res/drawable/ic_download.xml rename to feature/passcode/src/main/res/drawable/baseline_delete_forever_24.xml index 5cc1a6fc4..cc0810db2 100644 --- a/mifospay/src/main/res/drawable/ic_download.xml +++ b/feature/passcode/src/main/res/drawable/baseline_delete_forever_24.xml @@ -8,8 +8,8 @@ See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md --> - - + diff --git a/feature/passcode/src/main/res/drawable/ic_delete.xml b/feature/passcode/src/main/res/drawable/ic_delete.xml new file mode 100644 index 000000000..a10936ea0 --- /dev/null +++ b/feature/passcode/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/feature/passcode/src/main/res/drawable/mifos_logo.jpg b/feature/passcode/src/main/res/drawable/mifos_logo.jpg new file mode 100644 index 000000000..a067a3c8e Binary files /dev/null and b/feature/passcode/src/main/res/drawable/mifos_logo.jpg differ diff --git a/feature/passcode/src/main/res/font/lato_black.ttf b/feature/passcode/src/main/res/font/lato_black.ttf new file mode 100644 index 000000000..4340502d9 Binary files /dev/null and b/feature/passcode/src/main/res/font/lato_black.ttf differ diff --git a/feature/passcode/src/main/res/font/lato_bold.ttf b/feature/passcode/src/main/res/font/lato_bold.ttf new file mode 100644 index 000000000..016068b48 Binary files /dev/null and b/feature/passcode/src/main/res/font/lato_bold.ttf differ diff --git a/feature/passcode/src/main/res/font/lato_regular.ttf b/feature/passcode/src/main/res/font/lato_regular.ttf new file mode 100644 index 000000000..bb2e8875a Binary files /dev/null and b/feature/passcode/src/main/res/font/lato_regular.ttf differ diff --git a/feature/passcode/src/main/res/values/strings.xml b/feature/passcode/src/main/res/values/strings.xml index 1bf7338ac..7f0af3b5d 100644 --- a/feature/passcode/src/main/res/values/strings.xml +++ b/feature/passcode/src/main/res/values/strings.xml @@ -12,4 +12,24 @@ Passcode will be reset, are you sure? Cancel Yes + Passcode + hasPasscode + hasDragPasscode + passcode + drag_passcode + + Create Passcode + Confirm Passcode + Enter your Passcode + Forgot Passcode + Delete Passcode Key Button + Drag your finger here only in one direction. + Drag your Pattern + Exit + Cancel + Skip + Forgot Passcode, Login Manually + Try again + Passcode do not match! + Are you sure you want to exit? \ No newline at end of file diff --git a/feature/profile/src/main/kotlin/org/mifospay/feature/profile/edit/EditProfileScreen.kt b/feature/profile/src/main/kotlin/org/mifospay/feature/profile/edit/EditProfileScreen.kt index cf63bac3c..c355412b2 100644 --- a/feature/profile/src/main/kotlin/org/mifospay/feature/profile/edit/EditProfileScreen.kt +++ b/feature/profile/src/main/kotlin/org/mifospay/feature/profile/edit/EditProfileScreen.kt @@ -112,8 +112,8 @@ fun EditProfileScreen( Box( modifier = - modifier - .fillMaxSize(), + modifier + .fillMaxSize(), ) { MifosScaffold( topBarTitle = R.string.feature_profile_edit_profile, @@ -189,15 +189,15 @@ private fun EditProfileScreenContent( PermissionBox( requiredPermissions = - if (Build.VERSION.SDK_INT >= 33) { - listOf(Manifest.permission.CAMERA) - } else { - listOf( - Manifest.permission.CAMERA, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE, - ) - }, + if (Build.VERSION.SDK_INT >= 33) { + listOf(Manifest.permission.CAMERA) + } else { + listOf( + Manifest.permission.CAMERA, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE, + ) + }, title = R.string.feature_profile_permission_required, confirmButtonText = R.string.feature_profile_proceed, dismissButtonText = R.string.feature_profile_dismiss, @@ -244,16 +244,16 @@ private fun EditProfileScreenContent( ) Box( modifier = - modifier - .padding(contentPadding) - .fillMaxSize(), + modifier + .padding(contentPadding) + .fillMaxSize(), ) { Column( modifier = - Modifier - .fillMaxSize() - .background(color = MaterialTheme.colorScheme.surface) - .verticalScroll(rememberScrollState()), + Modifier + .fillMaxSize() + .background(color = MaterialTheme.colorScheme.surface) + .verticalScroll(rememberScrollState()), ) { EditProfileScreenImage( imageUri = imageUri, @@ -264,33 +264,33 @@ private fun EditProfileScreenContent( label = stringResource(id = R.string.feature_profile_username), onValueChange = { username = it }, modifier = - Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp), + Modifier + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp), ) MfOutlinedTextField( value = email, label = stringResource(id = R.string.feature_profile_email), onValueChange = { email = it }, modifier = - Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp), + Modifier + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp), ) MfOutlinedTextField( value = vpa, label = stringResource(id = R.string.feature_profile_vpa), onValueChange = { vpa = it }, modifier = - Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp), + Modifier + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp), ) Box( modifier = - Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp), + Modifier + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp), ) { val keyboardController = LocalSoftwareKeyboardController.current if (LocalInspectionMode.current) { @@ -302,9 +302,9 @@ private fun EditProfileScreenContent( autoDetectCode = true, shape = RoundedCornerShape(3.dp), colors = - TextFieldDefaults.outlinedTextFieldColors( - focusedBorderColor = MaterialTheme.colorScheme.onSurface, - ), + TextFieldDefaults.outlinedTextFieldColors( + focusedBorderColor = MaterialTheme.colorScheme.onSurface, + ), onValueChange = { (code, phone), isValid -> if (isValid) { mobile = code + phone @@ -356,16 +356,16 @@ fun EditProfileBottomSheetContent( ) { Column( modifier = - modifier - .background(MaterialTheme.colorScheme.surface) - .padding(top = 8.dp, bottom = 12.dp), + modifier + .background(MaterialTheme.colorScheme.surface) + .padding(top = 8.dp, bottom = 12.dp), ) { Row( modifier = - Modifier - .fillMaxWidth() - .padding(12.dp) - .clickable { onClickProfilePicture.invoke() }, + Modifier + .fillMaxWidth() + .padding(12.dp) + .clickable { onClickProfilePicture.invoke() }, horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically, ) { @@ -377,10 +377,10 @@ fun EditProfileBottomSheetContent( } Row( modifier = - Modifier - .fillMaxWidth() - .padding(12.dp) - .clickable { onChangeProfilePicture.invoke() }, + Modifier + .fillMaxWidth() + .padding(12.dp) + .clickable { onChangeProfilePicture.invoke() }, horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically, ) { @@ -392,10 +392,10 @@ fun EditProfileBottomSheetContent( } Row( modifier = - Modifier - .fillMaxWidth() - .padding(12.dp) - .clickable { onRemoveProfilePicture.invoke() }, + Modifier + .fillMaxWidth() + .padding(12.dp) + .clickable { onRemoveProfilePicture.invoke() }, horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically, ) { @@ -418,9 +418,9 @@ private fun EditProfileSaveButton( onClick = onClick, colors = ButtonDefaults.buttonColors(MaterialTheme.colorScheme.primary), modifier = - modifier - .fillMaxWidth() - .padding(16.dp), + modifier + .fillMaxWidth() + .padding(16.dp), shape = RoundedCornerShape(10.dp), contentPadding = PaddingValues(12.dp), ) { diff --git a/feature/request-money/src/main/kotlin/org/mifospay/feature/request/money/SetAmountDialog.kt b/feature/request-money/src/main/kotlin/org/mifospay/feature/request/money/SetAmountDialog.kt index 02ac1363a..eab98646c 100644 --- a/feature/request-money/src/main/kotlin/org/mifospay/feature/request/money/SetAmountDialog.kt +++ b/feature/request-money/src/main/kotlin/org/mifospay/feature/request/money/SetAmountDialog.kt @@ -135,9 +135,9 @@ internal fun SetAmountDialog( } }, keyboardOptions = - KeyboardOptions( - keyboardType = KeyboardType.Number, - ), + KeyboardOptions( + keyboardType = KeyboardType.Number, + ), ) MfOutlinedTextField( @@ -146,9 +146,9 @@ internal fun SetAmountDialog( onValueChange = { currency = it }, modifier = Modifier.fillMaxWidth(), keyboardOptions = - KeyboardOptions( - keyboardType = KeyboardType.Text, - ), + KeyboardOptions( + keyboardType = KeyboardType.Text, + ), ) Spacer(modifier = Modifier.height(8.dp)) diff --git a/feature/send-money/src/main/kotlin/org/mifospay/feature/send/money/SendScreenRoute.kt b/feature/send-money/src/main/kotlin/org/mifospay/feature/send/money/SendScreenRoute.kt index 871261664..1623c2f3e 100644 --- a/feature/send-money/src/main/kotlin/org/mifospay/feature/send/money/SendScreenRoute.kt +++ b/feature/send-money/src/main/kotlin/org/mifospay/feature/send/money/SendScreenRoute.kt @@ -200,9 +200,9 @@ internal fun SendMoneyScreen( Row( verticalAlignment = Alignment.CenterVertically, modifier = - Modifier - .fillMaxWidth() - .padding(top = 20.dp, bottom = 20.dp), + Modifier + .fillMaxWidth() + .padding(top = 20.dp, bottom = 20.dp), ) { VpaMobileChip( label = stringResource(id = R.string.feature_send_money_vpa), @@ -256,9 +256,9 @@ internal fun SendMoneyScreen( SendMethodType.MOBILE -> { EnterPhoneScreen( modifier = - Modifier - .fillMaxWidth() - .padding(bottom = 8.dp), + Modifier + .fillMaxWidth() + .padding(bottom = 8.dp), initialPhoneNumber = mobileNumber, onNumberUpdated = { _, fullPhone, valid -> if (valid) { @@ -273,10 +273,10 @@ internal fun SendMoneyScreen( Spacer(modifier = Modifier.height(16.dp)) MifosButton( modifier = - Modifier - .fillMaxWidth() - .padding(top = 16.dp) - .align(Alignment.CenterHorizontally), + Modifier + .fillMaxWidth() + .padding(top = 16.dp) + .align(Alignment.CenterHorizontally), color = MaterialTheme.colorScheme.onSurface, enabled = isValidInfo, onClick = { @@ -320,9 +320,9 @@ private fun EnterPhoneScreen( modifier = modifier, shape = RoundedCornerShape(8.dp), colors = - TextFieldDefaults.outlinedTextFieldColors( - focusedBorderColor = MaterialTheme.colorScheme.primary, - ), + TextFieldDefaults.outlinedTextFieldColors( + focusedBorderColor = MaterialTheme.colorScheme.primary, + ), initialPhoneNumber = initialPhoneNumber, onValueChange = { (code, phone), isValid -> onNumberUpdated(phone, code + phone, isValid) @@ -343,9 +343,9 @@ private fun VpaMobileChip( onClick = onClick, color = if (selected) MaterialTheme.colorScheme.primary else Color.LightGray, modifier = - modifier - .padding(4.dp) - .wrapContentSize(), + modifier + .padding(4.dp) + .wrapContentSize(), ) { Text( modifier = Modifier.padding(top = 4.dp, bottom = 4.dp), diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d8dfb79b3..d2dfd0fbf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,15 +4,15 @@ androidPdfViewerVersion = "2.8.2" appcompatVersion = "1.7.0" androidGradlePlugin = "8.4.0" checkstyleVersion = "10.16.0" -compileSdk = "34" constraintlayoutVersion = "2.1.4" swiperefreshLayoutVersion = "1.1.0" coreKtxVersion = "1.13.1" credentialsVersion = "1.2.2" googleidVersion = "1.1.1" materialNavigationVersion = "1.7.0-alpha04" -minSdk = "24" playServicesAuthVersion = "21.2.0" +compileSdk = "34" +minSdk = "24" targetSdk = "34" androidTools = "31.5.1" androidxActivity = "1.9.1" @@ -31,7 +31,6 @@ compose-plugin = "1.6.1" ksp = "1.9.22-1.0.18" firebaseCrashlyticsPlugin = "2.9.9" gmsPlugin = "4.4.1" -butterknifePlugin = "10.2.3" secrets = "2.0.1" lifecycleVersion = "2.8.4" lifecycleExtensionsVersion = "2.2.0" @@ -78,9 +77,7 @@ androidxBrowser = "1.8.0" playServicesCodeScanner = "16.1.0" moduleGraph = "2.5.0" composeMaterial = "1.6.0" -mifosPasscode = "0.3.0" -zxingAndroidEmbeddedVersion = "4.2.0" -zxingVersion = "1.9.13" +zxingVersion = "3.5.3" cameraViewVersion = "1.3.4" cameraLifecycleVersion = "1.3.4" spotlessVersion = "6.23.3" @@ -128,8 +125,6 @@ androidx-lifecycle-viewModelCompose = { group = "androidx.lifecycle", name = "li 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" } -jakewharton-butterknife = { module = "com.jakewharton:butterknife", version.ref = "butterKnifeVersion" } -jakewharton-compiler = { module = "com.jakewharton:butterknife-compiler", version.ref = "butterKnifeVersion" } 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" } @@ -142,7 +137,6 @@ 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" } -jetbrains-kotlin-jdk7 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk7", version.ref = "kotlin" } 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" } @@ -173,14 +167,11 @@ androidx-profileinstaller = { group = "androidx.profileinstaller", name = "profi 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" } -coil-kt-svg = { group = "io.coil-kt", name = "coil-svg", 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" } -mifosPasscode = { group = "com.mifos.mobile", name = "mifos-passcode", version.ref = "mifosPasscode" } #Detekt -detekt-gradlePlugin = { group = "io.gitlab.arturbosch.detekt", name = "detekt-gradle-plugin", version.ref = "detekt" } detekt-formatting = { group = "io.gitlab.arturbosch.detekt", name = "detekt-formatting", version.ref = "detekt" } twitter-detekt-compose = { group = "com.twitter.compose.rules", name = "detekt", version.ref = "twitter-detekt-compose" } @@ -192,8 +183,7 @@ firebase-performance-gradlePlugin = { group = "com.google.firebase", name = "per kotlin-gradlePlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } ksp-gradlePlugin = { group = "com.google.devtools.ksp", name = "com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" } room-gradlePlugin = { group = "androidx.room", name = "room-gradle-plugin", version.ref = "room" } -zxing = { module = "me.dm7.barcodescanner:zxing", version.ref = "zxingVersion" } -zxing-android-embedded = { module = "com.journeyapps:zxing-android-embedded", version.ref = "zxingAndroidEmbeddedVersion" } +zxing = { module = "com.google.zxing:core", version.ref = "zxingVersion" } androidx-camera-view = { group = "androidx.camera", name = "camera-view", version.ref = "cameraViewVersion" } androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "cameraLifecycleVersion" } spotless-gradle = { group = "com.diffplug.spotless", name = "spotless-plugin-gradle", version.ref = "spotlessVersion" } @@ -213,7 +203,6 @@ kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", versi kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } android-test = { id = "com.android.test", version.ref = "androidGradlePlugin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } -kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } roborazzi = { id = "io.github.takahirom.roborazzi", version.ref = "roborazzi" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } diff --git a/mifospay/build.gradle.kts b/mifospay/build.gradle.kts index 219aa620d..febc5dba3 100644 --- a/mifospay/build.gradle.kts +++ b/mifospay/build.gradle.kts @@ -116,6 +116,7 @@ dependencies { implementation(libs.androidx.core.splashscreen) implementation(libs.androidx.hilt.navigation.compose) implementation(libs.androidx.lifecycle.runtimeCompose) + implementation(libs.androidx.lifecycle.viewModelCompose) implementation(libs.androidx.navigation.compose) implementation(libs.androidx.profileinstaller) implementation(libs.androidx.tracing.ktx) @@ -124,8 +125,6 @@ dependencies { implementation(libs.androidx.material.navigation) implementation(libs.accompanist.pager) - implementation(libs.mifosPasscode) - ksp(libs.hilt.compiler) // Google Bar code scanner @@ -148,8 +147,6 @@ dependencies { runtimeOnly(libs.androidx.compose.runtime) debugImplementation(libs.androidx.compose.ui.tooling) - implementation(libs.mifosPasscode) - kspTest(libs.hilt.compiler) testImplementation(libs.junit) @@ -161,5 +158,8 @@ dependencies { } dependencyGuard { - configuration("prodReleaseRuntimeClasspath") + configuration("prodReleaseRuntimeClasspath") { + modules = true + tree = true + } } diff --git a/mifospay/dependencies/prodReleaseRuntimeClasspath.tree.txt b/mifospay/dependencies/prodReleaseRuntimeClasspath.tree.txt new file mode 100644 index 000000000..c014197d5 --- /dev/null +++ b/mifospay/dependencies/prodReleaseRuntimeClasspath.tree.txt @@ -0,0 +1,2031 @@ ++--- com.google.android.material:material:1.0.0 -> 1.11.0 +| +--- org.jetbrains.kotlin:kotlin-bom:1.8.22 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22 -> 1.9.23 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.23 (c) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (c) +| +--- com.google.errorprone:error_prone_annotations:2.15.0 -> 2.26.0 +| +--- androidx.activity:activity:1.8.0 -> 1.9.1 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 +| | | \--- androidx.annotation:annotation-jvm:1.8.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.23 +| | | +--- org.jetbrains:annotations:13.0 -> 23.0.0 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.23 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0 -> 1.9.23 (c) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 -> 1.9.23 (c) +| | +--- androidx.collection:collection:1.0.0 -> 1.4.0 +| | | \--- androidx.collection:collection-jvm:1.4.0 +| | | +--- androidx.annotation:annotation:1.7.0 -> 1.8.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | +--- androidx.collection:collection-ktx:1.4.0 (c) +| | | \--- androidx.collection:collection-ktx:1.3.0 -> 1.4.0 (c) +| | +--- androidx.core:core:1.13.0 -> 1.13.1 +| | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.0 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.23 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | \--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | | +--- androidx.interpolator:interpolator:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.2 -> 2.8.4 +| | | | \--- androidx.lifecycle:lifecycle-runtime-android:2.8.4 +| | | | +--- androidx.annotation:annotation:1.8.0 (*) +| | | | +--- androidx.arch.core:core-common:2.2.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | +--- androidx.arch.core:core-runtime:2.2.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | | \--- androidx.arch.core:core-common:2.2.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 +| | | | | \--- androidx.lifecycle:lifecycle-common-jvm:2.8.4 +| | | | | +--- androidx.annotation:annotation:1.8.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 +| | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.1 +| | | | | | +--- org.jetbrains:annotations:23.0.0 +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.1 +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1 (c) +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.1 (c) +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1 (c) +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.8.1 (c) +| | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.8.1 (c) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 1.9.23 (*) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-service:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.1 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| | | | | +--- androidx.concurrent:concurrent-futures:1.1.0 (*) +| | | | | +--- androidx.startup:startup-runtime:1.1.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | | | \--- androidx.tracing:tracing:1.0.0 -> 1.3.0-alpha02 +| | | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| | | | | | \--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (c) +| | | | | \--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.1 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.1 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 1.9.23 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-service:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | \--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | \--- androidx.core:core-ktx:1.13.1 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 +| | | \--- androidx.lifecycle:lifecycle-viewmodel-android:2.8.4 +| | | +--- androidx.annotation:annotation:1.8.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-service:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 -> 2.8.4 +| | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*) +| | | +--- androidx.core:core-ktx:1.2.0 -> 1.13.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | +--- androidx.core:core:1.13.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | \--- androidx.core:core:1.13.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 +| | | | +--- androidx.arch.core:core-common:2.2.0 (*) +| | | | +--- androidx.arch.core:core-runtime:2.2.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-service:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (*) +| | | +--- androidx.savedstate:savedstate:1.2.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 -> 2.8.4 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.23 (*) +| | | | \--- androidx.savedstate:savedstate-ktx:1.2.1 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.1 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-service:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | +--- androidx.tracing:tracing:1.0.0 -> 1.3.0-alpha02 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | +--- androidx.activity:activity-compose:1.9.1 (c) +| | \--- androidx.activity:activity-ktx:1.9.1 (c) +| +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| +--- androidx.appcompat:appcompat:1.6.1 -> 1.7.0 +| | +--- androidx.activity:activity:1.7.0 -> 1.9.1 (*) +| | +--- androidx.annotation:annotation:1.3.0 -> 1.8.0 (*) +| | +--- androidx.appcompat:appcompat-resources:1.7.0 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | | +--- androidx.core:core:1.6.0 -> 1.13.1 (*) +| | | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | +--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.4.0 (*) +| | | +--- androidx.vectordrawable:vectordrawable-animated:1.1.0 +| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| | | | +--- androidx.interpolator:interpolator:1.0.0 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.4.0 (*) +| | | \--- androidx.appcompat:appcompat:1.7.0 (c) +| | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | +--- androidx.core:core:1.13.0 -> 1.13.1 (*) +| | +--- androidx.core:core-ktx:1.13.0 -> 1.13.1 (*) +| | +--- androidx.cursoradapter:cursoradapter:1.0.0 +| | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*) +| | +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | +--- androidx.core:core:1.2.0 -> 1.13.1 (*) +| | | \--- androidx.customview:customview:1.1.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | +--- androidx.core:core:1.3.0 -> 1.13.1 (*) +| | | \--- androidx.collection:collection:1.1.0 -> 1.4.0 (*) +| | +--- androidx.emoji2:emoji2:1.3.0 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| | | +--- androidx.collection:collection:1.1.0 -> 1.4.0 (*) +| | | +--- androidx.core:core:1.3.0 -> 1.13.1 (*) +| | | +--- androidx.lifecycle:lifecycle-process:2.4.1 -> 2.8.4 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (*) +| | | | +--- androidx.startup:startup-runtime:1.1.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-service:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | +--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) +| | | \--- androidx.emoji2:emoji2-views-helper:1.3.0 (c) +| | +--- androidx.emoji2:emoji2-views-helper:1.2.0 -> 1.3.0 +| | | +--- androidx.collection:collection:1.1.0 -> 1.4.0 (*) +| | | +--- androidx.core:core:1.3.0 -> 1.13.1 (*) +| | | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | | \--- androidx.emoji2:emoji2:1.3.0 (c) +| | +--- androidx.fragment:fragment:1.5.4 -> 1.6.2 +| | | +--- androidx.activity:activity:1.7.2 -> 1.9.1 (*) +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.4.0 (*) +| | | +--- androidx.collection:collection:1.1.0 -> 1.4.0 (*) +| | | +--- androidx.core:core-ktx:1.2.0 -> 1.13.1 (*) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.loader:loader:1.0.0 -> 1.1.0 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*) +| | | | +--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.0.0 -> 2.8.4 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.0.0 -> 2.8.4 (*) +| | | | \--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | +--- androidx.viewpager:viewpager:1.0.0 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*) +| | | | +--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | | | \--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.23 (*) +| | | \--- androidx.fragment:fragment-ktx:1.6.2 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | \--- androidx.appcompat:appcompat-resources:1.7.0 (c) +| +--- androidx.cardview:cardview:1.0.0 +| | \--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*) +| +--- androidx.coordinatorlayout:coordinatorlayout:1.1.0 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | +--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) +| | \--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| +--- androidx.constraintlayout:constraintlayout:2.0.1 -> 2.1.4 +| | +--- androidx.appcompat:appcompat:1.2.0 -> 1.7.0 (*) +| | +--- androidx.core:core:1.3.2 -> 1.13.1 (*) +| | \--- androidx.constraintlayout:constraintlayout-core:1.0.4 +| +--- androidx.core:core:1.6.0 -> 1.13.1 (*) +| +--- androidx.drawerlayout:drawerlayout:1.1.1 (*) +| +--- androidx.dynamicanimation:dynamicanimation:1.0.0 +| | +--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | \--- androidx.legacy:legacy-support-core-utils:1.0.0 +| | +--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*) +| | +--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | +--- androidx.documentfile:documentfile:1.0.0 +| | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*) +| | +--- androidx.loader:loader:1.0.0 -> 1.1.0 (*) +| | +--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 +| | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*) +| | \--- androidx.print:print:1.0.0 +| | \--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*) +| +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.4.0 (*) +| +--- androidx.fragment:fragment:1.2.5 -> 1.6.2 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.8.4 (*) +| +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.3.2 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | +--- androidx.core:core:1.7.0 -> 1.13.1 (*) +| | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) +| | +--- androidx.customview:customview-poolingcontainer:1.0.0 +| | | +--- androidx.core:core-ktx:1.5.0 -> 1.13.1 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.23 (*) +| | \--- androidx.viewpager2:viewpager2:1.1.0-beta02 (c) +| +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 (*) +| +--- androidx.transition:transition:1.2.0 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | +--- androidx.core:core:1.0.1 -> 1.13.1 (*) +| | \--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| \--- androidx.viewpager2:viewpager2:1.0.0 -> 1.1.0-beta02 +| +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| +--- androidx.annotation:annotation-experimental:1.3.0 -> 1.4.0 (*) +| +--- androidx.collection:collection:1.1.0 -> 1.4.0 (*) +| +--- androidx.core:core:1.3.2 -> 1.13.1 (*) +| +--- androidx.fragment:fragment:1.1.0 -> 1.6.2 (*) +| \--- androidx.recyclerview:recyclerview:1.3.1-rc01 -> 1.3.2 (*) ++--- androidx.databinding:databinding-common:8.4.0 ++--- androidx.databinding:databinding-runtime:8.4.0 +| +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| +--- androidx.databinding:databinding-common:8.4.0 +| +--- androidx.databinding:viewbinding:8.4.0 +| | \--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*) +| \--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.4 (*) ++--- androidx.databinding:databinding-adapters:8.4.0 +| +--- androidx.databinding:databinding-runtime:8.4.0 (*) +| \--- androidx.databinding:databinding-common:8.4.0 ++--- androidx.databinding:databinding-ktx:8.4.0 +| +--- androidx.databinding:databinding-runtime:8.4.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20 -> 1.9.23 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.23 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 (*) +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1 -> 1.8.1 (*) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 -> 2.8.4 +| | \--- androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.4 +| | +--- androidx.annotation:annotation:1.8.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.1 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | \--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| +--- androidx.lifecycle:lifecycle-livedata:2.6.1 -> 2.8.4 +| | +--- androidx.arch.core:core-common:2.2.0 (*) +| | +--- androidx.arch.core:core-runtime:2.2.0 (*) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-service:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | \--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| +--- androidx.lifecycle:lifecycle-process:2.6.1 -> 2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-service:2.6.1 -> 2.8.4 +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | \--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| \--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) ++--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) ++--- androidx.compose:compose-bom:2024.06.00 +| +--- androidx.compose.material3:material3-window-size-class:1.2.1 (c) +| +--- androidx.compose.runtime:runtime:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-tooling-preview:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.foundation:foundation:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.foundation:foundation-layout:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.material:material-icons-extended:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.material3:material3:1.2.1 (c) +| +--- androidx.compose.ui:ui-util:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.material:material:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.runtime:runtime-saveable:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.animation:animation:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.animation:animation-graphics:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.material3:material3-window-size-class-android:1.2.1 (c) +| +--- androidx.compose.material:material-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.material:material-icons-extended-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.material3:material3-android:1.2.1 (c) +| +--- androidx.compose.ui:ui-unit:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.animation:animation-core:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.material:material-icons-core:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.material:material-ripple:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-text:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-graphics:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-geometry:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.material:material-icons-core-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.material:material-ripple-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.foundation:foundation-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.animation:animation-core-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.runtime:runtime-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.animation:animation-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.foundation:foundation-layout-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-graphics-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-util-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.animation:animation-graphics-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.runtime:runtime-saveable-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-unit-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-geometry-android:1.6.8 -> 1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-text-android:1.6.8 -> 1.7.0-alpha04 (c) +| \--- androidx.compose.ui:ui-tooling-preview-android:1.6.8 -> 1.7.0-alpha04 (c) ++--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 +| \--- androidx.compose.ui:ui-tooling-preview-android:1.7.0-alpha04 +| +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| +--- androidx.compose.runtime:runtime:1.7.0-alpha04 +| | \--- androidx.compose.runtime:runtime-android:1.7.0-alpha04 +| | +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| | +--- androidx.collection:collection:1.4.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.1 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*) +| | \--- androidx.compose.runtime:runtime-saveable:1.7.0-alpha04 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| +--- androidx.compose.ui:ui:1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-geometry:1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-graphics:1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-text:1.7.0-alpha04 (c) +| +--- androidx.compose.ui:ui-unit:1.7.0-alpha04 (c) +| \--- androidx.compose.ui:ui-util:1.7.0-alpha04 (c) ++--- com.google.dagger:hilt-android:2.51.1 +| +--- com.google.dagger:dagger:2.51.1 +| | \--- javax.inject:javax.inject:1 +| +--- com.google.dagger:dagger-lint-aar:2.51.1 +| +--- com.google.dagger:hilt-core:2.51.1 +| | +--- com.google.dagger:dagger:2.51.1 (*) +| | +--- com.google.code.findbugs:jsr305:3.0.2 +| | \--- javax.inject:javax.inject:1 +| +--- com.google.code.findbugs:jsr305:3.0.2 +| +--- androidx.activity:activity:1.5.1 -> 1.9.1 (*) +| +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| +--- androidx.annotation:annotation-experimental:1.3.1 -> 1.4.0 (*) +| +--- androidx.fragment:fragment:1.5.1 -> 1.6.2 (*) +| +--- androidx.lifecycle:lifecycle-common:2.5.1 -> 2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 -> 2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 -> 2.8.4 (*) +| +--- androidx.savedstate:savedstate:1.2.0 -> 1.2.1 (*) +| +--- javax.inject:javax.inject:1 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.20 -> 1.9.23 (*) ++--- com.google.firebase:firebase-bom:33.1.2 +| +--- com.google.firebase:firebase-perf-ktx:21.0.1 (c) +| +--- com.google.firebase:firebase-crashlytics-ktx:19.0.3 (c) +| +--- com.google.firebase:firebase-analytics-ktx:22.0.2 (c) +| +--- com.google.firebase:firebase-messaging-ktx:24.0.0 (c) +| +--- com.google.firebase:firebase-encoders:17.0.0 (c) +| +--- com.google.firebase:firebase-perf:21.0.1 (c) +| +--- com.google.firebase:firebase-common:21.0.0 (c) +| +--- com.google.firebase:firebase-common-ktx:21.0.0 (c) +| +--- com.google.firebase:firebase-crashlytics:19.0.3 (c) +| +--- com.google.firebase:firebase-analytics:22.0.2 (c) +| +--- com.google.firebase:firebase-messaging:24.0.0 (c) +| +--- com.google.firebase:firebase-config:22.0.0 (c) +| \--- com.google.firebase:firebase-installations:18.0.0 (c) ++--- com.google.firebase:firebase-analytics-ktx -> 22.0.2 +| +--- com.google.firebase:firebase-analytics:22.0.2 +| | +--- com.google.android.gms:play-services-measurement:22.0.2 +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | | +--- androidx.legacy:legacy-support-core-utils:1.0.0 (*) +| | | +--- com.google.android.gms:play-services-ads-identifier:18.0.0 +| | | | \--- com.google.android.gms:play-services-basement:18.0.0 -> 18.4.0 +| | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | | | +--- androidx.core:core:1.2.0 -> 1.13.1 (*) +| | | | \--- androidx.fragment:fragment:1.1.0 -> 1.6.2 (*) +| | | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | +--- com.google.android.gms:play-services-measurement-base:22.0.2 +| | | | \--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | +--- com.google.android.gms:play-services-measurement-impl:22.0.2 +| | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | | | +--- androidx.core:core:1.9.0 -> 1.13.1 (*) +| | | | +--- androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 +| | | | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.0 (*) +| | | | | +--- androidx.core:core-ktx:1.8.0 -> 1.13.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.23 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.1 (*) +| | | | | \--- androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05 (c) +| | | | +--- androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| | | | | +--- androidx.concurrent:concurrent-futures:1.1.0 (*) +| | | | | +--- androidx.core:core-ktx:1.8.0 -> 1.13.1 (*) +| | | | | +--- androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 (*) +| | | | | +--- com.google.guava:guava:31.1-android +| | | | | | +--- com.google.guava:failureaccess:1.0.1 +| | | | | | +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava +| | | | | | +--- com.google.code.findbugs:jsr305:3.0.2 +| | | | | | +--- org.checkerframework:checker-qual:3.12.0 +| | | | | | +--- com.google.errorprone:error_prone_annotations:2.11.0 -> 2.26.0 +| | | | | | \--- com.google.j2objc:j2objc-annotations:1.3 +| | | | | +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.23 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.1 (*) +| | | | | \--- androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 (c) +| | | | +--- com.google.android.gms:play-services-ads-identifier:18.0.0 (*) +| | | | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | | +--- com.google.android.gms:play-services-measurement-base:22.0.2 (*) +| | | | +--- com.google.android.gms:play-services-stats:17.0.2 +| | | | | +--- androidx.legacy:legacy-support-core-utils:1.0.0 (*) +| | | | | \--- com.google.android.gms:play-services-basement:18.0.0 -> 18.4.0 (*) +| | | | \--- com.google.guava:guava:31.1-android (*) +| | | \--- com.google.android.gms:play-services-stats:17.0.2 (*) +| | +--- com.google.android.gms:play-services-measurement-api:22.0.2 +| | | +--- com.google.android.gms:play-services-ads-identifier:18.0.0 (*) +| | | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | +--- com.google.android.gms:play-services-measurement-base:22.0.2 (*) +| | | +--- com.google.android.gms:play-services-measurement-sdk-api:22.0.2 +| | | | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | | \--- com.google.android.gms:play-services-measurement-base:22.0.2 (*) +| | | +--- com.google.android.gms:play-services-tasks:18.2.0 +| | | | \--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | +--- com.google.firebase:firebase-common:21.0.0 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.4 -> 1.8.1 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.1 (*) +| | | | | +--- com.google.android.gms:play-services-tasks:16.0.1 -> 18.2.0 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 1.9.23 (*) +| | | | +--- com.google.firebase:firebase-components:18.0.0 +| | | | | +--- com.google.firebase:firebase-annotations:16.2.0 +| | | | | | \--- javax.inject:javax.inject:1 +| | | | | +--- androidx.annotation:annotation:1.5.0 -> 1.8.0 (*) +| | | | | \--- com.google.errorprone:error_prone_annotations:2.26.0 +| | | | +--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | | | +--- androidx.annotation:annotation:1.5.0 -> 1.8.0 (*) +| | | | +--- androidx.concurrent:concurrent-futures:1.1.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | +--- com.google.android.gms:play-services-basement:18.3.0 -> 18.4.0 (*) +| | | | \--- com.google.android.gms:play-services-tasks:18.1.0 -> 18.2.0 (*) +| | | +--- com.google.firebase:firebase-common-ktx:21.0.0 +| | | | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.23 (*) +| | | | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | | | \--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | | +--- com.google.firebase:firebase-installations:17.0.1 -> 18.0.0 +| | | | +--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | | | +--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | | | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | | | +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| | | | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | | | +--- com.google.firebase:firebase-installations-interop:17.1.1 -> 17.2.0 +| | | | | +--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | | | | \--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | +--- com.google.firebase:firebase-installations-interop:17.0.0 -> 17.2.0 (*) +| | | +--- com.google.firebase:firebase-measurement-connector:19.0.0 -> 20.0.1 +| | | | +--- com.google.android.gms:play-services-basement:18.0.0 -> 18.4.0 (*) +| | | | \--- com.google.firebase:firebase-annotations:16.0.0 -> 16.2.0 (*) +| | | +--- com.google.guava:guava:31.1-android (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.23 (*) +| | \--- com.google.android.gms:play-services-measurement-sdk:22.0.2 +| | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | +--- com.google.android.gms:play-services-measurement-base:22.0.2 (*) +| | \--- com.google.android.gms:play-services-measurement-impl:22.0.2 (*) +| +--- com.google.firebase:firebase-common:21.0.0 (*) +| +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| +--- com.google.firebase:firebase-components:18.0.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.23 (*) ++--- com.google.firebase:firebase-perf-ktx -> 21.0.1 +| +--- com.google.firebase:firebase-perf:21.0.1 +| | +--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | +--- com.google.firebase:firebase-installations-interop:17.1.0 -> 17.2.0 (*) +| | +--- com.google.firebase:protolite-well-known-types:18.0.0 +| | | \--- com.google.protobuf:protobuf-javalite:3.14.0 -> 3.25.2 +| | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | +--- com.google.firebase:firebase-config:21.5.0 -> 22.0.0 +| | | +--- com.google.firebase:firebase-config-interop:16.0.1 +| | | | +--- com.google.firebase:firebase-encoders-json:18.0.1 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.9.23 (*) +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | | \--- com.google.firebase:firebase-encoders:17.0.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | \--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | | +--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | | +--- com.google.firebase:firebase-installations-interop:17.1.0 -> 17.2.0 (*) +| | | +--- com.google.firebase:firebase-abt:21.1.1 +| | | | +--- com.google.firebase:firebase-measurement-connector:18.0.0 -> 20.0.1 (*) +| | | | \--- com.google.android.gms:play-services-basement:18.1.0 -> 18.4.0 (*) +| | | +--- com.google.firebase:firebase-measurement-connector:18.0.0 -> 20.0.1 (*) +| | | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | | +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| | | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | | +--- com.google.firebase:firebase-installations:17.2.0 -> 18.0.0 (*) +| | | +--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | +--- com.google.firebase:firebase-installations:17.2.0 -> 18.0.0 (*) +| | +--- com.google.firebase:firebase-sessions:2.0.0 -> 2.0.3 +| | | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | | +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| | | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | | +--- com.google.firebase:firebase-installations-interop:17.2.0 (*) +| | | +--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | | +--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | | +--- com.google.firebase:firebase-encoders-json:18.0.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.23 (*) +| | | +--- com.google.firebase:firebase-installations:18.0.0 (*) +| | | +--- com.google.firebase:firebase-datatransport:19.0.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | +--- com.google.android.datatransport:transport-api:3.1.0 -> 3.2.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | +--- com.google.android.datatransport:transport-backend-cct:3.2.0 -> 3.3.0 +| | | | | +--- com.google.android.datatransport:transport-api:3.2.0 (*) +| | | | | +--- com.google.android.datatransport:transport-runtime:3.3.0 +| | | | | | +--- com.google.android.datatransport:transport-api:3.2.0 (*) +| | | | | | +--- androidx.annotation:annotation:1.3.0 -> 1.8.0 (*) +| | | | | | +--- javax.inject:javax.inject:1 +| | | | | | +--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | | | | | \--- com.google.firebase:firebase-encoders-proto:16.0.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | | | \--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | | | | +--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | | | | +--- com.google.firebase:firebase-encoders-json:18.0.0 -> 18.0.1 (*) +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | +--- com.google.android.datatransport:transport-runtime:3.2.0 -> 3.3.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.23 (*) +| | | +--- androidx.datastore:datastore-preferences:1.0.0 -> 1.1.1 +| | | | \--- androidx.datastore:datastore-preferences-android:1.1.1 +| | | | +--- androidx.datastore:datastore:1.1.1 +| | | | | \--- androidx.datastore:datastore-android:1.1.1 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| | | | | +--- androidx.datastore:datastore-core:1.1.1 +| | | | | | \--- androidx.datastore:datastore-core-android:1.1.1 +| | | | | | +--- androidx.annotation:annotation:1.7.0 -> 1.8.0 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.9.22 +| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | | | | | | \--- org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.9.22 +| | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*) +| | | | | | +--- androidx.datastore:datastore:1.1.1 (c) +| | | | | | +--- androidx.datastore:datastore-core-okio:1.1.1 (c) +| | | | | | +--- androidx.datastore:datastore-preferences:1.1.1 (c) +| | | | | | \--- androidx.datastore:datastore-preferences-core:1.1.1 (c) +| | | | | +--- androidx.datastore:datastore-core-okio:1.1.1 +| | | | | | \--- androidx.datastore:datastore-core-okio-jvm:1.1.1 +| | | | | | +--- androidx.datastore:datastore-core:1.1.1 (*) +| | | | | | +--- com.squareup.okio:okio:3.4.0 -> 3.8.0 +| | | | | | | \--- com.squareup.okio:okio-jvm:3.8.0 +| | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 1.9.23 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*) +| | | | | | +--- androidx.datastore:datastore:1.1.1 (c) +| | | | | | +--- androidx.datastore:datastore-core:1.1.1 (c) +| | | | | | +--- androidx.datastore:datastore-preferences:1.1.1 (c) +| | | | | | \--- androidx.datastore:datastore-preferences-core:1.1.1 (c) +| | | | | +--- com.squareup.okio:okio:3.4.0 -> 3.8.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*) +| | | | | +--- androidx.datastore:datastore-core:1.1.1 (c) +| | | | | +--- androidx.datastore:datastore-core-okio:1.1.1 (c) +| | | | | +--- androidx.datastore:datastore-preferences:1.1.1 (c) +| | | | | \--- androidx.datastore:datastore-preferences-core:1.1.1 (c) +| | | | +--- androidx.datastore:datastore-preferences-core:1.1.1 +| | | | | \--- androidx.datastore:datastore-preferences-core-jvm:1.1.1 +| | | | | +--- androidx.datastore:datastore-core:1.1.1 (*) +| | | | | +--- androidx.datastore:datastore-core-okio:1.1.1 (*) +| | | | | +--- com.squareup.okio:okio:3.4.0 -> 3.8.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | +--- androidx.datastore:datastore:1.1.1 (c) +| | | | | +--- androidx.datastore:datastore-core:1.1.1 (c) +| | | | | +--- androidx.datastore:datastore-core-okio:1.1.1 (c) +| | | | | \--- androidx.datastore:datastore-preferences:1.1.1 (c) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*) +| | | | +--- androidx.datastore:datastore:1.1.1 (c) +| | | | +--- androidx.datastore:datastore-core:1.1.1 (c) +| | | | +--- androidx.datastore:datastore-core-okio:1.1.1 (c) +| | | | \--- androidx.datastore:datastore-preferences-core:1.1.1 (c) +| | | +--- com.google.android.datatransport:transport-api:3.2.0 (*) +| | | \--- androidx.annotation:annotation:1.5.0 -> 1.8.0 (*) +| | +--- com.google.firebase:firebase-datatransport:18.1.8 -> 19.0.0 (*) +| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | +--- androidx.lifecycle:lifecycle-process:2.3.1 -> 2.8.4 (*) +| | +--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | +--- com.google.protobuf:protobuf-javalite:3.21.11 -> 3.25.2 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | +--- androidx.appcompat:appcompat:1.2.0 -> 1.7.0 (*) +| | +--- com.google.android.datatransport:transport-api:3.0.0 -> 3.2.0 (*) +| | +--- com.google.dagger:dagger:2.27 -> 2.51.1 (*) +| | \--- com.squareup.okhttp3:okhttp:3.12.1 -> 4.12.0 +| | +--- com.squareup.okio:okio:3.6.0 -> 3.8.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.23 (*) +| +--- com.google.firebase:firebase-common:21.0.0 (*) +| +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.23 (*) +| \--- com.google.firebase:firebase-components:18.0.0 (*) ++--- com.google.firebase:firebase-crashlytics-ktx -> 19.0.3 +| +--- com.google.firebase:firebase-crashlytics:19.0.3 +| | +--- com.google.firebase:firebase-sessions:2.0.3 (*) +| | +--- com.google.android.gms:play-services-tasks:18.1.0 -> 18.2.0 (*) +| | +--- com.google.firebase:firebase-annotations:16.2.0 (*) +| | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | +--- com.google.firebase:firebase-config-interop:16.0.1 (*) +| | +--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | +--- com.google.firebase:firebase-encoders-json:18.0.1 (*) +| | +--- com.google.firebase:firebase-installations:18.0.0 (*) +| | +--- com.google.firebase:firebase-installations-interop:17.2.0 (*) +| | +--- com.google.firebase:firebase-measurement-connector:20.0.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.23 (*) +| | +--- com.google.android.datatransport:transport-api:3.2.0 (*) +| | +--- com.google.android.datatransport:transport-backend-cct:3.3.0 (*) +| | +--- com.google.android.datatransport:transport-runtime:3.3.0 (*) +| | \--- androidx.annotation:annotation:1.5.0 -> 1.8.0 (*) +| +--- com.google.firebase:firebase-common:21.0.0 (*) +| +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.23 (*) +| \--- com.google.firebase:firebase-components:18.0.0 (*) ++--- com.google.firebase:firebase-messaging-ktx -> 24.0.0 +| +--- com.google.firebase:firebase-messaging:24.0.0 +| | +--- com.google.firebase:firebase-common:21.0.0 (*) +| | +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| | +--- com.google.firebase:firebase-components:18.0.0 (*) +| | +--- com.google.firebase:firebase-datatransport:18.2.0 -> 19.0.0 (*) +| | +--- com.google.firebase:firebase-encoders:17.0.0 (*) +| | +--- com.google.firebase:firebase-encoders-json:18.0.0 -> 18.0.1 (*) +| | +--- com.google.firebase:firebase-encoders-proto:16.0.0 (*) +| | +--- com.google.firebase:firebase-iid-interop:17.1.0 +| | | +--- com.google.android.gms:play-services-basement:17.0.0 -> 18.4.0 (*) +| | | \--- com.google.android.gms:play-services-tasks:17.0.0 -> 18.2.0 (*) +| | +--- com.google.firebase:firebase-installations:17.2.0 -> 18.0.0 (*) +| | +--- com.google.firebase:firebase-installations-interop:17.1.0 -> 17.2.0 (*) +| | +--- com.google.firebase:firebase-measurement-connector:19.0.0 -> 20.0.1 (*) +| | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| | +--- com.google.android.datatransport:transport-api:3.1.0 -> 3.2.0 (*) +| | +--- com.google.android.datatransport:transport-backend-cct:3.1.8 -> 3.3.0 (*) +| | +--- com.google.android.datatransport:transport-runtime:3.1.8 -> 3.3.0 (*) +| | +--- com.google.android.gms:play-services-base:18.0.1 -> 18.3.0 +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | | +--- androidx.core:core:1.2.0 -> 1.13.1 (*) +| | | +--- androidx.fragment:fragment:1.0.0 -> 1.6.2 (*) +| | | +--- com.google.android.gms:play-services-basement:18.3.0 -> 18.4.0 (*) +| | | \--- com.google.android.gms:play-services-tasks:18.1.0 -> 18.2.0 (*) +| | +--- com.google.android.gms:play-services-basement:18.1.0 -> 18.4.0 (*) +| | +--- com.google.android.gms:play-services-cloud-messaging:17.2.0 +| | | +--- com.google.android.gms:play-services-basement:18.3.0 -> 18.4.0 (*) +| | | \--- com.google.android.gms:play-services-tasks:18.1.0 -> 18.2.0 (*) +| | +--- com.google.android.gms:play-services-stats:17.0.2 (*) +| | +--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | +--- com.google.errorprone:error_prone_annotations:2.9.0 -> 2.26.0 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| +--- com.google.firebase:firebase-common:21.0.0 (*) +| +--- com.google.firebase:firebase-common-ktx:21.0.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.23 (*) +| \--- com.google.firebase:firebase-components:18.0.0 (*) ++--- project :core:data +| +--- project :core:common +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 +| | | +--- androidx.tracing:tracing:1.3.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | \--- androidx.tracing:tracing:1.3.0-alpha02 (c) +| | +--- com.google.dagger:hilt-android:2.51.1 (*) +| | +--- androidx.core:core-ktx:1.13.1 (*) +| | +--- androidx.appcompat:appcompat:1.7.0 (*) +| | \--- com.google.android.material:material:1.11.0 (*) +| +--- project :core:model +| | +--- org.jetbrains.kotlinx:kotlinx-datetime:0.5.0 +| | | \--- org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.5.0 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 1.9.23 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| | +--- com.squareup.retrofit2:converter-gson:2.9.0 +| | | +--- com.squareup.retrofit2:retrofit:2.9.0 +| | | | \--- com.squareup.okhttp3:okhttp:3.14.9 -> 4.12.0 (*) +| | | \--- com.google.code.gson:gson:2.8.5 +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3 +| | | \--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.6.3 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.6.3 +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 (c) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.6.3 (c) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3 (c) +| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.6.3 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.22 -> 1.9.23 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 +| | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.6.3 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.6.3 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.22 -> 1.9.23 (*) +| | \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.9.22 (*) +| +--- project :core:network +| | +--- org.jetbrains.kotlinx:kotlinx-datetime:0.5.0 (*) +| | +--- project :core:common (*) +| | +--- project :core:model (*) +| | +--- project :core:datastore +| | | +--- org.jetbrains.kotlinx:kotlinx-datetime:0.5.0 (*) +| | | +--- androidx.datastore:datastore:1.1.1 (*) +| | | +--- project :core:datastore-proto +| | | | +--- com.google.protobuf:protobuf-kotlin-lite:3.25.2 +| | | | | +--- com.google.protobuf:protobuf-javalite:3.25.2 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.23 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | | | \--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| | | +--- project :core:common (*) +| | | +--- project :core:model (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | | +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| | | +--- com.google.dagger:hilt-android:2.51.1 (*) +| | | \--- com.squareup.retrofit2:converter-gson:2.9.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| | +--- com.google.dagger:hilt-android:2.51.1 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3 (*) +| | +--- com.squareup.okhttp3:okhttp:4.12.0 (*) +| | +--- com.squareup.okhttp3:logging-interceptor:4.12.0 +| | | +--- com.squareup.okhttp3:okhttp:4.12.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.23 (*) +| | +--- com.squareup.retrofit2:retrofit:2.9.0 (*) +| | +--- com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0 +| | | +--- com.squareup.retrofit2:retrofit:2.9.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.0 -> 1.6.3 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.23 (*) +| | +--- com.squareup.retrofit2:adapter-rxjava:2.9.0 +| | | +--- com.squareup.retrofit2:retrofit:2.9.0 (*) +| | | \--- io.reactivex:rxjava:1.3.8 +| | +--- com.squareup.retrofit2:converter-gson:2.9.0 (*) +| | +--- io.reactivex:rxandroid:1.1.0 +| | | \--- io.reactivex:rxjava:1.1.0 -> 1.3.8 +| | \--- io.reactivex:rxjava:1.3.8 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- com.squareup.retrofit2:retrofit:2.9.0 (*) +| +--- com.squareup.retrofit2:adapter-rxjava:2.9.0 (*) +| +--- com.squareup.retrofit2:converter-gson:2.9.0 (*) +| +--- com.squareup.okhttp3:okhttp:4.12.0 (*) +| +--- com.squareup.okhttp3:logging-interceptor:4.12.0 (*) +| +--- io.reactivex:rxandroid:1.1.0 (*) +| +--- io.reactivex:rxjava:1.3.8 +| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.9.22 (*) ++--- androidx.constraintlayout:constraintlayout:2.1.4 (*) ++--- project :core:ui +| +--- project :core:designsystem +| | +--- androidx.compose.foundation:foundation -> 1.7.0-alpha04 +| | | \--- androidx.compose.foundation:foundation-android:1.7.0-alpha04 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| | | +--- androidx.collection:collection:1.4.0 (*) +| | | +--- androidx.compose.animation:animation:1.7.0-alpha04 +| | | | \--- androidx.compose.animation:animation-android:1.7.0-alpha04 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| | | | +--- androidx.collection:collection:1.4.0 (*) +| | | | +--- androidx.compose.animation:animation-core:1.7.0-alpha04 +| | | | | \--- androidx.compose.animation:animation-core-android:1.7.0-alpha04 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | | +--- androidx.collection:collection:1.4.0 (*) +| | | | | +--- androidx.compose.runtime:runtime:1.7.0-alpha04 (*) +| | | | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-alpha04 +| | | | | | \--- androidx.compose.ui:ui-android:1.7.0-alpha04 +| | | | | | +--- androidx.activity:activity-ktx:1.7.0 -> 1.9.1 +| | | | | | | +--- androidx.activity:activity:1.9.1 (*) +| | | | | | | +--- androidx.core:core-ktx:1.13.0 -> 1.13.1 (*) +| | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 -> 2.8.4 (*) +| | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 -> 2.8.4 +| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (*) +| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.1 (*) +| | | | | | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-service:2.8.4 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | | | | | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | | | | | +--- androidx.savedstate:savedstate-ktx:1.2.1 +| | | | | | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.23 (*) +| | | | | | | | \--- androidx.savedstate:savedstate:1.2.1 (c) +| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | | | +--- androidx.activity:activity:1.9.1 (c) +| | | | | | | \--- androidx.activity:activity-compose:1.9.1 (c) +| | | | | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.0 (*) +| | | | | | +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| | | | | | +--- androidx.autofill:autofill:1.0.0 +| | | | | | | \--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | | | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | | | | | +--- androidx.collection:collection:1.4.0 (*) +| | | | | | +--- androidx.compose.runtime:runtime:1.7.0-alpha04 (*) +| | | | | | +--- androidx.compose.runtime:runtime-saveable:1.7.0-alpha04 +| | | | | | | \--- androidx.compose.runtime:runtime-saveable-android:1.7.0-alpha04 +| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | | | | +--- androidx.compose.runtime:runtime:1.7.0-alpha04 (*) +| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | | | | | \--- androidx.compose.runtime:runtime:1.7.0-alpha04 (c) +| | | | | | +--- androidx.compose.ui:ui-geometry:1.7.0-alpha04 +| | | | | | | \--- androidx.compose.ui:ui-geometry-android:1.7.0-alpha04 +| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | | | | +--- androidx.compose.runtime:runtime:1.7.0-alpha04 (*) +| | | | | | | +--- androidx.compose.ui:ui-util:1.7.0-alpha04 +| | | | | | | | \--- androidx.compose.ui:ui-util-android:1.7.0-alpha04 +| | | | | | | | +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | | | | | | +--- androidx.compose.ui:ui:1.7.0-alpha04 (c) +| | | | | | | | +--- androidx.compose.ui:ui-geometry:1.7.0-alpha04 (c) +| | | | | | | | +--- androidx.compose.ui:ui-graphics:1.7.0-alpha04 (c) +| | | | | | | | +--- androidx.compose.ui:ui-text:1.7.0-alpha04 (c) +| | | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-alpha04 (c) +| | | | | | | | \--- androidx.compose.ui:ui-unit:1.7.0-alpha04 (c) +| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | | | | | +--- androidx.compose.ui:ui:1.7.0-alpha04 (c) +| | | | | | | +--- androidx.compose.ui:ui-graphics:1.7.0-alpha04 (c) +| | | | | | | +--- androidx.compose.ui:ui-text:1.7.0-alpha04 (c) +| | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-alpha04 (c) +| | | | | | | +--- androidx.compose.ui:ui-unit:1.7.0-alpha04 (c) +| | | | | | | \--- androidx.compose.ui:ui-util:1.7.0-alpha04 (c) +| | | | | | +--- androidx.compose.ui:ui-graphics:1.7.0-alpha04 +| | | | | | | \--- androidx.compose.ui:ui-graphics-android:1.7.0-alpha04 +| | | | | | | +--- androidx.annotation:annotation:1.7.0 -> 1.8.0 (*) +| | | | | | | +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| | | | | | | +--- androidx.collection:collection:1.4.0 (*) +| | | | | | | +--- androidx.compose.runtime:runtime:1.7.0-alpha04 (*) +| | | | | | | +--- androidx.compose.ui:ui-unit:1.7.0-alpha04 +| | | | | | | | \--- androidx.compose.ui:ui-unit-android:1.7.0-alpha04 +| | | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | | | | | +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| | | | | | | | +--- androidx.collection:collection:1.4.0 (*) +| | | | | | | | +--- androidx.collection:collection-ktx:1.2.0 -> 1.4.0 +| | | | | | | | | +--- androidx.collection:collection:1.4.0 (*) +| | | | | | | | | \--- androidx.collection:collection:1.4.0 (c) +| | | | | | | | +--- androidx.compose.runtime:runtime:1.7.0-alpha04 (*) +| | | | | | | | +--- androidx.compose.ui:ui-geometry:1.7.0-alpha04 (*) +| | | | | | | | +--- androidx.compose.ui:ui-util:1.7.0-alpha04 (*) +| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | | | | | | +--- androidx.compose.ui:ui:1.7.0-alpha04 (c) +| | | | | | | | +--- androidx.compose.ui:ui-geometry:1.7.0-alpha04 (c) +| | | | | | | | +--- androidx.compose.ui:ui-graphics:1.7.0-alpha04 (c) +| | | | | | | | +--- androidx.compose.ui:ui-text:1.7.0-alpha04 (c) +| | | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-alpha04 (c) +| | | | | | | | \--- androidx.compose.ui:ui-util:1.7.0-alpha04 (c) +| | | | | | | +--- androidx.compose.ui:ui-util:1.7.0-alpha04 (*) +| | | | | | | +--- androidx.graphics:graphics-path:1.0.0-beta02 +| | | | | | | | +--- androidx.core:core:1.12.0 -> 1.13.1 (*) +| | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | | | | | +--- androidx.compose.ui:ui:1.7.0-alpha04 (c) +| | | | | | | +--- androidx.compose.ui:ui-geometry:1.7.0-alpha04 (c) +| | | | | | | +--- androidx.compose.ui:ui-text:1.7.0-alpha04 (c) +| | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-alpha04 (c) +| | | | | | | +--- androidx.compose.ui:ui-unit:1.7.0-alpha04 (c) +| | | | | | | \--- androidx.compose.ui:ui-util:1.7.0-alpha04 (c) +| | | | | | +--- androidx.compose.ui:ui-text:1.7.0-alpha04 +| | | | | | | \--- androidx.compose.ui:ui-text-android:1.7.0-alpha04 +| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | | | | +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| | | | | | | +--- androidx.collection:collection:1.4.0 (*) +| | | | | | | +--- androidx.compose.runtime:runtime:1.7.0-alpha04 (*) +| | | | | | | +--- androidx.compose.runtime:runtime-saveable:1.6.0 -> 1.7.0-alpha04 (*) +| | | | | | | +--- androidx.compose.ui:ui-graphics:1.7.0-alpha04 (*) +| | | | | | | +--- androidx.compose.ui:ui-unit:1.7.0-alpha04 (*) +| | | | | | | +--- androidx.compose.ui:ui-util:1.7.0-alpha04 (*) +| | | | | | | +--- androidx.core:core:1.7.0 -> 1.13.1 (*) +| | | | | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*) +| | | | | | | +--- androidx.compose.ui:ui:1.7.0-alpha04 (c) +| | | | | | | +--- androidx.compose.ui:ui-geometry:1.7.0-alpha04 (c) +| | | | | | | +--- androidx.compose.ui:ui-graphics:1.7.0-alpha04 (c) +| | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-alpha04 (c) +| | | | | | | +--- androidx.compose.ui:ui-unit:1.7.0-alpha04 (c) +| | | | | | | \--- androidx.compose.ui:ui-util:1.7.0-alpha04 (c) +| | | | | | +--- androidx.compose.ui:ui-unit:1.7.0-alpha04 (*) +| | | | | | +--- androidx.compose.ui:ui-util:1.7.0-alpha04 (*) +| | | | | | +--- androidx.core:core:1.12.0 -> 1.13.1 (*) +| | | | | | +--- androidx.customview:customview-poolingcontainer:1.0.0 (*) +| | | | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.4 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | | | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | | | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.1 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*) +| | | | | | +--- androidx.compose.ui:ui-geometry:1.7.0-alpha04 (c) +| | | | | | +--- androidx.compose.ui:ui-graphics:1.7.0-alpha04 (c) +| | | | | | +--- androidx.compose.ui:ui-text:1.7.0-alpha04 (c) +| | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-alpha04 (c) +| | | | | | +--- androidx.compose.ui:ui-unit:1.7.0-alpha04 (c) +| | | | | | +--- androidx.compose.ui:ui-util:1.7.0-alpha04 (c) +| | | | | | \--- androidx.compose.foundation:foundation:1.4.0 -> 1.7.0-alpha04 (c) +| | | | | +--- androidx.compose.ui:ui-graphics:1.7.0-alpha04 (*) +| | | | | +--- androidx.compose.ui:ui-unit:1.6.0 -> 1.7.0-alpha04 (*) +| | | | | +--- androidx.compose.ui:ui-util:1.7.0-alpha04 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*) +| | | | | +--- androidx.compose.animation:animation:1.7.0-alpha04 (c) +| | | | | \--- androidx.compose.animation:animation-graphics:1.7.0-alpha04 (c) +| | | | +--- androidx.compose.foundation:foundation-layout:1.6.0 -> 1.7.0-alpha04 +| | | | | \--- androidx.compose.foundation:foundation-layout-android:1.7.0-alpha04 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | | +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| | | | | +--- androidx.collection:collection:1.4.0 (*) +| | | | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.7.0-alpha04 (*) +| | | | | +--- androidx.compose.runtime:runtime:1.7.0-alpha04 (*) +| | | | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-alpha04 (*) +| | | | | +--- androidx.compose.ui:ui-unit:1.7.0-alpha04 (*) +| | | | | +--- androidx.compose.ui:ui-util:1.7.0-alpha04 (*) +| | | | | +--- androidx.core:core:1.7.0 -> 1.13.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | | | \--- androidx.compose.foundation:foundation:1.7.0-alpha04 (c) +| | | | +--- androidx.compose.runtime:runtime:1.7.0-alpha04 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-alpha04 (*) +| | | | +--- androidx.compose.ui:ui-geometry:1.6.0 -> 1.7.0-alpha04 (*) +| | | | +--- androidx.compose.ui:ui-util:1.7.0-alpha04 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | | +--- androidx.compose.animation:animation-core:1.7.0-alpha04 (c) +| | | | \--- androidx.compose.animation:animation-graphics:1.7.0-alpha04 (c) +| | | +--- androidx.compose.foundation:foundation-layout:1.7.0-alpha04 (*) +| | | +--- androidx.compose.runtime:runtime:1.7.0-alpha04 (*) +| | | +--- androidx.compose.ui:ui:1.7.0-alpha04 (*) +| | | +--- androidx.compose.ui:ui-text:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.core:core:1.12.0 -> 1.13.1 (*) +| | | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | \--- androidx.compose.foundation:foundation-layout:1.7.0-alpha04 (c) +| | +--- androidx.compose.foundation:foundation-layout -> 1.7.0-alpha04 (*) +| | +--- androidx.compose.material:material-icons-extended -> 1.7.0-alpha04 +| | | \--- androidx.compose.material:material-icons-extended-android:1.7.0-alpha04 +| | | +--- androidx.compose.material:material-icons-core:1.7.0-alpha04 +| | | | \--- androidx.compose.material:material-icons-core-android:1.7.0-alpha04 +| | | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-alpha04 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | | +--- androidx.compose.material:material:1.7.0-alpha04 (c) +| | | | +--- androidx.compose.material:material-icons-extended:1.7.0-alpha04 (c) +| | | | +--- androidx.compose.material:material-ripple:1.7.0-alpha04 (c) +| | | | \--- androidx.compose.material:material-navigation:1.7.0-alpha04 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | +--- androidx.compose.material:material:1.7.0-alpha04 (c) +| | | +--- androidx.compose.material:material-icons-core:1.7.0-alpha04 (c) +| | | +--- androidx.compose.material:material-ripple:1.7.0-alpha04 (c) +| | | \--- androidx.compose.material:material-navigation:1.7.0-alpha04 (c) +| | +--- androidx.compose.material3:material3 -> 1.2.1 +| | | \--- androidx.compose.material3:material3-android:1.2.1 +| | | +--- androidx.activity:activity-compose:1.5.0 -> 1.9.1 +| | | | +--- androidx.activity:activity-ktx:1.9.1 (*) +| | | | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.7.0-alpha04 (*) +| | | | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.7.0-alpha04 (*) +| | | | +--- androidx.compose.ui:ui:1.0.1 -> 1.7.0-alpha04 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | +--- androidx.activity:activity:1.9.1 (c) +| | | | \--- androidx.activity:activity-ktx:1.9.1 (c) +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| | | +--- androidx.collection:collection:1.4.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.foundation:foundation:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.material:material-icons-core:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.material:material-ripple:1.6.0 -> 1.7.0-alpha04 +| | | | \--- androidx.compose.material:material-ripple-android:1.7.0-alpha04 +| | | | +--- androidx.collection:collection:1.4.0 (*) +| | | | +--- androidx.compose.animation:animation:1.6.0 -> 1.7.0-alpha04 (*) +| | | | +--- androidx.compose.foundation:foundation:1.6.0 -> 1.7.0-alpha04 (*) +| | | | +--- androidx.compose.runtime:runtime:1.7.0-alpha04 (*) +| | | | +--- androidx.compose.ui:ui-util:1.6.0 -> 1.7.0-alpha04 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | | +--- androidx.compose.material:material:1.7.0-alpha04 (c) +| | | | +--- androidx.compose.material:material-icons-core:1.7.0-alpha04 (c) +| | | | +--- androidx.compose.material:material-icons-extended:1.7.0-alpha04 (c) +| | | | \--- androidx.compose.material:material-navigation:1.7.0-alpha04 (c) +| | | +--- androidx.compose.runtime:runtime:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.ui:ui-text:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 -> 2.8.4 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-service:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | \--- androidx.compose.material3:material3-window-size-class:1.2.1 (c) +| | +--- androidx.compose.runtime:runtime:1.6.8 -> 1.7.0-alpha04 (*) +| | +--- androidx.compose.ui:ui-util:1.6.8 -> 1.7.0-alpha04 (*) +| | +--- androidx.activity:activity-compose:1.9.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| | +--- androidx.compose:compose-bom:2024.06.00 (*) +| | +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| | \--- project :core:model (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- androidx.metrics:metrics-performance:1.0.0-beta01 +| | +--- androidx.collection:collection:1.1.0 -> 1.4.0 (*) +| | +--- androidx.core:core:1.5.0 -> 1.13.1 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| +--- project :core:analytics +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| | +--- androidx.compose:compose-bom:2024.06.00 (*) +| | +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| | +--- com.google.dagger:hilt-android:2.51.1 (*) +| | +--- androidx.compose.runtime:runtime:1.6.8 -> 1.7.0-alpha04 (*) +| | +--- com.google.firebase:firebase-bom:33.1.2 (*) +| | \--- com.google.firebase:firebase-analytics-ktx -> 22.0.2 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| +--- com.google.accompanist:accompanist-pager:0.34.0 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.1 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0 -> 1.7.0-alpha04 (*) +| | +--- dev.chrisbanes.snapper:snapper:0.2.2 -> 0.3.0 +| | | +--- androidx.compose.foundation:foundation:1.2.1 -> 1.7.0-alpha04 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.9.23 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.browser:browser:1.8.0 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| | +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| | +--- androidx.collection:collection:1.1.0 -> 1.4.0 (*) +| | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*) +| | +--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | +--- androidx.interpolator:interpolator:1.0.0 (*) +| | \--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| +--- io.coil-kt:coil:2.6.0 +| | +--- io.coil-kt:coil-base:2.6.0 +| | | +--- androidx.annotation:annotation:1.7.1 -> 1.8.0 (*) +| | | +--- androidx.appcompat:appcompat-resources:1.6.1 -> 1.7.0 (*) +| | | +--- androidx.collection:collection:1.4.0 (*) +| | | +--- androidx.core:core-ktx:1.12.0 -> 1.13.1 (*) +| | | +--- androidx.exifinterface:exifinterface:1.3.7 +| | | | \--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.7.0 -> 2.8.4 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.12.0 (*) +| | | \--- com.squareup.okio:okio:3.8.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| \--- io.coil-kt:coil-compose:2.6.0 +| +--- io.coil-kt:coil-compose-base:2.6.0 +| | +--- androidx.core:core-ktx:1.12.0 -> 1.13.1 (*) +| | +--- com.google.accompanist:accompanist-drawablepainter:0.32.0 +| | | +--- androidx.compose.ui:ui:1.5.0 -> 1.7.0-alpha04 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.1 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 -> 1.9.23 (*) +| | +--- io.coil-kt:coil-base:2.6.0 (*) +| | +--- androidx.compose.foundation:foundation:1.6.1 -> 1.7.0-alpha04 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- io.coil-kt:coil:2.6.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) ++--- project :core:designsystem (*) ++--- androidx.appcompat:appcompat:1.7.0 (*) ++--- androidx.core:core-ktx:1.13.1 (*) ++--- androidx.activity:activity-ktx:1.9.1 (*) ++--- androidx.fragment:fragment-ktx:1.6.2 +| +--- androidx.activity:activity-ktx:1.5.1 -> 1.9.1 (*) +| +--- androidx.collection:collection-ktx:1.1.0 -> 1.4.0 (*) +| +--- androidx.core:core-ktx:1.2.0 -> 1.13.1 (*) +| +--- androidx.fragment:fragment:1.6.2 (*) +| +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 -> 2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 -> 2.8.4 (*) +| +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.23 (*) +| \--- androidx.fragment:fragment:1.6.2 (c) ++--- androidx.swiperefreshlayout:swiperefreshlayout:1.1.0 +| +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| +--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| \--- androidx.interpolator:interpolator:1.0.0 (*) ++--- androidx.recyclerview:recyclerview:1.3.2 (*) ++--- project :feature:receipt +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | +--- org.jetbrains.compose.material:material:1.6.1 +| | | \--- androidx.compose.material:material:1.6.3 -> 1.7.0-alpha04 +| | | \--- androidx.compose.material:material-android:1.7.0-alpha04 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| | | +--- androidx.compose.animation:animation:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.animation:animation-core:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.animation:animation-core:1.7.0-alpha04 (*) +| | | +--- androidx.compose.foundation:foundation:1.7.0-alpha04 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.material:material-icons-core:1.7.0-alpha04 (*) +| | | +--- androidx.compose.material:material-ripple:1.7.0-alpha04 (*) +| | | +--- androidx.compose.runtime:runtime:1.7.0-alpha04 (*) +| | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.ui:ui-text:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | +--- androidx.compose.material:material-icons-core:1.7.0-alpha04 (c) +| | | +--- androidx.compose.material:material-icons-extended:1.7.0-alpha04 (c) +| | | +--- androidx.compose.material:material-ripple:1.7.0-alpha04 (c) +| | | \--- androidx.compose.material:material-navigation:1.7.0-alpha04 (c) +| | \--- org.jetbrains.compose.material3:material3:1.6.1 +| | \--- androidx.compose.material3:material3:1.2.1 (*) +| +--- project :desktop +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| | +--- project :shared (*) +| | \--- org.jetbrains.compose.desktop:desktop-jvm-windows-x64:1.6.1 +| | +--- org.jetbrains.compose.desktop:desktop:1.6.1 +| | | \--- org.jetbrains.compose.desktop:desktop-jvm:1.6.1 +| | | +--- org.jetbrains.compose.foundation:foundation:1.6.1 +| | | | \--- androidx.compose.foundation:foundation:1.6.3 -> 1.7.0-alpha04 (*) +| | | +--- org.jetbrains.compose.material:material:1.6.1 (*) +| | | +--- org.jetbrains.compose.runtime:runtime:1.6.1 +| | | | \--- androidx.compose.runtime:runtime:1.6.3 -> 1.7.0-alpha04 (*) +| | | +--- org.jetbrains.compose.ui:ui:1.6.1 +| | | | \--- androidx.compose.ui:ui:1.6.3 -> 1.7.0-alpha04 (*) +| | | +--- org.jetbrains.compose.ui:ui-tooling-preview:1.6.1 +| | | | \--- androidx.compose.ui:ui-tooling-preview:1.6.3 -> 1.7.0-alpha04 (*) +| | | +--- org.jetbrains.compose.ui:ui-util:1.6.1 +| | | | \--- androidx.compose.ui:ui-util:1.6.3 -> 1.7.0-alpha04 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.23 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.23 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.8.1 (*) +| | \--- org.jetbrains.skiko:skiko-awt-runtime-windows-x64:0.7.97 +| | \--- org.jetbrains.skiko:skiko-awt:0.7.97 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 1.9.23 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0 -> 1.8.1 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.8.1 (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 +| | +--- androidx.compose.material:material:1.7.0-alpha04 (*) +| | +--- androidx.navigation:navigation-compose:2.7.7 +| | | +--- androidx.activity:activity-compose:1.7.0 -> 1.9.1 (*) +| | | +--- androidx.compose.animation:animation:1.5.1 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.5.1 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.runtime:runtime:1.5.1 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.runtime:runtime-saveable:1.5.1 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.ui:ui:1.5.1 -> 1.7.0-alpha04 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2 -> 2.8.4 +| | | | \--- androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.4 +| | | | +--- androidx.annotation:annotation:1.8.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.6.0 -> 1.7.0-alpha04 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-alpha04 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-service:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| | | +--- androidx.navigation:navigation-runtime-ktx:2.7.7 +| | | | +--- androidx.navigation:navigation-common-ktx:2.7.7 +| | | | | +--- androidx.navigation:navigation-common:2.7.7 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | | | | +--- androidx.collection:collection-ktx:1.1.0 -> 1.4.0 (*) +| | | | | | +--- androidx.core:core-ktx:1.1.0 -> 1.13.1 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.2 -> 2.8.4 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 -> 2.8.4 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 -> 2.8.4 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2 -> 2.8.4 (*) +| | | | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | | | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | | +--- androidx.navigation:navigation-common-ktx:2.7.7 (c) +| | | | | | +--- androidx.navigation:navigation-compose:2.7.7 (c) +| | | | | | +--- androidx.navigation:navigation-runtime:2.7.7 (c) +| | | | | | \--- androidx.navigation:navigation-runtime-ktx:2.7.7 (c) +| | | | | +--- androidx.navigation:navigation-common:2.7.7 (c) +| | | | | +--- androidx.navigation:navigation-compose:2.7.7 (c) +| | | | | +--- androidx.navigation:navigation-runtime:2.7.7 (c) +| | | | | \--- androidx.navigation:navigation-runtime-ktx:2.7.7 (c) +| | | | +--- androidx.navigation:navigation-runtime:2.7.7 +| | | | | +--- androidx.activity:activity-ktx:1.7.1 -> 1.9.1 (*) +| | | | | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.4.0 (*) +| | | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 -> 2.8.4 (*) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 -> 2.8.4 (*) +| | | | | +--- androidx.navigation:navigation-common:2.7.7 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | | | +--- androidx.navigation:navigation-common:2.7.7 (c) +| | | | | +--- androidx.navigation:navigation-common-ktx:2.7.7 (c) +| | | | | +--- androidx.navigation:navigation-compose:2.7.7 (c) +| | | | | \--- androidx.navigation:navigation-runtime-ktx:2.7.7 (c) +| | | | +--- androidx.navigation:navigation-common-ktx:2.7.7 (c) +| | | | +--- androidx.navigation:navigation-compose:2.7.7 (c) +| | | | +--- androidx.navigation:navigation-runtime:2.7.7 (c) +| | | | \--- androidx.navigation:navigation-common:2.7.7 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | +--- androidx.navigation:navigation-runtime-ktx:2.7.7 (c) +| | | +--- androidx.navigation:navigation-runtime:2.7.7 (c) +| | | +--- androidx.navigation:navigation-common-ktx:2.7.7 (c) +| | | \--- androidx.navigation:navigation-common:2.7.7 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | +--- androidx.compose.material:material:1.7.0-alpha04 (c) +| | +--- androidx.compose.material:material-icons-extended:1.7.0-alpha04 (c) +| | +--- androidx.compose.material:material-icons-core:1.7.0-alpha04 (c) +| | \--- androidx.compose.material:material-ripple:1.7.0-alpha04 (c) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.7.0-alpha04 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.7.0-alpha04 (*) +| | +--- androidx.hilt:hilt-navigation:1.2.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | +--- androidx.navigation:navigation-runtime:2.5.1 -> 2.7.7 (*) +| | | +--- com.google.dagger:hilt-android:2.49 -> 2.51.1 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 -> 2.8.4 (*) +| | +--- androidx.navigation:navigation-compose:2.5.1 -> 2.7.7 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 +| | \--- androidx.lifecycle:lifecycle-runtime-compose-android:2.8.4 +| | +--- androidx.annotation:annotation:1.8.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.5 -> 1.7.0-alpha04 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-livedata:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 (c) +| | \--- androidx.lifecycle:lifecycle-common-java8:2.8.4 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| +--- com.squareup.okhttp3:okhttp:4.12.0 (*) +| \--- project :core:data (*) ++--- project :feature:profile +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| +--- project :core:data (*) +| +--- com.github.jump-sdk:jetpack_compose_country_code_picker_emoji:2.2.8 +| | +--- androidx.core:core-ktx:1.12.0 -> 1.13.1 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.7.0 -> 2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0 -> 2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0 -> 2.8.4 (*) +| | +--- androidx.activity:activity-compose:1.8.2 -> 1.9.1 (*) +| | +--- androidx.compose.material:material:1.6.0 -> 1.7.0-alpha04 (*) +| | +--- androidx.compose.ui:ui-tooling-preview:1.6.0 -> 1.7.0-alpha04 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 +| | | \--- org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.7 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 1.9.23 (*) +| | +--- io.michaelrocks:libphonenumber-android:8.13.28 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.compose.material:material:1.6.0 -> 1.7.0-alpha04 (*) +| \--- io.coil-kt:coil-compose:2.6.0 (*) ++--- project :feature:auth +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| +--- project :core:data (*) +| +--- com.github.jump-sdk:jetpack_compose_country_code_picker_emoji:2.2.8 (*) +| +--- androidx.compose.material:material:1.6.0 -> 1.7.0-alpha04 (*) +| +--- androidx.credentials:credentials:1.2.2 -> 1.3.0-beta01 +| | +--- androidx.annotation:annotation:1.5.0 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*) +| | \--- androidx.credentials:credentials-play-services-auth:1.3.0-beta01 (c) +| +--- androidx.credentials:credentials-play-services-auth:1.2.2 -> 1.3.0-beta01 +| | +--- androidx.credentials:credentials:1.3.0-beta01 (*) +| | +--- com.google.android.gms:play-services-auth:21.1.1 -> 21.2.0 +| | | +--- androidx.fragment:fragment:1.5.7 -> 1.6.2 (*) +| | | +--- androidx.loader:loader:1.1.0 (*) +| | | +--- com.google.android.gms:play-services-auth-api-phone:18.0.2 +| | | | +--- com.google.android.gms:play-services-base:18.0.1 -> 18.3.0 (*) +| | | | +--- com.google.android.gms:play-services-basement:18.0.2 -> 18.4.0 (*) +| | | | \--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | | +--- com.google.android.gms:play-services-auth-base:18.0.10 +| | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*) +| | | | +--- com.google.android.gms:play-services-base:18.0.1 -> 18.3.0 (*) +| | | | +--- com.google.android.gms:play-services-basement:18.2.0 -> 18.4.0 (*) +| | | | \--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | | +--- com.google.android.gms:play-services-base:18.3.0 (*) +| | | +--- com.google.android.gms:play-services-basement:18.3.0 -> 18.4.0 (*) +| | | +--- com.google.android.gms:play-services-fido:20.0.1 -> 21.0.0 +| | | | +--- com.google.android.gms:play-services-base:18.3.0 (*) +| | | | +--- com.google.android.gms:play-services-basement:18.3.0 -> 18.4.0 (*) +| | | | +--- com.google.android.gms:play-services-tasks:18.1.0 -> 18.2.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0 -> 1.9.23 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.1 (*) +| | | \--- com.google.android.gms:play-services-tasks:18.1.0 -> 18.2.0 (*) +| | +--- com.google.android.gms:play-services-fido:21.0.0 (*) +| | +--- com.google.android.libraries.identity.googleid:googleid:1.1.0 -> 1.1.1 +| | | +--- androidx.credentials:credentials:1.3.0-beta01 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.0 -> 1.9.23 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 -> 1.9.23 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | \--- androidx.credentials:credentials:1.3.0-beta01 (c) +| +--- com.google.android.libraries.identity.googleid:googleid:1.1.1 (*) +| \--- com.google.android.gms:play-services-auth:21.2.0 (*) ++--- project :feature:passcode +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| \--- androidx.core:core-ktx:1.13.1 (*) ++--- project :feature:make-transfer +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| \--- project :core:data (*) ++--- project :feature:faq +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| \--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) ++--- project :feature:editpassword +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| \--- project :core:data (*) ++--- project :feature:notification +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| +--- project :core:data (*) +| +--- androidx.appcompat:appcompat:1.7.0 (*) +| \--- androidx.compose.material:material:1.6.0 -> 1.7.0-alpha04 (*) ++--- project :feature:request-money +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| +--- project :core:data (*) +| +--- com.google.zxing:core:3.5.3 +| \--- io.coil-kt:coil-compose:2.6.0 (*) ++--- project :feature:upi-setup +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| \--- project :core:data (*) ++--- project :feature:settings +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| \--- project :core:data (*) ++--- project :feature:savedcards +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| \--- project :core:data (*) ++--- project :feature:qr +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| +--- com.google.zxing:core:3.5.3 +| +--- project :core:data (*) +| +--- androidx.camera:camera-view:1.3.4 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.1 -> 1.4.0 (*) +| | +--- androidx.appcompat:appcompat:1.1.0 -> 1.7.0 (*) +| | +--- androidx.camera:camera-core:1.3.4 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| | | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.4.0 (*) +| | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | | +--- androidx.exifinterface:exifinterface:1.3.2 -> 1.3.7 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.1.0 -> 2.8.4 (*) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.1.0 -> 2.8.4 (*) +| | | +--- com.google.auto.value:auto-value-annotations:1.6.3 +| | | +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | | +--- androidx.camera:camera-lifecycle:1.3.4 (c) +| | | +--- androidx.camera:camera-video:1.3.4 (c) +| | | \--- androidx.camera:camera-view:1.3.4 (c) +| | +--- androidx.camera:camera-lifecycle:1.3.4 +| | | +--- androidx.camera:camera-core:1.3.4 (*) +| | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.1.0 -> 2.8.4 (*) +| | | +--- com.google.auto.value:auto-value-annotations:1.6.3 +| | | +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | | +--- androidx.camera:camera-core:1.3.4 (c) +| | | +--- androidx.camera:camera-video:1.3.4 (c) +| | | \--- androidx.camera:camera-view:1.3.4 (c) +| | +--- androidx.camera:camera-video:1.3.4 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| | | +--- androidx.camera:camera-core:1.3.4 (*) +| | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | | +--- com.google.auto.value:auto-value-annotations:1.6.3 +| | | +--- androidx.camera:camera-core:1.3.4 (c) +| | | +--- androidx.camera:camera-lifecycle:1.3.4 (c) +| | | \--- androidx.camera:camera-view:1.3.4 (c) +| | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*) +| | +--- androidx.core:core:1.3.2 -> 1.13.1 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.0.0 -> 2.8.4 (*) +| | +--- com.google.auto.value:auto-value-annotations:1.6.3 +| | +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | +--- androidx.camera:camera-core:1.3.4 (c) +| | +--- androidx.camera:camera-lifecycle:1.3.4 (c) +| | \--- androidx.camera:camera-video:1.3.4 (c) +| +--- androidx.camera:camera-lifecycle:1.3.4 (*) +| \--- com.google.guava:guava:27.0.1-android -> 31.1-android (*) ++--- project :feature:invoices +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| \--- project :core:data (*) ++--- project :feature:merchants +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| +--- project :core:data (*) +| \--- androidx.compose.material:material:1.6.0 -> 1.7.0-alpha04 (*) ++--- project :feature:history +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| \--- project :core:data (*) ++--- project :feature:kyc +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| +--- project :core:data (*) +| +--- androidx.compose.material:material:1.6.0 -> 1.7.0-alpha04 (*) +| +--- com.maxkeppeler.sheets-compose-dialogs:core:1.3.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.10 -> 1.9.23 (*) +| | +--- androidx.core:core-ktx:1.9.0 -> 1.13.1 (*) +| | +--- androidx.compose:compose-bom:2024.02.00 -> 2024.06.00 (*) +| | +--- androidx.compose.ui:ui -> 1.7.0-alpha04 (*) +| | +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| | +--- androidx.compose.animation:animation -> 1.7.0-alpha04 (*) +| | +--- androidx.compose.animation:animation-graphics -> 1.7.0-alpha04 +| | | \--- androidx.compose.animation:animation-graphics-android:1.7.0-alpha04 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| | | +--- androidx.collection:collection:1.4.0 (*) +| | | +--- androidx.compose.animation:animation:1.7.0-alpha04 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.runtime:runtime:1.7.0-alpha04 (*) +| | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.6.0 -> 1.7.0-alpha04 (*) +| | | +--- androidx.compose.ui:ui-util:1.7.0-alpha04 (*) +| | | +--- androidx.core:core-ktx:1.5.0 -> 1.13.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| | | +--- androidx.compose.animation:animation:1.7.0-alpha04 (c) +| | | \--- androidx.compose.animation:animation-core:1.7.0-alpha04 (c) +| | +--- androidx.compose.runtime:runtime -> 1.7.0-alpha04 (*) +| | \--- androidx.compose.material3:material3 -> 1.2.1 (*) +| +--- com.maxkeppeler.sheets-compose-dialogs:calendar:1.3.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.10 -> 1.9.23 (*) +| | +--- androidx.core:core-ktx:1.9.0 -> 1.13.1 (*) +| | +--- androidx.compose:compose-bom:2024.02.00 -> 2024.06.00 (*) +| | +--- androidx.compose.ui:ui -> 1.7.0-alpha04 (*) +| | +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| | +--- androidx.compose.animation:animation -> 1.7.0-alpha04 (*) +| | +--- androidx.compose.animation:animation-graphics -> 1.7.0-alpha04 (*) +| | +--- androidx.compose.runtime:runtime -> 1.7.0-alpha04 (*) +| | +--- androidx.compose.material3:material3 -> 1.2.1 (*) +| | +--- dev.chrisbanes.snapper:snapper:0.3.0 (*) +| | \--- com.maxkeppeler.sheets-compose-dialogs:core:1.3.0 (*) +| +--- com.github.jump-sdk:jetpack_compose_country_code_picker_emoji:2.2.8 (*) +| \--- com.squareup.okhttp3:okhttp:4.12.0 (*) ++--- project :feature:home +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| \--- project :core:data (*) ++--- project :feature:accounts +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| +--- project :core:data (*) +| +--- androidx.compose.material:material:1.6.0 -> 1.7.0-alpha04 (*) +| \--- project :feature:upi-setup (*) ++--- project :feature:finance +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| \--- com.google.accompanist:accompanist-pager:0.34.0 (*) ++--- project :feature:payments +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| +--- project :core:data (*) +| \--- com.google.accompanist:accompanist-pager:0.34.0 (*) ++--- project :feature:send-money +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| +--- project :core:data (*) +| +--- androidx.compose.material:material:1.6.0 -> 1.7.0-alpha04 (*) +| +--- com.github.jump-sdk:jetpack_compose_country_code_picker_emoji:2.2.8 (*) +| \--- com.google.android.gms:play-services-code-scanner:16.1.0 +| +--- androidx.activity:activity:1.3.1 -> 1.9.1 (*) +| +--- com.google.android.datatransport:transport-api:2.2.1 -> 3.2.0 (*) +| +--- com.google.android.datatransport:transport-backend-cct:2.3.3 -> 3.3.0 (*) +| +--- com.google.android.datatransport:transport-runtime:2.2.6 -> 3.3.0 (*) +| +--- com.google.android.gms:play-services-base:18.1.0 -> 18.3.0 (*) +| +--- com.google.android.gms:play-services-basement:18.1.0 -> 18.4.0 (*) +| +--- com.google.android.gms:play-services-tasks:18.0.2 -> 18.2.0 (*) +| +--- com.google.firebase:firebase-components:16.1.0 -> 18.0.0 (*) +| +--- com.google.firebase:firebase-encoders:16.1.0 -> 17.0.0 (*) +| +--- com.google.firebase:firebase-encoders-json:17.1.0 -> 18.0.1 (*) +| +--- com.google.mlkit:barcode-scanning-common:17.0.0 +| | +--- com.google.android.gms:play-services-basement:18.0.0 -> 18.4.0 (*) +| | \--- com.google.mlkit:vision-common:17.0.0 +| | +--- androidx.exifinterface:exifinterface:1.0.0 -> 1.3.7 (*) +| | +--- com.google.android.datatransport:transport-api:2.2.1 -> 3.2.0 (*) +| | +--- com.google.android.datatransport:transport-backend-cct:2.3.3 -> 3.3.0 (*) +| | +--- com.google.android.datatransport:transport-runtime:2.2.6 -> 3.3.0 (*) +| | +--- com.google.android.gms:play-services-base:18.0.1 -> 18.3.0 (*) +| | +--- com.google.android.gms:play-services-basement:18.0.0 -> 18.4.0 (*) +| | +--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | +--- com.google.android.odml:image:1.0.0-beta1 +| | +--- com.google.firebase:firebase-components:16.1.0 -> 18.0.0 (*) +| | +--- com.google.firebase:firebase-encoders:16.1.0 -> 17.0.0 (*) +| | +--- com.google.firebase:firebase-encoders-json:17.1.0 -> 18.0.1 (*) +| | \--- com.google.mlkit:common:18.0.0 -> 18.9.0 +| | +--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | +--- com.google.android.datatransport:transport-api:2.2.1 -> 3.2.0 (*) +| | +--- com.google.android.datatransport:transport-backend-cct:2.3.3 -> 3.3.0 (*) +| | +--- com.google.android.datatransport:transport-runtime:2.2.6 -> 3.3.0 (*) +| | +--- com.google.android.gms:play-services-base:18.1.0 -> 18.3.0 (*) +| | +--- com.google.android.gms:play-services-basement:18.1.0 -> 18.4.0 (*) +| | +--- com.google.android.gms:play-services-tasks:18.0.2 -> 18.2.0 (*) +| | +--- com.google.firebase:firebase-components:16.1.0 -> 18.0.0 (*) +| | +--- com.google.firebase:firebase-encoders:16.1.0 -> 17.0.0 (*) +| | \--- com.google.firebase:firebase-encoders-json:17.1.0 -> 18.0.1 (*) +| \--- com.google.mlkit:common:18.9.0 (*) ++--- project :feature:standing-instruction +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 1.9.23 (*) +| +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) +| +--- com.google.dagger:hilt-android:2.51.1 (*) +| +--- project :core:ui (*) +| +--- project :core:designsystem (*) +| +--- project :shared (*) +| +--- project :desktop (*) +| +--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.06.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-alpha04 (*) +| +--- project :core:data (*) +| \--- com.google.android.gms:play-services-code-scanner:16.1.0 (*) ++--- androidx.activity:activity-compose:1.9.1 (*) ++--- androidx.compose.material3.adaptive:adaptive:1.0.0-alpha08 +| \--- androidx.compose.material3.adaptive:adaptive-android:1.0.0-alpha08 +| +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| +--- androidx.compose.foundation:foundation:1.6.0 -> 1.7.0-alpha04 (*) +| +--- androidx.compose.ui:ui-util:1.6.0 -> 1.7.0-alpha04 (*) +| +--- androidx.window:window:1.2.0 -> 1.3.0-alpha02 +| | +--- androidx.annotation:annotation:1.3.0 -> 1.8.0 (*) +| | +--- androidx.collection:collection:1.1.0 -> 1.4.0 (*) +| | +--- androidx.core:core:1.8.0 -> 1.13.1 (*) +| | +--- androidx.window.extensions.core:core:1.0.0 +| | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.23 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.1 (*) +| | \--- androidx.window:window-core:1.3.0-alpha02 (c) +| +--- androidx.window:window-core:1.3.0-alpha02 +| | \--- androidx.window:window-core-android:1.3.0-alpha02 +| | +--- androidx.annotation:annotation:1.7.0 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| | \--- androidx.window:window:1.3.0-alpha02 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| +--- androidx.compose.material3.adaptive:adaptive-layout:1.0.0-alpha08 (c) +| \--- androidx.compose.material3.adaptive:adaptive-navigation:1.0.0-alpha08 (c) ++--- androidx.compose.material3.adaptive:adaptive-layout:1.0.0-alpha08 +| \--- androidx.compose.material3.adaptive:adaptive-layout-android:1.0.0-alpha08 +| +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| +--- androidx.compose.foundation:foundation:1.6.0-rc01 -> 1.7.0-alpha04 (*) +| +--- androidx.compose.foundation:foundation-layout:1.6.0-rc01 -> 1.7.0-alpha04 (*) +| +--- androidx.compose.material3.adaptive:adaptive:1.0.0-alpha08 (*) +| +--- androidx.compose.ui:ui-util:1.6.0-rc01 -> 1.7.0-alpha04 (*) +| +--- androidx.window:window-core:1.3.0-alpha02 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| +--- androidx.compose.material3.adaptive:adaptive:1.0.0-alpha08 (c) +| \--- androidx.compose.material3.adaptive:adaptive-navigation:1.0.0-alpha08 (c) ++--- androidx.compose.material3.adaptive:adaptive-navigation:1.0.0-alpha08 +| \--- androidx.compose.material3.adaptive:adaptive-navigation-android:1.0.0-alpha08 +| +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*) +| +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| +--- androidx.compose.foundation:foundation:1.6.0-rc01 -> 1.7.0-alpha04 (*) +| +--- androidx.compose.foundation:foundation-layout:1.6.0-rc01 -> 1.7.0-alpha04 (*) +| +--- androidx.compose.material3.adaptive:adaptive-layout:1.0.0-alpha08 (*) +| +--- androidx.compose.ui:ui-util:1.6.0-rc01 -> 1.7.0-alpha04 (*) +| +--- androidx.window:window-core:1.3.0-alpha02 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| +--- androidx.compose.material3.adaptive:adaptive:1.0.0-alpha08 (c) +| \--- androidx.compose.material3.adaptive:adaptive-layout:1.0.0-alpha08 (c) ++--- androidx.compose.material3:material3-window-size-class -> 1.2.1 +| \--- androidx.compose.material3:material3-window-size-class-android:1.2.1 +| +--- androidx.annotation:annotation-experimental:1.4.0 (*) +| +--- androidx.compose.runtime:runtime:1.6.0 -> 1.7.0-alpha04 (*) +| +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-alpha04 (*) +| +--- androidx.compose.ui:ui-unit:1.6.0 -> 1.7.0-alpha04 (*) +| +--- androidx.compose.ui:ui-util:1.6.0 -> 1.7.0-alpha04 (*) +| +--- androidx.window:window:1.0.0 -> 1.3.0-alpha02 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.23 (*) +| \--- androidx.compose.material3:material3:1.2.1 (c) ++--- androidx.compose.runtime:runtime-tracing:1.0.0-beta01 +| +--- androidx.annotation:annotation:1.3.0 -> 1.8.0 (*) +| +--- androidx.compose.runtime:runtime:1.3.3 -> 1.7.0-alpha04 (*) +| +--- androidx.startup:startup-runtime:1.1.1 (*) +| +--- androidx.tracing:tracing-perfetto:1.0.0 +| | +--- androidx.annotation:annotation:1.3.0 -> 1.8.0 (*) +| | +--- androidx.startup:startup-runtime:1.1.1 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.23 (*) ++--- androidx.core:core-splashscreen:1.0.1 +| +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.23 (*) ++--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) ++--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) ++--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) ++--- androidx.navigation:navigation-compose:2.7.7 (*) ++--- androidx.profileinstaller:profileinstaller:1.3.1 (*) ++--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.8.1 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1 (*) +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.1 (*) +| +--- com.google.guava:guava:31.0.1-jre -> 31.1-android (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 1.9.23 (*) ++--- io.coil-kt:coil:2.6.0 (*) ++--- androidx.compose.material:material-navigation:1.7.0-alpha04 (*) ++--- com.google.accompanist:accompanist-pager:0.34.0 (*) ++--- com.google.android.gms:play-services-code-scanner:16.1.0 (*) ++--- com.maxkeppeler.sheets-compose-dialogs:core:1.3.0 (*) ++--- com.maxkeppeler.sheets-compose-dialogs:calendar:1.3.0 (*) ++--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 (*) ++--- androidx.lifecycle:lifecycle-extensions:2.2.0 +| +--- androidx.lifecycle:lifecycle-runtime:2.2.0 -> 2.8.4 (*) +| +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| +--- androidx.arch.core:core-runtime:2.1.0 -> 2.2.0 (*) +| +--- androidx.fragment:fragment:1.2.0 -> 1.6.2 (*) +| +--- androidx.lifecycle:lifecycle-common:2.2.0 -> 2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-livedata:2.2.0 -> 2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-process:2.2.0 -> 2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-service:2.2.0 -> 2.8.4 (*) +| \--- androidx.lifecycle:lifecycle-viewmodel:2.2.0 -> 2.8.4 (*) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1 (*) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1 (*) +\--- androidx.compose.runtime:runtime:1.6.8 -> 1.7.0-alpha04 (*) diff --git a/mifospay/dependencies/prodReleaseRuntimeClasspath.txt b/mifospay/dependencies/prodReleaseRuntimeClasspath.txt index 730d11403..4fc05ac36 100644 --- a/mifospay/dependencies/prodReleaseRuntimeClasspath.txt +++ b/mifospay/dependencies/prodReleaseRuntimeClasspath.txt @@ -1,3 +1,37 @@ +:core:analytics +:core:common +:core:data +:core:datastore +:core:datastore-proto +:core:designsystem +:core:model +:core:network +:core:ui +:desktop +:feature:accounts +:feature:auth +:feature:editpassword +:feature:faq +:feature:finance +:feature:history +:feature:home +:feature:invoices +:feature:kyc +:feature:make-transfer +:feature:merchants +:feature:notification +:feature:passcode +:feature:payments +:feature:profile +:feature:qr +:feature:receipt +:feature:request-money +:feature:savedcards +:feature:send-money +:feature:settings +:feature:standing-instruction +:feature:upi-setup +:shared androidx.activity:activity-compose:1.9.1 androidx.activity:activity-ktx:1.9.1 androidx.activity:activity:1.9.1 @@ -8,7 +42,6 @@ androidx.appcompat:appcompat-resources:1.7.0 androidx.appcompat:appcompat:1.7.0 androidx.arch.core:core-common:2.2.0 androidx.arch.core:core-runtime:2.2.0 -androidx.asynclayoutinflater:asynclayoutinflater:1.0.0 androidx.autofill:autofill:1.0.0 androidx.browser:browser:1.8.0 androidx.camera:camera-core:1.3.4 @@ -107,9 +140,7 @@ androidx.graphics:graphics-path:1.0.0-beta02 androidx.hilt:hilt-navigation-compose:1.2.0 androidx.hilt:hilt-navigation:1.2.0 androidx.interpolator:interpolator:1.0.0 -androidx.legacy:legacy-support-core-ui:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 -androidx.legacy:legacy-support-v4:1.0.0 androidx.lifecycle:lifecycle-common-java8:2.8.4 androidx.lifecycle:lifecycle-common-jvm:2.8.4 androidx.lifecycle:lifecycle-common:2.8.4 @@ -133,7 +164,6 @@ androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 androidx.lifecycle:lifecycle-viewmodel:2.8.4 androidx.loader:loader:1.1.0 androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 -androidx.media:media:1.0.0 androidx.metrics:metrics-performance:1.0.0-beta01 androidx.navigation:navigation-common-ktx:2.7.7 androidx.navigation:navigation-common:2.7.7 @@ -148,7 +178,6 @@ androidx.recyclerview:recyclerview:1.3.2 androidx.resourceinspection:resourceinspection-annotation:1.0.1 androidx.savedstate:savedstate-ktx:1.2.1 androidx.savedstate:savedstate:1.2.1 -androidx.slidingpanelayout:slidingpanelayout:1.0.0 androidx.startup:startup-runtime:1.1.1 androidx.swiperefreshlayout:swiperefreshlayout:1.1.0 androidx.tracing:tracing-ktx:1.3.0-alpha02 @@ -233,11 +262,10 @@ com.google.mlkit:common:18.9.0 com.google.mlkit:vision-common:17.0.0 com.google.protobuf:protobuf-javalite:3.25.2 com.google.protobuf:protobuf-kotlin-lite:3.25.2 -com.google.zxing:core:3.3.3 +com.google.zxing:core:3.5.3 com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0 com.maxkeppeler.sheets-compose-dialogs:calendar:1.3.0 com.maxkeppeler.sheets-compose-dialogs:core:1.3.0 -com.mifos.mobile:mifos-passcode:0.3.0 com.squareup.okhttp3:logging-interceptor:4.12.0 com.squareup.okhttp3:okhttp:4.12.0 com.squareup.okio:okio-jvm:3.8.0 @@ -254,8 +282,6 @@ io.michaelrocks:libphonenumber-android:8.13.28 io.reactivex:rxandroid:1.1.0 io.reactivex:rxjava:1.3.8 javax.inject:javax.inject:1 -me.dm7.barcodescanner:core:1.9.13 -me.dm7.barcodescanner:zxing:1.9.13 org.checkerframework:checker-qual:3.12.0 org.jetbrains.compose.desktop:desktop-jvm-windows-x64:1.6.1 org.jetbrains.compose.desktop:desktop-jvm:1.6.1 diff --git a/mifospay/prodRelease-badging.txt b/mifospay/prodRelease-badging.txt index 206563104..f11f488a2 100644 --- a/mifospay/prodRelease-badging.txt +++ b/mifospay/prodRelease-badging.txt @@ -7,6 +7,7 @@ uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.READ_CONTACTS' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' +uses-permission: name='android.permission.VIBRATE' uses-permission: name='android.permission.POST_NOTIFICATIONS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='com.google.android.c2dm.permission.RECEIVE' @@ -123,7 +124,7 @@ application-icon-480:'res/mipmap/ic_launcher.png' application-icon-640:'res/mipmap/ic_launcher.png' application-icon-65534:'res/mipmap/ic_launcher.png' application: label='Mifos Pay' icon='res/mipmap/ic_launcher.png' -launchable-activity: name='org.mifospay.SplashScreenActivity' label='' icon='' +launchable-activity: name='org.mifospay.MainActivity' label='' icon='' property: name='android.adservices.AD_SERVICES_CONFIG' resource='res/xml/ga_ad_services_config.xml' uses-library-not-required:'androidx.window.extensions' uses-library-not-required:'androidx.window.sidecar' @@ -142,4 +143,4 @@ supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'de-DE' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'eo' 'es' 'es-419' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'ga' 'gd' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'in-ID' 'is' 'it' 'it-IT' 'iw' 'ja' 'jv' 'ka' 'kk' 'km' 'kn' 'ko' 'ku' 'ky' 'lb' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'no' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'ru-RU' 'si' 'sk' 'sl' 'so' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'tr-TR' 'uk' 'ur' 'uz' 'vi' 'zh' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '120' '160' '240' '320' '480' '640' '65534' -native-code: 'arm64-v8a' 'armeabi' 'armeabi-v7a' 'mips' 'mips64' 'x86' 'x86_64' +native-code: 'arm64-v8a' 'armeabi-v7a' 'x86' 'x86_64' diff --git a/mifospay/src/main/AndroidManifest.xml b/mifospay/src/main/AndroidManifest.xml index 8384b76be..e566beb8a 100644 --- a/mifospay/src/main/AndroidManifest.xml +++ b/mifospay/src/main/AndroidManifest.xml @@ -37,34 +37,32 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/AppTheme"> - - + android:theme="@style/Theme.MifosSplash"> + android:theme="@style/Theme.MifosSplash" + android:windowSoftInputMode="adjustPan"> - - + + + + + - - @@ -99,13 +93,6 @@ - - \ No newline at end of file diff --git a/mifospay/src/main/java/org/mifospay/MainActivity.kt b/mifospay/src/main/java/org/mifospay/MainActivity.kt index e22024333..8416a5d33 100644 --- a/mifospay/src/main/java/org/mifospay/MainActivity.kt +++ b/mifospay/src/main/java/org/mifospay/MainActivity.kt @@ -14,7 +14,6 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels -import androidx.compose.material.navigation.rememberBottomSheetNavigator import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass import androidx.compose.runtime.CompositionLocalProvider @@ -40,13 +39,14 @@ import org.mifospay.core.data.util.NetworkMonitor import org.mifospay.core.data.util.TimeZoneMonitor import org.mifospay.core.designsystem.theme.MifosTheme import org.mifospay.core.ui.LocalTimeZone -import org.mifospay.ui.MifosApp +import org.mifospay.navigation.MifosNavGraph.LOGIN_GRAPH +import org.mifospay.navigation.MifosNavGraph.PASSCODE_GRAPH +import org.mifospay.navigation.RootNavGraph import org.mifospay.ui.rememberMifosAppState import javax.inject.Inject @OptIn(ExperimentalMaterial3WindowSizeClassApi::class) @AndroidEntryPoint -@Suppress("UnusedPrivateProperty") class MainActivity : ComponentActivity() { /** @@ -64,7 +64,7 @@ class MainActivity : ComponentActivity() { @Inject lateinit var analyticsHelper: AnalyticsHelper - val viewModel: MainActivityViewModel by viewModels() + private val viewModel: MainActivityViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { val splashScreen = installSplashScreen() @@ -81,9 +81,6 @@ class MainActivity : ComponentActivity() { } } - // Keep the splash screen on-screen until the UI state is loaded. This condition is - // evaluated each time the app needs to be redrawn so it should be fast to avoid blocking - // the UI. splashScreen.setKeepOnScreenCondition { when (uiState) { Loading -> true @@ -91,29 +88,47 @@ class MainActivity : ComponentActivity() { } } - // Turn off the decor fitting system windows, which allows us to handle insets, - // including IME animations, and go edge-to-edge - // This also sets up the initial system bar style based on the platform theme enableEdgeToEdge() setContent { - val bottomSheetNavigator = rememberBottomSheetNavigator() - val navController = rememberNavController(bottomSheetNavigator) + val navController = rememberNavController() + val appState = rememberMifosAppState( windowSizeClass = calculateWindowSizeClass(this), networkMonitor = networkMonitor, timeZoneMonitor = timeZoneMonitor, - navController = navController, ) val currentTimeZone by appState.currentTimeZone.collectAsStateWithLifecycle() + val navDestination = when (uiState) { + is Success -> if ((uiState as Success).userData.isAuthenticated) { + PASSCODE_GRAPH + } else { + LOGIN_GRAPH + } + + else -> LOGIN_GRAPH + } + CompositionLocalProvider( LocalAnalyticsHelper provides analyticsHelper, LocalTimeZone provides currentTimeZone, ) { MifosTheme { - MifosApp(appState, bottomSheetNavigator) + RootNavGraph( + appState = appState, + navHostController = navController, + startDestination = navDestination, + onClickLogout = { + viewModel.logOut() + navController.navigate(LOGIN_GRAPH) { + popUpTo(navController.graph.id) { + inclusive = true + } + } + }, + ) } } } @@ -128,16 +143,4 @@ class MainActivity : ComponentActivity() { super.onPause() lazyStats.get().isTrackingEnabled = false } - - /** - * The default light scrim, as defined by androidx and the platform: - * https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:activity/activity/src/main/kotlin/androidx/activity/EdgeToEdge.kt;l=35-38;drc=27e7d52e8604a080133e8b842db10c89b4482598 - */ - private val lightScrim = android.graphics.Color.argb(0xe6, 0xFF, 0xFF, 0xFF) - - /** - * The default dark scrim, as defined by androidx and the platform: - * https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:activity/activity/src/main/kotlin/androidx/activity/EdgeToEdge.kt;l=40-44;drc=27e7d52e8604a080133e8b842db10c89b4482598 - */ - private val darkScrim = android.graphics.Color.argb(0x80, 0x1b, 0x1b, 0x1b) } diff --git a/mifospay/src/main/java/org/mifospay/MainActivityViewModel.kt b/mifospay/src/main/java/org/mifospay/MainActivityViewModel.kt index 615109974..763374697 100644 --- a/mifospay/src/main/java/org/mifospay/MainActivityViewModel.kt +++ b/mifospay/src/main/java/org/mifospay/MainActivityViewModel.kt @@ -17,12 +17,15 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch import org.mifospay.core.data.repository.auth.UserDataRepository +import org.mifospay.feature.passcode.data.PasscodeManager import javax.inject.Inject @HiltViewModel class MainActivityViewModel @Inject constructor( - userDataRepository: UserDataRepository, + private val userDataRepository: UserDataRepository, + private val passcodeManager: PasscodeManager, ) : ViewModel() { val uiState: StateFlow = userDataRepository.userData.map { @@ -32,6 +35,13 @@ class MainActivityViewModel @Inject constructor( initialValue = MainActivityUiState.Loading, started = SharingStarted.WhileSubscribed(5_000), ) + + fun logOut() { + viewModelScope.launch { + userDataRepository.logOut() + passcodeManager.clearPasscode() + } + } } sealed interface MainActivityUiState { diff --git a/mifospay/src/main/java/org/mifospay/MifosPayApp.kt b/mifospay/src/main/java/org/mifospay/MifosPayApp.kt index 6a0d29fc7..795035371 100644 --- a/mifospay/src/main/java/org/mifospay/MifosPayApp.kt +++ b/mifospay/src/main/java/org/mifospay/MifosPayApp.kt @@ -10,39 +10,11 @@ package org.mifospay import android.app.Application -import android.content.Context -import androidx.appcompat.app.AppCompatDelegate -import com.mifos.mobile.passcode.utils.ForegroundChecker import dagger.hilt.android.HiltAndroidApp -/** - * Created by naman on 17/8/17. - */ @HiltAndroidApp class MifosPayApp : Application() { override fun onCreate() { super.onCreate() - if (instance == null) { - instance = this - } - - // Initialize ForegroundChecker - ForegroundChecker.init(this) - } - - companion object { - private var instance: MifosPayApp? = null - - init { - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) - } - - operator fun get(context: Context): MifosPayApp { - return context.applicationContext as MifosPayApp - } - - @JvmStatic - val context: Context? - get() = instance } } diff --git a/mifospay/src/main/java/org/mifospay/SplashScreenActivity.kt b/mifospay/src/main/java/org/mifospay/SplashScreenActivity.kt deleted file mode 100644 index 60aae0d34..000000000 --- a/mifospay/src/main/java/org/mifospay/SplashScreenActivity.kt +++ /dev/null @@ -1,40 +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 - -import android.annotation.SuppressLint -import android.content.Intent -import android.content.pm.ActivityInfo -import android.os.Build -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen -import androidx.lifecycle.lifecycleScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import org.mifospay.feature.auth.login.LoginActivity - -@SuppressLint("CustomSplashScreen") -class SplashScreenActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - val splashScreen = installSplashScreen() - splashScreen.setKeepOnScreenCondition { true } - } - super.onCreate(savedInstanceState) - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED - lifecycleScope.launch { - delay(2000) - startActivity(Intent(this@SplashScreenActivity, LoginActivity::class.java)) - finish() - } - } -} diff --git a/mifospay/src/main/java/org/mifospay/base/BaseActivity.kt b/mifospay/src/main/java/org/mifospay/base/BaseActivity.kt deleted file mode 100644 index 7043ab6b1..000000000 --- a/mifospay/src/main/java/org/mifospay/base/BaseActivity.kt +++ /dev/null @@ -1,170 +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.base - -import android.app.ProgressDialog -import android.content.pm.ActivityInfo -import android.view.MenuItem -import androidx.appcompat.widget.Toolbar -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import com.mifos.mobile.passcode.BasePassCodeActivity -import org.mifospay.R -import org.mifospay.feature.passcode.PassCodeActivity - -/** - * Created by naman on 16/6/17. - */ -open class BaseActivity : BasePassCodeActivity(), BaseActivityCallback { - var toolbar: Toolbar? = null - override var swipeRefreshLayout: SwipeRefreshLayout? = null - var progressDialog: ProgressDialog? = null - override fun setContentView(layoutResID: Int) { - super.setContentView(layoutResID) - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - toolbar = findViewById(R.id.toolbar) - swipeRefreshLayout = findViewById(R.id.swipe_layout) - if (toolbar != null) { - setSupportActionBar(toolbar) - } - } - - override fun showSwipeProgress() { - if (swipeRefreshLayout != null) { - swipeRefreshLayout!!.isEnabled = true - swipeRefreshLayout!!.isRefreshing = true - } - } - - override fun hideSwipeProgress() { - if (swipeRefreshLayout != null) { - swipeRefreshLayout!!.isRefreshing = false - } - } - - override fun setSwipeRefreshEnabled(enabled: Boolean) { - if (swipeRefreshLayout != null) { - swipeRefreshLayout!!.isEnabled = enabled - } - } - - override fun showProgressDialog(message: String?) { - if (progressDialog != null) { - progressDialog!!.setMessage(message) - progressDialog!!.show() - } else { - progressDialog = ProgressDialog(this) - progressDialog!!.setCanceledOnTouchOutside(false) - progressDialog!!.setMessage(message) - progressDialog!!.show() - } - } - - override fun hideProgressDialog() { - if (progressDialog != null) { - progressDialog!!.dismiss() - } - } - - override fun cancelProgressDialog() { - if (progressDialog != null && progressDialog!!.isShowing) { - progressDialog!!.cancel() - } - } - - override fun dismissProgressDialog() { - if (progressDialog != null && progressDialog!!.isShowing) { - progressDialog!!.dismiss() - } - } - - override fun setToolbarTitle(title: String?) { - if (supportActionBar != null && getTitle() != null) { - setTitle(title) - } - } - - override fun showColoredBackButton(drawable: Int) { - showHomeButton() - setToolbarIcon(drawable) - } - - override fun showCloseButton() { - showHomeButton() - setToolbarIcon(R.drawable.feature_make_transfer_ic_close) - } - - private fun showHomeButton() { - if (supportActionBar != null) { - supportActionBar!!.setHomeButtonEnabled(true) - supportActionBar!!.setDisplayHomeAsUpEnabled(true) - } - } - - private fun setToolbarIcon(res: Int) { - if (supportActionBar != null) { - supportActionBar!!.setHomeAsUpIndicator(res) - } - } - - override fun hideBackButton() { - if (supportActionBar != null) { - supportActionBar!!.setHomeButtonEnabled(false) - supportActionBar!!.setDisplayHomeAsUpEnabled(false) - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - android.R.id.home -> onBackPressed() - } - return super.onOptionsItemSelected(item) - } - - fun addFragment(fragment: Fragment?, containerId: Int) { - val transaction = supportFragmentManager.beginTransaction() - transaction.add(containerId, fragment!!) - transaction.commit() - } - - fun replaceFragment(fragment: Fragment, addToBackStack: Boolean, containerId: Int) { - invalidateOptionsMenu() - val backStateName = fragment.javaClass.name - val fragmentPopped = supportFragmentManager.popBackStackImmediate( - backStateName, - 0, - ) - if (!fragmentPopped && supportFragmentManager.findFragmentByTag(backStateName) == - null - ) { - val transaction = supportFragmentManager.beginTransaction() - transaction.setCustomAnimations(R.anim.custom_fade_in, R.anim.custom_fade_out) - transaction.replace(containerId, fragment, backStateName) - if (addToBackStack) { - transaction.addToBackStack(backStateName) - } - transaction.commit() - } - } - - fun clearFragmentBackStack() { - val fm = supportFragmentManager - val backStackCount = supportFragmentManager.backStackEntryCount - for (i in 0 until backStackCount) { - val backStackId = supportFragmentManager.getBackStackEntryAt(i).id - fm.popBackStack(backStackId, FragmentManager.POP_BACK_STACK_INCLUSIVE) - } - } - - override fun getPassCodeClass(): Class<*> { - return PassCodeActivity::class.java - } -} diff --git a/mifospay/src/main/java/org/mifospay/common/ui/SearchActivity.kt b/mifospay/src/main/java/org/mifospay/common/ui/SearchActivity.kt index 10e908f4f..6179f443d 100644 --- a/mifospay/src/main/java/org/mifospay/common/ui/SearchActivity.kt +++ b/mifospay/src/main/java/org/mifospay/common/ui/SearchActivity.kt @@ -10,16 +10,16 @@ package org.mifospay.common.ui import android.os.Bundle +import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import dagger.hilt.android.AndroidEntryPoint -import org.mifospay.base.BaseActivity import org.mifospay.core.designsystem.theme.MifosTheme /** * Created by naman on 21/8/17. */ @AndroidEntryPoint -class SearchActivity : BaseActivity() { +class SearchActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { diff --git a/mifospay/src/main/java/org/mifospay/di/ApplicationModule.kt b/mifospay/src/main/java/org/mifospay/di/ApplicationModule.kt index ba2dba403..1dc03bb0c 100644 --- a/mifospay/src/main/java/org/mifospay/di/ApplicationModule.kt +++ b/mifospay/src/main/java/org/mifospay/di/ApplicationModule.kt @@ -9,16 +9,12 @@ */ package org.mifospay.di -import android.content.Context -import com.mifos.mobile.passcode.utils.PasscodePreferencesHelper import dagger.Module import dagger.Provides import dagger.hilt.InstallIn -import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import org.mifospay.core.datastore.PreferencesHelper import org.mifospay.data.local.LocalRepository -import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) @@ -28,12 +24,4 @@ class ApplicationModule { fun providesLocalRepository(preferencesHelper: PreferencesHelper): LocalRepository { return LocalRepository(preferencesHelper) } - - @Provides - @Singleton - fun providesPasscodePreferencesHelper( - @ApplicationContext context: Context, - ): PasscodePreferencesHelper { - return PasscodePreferencesHelper(context) - } } diff --git a/mifospay/src/main/java/org/mifospay/navigation/LoginNavGraph.kt b/mifospay/src/main/java/org/mifospay/navigation/LoginNavGraph.kt new file mode 100644 index 000000000..92e652ae3 --- /dev/null +++ b/mifospay/src/main/java/org/mifospay/navigation/LoginNavGraph.kt @@ -0,0 +1,51 @@ +/* + * 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.navigation + +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.navigation +import org.mifospay.common.Constants +import org.mifospay.feature.auth.navigation.LOGIN_ROUTE +import org.mifospay.feature.auth.navigation.loginScreen +import org.mifospay.feature.auth.navigation.mobileVerificationScreen +import org.mifospay.feature.auth.navigation.navigateToSignup +import org.mifospay.feature.auth.navigation.signupScreen +import org.mifospay.feature.passcode.navigateToPasscodeScreen + +internal fun NavGraphBuilder.loginNavGraph(navController: NavController) { + navigation( + route = MifosNavGraph.LOGIN_GRAPH, + startDestination = LOGIN_ROUTE, + ) { + loginScreen( + onNavigateToPasscodeScreen = navController::navigateToPasscodeScreen, + ) + + signupScreen( + onLoginSuccess = navController::navigateToPasscodeScreen, + onRegisterSuccess = navController::navigateToPasscodeScreen, + ) + + mobileVerificationScreen( + onOtpVerificationSuccess = { fullNumber, extraData -> + navController.navigateToSignup( + savingProductId = extraData[Constants.MIFOS_SAVINGS_PRODUCT_ID] as Int, + mobileNumber = fullNumber, + country = "Canada", + email = extraData[Constants.GOOGLE_EMAIL] as? String ?: "", + firstName = extraData[Constants.GOOGLE_GIVEN_NAME] as? String ?: "", + lastName = extraData[Constants.GOOGLE_FAMILY_NAME] as? String ?: "", + businessName = extraData[Constants.GOOGLE_DISPLAY_NAME] as? String ?: "", + ) + }, + ) + } +} diff --git a/mifospay/src/main/java/org/mifospay/navigation/MifosNavGraph.kt b/mifospay/src/main/java/org/mifospay/navigation/MifosNavGraph.kt new file mode 100644 index 000000000..ffb539627 --- /dev/null +++ b/mifospay/src/main/java/org/mifospay/navigation/MifosNavGraph.kt @@ -0,0 +1,17 @@ +/* + * 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.navigation + +internal object MifosNavGraph { + const val ROOT_GRAPH = "root_graph" + const val LOGIN_GRAPH = "login_graph" + const val PASSCODE_GRAPH = "passcode_graph" + const val MAIN_GRAPH = "main_graph" +} diff --git a/mifospay/src/main/java/org/mifospay/navigation/MifosNavHost.kt b/mifospay/src/main/java/org/mifospay/navigation/MifosNavHost.kt index 138935bfd..3f5b4a583 100644 --- a/mifospay/src/main/java/org/mifospay/navigation/MifosNavHost.kt +++ b/mifospay/src/main/java/org/mifospay/navigation/MifosNavHost.kt @@ -10,25 +10,14 @@ package org.mifospay.navigation import android.content.Context -import android.content.Intent import android.net.Uri +import androidx.compose.material.navigation.ModalBottomSheetLayout import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import androidx.core.content.FileProvider -import androidx.core.os.bundleOf -import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost -import com.mifos.mobile.passcode.utils.PassCodeConstants -import com.mifos.mobile.passcode.utils.PasscodePreferencesHelper import org.mifospay.common.Constants import org.mifospay.core.ui.utility.TabContent -import org.mifospay.feature.auth.login.LoginActivity -import org.mifospay.feature.auth.navigation.loginScreen -import org.mifospay.feature.auth.navigation.mobileVerificationScreen -import org.mifospay.feature.auth.navigation.navigateToMobileVerification -import org.mifospay.feature.auth.navigation.navigateToSignup -import org.mifospay.feature.auth.navigation.signupScreen import org.mifospay.feature.bank.accounts.AccountsScreen import org.mifospay.feature.bank.accounts.navigation.bankAccountDetailScreen import org.mifospay.feature.bank.accounts.navigation.linkBankAccountScreen @@ -57,7 +46,6 @@ import org.mifospay.feature.make.transfer.navigation.makeTransferScreen import org.mifospay.feature.make.transfer.navigation.navigateToMakeTransferScreen import org.mifospay.feature.merchants.navigation.merchantTransferScreen import org.mifospay.feature.merchants.ui.MerchantScreen -import org.mifospay.feature.passcode.PassCodeActivity import org.mifospay.feature.payments.PaymentsScreenContents import org.mifospay.feature.payments.RequestScreen import org.mifospay.feature.payments.paymentsScreen @@ -84,6 +72,7 @@ import org.mifospay.feature.standing.instruction.newSiScreen import org.mifospay.feature.standing.instruction.siDetailsScreen import org.mifospay.feature.upiSetup.navigation.navigateToSetupUpiPin import org.mifospay.feature.upiSetup.navigation.setupUpiPinScreen +import org.mifospay.ui.MifosAppState import java.io.File import java.util.Objects @@ -94,15 +83,14 @@ import java.util.Objects * The navigation graph defined in this file defines the different top level routes. Navigation * within each route is handled using state and Back Handlers. */ +@Suppress("MaxLineLength", "LongMethod") @Composable -@Suppress("MaxLineLength", "LongMethod", "UnusedParameter") -fun MifosNavHost( - navController: NavHostController, - onShowSnackbar: suspend (String, String?) -> Boolean, +internal fun MifosNavHost( + appState: MifosAppState, + onClickLogout: () -> Unit, modifier: Modifier = Modifier, - startDestination: String = HOME_ROUTE, ) { - val context = LocalContext.current + val navController = appState.navController val tabContents = listOf( TabContent(FinanceScreenContents.ACCOUNTS.name) { @@ -161,207 +149,147 @@ fun MifosNavHost( }, ) - NavHost( - navController = navController, - startDestination = startDestination, + ModalBottomSheetLayout( + bottomSheetNavigator = appState.bottomSheetNavigator, modifier = modifier, ) { - homeScreen( - onRequest = navController::navigateToShowQrScreen, - onPay = navController::navigateToSendMoneyScreen, - ) - paymentsScreen( - tabContents = paymentsTabContents, - ) - financeScreen( - tabContents = tabContents, - ) - addCardScreen( - onDismiss = navController::popBackStack, - onAddCard = { - // Handle adding the cards - navController.popBackStack() - }, - ) - profileScreen( - onEditProfile = navController::navigateToEditProfile, - onSettings = navController::navigateToSettings, - ) - sendMoneyScreen( - onBackClick = navController::popBackStack, - proceedWithMakeTransferFlow = navController::navigateToMakeTransferScreen, - ) - makeTransferScreen( - onDismiss = navController::popBackStack, - ) - showQrScreen( - onBackClick = navController::popBackStack, - ) - merchantTransferScreen( - proceedWithMakeTransferFlow = navController::navigateToMakeTransferScreen, - onBackPressed = navController::popBackStack, - ) - settingsScreen( - onBackPress = navController::popBackStack, - navigateToEditPasswordScreen = navController::navigateToEditPassword, - onLogout = context::logOut, - onChangePasscode = context::onChangePasscodeClicked, - ) + NavHost( + route = MifosNavGraph.MAIN_GRAPH, + startDestination = HOME_ROUTE, + navController = navController, + ) { + homeScreen( + onRequest = navController::navigateToShowQrScreen, + onPay = navController::navigateToSendMoneyScreen, + ) + paymentsScreen( + tabContents = paymentsTabContents, + ) + financeScreen( + tabContents = tabContents, + ) + addCardScreen( + onDismiss = navController::popBackStack, + onAddCard = { + // Handle adding the cards + navController.popBackStack() + }, + ) + profileScreen( + onEditProfile = navController::navigateToEditProfile, + onSettings = navController::navigateToSettings, + ) + sendMoneyScreen( + onBackClick = navController::popBackStack, + proceedWithMakeTransferFlow = navController::navigateToMakeTransferScreen, + ) + makeTransferScreen( + onDismiss = navController::popBackStack, + ) + showQrScreen( + onBackClick = navController::popBackStack, + ) + merchantTransferScreen( + proceedWithMakeTransferFlow = navController::navigateToMakeTransferScreen, + onBackPressed = navController::popBackStack, + ) + settingsScreen( + onBackPress = navController::popBackStack, + navigateToEditPasswordScreen = navController::navigateToEditPassword, + onLogout = onClickLogout, + onChangePasscode = { + // TODO:: Implement change passcode screen + }, + ) - kycScreen( - onLevel1Clicked = navController::navigateToKYCLevel1, - onLevel2Clicked = navController::navigateToKYCLevel2, - onLevel3Clicked = navController::navigateToKYCLevel3, - ) - kycLevel1Screen( - navigateToKycLevel2 = navController::navigateToKYCLevel2, - ) - kycLevel2Screen( - onSuccessKyc2 = navController::navigateToKYCLevel3, - ) + kycScreen( + onLevel1Clicked = navController::navigateToKYCLevel1, + onLevel2Clicked = navController::navigateToKYCLevel2, + onLevel3Clicked = navController::navigateToKYCLevel3, + ) + kycLevel1Screen( + navigateToKycLevel2 = navController::navigateToKYCLevel2, + ) + kycLevel2Screen( + onSuccessKyc2 = navController::navigateToKYCLevel3, + ) - kycLevel3Screen() + kycLevel3Screen() - newSiScreen(onBackClick = navController::popBackStack) + newSiScreen(onBackClick = navController::popBackStack) - siDetailsScreen( - onClickCreateNew = navController::navigateToNewSiScreen, - onBackPress = navController::popBackStack, - ) + siDetailsScreen( + onClickCreateNew = navController::navigateToNewSiScreen, + onBackPress = navController::popBackStack, + ) - editProfileScreen( - onBackPress = navController::popBackStack, - getUri = ::getUri, - ) + editProfileScreen( + onBackPress = navController::popBackStack, + getUri = ::getUri, + ) - faqScreen( - navigateBack = navController::popBackStack, - ) - readQrScreen( - onBackClick = navController::popBackStack, - ) + faqScreen( + navigateBack = navController::popBackStack, + ) + readQrScreen( + onBackClick = navController::popBackStack, + ) - specificTransactionsScreen( - onBackClick = navController::popBackStack, - onTransactionItemClicked = { transactionId -> - navController.navigateToReceipt(Uri.parse(Constants.RECEIPT_DOMAIN + transactionId)) - }, - ) - invoiceDetailScreen( - onBackPress = navController::popBackStack, - navigateToReceiptScreen = { uri -> - navController.navigateToReceipt(Uri.parse(Constants.RECEIPT_DOMAIN + uri)) - }, - ) - receiptScreen( - openPassCodeActivity = context::openPassCodeActivity, - onBackClick = navController::popBackStack, - ) - setupUpiPinScreen( - onBackPress = navController::popBackStack, - ) - bankAccountDetailScreen( - onSetupUpiPin = { bankAccountDetails, index -> - navController.navigateToSetupUpiPin(bankAccountDetails, index, Constants.SETUP) - }, - onChangeUpiPin = { bankAccountDetails, index -> - navController.navigateToSetupUpiPin(bankAccountDetails, index, Constants.CHANGE) - }, - onForgotUpiPin = { bankAccountDetails, index -> - navController.navigateToSetupUpiPin(bankAccountDetails, index, Constants.FORGOT) - }, - onBackClick = { bankAccountDetails, index -> - navController.previousBackStackEntry?.savedStateHandle?.set( - Constants.UPDATED_BANK_ACCOUNT, - bankAccountDetails, - ) - navController.previousBackStackEntry?.savedStateHandle?.set(Constants.INDEX, index) - navController.popBackStack() - }, - ) - linkBankAccountScreen( - onBackClick = navController::popBackStack, - ) - editPasswordScreen( - onBackPress = navController::popBackStack, - onCancelChanges = navController::popBackStack, - ) - signupScreen( - onLoginSuccess = { - val intent = Intent(context, PassCodeActivity::class.java).apply { - putExtra(PassCodeConstants.PASSCODE_INITIAL_LOGIN, true) - } - context.startActivity(intent) - }, - onRegisterSuccess = { - // Todo: Implement onRegisterSuccess - }, - ) - mobileVerificationScreen( - onOtpVerificationSuccess = { fullNumber, extraData -> - navController.navigateToSignup( - savingProductId = extraData[Constants.MIFOS_SAVINGS_PRODUCT_ID] as Int, - mobileNumber = fullNumber, - country = "Canada", - email = extraData[Constants.GOOGLE_EMAIL] as? String ?: "", - firstName = extraData[Constants.GOOGLE_GIVEN_NAME] as? String ?: "", - lastName = extraData[Constants.GOOGLE_FAMILY_NAME] as? String ?: "", - businessName = extraData[Constants.GOOGLE_DISPLAY_NAME] as? String ?: "", - ) - }, - ) + specificTransactionsScreen( + onBackClick = navController::popBackStack, + onTransactionItemClicked = { transactionId -> + navController.navigateToReceipt(Uri.parse(Constants.RECEIPT_DOMAIN + transactionId)) + }, + ) + invoiceDetailScreen( + onBackPress = navController::popBackStack, + navigateToReceiptScreen = { uri -> + navController.navigateToReceipt(Uri.parse(Constants.RECEIPT_DOMAIN + uri)) + }, + ) + receiptScreen( + openPassCodeActivity = { + // TODO: Implement Passcode Screen for Receipt + }, + onBackClick = navController::popBackStack, + ) + setupUpiPinScreen( + onBackPress = navController::popBackStack, + ) - loginScreen( - onDismissSignUp = { - // Todo: Navigate to the main screen after successful login - }, - onNavigateToMobileVerificationScreen = { mifosSignedUp, googleDisplayName, googleEmail, googleFamilyName, googleGivenName -> - navController.navigateToMobileVerification( - mifosSignedUp = mifosSignedUp, - googleDisplayName = googleDisplayName, - googleEmail = googleEmail, - googleFamilyName = googleFamilyName, - googleGivenName = googleGivenName, - ) - }, - ) + bankAccountDetailScreen( + onSetupUpiPin = { bankAccountDetails, index -> + navController.navigateToSetupUpiPin(bankAccountDetails, index, Constants.SETUP) + }, + onChangeUpiPin = { bankAccountDetails, index -> + navController.navigateToSetupUpiPin(bankAccountDetails, index, Constants.CHANGE) + }, + onForgotUpiPin = { bankAccountDetails, index -> + navController.navigateToSetupUpiPin(bankAccountDetails, index, Constants.FORGOT) + }, + onBackClick = { bankAccountDetails, index -> + navController.previousBackStackEntry?.savedStateHandle?.set( + Constants.UPDATED_BANK_ACCOUNT, + bankAccountDetails, + ) + navController.previousBackStackEntry?.savedStateHandle?.set( + Constants.INDEX, + index, + ) + navController.popBackStack() + }, + ) + linkBankAccountScreen( + onBackClick = navController::popBackStack, + ) + editPasswordScreen( + onBackPress = navController::popBackStack, + onCancelChanges = navController::popBackStack, + ) + } } } -private fun Context.logOut() { - val intent = Intent(this, LoginActivity::class.java) - intent.addFlags( - Intent.FLAG_ACTIVITY_CLEAR_TOP or - Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK, - ) - this.startActivity(intent) -} - -private fun Context.onChangePasscodeClicked() { - val passcodePreferencesHelper = PasscodePreferencesHelper(this) - - val currentPasscode = passcodePreferencesHelper.passCode - passcodePreferencesHelper.savePassCode("") - - PassCodeActivity.startPassCodeActivity( - context = this, - bundle = bundleOf( - Pair(Constants.CURRENT_PASSCODE, currentPasscode), - Pair(Constants.UPDATE_PASSCODE, true), - ), - ) -} - -fun Context.openPassCodeActivity(deepLinkURI: Uri) { - PassCodeActivity.startPassCodeActivity( - context = this, - bundle = bundleOf( - Pair("uri", deepLinkURI.toString()), - Pair(PassCodeConstants.PASSCODE_INITIAL_LOGIN, true), - ), - ) -} - fun getUri(context: Context, file: File): Uri { val uri = FileProvider.getUriForFile( Objects.requireNonNull(context), diff --git a/mifospay/src/main/java/org/mifospay/navigation/PasscodeNavGraph.kt b/mifospay/src/main/java/org/mifospay/navigation/PasscodeNavGraph.kt new file mode 100644 index 000000000..3b0f4202a --- /dev/null +++ b/mifospay/src/main/java/org/mifospay/navigation/PasscodeNavGraph.kt @@ -0,0 +1,42 @@ +/* + * 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.navigation + +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.navigation +import org.mifospay.feature.passcode.PASSCODE_SCREEN +import org.mifospay.feature.passcode.passcodeRoute + +internal fun NavGraphBuilder.passcodeNavGraph(navController: NavController) { + navigation( + route = MifosNavGraph.PASSCODE_GRAPH, + startDestination = PASSCODE_SCREEN, + ) { + passcodeRoute( + onForgotButton = { + navController.popBackStack() + navController.navigate(MifosNavGraph.MAIN_GRAPH) + }, + onSkipButton = { + navController.popBackStack() + navController.navigate(MifosNavGraph.MAIN_GRAPH) + }, + onPasscodeConfirm = { + navController.popBackStack() + navController.navigate(MifosNavGraph.MAIN_GRAPH) + }, + onPasscodeRejected = { + navController.popBackStack() + navController.navigate(MifosNavGraph.MAIN_GRAPH) + }, + ) + } +} diff --git a/mifospay/src/main/java/org/mifospay/navigation/RootNavGraph.kt b/mifospay/src/main/java/org/mifospay/navigation/RootNavGraph.kt new file mode 100644 index 000000000..1a0735b28 --- /dev/null +++ b/mifospay/src/main/java/org/mifospay/navigation/RootNavGraph.kt @@ -0,0 +1,45 @@ +/* + * 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.navigation + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import org.mifospay.ui.MifosApp +import org.mifospay.ui.MifosAppState + +@Composable +internal fun RootNavGraph( + appState: MifosAppState, + navHostController: NavHostController, + startDestination: String, + onClickLogout: () -> Unit, + modifier: Modifier = Modifier, +) { + NavHost( + navController = navHostController, + startDestination = startDestination, + route = MifosNavGraph.ROOT_GRAPH, + modifier = modifier, + ) { + loginNavGraph(navHostController) + + passcodeNavGraph(navHostController) + + composable(MifosNavGraph.MAIN_GRAPH) { + MifosApp( + appState = appState, + onClickLogout = onClickLogout, + ) + } + } +} diff --git a/mifospay/src/main/java/org/mifospay/ui/MifosApp.kt b/mifospay/src/main/java/org/mifospay/ui/MifosApp.kt index 870036332..49dcccfc9 100644 --- a/mifospay/src/main/java/org/mifospay/ui/MifosApp.kt +++ b/mifospay/src/main/java/org/mifospay/ui/MifosApp.kt @@ -25,8 +25,6 @@ import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.layout.wrapContentSize -import androidx.compose.material.navigation.BottomSheetNavigator -import androidx.compose.material.navigation.ModalBottomSheetLayout import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api @@ -34,10 +32,8 @@ import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarDuration.Indefinite -import androidx.compose.material3.SnackbarDuration.Short import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState -import androidx.compose.material3.SnackbarResult.ActionPerformed import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable @@ -85,7 +81,7 @@ import org.mifospay.navigation.TopLevelDestination @Composable fun MifosApp( appState: MifosAppState, - bottomSheetNavigator: BottomSheetNavigator, + onClickLogout: () -> Unit, modifier: Modifier = Modifier, ) { val shouldShowGradientBackground = @@ -95,11 +91,11 @@ fun MifosApp( MifosBackground(modifier) { MifosGradientBackground( gradientColors = - if (shouldShowGradientBackground) { - LocalGradientColors.current - } else { - GradientColors() - }, + if (shouldShowGradientBackground) { + LocalGradientColors.current + } else { + GradientColors() + }, ) { val snackbarHostState = remember { SnackbarHostState() } @@ -120,11 +116,11 @@ fun MifosApp( AnimatedVisibility(true) { Box( modifier = - Modifier - .fillMaxWidth() - .wrapContentSize(Alignment.TopEnd) - .padding(end = 24.dp) - .background(color = MaterialTheme.colorScheme.surface), + Modifier + .fillMaxWidth() + .wrapContentSize(Alignment.TopEnd) + .padding(end = 24.dp) + .background(color = MaterialTheme.colorScheme.surface), ) { DropdownMenu( modifier = Modifier.background(color = MaterialTheme.colorScheme.surface), @@ -160,17 +156,12 @@ fun MifosApp( } } - // TODO unread destinations to show dot indicator - // val unreadDestinations by appState.topLevelDestinationsWithUnreadResources.collectAsStateWithLifecycle() - Scaffold( - modifier = - Modifier.semantics { - testTagsAsResourceId = true - }, + modifier = Modifier.semantics { + testTagsAsResourceId = true + }, containerColor = Color.Transparent, contentColor = MaterialTheme.colorScheme.onBackground, - contentWindowInsets = WindowInsets(0, 0, 0, 0), snackbarHost = { SnackbarHost(snackbarHostState) }, bottomBar = { if (appState.shouldShowBottomBar) { @@ -202,9 +193,9 @@ fun MifosApp( onNavigateToDestination = appState::navigateToTopLevelDestination, currentDestination = appState.currentDestination, modifier = - Modifier - .testTag("NiaNavRail") - .safeDrawingPadding(), + Modifier + .testTag("NiaNavRail") + .safeDrawingPadding(), ) } @@ -216,33 +207,22 @@ fun MifosApp( titleRes = destination.titleTextId, actionIcon = MifosIcons.MoreVert, actionIconContentDescription = - stringResource( - id = R.string.feature_profile_settings, - ), + stringResource( + id = R.string.feature_profile_settings, + ), colors = - TopAppBarDefaults.centerAlignedTopAppBarColors( - containerColor = Color.Transparent, - ), + TopAppBarDefaults.centerAlignedTopAppBarColors( + containerColor = Color.Transparent, + ), onActionClick = { showHomeMenuOption = true }, ) } - ModalBottomSheetLayout(bottomSheetNavigator = bottomSheetNavigator) { - MifosNavHost( - navController = appState.navController, - onShowSnackbar = { message, action -> - snackbarHostState.showSnackbar( - message = message, - actionLabel = action, - duration = Short, - ) == ActionPerformed - }, - ) - } + MifosNavHost( + appState = appState, + onClickLogout = onClickLogout, + ) } - - // TODO: We may want to add padding or spacer when the snackbar is shown so that - // content doesn't display behind it. } } } @@ -331,11 +311,11 @@ private fun Modifier.notificationDot(): Modifier = // however, its parameters are private, so we must depend on them implicitly // (NavigationBarTokens.ActiveIndicatorWidth = 64.dp) center = - center + - Offset( - 64.dp.toPx() * .45f, - 32.dp.toPx() * -.45f - 6.dp.toPx(), - ), + center + + Offset( + 64.dp.toPx() * .45f, + 32.dp.toPx() * -.45f - 6.dp.toPx(), + ), ) } } diff --git a/mifospay/src/main/java/org/mifospay/ui/MifosAppState.kt b/mifospay/src/main/java/org/mifospay/ui/MifosAppState.kt index 451dfb900..638ff13a7 100644 --- a/mifospay/src/main/java/org/mifospay/ui/MifosAppState.kt +++ b/mifospay/src/main/java/org/mifospay/ui/MifosAppState.kt @@ -9,6 +9,8 @@ */ package org.mifospay.ui +import androidx.compose.material.navigation.BottomSheetNavigator +import androidx.compose.material.navigation.rememberBottomSheetNavigator import androidx.compose.material3.windowsizeclass.WindowSizeClass import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass import androidx.compose.runtime.Composable @@ -47,11 +49,13 @@ fun rememberMifosAppState( networkMonitor: NetworkMonitor, timeZoneMonitor: TimeZoneMonitor, coroutineScope: CoroutineScope = rememberCoroutineScope(), - navController: NavHostController = rememberNavController(), + bottomSheetNavigator: BottomSheetNavigator = rememberBottomSheetNavigator(), + navController: NavHostController = rememberNavController(bottomSheetNavigator), ): MifosAppState { NavigationTrackingSideEffect(navController) return remember( navController, + bottomSheetNavigator, coroutineScope, windowSizeClass, networkMonitor, @@ -59,6 +63,7 @@ fun rememberMifosAppState( ) { MifosAppState( navController = navController, + bottomSheetNavigator = bottomSheetNavigator, coroutineScope = coroutineScope, windowSizeClass = windowSizeClass, networkMonitor = networkMonitor, @@ -70,6 +75,7 @@ fun rememberMifosAppState( @Stable class MifosAppState( val navController: NavHostController, + val bottomSheetNavigator: BottomSheetNavigator, coroutineScope: CoroutineScope, val windowSizeClass: WindowSizeClass, networkMonitor: NetworkMonitor, diff --git a/mifospay/src/main/res/color/background_chip_state.xml b/mifospay/src/main/res/color/background_chip_state.xml deleted file mode 100644 index 2c1244261..000000000 --- a/mifospay/src/main/res/color/background_chip_state.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/bg_et_round_border.xml b/mifospay/src/main/res/drawable/bg_et_round_border.xml deleted file mode 100644 index 3183ca5b4..000000000 --- a/mifospay/src/main/res/drawable/bg_et_round_border.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - diff --git a/mifospay/src/main/res/drawable/bg_splash.xml b/mifospay/src/main/res/drawable/bg_splash.xml index a0baf6d93..da3e7cb77 100644 --- a/mifospay/src/main/res/drawable/bg_splash.xml +++ b/mifospay/src/main/res/drawable/bg_splash.xml @@ -12,9 +12,14 @@ - + \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/button_round_black.xml b/mifospay/src/main/res/drawable/button_round_black.xml deleted file mode 100644 index 835132df5..000000000 --- a/mifospay/src/main/res/drawable/button_round_black.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/button_round_gray.xml b/mifospay/src/main/res/drawable/button_round_gray.xml deleted file mode 100644 index 89b9cb025..000000000 --- a/mifospay/src/main/res/drawable/button_round_gray.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/button_round_primary.xml b/mifospay/src/main/res/drawable/button_round_primary.xml deleted file mode 100644 index 835132df5..000000000 --- a/mifospay/src/main/res/drawable/button_round_primary.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/button_round_stroke.xml b/mifospay/src/main/res/drawable/button_round_stroke.xml deleted file mode 100644 index b7ceb0ef6..000000000 --- a/mifospay/src/main/res/drawable/button_round_stroke.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/button_round_stroke_gray.xml b/mifospay/src/main/res/drawable/button_round_stroke_gray.xml deleted file mode 100644 index 549db6843..000000000 --- a/mifospay/src/main/res/drawable/button_round_stroke_gray.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/button_round_stroke_primary.xml b/mifospay/src/main/res/drawable/button_round_stroke_primary.xml deleted file mode 100644 index fd1c97a74..000000000 --- a/mifospay/src/main/res/drawable/button_round_stroke_primary.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/cardview_round_blue.xml b/mifospay/src/main/res/drawable/cardview_round_blue.xml deleted file mode 100644 index e9c8d2072..000000000 --- a/mifospay/src/main/res/drawable/cardview_round_blue.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/cardview_round_green.xml b/mifospay/src/main/res/drawable/cardview_round_green.xml deleted file mode 100644 index 1be22ce0f..000000000 --- a/mifospay/src/main/res/drawable/cardview_round_green.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/drawable_bottom_sheet_view.xml b/mifospay/src/main/res/drawable/drawable_bottom_sheet_view.xml deleted file mode 100644 index df68df456..000000000 --- a/mifospay/src/main/res/drawable/drawable_bottom_sheet_view.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/drawable_editable_image_hint.xml b/mifospay/src/main/res/drawable/drawable_editable_image_hint.xml deleted file mode 100644 index 1b66a55c6..000000000 --- a/mifospay/src/main/res/drawable/drawable_editable_image_hint.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/et_search.xml b/mifospay/src/main/res/drawable/et_search.xml deleted file mode 100644 index 6a0efb4c1..000000000 --- a/mifospay/src/main/res/drawable/et_search.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_account_balance_wallet.xml b/mifospay/src/main/res/drawable/ic_account_balance_wallet.xml deleted file mode 100644 index 0f123f2c2..000000000 --- a/mifospay/src/main/res/drawable/ic_account_balance_wallet.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_accounts.xml b/mifospay/src/main/res/drawable/ic_accounts.xml deleted file mode 100644 index 3ea27ba5e..000000000 --- a/mifospay/src/main/res/drawable/ic_accounts.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_add.xml b/mifospay/src/main/res/drawable/ic_add.xml deleted file mode 100644 index b52ca0588..000000000 --- a/mifospay/src/main/res/drawable/ic_add.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_add_white.xml b/mifospay/src/main/res/drawable/ic_add_white.xml deleted file mode 100644 index a74762170..000000000 --- a/mifospay/src/main/res/drawable/ic_add_white.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_arrow_back_black_24dp.xml b/mifospay/src/main/res/drawable/ic_arrow_back_black_24dp.xml deleted file mode 100644 index dbbf1e74d..000000000 --- a/mifospay/src/main/res/drawable/ic_arrow_back_black_24dp.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_arrow_back_white_24dp.xml b/mifospay/src/main/res/drawable/ic_arrow_back_white_24dp.xml deleted file mode 100644 index b0c052c88..000000000 --- a/mifospay/src/main/res/drawable/ic_arrow_back_white_24dp.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_bank.xml b/mifospay/src/main/res/drawable/ic_bank.xml deleted file mode 100644 index a7856762d..000000000 --- a/mifospay/src/main/res/drawable/ic_bank.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_baseline_content_copy_24.xml b/mifospay/src/main/res/drawable/ic_baseline_content_copy_24.xml deleted file mode 100644 index 9b5e86d30..000000000 --- a/mifospay/src/main/res/drawable/ic_baseline_content_copy_24.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_baseline_insert_photo_24.xml b/mifospay/src/main/res/drawable/ic_baseline_insert_photo_24.xml deleted file mode 100644 index 9a6558e47..000000000 --- a/mifospay/src/main/res/drawable/ic_baseline_insert_photo_24.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_baseline_share_24.xml b/mifospay/src/main/res/drawable/ic_baseline_share_24.xml deleted file mode 100644 index 7eea3e481..000000000 --- a/mifospay/src/main/res/drawable/ic_baseline_share_24.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_camera.xml b/mifospay/src/main/res/drawable/ic_camera.xml deleted file mode 100644 index dffa5d6df..000000000 --- a/mifospay/src/main/res/drawable/ic_camera.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/mifospay/src/main/res/drawable/ic_cards.xml b/mifospay/src/main/res/drawable/ic_cards.xml deleted file mode 100644 index a43e8e0e7..000000000 --- a/mifospay/src/main/res/drawable/ic_cards.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_check_round_black_24dp.xml b/mifospay/src/main/res/drawable/ic_check_round_black_24dp.xml deleted file mode 100644 index fb907bfa1..000000000 --- a/mifospay/src/main/res/drawable/ic_check_round_black_24dp.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_close.xml b/mifospay/src/main/res/drawable/ic_close.xml deleted file mode 100644 index e024ce4a4..000000000 --- a/mifospay/src/main/res/drawable/ic_close.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_contact.xml b/mifospay/src/main/res/drawable/ic_contact.xml deleted file mode 100644 index a2bb581a3..000000000 --- a/mifospay/src/main/res/drawable/ic_contact.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_done.xml b/mifospay/src/main/res/drawable/ic_done.xml deleted file mode 100644 index 213fa116a..000000000 --- a/mifospay/src/main/res/drawable/ic_done.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_edit.xml b/mifospay/src/main/res/drawable/ic_edit.xml deleted file mode 100644 index 1aaddb39c..000000000 --- a/mifospay/src/main/res/drawable/ic_edit.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_email.xml b/mifospay/src/main/res/drawable/ic_email.xml deleted file mode 100644 index c0bc3b329..000000000 --- a/mifospay/src/main/res/drawable/ic_email.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - diff --git a/mifospay/src/main/res/drawable/ic_empty_state.xml b/mifospay/src/main/res/drawable/ic_empty_state.xml deleted file mode 100644 index 490b6be50..000000000 --- a/mifospay/src/main/res/drawable/ic_empty_state.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_error_state.xml b/mifospay/src/main/res/drawable/ic_error_state.xml deleted file mode 100644 index 5ff3eb681..000000000 --- a/mifospay/src/main/res/drawable/ic_error_state.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_flash_off.xml b/mifospay/src/main/res/drawable/ic_flash_off.xml deleted file mode 100644 index da6195745..000000000 --- a/mifospay/src/main/res/drawable/ic_flash_off.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_flash_on.xml b/mifospay/src/main/res/drawable/ic_flash_on.xml deleted file mode 100644 index 40d5c8118..000000000 --- a/mifospay/src/main/res/drawable/ic_flash_on.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_history.xml b/mifospay/src/main/res/drawable/ic_history.xml deleted file mode 100644 index bec66e5f9..000000000 --- a/mifospay/src/main/res/drawable/ic_history.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_invoice.xml b/mifospay/src/main/res/drawable/ic_invoice.xml deleted file mode 100644 index 4014b0003..000000000 --- a/mifospay/src/main/res/drawable/ic_invoice.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_invoices.xml b/mifospay/src/main/res/drawable/ic_invoices.xml deleted file mode 100644 index d05eb17b7..000000000 --- a/mifospay/src/main/res/drawable/ic_invoices.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_logo_outline.xml b/mifospay/src/main/res/drawable/ic_logo_outline.xml deleted file mode 100644 index 842e0a73c..000000000 --- a/mifospay/src/main/res/drawable/ic_logo_outline.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - diff --git a/mifospay/src/main/res/drawable/ic_merchant.xml b/mifospay/src/main/res/drawable/ic_merchant.xml deleted file mode 100644 index d0565b244..000000000 --- a/mifospay/src/main/res/drawable/ic_merchant.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_merchants.xml b/mifospay/src/main/res/drawable/ic_merchants.xml deleted file mode 100644 index 2b8395da7..000000000 --- a/mifospay/src/main/res/drawable/ic_merchants.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_mobile.xml b/mifospay/src/main/res/drawable/ic_mobile.xml deleted file mode 100644 index fc0915a7b..000000000 --- a/mifospay/src/main/res/drawable/ic_mobile.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - diff --git a/mifospay/src/main/res/drawable/ic_next.xml b/mifospay/src/main/res/drawable/ic_next.xml deleted file mode 100644 index ac2958c7e..000000000 --- a/mifospay/src/main/res/drawable/ic_next.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_next_black.xml b/mifospay/src/main/res/drawable/ic_next_black.xml deleted file mode 100644 index 4d2ec831c..000000000 --- a/mifospay/src/main/res/drawable/ic_next_black.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_notification.xml b/mifospay/src/main/res/drawable/ic_notification.xml deleted file mode 100644 index 8431212e9..000000000 --- a/mifospay/src/main/res/drawable/ic_notification.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_photo_library.xml b/mifospay/src/main/res/drawable/ic_photo_library.xml deleted file mode 100644 index 3b5fcab42..000000000 --- a/mifospay/src/main/res/drawable/ic_photo_library.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_remove.xml b/mifospay/src/main/res/drawable/ic_remove.xml deleted file mode 100644 index c861a572b..000000000 --- a/mifospay/src/main/res/drawable/ic_remove.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_remove_circle_outline_black_24dp.xml b/mifospay/src/main/res/drawable/ic_remove_circle_outline_black_24dp.xml deleted file mode 100644 index a9e118ffc..000000000 --- a/mifospay/src/main/res/drawable/ic_remove_circle_outline_black_24dp.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_repeat.xml b/mifospay/src/main/res/drawable/ic_repeat.xml deleted file mode 100644 index f413b236e..000000000 --- a/mifospay/src/main/res/drawable/ic_repeat.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_repeat_selector.xml b/mifospay/src/main/res/drawable/ic_repeat_selector.xml deleted file mode 100644 index 6fac0b5ce..000000000 --- a/mifospay/src/main/res/drawable/ic_repeat_selector.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_request.xml b/mifospay/src/main/res/drawable/ic_request.xml deleted file mode 100644 index fdc053093..000000000 --- a/mifospay/src/main/res/drawable/ic_request.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_request_selector.xml b/mifospay/src/main/res/drawable/ic_request_selector.xml deleted file mode 100644 index 616adda63..000000000 --- a/mifospay/src/main/res/drawable/ic_request_selector.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_right_arrow.xml b/mifospay/src/main/res/drawable/ic_right_arrow.xml deleted file mode 100644 index f68f3f5af..000000000 --- a/mifospay/src/main/res/drawable/ic_right_arrow.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_save.xml b/mifospay/src/main/res/drawable/ic_save.xml deleted file mode 100644 index 72297264a..000000000 --- a/mifospay/src/main/res/drawable/ic_save.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_saved_cards.xml b/mifospay/src/main/res/drawable/ic_saved_cards.xml deleted file mode 100644 index 58461dd25..000000000 --- a/mifospay/src/main/res/drawable/ic_saved_cards.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_search.xml b/mifospay/src/main/res/drawable/ic_search.xml deleted file mode 100644 index a9de3da63..000000000 --- a/mifospay/src/main/res/drawable/ic_search.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_send.xml b/mifospay/src/main/res/drawable/ic_send.xml deleted file mode 100644 index 5842a8d27..000000000 --- a/mifospay/src/main/res/drawable/ic_send.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_send_selector.xml b/mifospay/src/main/res/drawable/ic_send_selector.xml deleted file mode 100644 index e7c9f0678..000000000 --- a/mifospay/src/main/res/drawable/ic_send_selector.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_setting.xml b/mifospay/src/main/res/drawable/ic_setting.xml deleted file mode 100644 index adaf75e5d..000000000 --- a/mifospay/src/main/res/drawable/ic_setting.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/ic_share.xml b/mifospay/src/main/res/drawable/ic_share.xml deleted file mode 100644 index 5a08b5b29..000000000 --- a/mifospay/src/main/res/drawable/ic_share.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_tick.xml b/mifospay/src/main/res/drawable/ic_tick.xml deleted file mode 100644 index 9896786da..000000000 --- a/mifospay/src/main/res/drawable/ic_tick.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/ic_transaction.xml b/mifospay/src/main/res/drawable/ic_transaction.xml deleted file mode 100644 index 67034ba01..000000000 --- a/mifospay/src/main/res/drawable/ic_transaction.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - diff --git a/mifospay/src/main/res/drawable/ic_verify.xml b/mifospay/src/main/res/drawable/ic_verify.xml deleted file mode 100644 index 72a380b1a..000000000 --- a/mifospay/src/main/res/drawable/ic_verify.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/layout_rounded_edge.xml b/mifospay/src/main/res/drawable/layout_rounded_edge.xml deleted file mode 100644 index 033749202..000000000 --- a/mifospay/src/main/res/drawable/layout_rounded_edge.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/qrcode_black.xml b/mifospay/src/main/res/drawable/qrcode_black.xml deleted file mode 100644 index 274f795d4..000000000 --- a/mifospay/src/main/res/drawable/qrcode_black.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/qrcode_black_selector.xml b/mifospay/src/main/res/drawable/qrcode_black_selector.xml deleted file mode 100644 index d0b33aeec..000000000 --- a/mifospay/src/main/res/drawable/qrcode_black_selector.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/qrcode_blue.xml b/mifospay/src/main/res/drawable/qrcode_blue.xml deleted file mode 100644 index a84a08aef..000000000 --- a/mifospay/src/main/res/drawable/qrcode_blue.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/qrcode_blue_selector.xml b/mifospay/src/main/res/drawable/qrcode_blue_selector.xml deleted file mode 100644 index bc8be6c54..000000000 --- a/mifospay/src/main/res/drawable/qrcode_blue_selector.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/shape_bottom_sheet_dialog_grip.xml b/mifospay/src/main/res/drawable/shape_bottom_sheet_dialog_grip.xml deleted file mode 100644 index a182bf8d3..000000000 --- a/mifospay/src/main/res/drawable/shape_bottom_sheet_dialog_grip.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/mifospay/src/main/res/drawable/sim_card_selected.xml b/mifospay/src/main/res/drawable/sim_card_selected.xml deleted file mode 100644 index 369a18515..000000000 --- a/mifospay/src/main/res/drawable/sim_card_selected.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/sim_card_unselected.xml b/mifospay/src/main/res/drawable/sim_card_unselected.xml deleted file mode 100644 index 90c592e68..000000000 --- a/mifospay/src/main/res/drawable/sim_card_unselected.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/transfer_failure.xml b/mifospay/src/main/res/drawable/transfer_failure.xml deleted file mode 100644 index cf8068363..000000000 --- a/mifospay/src/main/res/drawable/transfer_failure.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/drawable/transfer_success.xml b/mifospay/src/main/res/drawable/transfer_success.xml deleted file mode 100644 index 736913a81..000000000 --- a/mifospay/src/main/res/drawable/transfer_success.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/mifospay/src/main/res/values/splash.xml b/mifospay/src/main/res/values/splash.xml index 14a51f31a..cf5c6b597 100644 --- a/mifospay/src/main/res/values/splash.xml +++ b/mifospay/src/main/res/values/splash.xml @@ -10,9 +10,10 @@ --> - diff --git a/mifospay/src/main/res/values/themes.xml b/mifospay/src/main/res/values/themes.xml index 6821d923c..d16d98d50 100644 --- a/mifospay/src/main/res/values/themes.xml +++ b/mifospay/src/main/res/values/themes.xml @@ -8,7 +8,7 @@ See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md --> - + diff --git a/settings.gradle.kts b/settings.gradle.kts index 94141b7a7..22ffdf4ae 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,21 +4,13 @@ pluginManagement { gradlePluginPortal() google() mavenCentral() - maven("https://www.jitpack.io") - maven("https://plugins.gradle.org/m2/") } } dependencyResolutionManagement { - - // repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) was removed as it centralized repository configuration in this - // file to ensure that all subprojects use the same repositories. As a result Gradle has deprecated the use of project-level repositories in favor of settings-level repositories, - // leading to warnings or errors if project repositories are still used when RepositoriesMode.FAIL_ON_PROJECT_REPOS is enabled. - // Find the discussion at https://stackoverflow.com/questions/69163511/build-was-configured-to-prefer-settings-repositories-over-project-repositories-b - + repositoriesMode.set(RepositoriesMode.PREFER_PROJECT) repositories { google() mavenCentral() - jcenter() maven("https://www.jitpack.io") maven("https://plugins.gradle.org/m2/") } @@ -39,6 +31,7 @@ include(":core:model") include(":core:datastore-proto") include(":core:analytics") +include(":feature:home") include(":feature:history") include(":feature:receipt") include(":feature:faq") @@ -62,6 +55,6 @@ include(":feature:payments") include(":feature:request-money") include(":feature:upi-setup") include(":feature:qr") -include(":feature:home") + include(":shared") include(":desktop") diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 3f1a7de1e..8ca79392c 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -23,7 +23,7 @@ kotlin { } jvm("desktop"){ - jvmToolchain(17) + jvmToolchain(21) } listOf(