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