diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml
index 447aaa1..cd68a23 100644
--- a/.github/actionlint.yaml
+++ b/.github/actionlint.yaml
@@ -4,3 +4,10 @@ paths:
- '"inputs" section is alias node but mapping node is expected'
- '"paths" section must be sequence node but got alias node with "" tag'
- '"paths-ignore" section must be sequence node but got alias node with "" tag'
+ .github/workflows/issue.yaml:
+ ignore:
+ - 'missing input "app-id" which is required by action "actions/create-github-app-token@v3"'
+ - 'input "client-id" is not defined in action "actions/create-github-app-token@v3"'
+ .github/workflows/test.yaml:
+ ignore:
+ - 'property ".+" is not defined in object type'
diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml
index b175e03..c11471a 100644
--- a/.github/workflows/docs.yaml
+++ b/.github/workflows/docs.yaml
@@ -47,7 +47,7 @@ jobs:
- name: "Algolia Crawler"
if: ${{ env.crawler-id != '' }}
- uses: cssnr/algolia-crawler-action@v1
+ uses: cssnr/algolia-crawler-action@v2
with:
crawler_id: ${{ env.crawler-id }}
crawler_user_id: ${{ secrets.CRAWLER_USER_ID }}
diff --git a/.github/workflows/draft.yaml b/.github/workflows/draft.yaml
index 309c3b9..1987d9e 100644
--- a/.github/workflows/draft.yaml
+++ b/.github/workflows/draft.yaml
@@ -19,7 +19,7 @@ jobs:
steps:
- name: "Checkout"
- uses: actions/checkout@v6
+ uses: actions/checkout@v7
- name: "Draft Release Action"
id: draft
diff --git a/.github/workflows/issue.yaml b/.github/workflows/issue.yaml
new file mode 100644
index 0000000..b3b5a6f
--- /dev/null
+++ b/.github/workflows/issue.yaml
@@ -0,0 +1,44 @@
+name: "Issue"
+
+on:
+ issues:
+ types: [opened]
+
+jobs:
+ issue:
+ name: "Issue"
+ if: ${{ !github.event.issue.type || github.event.issue.type.name == 'Bug' }}
+ runs-on: ubuntu-latest
+ timeout-minutes: 15
+
+ permissions:
+ contents: write
+ issues: write
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v7
+
+ - name: "Create App Token"
+ id: app
+ uses: actions/create-github-app-token@v3
+ with:
+ client-id: ${{ vars.APP_CLIENT_ID }}
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
+
+ - name: "AI Issue"
+ uses: cssnr/ai-issue-action@v1
+ env:
+ GOOGLE_GENERATIVE_AI_API_KEY: ${{ secrets.GOOGLE_GENERATIVE_AI_API_KEY }}
+ with:
+ token: ${{ steps.app.outputs.token }}
+ model: gemini-2.5-flash
+ tail: |
+ _Response generated by the [AI Issue Action](https://github.com/cssnr/ai-issue-action)._
+ instructions: |
+ You are a helpful assistant responding to a GitHub Issue created by user @${{ github.actor }}
+ in the repository ${{ github.server_url }}/${{ github.repository }}
+ Provide initial triage and troubleshooting steps, then gather any additional information needed to proceed.
+ Respond using your general knowledge of Android Applications and the following knowledge files:
+ path: |
+ docs/**/*.md
diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml
index e2fb8af..cdb1e98 100644
--- a/.github/workflows/lint.yaml
+++ b/.github/workflows/lint.yaml
@@ -20,7 +20,7 @@ jobs:
steps:
- name: "Checkout"
- uses: actions/checkout@v6
+ uses: actions/checkout@v7
- name: "Debug event.json"
continue-on-error: true
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index 21d87cd..cebebd1 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -35,7 +35,7 @@ jobs:
steps:
- name: "Checkout"
- uses: actions/checkout@v6
+ uses: actions/checkout@v7
- name: "Debug Event"
continue-on-error: true
@@ -152,7 +152,7 @@ jobs:
mv "${{ env.apk_path }}/${{ env.apk_file }}" "${{ env.apk_path }}/${{ env.signed_apk }}"
- name: "Upload APK to Artifacts"
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v7
with:
name: release
path: ${{ env.apk_path }}
@@ -230,7 +230,7 @@ jobs:
- name: "VirusTotal"
if: ${{ github.event_name == 'release' }}
- uses: cssnr/virustotal-action@v1
+ uses: cssnr/virustotal-action@v2
continue-on-error: true
with:
vt_api_key: ${{ secrets.VT_API_KEY }}
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..6fb5240
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,19 @@
+# Agent Guide
+
+Android application to update wallpaper from a remote URL on an interval.
+
+- `app/` - Android app source (Kotlin, Gradle)
+- `Taskfile.yml` - task commands
+
+## Commands
+
+ALWAYS use the `task *` commands
+
+| Command | Purpose |
+| -------------- | --------------------------------------------------- |
+| `task compile` | Compile Kotlin (quick check) |
+| `task build` | Build all variants (APKs) |
+| `task lint` | Prettier check + yamllint + actionlint + shellcheck |
+| `task format` | Prettier write (format non-kotlin files) |
+
+Do NOT use `-q` or pipe Gradle output through `Select-Object` — both hide progress and make long builds look hung.
diff --git a/README.md b/README.md
index fbf9ed2..3a4a337 100644
--- a/README.md
+++ b/README.md
@@ -249,11 +249,3 @@ You can also star this project on GitHub and support other related projects:
- [Tibs3DPrints Android](https://github.com/cssnr/tibs3dprints-android?tab=readme-ov-file#readme)
For a full list of current projects visit: [https://cssnr.github.io/](https://cssnr.github.io/)
-
-
-
-
-
-
-
-
diff --git a/Taskfile.yml b/Taskfile.yml
index 0a8fd6c..2df0b47 100644
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -27,3 +27,21 @@ tasks:
GRADLEW: 'gradlew{{if eq OS "windows"}}.bat{{end}}'
cmd: |
./{{.GRADLEW}} assemble {{.CLI_ARGS}}
+
+ compile:
+ desc: Compile Kotlin (quick check)
+ vars:
+ GRADLEW: 'gradlew{{if eq OS "windows"}}.bat{{end}}'
+ cmd: ./{{.GRADLEW}} :app:compileDebugKotlin
+
+ gradle-status:
+ desc: Show Gradle daemon status
+ vars:
+ GRADLEW: 'gradlew{{if eq OS "windows"}}.bat{{end}}'
+ cmd: "{{.GRADLEW}} --status"
+
+ gradle-stop:
+ desc: Stop all Gradle daemons
+ vars:
+ GRADLEW: 'gradlew{{if eq OS "windows"}}.bat{{end}}'
+ cmd: "{{.GRADLEW}} --stop"
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 03ca00c..0da239c 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -11,7 +11,7 @@ plugins {
configure {
namespace = "org.cssnr.remotewallpaper"
- compileSdk = 36
+ compileSdk = 37
defaultConfig {
applicationId = "org.cssnr.remotewallpaper"
diff --git a/docs/support.md b/docs/support.md
index 049b5b5..4b0df43 100644
--- a/docs/support.md
+++ b/docs/support.md
@@ -49,6 +49,3 @@ From here you can contact me directly, `Shane@111150265075298304`.
More information available at: [https://cssnr.com/](https://cssnr.com/)
[{ width="360" }](https://ko-fi.com/cssnr)
-
-{ style="border-radius: 12px;" }
-{ style="border-radius: 12px;" }
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 5e88485..7891f9f 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,20 +1,20 @@
[versions]
agp = "9.1.1"
-kotlin = "2.3.20"
+kotlin = "2.4.10"
ksp = "2.3.5"
-coreKtx = "1.18.0"
+coreKtx = "1.19.0"
junit = "4.13.2"
junitVersion = "1.3.0"
espressoCore = "3.7.0"
appcompat = "1.7.1"
-material = "1.13.0"
+material = "1.14.0"
-constraintlayout = "2.2.1"
-navigationSafeargs = "2.9.7"
-lifecycleLivedataKtx = "2.10.0"
-lifecycleViewmodelKtx = "2.10.0"
-navigationFragmentKtx = "2.9.7"
-navigationUiKtx = "2.9.7"
+constraintlayout = "2.2.2"
+navigationSafeargs = "2.9.8"
+lifecycleLivedataKtx = "2.11.0"
+lifecycleViewmodelKtx = "2.11.0"
+navigationFragmentKtx = "2.9.8"
+navigationUiKtx = "2.9.8"
preferenceKtx = "1.2.1"
recyclerview = "1.4.0"
room = "2.8.4"
@@ -22,7 +22,7 @@ swiperefreshlayout = "1.2.0"
workRuntimeKtx = "2.11.2"
# viewpager2 = "1.1.0"
-okhttp = "5.3.2"
+okhttp = "5.4.0"
retrofit = "3.0.0"
moshiKotlinCodegen = "1.15.2"
photoview = "1.0.3"