diff --git a/.github/workflows/android-release.yaml b/.github/workflows/android-release.yaml index f0edce1..886512b 100644 --- a/.github/workflows/android-release.yaml +++ b/.github/workflows/android-release.yaml @@ -12,7 +12,7 @@ jobs: steps: - name: ๐Ÿ”‘ Create token - uses: actions/create-github-app-token@v2 + uses: actions/create-github-app-token@v3 id: app-token with: app-id: ${{ secrets.GH_APP_ID}} @@ -32,7 +32,7 @@ jobs: cache: 'gradle' - name: ๐Ÿ“ฆ Setup Android SDK - uses: android-actions/setup-android@v3 + uses: android-actions/setup-android@v4 - name: ๐Ÿงน Check format run: | @@ -45,7 +45,7 @@ jobs: echo $KEYSTORE_BASE64 | base64 --decode > keystore.jks - name: ๐Ÿš€ Release APK - uses: cycjimmy/semantic-release-action@v4 + uses: cycjimmy/semantic-release-action@v6.0.0 id: release env: GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} @@ -70,4 +70,14 @@ jobs: releaseName: ${{ steps.release.outputs.new_release_version }} status: draft mappingFile: app/build/outputs/mapping/release/mapping.txt - debugSymbols: app/build/intermediates/merged_native_libs/release/mergeReleaseNativeLibs/out/lib \ No newline at end of file + debugSymbols: app/build/intermediates/merged_native_libs/release/mergeReleaseNativeLibs/out/lib + + - name: ๐Ÿ–ฅ๏ธ Update website + if: steps.release.outputs.new_release_published == 'true' && !steps.release.outputs.new_release_channel && steps.release.outputs.new_release_patch_version == '0' + uses: pawcoding/update-project-action@v0.0.5 + with: + pocketbase-url: ${{ vars.PB_URL }} + collection-id: ${{ vars.PB_COLLECTION }} + record-id: ${{ vars.PB_RECORD }} + env: + PB_TOKEN: ${{ secrets.PB_TOKEN }} diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index 4d87ed3..2cfc411 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -1,4 +1,4 @@ -name: "Copilot Setup Steps" +name: 'Copilot Setup Steps' # Automatically run the setup steps when they are changed to allow for easy validation on: @@ -29,12 +29,12 @@ jobs: - name: ๐Ÿ“ฆ Setup JDK uses: actions/setup-java@v5 with: - distribution: "temurin" - java-version: "21" - cache: "gradle" + distribution: 'temurin' + java-version: '21' + cache: 'gradle' - name: ๐Ÿ“ฆ Setup Android SDK - uses: android-actions/setup-android@v3 + uses: android-actions/setup-android@v4 - name: ๐Ÿงน Initialize formatter run: | diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index fafeb7c..c7ec10a 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -3,9 +3,9 @@ name: Test on: push: branches: - - "**" - - "!master" - - "!staging" + - '**' + - '!master' + - '!staging' jobs: release: @@ -20,12 +20,12 @@ jobs: - name: ๐Ÿ“ฆ Setup JDK uses: actions/setup-java@v5 with: - distribution: "temurin" - java-version: "21" - cache: "gradle" + distribution: 'temurin' + java-version: '21' + cache: 'gradle' - name: ๐Ÿ“ฆ Setup Android SDK - uses: android-actions/setup-android@v3 + uses: android-actions/setup-android@v4 - name: ๐Ÿงน Check format run: | diff --git a/.gitignore b/.gitignore index 846a6b3..355f1d6 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ /.idea/navEditor.xml /.idea/assetWizardSettings.xml /.idea/copilot.* +/docs/plans +/docs/android .DS_Store /build /captures diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7b3006b..02c4aa5 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -6,14 +6,12 @@ - diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 253d4ea..b62a4b0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -5,8 +5,8 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.compose) alias(libs.plugins.jetbrains.kotlin.serialization) - id("com.google.devtools.ksp") version "2.3.6" - id("com.ncorti.ktfmt.gradle") version "0.25.0" + id("com.google.devtools.ksp") version "2.3.7" + id("com.ncorti.ktfmt.gradle") version "0.26.0" } android { @@ -62,8 +62,8 @@ android { } buildFeatures { - compose = true - resValues = true + compose = true + resValues = true } androidResources { generateLocaleConfig = true } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e78ad9f..1c4fa5d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -43,6 +43,10 @@ + + allCards.sortedByDescending { it.useCount } } - val topCards = sortedCards.take(MAX_SHORTCUTS) - + val maxShortcuts = ShortcutManagerCompat.getMaxShortcutCountPerActivity(context) + val topCards = sortedCards.take(maxShortcuts) val newShortcutIds = topCards.map { cardShortcutId(it.cardId) }.toSet() + val existingShortcuts = ShortcutManagerCompat.getDynamicShortcuts(context) val staleIds = existingShortcuts.filter { it.id !in newShortcutIds }.map { it.id } if (staleIds.isNotEmpty()) ShortcutManagerCompat.removeDynamicShortcuts(context, staleIds) @@ -62,6 +62,11 @@ suspend fun updateShortcuts(context: Context) { .setLongLabel(card.storeName) .setIcon(icon) .setIntent(intent) + .addCapabilityBinding( + "actions.intent.OPEN_APP_FEATURE", + "feature.name", + listOf(card.storeName), + ) .build() ShortcutManagerCompat.pushDynamicShortcut(context, shortcut) diff --git a/app/src/main/java/de/pawcode/cardstore/ui/CardStore.kt b/app/src/main/java/de/pawcode/cardstore/ui/CardStore.kt index 04037bb..eb79f6d 100644 --- a/app/src/main/java/de/pawcode/cardstore/ui/CardStore.kt +++ b/app/src/main/java/de/pawcode/cardstore/ui/CardStore.kt @@ -88,7 +88,7 @@ fun CardStore(modifier: Modifier = Modifier) { NavDisplay( entries = navigationState.toEntries(entryProvider), onBack = { navigator.goBack() }, - sceneStrategy = remember { DialogSceneStrategy() }, + sceneStrategies = remember { listOf(DialogSceneStrategy()) }, transitionSpec = { slideInHorizontally(initialOffsetX = { it }) togetherWith ExitTransition.None }, diff --git a/app/src/main/res/xml/shortcuts.xml b/app/src/main/res/xml/shortcuts.xml new file mode 100644 index 0000000..1e2d78e --- /dev/null +++ b/app/src/main/res/xml/shortcuts.xml @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties new file mode 100644 index 0000000..5c34300 --- /dev/null +++ b/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,13 @@ +#This file is generated by updateDaemonJvm +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/56a19bc915b9ba2eb62ba7554c61b919/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/398ffe3949748bfb1d5636f023d228fd/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/56a19bc915b9ba2eb62ba7554c61b919/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/398ffe3949748bfb1d5636f023d228fd/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/e99bae143b75f9a10ead10248f02055e/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/04e088f8677de3b384108493cc9481d0/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/56a19bc915b9ba2eb62ba7554c61b919/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/398ffe3949748bfb1d5636f023d228fd/redirect +toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/e55dccbfe27cb97945148c61a39c89c5/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/dbd05c4936d573642f94cd149e1356c8/redirect +toolchainVendor=JETBRAINS +toolchainVersion=21 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 688184c..0602212 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,23 +1,23 @@ [versions] -activityCompose = "1.12.4" -agp = "9.0.1" +activityCompose = "1.13.0" +agp = "9.2.1" barcodeScanning = "17.3.0" biometric = "1.1.0" -colorpickerCompose = "1.1.3" -composeBom = "2026.02.00" +colorpickerCompose = "1.1.4" +composeBom = "2026.05.00" composedBarcodes = "1.3.0" -coreKtx = "1.17.0" +coreKtx = "1.18.0" coreSplashscreen = "1.2.0" -datastorePreferences = "1.2.0" +datastorePreferences = "1.2.1" espressoCore = "3.7.0" junit = "4.13.2" junitVersion = "1.3.0" -kotlin = "2.3.10" -kotlinSerialization = "2.3.10" -kotlinxSerialization = "1.10.0" +kotlin = "2.3.21" +kotlinSerialization = "2.3.21" +kotlinxSerialization = "1.11.0" lifecycleRuntimeKtx = "2.10.0" lifecycleViewmodelNav3 = "2.10.0" -nav3Core = "1.0.1" +nav3Core = "1.1.1" playServicesCodeScanner = "16.1.0" revealswipe = "3.0.0" review = "2.0.2" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 61285a6..b1b8ef5 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f78a6..b52fb7e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,9 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip networkTimeout=10000 +retries=0 +retryBackOffMs=500 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index adff685..b9bb139 100755 --- a/gradlew +++ b/gradlew @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/gradlew.bat b/gradlew.bat index e509b2d..aa5f10b 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -23,8 +23,8 @@ @rem @rem ########################################################################## -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @@ -51,7 +51,7 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -65,7 +65,7 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :execute @rem Setup the command line @@ -73,21 +73,10 @@ goto fail @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/settings.gradle.kts b/settings.gradle.kts index 2e1afc0..ade1b89 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,6 +11,9 @@ pluginManagement { gradlePluginPortal() } } +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" +} dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { diff --git a/version.properties b/version.properties index 76af643..2fde7f4 100644 --- a/version.properties +++ b/version.properties @@ -1,2 +1,2 @@ -VERSION_CODE=64 -VERSION_NAME=1.5.0 \ No newline at end of file +VERSION_CODE=73 +VERSION_NAME=1.6.0-staging.3