diff --git a/.github/workflows/feature_branch_ci.yml b/.github/workflows/feature_branch_ci.yml index 7d1456878..49117f243 100644 --- a/.github/workflows/feature_branch_ci.yml +++ b/.github/workflows/feature_branch_ci.yml @@ -7,28 +7,180 @@ on: - '!development' - '!master' +concurrency: + group: build-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + pull-requests: write + jobs: - build: - name: Build APK + setup: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + - uses: gradle/actions/setup-gradle@v4 + + - name: Cache Gradle and build outputs + uses: actions/cache@v4 + with: + 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: - - name: Checking out repository - uses: actions/checkout@v4 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + - 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 - # Set up JDK - - name: Set Up JDK 1.8 - uses: actions/setup-java@v1 + - name: Upload Detekt Reports + if: ${{ matrix.check == 'detekt' && steps.run_check.outcome == 'success' }} + uses: actions/upload-artifact@v4 with: - java-version: 11 + name: detekt-reports + path: | + **/build/reports/detekt/detekt.md + + - # 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 - # Build App - - name: Build with Gradle - run: ./gradlew assemble \ No newline at end of file + dependency_guard: + needs: setup + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + + - 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 + 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: + file_pattern: '**/dependencies/*.txt' + disable_globbing: true + commit_message: "🤖 Updates baselines for Dependency Guard" + + 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 testDebug :lint:test :androidApp:lintRelease :lint:lint + + - name: Upload reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-and-lint-reports + path: | + **/build/reports/lint-results-*.html + **/build/test-results/test*UnitTest/**.xml + + + # Add `createProdDebugUnitTestCoverageReport` if we ever add JVM tests for prod + - name: Generate coverage reports for Debug variants (only API 30) + run: ./gradlew createDebugCombinedCoverageReport + + - name: Upload test reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-reports-${{ matrix.api-level }} + path: '**/build/reports/androidTests' + + - name: Display local test coverage (only API 30) + id: jacoco + uses: madrapps/jacoco-report@v1.6.1 + with: + title: Combined test coverage report + min-coverage-overall: 40 + min-coverage-changed-files: 60 + paths: | + ${{ github.workspace }}/**/build/reports/jacoco/**/*Report.xml + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload local coverage reports (XML + HTML) (only API 30) + uses: actions/upload-artifact@v4 + with: + name: coverage-reports + if-no-files-found: error + compression-level: 1 + overwrite: false + path: '**/build/reports/jacoco/' + + build: + needs: [ checks, dependency_guard, tests_and_lint ] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + + - name: Build APKs + run: ./gradlew :androidApp:assembleDebug + + - name: Check badging + run: ./gradlew :androidApp:checkReleaseBadging + + - name: Upload APKs + uses: actions/upload-artifact@v4 + with: + name: APKs + path: '**/build/outputs/apk/**/*.apk' \ No newline at end of file diff --git a/.github/workflows/master_dev_ci.yml b/.github/workflows/master_dev_ci.yml index 8cca27497..99774b93e 100644 --- a/.github/workflows/master_dev_ci.yml +++ b/.github/workflows/master_dev_ci.yml @@ -7,22 +7,24 @@ on: - 'development' - 'master' +concurrency: + group: build-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + pull-requests: write + jobs: - build: - name: Build APK + setup: runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up JDK 17 - uses: actions/setup-java@v4 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: distribution: 'zulu' java-version: 17 - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 + - uses: gradle/actions/setup-gradle@v4 - name: Cache Gradle and build outputs uses: actions/cache@v4 @@ -34,7 +36,151 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: ${{ runner.os }}-gradle- - - name: Build With Gradle - run: ./gradlew assembleDebug + checks: + needs: setup + runs-on: ubuntu-latest + strategy: + matrix: + check: [ build_logic, spotless, detekt ] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + - 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: detekt-reports + path: | + **/build/reports/detekt/detekt.md + + + + + dependency_guard: + needs: setup + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + + - 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 + 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: + file_pattern: '**/dependencies/*.txt' + disable_globbing: true + commit_message: "🤖 Updates baselines for Dependency Guard" + + 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 testDebug :lint:test :androidApp:lintRelease :lint:lint + + - name: Upload reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-and-lint-reports + path: | + **/build/reports/lint-results-*.html + **/build/test-results/test*UnitTest/**.xml + + + # Add `createDebugUnitTestCoverageReport` if we ever add JVM tests for prod + - name: Generate coverage reports for Debug variants (only API 30) + run: ./gradlew createDebugCombinedCoverageReport + + - name: Upload test reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-reports-${{ matrix.api-level }} + path: '**/build/reports/androidTests' + - name: Display local test coverage (only API 30) + id: jacoco + uses: madrapps/jacoco-report@v1.6.1 + with: + title: Combined test coverage report + min-coverage-overall: 40 + min-coverage-changed-files: 60 + paths: | + ${{ github.workspace }}/**/build/reports/jacoco/**/*Report.xml + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload local coverage reports (XML + HTML) (only API 30) + uses: actions/upload-artifact@v4 + with: + name: coverage-reports + if-no-files-found: error + compression-level: 1 + overwrite: false + path: '**/build/reports/jacoco/' + + build: + needs: [ checks, dependency_guard, tests_and_lint ] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + + - name: Build APKs + run: ./gradlew :androidApp:assembleDebug + + - name: Check badging + run: ./gradlew :androidApp:checkReleaseBadging + + - name: Upload APKs + uses: actions/upload-artifact@v4 + with: + name: APKs + path: '**/build/outputs/apk/**/*.apk' diff --git a/.gitignore b/.gitignore index 3c7ee5b81..496785d43 100644 --- a/.gitignore +++ b/.gitignore @@ -26,12 +26,8 @@ build/ .classpath .project -# Windows thumbnail db -.DS_Store - # IDEA/Android Studio project files, because # the project can be imported from settings.gradle.kts -*.iml .idea/* !.idea/copyright # Keep the code styles. @@ -40,8 +36,6 @@ build/ !/.idea/codeStyles/Project.xml !/.idea/codeStyles/codeStyleConfig.xml -# Gradle cache -.gradle # Kotlin .kotlin diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index 50bf3108e..cac320cb6 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -1,27 +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-mobile/blob/master/LICENSE.md + */ plugins { alias(libs.plugins.mifos.android.application) alias(libs.plugins.mifos.android.application.compose) alias(libs.plugins.mifos.android.hilt) alias(libs.plugins.mifos.android.application.firebase) id("com.google.android.gms.oss-licenses-plugin") - id("kotlin-parcelize") alias(libs.plugins.roborazzi) } -apply(from = "../config/quality/quality.gradle") - android { namespace = "org.mifos.mobile" + defaultConfig { - applicationId = "org.mifos.mobile" versionCode = 1 versionName = "1.0" + applicationId = "org.mifos.mobile" vectorDrawables.useSupportLibrary = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + multiDexEnabled = true ndk { abiFilters.addAll(arrayOf("armeabi-v7a", "x86", "x86_64", "arm64-v8a")) } - multiDexEnabled = true } signingConfigs { @@ -42,40 +49,19 @@ android { } } - sourceSets { - val commonTestDir = "src/commonTest/java" - getByName("main"){ - java.srcDir(commonTestDir) - } - getByName("androidTest"){ - java.srcDir(commonTestDir) - } - getByName("test"){ - java.srcDir(commonTestDir) - } - } - buildFeatures { - dataBinding = true - viewBinding = true compose = true buildConfig = true } - - lint { - abortOnError = false - disable.add("InvalidPackage") - } } dependencyGuard { - configuration("debugCompileClasspath") - configuration("debugRuntimeClasspath") - configuration("releaseCompileClasspath") - configuration("releaseRuntimeClasspath") + configuration("releaseRuntimeClasspath"){ + modules = true + tree = true + } } - dependencies { implementation (projects.shared) @@ -108,120 +94,40 @@ dependencies { implementation(projects.feature.auth) implementation(projects.feature.userProfile) - implementation(libs.androidx.legacy.support.v4) - implementation(libs.androidx.lifecycle.ktx) - implementation(libs.androidx.lifecycle.extensions) - implementation(libs.androidx.appcompat) - implementation(libs.material) - implementation(libs.androidx.preference) - - - // DBFlow - implementation(libs.dbflow) - kapt(libs.dbflow.processor) - implementation(libs.dbflow.core) - - implementation(libs.androidx.recyclerview) - implementation(libs.androidx.vectordrawable) - implementation(libs.google.oss.licenses) - -// implementation(libs.simplecropview) + implementation(projects.libs.mifosPasscode) + // Jetpack Compose + implementation(libs.androidx.appcompat) implementation(libs.androidx.activity.ktx) - implementation(libs.androidx.fragment.ktx) - - //Country Code picker -// implementation(libs.ccp) -// implementation(libs.countrycodechooser) - - //Square dependencies - implementation(libs.squareup.retrofit2) { - // exclude Retrofit’s OkHttp peer-dependency module and define your own module import - exclude(module = "okhttp") - } - implementation(libs.squareup.retrofit.adapter.rxjava) - implementation(libs.squareup.retrofit.converter.gson) - implementation(libs.squareup.okhttp) - implementation(libs.squareup.logging.interceptor) - - //rxjava Dependencies - implementation(libs.reactivex.rxjava2.android) - implementation(libs.reactivex.rxjava2) - - //Butter Knife - implementation(libs.jakewharton.butterknife) - implementation(libs.jakewharton.compiler) - - //Annotation library - implementation(libs.androidx.annotation) - - //qr code -// implementation(libs.zxing.core) -// implementation(libs.zxing) - - //sweet error dependency - implementation(libs.sweet.error) - - //mifos passcode - implementation(libs.mifos.passcode) - - //multidex + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.compose.material3) + implementation(libs.androidx.compose.material) + implementation(libs.androidx.compose.foundation) + implementation(libs.androidx.compose.foundation.layout) + implementation(libs.androidx.compose.material.iconsExtended) + implementation(libs.androidx.compose.runtime) + implementation(libs.androidx.compose.ui.tooling.preview) + implementation(libs.androidx.compose.ui.util) + implementation(libs.androidx.lifecycle.runtimeCompose) + implementation(libs.androidx.hilt.navigation.compose) + + implementation(libs.androidx.core.splashscreen) + + implementation(libs.androidx.tracing.ktx) + implementation(libs.androidx.profileinstaller) + implementation(libs.google.oss.licenses) implementation(libs.androidx.multidex) - //TableView -// implementation(libs.tableview) - - //Biometric Authentication - implementation(libs.androidx.biometric) - - // Coroutines - implementation(libs.kotlinx.coroutines.android) - testImplementation(libs.kotlinx.coroutines.test) - - // Unit tests dependencies - testImplementation(libs.junit) - testImplementation(libs.mockito.core) - implementation(libs.mockito.core) - //turbine - testImplementation(libs.turbine) - implementation(libs.mockito.android) - androidTestImplementation((libs.junit)) - androidTestImplementation(libs.mockito.core) - androidTestImplementation(libs.mockito.android) - androidTestImplementation(libs.androidx.annotation) - implementation(libs.androidx.core.testing) - androidTestImplementation(libs.androidx.espresso.contrib) - androidTestImplementation(libs.espresso.core) - androidTestImplementation(libs.androidx.runner) - androidTestImplementation(libs.androidx.rules) - - implementation(libs.uihouse) - - // Jetpack Compose - api(libs.androidx.activity.compose) - api(platform(libs.androidx.compose.bom)) - api(libs.androidx.compose.material3) - api(libs.androidx.compose.material) - api(libs.androidx.compose.foundation) - api(libs.androidx.compose.foundation.layout) - api(libs.androidx.compose.material.iconsExtended) - api(libs.androidx.compose.runtime) - api(libs.androidx.compose.ui.tooling.preview) - api(libs.androidx.compose.ui.util) - api(libs.androidx.lifecycle.runtimeCompose) - debugApi(libs.androidx.compose.ui.tooling) - api(libs.androidx.hilt.navigation.compose) - + testImplementation(projects.core.testing) + testImplementation(libs.hilt.android.testing) + testImplementation(libs.work.testing) - //image cropper - implementation(libs.android.image.cropper) + androidTestImplementation(kotlin("test")) + androidTestImplementation(projects.core.testing) + androidTestImplementation(libs.androidx.test.espresso.core) + androidTestImplementation(libs.androidx.navigation.testing) + androidTestImplementation(libs.hilt.android.testing) - // Google Bar code scanner - implementation(libs.google.app.code.scanner) - - //cameraX - implementation(libs.androidx.camera.camera2) - implementation(libs.androidx.camera.lifecycle) - implementation(libs.androidx.camera.view) - implementation(libs.androidx.camera.core) + debugApi(libs.androidx.compose.ui.tooling) } \ No newline at end of file diff --git a/androidApp/dependencies/releaseRuntimeClasspath.tree.txt b/androidApp/dependencies/releaseRuntimeClasspath.tree.txt new file mode 100644 index 000000000..4ff9ad2bb --- /dev/null +++ b/androidApp/dependencies/releaseRuntimeClasspath.tree.txt @@ -0,0 +1,1630 @@ ++--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 +| +--- org.jetbrains:annotations:13.0 -> 23.0.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0 -> 2.0.20 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 -> 1.9.10 (c) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:2.0.20 (c) ++--- androidx.compose:compose-bom:2024.08.00 +| +--- androidx.compose.foundation:foundation:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.foundation:foundation-layout:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.material:material:1.6.8 (c) +| +--- androidx.compose.material:material-icons-extended:1.6.8 (c) +| +--- androidx.compose.material3:material3:1.2.1 (c) +| +--- androidx.compose.runtime:runtime:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-tooling-preview:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-util:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.runtime:runtime-saveable:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.material3:material3-android:1.2.1 (c) +| +--- androidx.compose.material:material-android:1.6.8 (c) +| +--- androidx.compose.material:material-icons-extended-android:1.6.8 (c) +| +--- androidx.compose.animation:animation:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.animation:animation-core:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.material:material-icons-core:1.6.8 (c) +| +--- androidx.compose.material:material-ripple:1.6.8 (c) +| +--- androidx.compose.ui:ui-graphics:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-text:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.foundation:foundation-layout-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.runtime:runtime-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.runtime:runtime-saveable-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.animation:animation-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.material:material-icons-core-android:1.6.8 (c) +| +--- androidx.compose.material:material-ripple-android:1.6.8 (c) +| +--- androidx.compose.ui:ui-unit:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-geometry:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-util-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.foundation:foundation-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-unit-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-graphics-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-text-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-tooling-preview-android:1.6.8 -> 1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-geometry-android:1.6.8 -> 1.7.0-rc01 (c) +| \--- androidx.compose.animation:animation-core-android:1.6.8 -> 1.7.0-rc01 (c) ++--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 +| \--- androidx.compose.ui:ui-tooling-preview-android:1.7.0-rc01 +| +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 +| | \--- androidx.annotation:annotation-jvm:1.8.1 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 2.0.20 (*) +| +--- androidx.compose.runtime:runtime:1.7.0-rc01 +| | \--- androidx.compose.runtime:runtime-android:1.7.0-rc01 +| | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 2.0.20 (*) +| | +--- androidx.collection:collection:1.4.0 -> 1.4.2 +| | | \--- androidx.collection:collection-jvm:1.4.2 +| | | +--- androidx.annotation:annotation:1.8.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- androidx.collection:collection-ktx:1.4.2 (c) +| | | \--- androidx.collection:collection-ktx:1.3.0 -> 1.4.2 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0 +| | | | +--- org.jetbrains:annotations:23.0.0 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.8.0 (c) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.8.0 (c) +| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0 (c) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.20 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.20 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | \--- androidx.compose.runtime:runtime-saveable:1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui:1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-text:1.7.0-rc01 (c) +| +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (c) +| \--- androidx.compose.ui:ui-util:1.7.0-rc01 (c) ++--- com.google.dagger:hilt-android:2.52 +| +--- com.google.dagger:dagger:2.52 +| | +--- jakarta.inject:jakarta.inject-api:2.0.1 +| | \--- javax.inject:javax.inject:1 +| +--- com.google.dagger:dagger-lint-aar:2.52 +| +--- com.google.dagger:hilt-core:2.52 +| | +--- com.google.dagger:dagger:2.52 (*) +| | +--- 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.1.0 -> 1.8.1 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | +--- androidx.core:core:1.13.0 -> 1.13.1 +| | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.1 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | \--- 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.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.2 -> 2.8.4 +| | | | \--- androidx.lifecycle:lifecycle-runtime-android:2.8.4 +| | | | +--- androidx.annotation:annotation:1.8.0 -> 1.8.1 (*) +| | | | +--- androidx.arch.core:core-common:2.2.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- androidx.arch.core:core-runtime:2.2.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | | \--- 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 -> 1.8.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8: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.profileinstaller:profileinstaller:1.3.1 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | | | +--- androidx.concurrent:concurrent-futures:1.1.0 (*) +| | | | | +--- androidx.startup:startup-runtime:1.1.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | | | \--- androidx.tracing:tracing:1.0.0 -> 1.2.0 +| | | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | | | | \--- androidx.tracing:tracing-ktx:1.2.0 (c) +| | | | | \--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8: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-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.versionedparcelable:versionedparcelable:1.1.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | \--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | \--- 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 -> 1.8.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8: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-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-viewmodel-savedstate:2.6.1 -> 2.8.4 +| | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | +--- androidx.core:core-ktx:1.2.0 -> 1.13.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- androidx.core:core:1.13.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | \--- 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 -> 2.0.20 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8: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-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-viewmodel:2.8.4 (*) +| | | +--- androidx.savedstate:savedstate:1.2.1 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- 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 -> 2.0.20 (*) +| | | | \--- androidx.savedstate:savedstate-ktx:1.2.1 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8: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.profileinstaller:profileinstaller:1.3.1 (*) +| | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | +--- androidx.tracing:tracing:1.0.0 -> 1.2.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | +--- androidx.activity:activity-compose:1.9.1 (c) +| | \--- androidx.activity:activity-ktx:1.9.1 (c) +| +--- androidx.annotation:annotation:1.3.0 -> 1.8.1 (*) +| +--- androidx.annotation:annotation-experimental:1.3.1 -> 1.4.1 (*) +| +--- androidx.fragment:fragment:1.5.1 -> 1.7.1 +| | +--- androidx.activity:activity:1.8.1 -> 1.9.1 (*) +| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | +--- androidx.collection:collection:1.1.0 -> 1.4.2 (*) +| | +--- 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 +| | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | +--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.0.0 -> 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 -> 2.0.20 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8: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-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) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8: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-viewmodel:2.0.0 -> 2.8.4 (*) +| | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | +--- androidx.viewpager:viewpager:1.0.0 +| | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | +--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | | \--- androidx.customview:customview:1.0.0 +| | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | \--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | \--- androidx.fragment:fragment-ktx:1.7.1 (c) +| +--- 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.24 -> 2.0.20 (*) ++--- com.google.firebase:firebase-bom:33.2.0 +| +--- 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.1.0 (c) +| +--- com.google.firebase:firebase-messaging-ktx:24.0.1 (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.1.0 (c) +| +--- com.google.firebase:firebase-messaging:24.0.1 (c) +| +--- com.google.firebase:firebase-config:22.0.0 (c) +| +--- com.google.firebase:firebase-installations:18.0.0 (c) +| \--- com.google.firebase:firebase-encoders:17.0.0 (c) ++--- com.google.firebase:firebase-analytics-ktx -> 22.1.0 +| +--- com.google.firebase:firebase-analytics:22.1.0 +| | +--- com.google.android.gms:play-services-measurement:22.1.0 +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | +--- androidx.legacy:legacy-support-core-utils:1.0.0 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | | +--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | | | +--- androidx.documentfile:documentfile:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | | +--- androidx.loader:loader:1.0.0 (*) +| | | | +--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | | \--- androidx.print:print:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | +--- 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.2 (*) +| | | | +--- androidx.core:core:1.2.0 -> 1.13.1 (*) +| | | | \--- androidx.fragment:fragment:1.1.0 -> 1.7.1 (*) +| | | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | +--- com.google.android.gms:play-services-measurement-base:22.1.0 +| | | | \--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | +--- com.google.android.gms:play-services-measurement-impl:22.1.0 +| | | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | | +--- 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.1 (*) +| | | | | +--- androidx.core:core-ktx:1.8.0 -> 1.13.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 2.0.20 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*) +| | | | | \--- 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.1 (*) +| | | | | +--- 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 -> 2.0.20 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*) +| | | | | \--- 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.1.0 (*) +| | | | +--- 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.1.0 +| | | +--- 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.1.0 (*) +| | | +--- com.google.android.gms:play-services-measurement-sdk-api:22.1.0 +| | | | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | | \--- com.google.android.gms:play-services-measurement-base:22.1.0 (*) +| | | +--- 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.0 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 (*) +| | | | | +--- com.google.android.gms:play-services-tasks:16.0.1 -> 18.2.0 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.20 (*) +| | | | +--- 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.1 (*) +| | | | | \--- 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.1 (*) +| | | | +--- androidx.concurrent:concurrent-futures:1.1.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- 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.10 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.10 -> 2.0.20 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10 -> 2.0.20 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| | | | +--- 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 -> 2.0.20 (*) +| | | +--- 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 -> 2.0.20 (*) +| | \--- com.google.android.gms:play-services-measurement-sdk:22.1.0 +| | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | +--- com.google.android.gms:play-services-measurement-base:22.1.0 (*) +| | \--- com.google.android.gms:play-services-measurement-impl:22.1.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 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 2.0.20 (*) ++--- 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.21.11 +| | +--- 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.10 (*) +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | | \--- com.google.firebase:firebase-encoders:17.0.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | \--- 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 -> 2.0.20 (*) +| | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | +--- 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.10 (*) +| | | +--- com.google.firebase:firebase-installations:18.0.0 (*) +| | | +--- com.google.firebase:firebase-datatransport:19.0.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- com.google.android.datatransport:transport-api:3.1.0 -> 3.2.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- 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.1 (*) +| | | | | | +--- 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.1 (*) +| | | | | | \--- 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.1 (*) +| | | | +--- com.google.android.datatransport:transport-runtime:3.2.0 -> 3.3.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.10 (*) +| | | +--- androidx.datastore:datastore-preferences:1.0.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 2.0.20 (*) +| | | | +--- androidx.datastore:datastore:1.0.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 2.0.20 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.8.0 (*) +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | | | \--- androidx.datastore:datastore-core:1.0.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 2.0.20 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.8.0 (*) +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | \--- androidx.datastore:datastore-preferences-core:1.0.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 2.0.20 (*) +| | | | \--- androidx.datastore:datastore-core:1.0.0 (*) +| | | +--- com.google.android.datatransport:transport-api:3.2.0 (*) +| | | \--- androidx.annotation:annotation:1.5.0 -> 1.8.1 (*) +| | +--- com.google.firebase:firebase-datatransport:18.1.8 -> 19.0.0 (*) +| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | +--- androidx.lifecycle:lifecycle-process:2.3.1 -> 2.8.4 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (*) +| | | +--- androidx.startup:startup-runtime:1.1.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8: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-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) +| | +--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*) +| | +--- com.google.protobuf:protobuf-javalite:3.21.11 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | +--- androidx.appcompat:appcompat:1.2.0 -> 1.7.0 +| | | +--- androidx.activity:activity:1.7.0 -> 1.9.1 (*) +| | | +--- androidx.annotation:annotation:1.3.0 -> 1.8.1 (*) +| | | +--- androidx.appcompat:appcompat-resources:1.7.0 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | | +--- androidx.core:core:1.6.0 -> 1.13.1 (*) +| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | | +--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.4.2 (*) +| | | | +--- 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.2 (*) +| | | | \--- androidx.appcompat:appcompat:1.7.0 (c) +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | +--- 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.1 (*) +| | | +--- androidx.drawerlayout:drawerlayout:1.0.0 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) +| | | | +--- androidx.core:core:1.0.0 -> 1.13.1 (*) +| | | | \--- androidx.customview:customview:1.0.0 (*) +| | | +--- androidx.emoji2:emoji2:1.3.0 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.4.2 (*) +| | | | +--- androidx.core:core:1.3.0 -> 1.13.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-process:2.4.1 -> 2.8.4 (*) +| | | | +--- 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.2 (*) +| | | | +--- 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.7.1 (*) +| | | +--- 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.1 (*) +| | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | \--- androidx.appcompat:appcompat-resources:1.7.0 (c) +| | +--- com.google.android.datatransport:transport-api:3.0.0 -> 3.2.0 (*) +| | +--- com.google.dagger:dagger:2.27 -> 2.52 (*) +| | \--- com.squareup.okhttp3:okhttp:3.12.1 -> 4.12.0 +| | +--- com.squareup.okio:okio:3.6.0 +| | | \--- com.squareup.okio:okio-jvm:3.6.0 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.10 -> 2.0.20 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.10 (*) +| +--- 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.10 (*) +| \--- 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.10 (*) +| | +--- 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.1 (*) +| +--- 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.10 (*) +| \--- com.google.firebase:firebase-components:18.0.0 (*) ++--- com.google.firebase:firebase-messaging-ktx -> 24.0.1 +| +--- com.google.firebase:firebase-messaging:24.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-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.1 (*) +| | +--- 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.5.0 +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | +--- androidx.core:core:1.2.0 -> 1.13.1 (*) +| | | +--- androidx.fragment:fragment:1.0.0 -> 1.7.1 (*) +| | | +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| | | \--- com.google.android.gms:play-services-tasks: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 -> 2.0.20 (*) +| +--- 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.10 (*) +| \--- com.google.firebase:firebase-components:18.0.0 (*) ++--- project :shared +| +--- org.jetbrains.compose.ui:ui-tooling-preview:1.6.11 +| | \--- androidx.compose.ui:ui-tooling-preview:1.6.7 -> 1.7.0-rc01 (*) +| +--- androidx.activity:activity-compose:1.9.1 +| | +--- androidx.activity:activity-ktx: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-runtime-ktx-android:2.8.4 +| | | | +--- androidx.annotation:annotation:1.8.0 -> 1.8.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.4 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8: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-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-viewmodel-ktx:2.6.1 -> 2.8.4 +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.4 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8: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-savedstate: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 -> 2.0.20 (*) +| | | | \--- androidx.savedstate:savedstate:1.2.1 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- androidx.activity:activity:1.9.1 (c) +| | | \--- androidx.activity:activity-compose:1.9.1 (c) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.7.0-rc01 +| | | \--- androidx.compose.runtime:runtime-saveable-android:1.7.0-rc01 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | \--- androidx.compose.runtime:runtime:1.7.0-rc01 (c) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.7.0-rc01 +| | | \--- androidx.compose.ui:ui-android:1.7.0-rc01 +| | | +--- androidx.activity:activity-ktx:1.7.0 -> 1.9.1 (*) +| | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.1 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | +--- androidx.autofill:autofill:1.0.0 +| | | | \--- androidx.core:core:1.1.0 -> 1.13.1 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.2 (*) +| | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | +--- androidx.compose.runtime:runtime-saveable:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 +| | | | \--- androidx.compose.ui:ui-geometry-android:1.7.0-rc01 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 +| | | | | \--- androidx.compose.ui:ui-util-android:1.7.0-rc01 +| | | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | | +--- androidx.compose.ui:ui:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-text:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 (c) +| | | | | \--- androidx.compose.ui:ui-unit:1.7.0-rc01 (c) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- androidx.compose.ui:ui:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-text:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (c) +| | | | \--- androidx.compose.ui:ui-util:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 +| | | | \--- androidx.compose.ui:ui-graphics-android:1.7.0-rc01 +| | | | +--- androidx.annotation:annotation:1.7.0 -> 1.8.1 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 +| | | | | \--- androidx.compose.ui:ui-unit-android:1.7.0-rc01 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | | | +--- androidx.collection:collection-ktx:1.2.0 -> 1.4.2 +| | | | | | +--- androidx.collection:collection:1.4.2 (*) +| | | | | | \--- androidx.collection:collection:1.4.2 (c) +| | | | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (*) +| | | | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | | +--- androidx.compose.ui:ui:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-text:1.7.0-rc01 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 (c) +| | | | | \--- androidx.compose.ui:ui-util:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | +--- androidx.core:core:1.12.0 -> 1.13.1 (*) +| | | | +--- androidx.graphics:graphics-path:1.0.1 +| | | | | +--- androidx.core:core:1.12.0 -> 1.13.1 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- androidx.compose.ui:ui:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-text:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (c) +| | | | \--- androidx.compose.ui:ui-util:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-text:1.7.0-rc01 +| | | | \--- androidx.compose.ui:ui-text-android:1.7.0-rc01 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | | +--- androidx.compose.runtime:runtime-saveable:1.6.0 -> 1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | +--- 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 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | | | +--- androidx.compose.ui:ui:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (c) +| | | | \--- androidx.compose.ui:ui-util:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | +--- androidx.core:core:1.12.0 -> 1.13.1 (*) +| | | +--- 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 -> 2.0.20 (*) +| | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.3 -> 2.8.4 +| | | | \--- androidx.lifecycle:lifecycle-runtime-compose-android:2.8.4 +| | | | +--- androidx.annotation:annotation:1.8.0 -> 1.8.1 (*) +| | | | +--- androidx.compose.runtime:runtime:1.6.5 -> 1.7.0-rc01 (*) +| | | | +--- 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-common-java8:2.8.4 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata: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-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-livedata-core-ktx:2.8.4 (c) +| | | | \--- androidx.lifecycle:lifecycle-livedata-core:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-text:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (c) +| | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (c) +| | | \--- androidx.compose.foundation:foundation:1.7.0-rc01 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.4 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | +--- androidx.activity:activity:1.9.1 (c) +| | \--- androidx.activity:activity-ktx:1.9.1 (c) +| +--- io.insert-koin:koin-android:3.6.0-Beta4 +| | +--- io.insert-koin:koin-core:3.6.0-Beta4 +| | | \--- io.insert-koin:koin-core-jvm:3.6.0-Beta4 +| | | +--- co.touchlab:stately-concurrency:2.0.6 +| | | | \--- co.touchlab:stately-concurrency-jvm:2.0.6 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10 (*) +| | | | \--- co.touchlab:stately-strict:2.0.6 +| | | | \--- co.touchlab:stately-strict-jvm:2.0.6 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10 (*) +| | | +--- co.touchlab:stately-concurrent-collections:2.0.6 +| | | | \--- co.touchlab:stately-concurrent-collections-jvm:2.0.6 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10 (*) +| | | | \--- co.touchlab:stately-concurrency:2.0.6 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.0.20 (*) +| | +--- androidx.appcompat:appcompat:1.6.1 -> 1.7.0 (*) +| | +--- androidx.activity:activity-ktx:1.9.0 -> 1.9.1 (*) +| | +--- androidx.fragment:fragment-ktx:1.7.1 +| | | +--- androidx.activity:activity-ktx:1.8.1 -> 1.9.1 (*) +| | | +--- androidx.collection:collection-ktx:1.1.0 -> 1.4.2 (*) +| | | +--- androidx.core:core-ktx:1.2.0 -> 1.13.1 (*) +| | | +--- androidx.fragment:fragment:1.7.1 (*) +| | | +--- 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.22 -> 2.0.20 (*) +| | | \--- androidx.fragment:fragment:1.7.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.0 -> 2.8.4 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.8.0 -> 2.8.4 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | +--- 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-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-livedata-core:2.8.4 (c) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.0.20 (*) +| +--- io.insert-koin:koin-androidx-compose:3.6.0-Beta4 +| | +--- io.insert-koin:koin-android:3.6.0-Beta4 (*) +| | +--- io.insert-koin:koin-compose:1.2.0-Beta4 +| | | \--- io.insert-koin:koin-compose-jvm:1.2.0-Beta4 +| | | +--- io.insert-koin:koin-core:3.6.0-Beta4 (*) +| | | +--- org.jetbrains.compose.runtime:runtime:1.6.10-rc03 +| | | | \--- androidx.compose.runtime:runtime:1.6.7 -> 1.7.0-rc01 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.0.20 (*) +| | +--- androidx.compose.runtime:runtime:1.6.7 -> 1.7.0-rc01 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.0 -> 2.8.4 +| | | \--- androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.4 +| | | +--- androidx.annotation:annotation:1.8.0 -> 1.8.1 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-rc01 (*) +| | | +--- 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 -> 2.0.20 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.4 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8: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-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-livedata-core:2.8.4 (c) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.0.20 (*) +| +--- io.insert-koin:koin-core:3.6.0-Beta4 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- org.jetbrains.compose.material:material:1.6.11 +| | \--- androidx.compose.material:material:1.6.7 -> 1.6.8 +| | \--- androidx.compose.material:material-android:1.6.8 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | +--- androidx.compose.animation:animation:1.6.8 -> 1.7.0-rc01 +| | | \--- androidx.compose.animation:animation-android:1.7.0-rc01 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | +--- androidx.compose.animation:animation-core:1.7.0-rc01 +| | | | \--- androidx.compose.animation:animation-core-android:1.7.0-rc01 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0 -> 1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*) +| | | | \--- androidx.compose.animation:animation:1.7.0-rc01 (c) +| | | +--- androidx.compose.foundation:foundation-layout:1.6.0 -> 1.7.0-rc01 +| | | | \--- androidx.compose.foundation:foundation-layout-android:1.7.0-rc01 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.7.0-rc01 (*) +| | | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.7.0-rc01 (*) +| | | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | +--- androidx.core:core:1.7.0 -> 1.13.1 (*) +| | | | \--- androidx.compose.foundation:foundation:1.7.0-rc01 (c) +| | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.6.0 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-util:1.7.0-rc01 (*) +| | | \--- androidx.compose.animation:animation-core:1.7.0-rc01 (c) +| | +--- androidx.compose.animation:animation-core:1.6.8 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation:1.6.8 -> 1.7.0-rc01 +| | | \--- androidx.compose.foundation:foundation-android:1.7.0-rc01 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | | +--- androidx.compose.animation:animation:1.7.0-rc01 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.7.0-rc01 (*) +| | | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui:1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-text:1.6.0 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0 -> 1.7.0-rc01 (*) +| | | +--- androidx.core:core:1.13.1 (*) +| | | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | | \--- androidx.compose.foundation:foundation-layout:1.7.0-rc01 (c) +| | +--- androidx.compose.foundation:foundation-layout:1.6.8 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.8 +| | | \--- androidx.compose.material:material-icons-core-android:1.6.8 +| | | +--- androidx.compose.ui:ui:1.6.8 -> 1.7.0-rc01 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | +--- androidx.compose.material:material:1.6.8 (c) +| | | +--- androidx.compose.material:material-icons-extended:1.6.8 (c) +| | | \--- androidx.compose.material:material-ripple:1.6.8 (c) +| | +--- androidx.compose.material:material-ripple:1.6.8 +| | | \--- androidx.compose.material:material-ripple-android:1.6.8 +| | | +--- androidx.compose.animation:animation:1.6.8 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.foundation:foundation:1.6.8 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.8 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.8 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.material:material:1.6.8 (c) +| | | +--- androidx.compose.material:material-icons-core:1.6.8 (c) +| | | \--- androidx.compose.material:material-icons-extended:1.6.8 (c) +| | +--- androidx.compose.runtime:runtime:1.6.8 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui:1.6.8 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-text:1.6.8 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-util:1.6.8 -> 1.7.0-rc01 (*) +| | +--- 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 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.8 (c) +| | +--- androidx.compose.material:material-icons-extended:1.6.8 (c) +| | \--- androidx.compose.material:material-ripple:1.6.8 (c) +| +--- org.jetbrains.compose.material3:material3:1.6.11 +| | \--- 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.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | +--- androidx.collection:collection:1.4.0 -> 1.4.2 (*) +| | +--- androidx.compose.animation:animation-core:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.0 -> 1.6.8 (*) +| | +--- androidx.compose.material:material-ripple:1.6.0 -> 1.6.8 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-graphics:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-text:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0 -> 1.7.0-rc01 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8: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.savedstate:savedstate-ktx:1.2.1 (*) +| +--- io.insert-koin:koin-compose:1.2.0-Beta4 (*) +| \--- io.insert-koin:koin-compose-viewmodel:1.2.0-Beta4 +| \--- io.insert-koin:koin-compose-viewmodel-jvm:1.2.0-Beta4 +| +--- io.insert-koin:koin-compose:1.2.0-Beta4 (*) +| +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.0-rc03 +| | \--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.0 -> 2.8.4 (*) +| +--- org.jetbrains.androidx.navigation:navigation-compose:2.7.0-alpha06 +| | \--- androidx.navigation:navigation-compose:2.7.7 -> 2.8.0-rc01 +| | +--- androidx.activity:activity-compose:1.8.0 -> 1.9.1 (*) +| | +--- androidx.compose.animation:animation:1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.7.0-rc01 (*) +| | +--- androidx.compose.runtime:runtime:1.7.0-rc01 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui:1.7.0-rc01 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2 -> 2.8.4 (*) +| | +--- androidx.navigation:navigation-runtime-ktx:2.8.0-rc01 +| | | +--- androidx.navigation:navigation-common-ktx:2.8.0-rc01 +| | | | +--- androidx.navigation:navigation-common:2.8.0-rc01 +| | | | | +--- androidx.annotation:annotation:1.8.1 (*) +| | | | | +--- androidx.collection:collection-ktx:1.4.2 (*) +| | | | | +--- 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.1 (*) +| | | | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | | +--- 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 -> 2.0.20 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.6.3 +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.6.3 (c) +| | | | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 (c) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.22 -> 2.0.20 (*) +| | | | | +--- androidx.navigation:navigation-common-ktx:2.8.0-rc01 (c) +| | | | | +--- androidx.navigation:navigation-compose:2.8.0-rc01 (c) +| | | | | +--- androidx.navigation:navigation-runtime:2.8.0-rc01 (c) +| | | | | \--- androidx.navigation:navigation-runtime-ktx:2.8.0-rc01 (c) +| | | | +--- androidx.navigation:navigation-common:2.8.0-rc01 (c) +| | | | +--- androidx.navigation:navigation-compose:2.8.0-rc01 (c) +| | | | +--- androidx.navigation:navigation-runtime:2.8.0-rc01 (c) +| | | | \--- androidx.navigation:navigation-runtime-ktx:2.8.0-rc01 (c) +| | | +--- androidx.navigation:navigation-runtime:2.8.0-rc01 +| | | | +--- androidx.activity:activity-ktx:1.7.1 -> 1.9.1 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.4.1 (*) +| | | | +--- androidx.collection:collection:1.4.2 (*) +| | | | +--- 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.8.0-rc01 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 (*) +| | | | +--- androidx.navigation:navigation-common:2.8.0-rc01 (c) +| | | | +--- androidx.navigation:navigation-common-ktx:2.8.0-rc01 (c) +| | | | +--- androidx.navigation:navigation-compose:2.8.0-rc01 (c) +| | | | \--- androidx.navigation:navigation-runtime-ktx:2.8.0-rc01 (c) +| | | +--- androidx.navigation:navigation-common-ktx:2.8.0-rc01 (c) +| | | +--- androidx.navigation:navigation-compose:2.8.0-rc01 (c) +| | | +--- androidx.navigation:navigation-runtime:2.8.0-rc01 (c) +| | | \--- androidx.navigation:navigation-common:2.8.0-rc01 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 (*) +| | +--- androidx.navigation:navigation-runtime-ktx:2.8.0-rc01 (c) +| | +--- androidx.navigation:navigation-runtime:2.8.0-rc01 (c) +| | +--- androidx.navigation:navigation-common-ktx:2.8.0-rc01 (c) +| | \--- androidx.navigation:navigation-common:2.8.0-rc01 (c) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.0.20 (*) ++--- project :core:logs +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- androidx.compose.runtime:runtime -> 1.7.0-rc01 (*) +| +--- com.google.firebase:firebase-bom:33.2.0 (*) +| \--- com.google.firebase:firebase-analytics-ktx -> 22.1.0 (*) ++--- project :core:common +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| \--- com.google.dagger:hilt-android:2.52 (*) ++--- project :core:model +| +--- project :core:common (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.20 (*) +| +--- com.squareup.retrofit2:converter-gson:2.11.0 +| | +--- com.squareup.retrofit2:retrofit:2.11.0 +| | | \--- com.squareup.okhttp3:okhttp:3.14.9 -> 4.12.0 (*) +| | \--- com.google.code.gson:gson:2.10.1 +| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.20 +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| \--- org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.0.20 +| \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) ++--- project :core:data +| +--- project :core:common (*) +| +--- project :core:model (*) +| +--- project :core:network +| | +--- project :core:common (*) +| | +--- project :core:model (*) +| | +--- project :core:datastore +| | | +--- project :core:common (*) +| | | +--- project :core:model (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| | | +--- com.google.dagger:hilt-android:2.52 (*) +| | | +--- com.squareup.retrofit2:converter-gson:2.11.0 (*) +| | | +--- com.github.Raizlabs.DBFlow:dbflow:4.2.4 +| | | | +--- com.github.Raizlabs.DBFlow:dbflow-core:4.2.4 +| | | | \--- com.android.support:support-annotations:26.0.1 -> androidx.annotation:annotation:1.8.1 (*) +| | | +--- com.github.Raizlabs.DBFlow:dbflow-core:4.2.4 +| | | +--- io.reactivex.rxjava2:rxandroid:2.1.1 +| | | | \--- io.reactivex.rxjava2:rxjava:2.2.6 -> 2.2.21 +| | | | \--- org.reactivestreams:reactive-streams:1.0.3 -> 1.0.4 +| | | \--- io.reactivex.rxjava2:rxjava:2.2.21 (*) +| | +--- com.google.dagger:hilt-android:2.52 (*) +| | +--- com.squareup.retrofit2:retrofit:2.11.0 (*) +| | +--- com.squareup.retrofit2:adapter-rxjava2:2.11.0 +| | | +--- com.squareup.retrofit2:retrofit:2.11.0 (*) +| | | +--- io.reactivex.rxjava2:rxjava:2.2.21 (*) +| | | \--- org.reactivestreams:reactive-streams:1.0.4 +| | +--- com.squareup.retrofit2:converter-gson:2.11.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.10 (*) +| | +--- com.squareup.okhttp3:okhttp:4.12.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.20 (*) +| | \--- org.mockito:mockito-core:5.4.0 +| | +--- net.bytebuddy:byte-buddy:1.14.5 +| | +--- net.bytebuddy:byte-buddy-agent:1.14.5 +| | \--- org.objenesis:objenesis:3.3 +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- com.squareup.retrofit2:retrofit:2.11.0 (*) +| +--- com.squareup.okhttp3:okhttp:4.12.0 (*) +| +--- org.mockito:mockito-core:5.4.0 (*) +| +--- app.cash.turbine:turbine:1.1.0 +| | \--- app.cash.turbine:turbine-jvm:1.1.0 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.20 (*) +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0 +| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.8.0 +| | +--- org.jetbrains:annotations:23.0.0 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.20 (*) +| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.20 (*) ++--- project :core:datastore (*) ++--- project :core:ui +| +--- project :core:designsystem +| | +--- androidx.compose.ui:ui -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation-layout -> 1.7.0-rc01 (*) +| | +--- androidx.compose.material:material-icons-extended -> 1.6.8 +| | | \--- androidx.compose.material:material-icons-extended-android:1.6.8 +| | | +--- androidx.compose.material:material-icons-core:1.6.8 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.8 -> 1.7.0-rc01 (*) +| | | +--- androidx.compose.material:material:1.6.8 (c) +| | | +--- androidx.compose.material:material-icons-core:1.6.8 (c) +| | | \--- androidx.compose.material:material-ripple:1.6.8 (c) +| | +--- androidx.compose.material3:material3:1.2.1 (*) +| | +--- androidx.compose.runtime:runtime -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-util -> 1.7.0-rc01 (*) +| | +--- androidx.activity:activity-compose:1.9.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| | +--- androidx.compose:compose-bom:2024.08.00 (*) +| | +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| | \--- com.google.accompanist:accompanist-pager:0.34.0 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0 -> 1.7.0-rc01 (*) +| | +--- dev.chrisbanes.snapper:snapper:0.2.2 +| | | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.7.0-rc01 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10 -> 1.9.10 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.20 (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- androidx.metrics:metrics-performance:1.0.0-beta01 +| | +--- androidx.collection:collection:1.1.0 -> 1.4.2 (*) +| | +--- androidx.core:core:1.5.0 -> 1.13.1 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| \--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) ++--- project :core:designsystem (*) ++--- project :feature:loan +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- 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 -> 2.0.20 (*) +| +--- androidx.hilt:hilt-navigation-compose:1.2.0 +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.7.0-rc01 (*) +| | +--- androidx.hilt:hilt-navigation:1.2.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | +--- androidx.navigation:navigation-runtime:2.5.1 -> 2.8.0-rc01 (*) +| | | +--- com.google.dagger:hilt-android:2.49 -> 2.52 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 -> 2.8.4 (*) +| | +--- androidx.navigation:navigation-compose:2.5.1 -> 2.8.0-rc01 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.20 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- project :core:qrcode +| +--- com.google.zxing:core:3.5.3 +| +--- com.squareup.retrofit2:converter-gson:2.11.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- project :core:model (*) +| +--- androidx.compose.ui:ui -> 1.7.0-rc01 (*) +| +--- androidx.camera:camera-camera2:1.3.4 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | +--- androidx.camera:camera-core:1.3.4 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.4.1 (*) +| | | +--- 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 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.1 (*) +| | | +--- 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 -> 2.0.20 (*) +| | | +--- androidx.camera:camera-camera2:1.3.4 (c) +| | | +--- androidx.camera:camera-lifecycle:1.3.4 (c) +| | | +--- androidx.camera:camera-view:1.3.4 (c) +| | | \--- androidx.camera:camera-video:1.3.4 (c) +| | +--- 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 +| | +--- 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-view:1.3.4 (c) +| | \--- androidx.camera:camera-video: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-camera2:1.3.4 (c) +| | +--- androidx.camera:camera-core:1.3.4 (c) +| | +--- androidx.camera:camera-view:1.3.4 (c) +| | \--- androidx.camera:camera-video:1.3.4 (c) +| +--- androidx.camera:camera-view:1.3.4 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.1 -> 1.4.1 (*) +| | +--- androidx.appcompat:appcompat:1.1.0 -> 1.7.0 (*) +| | +--- androidx.camera:camera-core:1.3.4 (*) +| | +--- androidx.camera:camera-lifecycle:1.3.4 (*) +| | +--- androidx.camera:camera-video:1.3.4 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| | | +--- 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-camera2:1.3.4 (c) +| | | +--- 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-camera2:1.3.4 (c) +| | +--- 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-core:1.3.4 (*) ++--- project :feature:beneficiary +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.squareup.okhttp3:okhttp:4.12.0 (*) ++--- project :feature:guarantor +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.squareup.okhttp3:okhttp:4.12.0 (*) ++--- project :feature:savings +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- project :core:qrcode (*) +| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.20 (*) ++--- project :feature:qr +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- project :core:qrcode (*) +| +--- io.github.mr0xf00:easycrop:0.1.1 +| | +--- androidx.compose:compose-bom:2023.01.00 -> 2024.08.00 (*) +| | +--- androidx.core:core-ktx:1.9.0 -> 1.13.1 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 -> 2.8.4 (*) +| | +--- androidx.activity:activity-compose:1.6.1 -> 1.9.1 (*) +| | +--- androidx.compose.material:material -> 1.6.8 (*) +| | +--- androidx.compose.ui:ui -> 1.7.0-rc01 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 -> 1.9.10 (*) +| +--- com.google.accompanist:accompanist-permissions:0.34.0 +| | +--- androidx.activity:activity-compose:1.7.2 -> 1.9.1 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0 -> 1.7.0-rc01 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.20 (*) +| \--- androidx.camera:camera-core:1.3.4 (*) ++--- project :feature:transfer-process +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.squareup.retrofit2:converter-gson:2.11.0 (*) ++--- project :feature:account +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- project :libs:pullrefresh +| | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| | +--- androidx.compose:compose-bom:2024.08.00 (*) +| | +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| | +--- androidx.compose.animation:animation -> 1.7.0-rc01 (*) +| | +--- androidx.compose.material3:material3:1.2.1 (*) +| | +--- androidx.compose.runtime:runtime -> 1.7.0-rc01 (*) +| | \--- androidx.compose.ui:ui-util -> 1.7.0-rc01 (*) +| \--- com.google.accompanist:accompanist-pager:0.34.0 (*) ++--- project :feature:client-charge +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.github.Raizlabs.DBFlow:dbflow:4.2.4 (*) ++--- project :feature:recent-transaction +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| \--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) ++--- project :feature:third-party-transfer +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.20 (*) ++--- project :feature:help +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| \--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) ++--- project :feature:notification +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- project :core:datastore (*) +| \--- com.github.Raizlabs.DBFlow:dbflow:4.2.4 (*) ++--- project :feature:location +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.google.maps.android:maps-compose:4.4.1 +| +--- androidx.compose:compose-bom:2024.04.00 -> 2024.08.00 (*) +| +--- androidx.core:core-ktx:1.12.0 -> 1.13.1 (*) +| +--- androidx.compose.foundation:foundation -> 1.7.0-rc01 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.23 -> 2.0.20 (*) +| \--- com.google.maps.android:maps-ktx:5.0.0 +| +--- com.google.android.gms:play-services-maps:18.2.0 +| | +--- androidx.fragment:fragment:1.0.0 -> 1.7.1 (*) +| | +--- com.google.android.gms:play-services-base:18.0.1 -> 18.5.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 (*) +| \--- androidx.databinding:viewbinding:7.4.2 +| \--- androidx.annotation:annotation:1.0.0 -> 1.8.1 (*) ++--- project :feature:about +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| \--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) ++--- project :feature:settings +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- androidx.appcompat:appcompat:1.7.0 (*) ++--- project :feature:update-password +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.squareup.okhttp3:okhttp:4.12.0 (*) ++--- project :feature:home +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| \--- com.squareup.okhttp3:okhttp:4.12.0 (*) ++--- project :feature:auth +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- project :libs:country-code-picker +| | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| | +--- androidx.compose:compose-bom:2024.08.00 (*) +| | +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation -> 1.7.0-rc01 (*) +| | +--- androidx.compose.foundation:foundation-layout -> 1.7.0-rc01 (*) +| | +--- androidx.compose.material:material-icons-extended -> 1.6.8 (*) +| | +--- androidx.compose.material3:material3:1.2.1 (*) +| | +--- androidx.compose.runtime:runtime -> 1.7.0-rc01 (*) +| | +--- androidx.compose.ui:ui-util -> 1.7.0-rc01 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| | \--- io.michaelrocks:libphonenumber-android:8.13.35 +| \--- com.squareup.okhttp3:okhttp:4.12.0 (*) ++--- project :feature:user-profile +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- project :core:designsystem (*) +| +--- project :core:ui (*) +| +--- project :core:data (*) +| +--- project :core:model (*) +| +--- project :core:common (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 (*) +| +--- 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.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- com.squareup.okhttp3:okhttp:4.12.0 (*) +| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.20 (*) ++--- project :libs:mifos-passcode +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 (*) +| +--- androidx.compose:compose-bom:2024.08.00 (*) +| +--- androidx.compose.ui:ui-tooling-preview -> 1.7.0-rc01 (*) +| +--- com.google.dagger:hilt-android:2.52 (*) +| +--- androidx.core:core-ktx:1.13.1 (*) +| +--- androidx.compose.foundation:foundation -> 1.7.0-rc01 (*) +| +--- androidx.compose.foundation:foundation-layout -> 1.7.0-rc01 (*) +| +--- androidx.compose.material:material-icons-extended -> 1.6.8 (*) +| +--- androidx.compose.material3:material3:1.2.1 (*) +| +--- androidx.compose.runtime:runtime -> 1.7.0-rc01 (*) +| +--- androidx.compose.ui:ui-util -> 1.7.0-rc01 (*) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 (*) +| +--- androidx.navigation:navigation-compose:2.8.0-rc01 (*) +| \--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) ++--- androidx.appcompat:appcompat:1.7.0 (*) ++--- androidx.activity:activity-ktx:1.9.1 (*) ++--- androidx.activity:activity-compose:1.9.1 (*) ++--- androidx.compose.material3:material3:1.2.1 (*) ++--- androidx.compose.material:material:1.6.8 (*) ++--- androidx.compose.foundation:foundation -> 1.7.0-rc01 (*) ++--- androidx.compose.foundation:foundation-layout -> 1.7.0-rc01 (*) ++--- androidx.compose.material:material-icons-extended -> 1.6.8 (*) ++--- androidx.compose.runtime:runtime -> 1.7.0-rc01 (*) ++--- androidx.compose.ui:ui-util -> 1.7.0-rc01 (*) ++--- androidx.lifecycle:lifecycle-runtime-compose:2.8.4 (*) ++--- androidx.hilt:hilt-navigation-compose:1.2.0 (*) ++--- androidx.core:core-splashscreen:1.0.1 +| +--- androidx.annotation:annotation:1.2.0 -> 1.8.1 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 2.0.20 (*) ++--- androidx.tracing:tracing-ktx:1.2.0 +| +--- androidx.tracing:tracing:1.2.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 2.0.20 (*) +| \--- androidx.tracing:tracing:1.2.0 (c) ++--- androidx.profileinstaller:profileinstaller:1.3.1 (*) ++--- com.google.android.gms:play-services-oss-licenses:17.1.0 +| +--- androidx.appcompat:appcompat:1.0.0 -> 1.7.0 (*) +| +--- androidx.loader:loader:1.0.0 (*) +| +--- com.google.android.gms:play-services-base:18.5.0 (*) +| +--- com.google.android.gms:play-services-basement:18.4.0 (*) +| \--- com.google.android.gms:play-services-tasks:18.2.0 (*) +\--- androidx.multidex:multidex:2.0.1 diff --git a/androidApp/dependencies/releaseRuntimeClasspath.txt b/androidApp/dependencies/releaseRuntimeClasspath.txt new file mode 100644 index 000000000..c1d6603bb --- /dev/null +++ b/androidApp/dependencies/releaseRuntimeClasspath.txt @@ -0,0 +1,278 @@ +:core:common +:core:data +:core:datastore +:core:designsystem +:core:logs +:core:model +:core:network +:core:qrcode +:core:ui +:feature:about +:feature:account +:feature:auth +:feature:beneficiary +:feature:client-charge +:feature:guarantor +:feature:help +:feature:home +:feature:loan +:feature:location +:feature:notification +:feature:qr +:feature:recent-transaction +:feature:savings +:feature:settings +:feature:third-party-transfer +:feature:transfer-process +:feature:update-password +:feature:user-profile +:libs:country-code-picker +:libs:mifos-passcode +:libs:pullrefresh +:shared +androidx.activity:activity-compose:1.9.1 +androidx.activity:activity-ktx:1.9.1 +androidx.activity:activity:1.9.1 +androidx.annotation:annotation-experimental:1.4.1 +androidx.annotation:annotation-jvm:1.8.1 +androidx.annotation:annotation:1.8.1 +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.autofill:autofill:1.0.0 +androidx.camera:camera-camera2:1.3.4 +androidx.camera:camera-core:1.3.4 +androidx.camera:camera-lifecycle:1.3.4 +androidx.camera:camera-video:1.3.4 +androidx.camera:camera-view:1.3.4 +androidx.collection:collection-jvm:1.4.2 +androidx.collection:collection-ktx:1.4.2 +androidx.collection:collection:1.4.2 +androidx.compose.animation:animation-android:1.7.0-rc01 +androidx.compose.animation:animation-core-android:1.7.0-rc01 +androidx.compose.animation:animation-core:1.7.0-rc01 +androidx.compose.animation:animation:1.7.0-rc01 +androidx.compose.foundation:foundation-android:1.7.0-rc01 +androidx.compose.foundation:foundation-layout-android:1.7.0-rc01 +androidx.compose.foundation:foundation-layout:1.7.0-rc01 +androidx.compose.foundation:foundation:1.7.0-rc01 +androidx.compose.material3:material3-android:1.2.1 +androidx.compose.material3:material3:1.2.1 +androidx.compose.material:material-android:1.6.8 +androidx.compose.material:material-icons-core-android:1.6.8 +androidx.compose.material:material-icons-core:1.6.8 +androidx.compose.material:material-icons-extended-android:1.6.8 +androidx.compose.material:material-icons-extended:1.6.8 +androidx.compose.material:material-ripple-android:1.6.8 +androidx.compose.material:material-ripple:1.6.8 +androidx.compose.material:material:1.6.8 +androidx.compose.runtime:runtime-android:1.7.0-rc01 +androidx.compose.runtime:runtime-saveable-android:1.7.0-rc01 +androidx.compose.runtime:runtime-saveable:1.7.0-rc01 +androidx.compose.runtime:runtime:1.7.0-rc01 +androidx.compose.ui:ui-android:1.7.0-rc01 +androidx.compose.ui:ui-geometry-android:1.7.0-rc01 +androidx.compose.ui:ui-geometry:1.7.0-rc01 +androidx.compose.ui:ui-graphics-android:1.7.0-rc01 +androidx.compose.ui:ui-graphics:1.7.0-rc01 +androidx.compose.ui:ui-text-android:1.7.0-rc01 +androidx.compose.ui:ui-text:1.7.0-rc01 +androidx.compose.ui:ui-tooling-preview-android:1.7.0-rc01 +androidx.compose.ui:ui-tooling-preview:1.7.0-rc01 +androidx.compose.ui:ui-unit-android:1.7.0-rc01 +androidx.compose.ui:ui-unit:1.7.0-rc01 +androidx.compose.ui:ui-util-android:1.7.0-rc01 +androidx.compose.ui:ui-util:1.7.0-rc01 +androidx.compose.ui:ui:1.7.0-rc01 +androidx.compose:compose-bom:2024.08.00 +androidx.concurrent:concurrent-futures:1.1.0 +androidx.core:core-ktx:1.13.1 +androidx.core:core-splashscreen:1.0.1 +androidx.core:core:1.13.1 +androidx.cursoradapter:cursoradapter:1.0.0 +androidx.customview:customview-poolingcontainer:1.0.0 +androidx.customview:customview:1.0.0 +androidx.databinding:viewbinding:7.4.2 +androidx.datastore:datastore-core:1.0.0 +androidx.datastore:datastore-preferences-core:1.0.0 +androidx.datastore:datastore-preferences:1.0.0 +androidx.datastore:datastore:1.0.0 +androidx.documentfile:documentfile:1.0.0 +androidx.drawerlayout:drawerlayout:1.0.0 +androidx.emoji2:emoji2-views-helper:1.3.0 +androidx.emoji2:emoji2:1.3.0 +androidx.exifinterface:exifinterface:1.3.2 +androidx.fragment:fragment-ktx:1.7.1 +androidx.fragment:fragment:1.7.1 +androidx.graphics:graphics-path:1.0.1 +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-utils: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 +androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.4 +androidx.lifecycle:lifecycle-livedata-core:2.8.4 +androidx.lifecycle:lifecycle-livedata:2.8.4 +androidx.lifecycle:lifecycle-process:2.8.4 +androidx.lifecycle:lifecycle-runtime-android:2.8.4 +androidx.lifecycle:lifecycle-runtime-compose-android:2.8.4 +androidx.lifecycle:lifecycle-runtime-compose:2.8.4 +androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.4 +androidx.lifecycle:lifecycle-runtime-ktx:2.8.4 +androidx.lifecycle:lifecycle-runtime:2.8.4 +androidx.lifecycle:lifecycle-viewmodel-android:2.8.4 +androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.4 +androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4 +androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4 +androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4 +androidx.lifecycle:lifecycle-viewmodel:2.8.4 +androidx.loader:loader:1.0.0 +androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 +androidx.metrics:metrics-performance:1.0.0-beta01 +androidx.multidex:multidex:2.0.1 +androidx.navigation:navigation-common-ktx:2.8.0-rc01 +androidx.navigation:navigation-common:2.8.0-rc01 +androidx.navigation:navigation-compose:2.8.0-rc01 +androidx.navigation:navigation-runtime-ktx:2.8.0-rc01 +androidx.navigation:navigation-runtime:2.8.0-rc01 +androidx.print:print:1.0.0 +androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05 +androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 +androidx.profileinstaller:profileinstaller:1.3.1 +androidx.resourceinspection:resourceinspection-annotation:1.0.1 +androidx.savedstate:savedstate-ktx:1.2.1 +androidx.savedstate:savedstate:1.2.1 +androidx.startup:startup-runtime:1.1.1 +androidx.tracing:tracing-ktx:1.2.0 +androidx.tracing:tracing:1.2.0 +androidx.vectordrawable:vectordrawable-animated:1.1.0 +androidx.vectordrawable:vectordrawable:1.1.0 +androidx.versionedparcelable:versionedparcelable:1.1.1 +androidx.viewpager:viewpager:1.0.0 +app.cash.turbine:turbine-jvm:1.1.0 +app.cash.turbine:turbine:1.1.0 +co.touchlab:stately-concurrency-jvm:2.0.6 +co.touchlab:stately-concurrency:2.0.6 +co.touchlab:stately-concurrent-collections-jvm:2.0.6 +co.touchlab:stately-concurrent-collections:2.0.6 +co.touchlab:stately-strict-jvm:2.0.6 +co.touchlab:stately-strict:2.0.6 +com.github.Raizlabs.DBFlow:dbflow-core:4.2.4 +com.github.Raizlabs.DBFlow:dbflow:4.2.4 +com.google.accompanist:accompanist-pager:0.34.0 +com.google.accompanist:accompanist-permissions:0.34.0 +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 +com.google.android.gms:play-services-ads-identifier:18.0.0 +com.google.android.gms:play-services-base:18.5.0 +com.google.android.gms:play-services-basement:18.4.0 +com.google.android.gms:play-services-cloud-messaging:17.2.0 +com.google.android.gms:play-services-maps:18.2.0 +com.google.android.gms:play-services-measurement-api:22.1.0 +com.google.android.gms:play-services-measurement-base:22.1.0 +com.google.android.gms:play-services-measurement-impl:22.1.0 +com.google.android.gms:play-services-measurement-sdk-api:22.1.0 +com.google.android.gms:play-services-measurement-sdk:22.1.0 +com.google.android.gms:play-services-measurement:22.1.0 +com.google.android.gms:play-services-oss-licenses:17.1.0 +com.google.android.gms:play-services-stats:17.0.2 +com.google.android.gms:play-services-tasks:18.2.0 +com.google.auto.value:auto-value-annotations:1.6.3 +com.google.code.findbugs:jsr305:3.0.2 +com.google.code.gson:gson:2.10.1 +com.google.dagger:dagger-lint-aar:2.52 +com.google.dagger:dagger:2.52 +com.google.dagger:hilt-android:2.52 +com.google.dagger:hilt-core:2.52 +com.google.errorprone:error_prone_annotations:2.26.0 +com.google.firebase:firebase-abt:21.1.1 +com.google.firebase:firebase-analytics-ktx:22.1.0 +com.google.firebase:firebase-analytics:22.1.0 +com.google.firebase:firebase-annotations:16.2.0 +com.google.firebase:firebase-bom:33.2.0 +com.google.firebase:firebase-common-ktx:21.0.0 +com.google.firebase:firebase-common:21.0.0 +com.google.firebase:firebase-components:18.0.0 +com.google.firebase:firebase-config-interop:16.0.1 +com.google.firebase:firebase-config:22.0.0 +com.google.firebase:firebase-crashlytics-ktx:19.0.3 +com.google.firebase:firebase-crashlytics:19.0.3 +com.google.firebase:firebase-datatransport:19.0.0 +com.google.firebase:firebase-encoders-json:18.0.1 +com.google.firebase:firebase-encoders-proto:16.0.0 +com.google.firebase:firebase-encoders:17.0.0 +com.google.firebase:firebase-iid-interop:17.1.0 +com.google.firebase:firebase-installations-interop:17.2.0 +com.google.firebase:firebase-installations:18.0.0 +com.google.firebase:firebase-measurement-connector:20.0.1 +com.google.firebase:firebase-messaging-ktx:24.0.1 +com.google.firebase:firebase-messaging:24.0.1 +com.google.firebase:firebase-perf-ktx:21.0.1 +com.google.firebase:firebase-perf:21.0.1 +com.google.firebase:firebase-sessions:2.0.3 +com.google.firebase:protolite-well-known-types:18.0.0 +com.google.guava:failureaccess:1.0.1 +com.google.guava:guava:31.1-android +com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava +com.google.j2objc:j2objc-annotations:1.3 +com.google.maps.android:maps-compose:4.4.1 +com.google.maps.android:maps-ktx:5.0.0 +com.google.protobuf:protobuf-javalite:3.21.11 +com.google.zxing:core:3.5.3 +com.squareup.okhttp3:logging-interceptor:4.12.0 +com.squareup.okhttp3:okhttp:4.12.0 +com.squareup.okio:okio-jvm:3.6.0 +com.squareup.okio:okio:3.6.0 +com.squareup.retrofit2:adapter-rxjava2:2.11.0 +com.squareup.retrofit2:converter-gson:2.11.0 +com.squareup.retrofit2:retrofit:2.11.0 +dev.chrisbanes.snapper:snapper:0.2.2 +io.github.mr0xf00:easycrop:0.1.1 +io.insert-koin:koin-android:3.6.0-Beta4 +io.insert-koin:koin-androidx-compose:3.6.0-Beta4 +io.insert-koin:koin-compose-jvm:1.2.0-Beta4 +io.insert-koin:koin-compose-viewmodel-jvm:1.2.0-Beta4 +io.insert-koin:koin-compose-viewmodel:1.2.0-Beta4 +io.insert-koin:koin-compose:1.2.0-Beta4 +io.insert-koin:koin-core-jvm:3.6.0-Beta4 +io.insert-koin:koin-core:3.6.0-Beta4 +io.michaelrocks:libphonenumber-android:8.13.35 +io.reactivex.rxjava2:rxandroid:2.1.1 +io.reactivex.rxjava2:rxjava:2.2.21 +jakarta.inject:jakarta.inject-api:2.0.1 +javax.inject:javax.inject:1 +net.bytebuddy:byte-buddy-agent:1.14.5 +net.bytebuddy:byte-buddy:1.14.5 +org.checkerframework:checker-qual:3.12.0 +org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.0-rc03 +org.jetbrains.androidx.navigation:navigation-compose:2.7.0-alpha06 +org.jetbrains.compose.material3:material3:1.6.11 +org.jetbrains.compose.material:material:1.6.11 +org.jetbrains.compose.runtime:runtime:1.6.10-rc03 +org.jetbrains.compose.ui:ui-tooling-preview:1.6.11 +org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.0.20 +org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.20 +org.jetbrains.kotlin:kotlin-stdlib-common:2.0.20 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.20 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10 +org.jetbrains.kotlin:kotlin-stdlib:2.0.20 +org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.7 +org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7 +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-bom:1.6.3 +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.6.3 +org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 +org.jetbrains:annotations:23.0.0 +org.mockito:mockito-core:5.4.0 +org.objenesis:objenesis:3.3 +org.reactivestreams:reactive-streams:1.0.4 diff --git a/androidApp/lint-baseline.xml b/androidApp/lint-baseline.xml new file mode 100644 index 000000000..230ed0be7 --- /dev/null +++ b/androidApp/lint-baseline.xml @@ -0,0 +1,46876 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/androidApp/release-badging.txt b/androidApp/release-badging.txt new file mode 100644 index 000000000..1bda46167 --- /dev/null +++ b/androidApp/release-badging.txt @@ -0,0 +1,138 @@ +package: name='org.mifos.mobile' versionCode='1' versionName='1.0' platformBuildVersionName='14' platformBuildVersionCode='34' compileSdkVersion='34' compileSdkVersionCodename='14' +sdkVersion:'26' +targetSdkVersion:'34' +uses-permission: name='android.permission.INTERNET' +uses-permission: name='android.permission.READ_MEDIA_IMAGES' +uses-permission: name='android.permission.CAMERA' +uses-permission: name='android.permission.READ_PHONE_STATE' +uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' +uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' +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' +uses-permission: name='com.google.android.gms.permission.AD_ID' +uses-permission: name='android.permission.ACCESS_ADSERVICES_ATTRIBUTION' +uses-permission: name='android.permission.ACCESS_ADSERVICES_AD_ID' +uses-permission: name='com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE' +uses-permission: name='org.mifos.mobile.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION' +application-label:'Mifos Mobile' +application-label-af:'Mifos Mobile' +application-label-am:'Mifos Mobile' +application-label-ar:'ميفوس موبايل' +application-label-as:'Mifos Mobile' +application-label-az:'Mifos Mobile' +application-label-be:'Mifos Mobile' +application-label-bg:'Mifos Mobile' +application-label-bn:'Mifos Mobile' +application-label-bs:'Mifos Mobile' +application-label-ca:'Mifos Mobile' +application-label-cs:'Mifos Mobile' +application-label-da:'Mifos Mobile' +application-label-de:'Mifos Mobile' +application-label-el:'Mifos Mobile' +application-label-en-AU:'Mifos Mobile' +application-label-en-CA:'Mifos Mobile' +application-label-en-GB:'Mifos Mobile' +application-label-en-IN:'Mifos Mobile' +application-label-en-XC:'Mifos Mobile' +application-label-es:'Mifos Mobile' +application-label-es-US:'Mifos Mobile' +application-label-et:'Mifos Mobile' +application-label-eu:'Mifos Mobile' +application-label-fa:'Mifos Mobile' +application-label-fa-AF:'Mifos Mobile' +application-label-fi:'Mifos Mobile' +application-label-fr:'Mifos Mobile' +application-label-fr-CA:'Mifos Mobile' +application-label-gl:'Mifos Mobile' +application-label-gu:'Mifos Mobile' +application-label-hi:'Mifos Mobile' +application-label-hr:'Mifos Mobile' +application-label-hu:'Mifos Mobile' +application-label-hy:'Mifos Mobile' +application-label-in:'Mifos Mobile' +application-label-is:'Mifos Mobile' +application-label-it:'Mifos Mobile' +application-label-it-IT:'Mifos Mobile' +application-label-iw:'Mifos Mobile' +application-label-ja:'Mifos Mobile' +application-label-ka:'Mifos Mobile' +application-label-kk:'Mifos Mobile' +application-label-km:'Mifos Mobile' +application-label-kn:'Mifos Mobile' +application-label-ko:'Mifos Mobile' +application-label-ky:'Mifos Mobile' +application-label-lo:'Mifos Mobile' +application-label-lt:'Mifos Mobile' +application-label-lv:'Mifos Mobile' +application-label-mk:'Mifos Mobile' +application-label-ml:'Mifos Mobile' +application-label-mn:'Mifos Mobile' +application-label-mr:'Mifos Mobile' +application-label-ms:'Mifos Mobile' +application-label-my:'Mifos မိုဘိုင်း' +application-label-nb:'Mifos Mobile' +application-label-ne:'Mifos Mobile' +application-label-nl:'Mifos Mobile' +application-label-or:'Mifos Mobile' +application-label-pa:'Mifos Mobile' +application-label-pl:'Mifos Mobile' +application-label-pt:'Mifos Mobile' +application-label-pt-BR:'Mifos Mobile' +application-label-pt-PT:'Mifos Mobile' +application-label-ro:'Mifos Mobile' +application-label-ru:'Mifos Mobile' +application-label-ru-RU:'Mifos Mobile' +application-label-si:'Mifos Mobile' +application-label-sk:'Mifos Mobile' +application-label-sl:'Mifos Mobile' +application-label-so:'Mifos Mobile' +application-label-sq:'Mifos Mobile' +application-label-sr:'Mifos Mobile' +application-label-sr-Latn:'Mifos Mobile' +application-label-sv:'Mifos Mobile' +application-label-sw:'Mifos Mobile' +application-label-ta:'Mifos Mobile' +application-label-te:'Mifos Mobile' +application-label-th:'Mifos Mobile' +application-label-tl:'Mifos Mobile' +application-label-tr:'Mifos Mobile' +application-label-tr-TR:'Mifos Mobile' +application-label-uk:'Mifos Mobile' +application-label-ur:'Mifos موبائل' +application-label-uz:'Mifos Mobile' +application-label-vi:'Mifos Mobile' +application-label-zh:'Mifos Mobile' +application-label-zh-CN:'Mifos Mobile' +application-label-zh-HK:'Mifos Mobile' +application-label-zh-TW:'Mifos Mobile' +application-label-zu:'Mifos Mobile' +application-icon-120:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-160:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-240:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-320:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-480:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-640:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-65534:'res/mipmap-anydpi-v26/ic_launcher.xml' +application: label='Mifos Mobile' icon='res/mipmap-anydpi-v26/ic_launcher.xml' +launchable-activity: name='org.mifos.mobile.HomeActivity' label='' icon='' +uses-library-not-required:'org.apache.http.legacy' +property: name='android.adservices.AD_SERVICES_CONFIG' resource='res/xml/ga_ad_services_config.xml' +uses-library-not-required:'android.ext.adservices' +feature-group: label='' + uses-gl-es: '0x20000' + uses-feature-not-required: name='android.hardware.camera' + uses-feature: name='android.hardware.camera.any' + uses-feature: name='android.hardware.faketouch' + uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' +main +other-activities +other-receivers +other-services +supports-screens: 'small' 'normal' 'large' 'xlarge' +supports-any-density: 'true' +locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fa-AF' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'it-IT' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' '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-v7a' 'x86' 'x86_64' diff --git a/androidApp/src/androidTest/java/org/mifos/mobile/ApplicationTest.kt b/androidApp/src/androidTest/kotlin/org/mifos/mobile/ApplicationTest.kt similarity index 63% rename from androidApp/src/androidTest/java/org/mifos/mobile/ApplicationTest.kt rename to androidApp/src/androidTest/kotlin/org/mifos/mobile/ApplicationTest.kt index ed59a89a4..fed7a4073 100644 --- a/androidApp/src/androidTest/java/org/mifos/mobile/ApplicationTest.kt +++ b/androidApp/src/androidTest/kotlin/org/mifos/mobile/ApplicationTest.kt @@ -1,3 +1,12 @@ +/* + * 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-mobile/blob/master/LICENSE.md + */ package org.mifos.mobile import androidx.test.InstrumentationRegistry diff --git a/androidApp/src/debug/res/values/api_keys.xml b/androidApp/src/debug/res/values/api_keys.xml deleted file mode 100644 index ac8673992..000000000 --- a/androidApp/src/debug/res/values/api_keys.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - AIzaSyBbeT2BaMWLj-lReCgYoNmXs_TIyRLr9qQ - - diff --git a/androidApp/src/main/AndroidManifest.xml b/androidApp/src/main/AndroidManifest.xml index 5789de63f..59800427c 100644 --- a/androidApp/src/main/AndroidManifest.xml +++ b/androidApp/src/main/AndroidManifest.xml @@ -1,7 +1,15 @@ + + xmlns:tools="http://schemas.android.com/tools"> + + @@ -18,53 +28,32 @@ - - - - - - - - + android:theme="@style/Theme.MifosSplash"> + android:theme="@style/Theme.MifosSplash" + android:windowSoftInputMode="adjustPan"> - - + + + + - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/ic_launcher-playstore.png b/androidApp/src/main/ic_launcher-playstore.png new file mode 100644 index 000000000..a09ac89ad Binary files /dev/null and b/androidApp/src/main/ic_launcher-playstore.png differ diff --git a/androidApp/src/main/java/org/mifos/mobile/MifosSelfServiceApp.kt b/androidApp/src/main/java/org/mifos/mobile/MifosSelfServiceApp.kt deleted file mode 100644 index 53cf8ec12..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/MifosSelfServiceApp.kt +++ /dev/null @@ -1,51 +0,0 @@ -package org.mifos.mobile - -import android.content.Context -import android.content.res.Configuration -import androidx.appcompat.app.AppCompatDelegate -import androidx.multidex.MultiDex -import androidx.multidex.MultiDexApplication -import com.google.firebase.crashlytics.FirebaseCrashlytics -import com.raizlabs.android.dbflow.config.FlowConfig -import com.raizlabs.android.dbflow.config.FlowManager -import dagger.hilt.android.HiltAndroidApp -import org.mifos.mobile.core.common.utils.LanguageHelper.onAttach -import org.mifos.mobile.core.datastore.PreferencesHelper -import org.mifos.mobile.feature.settings.applySavedTheme - -/** - * @author ishan - * @since 08/07/16 - */ -@HiltAndroidApp -class MifosSelfServiceApp : MultiDexApplication() { - - companion object { - private var instance: MifosSelfServiceApp? = null - operator fun get(context: Context): MifosSelfServiceApp { - return context.applicationContext as MifosSelfServiceApp - } - - val context: Context? - get() = instance - - init { - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) - } - } - - override fun onCreate() { - super.onCreate() - MultiDex.install(this) - FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true) - instance = this - FlowManager.init(FlowConfig.Builder(this).build()) - PreferencesHelper(this).applySavedTheme() - } - - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - context?.let { onAttach(it) } - } - -} diff --git a/androidApp/src/main/java/org/mifos/mobile/di/ApplicationModule.kt b/androidApp/src/main/java/org/mifos/mobile/di/ApplicationModule.kt deleted file mode 100644 index c94097198..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/di/ApplicationModule.kt +++ /dev/null @@ -1,82 +0,0 @@ -package org.mifos.mobile.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.mifos.mobile.core.datastore.DatabaseHelper -import org.mifos.mobile.core.datastore.PreferencesHelper -import org.mifos.mobile.core.network.BaseApiManager -import org.mifos.mobile.core.network.DataManager -import org.mifos.mobile.core.network.services.AuthenticationService -import org.mifos.mobile.core.network.services.BeneficiaryService -import org.mifos.mobile.core.network.services.ClientChargeService -import org.mifos.mobile.core.network.services.ClientService -import org.mifos.mobile.core.network.services.GuarantorService -import org.mifos.mobile.core.network.services.LoanAccountsListService -import org.mifos.mobile.core.network.services.NotificationService -import org.mifos.mobile.core.network.services.RecentTransactionsService -import org.mifos.mobile.core.network.services.RegistrationService -import org.mifos.mobile.core.network.services.SavingAccountsListService -import org.mifos.mobile.core.network.services.ThirdPartyTransferService -import org.mifos.mobile.core.network.services.UserDetailsService -import javax.inject.Singleton - -/** - * @author ishan - * @since 08/07/16 - */ -@Module -@InstallIn(SingletonComponent::class) -object ApplicationModule { - - @Provides - @Singleton - fun providePrefManager(@ApplicationContext context: Context?): PreferencesHelper { - return PreferencesHelper(context) - } - - @Provides - @Singleton - fun provideBaseApiManager( - authenticationService: AuthenticationService, - clientsService: ClientService, - savingAccountsListService: SavingAccountsListService, - loanAccountsListService: LoanAccountsListService, - recentTransactionsService: RecentTransactionsService, - clientChargeService: ClientChargeService, - beneficiaryService: BeneficiaryService, - thirdPartyTransferService: ThirdPartyTransferService, - registrationService: RegistrationService, - notificationService: NotificationService, - userDetailsService: UserDetailsService, - guarantorService: GuarantorService - ): BaseApiManager { - return BaseApiManager( - authenticationService, - clientsService, - savingAccountsListService, - loanAccountsListService, - recentTransactionsService, - clientChargeService, - beneficiaryService, - thirdPartyTransferService, - registrationService, - notificationService, - userDetailsService, - guarantorService - ) - } - - @Provides - @Singleton - fun providesDataManager( - preferencesHelper: PreferencesHelper, - baseApiManager: BaseApiManager, - databaseHelper: DatabaseHelper - ): DataManager { - return DataManager(preferencesHelper, baseApiManager, databaseHelper) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/activities/BiometricAuthentication.kt b/androidApp/src/main/java/org/mifos/mobile/ui/activities/BiometricAuthentication.kt deleted file mode 100644 index 33bb6ae89..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/activities/BiometricAuthentication.kt +++ /dev/null @@ -1,78 +0,0 @@ -package org.mifos.mobile.ui.activities - -import android.content.Intent -import android.os.Build -import android.provider.Settings -import android.provider.Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED -import androidx.activity.result.ActivityResultLauncher -import androidx.biometric.BiometricManager -import androidx.biometric.BiometricPrompt -import androidx.core.content.ContextCompat -import androidx.fragment.app.FragmentActivity -import org.mifos.mobile.R -import org.mifos.mobile.core.model.enums.BiometricCapability - -open class BiometricAuthentication( - val context: FragmentActivity, -) { - private val executor = ContextCompat.getMainExecutor(context) - private val callback = object : BiometricPrompt.AuthenticationCallback() { - - override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { - super.onAuthenticationSucceeded(result) - val intent = Intent(context, HomeActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) - context.startActivity(intent) - context.finish() - } - } - - private val biometricPrompt = BiometricPrompt(context, executor, callback) - - fun launchBiometricEnrollment(resultLauncher: ActivityResultLauncher) { - val intent: Intent = when { - Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> { - Intent(Settings.ACTION_BIOMETRIC_ENROLL).putExtra( - EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED, - BiometricManager.Authenticators.BIOMETRIC_STRONG or BiometricManager.Authenticators.BIOMETRIC_WEAK, - ) - } - - Build.VERSION.SDK_INT >= Build.VERSION_CODES.P -> { - Intent(Settings.ACTION_FINGERPRINT_ENROLL) - } - - else -> { - Intent(Settings.ACTION_SECURITY_SETTINGS) - } - } - resultLauncher.launch(intent) - } - - fun getBiometricCapabilities(): BiometricCapability { - val biometricManager = BiometricManager.from(context) - return when (biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.DEVICE_CREDENTIAL)) { - BiometricManager.BIOMETRIC_SUCCESS -> { - BiometricCapability.HAS_BIOMETRIC_AUTH - } - - BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> { - BiometricCapability.NOT_ENROLLED - } - - else -> { - BiometricCapability.NOT_SUPPORTED - } - } - } - - fun authenticateWithBiometrics() { - val promptInfo = BiometricPrompt.PromptInfo.Builder().apply { - setTitle(context.getString(R.string.sign_in_fingerprint)) - setDescription(context.getString(R.string.scan_your_fingerprint)) - setAllowedAuthenticators(BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.DEVICE_CREDENTIAL) - }.build() - - biometricPrompt.authenticate(promptInfo) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/activities/HomeActivity.kt b/androidApp/src/main/java/org/mifos/mobile/ui/activities/HomeActivity.kt deleted file mode 100644 index fa54a0662..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/activities/HomeActivity.kt +++ /dev/null @@ -1,135 +0,0 @@ -package org.mifos.mobile.ui.activities - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import android.os.Bundle -import android.os.Handler -import android.util.Log -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge -import androidx.activity.viewModels -import androidx.localbroadcastmanager.content.LocalBroadcastManager -import androidx.navigation.NavHostController -import androidx.navigation.compose.rememberNavController -import com.google.android.gms.common.ConnectionResult -import com.google.android.gms.common.GoogleApiAvailability -import dagger.hilt.android.AndroidEntryPoint -import org.mifos.mobile.R -import org.mifos.mobile.core.common.Constants -import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme -import org.mifos.mobile.feature.home.navigation.HomeNavigation -import org.mifos.mobile.feature.user.profile.viewmodel.UserDetailViewModel -import org.mifos.mobile.navigation.RootNavGraph -import org.mifos.mobile.utils.Toaster -import org.mifos.mobile.utils.fcm.RegistrationIntentService - -/** - * @author Vishwajeet - * @since 14/07/2016 - */ -@AndroidEntryPoint -class HomeActivity : ComponentActivity() { - - private val viewModel: UserDetailViewModel by viewModels() - private var isReceiverRegistered = false - private var doubleBackToExitPressedOnce = false - private lateinit var navHostController: NavHostController - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - if (checkPlayServices()) { - // Start IntentService to register this application with GCM. - val intent = Intent(this, RegistrationIntentService::class.java) - startService(intent) - } - - enableEdgeToEdge() - setContent { - MifosMobileTheme { - navHostController = rememberNavController() - RootNavGraph( - startDestination = HomeNavigation.HomeBase.route, - navController = navHostController, - ) - } - } - } - - override fun onPause() { - LocalBroadcastManager.getInstance(this).unregisterReceiver(registerReceiver) - isReceiverRegistered = false - super.onPause() - } - - override fun onResume() { - super.onResume() - if (!isReceiverRegistered) { - LocalBroadcastManager.getInstance(this).registerReceiver( - registerReceiver, - IntentFilter(Constants.REGISTER_ON_SERVER), - ) - isReceiverRegistered = true - } - } - - /** - * Handling back press - */ - @Deprecated("Deprecated in Java") - override fun onBackPressed() { - val currentRoute = navHostController.currentBackStackEntry?.destination?.route - - if (currentRoute == HomeNavigation.HomeScreen.route) { -// if (doubleBackToExitPressedOnce && stackCount() == 0) { -// finish() -// return -// } - doubleBackToExitPressedOnce = true - Toaster.show(findViewById(android.R.id.content), getString(R.string.exit_message)) - Handler().postDelayed({ doubleBackToExitPressedOnce = false }, 2000) - } - - super.onBackPressed() - -// if (stackCount() != 0) { -// super.onBackPressed() -// } - } - - - /** - * Check the device to make sure it has the Google Play Services APK. If - * it doesn't, display a dialog that allows users to download the APK from - * the Google Play Store or enable it in the device's system settings. - */ - private fun checkPlayServices(): Boolean { - val apiAvailability = GoogleApiAvailability.getInstance() - val resultCode = apiAvailability.isGooglePlayServicesAvailable(this) - if (resultCode != ConnectionResult.SUCCESS) { - if (apiAvailability.isUserResolvableError(resultCode)) { - apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST) - ?.show() - } else { - Log.i(HomeActivity::class.java.name, "This device is not supported.") - finish() - } - return false - } - return true - } - - private val registerReceiver: BroadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - val token = intent.getStringExtra(Constants.TOKEN) - token?.let { viewModel.registerNotification(it) } - } - } - - companion object { - private const val PLAY_SERVICES_RESOLUTION_REQUEST = 9000 - } -} \ No newline at end of file diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/activities/LoginActivity.kt b/androidApp/src/main/java/org/mifos/mobile/ui/activities/LoginActivity.kt deleted file mode 100644 index 679d61763..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/activities/LoginActivity.kt +++ /dev/null @@ -1,33 +0,0 @@ -package org.mifos.mobile.ui.activities - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge -import androidx.navigation.compose.rememberNavController -import dagger.hilt.android.AndroidEntryPoint -import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme -import org.mifos.mobile.feature.auth.navigation.AuthenticationNavigation -import org.mifos.mobile.navigation.RootNavGraph - -/** - * @author Vishwajeet - * @since 05/06/16 - */ -@AndroidEntryPoint -class LoginActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - enableEdgeToEdge() - setContent { - MifosMobileTheme { - val navController = rememberNavController() - RootNavGraph( - startDestination = AuthenticationNavigation.AuthenticationBase.route, - navController = navController, - ) - } - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/activities/PassCodeActivity.kt b/androidApp/src/main/java/org/mifos/mobile/ui/activities/PassCodeActivity.kt deleted file mode 100644 index ad5ea3485..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/activities/PassCodeActivity.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.mifos.mobile.ui.activities - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.statusBarsPadding -import androidx.compose.ui.Modifier -import androidx.navigation.compose.rememberNavController -import dagger.hilt.android.AndroidEntryPoint -import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme -import org.mifos.mobile.navigation.PASSCODE_SCREEN -import org.mifos.mobile.navigation.RootNavGraph - -@AndroidEntryPoint -class PassCodeActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - enableEdgeToEdge() - setContent { - MifosMobileTheme { - val navController = rememberNavController() - - Box(modifier = Modifier.statusBarsPadding()) { - RootNavGraph( - startDestination = PASSCODE_SCREEN, - navController = navController, - ) - } - } - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/activities/SplashActivity.kt b/androidApp/src/main/java/org/mifos/mobile/ui/activities/SplashActivity.kt deleted file mode 100644 index 69169dd48..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/activities/SplashActivity.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.mifos.mobile.ui.activities - -import android.content.Intent -import android.os.Bundle -import androidx.activity.ComponentActivity - -/* -* Created by saksham on 01/June/2018 -*/ -class SplashActivity : ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - // TODO:: check for user logged in or not, and if logged in move to PasscodeActivity instead. - val intent = Intent(this, LoginActivity::class.java) - - startActivity(intent) - finish() - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/views/BaseActivityCallback.kt b/androidApp/src/main/java/org/mifos/mobile/ui/views/BaseActivityCallback.kt deleted file mode 100644 index 64fababdc..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/views/BaseActivityCallback.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.mifos.mobile.ui.views - -/** - * @author Rajan Maurya - */ -interface BaseActivityCallback { - - fun showProgressDialog(message: String?) - - fun hideProgressDialog() - - fun setToolbarTitle(title: String?) -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeAppWidget.kt b/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeAppWidget.kt deleted file mode 100644 index 0dda7998d..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeAppWidget.kt +++ /dev/null @@ -1,64 +0,0 @@ -package org.mifos.mobile.ui.widgets - -import android.annotation.TargetApi -import android.appwidget.AppWidgetManager -import android.appwidget.AppWidgetProvider -import android.content.Context -import android.content.Intent -import android.os.Build -import android.widget.RemoteViews -import org.mifos.mobile.R - -/** - * Implementation of App Widget functionality. - */ -class ChargeAppWidget : AppWidgetProvider() { - - override fun onUpdate( - context: Context, - appWidgetManager: AppWidgetManager, - appWidgetIds: IntArray, - ) { - // There may be multiple widgets active, so update all of them - for (appWidgetId in appWidgetIds) { - updateAppWidget(context, appWidgetManager, appWidgetId) - } - super.onUpdate(context, appWidgetManager, appWidgetIds) - } - - override fun onEnabled(context: Context) { - // Enter relevant functionality for when the first widget is created - } - - override fun onDisabled(context: Context) { - // Enter relevant functionality for when the last widget is disabled - } - - companion object { - fun updateAppWidget( - context: Context, - appWidgetManager: AppWidgetManager, - appWidgetId: Int, - ) { - val views = RemoteViews(context.packageName, R.layout.charge_app_widget) - - // Set up the collection - setRemoteAdapter(context, views) - // Instruct the widget manager to update the widget - appWidgetManager.updateAppWidget(appWidgetId, views) - } - - /** - * Sets the remote adapter used to fill in the list items - * - * @param views RemoteViews to set the RemoteAdapter - */ - @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) - private fun setRemoteAdapter(context: Context, views: RemoteViews) { - views.setRemoteAdapter( - R.id.lv_charges, - Intent(context, ChargeWidgetService::class.java), - ) - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetDataProvider.kt b/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetDataProvider.kt deleted file mode 100644 index c82ad4c9f..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetDataProvider.kt +++ /dev/null @@ -1,110 +0,0 @@ -package org.mifos.mobile.ui.widgets - -import android.content.Context -import android.widget.RemoteViews -import android.widget.RemoteViewsService.RemoteViewsFactory -import android.widget.Toast -import dagger.hilt.android.qualifiers.ApplicationContext -import org.mifos.mobile.R -import org.mifos.mobile.core.data.repository.ClientChargeRepository -import org.mifos.mobile.core.datastore.model.Charge -import java.util.concurrent.locks.ReentrantLock -import javax.inject.Inject - -/** - * ChargeWidgetDataProvider acts as the adapter for the collection view widget, - * providing RemoteViews to the widget in the getViewAt method. - */ -class ChargeWidgetDataProvider(@param:ApplicationContext private val context: Context) : - RemoteViewsFactory { - - @Inject - lateinit var clientChargeRepository: ClientChargeRepository - - - private var charges: List? - private val `object`: ReentrantLock = ReentrantLock() - private val condition = `object`.newCondition() - - override fun onCreate() { - - } - - override fun onDataSetChanged() { - // TODO Make ClientId Dynamic - //clientChargeViewModel.loadClientLocalCharges() - synchronized(`object`) { - try { - // Calling wait() will block this thread until another thread - // calls notify() on the object. - condition.await() - } catch (e: InterruptedException) { - // Happens if someone interrupts your thread. - } - } - } - - override fun getCount(): Int { - return if (charges != null) { - charges!!.size - } else { - 0 - } - } - - override fun getViewAt(position: Int): RemoteViews { - val charge = charges?.get(position) - val itemId = R.layout.item_widget_client_charge - val view = RemoteViews(context.packageName, itemId) - view.setTextViewText(R.id.tv_charge_name, charge?.name) - view.setTextViewText(R.id.tv_charge_amount, charge?.amount.toString()) - view.setImageViewResource(R.id.circle_status, R.drawable.ic_attach_money_black_24dp) - return view - } - - override fun getLoadingView(): RemoteViews? { - return null - } - - override fun getViewTypeCount(): Int { - return 1 - } - - override fun getItemId(position: Int): Long { - return position.toLong() - } - - override fun hasStableIds(): Boolean { - return false - } - - fun showErrorFetchingClientCharges(message: String?) { - Toast.makeText( - context, - context.getString(R.string.error_client_charge_loading), - Toast.LENGTH_SHORT, - ).show() - } - - fun showClientCharges(clientChargesList: List?) { - charges = clientChargesList - synchronized(`object`) { - condition.signal() - } - } - - fun showProgress() {} - - fun hideProgress() {} - - override fun onDestroy() { - } - - companion object { - private val LOG_TAG = ChargeWidgetDataProvider::class.java.simpleName - } - - init { - charges = ArrayList() - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetService.kt b/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetService.kt deleted file mode 100644 index e2f40873e..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/ui/widgets/ChargeWidgetService.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.mifos.mobile.ui.widgets - -import android.content.Intent -import android.widget.RemoteViewsService - -/** - * ChargeWidgetService is the [RemoteViewsService] that will return our RemoteViewsFactory - */ -class ChargeWidgetService : RemoteViewsService() { - - override fun onGetViewFactory(intent: Intent): RemoteViewsFactory { - return ChargeWidgetDataProvider(this) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/CheckSelfPermissionAndRequest.kt b/androidApp/src/main/java/org/mifos/mobile/utils/CheckSelfPermissionAndRequest.kt deleted file mode 100644 index cad06575a..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/CheckSelfPermissionAndRequest.kt +++ /dev/null @@ -1,152 +0,0 @@ -package org.mifos.mobile.utils - -import android.annotation.TargetApi -import android.content.Context -import android.content.DialogInterface -import android.content.Intent -import android.content.pm.PackageManager -import android.net.Uri -import android.os.Build -import android.provider.Settings -import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity -import androidx.core.app.ActivityCompat -import androidx.core.content.ContextCompat -import org.mifos.mobile.R -import org.mifos.mobile.core.datastore.PreferencesHelper - -/** - * Created by dilpreet on 14/7/17. - */ -object CheckSelfPermissionAndRequest { - /** - * This Method Check the Permission is granted or not to the App. If the Permission granted, - * returns true and If not permission denied then returns false. - * - * @param context Context - * @param permission Manifest.permission...Permission... - * @return Boolean True or False. - */ - @JvmStatic - fun checkSelfPermission(context: Context?, permission: String?): Boolean { - return ContextCompat.checkSelfPermission(context!!, permission!!) == - PackageManager.PERMISSION_GRANTED - } - - /** - * This Method is requesting to device to grant the permission. When App is trying to - * request the device to grant the permission, then their is Three cases. - * 1. First case Device Prompt the Permission Dialog to user and user accepted or denied the - * Permission. - * 2. Second case will come, if user will denied the permission, after onclick dialog denied - * button and next time App ask for permission, It will show a Material Dialog and there - * will be a message to tell the user that you have denied the permission before, So do - * you want to give this permission to app or not, If yes then click on Re-Try dialog button - * and if not then click on Dialog button "I'm Sure", to not to give this permission to the - * app. - * - * - * And as user will click on "Re-Try" dialog button, he will be prompt with the with - * permission dialog with "[-] never ask again" and have two options first one to click on - * denied button again and put Un check the never ask check box. In this case, user will - * prompt with permission dialog with "[-] never ask again" in the loop, whenever app ask - * for that permission. - * - * - * and If user will click on "[_/] never ask again" check box then permission dialog with - * that permission will not prompt to the user. - * 3. Third case will came. when user have denied to accept permission with never ask again. - * then user will prompt with dialog and message that you have denied this permission with - * never ask again. but this is necessary permission to this app feature. and to grant - * this permission please click on dialog app settings button and give the permission to - * work with this feature. - * - * @param activity AppCompatActivity - * @param permission Manifest.permission...Permission... - * @param permissionRequestCode Permission Request Code. - * @param dialogMessageRetry Dialog Message Retry - * @param messageNeverAskAgain Dialog Message Never Ask Again - * @param permissionDeniedStatus Permission Denied Status - */ - @JvmStatic - @TargetApi(Build.VERSION_CODES.JELLY_BEAN) - fun requestPermission( - activity: AppCompatActivity, - permission: String, - permissionRequestCode: Int, - dialogMessageRetry: String?, - messageNeverAskAgain: String?, - permissionDeniedStatus: String?, - ) { - // Should we show an explanation? - if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) { - // Show an explanation to the user *asynchronously* -- don't block - // this thread waiting for the user's response! After the user - // sees the explanation, try again to request the permission. - MaterialDialog.Builder().init(activity) - .setTitle(R.string.dialog_permission_denied) - .setMessage(dialogMessageRetry) - .setPositiveButton( - R.string.dialog_action_re_try, - DialogInterface.OnClickListener { _, _ -> - ActivityCompat.requestPermissions( - activity, - arrayOf(permission), - permissionRequestCode, - ) - }, - ) - .setNegativeButton(R.string.dialog_action_i_am_sure) - .createMaterialDialog() - .show() - } else { - // Requesting Permission, first time to the device. - val preferencesHelper = PreferencesHelper(activity.applicationContext) - if (preferencesHelper.getBoolean(permissionDeniedStatus, true) == true) { - preferencesHelper.putBoolean(permissionDeniedStatus, false) - ActivityCompat.requestPermissions( - activity, - arrayOf(permission), - permissionRequestCode, - ) - } else { - // Requesting Permission, more the one time and opening the setting to change - // the Permission in App Settings. - MaterialDialog.Builder().init(activity) - .setMessage(messageNeverAskAgain) - .setNegativeButton(R.string.dialog_action_cancel) - .setPositiveButton( - R.string.dialog_action_app_settings, - DialogInterface.OnClickListener { _, _ -> // Making the Intent to grant the permission - val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - val uri = Uri.fromParts( - activity.resources.getString( - R.string.package_name, - ), - activity.packageName, - null, - ) - intent.data = uri - val pm = activity.packageManager - if (intent.resolveActivity(pm) != null) { - activity.startActivityForResult( - intent, - org.mifos.mobile.core.common.Constants.REQUEST_PERMISSION_SETTING, - ) - } else { - Toast.makeText( - activity, - activity.getString( - R.string.msg_setting_activity_not_found, - ), - Toast.LENGTH_LONG, - ).show() - } - }, - ) - .createMaterialDialog() - .show() - } - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/ComparatorBasedOnId.kt b/androidApp/src/main/java/org/mifos/mobile/utils/ComparatorBasedOnId.kt deleted file mode 100644 index 4b84615d9..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/ComparatorBasedOnId.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.mifos.mobile.utils - -import org.mifos.mobile.core.model.entity.accounts.Account - -/** - * Created by dilpreet on 14/6/17. - */ -open class ComparatorBasedOnId : Comparator { - /** - * Compares [Account] based on their Id - * @param o1 the first object to be compared. - * @param o2 the second object to be compared. - * @return a negative integer, zero, or a positive integer as the - * first argument is less than, equal to, or greater than the - * second. - */ - override fun compare(o1: Account?, o2: Account?): Int { - return if (o1 != null && o2 != null) { - o2.id.toFloat().compareTo(o1.id.toFloat()) - } else { - 0 - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationDialogFragmentCompat.kt b/androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationDialogFragmentCompat.kt deleted file mode 100644 index 9cdeafb0a..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationDialogFragmentCompat.kt +++ /dev/null @@ -1,130 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import android.content.Intent -import android.text.Editable -import android.text.TextWatcher -import android.view.LayoutInflater -import android.view.View -import android.widget.EditText -import androidx.preference.DialogPreference.TargetFragment -import androidx.preference.Preference -import androidx.preference.PreferenceDialogFragmentCompat -import butterknife.BindView -import butterknife.ButterKnife -import com.google.android.material.textfield.TextInputLayout -import org.mifos.mobile.R -import org.mifos.mobile.core.datastore.PreferencesHelper -import org.mifos.mobile.ui.activities.LoginActivity -import java.net.MalformedURLException -import java.net.URL - -/** - * Created by dilpreet on 11/03/18. - */ -class ConfigurationDialogFragmentCompat : - PreferenceDialogFragmentCompat(), - TargetFragment, - TextWatcher { - @JvmField - @BindView(R.id.et_tenant) - var etTenant: EditText? = null - - @JvmField - @BindView(R.id.et_base_url) - var etBaseUrl: EditText? = null - - @JvmField - @BindView(R.id.til_tenant) - var tilTenant: TextInputLayout? = null - - @JvmField - @BindView(R.id.til_base_url) - var tilBaseUrl: TextInputLayout? = null - private var preferencesHelper: PreferencesHelper? = null - override fun onCreateDialogView(context: Context): View { - return LayoutInflater.from(context).inflate(R.layout.preference_configuration, null) - } - - override fun onBindDialogView(view: View) { - super.onBindDialogView(view) - ButterKnife.bind(this, view) - preferencesHelper = PreferencesHelper(context) - val preference = preference as ConfigurationPreference - etBaseUrl?.setText(preference.baseUrl) - etTenant?.setText(preference.tenant) - etBaseUrl?.text?.length?.let { etBaseUrl?.setSelection(it) } - etTenant?.addTextChangedListener(this) - etBaseUrl?.addTextChangedListener(this) - } - - override fun onDialogClosed(positiveResult: Boolean) { - if (positiveResult && !isFieldEmpty && isUrlValid) { - val preference = preference as ConfigurationPreference - if (!( - preference.baseUrl.toString() - .equals(etBaseUrl!!.text.toString()) && preference.tenant.toString() - .equals(etTenant!!.text.toString()) - ) - ) { - preference.updateConfigurations( - etBaseUrl?.text.toString(), - etTenant?.text.toString(), - ) - preferencesHelper?.clear() - val loginIntent = Intent(activity, LoginActivity::class.java) - loginIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK - startActivity(loginIntent) - activity?.finish() - } - } - } - - override fun findPreference(key: CharSequence): Preference { - return preference - } - - val isFieldEmpty: Boolean - get() { - if (etBaseUrl?.text.toString().trim { it <= ' ' }.isEmpty()) { - return true - } - return etTenant?.text.toString().trim { it <= ' ' }.isEmpty() - } - val isUrlValid: Boolean - get() = try { - URL(etBaseUrl?.text.toString()) - true - } catch (e: MalformedURLException) { - false - } - - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - if (s.toString().isEmpty()) { - if (etBaseUrl?.text.toString().isEmpty()) { - tilBaseUrl?.isErrorEnabled = true - tilBaseUrl?.error = getString( - R.string.error_validation_blank, - getString(R.string.base_url), - ) - } - if (etTenant?.text.toString().isEmpty()) { - tilTenant?.isErrorEnabled = true - tilTenant?.error = getString( - R.string.error_validation_blank, - getString(R.string.tenant), - ) - } - } else { - if (etBaseUrl?.text.toString().length != 0) { - tilBaseUrl?.isErrorEnabled = false - } - if (etTenant?.text.toString().length != 0) { - tilTenant?.isErrorEnabled = false - } - } - } - - override fun afterTextChanged(s: Editable) {} -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationPreference.kt b/androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationPreference.kt deleted file mode 100644 index 8430001bd..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/ConfigurationPreference.kt +++ /dev/null @@ -1,44 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import android.util.AttributeSet -import androidx.preference.DialogPreference -import org.mifos.mobile.core.datastore.PreferencesHelper - -/** - * Created by dilpreet on 11/03/18. - */ -class ConfigurationPreference : DialogPreference { - private var preferencesHelper: PreferencesHelper? = null - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr, - ) { - init() - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init() - } - - constructor(context: Context?) : super(context) { - init() - } - - private fun init() { - isPersistent = false - preferencesHelper = PreferencesHelper(context) - } - - val baseUrl: String? - get() = preferencesHelper?.baseUrl - - fun updateConfigurations(baseUrl: String?, tenant: String?) { - preferencesHelper?.updateConfiguration(baseUrl, tenant) - } - - val tenant: String? - get() = preferencesHelper?.tenant -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/DatePick.kt b/androidApp/src/main/java/org/mifos/mobile/utils/DatePick.kt deleted file mode 100644 index fe9af7639..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/DatePick.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.mifos.mobile.utils - -/** - * Created by dilpreet on 6/3/17. - */ -enum class DatePick { - START, END -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/EndlessRecyclerViewScrollListener.kt b/androidApp/src/main/java/org/mifos/mobile/utils/EndlessRecyclerViewScrollListener.kt deleted file mode 100644 index ca89e43fd..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/EndlessRecyclerViewScrollListener.kt +++ /dev/null @@ -1,110 +0,0 @@ -package org.mifos.mobile.utils - -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import androidx.recyclerview.widget.StaggeredGridLayoutManager - -abstract class EndlessRecyclerViewScrollListener : RecyclerView.OnScrollListener { - // The minimum amount of items to have below your current scroll position - // before loading more. - private var visibleThreshold = 5 - - // The current offset index of data you have loaded - private var currentPage = 0 - - // The total number of items in the dataset after the last load - private var previousTotalItemCount = 0 - - // True if we are still waiting for the last set of data to load. - private var loading = true - - // Sets the starting page index - private val startingPageIndex = 0 - var mLayoutManager: RecyclerView.LayoutManager - - constructor(layoutManager: LinearLayoutManager) { - mLayoutManager = layoutManager - } - - constructor(layoutManager: GridLayoutManager) { - mLayoutManager = layoutManager - visibleThreshold = visibleThreshold * layoutManager.spanCount - } - - constructor(layoutManager: StaggeredGridLayoutManager) { - mLayoutManager = layoutManager - visibleThreshold = visibleThreshold * layoutManager.spanCount - } - - fun getLastVisibleItem(lastVisibleItemPositions: IntArray): Int { - var maxSize = 0 - for (i in lastVisibleItemPositions.indices) { - if (i == 0) { - maxSize = lastVisibleItemPositions[i] - } else if (lastVisibleItemPositions[i] > maxSize) { - maxSize = lastVisibleItemPositions[i] - } - } - return maxSize - } - - // This happens many times a second during a scroll, so be wary of the code you place here. - // We are given a few useful parameters to help us work out if we need to load some more data, - // but first we check if we are waiting for the previous load to finish. - override fun onScrolled(view: RecyclerView, dx: Int, dy: Int) { - var lastVisibleItemPosition = 0 - val totalItemCount = mLayoutManager.itemCount - if (mLayoutManager is StaggeredGridLayoutManager) { - val lastVisibleItemPositions = - (mLayoutManager as StaggeredGridLayoutManager).findLastVisibleItemPositions( - null, - ) - // get maximum element within the list - lastVisibleItemPosition = getLastVisibleItem(lastVisibleItemPositions) - } else if (mLayoutManager is GridLayoutManager) { - lastVisibleItemPosition = - (mLayoutManager as GridLayoutManager).findLastVisibleItemPosition() - } else if (mLayoutManager is LinearLayoutManager) { - lastVisibleItemPosition = - (mLayoutManager as LinearLayoutManager).findLastVisibleItemPosition() - } - - // If the total item count is zero and the previous isn't, assume the - // list is invalidated and should be reset back to initial state - if (totalItemCount < previousTotalItemCount) { - currentPage = startingPageIndex - previousTotalItemCount = totalItemCount - if (totalItemCount == 0) { - loading = true - } - } - // If it’s still loading, we check to see if the dataset count has - // changed, if so we conclude it has finished loading and update the current page - // number and total item count. - if (loading && totalItemCount > previousTotalItemCount) { - loading = false - previousTotalItemCount = totalItemCount - } - - // If it isn’t currently loading, we check to see if we have breached - // the visibleThreshold and need to reload more data. - // If we do need to reload some more data, we execute onLoadMore to fetch the data. - // threshold should reflect how many total columns there are too - if (!loading && lastVisibleItemPosition + visibleThreshold > totalItemCount) { - currentPage++ - onLoadMore(currentPage, totalItemCount, view) - loading = true - } - } - - // Call this method whenever performing new searches - fun resetState() { - currentPage = startingPageIndex - previousTotalItemCount = 0 - loading = true - } - - // Defines the process for actually loading more data based on page - abstract fun onLoadMore(page: Int, totalItemsCount: Int, view: RecyclerView?) -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/GuarantorUiState.kt b/androidApp/src/main/java/org/mifos/mobile/utils/GuarantorUiState.kt deleted file mode 100644 index b95f9aaa1..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/GuarantorUiState.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.mifos.mobile.utils - -import org.mifos.mobile.core.model.entity.guarantor.GuarantorApplicationPayload -import org.mifos.mobile.core.model.entity.guarantor.GuarantorPayload -import org.mifos.mobile.core.model.entity.guarantor.GuarantorTemplatePayload - -sealed class GuarantorUiState { - object Loading : GuarantorUiState() - - data class ShowError(val message: String?) : GuarantorUiState() - - data class GuarantorDeletedSuccessfully(val message: String?) : GuarantorUiState() - - data class GuarantorUpdatedSuccessfully(val message: String?) : GuarantorUiState() - - data class ShowGuarantorListSuccessfully(val payload: List?) : - GuarantorUiState() - - data class ShowGuarantorApplication(val template: GuarantorTemplatePayload?) : - GuarantorUiState() - - data class ShowGuarantorUpdation(val template: GuarantorTemplatePayload?) : GuarantorUiState() - - data class SubmittedSuccessfully( - val message: String?, - val payload: GuarantorApplicationPayload? - ) : GuarantorUiState() -} \ No newline at end of file diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/ImageUtil.kt b/androidApp/src/main/java/org/mifos/mobile/utils/ImageUtil.kt deleted file mode 100644 index dd0d3eca4..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/ImageUtil.kt +++ /dev/null @@ -1,136 +0,0 @@ -package org.mifos.mobile.utils - -import android.graphics.Bitmap -import android.graphics.BitmapFactory -import android.graphics.Canvas -import android.graphics.Matrix -import android.graphics.Paint -import android.util.Log - -/** - * Created by dilpreet on 10/8/17. - */ -class ImageUtil { - // Default width and height - fun compressImage(decodedBytes: ByteArray): Bitmap? { - return compress(decodedBytes, 816.0f, 612.0f) - } - - fun compressImage(decodedBytes: ByteArray, maxHeight: Float, maxWidth: Float): Bitmap? { - return compress(decodedBytes, maxHeight, maxWidth) - } - - private fun compress(decodedBytes: ByteArray, maxHeight: Float, maxWidth: Float): Bitmap? { - var scaledBitmap: Bitmap? = null - val options = BitmapFactory.Options() - -// by setting this field as true, the actual bitmap pixels are not loaded in the memory. -// Just the bounds are loaded. If -// you try the use the bitmap here, you will get null. - options.inJustDecodeBounds = true - var bmp = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size, options) - var actualHeight = options.outHeight - var actualWidth = options.outWidth - var imgRatio = actualWidth / actualHeight.toFloat() - val maxRatio = maxWidth / maxHeight - -// width and height values are set maintaining the aspect ratio of the image - if (actualHeight > maxHeight || actualWidth > maxWidth) { - if (imgRatio < maxRatio) { - imgRatio = maxHeight / actualHeight - actualWidth = (imgRatio * actualWidth).toInt() - actualHeight = maxHeight.toInt() - } else if (imgRatio > maxRatio) { - imgRatio = maxWidth / actualWidth - actualHeight = (imgRatio * actualHeight).toInt() - actualWidth = maxWidth.toInt() - } else { - actualHeight = maxHeight.toInt() - actualWidth = maxWidth.toInt() - } - } - -// setting inSampleSize value allows to load a scaled down version of the original image - options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight) - -// inJustDecodeBounds set to false to load the actual bitmap - options.inJustDecodeBounds = false - -// this options allow android to claim the bitmap memory if it runs low on memory - options.inPurgeable = true - options.inInputShareable = true - options.inTempStorage = ByteArray(16 * 1024) - try { - bmp = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size, options) - } catch (exception: OutOfMemoryError) { - Log.e(ImageUtil::class.java.name, exception.toString()) - } - try { - scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight, Bitmap.Config.ARGB_8888) - } catch (exception: OutOfMemoryError) { - Log.e(ImageUtil::class.java.name, exception.toString()) - } - val ratioX = actualWidth / options.outWidth.toFloat() - val ratioY = actualHeight / options.outHeight.toFloat() - val middleX = actualWidth / 2.0f - val middleY = actualHeight / 2.0f - val scaleMatrix = Matrix() - scaleMatrix.setScale(ratioX, ratioY, middleX, middleY) - val canvas = Canvas(scaledBitmap!!) - canvas.setMatrix(scaleMatrix) - canvas.drawBitmap( - bmp, - middleX - bmp.width / 2, - middleY - bmp.height / 2, - Paint(Paint.FILTER_BITMAP_FLAG), - ) - scaledBitmap = Bitmap.createBitmap( - scaledBitmap, - 0, - 0, - scaledBitmap.width, - scaledBitmap.height, - null, - true, - ) - return scaledBitmap - } - - private fun calculateInSampleSize( - options: BitmapFactory.Options, - reqWidth: Int, - reqHeight: Int, - ): Int { - val height = options.outHeight - val width = options.outWidth - var inSampleSize = 1 - if (height > reqHeight || width > reqWidth) { - val heightRatio = Math.round(height.toFloat() / reqHeight.toFloat()) - val widthRatio = Math.round(width.toFloat() / reqWidth.toFloat()) - inSampleSize = if (heightRatio < widthRatio) heightRatio else widthRatio - } - val totalPixels = width * height.toFloat() - val totalReqPixelsCap = reqWidth * reqHeight * 2.toFloat() - while (totalPixels / (inSampleSize * inSampleSize) > totalReqPixelsCap) { - inSampleSize++ - } - return inSampleSize - } - - companion object { - /** - * Reference : https://developer.android.com/topic/performance/graphics/load-bitmap.html - * And for scaling : - * https://stackoverflow.com/questions/8722359/scale-rotate-bitmap-using-matrix-in-android/8722592#8722592 - */ - @JvmStatic - var instance: ImageUtil? = null - get() { - if (field == null) { - field = ImageUtil() - } - return field - } - private set - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/MFErrorParser.kt b/androidApp/src/main/java/org/mifos/mobile/utils/MFErrorParser.kt deleted file mode 100644 index 01a2178e2..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/MFErrorParser.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.mifos.mobile.utils - -import com.google.gson.Gson -import io.reactivex.plugins.RxJavaPlugins -import org.mifos.mobile.core.model.entity.mifoserror.MifosError -import retrofit2.HttpException - -object MFErrorParser { - const val LOG_TAG = "MFErrorParser" - private val gson = Gson() - fun parseError(serverResponse: String?): MifosError { - return gson.fromJson(serverResponse, MifosError::class.java) - } - - @JvmStatic - fun errorMessage(throwableError: Throwable?): String? { - var errorMessage: String? = "" - try { - if (throwableError is HttpException) { - errorMessage = throwableError.response()?.errorBody()?.string() - errorMessage = parseError(errorMessage).errors[0].defaultUserMessage - } - } catch (throwable: Throwable) { - RxJavaPlugins.getErrorHandler() - } - return errorMessage - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/MaterialDialog.kt b/androidApp/src/main/java/org/mifos/mobile/utils/MaterialDialog.kt deleted file mode 100644 index 531b6a72d..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/MaterialDialog.kt +++ /dev/null @@ -1,205 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import android.content.DialogInterface -import android.view.View -import androidx.annotation.StringRes -import androidx.appcompat.app.AlertDialog -import androidx.core.content.ContextCompat -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.mifos.mobile.R - -/** - * This Class is the Material Dialog Builder Class - * Created by Rajan Maurya on 03/08/16. - */ -class MaterialDialog { - - class Builder { - - private var mMaterialDialogBuilder: AlertDialog.Builder? = null - private var context: Context? = null - - // This is the Default Builder Initialization with Material Style - fun init(context: Context?): Builder { - mMaterialDialogBuilder = MaterialAlertDialogBuilder(context!!) - this.context = context - return this - } - - // This method set the custom Material Style - fun init(context: Context?, theme: Int): Builder { - mMaterialDialogBuilder = AlertDialog.Builder(context!!, theme) - this.context = context - return this - } - - // This method set the String Title - fun setTitle(title: String?): Builder { - mMaterialDialogBuilder?.setTitle(title) - return this - } - - // This Method set the String Resources to Title - fun setTitle(@StringRes title: Int): Builder { - mMaterialDialogBuilder?.setTitle(title) - return this - } - - // This Method set the String Message - fun setMessage(message: String?): Builder { - mMaterialDialogBuilder?.setMessage(message) - return this - } - - // This Method set the String Resources message - fun setMessage(@StringRes message: Int): Builder { - mMaterialDialogBuilder?.setMessage(message) - return this - } - - // This Method set String Test to the Positive Button and set the Onclick null - fun setPositiveButton(positiveText: String?): Builder { - mMaterialDialogBuilder?.setPositiveButton(positiveText, null) - return this - } - - // This Method Set the String Resources Text To Positive Button - fun setPositiveButton(@StringRes positiveText: Int): Builder { - mMaterialDialogBuilder?.setPositiveButton(positiveText, null) - return this - } - - // This Method set the String Text to Positive Button and set the OnClick Event to it - fun setPositiveButton( - positiveText: String?, - listener: DialogInterface.OnClickListener?, - ): Builder { - mMaterialDialogBuilder?.setPositiveButton(positiveText, listener) - return this - } - - // This method set the String Resources text To Positive button and set the Onclick Event - fun setPositiveButton( - @StringRes positiveText: Int, - listener: DialogInterface.OnClickListener?, - ): Builder { - mMaterialDialogBuilder?.setPositiveButton(positiveText, listener) - return this - } - - // This Method the String Text to Negative Button and Set the onclick event to null - fun setNegativeButton(negativeText: String?): Builder { - mMaterialDialogBuilder?.setNegativeButton(negativeText, null) - return this - } - - // This Method set the String Resources Text to Negative button - // and set the onclick event to null - fun setNegativeButton(@StringRes negativeText: Int): Builder { - mMaterialDialogBuilder?.setNegativeButton(negativeText, null) - return this - } - - // This Method set String Text to Negative Button and - // Set the Onclick event - fun setNegativeButton( - negativeText: String?, - listener: DialogInterface.OnClickListener?, - ): Builder { - mMaterialDialogBuilder?.setNegativeButton(negativeText, listener) - return this - } - - // This method set String Resources Text to Negative Button and set Onclick Event - fun setNegativeButton( - @StringRes negativeText: Int, - listener: DialogInterface.OnClickListener?, - ): Builder { - mMaterialDialogBuilder?.setNegativeButton(negativeText, listener) - return this - } - - // This Method the String Text to Neutral Button and Set the onclick event to null - fun setNeutralButton(neutralText: String?): Builder { - mMaterialDialogBuilder?.setNeutralButton(neutralText, null) - return this - } - - // This Method set the String Resources Text to Neutral button - // and set the onclick event to null - fun setNeutralButton(@StringRes neutralText: Int): Builder { - mMaterialDialogBuilder?.setNeutralButton(neutralText, null) - return this - } - - // This Method set String Text to Neutral Button and - // Set the Onclick event - fun setNeutralButton( - neutralText: String?, - listener: DialogInterface.OnClickListener?, - ): Builder { - mMaterialDialogBuilder?.setNeutralButton(neutralText, listener) - return this - } - - // This method set String Resources Text to Neutral Button and set Onclick Event - fun setNeutralButton( - @StringRes neutralText: Int, - listener: DialogInterface.OnClickListener?, - ): Builder { - mMaterialDialogBuilder?.setNeutralButton(neutralText, listener) - return this - } - - fun setCancelable(cancelable: Boolean?): Builder { - mMaterialDialogBuilder?.setCancelable(cancelable!!) - return this - } - - fun setItems(items: Int, listener: DialogInterface.OnClickListener?): Builder { - mMaterialDialogBuilder?.setItems(items, listener) - return this - } - - fun setItems(items: Array?, listener: DialogInterface.OnClickListener?): Builder { - mMaterialDialogBuilder?.setItems(items, listener) - return this - } - - fun addView(view: View?): Builder { - mMaterialDialogBuilder?.setView(view) - return this - } - - // This Method Create the Final Material Dialog - fun createMaterialDialog(): Builder { - mMaterialDialogBuilder?.create() - return this - } - - // This Method Show the Dialog - fun show(): Builder { - val dialog = mMaterialDialogBuilder?.show() - dialog?.getButton(DialogInterface.BUTTON_POSITIVE)?.setTextColor( - ContextCompat.getColor( - context!!, - R.color.accent, - ), - ) - dialog?.getButton(DialogInterface.BUTTON_NEGATIVE)?.setTextColor( - ContextCompat.getColor( - context!!, - R.color.gray_dark, - ), - ) - dialog?.getButton(DialogInterface.BUTTON_NEUTRAL)?.setTextColor( - ContextCompat.getColor( - context!!, - R.color.black, - ), - ) - return this - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/ProcessView.kt b/androidApp/src/main/java/org/mifos/mobile/utils/ProcessView.kt deleted file mode 100644 index 8601dccb2..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/ProcessView.kt +++ /dev/null @@ -1,72 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import android.graphics.Canvas -import android.graphics.Paint -import android.util.AttributeSet -import android.view.View -import androidx.core.content.ContextCompat -import org.mifos.mobile.R -import org.mifos.mobile.ui.getThemeAttributeColor - -/** - * Created by dilpreet on 30/6/17. - */ -class ProcessView : View { - private var valueStr: String? = null - private var textPaint: Paint? = null - private var backgroundPaint: Paint? = null - - constructor(context: Context?) : super(context, null) - constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { - val typedArray = context.obtainStyledAttributes(attrs, R.styleable.ProcessView) - valueStr = typedArray.getString(R.styleable.ProcessView_value) - typedArray.recycle() - textPaint = Paint() - textPaint?.color = getColorCompat(android.R.color.white) - textPaint?.isAntiAlias = true - textPaint?.style = Paint.Style.FILL - textPaint?.strokeWidth = 1f - textPaint?.textSize = 40f - backgroundPaint = Paint() - backgroundPaint?.color = getColorCompat(R.color.gray_dark) - backgroundPaint?.isAntiAlias = true - backgroundPaint?.style = Paint.Style.FILL - } - - override fun onDraw(canvas: Canvas) { - super.onDraw(canvas) - val xPos = - canvas.width / 2 - (textPaint?.measureText(valueStr.toString())?.div(2))?.toInt()!! - val yPos = ( - canvas.height / 2 - ( - ( - textPaint?.descent() - ?.plus(textPaint?.ascent()!!) - )?.div(2) - )!! - ).toInt() - val usableWidth = width - (paddingLeft + paddingRight) - val usableHeight = height - (paddingTop + paddingBottom) - val radius = usableWidth.coerceAtMost(usableHeight) / 2 - val cx = paddingLeft + usableWidth / 2 - val cy = paddingTop + usableHeight / 2 - canvas.drawCircle(cx.toFloat(), cy.toFloat(), radius.toFloat(), backgroundPaint!!) - canvas.drawText(valueStr!!, xPos.toFloat(), yPos.toFloat(), textPaint!!) - } - - fun setCurrentActive() { - backgroundPaint?.color = context.getThemeAttributeColor(R.attr.colorPrimary) - invalidate() - } - - fun setCurrentCompleted() { - backgroundPaint?.color = context.getThemeAttributeColor(R.attr.colorPrimary) - valueStr = "\u2713" - invalidate() - } - - private fun getColorCompat(colorId: Int): Int { - return ContextCompat.getColor(context, colorId) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/RetrofitUtils.kt b/androidApp/src/main/java/org/mifos/mobile/utils/RetrofitUtils.kt deleted file mode 100644 index 420ac7296..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/RetrofitUtils.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.mifos.mobile.utils - -import okhttp3.MediaType -import okhttp3.Protocol -import okhttp3.ResponseBody -import retrofit2.HttpException -import retrofit2.Response - -/** - * Created by dilpreet on 29/7/17. - */ -object RetrofitUtils { - fun getResponseForError(errorCode: Int): Exception { - val message = if (errorCode == 401) "UnAuthorized" else "Not Found" - val responseBody = - ResponseBody.create(MediaType.parse("application/json"), "{\"message\":\"$message\"}") - val response = okhttp3.Response.Builder().code(errorCode) - .message(message) - .protocol(Protocol.HTTP_1_1) - .request(okhttp3.Request.Builder().url("http://localhost/").build()) - .build() - return HttpException(Response.error(responseBody, response)) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/RxBus.kt b/androidApp/src/main/java/org/mifos/mobile/utils/RxBus.kt deleted file mode 100644 index 240167b82..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/RxBus.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.mifos.mobile.utils - -import io.reactivex.Observable -import io.reactivex.subjects.PublishSubject - -/* - * Created by saksham on 31/July/2018 -*/ - -object RxBus { - - @JvmStatic - private val publisher = PublishSubject.create() - - @JvmStatic - fun publish(event: Any?) { - if (event != null) publisher.onNext(event) - } - - @JvmStatic - fun listen(eventType: Class): Observable { - return publisher.ofType(eventType) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/RxEvent.kt b/androidApp/src/main/java/org/mifos/mobile/utils/RxEvent.kt deleted file mode 100644 index 590edcaa9..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/RxEvent.kt +++ /dev/null @@ -1,16 +0,0 @@ -package org.mifos.mobile.utils - -import org.mifos.mobile.core.model.entity.guarantor.GuarantorApplicationPayload - -/* - * Created by saksham on 29/July/2018 -*/ - -class RxEvent { - - data class AddGuarantorEvent(var payload: GuarantorApplicationPayload?, var index: Int?) - - data class DeleteGuarantorEvent(var index: Int?) - - data class UpdateGuarantorEvent(var payload: GuarantorApplicationPayload?, var index: Int?) -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/SavingsAccountUiState.kt b/androidApp/src/main/java/org/mifos/mobile/utils/SavingsAccountUiState.kt deleted file mode 100644 index 615543926..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/SavingsAccountUiState.kt +++ /dev/null @@ -1,31 +0,0 @@ -package org.mifos.mobile.utils - -import org.mifos.mobile.core.model.entity.accounts.savings.SavingsWithAssociations -import org.mifos.mobile.core.model.entity.accounts.savings.Transactions -import org.mifos.mobile.core.model.entity.templates.account.AccountOptionsTemplate -import org.mifos.mobile.core.model.entity.templates.savings.SavingsAccountTemplate - -sealed class SavingsAccountUiState { - object Initial : SavingsAccountUiState() - object Loading : SavingsAccountUiState() - object Error : SavingsAccountUiState() - data class SuccessLoadingSavingsWithAssociations(val savingAccount: SavingsWithAssociations) : - SavingsAccountUiState() - - data class ShowFilteredTransactionsList(val savingAccountsTransactionList: List?) : - SavingsAccountUiState() - - object SavingsAccountUpdateSuccess : SavingsAccountUiState() - object SavingsAccountApplicationSuccess : SavingsAccountUiState() - data class ShowUserInterfaceSavingAccountUpdate(val template: SavingsAccountTemplate) : - SavingsAccountUiState() - - data class ShowUserInterfaceSavingAccountApplication(val template: SavingsAccountTemplate) : - SavingsAccountUiState() - - data class ErrorMessage(val error: Throwable) : SavingsAccountUiState() - object HideProgress : SavingsAccountUiState() - object SavingsAccountWithdrawSuccess : SavingsAccountUiState() - - data class ShowSavingsAccountTemplate(val accountOptionsTemplate: AccountOptionsTemplate) : SavingsAccountUiState() -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/ScrollFabBehavior.kt b/androidApp/src/main/java/org/mifos/mobile/utils/ScrollFabBehavior.kt deleted file mode 100644 index c6c2e97ac..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/ScrollFabBehavior.kt +++ /dev/null @@ -1,63 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import androidx.coordinatorlayout.widget.CoordinatorLayout -import androidx.core.view.ViewCompat -import com.google.android.material.floatingactionbutton.FloatingActionButton -import com.google.android.material.floatingactionbutton.FloatingActionButton.OnVisibilityChangedListener - -/** - * Created by dilpreet on 23/8/17. - */ -class ScrollFabBehavior(context: Context?, attrs: AttributeSet?) : FloatingActionButton.Behavior() { - override fun onStartNestedScroll( - coordinatorLayout: CoordinatorLayout, - child: FloatingActionButton, - directTargetChild: View, - target: View, - nestedScrollAxes: Int, - ): Boolean { - return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL || - super.onStartNestedScroll( - coordinatorLayout, - child, - directTargetChild, - target, - nestedScrollAxes, - ) - } - - override fun onNestedScroll( - coordinatorLayout: CoordinatorLayout, - child: FloatingActionButton, - target: View, - dxConsumed: Int, - dyConsumed: Int, - dxUnconsumed: Int, - dyUnconsumed: Int, - ) { - super.onNestedScroll( - coordinatorLayout, - child, - target, - dxConsumed, - dyConsumed, - dxUnconsumed, - dyUnconsumed, - ) - if (dyConsumed > 0 && child.visibility == View.VISIBLE) { - // Reason to set fab visiblity as INVISIBLE : - // https://stackoverflow.com/a/41386278/4672688 - child.hide(object : OnVisibilityChangedListener() { - override fun onHidden(fab: FloatingActionButton) { - super.onHidden(fab) - fab.visibility = View.INVISIBLE - } - }) - } else if (dyConsumed < 0 && child.visibility != View.VISIBLE) { - child.show() - } - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/StatusUtils.kt b/androidApp/src/main/java/org/mifos/mobile/utils/StatusUtils.kt deleted file mode 100644 index 41f2edb55..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/StatusUtils.kt +++ /dev/null @@ -1,70 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import androidx.core.content.ContextCompat -import org.mifos.mobile.R -import org.mifos.mobile.core.model.entity.CheckboxStatus - -/** - * Created by dilpreet on 3/7/17. - */ -object StatusUtils { - - fun getSavingsAccountTransactionList(context: Context?): List { - val arrayList = ArrayList() - arrayList.add( - CheckboxStatus( - context?.getString(R.string.feature_account_deposit), - ContextCompat - .getColor(context!!, R.color.deposit_green), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_dividend_payout), - ContextCompat - .getColor(context, R.color.red_light), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_withdrawal), - ContextCompat - .getColor(context, R.color.red_light), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_interest_posting), - ContextCompat.getColor(context, R.color.green_light), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_fee_deduction), - ContextCompat - .getColor(context, R.color.red_light), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_withdrawal_transfer), - ContextCompat.getColor(context, R.color.red_light), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_rejected_transfer), - ContextCompat.getColor(context, R.color.green_light), - ), - ) - arrayList.add( - CheckboxStatus( - context.getString(R.string.feature_account_overdraft_fee), - ContextCompat - .getColor(context, R.color.red_light), - ), - ) - return arrayList - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/TextDrawable.kt b/androidApp/src/main/java/org/mifos/mobile/utils/TextDrawable.kt deleted file mode 100644 index 82f369af9..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/TextDrawable.kt +++ /dev/null @@ -1,281 +0,0 @@ -package org.mifos.mobile.utils - -import android.graphics.Canvas -import android.graphics.Color -import android.graphics.ColorFilter -import android.graphics.Paint -import android.graphics.PixelFormat -import android.graphics.RectF -import android.graphics.Typeface -import android.graphics.drawable.ShapeDrawable -import android.graphics.drawable.shapes.OvalShape -import android.graphics.drawable.shapes.RectShape -import android.graphics.drawable.shapes.RoundRectShape -import java.util.Locale - -class TextDrawable private constructor(builder: Builder) : ShapeDrawable(builder.shape) { - private val textPaint: Paint - private val borderPaint: Paint - private val text: String - private val color: Int - private val shape: RectShape - private val height: Int - private val width: Int - private val fontSize: Int - private val radius: Float - private val borderThickness: Int - private fun getDarkerShade(color: Int): Int { - return Color.rgb( - (SHADE_FACTOR * Color.red(color)).toInt(), - (SHADE_FACTOR * Color.green(color)).toInt(), - (SHADE_FACTOR * Color.blue(color)).toInt(), - ) - } - - override fun draw(canvas: Canvas) { - super.draw(canvas) - val r = bounds - - // draw border - if (borderThickness > 0) { - drawBorder(canvas) - } - val count = canvas.save() - canvas.translate(r.left.toFloat(), r.top.toFloat()) - - // draw text - val width = if (width < 0) r.width() else width - val height = if (height < 0) r.height() else height - val fontSize = if (fontSize < 0) Math.min(width, height) / 2 else fontSize - textPaint.textSize = fontSize.toFloat() - canvas.drawText( - text, - width / 2.toFloat(), - height / 2 - (textPaint.descent() + textPaint.ascent()) / 2, - textPaint, - ) - canvas.restoreToCount(count) - } - - private fun drawBorder(canvas: Canvas) { - val rect = RectF(bounds) - rect.inset(borderThickness / 2.toFloat(), borderThickness / 2.toFloat()) - if (shape is OvalShape) { - canvas.drawOval(rect, borderPaint) - } else if (shape is RoundRectShape) { - canvas.drawRoundRect(rect, radius, radius, borderPaint) - } else { - canvas.drawRect(rect, borderPaint) - } - } - - override fun setAlpha(alpha: Int) { - textPaint.alpha = alpha - } - - override fun setColorFilter(cf: ColorFilter?) { - textPaint.colorFilter = cf - } - - override fun getOpacity(): Int { - return PixelFormat.TRANSLUCENT - } - - override fun getIntrinsicWidth(): Int { - return width - } - - override fun getIntrinsicHeight(): Int { - return height - } - - class Builder : IConfigBuilder, IShapeBuilder, IBuilder { - var text = "" - var color: Int - var borderThickness: Int - var iconWidth: Int - var iconHeight: Int - var font: Typeface - var shape: RectShape - var iconTextColor: Int - var iconFontSize: Int - var isBold: Boolean - var iconToUpperCase: Boolean - var radius = 0f - override fun width(width: Int): IConfigBuilder { - iconWidth = width - return this - } - - override fun height(height: Int): IConfigBuilder { - iconHeight = height - return this - } - - override fun textColor(color: Int): IConfigBuilder { - iconTextColor = color - return this - } - - override fun withBorder(thickness: Int): IConfigBuilder { - borderThickness = thickness - return this - } - - override fun useFont(font: Typeface): IConfigBuilder { - this.font = font - return this - } - - override fun fontSize(size: Int): IConfigBuilder { - iconFontSize = size - return this - } - - override fun bold(): IConfigBuilder { - isBold = true - return this - } - - override fun toUpperCase(): IConfigBuilder { - iconToUpperCase = true - return this - } - - override fun beginConfig(): IConfigBuilder { - return this - } - - override fun endConfig(): IShapeBuilder { - return this - } - - override fun rect(): IBuilder { - shape = RectShape() - return this - } - - override fun round(): IBuilder { - shape = OvalShape() - return this - } - - override fun roundRect(radius: Int): IBuilder { - this.radius = radius.toFloat() - val radii = floatArrayOf( - radius.toFloat(), - radius.toFloat(), - radius.toFloat(), - radius.toFloat(), - radius.toFloat(), - radius.toFloat(), - radius.toFloat(), - radius.toFloat(), - ) - shape = RoundRectShape(radii, null, null) - return this - } - - override fun buildRect(text: String, color: Int): TextDrawable { - rect() - return build(text, color) - } - - override fun buildRoundRect(text: String, color: Int, radius: Int): TextDrawable { - roundRect(radius) - return build(text, color) - } - - override fun buildRound(text: String?, color: Int): TextDrawable { - round() - return build(text!!, color) - } - - override fun build(text: String, color: Int): TextDrawable { - this.color = color - this.text = text - return TextDrawable(this) - } - - init { - color = Color.GRAY - iconTextColor = Color.WHITE - borderThickness = 0 - iconWidth = -1 - iconHeight = -1 - shape = RectShape() - font = Typeface.create("sans-serif-light", Typeface.NORMAL) - iconFontSize = -1 - isBold = false - iconToUpperCase = false - } - } - - interface IConfigBuilder { - fun width(width: Int): IConfigBuilder - fun height(height: Int): IConfigBuilder - fun textColor(color: Int): IConfigBuilder - fun withBorder(thickness: Int): IConfigBuilder - fun useFont(font: Typeface): IConfigBuilder - fun fontSize(size: Int): IConfigBuilder - fun bold(): IConfigBuilder - fun toUpperCase(): IConfigBuilder - fun endConfig(): IShapeBuilder - } - - interface IBuilder { - fun build(text: String, color: Int): TextDrawable - } - - interface IShapeBuilder { - fun beginConfig(): IConfigBuilder - fun rect(): IBuilder - fun round(): IBuilder - fun roundRect(radius: Int): IBuilder - fun buildRect(text: String, color: Int): TextDrawable - fun buildRoundRect(text: String, color: Int, radius: Int): TextDrawable - fun buildRound(text: String?, color: Int): TextDrawable - } - - companion object { - private const val SHADE_FACTOR = 0.9f - fun builder(): IShapeBuilder { - return Builder() - } - } - - init { - - // shape properties - shape = builder.shape - height = builder.iconHeight - width = builder.iconWidth - radius = builder.radius - - // text and color - text = if (builder.iconToUpperCase) builder.text.uppercase(Locale.ROOT) else builder.text - color = builder.color - - // text paint settings - fontSize = builder.iconFontSize - textPaint = Paint() - textPaint.color = builder.iconTextColor - textPaint.isAntiAlias = true - textPaint.isFakeBoldText = builder.isBold - textPaint.style = Paint.Style.FILL - textPaint.typeface = builder.font - textPaint.textAlign = Paint.Align.CENTER - textPaint.strokeWidth = builder.borderThickness.toFloat() - - // border paint settings - borderThickness = builder.borderThickness - borderPaint = Paint() - borderPaint.color = getDarkerShade(color) - borderPaint.style = Paint.Style.STROKE - borderPaint.strokeWidth = borderThickness.toFloat() - - // drawable paint color - val paint = paint - paint.color = color - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/Toaster.kt b/androidApp/src/main/java/org/mifos/mobile/utils/Toaster.kt deleted file mode 100644 index 869884f82..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/Toaster.kt +++ /dev/null @@ -1,56 +0,0 @@ -package org.mifos.mobile.utils - -import android.content.Context -import android.view.View -import android.view.inputmethod.InputMethodManager -import com.google.android.material.snackbar.Snackbar -import org.mifos.mobile.MifosSelfServiceApp - -object Toaster { - - private val snackbarsQueue = ArrayList() - - @JvmOverloads - fun show(view: View?, text: String?, duration: Int = Snackbar.LENGTH_LONG) { - val imm = - MifosSelfServiceApp.context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.hideSoftInputFromWindow(view?.windowToken, 0) - val snackbar = Snackbar.make(view!!, text!!, duration) - snackbar.setAction("OK") { } - snackbar.addCallback(object : Snackbar.Callback() { - - override fun onDismissed(transientBottomBar: Snackbar, event: Int) { - super.onDismissed(transientBottomBar, event) - if (snackbarsQueue.isNotEmpty()) { - snackbarsQueue.removeAt(0) - if (snackbarsQueue.isNotEmpty()) { - snackbarsQueue[0].show() - } - } - } - }) - snackbarsQueue.add(snackbar) - if (!snackbarsQueue[0].isShown) { - snackbarsQueue[0].show() - } - } - - fun show(view: View, res: Int, duration: Int) { - show(view, MifosSelfServiceApp.context?.resources?.getString(res), duration) - } - - fun cancelTransfer( - view: View?, - text: String?, - buttonText: String?, - listener: View.OnClickListener?, - ) { - val snackbar = Snackbar.make(view!!, text!!, Snackbar.LENGTH_LONG) - snackbar.setAction(buttonText, listener) - snackbar.show() - } - - fun show(view: View?, res: Int) { - show(view, MifosSelfServiceApp.context?.resources?.getString(res)) - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/fcm/MifosFirebaseMessagingService.kt b/androidApp/src/main/java/org/mifos/mobile/utils/fcm/MifosFirebaseMessagingService.kt deleted file mode 100644 index 39523e0cc..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/fcm/MifosFirebaseMessagingService.kt +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright 2015 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.mifos.mobile.utils.fcm - -import android.app.NotificationManager -import android.app.PendingIntent -import android.content.Context -import android.content.Intent -import android.media.RingtoneManager -import android.util.Log -import androidx.core.app.NotificationCompat -import androidx.localbroadcastmanager.content.LocalBroadcastManager -import com.google.firebase.messaging.FirebaseMessagingService -import com.google.firebase.messaging.RemoteMessage -import org.mifos.mobile.R -import org.mifos.mobile.ui.activities.HomeActivity - -class MifosFirebaseMessagingService : FirebaseMessagingService() { - // [START receive_message] - override fun onMessageReceived(remoteMessage: RemoteMessage) { - val from = remoteMessage.from - val data = remoteMessage.data - val message = data[getString(R.string.message)] - if ((from?.startsWith("/topics/") == true)) { - // message received from some topic. - } else { - // normal downstream message. - } - sendNotification(message) - val registrationComplete = Intent(org.mifos.mobile.core.common.Constants.NOTIFY_HOME_FRAGMENT) - LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete) - } - // [END receive_message] - /** - * Create and show a simple notification containing the received FCM message. - * - * @param message FCM message received. - */ - private fun sendNotification(message: String?) { - val intent = Intent(this, HomeActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) - intent.putExtra(getString(R.string.notification), true) - val pendingIntent = PendingIntent.getActivity( - this, - 0 /* Request code */, - intent, - PendingIntent.FLAG_ONE_SHOT, - ) - val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) - val notificationBuilder = NotificationCompat.Builder(this) - .setSmallIcon(R.mipmap.core_common_mifos_icon) - .setContentTitle(getString(R.string.feature_about_app_name)) - .setContentText(message) - .setAutoCancel(true) - .setSound(defaultSoundUri) - .setContentIntent(pendingIntent) - val notificationManager = - getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - val notification = org.mifos.mobile.core.datastore.model.MifosNotification() - notification.msg = message - notification.timeStamp = System.currentTimeMillis() - notification.setRead(false) - notificationManager.notify(0, notificationBuilder.build()) - } - - /** - * Called if InstanceID token is updated. This may occur if the security of - * the previous token had been compromised. Note that this is called when the InstanceID token - * is initially generated so this is where you would retrieve the token. - */ - override fun onNewToken(s: String) { - super.onNewToken(s) - Log.d(TAG, "Refreshed token: $s") - val intent = Intent(this, RegistrationIntentService::class.java) - startService(intent) - } - - companion object { - private val TAG = MifosFirebaseMessagingService::class.java.simpleName - } -} diff --git a/androidApp/src/main/java/org/mifos/mobile/utils/fcm/RegistrationIntentService.kt b/androidApp/src/main/java/org/mifos/mobile/utils/fcm/RegistrationIntentService.kt deleted file mode 100644 index 2b8a689b2..000000000 --- a/androidApp/src/main/java/org/mifos/mobile/utils/fcm/RegistrationIntentService.kt +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright 2015 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.mifos.mobile.utils.fcm - -import android.app.IntentService -import android.content.Intent -import android.util.Log -import androidx.localbroadcastmanager.content.LocalBroadcastManager -import com.google.android.gms.tasks.OnCompleteListener -import com.google.firebase.messaging.FirebaseMessaging - -class RegistrationIntentService : IntentService(TAG) { - override fun onHandleIntent(intent: Intent?) { - FirebaseMessaging.getInstance().token - .addOnCompleteListener( - OnCompleteListener { task -> - if (!task.isSuccessful) { - Log.w(TAG, "getInstanceId failed", task.exception) - return@OnCompleteListener - } - - // Get new Instance ID token - val token = task.result - sendRegistrationToServer(token) - }, - ) - } - - private fun sendRegistrationToServer(token: String?) { - val registrationComplete = Intent(org.mifos.mobile.core.common.Constants.REGISTER_ON_SERVER) - registrationComplete.putExtra(org.mifos.mobile.core.common.Constants.TOKEN, token) - LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete) - } - - companion object { - private const val TAG = "RegIntentService" - } -} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivity.kt b/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivity.kt new file mode 100644 index 000000000..7ced2b270 --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivity.kt @@ -0,0 +1,105 @@ +/* + * 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-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.activity.viewModels +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.compose.rememberNavController +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch +import org.mifos.mobile.HomeActivityUiState.Success +import org.mifos.mobile.core.data.utils.NetworkMonitor +import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme +import org.mifos.mobile.navigation.MifosNavGraph.AUTH_GRAPH +import org.mifos.mobile.navigation.MifosNavGraph.PASSCODE_GRAPH +import org.mifos.mobile.navigation.RootNavGraph +import org.mifos.mobile.ui.rememberMifosMobileState +import javax.inject.Inject + +@AndroidEntryPoint +class HomeActivity : ComponentActivity() { + + @Inject + lateinit var networkMonitor: NetworkMonitor + + private val viewModel: HomeActivityViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + val splashScreen = installSplashScreen() + super.onCreate(savedInstanceState) + + var uiState: HomeActivityUiState by mutableStateOf(HomeActivityUiState.Loading) + + // Update the uiState + lifecycleScope.launch { + lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.uiState + .onEach { uiState = it } + .collect() + } + } + + splashScreen.setKeepOnScreenCondition { + when (uiState) { + HomeActivityUiState.Loading -> true + is Success -> false + } + } + + enableEdgeToEdge() + + setContent { + val navController = rememberNavController() + + val appState = rememberMifosMobileState(networkMonitor = networkMonitor) + + val navDestination = when (uiState) { + is Success -> if ((uiState as Success).userData.isAuthenticated) { + PASSCODE_GRAPH + } else { + AUTH_GRAPH + } + + else -> AUTH_GRAPH + } + + CompositionLocalProvider { + MifosMobileTheme { + RootNavGraph( + appState = appState, + navHostController = navController, + startDestination = navDestination, + onClickLogout = { + viewModel.logOut() + navController.navigate(AUTH_GRAPH) { + popUpTo(navController.graph.id) { + inclusive = true + } + } + }, + ) + } + } + } + } +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt b/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt new file mode 100644 index 000000000..fdfc7e533 --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt @@ -0,0 +1,50 @@ +/* + * 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-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +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.mifos.library.passcode.data.PasscodeManager +import org.mifos.mobile.core.data.repository.UserDataRepository +import org.mifos.mobile.core.model.UserData +import javax.inject.Inject + +@HiltViewModel +class HomeActivityViewModel @Inject constructor( + private val userDataRepository: UserDataRepository, + private val passcodeManager: PasscodeManager, +) : ViewModel() { + + val uiState: StateFlow = userDataRepository.userData.map { + HomeActivityUiState.Success(it) + }.stateIn( + scope = viewModelScope, + initialValue = HomeActivityUiState.Loading, + started = SharingStarted.WhileSubscribed(5_000), + ) + + fun logOut() { + viewModelScope.launch { + userDataRepository.logOut() + passcodeManager.clearPasscode() + } + } +} + +sealed interface HomeActivityUiState { + data object Loading : HomeActivityUiState + data class Success(val userData: UserData) : HomeActivityUiState +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/MifosSelfServiceApp.kt b/androidApp/src/main/kotlin/org/mifos/mobile/MifosSelfServiceApp.kt new file mode 100644 index 000000000..cf4270510 --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/MifosSelfServiceApp.kt @@ -0,0 +1,27 @@ +/* + * 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-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile + +import androidx.multidex.MultiDex +import androidx.multidex.MultiDexApplication +import com.google.firebase.crashlytics.FirebaseCrashlytics +import dagger.hilt.android.HiltAndroidApp +import org.mifos.mobile.core.datastore.PreferencesHelper +import org.mifos.mobile.feature.settings.applySavedTheme + +@HiltAndroidApp +class MifosSelfServiceApp : MultiDexApplication() { + override fun onCreate() { + super.onCreate() + MultiDex.install(this) + FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true) + PreferencesHelper(this).applySavedTheme() + } +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavGraph.kt b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavGraph.kt new file mode 100644 index 000000000..b20112e4b --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/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-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.navigation + +internal object MifosNavGraph { + const val ROOT_GRAPH = "root_graph" + const val AUTH_GRAPH = "auth_graph" + const val PASSCODE_GRAPH = "passcode_graph" + const val MAIN_GRAPH = "main_graph" +} diff --git a/androidApp/src/main/java/org/mifos/mobile/navigation/MifosNavGraph.kt b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavHost.kt similarity index 76% rename from androidApp/src/main/java/org/mifos/mobile/navigation/MifosNavGraph.kt rename to androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavHost.kt index 07f743199..e161cd448 100644 --- a/androidApp/src/main/java/org/mifos/mobile/navigation/MifosNavGraph.kt +++ b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavHost.kt @@ -1,3 +1,12 @@ +/* + * 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-mobile/blob/master/LICENSE.md + */ package org.mifos.mobile.navigation import android.app.Activity @@ -7,16 +16,14 @@ import android.net.Uri import android.provider.Settings import android.widget.Toast import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.navigation.NavController import androidx.navigation.NavHostController -import androidx.navigation.NavOptions import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController import com.google.android.gms.oss.licenses.OssLicensesMenuActivity -import com.mifos.compose.component.PasscodeScreen +import org.mifos.mobile.HomeActivity import org.mifos.mobile.R -import org.mifos.mobile.core.common.Constants.INTIAL_LOGIN import org.mifos.mobile.core.common.Constants.TRANSFER_PAY_TO import org.mifos.mobile.core.model.enums.AccountType import org.mifos.mobile.core.model.enums.ChargeType @@ -24,7 +31,6 @@ import org.mifos.mobile.feature.about.navigation.aboutUsNavGraph import org.mifos.mobile.feature.about.navigation.navigateToAboutUsScreen import org.mifos.mobile.feature.account.navigation.clientAccountsNavGraph import org.mifos.mobile.feature.account.navigation.navigateToClientAccountsScreen -import org.mifos.mobile.feature.auth.navigation.authenticationNavGraph import org.mifos.mobile.feature.auth.navigation.navigateToLoginScreen import org.mifos.mobile.feature.beneficiary.navigation.beneficiaryNavGraph import org.mifos.mobile.feature.beneficiary.navigation.navigateToAddBeneficiaryScreen @@ -37,8 +43,8 @@ import org.mifos.mobile.feature.guarantor.navigation.navigateToGuarantorScreen import org.mifos.mobile.feature.help.navigation.helpNavGraph import org.mifos.mobile.feature.help.navigation.navigateToHelpScreen import org.mifos.mobile.feature.home.navigation.HomeDestinations +import org.mifos.mobile.feature.home.navigation.HomeNavigation import org.mifos.mobile.feature.home.navigation.homeNavGraph -import org.mifos.mobile.feature.home.navigation.navigateToHomeScreen import org.mifos.mobile.feature.loan.navigation.loanNavGraph import org.mifos.mobile.feature.loan.navigation.navigateToLoanApplication import org.mifos.mobile.feature.loan.navigation.navigateToLoanDetailScreen @@ -62,51 +68,44 @@ import org.mifos.mobile.feature.transaction.navigation.navigateToRecentTransacti import org.mifos.mobile.feature.transaction.navigation.recentTransactionNavGraph import org.mifos.mobile.feature.transfer.process.navigation.navigateToTransferProcessScreen import org.mifos.mobile.feature.transfer.process.navigation.transferProcessNavGraph -import org.mifos.mobile.feature.update_password.navigation.navigateToUpdatePassword -import org.mifos.mobile.feature.update_password.navigation.updatePasswordNavGraph +import org.mifos.mobile.feature.update.password.navigation.navigateToUpdatePassword +import org.mifos.mobile.feature.update.password.navigation.updatePasswordNavGraph import org.mifos.mobile.feature.user.profile.navigation.navigateToUserProfile import org.mifos.mobile.feature.user.profile.navigation.userProfileNavGraph -import org.mifos.mobile.ui.activities.HomeActivity -import org.mifos.mobile.ui.activities.PassCodeActivity - @Composable -fun RootNavGraph( - startDestination: String, - navController: NavHostController, +fun MifosNavHost( + onClickLogout: () -> Unit, + modifier: Modifier = Modifier, ) { val context = LocalContext.current + val navController = rememberNavController() NavHost( navController = navController, - startDestination = startDestination, + route = MifosNavGraph.MAIN_GRAPH, + startDestination = HomeNavigation.HomeBase.route, + modifier = modifier, ) { homeNavGraph( - onNavigate = { handleHomeNavigation(navController, it, context) }, + onNavigate = { handleHomeNavigation(navController, it, onClickLogout, context) }, callHelpline = { callHelpline(context) }, - mailHelpline = { mailHelpline(context) } + mailHelpline = { mailHelpline(context) }, ) - authenticationNavGraph( - navController = navController, - navigateToPasscodeScreen = { startPassCodeActivity(context = context) } - ) - - guarantorNavGraph( - navController = navController, - ) + guarantorNavGraph(navController = navController) loanNavGraph( navController = navController, viewQr = navController::navigateToQrDisplayScreen, viewGuarantor = navController::navigateToGuarantorScreen, viewCharges = navController::navigateToClientChargeScreen, - makePayment = navController::navigateToSavingsMakeTransfer + makePayment = navController::navigateToSavingsMakeTransfer, ) userProfileNavGraph( navigateBack = navController::popBackStack, - navigateToChangePassword = navController::navigateToUpdatePassword + navigateToChangePassword = navController::navigateToUpdatePassword, ) updatePasswordNavGraph(navigateBack = navController::popBackStack) @@ -114,24 +113,20 @@ fun RootNavGraph( thirdPartyTransferNavGraph( navigateBack = navController::popBackStack, addBeneficiary = navController::navigateToAddBeneficiaryScreen, - reviewTransfer = navController::navigateToTransferProcessScreen + reviewTransfer = navController::navigateToTransferProcessScreen, ) settingsNavGraph( navigateBack = navController::popBackStack, changePassword = navController::navigateToUpdatePassword, - changePasscode = {}, // { navigateToUpdatePasscodeActivity(it, context) }, + changePasscode = {}, navigateToLoginScreen = navController::navigateToLoginScreen, - languageChanged = { startActivity(context, HomeActivity::class.java) } + languageChanged = { startActivity(context, HomeActivity::class.java) }, ) - recentTransactionNavGraph( - navigateBack = navController::popBackStack - ) + recentTransactionNavGraph(navigateBack = navController::popBackStack) - notificationNavGraph( - navigateBack = navController::popBackStack - ) + notificationNavGraph(navigateBack = navController::popBackStack) locationsNavGraph() @@ -139,16 +134,16 @@ fun RootNavGraph( findLocations = navController::navigateToLocationsScreen, navigateBack = navController::popBackStack, callHelpline = { callHelpline(context) }, - mailHelpline = { mailHelpline(context) } + mailHelpline = { mailHelpline(context) }, ) - clientChargeNavGraph( - navigateBack = navController::popBackStack - ) + clientChargeNavGraph(navigateBack = navController::popBackStack) aboutUsNavGraph( navController = navController, - navigateToOssLicense = { startActivity(context, OssLicensesMenuActivity::class.java) } + navigateToOssLicense = { + context.startActivity(Intent(context, OssLicensesMenuActivity::class.java)) + }, ) transferProcessNavGraph(navigateBack = navController::popBackStack) @@ -156,7 +151,7 @@ fun RootNavGraph( beneficiaryNavGraph( navController = navController, openQrImportScreen = navController::navigateToQrImportScreen, - openQrReaderScreen = navController::navigateToQrReaderScreen + openQrReaderScreen = navController::navigateToQrReaderScreen, ) qrNavGraph( @@ -169,7 +164,7 @@ fun RootNavGraph( viewCharges = navController::navigateToClientChargeScreen, viewQrCode = navController::navigateToQrDisplayScreen, callHelpline = { callHelpline(context) }, - reviewTransfer = navController::navigateToTransferProcessScreen + reviewTransfer = navController::navigateToTransferProcessScreen, ) clientAccountsNavGraph( @@ -182,38 +177,28 @@ fun RootNavGraph( AccountType.LOAN -> navController.navigateToLoanDetailScreen(loanId = id) AccountType.SHARE -> {} } - } + }, ) - - composable(PASSCODE_SCREEN) { - PasscodeScreen( - onForgotButton = navController::navigateToHomeScreen, - onSkipButton = navController::navigateToHomeScreen, - onPasscodeConfirm = { - navController.navigateToHomeScreen() - }, - onPasscodeRejected = {} - ) - } } } -const val PASSCODE_SCREEN = "passcode_screen" - -fun NavController.navigateToPasscodeScreen(navOptions: NavOptions? = null) { - return this.navigate(PASSCODE_SCREEN, navOptions) -} - fun handleHomeNavigation( navController: NavHostController, homeDestinations: HomeDestinations, - context: Context + onClickLogout: () -> Unit, + context: Context, ) { when (homeDestinations) { HomeDestinations.HOME -> Unit HomeDestinations.ACCOUNTS -> navController.navigateToClientAccountsScreen() - HomeDestinations.LOAN_ACCOUNT -> navController.navigateToClientAccountsScreen(accountType = AccountType.LOAN) - HomeDestinations.SAVINGS_ACCOUNT -> navController.navigateToClientAccountsScreen(accountType = AccountType.SAVINGS) + HomeDestinations.LOAN_ACCOUNT -> { + navController.navigateToClientAccountsScreen(accountType = AccountType.LOAN) + } + + HomeDestinations.SAVINGS_ACCOUNT -> { + navController.navigateToClientAccountsScreen(accountType = AccountType.SAVINGS) + } + HomeDestinations.RECENT_TRANSACTIONS -> navController.navigateToRecentTransaction() HomeDestinations.CHARGES -> navController.navigateToClientChargeScreen(ChargeType.CLIENT) HomeDestinations.THIRD_PARTY_TRANSFER -> navController.navigateToThirdPartyTransfer() @@ -228,10 +213,10 @@ fun handleHomeNavigation( openAppInfo(context) } - HomeDestinations.LOGOUT -> navController.navigateToLoginScreen() + HomeDestinations.LOGOUT -> onClickLogout.invoke() HomeDestinations.TRANSFER -> navController.navigateToSavingsMakeTransfer( accountId = 1, - transferType = TRANSFER_PAY_TO + transferType = TRANSFER_PAY_TO, ) HomeDestinations.BENEFICIARIES -> navController.navigateToBeneficiaryListScreen() @@ -245,20 +230,6 @@ fun startActivity(context: Context, clazz: Class) { context.startActivity(Intent(context, clazz)) } -private fun startPassCodeActivity(context: Context) { - val intent = Intent(context, PassCodeActivity::class.java) - intent.putExtra(INTIAL_LOGIN, true) - context.startActivity(intent) -} -// -//private fun navigateToUpdatePasscodeActivity(passcode: String, context: Context) { -// val intent = Intent(context, PassCodeActivity::class.java).apply { -// putExtra(CURR_PASSWORD, passcode) -// putExtra(IS_TO_UPDATE_PASS_CODE, true)s -// } -// context.startActivity(intent)ss -//} - private fun callHelpline(context: Context) { val intent = Intent(Intent.ACTION_DIAL) intent.data = @@ -271,11 +242,11 @@ private fun mailHelpline(context: Context) { data = Uri.parse("mailto:") putExtra( Intent.EXTRA_EMAIL, - arrayOf(context.getString(org.mifos.mobile.feature.home.R.string.contact_email)) + arrayOf(context.getString(org.mifos.mobile.feature.home.R.string.contact_email)), ) putExtra( Intent.EXTRA_SUBJECT, - context.getString(org.mifos.mobile.feature.home.R.string.user_query) + context.getString(org.mifos.mobile.feature.home.R.string.user_query), ) } try { diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/PasscodeNavGraph.kt b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/PasscodeNavGraph.kt new file mode 100644 index 000000000..b9be8e693 --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/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-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.navigation + +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavHostController +import androidx.navigation.navigation +import org.mifos.library.passcode.PASSCODE_SCREEN +import org.mifos.library.passcode.passcodeRoute + +internal fun NavGraphBuilder.passcodeNavGraph(navController: NavHostController) { + 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/androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt new file mode 100644 index 000000000..cc8d007da --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.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.mifos.library.passcode.navigateToPasscodeScreen +import org.mifos.mobile.feature.auth.navigation.authenticationNavGraph +import org.mifos.mobile.navigation.MifosNavGraph.AUTH_GRAPH +import org.mifos.mobile.ui.MifosApp +import org.mifos.mobile.ui.MifosMobileState + +@Composable +internal fun RootNavGraph( + appState: MifosMobileState, + navHostController: NavHostController, + startDestination: String, + onClickLogout: () -> Unit, + modifier: Modifier = Modifier, +) { + NavHost( + navController = navHostController, + startDestination = startDestination, + route = MifosNavGraph.ROOT_GRAPH, + modifier = modifier, + ) { + authenticationNavGraph( + navController = navHostController, + route = AUTH_GRAPH, + navigateToPasscodeScreen = navHostController::navigateToPasscodeScreen, + ) + + passcodeNavGraph(navHostController) + + composable(MifosNavGraph.MAIN_GRAPH) { + MifosApp( + appState = appState, + onClickLogout = onClickLogout, + ) + } + } +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosApp.kt b/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosApp.kt new file mode 100644 index 000000000..c8a46c215 --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosApp.kt @@ -0,0 +1,90 @@ +/* + * 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-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.ui + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.consumeWindowInsets +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarDuration.Indefinite +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.testTagsAsResourceId +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.mifos.mobile.R +import org.mifos.mobile.core.designsystem.theme.MifosBackground +import org.mifos.mobile.navigation.MifosNavHost + +@OptIn(ExperimentalComposeUiApi::class) +@Composable +fun MifosApp( + appState: MifosMobileState, + onClickLogout: () -> Unit, + modifier: Modifier = Modifier, +) { + MifosBackground(modifier) { + val snackbarHostState = remember { SnackbarHostState() } + + val isOffline by appState.isOffline.collectAsStateWithLifecycle() + + // If user is not connected to the internet show a snack bar to inform them. + val notConnectedMessage = stringResource(R.string.not_connected) + LaunchedEffect(isOffline) { + if (isOffline) { + snackbarHostState.showSnackbar( + message = notConnectedMessage, + duration = Indefinite, + ) + } + } + + Scaffold( + modifier = Modifier.semantics { + testTagsAsResourceId = true + }, + containerColor = Color.Transparent, + contentColor = MaterialTheme.colorScheme.onBackground, + snackbarHost = { SnackbarHost(snackbarHostState) }, + ) { padding -> + Box( + modifier = Modifier + .fillMaxSize() + .padding(padding) + .consumeWindowInsets(padding) + .windowInsetsPadding( + WindowInsets.safeDrawing.only( + WindowInsetsSides.Horizontal, + ), + ), + ) { + MifosNavHost( + onClickLogout = onClickLogout, + modifier = Modifier, + ) + } + } + } +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosMobileState.kt b/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosMobileState.kt new file mode 100644 index 000000000..b24792113 --- /dev/null +++ b/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosMobileState.kt @@ -0,0 +1,62 @@ +/* + * 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-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.ui + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.navigation.NavDestination +import androidx.navigation.NavHostController +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn +import org.mifos.mobile.core.data.utils.NetworkMonitor + +@Composable +fun rememberMifosMobileState( + networkMonitor: NetworkMonitor, + coroutineScope: CoroutineScope = rememberCoroutineScope(), + navController: NavHostController = rememberNavController(), +): MifosMobileState { + return remember( + navController, + coroutineScope, + networkMonitor, + ) { + MifosMobileState( + navController = navController, + coroutineScope = coroutineScope, + networkMonitor = networkMonitor, + ) + } +} + +@Stable +class MifosMobileState( + val navController: NavHostController, + coroutineScope: CoroutineScope, + networkMonitor: NetworkMonitor, +) { + val currentDestination: NavDestination? + @Composable get() = navController + .currentBackStackEntryAsState().value?.destination + + val isOffline = networkMonitor.isOnline + .map(Boolean::not) + .stateIn( + scope = coroutineScope, + started = SharingStarted.WhileSubscribed(5_000), + initialValue = false, + ) +} diff --git a/androidApp/src/main/res/anim/check_animation.xml b/androidApp/src/main/res/anim/check_animation.xml deleted file mode 100644 index c566312fa..000000000 --- a/androidApp/src/main/res/anim/check_animation.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable-hdpi/ic_qrcode_scan_gray_dark.xml b/androidApp/src/main/res/drawable-hdpi/ic_qrcode_scan_gray_dark.xml deleted file mode 100644 index d70535a7b..000000000 --- a/androidApp/src/main/res/drawable-hdpi/ic_qrcode_scan_gray_dark.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable-nodpi/example_appwidget_preview.png b/androidApp/src/main/res/drawable-nodpi/example_appwidget_preview.png deleted file mode 100644 index 894b069a4..000000000 Binary files a/androidApp/src/main/res/drawable-nodpi/example_appwidget_preview.png and /dev/null differ diff --git a/androidApp/src/main/res/drawable-v21/animated_check.xml b/androidApp/src/main/res/drawable-v21/animated_check.xml deleted file mode 100644 index 9bd298dd7..000000000 --- a/androidApp/src/main/res/drawable-v21/animated_check.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable-v21/mifos_splash_screen_logo.png b/androidApp/src/main/res/drawable-v21/mifos_splash_screen_logo.png deleted file mode 100644 index c1819abf0..000000000 Binary files a/androidApp/src/main/res/drawable-v21/mifos_splash_screen_logo.png and /dev/null differ diff --git a/androidApp/src/main/res/drawable/animated_check.xml b/androidApp/src/main/res/drawable/animated_check.xml deleted file mode 100644 index c43401e89..000000000 --- a/androidApp/src/main/res/drawable/animated_check.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/bg_about.png b/androidApp/src/main/res/drawable/bg_about.png deleted file mode 100644 index ae673c4bf..000000000 Binary files a/androidApp/src/main/res/drawable/bg_about.png and /dev/null differ diff --git a/androidApp/src/main/res/drawable/ic_about_us_black_24dp.xml b/androidApp/src/main/res/drawable/ic_about_us_black_24dp.xml deleted file mode 100644 index 6e75dbfc3..000000000 --- a/androidApp/src/main/res/drawable/ic_about_us_black_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_account_balance_black_24dp.xml b/androidApp/src/main/res/drawable/ic_account_balance_black_24dp.xml deleted file mode 100644 index 4da1d5287..000000000 --- a/androidApp/src/main/res/drawable/ic_account_balance_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_account_balance_wallet_black_24dp.xml b/androidApp/src/main/res/drawable/ic_account_balance_wallet_black_24dp.xml deleted file mode 100644 index fee88542c..000000000 --- a/androidApp/src/main/res/drawable/ic_account_balance_wallet_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_account_balance_wallet_black_background_24dp.xml b/androidApp/src/main/res/drawable/ic_account_balance_wallet_black_background_24dp.xml deleted file mode 100644 index dbd73b85a..000000000 --- a/androidApp/src/main/res/drawable/ic_account_balance_wallet_black_background_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_add_white_24dp.xml b/androidApp/src/main/res/drawable/ic_add_white_24dp.xml deleted file mode 100644 index d29480261..000000000 --- a/androidApp/src/main/res/drawable/ic_add_white_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_arrow_drop_down.xml b/androidApp/src/main/res/drawable/ic_arrow_drop_down.xml deleted file mode 100644 index e51044cc7..000000000 --- a/androidApp/src/main/res/drawable/ic_arrow_drop_down.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_arrow_up.xml b/androidApp/src/main/res/drawable/ic_arrow_up.xml deleted file mode 100644 index 7d4b75ca4..000000000 --- a/androidApp/src/main/res/drawable/ic_arrow_up.xml +++ /dev/null @@ -1,5 +0,0 @@ - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_assignment_turned_in_black_24dp.xml b/androidApp/src/main/res/drawable/ic_assignment_turned_in_black_24dp.xml deleted file mode 100644 index 7aeaab097..000000000 --- a/androidApp/src/main/res/drawable/ic_assignment_turned_in_black_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_attach_money_black_24dp.xml b/androidApp/src/main/res/drawable/ic_attach_money_black_24dp.xml deleted file mode 100644 index be66a221e..000000000 --- a/androidApp/src/main/res/drawable/ic_attach_money_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_backspace_48px.xml b/androidApp/src/main/res/drawable/ic_backspace_48px.xml deleted file mode 100644 index 7e1e137f1..000000000 --- a/androidApp/src/main/res/drawable/ic_backspace_48px.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_baseline_arrow_back_24.xml b/androidApp/src/main/res/drawable/ic_baseline_arrow_back_24.xml deleted file mode 100644 index cd06f3098..000000000 --- a/androidApp/src/main/res/drawable/ic_baseline_arrow_back_24.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_baseline_cloud_off_24.xml b/androidApp/src/main/res/drawable/ic_baseline_cloud_off_24.xml deleted file mode 100644 index 5207b48a9..000000000 --- a/androidApp/src/main/res/drawable/ic_baseline_cloud_off_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_baseline_dark_mode_24.xml b/androidApp/src/main/res/drawable/ic_baseline_dark_mode_24.xml deleted file mode 100644 index e52c5baff..000000000 --- a/androidApp/src/main/res/drawable/ic_baseline_dark_mode_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_baseline_filter_list_24.xml b/androidApp/src/main/res/drawable/ic_baseline_filter_list_24.xml deleted file mode 100644 index 52d959093..000000000 --- a/androidApp/src/main/res/drawable/ic_baseline_filter_list_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_beneficiaries_48px.xml b/androidApp/src/main/res/drawable/ic_beneficiaries_48px.xml deleted file mode 100644 index 1ccd32405..000000000 --- a/androidApp/src/main/res/drawable/ic_beneficiaries_48px.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_beneficiary_add_48px.xml b/androidApp/src/main/res/drawable/ic_beneficiary_add_48px.xml deleted file mode 100644 index 4ef00e2c0..000000000 --- a/androidApp/src/main/res/drawable/ic_beneficiary_add_48px.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_beneficiary_wrapper.xml b/androidApp/src/main/res/drawable/ic_beneficiary_wrapper.xml deleted file mode 100644 index 8436109e0..000000000 --- a/androidApp/src/main/res/drawable/ic_beneficiary_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_border_color_black_24dp.xml b/androidApp/src/main/res/drawable/ic_border_color_black_24dp.xml deleted file mode 100644 index 6821236b8..000000000 --- a/androidApp/src/main/res/drawable/ic_border_color_black_24dp.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/androidApp/src/main/res/drawable/ic_cake_24dp.xml b/androidApp/src/main/res/drawable/ic_cake_24dp.xml deleted file mode 100644 index 1b1025e7a..000000000 --- a/androidApp/src/main/res/drawable/ic_cake_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_cake_wrapper.xml b/androidApp/src/main/res/drawable/ic_cake_wrapper.xml deleted file mode 100644 index 11bc4ec9d..000000000 --- a/androidApp/src/main/res/drawable/ic_cake_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_charges.xml b/androidApp/src/main/res/drawable/ic_charges.xml deleted file mode 100644 index dc27ed8af..000000000 --- a/androidApp/src/main/res/drawable/ic_charges.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - diff --git a/androidApp/src/main/res/drawable/ic_check_circle_green_24px.xml b/androidApp/src/main/res/drawable/ic_check_circle_green_24px.xml deleted file mode 100644 index e9c6a620c..000000000 --- a/androidApp/src/main/res/drawable/ic_check_circle_green_24px.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_clients.png b/androidApp/src/main/res/drawable/ic_clients.png deleted file mode 100644 index 5a39aa030..000000000 Binary files a/androidApp/src/main/res/drawable/ic_clients.png and /dev/null differ diff --git a/androidApp/src/main/res/drawable/ic_compare_arrows_black_24dp.xml b/androidApp/src/main/res/drawable/ic_compare_arrows_black_24dp.xml deleted file mode 100644 index a16bbb784..000000000 --- a/androidApp/src/main/res/drawable/ic_compare_arrows_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_edit.xml b/androidApp/src/main/res/drawable/ic_edit.xml deleted file mode 100644 index c66b75b93..000000000 --- a/androidApp/src/main/res/drawable/ic_edit.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_edit_black_24dp.xml b/androidApp/src/main/res/drawable/ic_edit_black_24dp.xml deleted file mode 100644 index dbc718244..000000000 --- a/androidApp/src/main/res/drawable/ic_edit_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_edit_wrapper.xml b/androidApp/src/main/res/drawable/ic_edit_wrapper.xml deleted file mode 100644 index 5f836a0b6..000000000 --- a/androidApp/src/main/res/drawable/ic_edit_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_error_black_24dp.xml b/androidApp/src/main/res/drawable/ic_error_black_24dp.xml deleted file mode 100644 index b666c1818..000000000 --- a/androidApp/src/main/res/drawable/ic_error_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_file_upload_black_24dp.xml b/androidApp/src/main/res/drawable/ic_file_upload_black_24dp.xml deleted file mode 100644 index 7bd6fa147..000000000 --- a/androidApp/src/main/res/drawable/ic_file_upload_black_24dp.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_filter_list_black_24dp.xml b/androidApp/src/main/res/drawable/ic_filter_list_black_24dp.xml deleted file mode 100644 index d47884fbf..000000000 --- a/androidApp/src/main/res/drawable/ic_filter_list_black_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_flash_off.xml b/androidApp/src/main/res/drawable/ic_flash_off.xml deleted file mode 100644 index ea32cd62e..000000000 --- a/androidApp/src/main/res/drawable/ic_flash_off.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_flash_on.xml b/androidApp/src/main/res/drawable/ic_flash_on.xml deleted file mode 100644 index c7fb081c9..000000000 --- a/androidApp/src/main/res/drawable/ic_flash_on.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_gender_24dp.xml b/androidApp/src/main/res/drawable/ic_gender_24dp.xml deleted file mode 100644 index fb8596be4..000000000 --- a/androidApp/src/main/res/drawable/ic_gender_24dp.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/androidApp/src/main/res/drawable/ic_gender_wrapper.xml b/androidApp/src/main/res/drawable/ic_gender_wrapper.xml deleted file mode 100644 index 670cd3555..000000000 --- a/androidApp/src/main/res/drawable/ic_gender_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_help_black_24dp.xml b/androidApp/src/main/res/drawable/ic_help_black_24dp.xml deleted file mode 100644 index b1d7a2cf5..000000000 --- a/androidApp/src/main/res/drawable/ic_help_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_info_black_24dp.xml b/androidApp/src/main/res/drawable/ic_info_black_24dp.xml deleted file mode 100644 index 0cbb99601..000000000 --- a/androidApp/src/main/res/drawable/ic_info_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_keyboard_arrow_right_black_24dp.xml b/androidApp/src/main/res/drawable/ic_keyboard_arrow_right_black_24dp.xml deleted file mode 100644 index 138fcc3eb..000000000 --- a/androidApp/src/main/res/drawable/ic_keyboard_arrow_right_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_label_black_24dp.xml b/androidApp/src/main/res/drawable/ic_label_black_24dp.xml deleted file mode 100644 index 0e887d432..000000000 --- a/androidApp/src/main/res/drawable/ic_label_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_loan.xml b/androidApp/src/main/res/drawable/ic_loan.xml deleted file mode 100644 index 83555f96a..000000000 --- a/androidApp/src/main/res/drawable/ic_loan.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_local_atm_black_24dp.xml b/androidApp/src/main/res/drawable/ic_local_atm_black_24dp.xml deleted file mode 100644 index 07b27418c..000000000 --- a/androidApp/src/main/res/drawable/ic_local_atm_black_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_location.xml b/androidApp/src/main/res/drawable/ic_location.xml deleted file mode 100644 index 84e8820d2..000000000 --- a/androidApp/src/main/res/drawable/ic_location.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_location_wrapper.xml b/androidApp/src/main/res/drawable/ic_location_wrapper.xml deleted file mode 100644 index 8e4a381e1..000000000 --- a/androidApp/src/main/res/drawable/ic_location_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_logout.xml b/androidApp/src/main/res/drawable/ic_logout.xml deleted file mode 100644 index a5b54e5c9..000000000 --- a/androidApp/src/main/res/drawable/ic_logout.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_mail.xml b/androidApp/src/main/res/drawable/ic_mail.xml deleted file mode 100644 index 0a291858e..000000000 --- a/androidApp/src/main/res/drawable/ic_mail.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_mail_wrapper.xml b/androidApp/src/main/res/drawable/ic_mail_wrapper.xml deleted file mode 100644 index 0c92f4ae4..000000000 --- a/androidApp/src/main/res/drawable/ic_mail_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_notification_wrapper.xml b/androidApp/src/main/res/drawable/ic_notification_wrapper.xml deleted file mode 100644 index ed08903a3..000000000 --- a/androidApp/src/main/res/drawable/ic_notification_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_person_black_24dp.xml b/androidApp/src/main/res/drawable/ic_person_black_24dp.xml deleted file mode 100644 index 55495d5a0..000000000 --- a/androidApp/src/main/res/drawable/ic_person_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_phone_24dp.xml b/androidApp/src/main/res/drawable/ic_phone_24dp.xml deleted file mode 100644 index b9a9fdf2b..000000000 --- a/androidApp/src/main/res/drawable/ic_phone_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_phone_wrapper.xml b/androidApp/src/main/res/drawable/ic_phone_wrapper.xml deleted file mode 100644 index a1c9b14e8..000000000 --- a/androidApp/src/main/res/drawable/ic_phone_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_qrcode_scan.xml b/androidApp/src/main/res/drawable/ic_qrcode_scan.xml deleted file mode 100644 index 5b0e12ba0..000000000 --- a/androidApp/src/main/res/drawable/ic_qrcode_scan.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_question_answer_black_24dp.xml b/androidApp/src/main/res/drawable/ic_question_answer_black_24dp.xml deleted file mode 100644 index 4932df431..000000000 --- a/androidApp/src/main/res/drawable/ic_question_answer_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_refresh_black_24dp.xml b/androidApp/src/main/res/drawable/ic_refresh_black_24dp.xml deleted file mode 100644 index 1f9072a36..000000000 --- a/androidApp/src/main/res/drawable/ic_refresh_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_report_problem_red_24px.xml b/androidApp/src/main/res/drawable/ic_report_problem_red_24px.xml deleted file mode 100644 index fa6d437a1..000000000 --- a/androidApp/src/main/res/drawable/ic_report_problem_red_24px.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_search.png b/androidApp/src/main/res/drawable/ic_search.png deleted file mode 100644 index bfa4d4f08..000000000 Binary files a/androidApp/src/main/res/drawable/ic_search.png and /dev/null differ diff --git a/androidApp/src/main/res/drawable/ic_settings.xml b/androidApp/src/main/res/drawable/ic_settings.xml deleted file mode 100644 index bfa34fea9..000000000 --- a/androidApp/src/main/res/drawable/ic_settings.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_share.xml b/androidApp/src/main/res/drawable/ic_share.xml deleted file mode 100644 index 57536fdfc..000000000 --- a/androidApp/src/main/res/drawable/ic_share.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_share_black_24dp.xml b/androidApp/src/main/res/drawable/ic_share_black_24dp.xml deleted file mode 100644 index 338d95ad5..000000000 --- a/androidApp/src/main/res/drawable/ic_share_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_share_wrapper.xml b/androidApp/src/main/res/drawable/ic_share_wrapper.xml deleted file mode 100644 index fda1d8c45..000000000 --- a/androidApp/src/main/res/drawable/ic_share_wrapper.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_success.xml b/androidApp/src/main/res/drawable/ic_success.xml deleted file mode 100644 index fb51d988b..000000000 --- a/androidApp/src/main/res/drawable/ic_success.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/androidApp/src/main/res/drawable/ic_supervisor_account_black_24dp.xml b/androidApp/src/main/res/drawable/ic_supervisor_account_black_24dp.xml deleted file mode 100644 index 800c58d45..000000000 --- a/androidApp/src/main/res/drawable/ic_supervisor_account_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/androidApp/src/main/res/drawable/ic_visibility_24px.xml b/androidApp/src/main/res/drawable/ic_visibility_24px.xml deleted file mode 100644 index 229fda028..000000000 --- a/androidApp/src/main/res/drawable/ic_visibility_24px.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_visibility_off_24px.xml b/androidApp/src/main/res/drawable/ic_visibility_off_24px.xml deleted file mode 100644 index 8e840f753..000000000 --- a/androidApp/src/main/res/drawable/ic_visibility_off_24px.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_wrapped_lock_black_24dp.xml b/androidApp/src/main/res/drawable/ic_wrapped_lock_black_24dp.xml deleted file mode 100644 index f0b49c99e..000000000 --- a/androidApp/src/main/res/drawable/ic_wrapped_lock_black_24dp.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/ic_wrapped_person_black_24dp.xml b/androidApp/src/main/res/drawable/ic_wrapped_person_black_24dp.xml deleted file mode 100644 index 0b1822d0a..000000000 --- a/androidApp/src/main/res/drawable/ic_wrapped_person_black_24dp.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable-hdpi/mifos_logo.png b/androidApp/src/main/res/drawable/mifos_logo.png similarity index 100% rename from androidApp/src/main/res/drawable-hdpi/mifos_logo.png rename to androidApp/src/main/res/drawable/mifos_logo.png diff --git a/androidApp/src/main/res/drawable/mifos_splash_screen_logo.png b/androidApp/src/main/res/drawable/mifos_splash_screen_logo.png new file mode 100644 index 000000000..4a515337a Binary files /dev/null and b/androidApp/src/main/res/drawable/mifos_splash_screen_logo.png differ diff --git a/androidApp/src/main/res/drawable/notification_circle.xml b/androidApp/src/main/res/drawable/notification_circle.xml deleted file mode 100644 index 4de8cdbd3..000000000 --- a/androidApp/src/main/res/drawable/notification_circle.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/rectangular_border.xml b/androidApp/src/main/res/drawable/rectangular_border.xml deleted file mode 100644 index 92845c9b6..000000000 --- a/androidApp/src/main/res/drawable/rectangular_border.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/round_corner.xml b/androidApp/src/main/res/drawable/round_corner.xml deleted file mode 100644 index 4e4da7946..000000000 --- a/androidApp/src/main/res/drawable/round_corner.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/scrim.xml b/androidApp/src/main/res/drawable/scrim.xml deleted file mode 100644 index 4320acfb9..000000000 --- a/androidApp/src/main/res/drawable/scrim.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/splash_background.xml b/androidApp/src/main/res/drawable/splash_background.xml deleted file mode 100644 index 2262620e4..000000000 --- a/androidApp/src/main/res/drawable/splash_background.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/splash_icon.xml b/androidApp/src/main/res/drawable/splash_icon.xml new file mode 100644 index 000000000..fb9902e0e --- /dev/null +++ b/androidApp/src/main/res/drawable/splash_icon.xml @@ -0,0 +1,21 @@ + + + + + + + + + \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/triangular_green_view.xml b/androidApp/src/main/res/drawable/triangular_green_view.xml deleted file mode 100644 index d6cd9b495..000000000 --- a/androidApp/src/main/res/drawable/triangular_green_view.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/triangular_red_view.xml b/androidApp/src/main/res/drawable/triangular_red_view.xml deleted file mode 100644 index 66994c39a..000000000 --- a/androidApp/src/main/res/drawable/triangular_red_view.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - \ No newline at end of file diff --git a/androidApp/src/main/res/layout-land/fragment_beneficiary_add_options.xml b/androidApp/src/main/res/layout-land/fragment_beneficiary_add_options.xml deleted file mode 100644 index 96b2fc91b..000000000 --- a/androidApp/src/main/res/layout-land/fragment_beneficiary_add_options.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/androidApp/src/main/res/layout/account_spinner_layout.xml b/androidApp/src/main/res/layout/account_spinner_layout.xml deleted file mode 100644 index 2dfc79e1c..000000000 --- a/androidApp/src/main/res/layout/account_spinner_layout.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/androidApp/src/main/res/layout/action_bar_notification_layout.xml b/androidApp/src/main/res/layout/action_bar_notification_layout.xml deleted file mode 100644 index c94345343..000000000 --- a/androidApp/src/main/res/layout/action_bar_notification_layout.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/layout/activity_accounts.xml b/androidApp/src/main/res/layout/activity_accounts.xml deleted file mode 100644 index 1627e9856..000000000 --- a/androidApp/src/main/res/layout/activity_accounts.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - diff --git a/androidApp/src/main/res/layout/activity_client_list.xml b/androidApp/src/main/res/layout/activity_client_list.xml deleted file mode 100644 index 2908c07e6..000000000 --- a/androidApp/src/main/res/layout/activity_client_list.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/layout/activity_container.xml b/androidApp/src/main/res/layout/activity_container.xml deleted file mode 100644 index 5f6d1704a..000000000 --- a/androidApp/src/main/res/layout/activity_container.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - diff --git a/androidApp/src/main/res/layout/activity_edit_user_detail.xml b/androidApp/src/main/res/layout/activity_edit_user_detail.xml deleted file mode 100644 index 757dd55ab..000000000 --- a/androidApp/src/main/res/layout/activity_edit_user_detail.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - diff --git a/androidApp/src/main/res/layout/activity_home.xml b/androidApp/src/main/res/layout/activity_home.xml deleted file mode 100644 index f568fc257..000000000 --- a/androidApp/src/main/res/layout/activity_home.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - diff --git a/androidApp/src/main/res/layout/activity_loan_application.xml b/androidApp/src/main/res/layout/activity_loan_application.xml deleted file mode 100644 index 5539c1cdb..000000000 --- a/androidApp/src/main/res/layout/activity_loan_application.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - diff --git a/androidApp/src/main/res/layout/activity_login.xml b/androidApp/src/main/res/layout/activity_login.xml deleted file mode 100644 index 6d2c55418..000000000 --- a/androidApp/src/main/res/layout/activity_login.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - -