diff --git a/.github/workflows/macos-distribute.yaml b/.github/workflows/macos-distribute.yaml new file mode 100644 index 00000000..aa8560a5 --- /dev/null +++ b/.github/workflows/macos-distribute.yaml @@ -0,0 +1,113 @@ +name: macOS Build & Distribute (TestFlight / App Store) + +on: + workflow_dispatch: + inputs: + distribution: + description: Where to distribute this build + type: choice + required: true + options: [testflight, appstore] + default: testflight + +jobs: + build_and_ship: + name: Build & Ship to → ${{ inputs.distribution }} + runs-on: macos-latest + + env: + KEYCHAIN_NAME: signing-${{ github.run_id }}.keychain-db + KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + APP_IDENTIFIER: org.mifospay + APPSTORE_KEY_ID: ${{ secrets.APPSTORE_KEY_ID }} + APPSTORE_ISSUER_ID: ${{ secrets.APPSTORE_ISSUER_ID }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: ☕ Set up Java 21 (Temurin) + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "21" + + - name: Set up Ruby & bundle + uses: ruby/setup-ruby@v1 + with: + bundler-cache: true + + - name: Install Fastlane dependencies + shell: bash + run: | + gem install bundler + bundler install --jobs 4 --retry 3 + + - name: Create & unlock temporary keychain + run: | + security create-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}" + security set-keychain-settings -lut 21600 "${KEYCHAIN_NAME}" + security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}" + security list-keychains -d user -s "${KEYCHAIN_NAME}" $(security list-keychains -d user | sed 's/[ "]//g') + + - name: Import Mac App Distribution certificate + env: + MAC_APP_DISTRIBUTION_CERTIFICATE_B64: ${{ secrets.MAC_APP_DISTRIBUTION_CERTIFICATE_B64 }} + CERTIFICATES_PASSWORD: ${{ secrets.CERTIFICATES_PASSWORD }} + run: | + CERT="${RUNNER_TEMP}/mac_app_distribution.p12" + printf '%s' "$MAC_APP_DISTRIBUTION_CERTIFICATE_B64" | base64 -D > "$CERT" + security import "$CERT" -P "$CERTIFICATES_PASSWORD" -A -t cert -f pkcs12 -k "${KEYCHAIN_NAME}" + security set-key-partition-list -S apple-tool:,apple: -k "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}" + echo "APP_CERTIFICATE_PATH=$CERT" >> "$GITHUB_ENV" + + - name: Import Mac Installer Distribution certificate + env: + MAC_INSTALLER_DISTRIBUTION_CERTIFICATE_B64: ${{ secrets.MAC_INSTALLER_DISTRIBUTION_CERTIFICATE_B64 }} + CERTIFICATES_PASSWORD: ${{ secrets.CERTIFICATES_PASSWORD }} + run: | + CERT="${RUNNER_TEMP}/mac_installer_distribution.p12" + printf '%s' "$MAC_INSTALLER_DISTRIBUTION_CERTIFICATE_B64" | base64 -D > "$CERT" + security import "$CERT" -P "$CERTIFICATES_PASSWORD" -A -t cert -f pkcs12 -k "${KEYCHAIN_NAME}" + security set-key-partition-list -S apple-tool:,apple: -k "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}" + echo "INSTALLER_CERTIFICATE_PATH=$CERT" >> "$GITHUB_ENV" + + - name: Write Embedded provisioning profile + env: + MAC_EMBEDDED_PROVISION_B64: ${{ secrets.MAC_EMBEDDED_PROVISION_B64 }} + run: | + mkdir -p cmp-desktop + echo "$MAC_EMBEDDED_PROVISION_B64" > cmp-desktop/embedded.provisionprofile.b64 + base64 -d -i cmp-desktop/embedded.provisionprofile.b64 > cmp-desktop/embedded.provisionprofile + + - name: Write Runtime provisioning profile + env: + MAC_RUNTIME_PROVISION_B64: ${{ secrets.MAC_RUNTIME_PROVISION_B64 }} + run: | + echo "$MAC_RUNTIME_PROVISION_B64" > cmp-desktop/runtime.provisionprofile.b64 + base64 -d -i cmp-desktop/runtime.provisionprofile.b64 > cmp-desktop/runtime.provisionprofile + + - name: Write App Store Connect API key (.p8) + env: + APPSTORE_CONNECT_API_KEY_B64: ${{ secrets.APPSTORE_AUTH_KEY }} + run: | + mkdir -p secrets + echo "$APPSTORE_CONNECT_API_KEY_B64" | base64 --decode > secrets/Auth_key.p8 + + - name: Upload to TestFlight + if: ${{ inputs.distribution == 'testflight' }} + run: | + bundle exec fastlane mac desktop_testflight \ + app_identifier:"$APP_IDENTIFIER" \ + appstore_key_id:"$APPSTORE_KEY_ID" \ + appstore_issuer_id:"$APPSTORE_ISSUER_ID" \ + key_file_path:secrets/Auth_key.p8 + + - name: Submit to App Store (Production) + if: ${{ inputs.distribution == 'appstore' }} + run: | + bundle exec fastlane mac desktop_release \ + app_identifier:"$APP_IDENTIFIER" \ + appstore_key_id:"$APPSTORE_KEY_ID" \ + appstore_issuer_id:"$APPSTORE_ISSUER_ID" \ + key_file_path:secrets/Auth_key.p8 diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index 5b2d3a2a..3c63a8e7 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -91,3 +91,4 @@ jobs: build_ios: true use_cocoapods: true shared_module: ':cmp-shared' + java-version: '21' diff --git a/.gitignore b/.gitignore index 00621190..7f93b378 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,5 @@ secrets/ # Sync Log File *.log + +*.provisionprofile diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index d91b281d..c66e3844 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -9,8 +9,8 @@ group = "org.mifospay.buildlogic" // Configure the build-logic plugins to target JDK 19 // This matches the JDK used to build the project, and is not related to what is running on device. java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } kotlin { diff --git a/build-logic/convention/src/main/kotlin/org/mifospay/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/org/mifospay/KotlinAndroid.kt index e53be045..d945cfa5 100644 --- a/build-logic/convention/src/main/kotlin/org/mifospay/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/org/mifospay/KotlinAndroid.kt @@ -28,8 +28,8 @@ internal fun Project.configureKotlinAndroid( compileOptions { // Up to Java 11 APIs are available through desugaring // https://developer.android.com/studio/write/java11-minimal-support-table - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 isCoreLibraryDesugaringEnabled = true } } @@ -48,8 +48,8 @@ internal fun Project.configureKotlinJvm() { extensions.configure { // Up to Java 11 APIs are available through desugaring // https://developer.android.com/studio/write/java11-minimal-support-table - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } configureKotlin() @@ -63,7 +63,7 @@ private fun Project.configureKotlin() { tasks.withType().configureEach { compilerOptions { // Set JVM target to 17 - jvmTarget = JvmTarget.JVM_17 + jvmTarget = JvmTarget.JVM_21 // Treat all Kotlin warnings as errors (disabled by default) // Override by setting warningsAsErrors=true in your ~/.gradle/gradle.properties val warningsAsErrors: String? by project diff --git a/cmp-android/dependencies/prodReleaseRuntimeClasspath.tree.txt b/cmp-android/dependencies/prodReleaseRuntimeClasspath.tree.txt index f666a361..71423e10 100644 --- a/cmp-android/dependencies/prodReleaseRuntimeClasspath.tree.txt +++ b/cmp-android/dependencies/prodReleaseRuntimeClasspath.tree.txt @@ -313,23 +313,23 @@ | | | | | | | +--- androidx.lifecycle:lifecycle-common:2.9.2 (*) | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib -> 2.1.21 (*) | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1 -> 1.10.2 (*) -| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 -| | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 (c) -| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.0 (c) -| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 (c) -| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-io-jvm:1.8.0 (c) -| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-io:1.8.0 (c) -| | | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 (c) -| | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -> 2.1.21 (*) +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.1 +| | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.1 +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.1 +| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.1 (c) +| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.1 (c) +| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.1 (c) +| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (c) +| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-io:1.8.1 (c) +| | | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-json-io-jvm:1.8.1 (c) +| | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*) | | | | | | | +--- androidx.savedstate:savedstate-compose:1.3.1 (c) | | | | | | | +--- androidx.savedstate:savedstate-ktx:1.3.1 (c) | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.21 (c) | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib -> 2.1.21 (*) | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1 -> 1.10.2 (*) | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1 -> 1.10.2 (*) -| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.1 (*) | | | | | | +--- androidx.lifecycle:lifecycle-common:2.9.2 (c) | | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.9.2 (c) | | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.9.2 (c) @@ -879,7 +879,7 @@ | | +--- androidx.lifecycle:lifecycle-viewmodel:2.9.2 (*) | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.2 (*) | | +--- org.jetbrains.kotlin:kotlin-stdlib -> 2.1.21 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.1 (*) | | +--- androidx.lifecycle:lifecycle-common:2.9.2 (c) | | +--- androidx.lifecycle:lifecycle-livedata:2.9.2 (c) | | +--- androidx.lifecycle:lifecycle-livedata-core:2.9.2 (c) @@ -943,11 +943,11 @@ | | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.8.2 (*) | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib -> 2.1.21 (*) | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.10.2 (*) -| | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.1 (*) | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.8.2 (*) | | | | +--- org.jetbrains.kotlin:kotlin-stdlib -> 2.1.21 (*) | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.10.2 (*) -| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.1 (*) | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*) | | +--- androidx.appcompat:appcompat:1.7.1 | | | +--- androidx.activity:activity:1.8.0 -> 1.10.1 (*) @@ -1222,7 +1222,7 @@ | | | | | +--- androidx.profileinstaller:profileinstaller:1.4.0 -> 1.4.1 (*) | | | | | +--- androidx.savedstate:savedstate:1.3.0 -> 1.3.1 (*) | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib -> 2.1.21 (*) -| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.1 (*) | | | | | +--- androidx.navigation:navigation-compose:2.9.2 (c) | | | | | +--- androidx.navigation:navigation-fragment:2.9.2 (c) | | | | | +--- androidx.navigation:navigation-fragment-ktx:2.9.2 (c) @@ -1242,7 +1242,7 @@ | | | | | +--- androidx.navigation:navigation-common:2.9.2 (*) | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib -> 2.1.21 (*) | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.10.2 (*) -| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.1 (*) | | | | | +--- androidx.navigation:navigation-common:2.9.2 (c) | | | | | +--- androidx.navigation:navigation-compose:2.9.2 (c) | | | | | +--- androidx.navigation:navigation-fragment:2.9.2 (c) @@ -1269,7 +1269,7 @@ | | | | | \--- androidx.collection:collection:1.1.0 -> 1.5.0 (*) | | | | +--- org.jetbrains.kotlin:kotlin-stdlib -> 2.1.21 (*) | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.10.2 (*) -| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.1 (*) | | | | +--- androidx.navigation:navigation-common:2.9.2 (c) | | | | +--- androidx.navigation:navigation-compose:2.9.2 (c) | | | | +--- androidx.navigation:navigation-fragment-ktx:2.9.2 (c) @@ -1343,9 +1343,9 @@ | | | | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -> 2.1.21 (*) | | | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -> 2.1.21 (*) | | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*) -| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 (*) +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -> 1.8.1 (*) | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*) -| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -> 1.8.1 (*) | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*) | | | | | +--- io.ktor:ktor-http-cio:3.1.2 | | | | | | \--- io.ktor:ktor-http-cio-jvm:3.1.2 @@ -1424,11 +1424,11 @@ | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.10.2 (*) | | | +--- org.jetbrains.compose.runtime:runtime:1.8.2 (*) | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.1 (*) -| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 -| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.0 -| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 (*) -| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -> 2.1.21 (*) -| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 +| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.1 +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.1 (*) | | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 | | | | \--- org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.8 | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.1.21 (*) @@ -1449,21 +1449,21 @@ | | | | \--- com.russhwolf:multiplatform-settings-serialization-android:1.3.0 | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -> 2.1.21 (*) | | | | +--- com.russhwolf:multiplatform-settings:1.3.0 (*) -| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.1 (*) | | | +--- com.russhwolf:multiplatform-settings-coroutines:1.3.0 | | | | \--- com.russhwolf:multiplatform-settings-coroutines-android:1.3.0 | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -> 2.1.21 (*) | | | | +--- com.russhwolf:multiplatform-settings:1.3.0 (*) | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.2 (*) | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.2 (*) -| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.1 (*) | | | +--- project :core:model | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*) | | | | +--- io.insert-koin:koin-bom:4.1.0 (*) | | | | +--- io.insert-koin:koin-core:4.1.0 (*) | | | | +--- io.insert-koin:koin-annotations:2.1.0 (*) | | | | +--- project :core:common (*) -| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | | | \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.20 (*) | | | \--- project :core:common (*) | | +--- project :core:model (*) @@ -1508,16 +1508,16 @@ | | | | | | +--- org.slf4j:slf4j-api:2.0.16 | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 -> 1.10.2 (*) | | | | | | +--- io.ktor:ktor-serialization:3.1.2 (*) -| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -> 1.8.1 (*) | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*) -| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 (*) -| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-io:1.8.0 -| | | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-json-io-jvm:1.8.0 -| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 (*) -| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -> 2.1.21 (*) -| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 (*) -| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 (*) -| | | | | | \--- org.jetbrains.kotlinx:kotlinx-io-core:0.4.0 -> 0.7.0 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 -> 1.8.1 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-io:1.8.0 -> 1.8.1 +| | | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-json-io-jvm:1.8.1 +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.1 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) +| | | | | | \--- org.jetbrains.kotlinx:kotlinx-io-core:0.6.0 -> 0.7.0 (*) | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*) | | | | +--- io.ktor:ktor-client-auth:3.1.2 | | | | | \--- io.ktor:ktor-client-auth-jvm:3.1.2 @@ -1547,7 +1547,7 @@ | | | +--- io.insert-koin:koin-annotations:2.1.0 (*) | | | +--- project :core:model (*) | | | +--- project :core:datastore (*) -| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | | +--- io.ktor:ktor-client-json:3.1.2 | | | | \--- io.ktor:ktor-client-json-jvm:3.1.2 | | | | +--- org.slf4j:slf4j-api:2.0.16 @@ -1559,7 +1559,7 @@ | | | | +--- org.slf4j:slf4j-api:2.0.16 | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 -> 1.10.2 (*) | | | | +--- io.ktor:ktor-client-core:3.1.2 (*) -| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 -> 1.8.1 (*) | | | | +--- io.ktor:ktor-client-json:3.1.2 (*) | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*) | | | \--- com.squareup.okio:okio:3.15.0 (*) @@ -1575,7 +1575,7 @@ | | | +--- io.insert-koin:koin-core:4.1.0 (*) | | | +--- io.insert-koin:koin-annotations:2.1.0 (*) | | | \--- org.jetbrains.compose.runtime:runtime:1.8.2 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.runtime:runtime:1.8.2 (*) | | +--- org.jetbrains.compose.components:components-resources:1.8.2 (*) | | \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.20 (*) @@ -1935,7 +1935,7 @@ | | | | | \--- androidx.savedstate:savedstate-ktx:1.3.1 (c) | | | | +--- org.jetbrains.kotlin:kotlin-stdlib -> 2.1.21 (*) | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.10.2 (*) -| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.1 (*) | | | | +--- androidx.navigation:navigation-common:2.9.2 (c) | | | | +--- androidx.navigation:navigation-fragment-ktx:2.9.2 (c) | | | | +--- androidx.navigation:navigation-runtime:2.9.2 (c) @@ -1956,7 +1956,7 @@ | | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.1 (*) | | | | +--- org.jetbrains.androidx.savedstate:savedstate:1.3.1 (*) | | | | +--- org.jetbrains.kotlin:kotlin-stdlib -> 2.1.21 (*) -| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.1 (*) | | | +--- org.jetbrains.androidx.navigation:navigation-runtime:2.9.0-beta03 | | | | +--- androidx.annotation:annotation:1.9.1 (*) | | | | +--- androidx.collection:collection:1.5.0-beta01 -> 1.5.0 (*) @@ -1968,7 +1968,7 @@ | | | | +--- org.jetbrains.androidx.navigation:navigation-common:2.9.0-beta03 (*) | | | | +--- org.jetbrains.androidx.savedstate:savedstate:1.3.1 (*) | | | | +--- org.jetbrains.kotlin:kotlin-stdlib -> 2.1.21 (*) -| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.1 (*) | | | +--- org.jetbrains.androidx.savedstate:savedstate:1.3.1 (*) | | | +--- org.jetbrains.androidx.savedstate:savedstate-compose:1.3.1 | | | | +--- androidx.savedstate:savedstate-compose:1.3.0 -> 1.3.1 (*) @@ -1980,7 +1980,7 @@ | | | +--- org.jetbrains.compose.runtime:runtime:1.8.2 (*) | | | +--- org.jetbrains.compose.runtime:runtime-saveable:1.8.2 (*) | | | +--- org.jetbrains.kotlin:kotlin-stdlib -> 2.1.21 (*) -| | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.1 (*) | | +--- io.github.vinceglb:filekit-core:0.10.0-beta04 | | | \--- io.github.vinceglb:filekit-core-android:0.10.0-beta04 | | | +--- androidx.documentfile:documentfile:1.1.0 (*) @@ -2020,7 +2020,7 @@ | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.21 (*) | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | +--- project :core:domain | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*) | | +--- io.insert-koin:koin-bom:4.1.0 (*) @@ -2118,7 +2118,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- project :core:domain (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) @@ -2156,7 +2156,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2165,7 +2165,7 @@ | | +--- org.jetbrains.compose.components:components-ui-tooling-preview:1.8.2 (*) | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -> 2.1.21 (*) | | +--- org.jetbrains.kotlin:kotlin-reflect:2.1.20 -> 2.1.21 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.1 (*) | | +--- com.russhwolf:multiplatform-settings-no-arg:1.3.0 (*) | | +--- com.russhwolf:multiplatform-settings-serialization:1.3.0 (*) | | +--- com.russhwolf:multiplatform-settings-coroutines:1.3.0 (*) @@ -2197,7 +2197,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2230,7 +2230,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2262,7 +2262,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2294,7 +2294,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2326,7 +2326,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2362,7 +2362,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2394,7 +2394,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2426,7 +2426,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2458,7 +2458,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2491,7 +2491,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2523,7 +2523,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2559,7 +2559,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2591,7 +2591,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2632,7 +2632,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2665,7 +2665,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2697,7 +2697,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2777,7 +2777,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2810,7 +2810,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2941,7 +2941,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -2974,7 +2974,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) @@ -3006,7 +3006,7 @@ | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03 (*) | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -> 1.8.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 (*) | | +--- org.jetbrains.compose.ui:ui:1.8.2 (*) | | +--- org.jetbrains.compose.foundation:foundation:1.8.2 (*) | | +--- org.jetbrains.compose.material3:material3:1.8.2 (*) diff --git a/cmp-android/dependencies/prodReleaseRuntimeClasspath.txt b/cmp-android/dependencies/prodReleaseRuntimeClasspath.txt index 89aaf0d2..2bde1f00 100644 --- a/cmp-android/dependencies/prodReleaseRuntimeClasspath.txt +++ b/cmp-android/dependencies/prodReleaseRuntimeClasspath.txt @@ -434,13 +434,13 @@ org.jetbrains.kotlinx:kotlinx-io-bytestring-jvm:0.7.0 org.jetbrains.kotlinx:kotlinx-io-bytestring:0.7.0 org.jetbrains.kotlinx:kotlinx-io-core-jvm:0.7.0 org.jetbrains.kotlinx:kotlinx-io-core:0.7.0 -org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -org.jetbrains.kotlinx:kotlinx-serialization-json-io-jvm:1.8.0 -org.jetbrains.kotlinx:kotlinx-serialization-json-io:1.8.0 -org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.0 -org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.1 +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.1 +org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.1 +org.jetbrains.kotlinx:kotlinx-serialization-json-io-jvm:1.8.1 +org.jetbrains.kotlinx:kotlinx-serialization-json-io:1.8.1 +org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.1 +org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1 org.jetbrains:annotations:23.0.0 org.jspecify:jspecify:1.0.0 org.slf4j:slf4j-api:2.0.16 diff --git a/cmp-android/prodRelease-badging.txt b/cmp-android/prodRelease-badging.txt index 91ced69b..577d6b17 100644 --- a/cmp-android/prodRelease-badging.txt +++ b/cmp-android/prodRelease-badging.txt @@ -1,4 +1,4 @@ -package: name='org.mifospay' versionCode='1' versionName='2025.8.2-beta.0.3' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15' +package: name='org.mifospay' versionCode='1' versionName='2025.8.2-beta.0.6' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15' minSdkVersion:'26' targetSdkVersion:'34' uses-permission: name='android.permission.INTERNET' diff --git a/cmp-desktop/build.gradle.kts b/cmp-desktop/build.gradle.kts index 1b273ede..fff0b489 100644 --- a/cmp-desktop/build.gradle.kts +++ b/cmp-desktop/build.gradle.kts @@ -8,6 +8,7 @@ * See https://github.com/openMF/mobile-wallet/blob/master/LICENSE.md */ import org.jetbrains.compose.desktop.application.dsl.TargetFormat +import org.gradle.internal.os.OperatingSystem plugins { alias(libs.plugins.kotlinMultiplatform) @@ -19,7 +20,7 @@ plugins { kotlin { jvm("desktop") - jvmToolchain(17) + jvmToolchain(21) sourceSets { val desktopMain by getting { @@ -48,6 +49,10 @@ val appPackageVersion: String = libs.versions.packageVersion.get() compose.desktop { application { mainClass = "MainKt" + val buildNumber: String = (project.findProperty("buildNumber") as String?) ?: "1" + val isAppStoreRelease: Boolean = + (project.findProperty("macOsAppStoreRelease") as String?)?.toBoolean() ?: false + nativeDistributions { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Exe, TargetFormat.Deb) packageName = appPackageName @@ -57,16 +62,41 @@ compose.desktop { vendor = "Mifos Initiative" licenseFile.set(project.file("../LICENSE")) includeAllModules = true + outputBaseDir.set(project.layout.buildDirectory.dir("release")) macOS { bundleID = appPackageNameSpace dockName = appPackageName iconFile.set(project.file("icons/ic_launcher.icns")) - notarization { - val providers = project.providers - appleID.set(providers.environmentVariable("NOTARIZATION_APPLE_ID")) - password.set(providers.environmentVariable("NOTARIZATION_PASSWORD")) - teamID.set(providers.environmentVariable("NOTARIZATION_TEAM_ID")) + minimumSystemVersion = "12.0" + appStore = isAppStoreRelease + + infoPlist { + packageBuildVersion = buildNumber + extraKeysRawXml = """ + ITSAppUsesNonExemptEncryption + + """.trimIndent() + } + + if (isAppStoreRelease) { + signing { + sign.set(true) + identity.set("The Mifos Initiative") + } + + provisioningProfile.set(project.file("embedded.provisionprofile")) + runtimeProvisioningProfile.set(project.file("runtime.provisionprofile")) + + entitlementsFile.set(project.file("entitlements.plist")) + runtimeEntitlementsFile.set(project.file("runtime-entitlements.plist")) + } else { + notarization { + val providers = project.providers + appleID.set(providers.environmentVariable("NOTARIZATION_APPLE_ID")) + password.set(providers.environmentVariable("NOTARIZATION_PASSWORD")) + teamID.set(providers.environmentVariable("NOTARIZATION_TEAM_ID")) + } } } @@ -84,9 +114,50 @@ compose.desktop { } } buildTypes.release.proguard { - configurationFiles.from(file("compose-desktop.pro")) - obfuscate.set(true) - optimize.set(true) + isEnabled = false +// configurationFiles.from(file("compose-desktop.pro")) +// obfuscate.set(true) +// optimize.set(true) } } } + +/** + * Removes the `com.apple.quarantine` extended attribute from the built `.app`. + * + * Why: + * macOS Gatekeeper marks files that originated from the Internet with the + * `com.apple.quarantine` xattr. During a Compose Desktop / jpackage build the + * JBR/JRE, native libs, and other resources are copied into the `.app`. If any + * of those files are quarantined, Appstore will not allow it.. + * + * What this does: + * Runs `xattr -dr com.apple.quarantine ` **recursively** on the + * distributable after it has been assembled but before signing/packaging. + * We depend on `createReleaseDistributable` so the `.app` exists, and we guard + * execution to only run on macOS hosts. + */ +val unquarantineApp = tasks.register("unquarantineMacApp") { + group = "macOS" + description = "Remove com.apple.quarantine from the built .app before signing" + onlyIf { OperatingSystem.current().isMacOsX } + + // Ensure the .app bundle exists first + dependsOn("createReleaseDistributable") + + // build/release/main-release/app/.app + val appName = "$appPackageName.app" + val appPath = layout.buildDirectory + .dir("release/main-release/app/$appName") + .map { it.asFile.absolutePath } + + commandLine("xattr", "-dr", "com.apple.quarantine", appPath.get()) +} + +/** + * Ensure un-quarantining always happens before we create the signed PKG. + */ +tasks.matching { it.name == "packageReleasePkg" }.configureEach { + dependsOn(unquarantineApp) +} + diff --git a/cmp-desktop/entitlements.plist b/cmp-desktop/entitlements.plist new file mode 100644 index 00000000..566eccdf --- /dev/null +++ b/cmp-desktop/entitlements.plist @@ -0,0 +1,25 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.disable-library-validation + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.cs.debugger + + com.apple.security.device.audio-input + + com.apple.application-identifier + L432S2FZP5.org.mifospay + com.apple.developer.team-identifier + L432S2FZP5 + + + \ No newline at end of file diff --git a/cmp-desktop/runtime-entitlements.plist b/cmp-desktop/runtime-entitlements.plist new file mode 100644 index 00000000..576abd89 --- /dev/null +++ b/cmp-desktop/runtime-entitlements.plist @@ -0,0 +1,20 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.disable-library-validation + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.cs.debugger + + com.apple.security.device.audio-input + + + \ No newline at end of file diff --git a/cmp-desktop/src/desktopMain/kotlin/main.kt b/cmp-desktop/src/desktopMain/kotlin/main.kt index 8a09bf23..60323671 100644 --- a/cmp-desktop/src/desktopMain/kotlin/main.kt +++ b/cmp-desktop/src/desktopMain/kotlin/main.kt @@ -19,7 +19,7 @@ fun main() { application { initKoin() // Initialize FileKit - FileKit.init(appId = "org.mifospay.desktop") + FileKit.init(appId = "org.mifospay") val windowState = rememberWindowState() Window( onCloseRequest = ::exitApplication, diff --git a/cmp-shared/build.gradle.kts b/cmp-shared/build.gradle.kts index 0b8ef8a6..a8d876d8 100644 --- a/cmp-shared/build.gradle.kts +++ b/cmp-shared/build.gradle.kts @@ -93,8 +93,8 @@ android { } compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } } diff --git a/fastlane-config/ios_config.rb b/fastlane-config/ios_config.rb index 6e845cda..5e6d3488 100644 --- a/fastlane-config/ios_config.rb +++ b/fastlane-config/ios_config.rb @@ -30,7 +30,9 @@ module FastlaneConfig key_filepath: "./secrets/Auth_key.p8", version_number: "1.0.0", metadata_path: "./fastlane/metadata/ios", - app_rating_config_path: "./fastlane/age_rating.json" + app_rating_config_path: "./fastlane/age_rating.json", + screenshots_ios_path: "./fastlane/screenshots_ios", + screenshots_macos_path: "./fastlane/screenshots_macos", } end end \ No newline at end of file diff --git a/fastlane/FastFile b/fastlane/FastFile index 058a4914..1e6303a1 100644 --- a/fastlane/FastFile +++ b/fastlane/FastFile @@ -589,4 +589,133 @@ platform :ios do } ) end +end + +platform :mac do + ############################# + # Shared Private Lane Helpers + ############################# + + private_lane :setup_ci_if_needed do + if ENV['CI'] + setup_ci + else + UI.message("🖥️ Running locally, skipping CI-specific setup.") + end + end + + private_lane :load_api_key_macos do |options| + ios_config = FastlaneConfig::IosConfig::BUILD_CONFIG + + app_store_connect_api_key( + key_id: options[:appstore_key_id] || ios_config[:key_id], + issuer_id: options[:appstore_issuer_id] || ios_config[:issuer_id], + key_filepath: options[:key_filepath] || ios_config[:key_filepath], + duration: 1200 + ) + end + + private_lane :next_macos_build_number do |options| + ios_config = FastlaneConfig::IosConfig::BUILD_CONFIG + + latest = latest_testflight_build_number( + app_identifier: options[:app_identifier] || ios_config[:app_identifier], + api_key: Actions.lane_context[SharedValues::APP_STORE_CONNECT_API_KEY], + platform: "osx", + version: ios_config[:version_number] + ) + (latest.to_i + 1).to_s + end + + # Resolve the most-recent generated .pkg path + private_lane :find_pkg_path do + project_dir = File.expand_path('..', Dir.pwd) + Dir[File.join(project_dir, 'cmp-desktop', 'build', 'release', '**', 'pkg', '*.pkg')] + .max_by { |p| File.mtime(p) } || UI.user_error!('PKG not found!') + end + + ################### + # Public lanes + ################### + + desc "Build & upload macOS (.pkg) to TestFlight" + lane :desktop_testflight do |options| + setup_ci_if_needed + load_api_key_macos(options) + + new_build_number = next_macos_build_number(options) + + gradle( + tasks: ["packageReleasePkg"], + properties: { + "buildNumber" => new_build_number, + "macOsAppStoreRelease" => true + } + ) + + pkg_path = find_pkg_path + UI.message("Found PKG at: #{pkg_path}") + + pilot( + api_key: Actions.lane_context[SharedValues::APP_STORE_CONNECT_API_KEY], + pkg: pkg_path, + app_platform: 'osx', + skip_waiting_for_build_processing: true, + ) + end + + desc "Build & submit macOS app to App Store (non-beta)" + lane :desktop_release do |options| + ios_config = FastlaneConfig::IosConfig::BUILD_CONFIG + setup_ci_if_needed + load_api_key_macos(options) + + new_build_number = next_macos_build_number(options) + + gradle( + tasks: ["packageReleasePkg"], + properties: { + "buildNumber" => new_build_number, + "macOsAppStoreRelease" => true + } + ) + + # Locate the produced PKG (adjust pattern if you rename) + pkg_path = find_pkg_path + UI.message("Found PKG at: #{pkg_path}") + + deliver( + platform: 'osx', + pkg: pkg_path, + screenshots_path: ios_config[:screenshots_macos_path], + metadata_path: options[:metadata_path] || ios_config[:metadata_path], + submit_for_review: true, # Set to true if you want to auto-submit for review + automatic_release: true, # Set to true if you want to auto-release once it approved + api_key: Actions.lane_context[SharedValues::APP_STORE_CONNECT_API_KEY], + skip_app_version_update: false, + force: true, # Skips HTML report verification + precheck_include_in_app_purchases: false, + overwrite_screenshots: true, + reject_if_possible: true, + app_rating_config_path: ios_config[:app_rating_config_path], + submission_information: { + add_id_info_uses_idfa: false, + add_id_info_limits_tracking: false, + add_id_info_serves_ads: false, + add_id_info_tracks_action: false, + add_id_info_tracks_install: false, + content_rights_has_rights: true, + content_rights_contains_third_party_content: false, + export_compliance_platform: 'osx', + export_compliance_compliance_required: false, + export_compliance_encryption_updated: false, + export_compliance_app_type: nil, + export_compliance_uses_encryption: false, + export_compliance_is_exempt: true, + export_compliance_contains_third_party_cryptography: false, + export_compliance_contains_proprietary_cryptography: false, + export_compliance_available_on_french_store: true + } + ) + end end \ No newline at end of file diff --git a/fastlane/screenshots/en-US/0_APP_IPHONE_65_0.png b/fastlane/screenshots_ios/en-US/0_APP_IPHONE_65_0.png similarity index 100% rename from fastlane/screenshots/en-US/0_APP_IPHONE_65_0.png rename to fastlane/screenshots_ios/en-US/0_APP_IPHONE_65_0.png diff --git a/fastlane/screenshots/en-US/1_APP_IPAD_PRO_3GEN_129_1.png b/fastlane/screenshots_ios/en-US/1_APP_IPAD_PRO_3GEN_129_1.png similarity index 100% rename from fastlane/screenshots/en-US/1_APP_IPAD_PRO_3GEN_129_1.png rename to fastlane/screenshots_ios/en-US/1_APP_IPAD_PRO_3GEN_129_1.png diff --git a/fastlane/screenshots/en-US/1_APP_IPHONE_65_1.png b/fastlane/screenshots_ios/en-US/1_APP_IPHONE_65_1.png similarity index 100% rename from fastlane/screenshots/en-US/1_APP_IPHONE_65_1.png rename to fastlane/screenshots_ios/en-US/1_APP_IPHONE_65_1.png diff --git a/fastlane/screenshots/en-US/2_APP_IPAD_PRO_3GEN_129_2.png b/fastlane/screenshots_ios/en-US/2_APP_IPAD_PRO_3GEN_129_2.png similarity index 100% rename from fastlane/screenshots/en-US/2_APP_IPAD_PRO_3GEN_129_2.png rename to fastlane/screenshots_ios/en-US/2_APP_IPAD_PRO_3GEN_129_2.png diff --git a/fastlane/screenshots/en-US/2_APP_IPHONE_65_2.png b/fastlane/screenshots_ios/en-US/2_APP_IPHONE_65_2.png similarity index 100% rename from fastlane/screenshots/en-US/2_APP_IPHONE_65_2.png rename to fastlane/screenshots_ios/en-US/2_APP_IPHONE_65_2.png diff --git a/fastlane/screenshots/en-US/3_APP_IPAD_PRO_3GEN_129_3.png b/fastlane/screenshots_ios/en-US/3_APP_IPAD_PRO_3GEN_129_3.png similarity index 100% rename from fastlane/screenshots/en-US/3_APP_IPAD_PRO_3GEN_129_3.png rename to fastlane/screenshots_ios/en-US/3_APP_IPAD_PRO_3GEN_129_3.png diff --git a/fastlane/screenshots/en-US/3_APP_IPHONE_65_3.png b/fastlane/screenshots_ios/en-US/3_APP_IPHONE_65_3.png similarity index 100% rename from fastlane/screenshots/en-US/3_APP_IPHONE_65_3.png rename to fastlane/screenshots_ios/en-US/3_APP_IPHONE_65_3.png diff --git a/fastlane/screenshots/en-US/4_APP_IPAD_PRO_3GEN_129_4.png b/fastlane/screenshots_ios/en-US/4_APP_IPAD_PRO_3GEN_129_4.png similarity index 100% rename from fastlane/screenshots/en-US/4_APP_IPAD_PRO_3GEN_129_4.png rename to fastlane/screenshots_ios/en-US/4_APP_IPAD_PRO_3GEN_129_4.png diff --git a/fastlane/screenshots/en-US/4_APP_IPHONE_65_4.png b/fastlane/screenshots_ios/en-US/4_APP_IPHONE_65_4.png similarity index 100% rename from fastlane/screenshots/en-US/4_APP_IPHONE_65_4.png rename to fastlane/screenshots_ios/en-US/4_APP_IPHONE_65_4.png diff --git a/fastlane/screenshots/en-US/5_APP_IPAD_PRO_3GEN_129_5.png b/fastlane/screenshots_ios/en-US/5_APP_IPAD_PRO_3GEN_129_5.png similarity index 100% rename from fastlane/screenshots/en-US/5_APP_IPAD_PRO_3GEN_129_5.png rename to fastlane/screenshots_ios/en-US/5_APP_IPAD_PRO_3GEN_129_5.png diff --git a/fastlane/screenshots_macos/en-US/0_APP_DESKTOP_0.png b/fastlane/screenshots_macos/en-US/0_APP_DESKTOP_0.png new file mode 100644 index 00000000..24929df7 Binary files /dev/null and b/fastlane/screenshots_macos/en-US/0_APP_DESKTOP_0.png differ diff --git a/fastlane/screenshots_macos/en-US/1_APP_DESKTOP_1.png b/fastlane/screenshots_macos/en-US/1_APP_DESKTOP_1.png new file mode 100644 index 00000000..adefbbd8 Binary files /dev/null and b/fastlane/screenshots_macos/en-US/1_APP_DESKTOP_1.png differ diff --git a/fastlane/screenshots_macos/en-US/2_APP_DESKTOP_2.png b/fastlane/screenshots_macos/en-US/2_APP_DESKTOP_2.png new file mode 100644 index 00000000..db55ea3d Binary files /dev/null and b/fastlane/screenshots_macos/en-US/2_APP_DESKTOP_2.png differ diff --git a/fastlane/screenshots_macos/en-US/3_APP_DESKTOP_3.png b/fastlane/screenshots_macos/en-US/3_APP_DESKTOP_3.png new file mode 100644 index 00000000..b0e303ba Binary files /dev/null and b/fastlane/screenshots_macos/en-US/3_APP_DESKTOP_3.png differ diff --git a/fastlane/screenshots_macos/en-US/4_APP_DESKTOP_4.png b/fastlane/screenshots_macos/en-US/4_APP_DESKTOP_4.png new file mode 100644 index 00000000..4086c1b7 Binary files /dev/null and b/fastlane/screenshots_macos/en-US/4_APP_DESKTOP_4.png differ diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2309dc5a..409cf569 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -87,7 +87,7 @@ kotlinInject = "0.7.2" kotlinxCoroutines = "1.9.0" kotlinxDatetime = "0.6.1" kotlinxImmutable = "0.3.8" -kotlinxSerializationJson = "1.7.3" +kotlinxSerializationJson = "1.8.1" ksp = "2.1.20-2.0.1" # Ktor & Ktorfit @@ -129,8 +129,8 @@ material3adaptive = "1.1.2" room = "2.7.2" # Desktop Version -packageName = "MifosWallet" -packageNamespace = "org.mifospay.desktop" +packageName = "Mifos Pay" +packageNamespace = "org.mifospay" packageVersion = "1.0.0" [libraries]