chore(workflows,fastlane): configure macOS App Store distribution for desktop app (lanes, workflow, screenshots) (#1911)

This commit is contained in:
Hekmatullah 2025-08-28 20:44:50 +01:00 committed by GitHub
parent 4d200dc358
commit 33652bcc1e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
31 changed files with 462 additions and 99 deletions

113
.github/workflows/macos-distribute.yaml vendored Normal file
View File

@ -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

View File

@ -91,3 +91,4 @@ jobs:
build_ios: true
use_cocoapods: true
shared_module: ':cmp-shared'
java-version: '21'

2
.gitignore vendored
View File

@ -76,3 +76,5 @@ secrets/
# Sync Log File
*.log
*.provisionprofile

View File

@ -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 {

View File

@ -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<JavaPluginExtension> {
// 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<KotlinCompile>().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

View File

@ -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 (*)

View File

@ -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

View File

@ -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'

View File

@ -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 = """
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
""".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 <App.app>` **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<Exec>("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/<YourApp>.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)
}

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.debugger</key>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.application-identifier</key>
<string>L432S2FZP5.org.mifospay</string>
<key>com.apple.developer.team-identifier</key>
<string>L432S2FZP5</string>
<!-- Add additional entitlements here, for example for network or hardware access. -->
</dict>
</plist>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.debugger</key>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>
</dict>
</plist>

View File

@ -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,

View File

@ -93,8 +93,8 @@ android {
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
}

View File

@ -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

View File

@ -590,3 +590,132 @@ 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

View File

Before

Width:  |  Height:  |  Size: 734 KiB

After

Width:  |  Height:  |  Size: 734 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

Before

Width:  |  Height:  |  Size: 873 KiB

After

Width:  |  Height:  |  Size: 873 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

Before

Width:  |  Height:  |  Size: 727 KiB

After

Width:  |  Height:  |  Size: 727 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

Before

Width:  |  Height:  |  Size: 523 KiB

After

Width:  |  Height:  |  Size: 523 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

Before

Width:  |  Height:  |  Size: 482 KiB

After

Width:  |  Height:  |  Size: 482 KiB

View File

Before

Width:  |  Height:  |  Size: 1023 KiB

After

Width:  |  Height:  |  Size: 1023 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

View File

@ -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]