Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
151 commits
Select commit Hold shift + click to select a range
93d74b4
fix(tests): make caller stack traces deterministic
david-allison Sep 29, 2026
2ea8504
fix(tests): restore the lease test dispatcher
david-allison Sep 29, 2026
d74d931
fix(tests): restore test dispatchers
david-allison Sep 29, 2026
e5b6007
test: fail on leaked collection dispatchers
david-allison Sep 29, 2026
261482a
docs: SortOrderBottomSheetFragment
david-allison Sep 25, 2026
9fbe3ff
test: support tablet screenshots in CI
david-allison Sep 25, 2026
7f40118
test: screenshots tests for "Choose display order"
david-allison Sep 25, 2026
fee69a1
fix(settings): edge to edge toolbar color
david-allison Sep 25, 2026
b9d7916
test(deck-picker): wait for deck rows before long press
david-allison Sep 26, 2026
f4fb142
test(set-due-date): scheduler behavior
david-allison Sep 26, 2026
a581bb6
refactor(set-due-date): move loading into ViewModel
david-allison Sep 26, 2026
4c4989e
refactor(set-due-date): simplify dialog opening
david-allison Sep 26, 2026
ad829a5
refactor(tags): rename `sortOverride` to `sortWith`
david-allison Sep 27, 2026
bf97e52
perf(tags): preserve uniqueness set when sorting
david-allison Sep 27, 2026
67859db
refactor(tags): split out tag comparison by parts
david-allison Sep 27, 2026
d574e8c
perf(tags): precompute tag sort keys
david-allison Sep 27, 2026
93308f1
perf(tags): track changes when sorting
david-allison Sep 27, 2026
601741f
feat(build): expose release metadata as JSON
david-allison Sep 28, 2026
02aed1d
feat(ci): weekly alpha releases
david-allison Sep 28, 2026
1a0085e
refactor: remove Hungarian notation
david-allison Sep 28, 2026
6d92cab
feat(api): expose independent default columns
david-allison Sep 28, 2026
04e567b
refactor(api): deprecate shared default projections
david-allison Sep 28, 2026
bbec29c
refactor: extract emulator test command into Python
david-allison Sep 28, 2026
7917cda
build: separate emulator tests from coverage reporting
david-allison Sep 28, 2026
f7eb6df
fix: verify emulator coverage transfers
david-allison Sep 28, 2026
2debf89
docs(backups): clarify params, return values and exceptions
david-allison Sep 29, 2026
e140c33
Updated strings from Crowdin
Sep 30, 2026
edf4bd2
fix(backups): make selection cancellation consistent
david-allison Sep 29, 2026
5ae799d
refactor(whiteboard): unify active tool state
BrayanDSO Sep 19, 2026
f9e7a8a
feat(whiteboard): support stylus button to toggle eraser
BrayanDSO Sep 19, 2026
d5e0f73
fix(note-editor): don't silently discard unsaved-changes warning on n…
GuTS805 Sep 17, 2026
acea8e4
build(deps): bump brace-expansion in /tools/localization
dependabot[bot] Sep 30, 2026
0cba7ca
fix: reopen collection after failed backup
david-allison Sep 29, 2026
08f1ff3
docs: document collection package import exceptions
david-allison Sep 29, 2026
c34add8
test(backups): cover import failures & corruption
david-allison Sep 29, 2026
00e21ba
test(deck-picker): recovery after failed backup restore
david-allison Sep 29, 2026
bb4c51a
fix(backups): report when manual backup is skipped
david-allison Sep 29, 2026
87057f9
fix(sync): handle skipped backup result
david-allison Sep 29, 2026
8e46d96
refactor(backups): add `@CheckResult`
david-allison Sep 29, 2026
9f241b2
refactor(view-model): inject IdsFile results
david-allison Sep 29, 2026
a23539c
fix(tags): only read tags file if necessary
david-allison Sep 29, 2026
c55f2f8
test(reviewer): use `Reviewer.kt` button IDs
david-allison Sep 30, 2026
b5bb4dc
fix(browser): check for fragment before reading preferences
david-allison Sep 30, 2026
75d185f
fix(prefs): get preferences through a provider
david-allison Sep 30, 2026
9ac902b
test(prefs): cover both reminder search modes
david-allison Sep 30, 2026
37fea03
test(notifications): reset failure before teardown
mikehardy Sep 30, 2026
5d140ed
refactor: replace `bundleOf` with `Bundle()`
david-allison Sep 30, 2026
5b91b48
fix(media-check): show errors instead of crashing
criticalAY Sep 29, 2026
d0d3ca5
refactor(tts): extract playback listener
david-allison Sep 27, 2026
0394442
refactor(tts): return voice discovery results
david-allison Sep 27, 2026
78a597d
fix(tts): await cached languages asynchronously
david-allison Sep 27, 2026
31b5c77
feat(tts): cache languages for the reviewer engine early
david-allison Sep 27, 2026
8dd3710
refactor(tts): remove blocking locale access
david-allison Sep 27, 2026
80cc9d3
refactor(tts): remove redundant locale handling
david-allison Sep 27, 2026
e7a7af2
fix(ci): retry system image installation
david-allison Sep 30, 2026
311d8c0
chore(pages): provide shared page origin setup
david-allison Sep 28, 2026
3e7a252
fix(pages): serve bundled assets only to the app
david-allison Sep 28, 2026
cf692fe
fix(pages): keep external navigation outside bundled pages
david-allison Sep 28, 2026
a4420ad
refactor(tags): use dialog binding for tests
david-allison Sep 29, 2026
fd2f0c2
fix(tags): refresh parent states after 'check all'
david-allison Sep 29, 2026
7987ce5
refactor(tags): rename buildTagTree to rebuildTagTree
david-allison Sep 29, 2026
48d7497
fix(tests): preserve unhandled exceptions
david-allison Sep 25, 2026
59bdf32
test: add fragment lifecycle coverage
david-allison Sep 25, 2026
bf98fda
test: enable some fragment lifecycle scenario tests
david-allison Sep 25, 2026
71e482a
implement the function opChanges(), to detect any changes in the OpCh…
AdityaDarke97 Sep 30, 2026
2c63554
fix(tests): handle `withQueue` cancellation
david-allison Sep 26, 2026
a5b5744
fix(reviewer): move `TYPE_NULL` to inputConnection
david-allison Sep 24, 2026
ae95dde
refactor(reviewer): remove saved answer input types
david-allison Sep 24, 2026
3afd547
test(reviewer): cover `nosuggest` card transitions
david-allison Sep 24, 2026
40e895f
refactor(test): scope activities to tests
david-allison Sep 30, 2026
1ba8d02
test(reviewer): avoid day rollover issues
david-allison Sep 30, 2026
c481cdf
fix(tests): shorten test name for Windows
david-allison Oct 1, 2026
208b3ed
test: add tests for IdsFile recovery
david-allison Sep 30, 2026
170c428
refactor(export): pass limits to export handlers
david-allison Sep 30, 2026
0a6cd7f
fix(deck-picker): preserve recreation state
n1snt Sep 30, 2026
b90a6e6
refactor: move JaCoCo configuration into `buildSrc`
david-allison Sep 30, 2026
ee727b8
build: introduce `ankidroid.android.app` convention plugin
david-allison Sep 30, 2026
b720d97
feat(backend): upgrade to Anki 26.09.3
david-allison Sep 22, 2026
bb31488
perf(reviewer): lazy load MathJax
david-allison Sep 22, 2026
c8e5e2f
test(import): test `importDialogRequireClose`
david-allison Sep 22, 2026
d255a27
test(pages): Card Info rendering & FSRS simulation
david-allison Sep 30, 2026
6efb1de
build(deps): add Android 17 JAR for Robolectric
david-allison Oct 1, 2026
26765fc
fix(tests): reminder log tree setup
david-allison Oct 1, 2026
399f91c
ci(merge-queue): make tests fail fast
david-allison Oct 1, 2026
44de4a0
Dependency Updates 20260925
mikehardy Sep 30, 2026
9d02b38
fix(tests): wait for backup completion
david-allison Oct 1, 2026
71299db
refactor(sync): introduce SyncAuth wrapper
david-allison Oct 1, 2026
37b7160
fix(sync): fix empty endpoints being sent as ""
david-allison Oct 1, 2026
af8c863
ci(merge-queue-cleanup): cancel runs if branch is deleted
david-allison Oct 1, 2026
f262d34
ci(merge-queue-cleanup): handle race conditions
david-allison Oct 1, 2026
b4f82ee
ci(merge-queue-cleanup): retry transient failures
david-allison Oct 1, 2026
2bc2cb8
ci(merge-queue-cleanup): handle stale listings
david-allison Oct 1, 2026
51bab19
ci(merge-queue-cleanup): do not cancel jobs from merged groups
david-allison Oct 1, 2026
d976141
build: remove redundant `ExperimentalCoroutinesApi`
david-allison Oct 1, 2026
ea4bc68
test(browser): prepare for col access on test threads
david-allison Oct 1, 2026
95137ee
refactor(tests): use `closeCollectionBlocking`
david-allison Oct 1, 2026
0fb03bc
test: add a rule for collection storage configuration
david-allison Oct 1, 2026
be853e2
fix(tests): use consistent storage mode
david-allison Oct 1, 2026
0197c84
test: add tests for storage
david-allison Oct 1, 2026
8f372ae
fix(tests): preserve JVM collection storage mode
david-allison Oct 1, 2026
d4ea592
refactor(tests): remove unused media collection manager
david-allison Oct 1, 2026
eb1f660
Add JS API method to toggle fullscreen mode
mixelas May 12, 2026
8b5abea
Fix fullscreen JS API branch compile regression
mixelas Aug 2, 2026
56b0fb0
Fix fullscreen JS API compile regression
mixelas Sep 19, 2026
dbe8b9a
feat(js-api): set reviewer fullscreen mode
mixelas Oct 1, 2026
7915789
Bumped version to 2.26.0alpha2
mikehardy Oct 1, 2026
8830502
Updated strings from Crowdin
Oct 2, 2026
467d407
refactor(about): extract aboutContributorsSpannable
david-allison Sep 28, 2026
6f2f197
feat(about): remove a donation reference from 'play' variant
david-allison Sep 28, 2026
cef7d64
Updated strings from Crowdin
Oct 2, 2026
92b86ca
build: re-enable configuration cache for release builds
david-allison Oct 2, 2026
42a58f0
refactor(previewer): special-case selection failures
david-allison Oct 1, 2026
913d96c
fix: handle unavailable IdsFile data
david-allison Oct 1, 2026
2f80c70
test: IdsFile - deleted file and restoring state
david-allison Oct 1, 2026
062c0f2
refactor: remove obsolete shadow resources
david-allison Oct 2, 2026
5b571ad
test(tags): de-flake TagsDialogTest
criticalAY Oct 3, 2026
377e23a
test: screenshot tests for `FilteredDeckOptionsFragment`
david-allison Oct 3, 2026
c58a477
build(deps): bump backend to 0.1.71-anki26.09.3
david-allison Oct 3, 2026
25bf0a1
fix(ids-file): handle truncated files
david-allison Oct 3, 2026
be13143
fix(ids-file): harden serialization
david-allison Oct 3, 2026
c644091
feat(shared-decks): render the download screen in Compose
criticalAY Sep 15, 2026
6b7f546
feat(shared-decks): redesign the download screen
criticalAY Sep 15, 2026
23c3c3e
feat(shared-decks): show download speed and time left
criticalAY Sep 15, 2026
91c3408
fix(bottom-nav-bar): enforce scoping of the nav bar to mobile only
ShaanNarendran Oct 1, 2026
be188e9
docs: convert licenses to SPDX format
david-allison Oct 3, 2026
253d205
Updated strings from Crowdin
Oct 3, 2026
d5fba1e
Dependency Updates 20261002
mikehardy Oct 4, 2026
9ba9fa7
Convert licenses to SPDX format
lukstbit Oct 4, 2026
2fcd71b
Remove lukstbit copyright headers
lukstbit Oct 4, 2026
e5b157e
fix(browser): crash: scroll during search refresh
david-allison Oct 2, 2026
b095ea7
fix(tags): parent tags could accidentally remain included
david-allison Oct 3, 2026
bd97e0f
fix: use the app cache if TMPDIR is unusable
david-allison Oct 2, 2026
e3389e6
test: deck picker widget screenshots
david-allison Oct 2, 2026
16159f2
fix(deck-picker-widget): make whole rows clickable
david-allison Oct 2, 2026
0b0fc5c
fix(deck-picker-widget): scale rows with font size
david-allison Oct 2, 2026
ec6d892
fix(deck-picker-widget): hide truncated rows
david-allison Oct 2, 2026
1864129
fix(deck-picker-widget): shrink text so one row is visible
david-allison Oct 2, 2026
0880678
fix(api): wait for AnkiDroidApp before opening collection
david-allison Oct 2, 2026
32084d4
fix(crash-reporting): exclude scheduler upgrade errors
david-allison Oct 3, 2026
80a677e
fix(reviewer): JS API errors are not media errors
david-allison Oct 2, 2026
07e1215
test(reviewer): real WebView - API failures
david-allison Oct 2, 2026
e16469a
logs(reviewer): WebView resource errors
david-allison Oct 2, 2026
e38724b
fix(card-template): reject blank card type names
CapThunder19 Sep 26, 2026
83a356d
feat: add `ComponentActivity.onPermanentDismissal`
david-allison Oct 3, 2026
47f354c
fix(browser): safely clean up IdsFile
david-allison Oct 3, 2026
fe6e35d
fix(build): remove version catalogs cache
david-allison Oct 3, 2026
e63922a
fix(pages): hardening for "window count is over max!!"
david-allison Oct 2, 2026
44c0b52
fix(deck-picker): restore add menu state
n1snt Oct 1, 2026
d5e8b4d
fix(card-browser): label the sort chip for TalkBack
criticalAY Oct 2, 2026
792f756
fix(card-browser): reload the sort on cards/notes switch
criticalAY Oct 2, 2026
6befcc5
Merge remote-tracking branch 'origin/main' into merge/upstream-oct05
float3 Oct 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
54 changes: 54 additions & 0 deletions .github/check_alpha_release.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// SPDX-License-Identifier: GPL-3.0-or-later

const fs = require("node:fs");

module.exports = async function checkAlphaRelease({ github, context, core }) {
const metadata = JSON.parse(
fs.readFileSync("AnkiDroid/build/outputs/release-metadata.json", "utf8"),
);
if (metadata.releaseType !== "alpha") {
core.info("Skipping scheduled release: main is not on an alpha version.");
return false;
}

const releases = await github.paginate(github.rest.repos.listReleases, {
...context.repo,
per_page: 100,
});
// Use calendar days to check, so last Monday's release doesn't block this release.
const day = 24 * 60 * 60 * 1000;
const today = Math.floor(Date.now() / day);
const recentRelease = releases.find(
release => !release.draft && today - Math.floor(Date.parse(release.published_at) / day) < 7,
);
if (recentRelease) {
core.info(
`Skipping scheduled release: ${recentRelease.tag_name} was published fewer than seven UTC calendar days ago.`,
);
return false;
}

const latestAlpha = releases
.filter(release => !release.draft && /^v\d+\.\d+\.\d+alpha\d+$/.test(release.tag_name))
.sort((a, b) => Date.parse(b.published_at) - Date.parse(a.published_at))[0];
if (!latestAlpha) {
core.info("Skipping scheduled release: no published alpha to compare against.");
return false;
}

const { data: comparison } = await github.rest.repos.compareCommitsWithBasehead({
...context.repo,
basehead: `${latestAlpha.tag_name}...${context.sha}`,
});
if (comparison.status !== "ahead" || comparison.ahead_by === 0) {
core.info(
`Skipping scheduled release: no new commits descending from ${latestAlpha.tag_name}.`,
);
return false;
}

core.info(
`Publishing an alpha: ${comparison.ahead_by} new commits since ${latestAlpha.tag_name}.`,
);
return true;
};
57 changes: 57 additions & 0 deletions .github/run_emulator_tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-3.0-or-later

"""Run emulator tests and generate the coverage report."""

import hashlib
from pathlib import Path
import subprocess
import sys
import time


def read_coverage():
shell = ["adb", "shell", "-T", "run-as", "com.ichi2.anki"]
for attempt in range(1, 6):
try:
checksum = subprocess.check_output([*shell, "sha256sum", "coverage.ec"], timeout=30).split()
data = subprocess.check_output([*shell, "cat", "coverage.ec"], timeout=30)
# ADB can exit successfully after a truncated transfer.
if not data or not checksum or hashlib.sha256(data).hexdigest().encode() != checksum[0]:
raise ValueError("Coverage copy is empty or incomplete")
return data
except (subprocess.SubprocessError, ValueError) as error:
# TODO (Issue 22147 - Dec 2026): check CI logs for "Coverage copy attempt" failures.
print(f"Coverage copy attempt {attempt}/5 failed: {error}", file=sys.stderr)
if attempt == 5:
raise
time.sleep(1)


def main():
connected_test = ":AnkiDroid:connectedPlayReleaseAndroidTest"
subprocess.run(
["./gradlew", "uninstallAll", connected_test,
"-Pandroid.injected.androidTest.leaveApksInstalledAfterRun=true", "--daemon"],
check=True,
)
data = read_coverage()
output_dir = Path("AnkiDroid/build/outputs/code_coverage/playReleaseAndroidTest/connected")
output_dir.mkdir(parents=True, exist_ok=True)
# JaCoCo reads every .ec file, including AGP's potentially truncated copy.
for previous in output_dir.rglob("*.ec"):
previous.unlink()
(output_dir / "coverage.ec").write_bytes(data)
subprocess.run(
["./gradlew", ":AnkiDroid:jacocoAndroidTestReport", "-x", connected_test, "--daemon"],
check=True,
)


if __name__ == "__main__":
try:
main()
except subprocess.CalledProcessError as error:
sys.exit(error.returncode)
except (OSError, ValueError, subprocess.TimeoutExpired) as error:
sys.exit(str(error))
19 changes: 18 additions & 1 deletion .github/workflows/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,21 @@ Alternately, you may run the actions on your fork of `Anki-Android`.

## Other Workflows

These are typically run by maintainers. See the [Maintenance guide](https://github.com/ankidroid/Anki-Android/wiki/Maintenance-guide)
These are typically run by maintainers. See the [Maintenance guide](https://github.com/ankidroid/Anki-Android/wiki/Maintenance-guide)

### Merge queue cancellation

GitHub can leave jobs running after their merge group has been removed.

`cancel_merge_queue_runs.yml` is triggered when a temporary merge queue branch is deleted.
The workflow cancels unfinished runs for unmerged groups.

### Automatic publish

An automatic alpha publish is performed every Monday at 04:30 UTC. This publish is skipped if:

* A publish occurred fewer than 7 UTC calendar days ago.
* The app is not in alpha.
* There were no commits since the last release.

An alpha published on Monday does not block the following Monday's release, regardless of the time it finished.
135 changes: 135 additions & 0 deletions .github/workflows/cancel_merge_queue_runs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
# SPDX-License-Identifier: GPL-3.0-or-later
name: Cancel Obsolete Merge Queue Runs

# `merge_group: destroyed` identifies the merge group and reason for removal,
# but is not documented as a supported Actions trigger. Use `delete` instead.
on:
# GitHub deletes temporary branches after discarded groups and successful merges.
# Preserve runs for merged commits: their checks also appear on the target branch.
delete:

permissions: {}

jobs:
cancel:
if: >-
github.event.ref_type == 'branch' &&
startsWith(github.event.ref, 'gh-readonly-queue/')
runs-on: ubuntu-latest
timeout-minutes: 5
permissions:
actions: write
contents: read
steps:
# SECURITY: never check out PR code here, use an inline script.
- uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
script: |
const deletedBranch = context.payload.ref;
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
// Target branch names may contain slashes. Refuse unfamiliar queue ref formats.
const targetBranch = /^gh-readonly-queue\/(.+)\/pr-\d+-[0-9a-f]{40}$/.exec(deletedBranch)?.[1];
if (!targetBranch) {
core.setFailed(`Cannot determine the target branch for ${deletedBranch}; skipping cleanup.`);
return;
}
// Collect unfinished merge-group workflow runs for this deleted branch.
const candidateRuns = await findUnfinishedMergeGroupRuns(deletedBranch);
for (const run of candidateRuns) {
try {
const outcome = await cancelObsoleteRun(run);
// The branch may have been requeued and its runs may be needed again.
if (outcome === 'branch-recreated') return;
} catch (error) {
core.setFailed(`Could not clean up run ${run.id}: ${error.message}`);
}
}
async function findUnfinishedMergeGroupRuns(branch) {
const runs = new Map();
let discoveryError;
// Poll three times to reduce the impact of stale API results.
// Known defect: all three scans can omit unfinished runs, potentially missing
// the entire group. Cleanup can then report success without cancelling them.
// There is no automatic follow-up cleanup, so missed runs can continue
// consuming runner capacity.
// TODO(2026-10-01): Remove when resolved: https://github.com/orgs/community/discussions/206725
for (let scan = 0; scan < 3; scan++) {
if (scan > 0) await delay(10000);
try {
const discovered = await github.paginate(github.rest.actions.listWorkflowRunsForRepo, {
...context.repo, branch, event: 'merge_group', per_page: 100,
});
for (const run of discovered) {
if (run.event === 'merge_group' && run.head_branch === branch && run.status !== 'completed') {
runs.set(run.id, run);
}
}
discoveryError = undefined;
} catch (error) {
discoveryError = error;
core.warning(`Discovery failed: ${error.message}`);
}
}
if (discoveryError) core.setFailed(`Could not finish discovering runs: ${discoveryError.message}`);
return runs.values();
}
async function getCancellationStatus(runId) {
const { data: run } = await github.rest.actions.getWorkflowRun({ ...context.repo, run_id: runId });
if (run.status === 'completed' || run.run_attempt !== 1) return 'ineligible';
try {
await github.rest.git.getRef({ ...context.repo, ref: `heads/${deletedBranch}` });
core.info('Skipping cleanup: the queue branch exists again.');
return 'branch-recreated';
} catch (error) {
if (error.status !== 404) throw error;
}
// The target may have advanced since merging, so check ancestry, not just its tip.
// Comparison errors must prevent cancellation; a missing queue ref alone is insufficient.
const { data: comparison } = await github.rest.repos.compareCommitsWithBasehead({
...context.repo, basehead: `${run.head_sha}...refs/heads/${targetBranch}`, per_page: 1,
});
if (comparison.status === 'ahead' || comparison.status === 'identical') {
core.info(`Skipping ${run.id}: its commit is already on ${targetBranch}.`);
return 'merged';
}
if (comparison.status !== 'behind' && comparison.status !== 'diverged') {
throw new Error(`Unexpected comparison status: ${comparison.status}`);
}
return 'eligible';
}
async function cancelObsoleteRun(run) {
let lastError;
for (let attempt = 1; attempt <= 3; attempt++) {
try {
// Recheck completion, reruns, branch recreation, and merging before each cancellation.
const status = await getCancellationStatus(run.id);
if (status !== 'eligible') return status;
core.info(`Cancelling ${run.id}: ${run.name}`);
await github.rest.actions.cancelWorkflowRun({ ...context.repo, run_id: run.id });
return;
} catch (error) {
// 409 Conflict => the run could be retried, in which case we skip this run.
const retryable = error.status == null || error.status === 409 || (error.status >= 500 && error.status < 600);
if (!retryable) throw error;
lastError = error;
core.warning(`Run ${run.id}: ${error.message}; rechecking in 5 seconds.`);
}
await delay(5000);
}
// The run may have finished, been retried, merged, or its branch been recreated.
// Recheck once more; if still eligible, report the error without a fourth request.
const status = await getCancellationStatus(run.id);
if (status === 'eligible') throw lastError;
return status;
}
6 changes: 3 additions & 3 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ jobs:

# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
Expand All @@ -86,7 +86,7 @@ jobs:
# AnkiDroid requires JDK21+ to build, current runners default to 17
- name: Configure JDK
if: matrix.language == 'java-kotlin'
uses: actions/setup-java@dd06d9cba3e5552c54d9f8ea23572deb30010f7c # v6.0.0
uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6.0.1
with:
distribution: "jetbrains"
java-version: "21" # also change jitpack.yml
Expand All @@ -108,6 +108,6 @@ jobs:
./gradlew --stop

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
with:
category: "/language:${{matrix.language}}"
4 changes: 2 additions & 2 deletions .github/workflows/compare_apk_size.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
KEYALIAS: nrkeystorealias
steps:
- name: Configure JDK
uses: actions/setup-java@dd06d9cba3e5552c54d9f8ea23572deb30010f7c # v6.0.0
uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6.0.1
with:
distribution: "jetbrains"
java-version: "21"
Expand All @@ -51,7 +51,7 @@ jobs:
ref: 'refs/pull/${{ github.event.inputs.prNumber }}/head'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0
uses: gradle/actions/setup-gradle@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6.4.0
timeout-minutes: 5
with:
# Use open source provider: https://github.com/gradle/actions/blob/main/docs/setup-gradle.md#basic-caching
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,15 @@ jobs:
fetch-depth: 2

- name: Configure JDK
uses: actions/setup-java@dd06d9cba3e5552c54d9f8ea23572deb30010f7c # v6.0.0
uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6.0.1
with:
distribution: "jetbrains"
java-version: "21"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Setup Gradle
uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0
uses: gradle/actions/setup-gradle@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6.4.0
timeout-minutes: 5
with:
# Use open source provider: https://github.com/gradle/actions/blob/main/docs/setup-gradle.md#basic-caching
Expand Down Expand Up @@ -88,7 +88,7 @@ jobs:
- name: Prettify AnkiDroid javascript code
uses: creyD/prettier_action@8c18391fdc98ed0d884c6345f03975edac71b8f0 # v4.6
with:
prettier_options: --check AnkiDroid/**/*.js
prettier_options: --check AnkiDroid/**/*.js .github/check_alpha_release.js
dry: True

- name: Install Localization
Expand Down
Loading
Loading