Skip to content

Merge upstream main - #25

Merged
float3 merged 58 commits into
ankiquestfrom
merge/upstream-main
Sep 24, 2026
Merged

float3 merged 58 commits into
ankiquestfrom
merge/upstream-main

Conversation

@float3

@float3 float3 commented Sep 24, 2026 •

Copy link
Copy Markdown
Owner

Upstream main up to d13b7ce, plus current ankiquest (#24, #26).

  • AnkiDroid/build.gradle conflict: upstream bumped versionCode to 22500202 (2.25.0beta2) where the quest override sits. Took their number, kept the override.

  • Upstream's new AcraBuildConfigTest requires every BuildConfig field sent with crash reports to be reviewed: added ANKIQUEST_RELEASE (release number only).

  • Upstream's new PreferenceTitleLengthTest: AnkiQuest titles already comply (checked).

  • ReviewerFragmentScrollTest zoom tests and ReviewRemindersTest.editReminderChangingDeckAndSettings also fail intermittently on upstream's own emulator CI (runs 35960527156, 35967220557, 35967109540); upstream is mid-fix (3e09dc2, "Part of 5182"). Not caused by this fork: it doesn't change reviewer code.

  • Adds sync_upstream.yml: daily, fast-forwards main to upstream and opens a PR from main into ankiquest when behind. Needs an UPSTREAM_SYNC_TOKEN secret (Contents, Pull requests, Workflows: read/write); GITHUB_TOKEN can't push upstream workflow changes and its PRs start no CI.

Merge commits made with --no-verify: local Gradle can't reach its workers over loopback, so the ktlint hook can't run. CI's Lint Kotlin covers it.

david-allison and others added 30 commits September 23, 2026 10:28
Following Brayan's PR, I grepped for my name and removed
50 references

AnkiDroid is standardizing licenses to SPDX.

I removed my copyright lines from the files as-per
docs/contributing/copyright-headers.md

Issue 20954

This change was not performed using LLMs and I have verified that it is
correct
ACRA's BuildConfig collector was broken, but would have included it

Assisted-by: GPT-6
Previously this failed as a ClassCastException and
"BUILD_CONFIG": "N/A"

ACRA could not cope with R8 placing unrelated code in BuildConfig
(primitive int arrays from the audio parser)

Assisted-by: GPT-6
Prefer `WebView.zoomBy()` over `loadWithOverviewMode` as overview mode
reset the scroll position.

Part of 5182

Assisted-by: GPT-6
Burying a card did not perform a reset, as `showingAnswer` did not change.

Assisted-by: Claude Opus 5
Assisted-by: GPT-6 - zoomBy reset
When flipping a card, we could scroll to `id="answer"` before resetting
 the zoom finished.

After the reset, the viewport was in an incorrect position.

Part of 5182

Assisted-by: GPT-6
* parcel round trips
* activity recreation
* simulated process death

Part of 21953

Assisted-by: GPT-6
Initialize input in onCreateView, before creating the editor's view.

Ensure all callbacks and cleanup handle a missing view.

Part of 21953

Assisted-by: GPT-6
This means we no longer serialize the whole note to
 instance state.

The fragment is responsible for the file lifetime.

Fixes part of 21953

Assisted-by: GPT-6

� Conflicts:
�	AnkiDroid/src/test/java/com/ichi2/anki/noteeditor/NoteEditorMultimediaControllerTest.kt
* orphaned multimedia arg files - after 7 days

Related to 21953

Assisted-by: GPT-6
- creating a reminder, dismissing it, and recreation (which doesn't prompt)
- when the permission is already enabled
- reminder cancellation

Fixes 21753

Assisted-by: GPT-6
Nicer syntax to support saving/restoring properties

Assisted-by: GPT-6
Makes the code testable

Assisted-by: Claude Fable 5.1
If a dropped column is scrolled off-screen before the animation completes, `ItemTouchHelper` called `clearView`. Which threw an IllegalStateException.

Defer the refresh while the RecyclerView is computing a layout or scrolling.

Reproduced by regression test only, against a machine-generated report.

Fixes 20557

Assisted-by: Claude Fable 5.1
Fixes elevation of a dropped column.

Assisted-by: Claude Fable 5.1
Part of 15760

Assisted-by: GPT-6 - implementation and validation
Part of 15760

Assisted-by: GPT-6 - implementation and validation
Assisted-by: Claude Fable 5.1 - test
Read the saved selection when the ViewModel is created, and save it in
place of the rows until a search applies it.
Otherwise, saving state in initialization clobbered the previous value.

Part of 19572

Assisted-by: Claude Fable 5.1 - all
Previously, a sync had the same priority as getting the deck counts.

Add:
* `withColExclusive` publish a `CollectionLease`
* `tryWithCol` does not execute if in the 'Exclusive' state via cancellation.

No-op as nothing uses `tryWithCol` yet

Part of 17551

Assisted-by: Claude Opus 5 - original code
Assisted-by: GPT-6 - lifecycle & regression tests
`tryWithCol` could interleave with a lease, causing the operation to wait

* A lease now waits for work to complete before executing in Exclusive mode

Part of 17551

Assisted-by: GPT-6
Part of 17551

Assisted-by: GPT-6
Prep for compileSdk 37: `SHOW_IMPLICIT` is deprecated in API 37.
The flag is a no-op from Android 16, so drop it on API 36+

Part of 21672

Assisted-by: Claude Fable 5
david-allison and others added 14 commits September 23, 2026 21:04
SDK 37 is the first release under 'major.minor' SDK versioning: the
platform ships as `android-37.0`, so `compileSdkMinor` must be set for
the target to resolve

Fixes 21672

Assisted-by: Claude Fable 5
Matches upstream: pylib/anki/collection.py
ankitects/anki@9f3f6ba

Partially fixes 20510

Assisted-by: Claude Fable 5
Restoring to default can update the fields in the note type.

The Note Editor now rebuilds the fields, preserving text where possible
(using the same code as when the spinner is changed)

Fixes 20510

Assisted-by: Claude Fable 5
ADB can drop offline immediately after the emulator reports boot complete,
causing the ART metrics helper to exit before tests start.

A retry (up to 5s) may help.

Fixes 22033

Assisted-by: GPT-6
Keep each backend sort order with its display label and map
 selections through the explicit order.

Prep for filtering out unusable orders.

Part of 21926

Assisted-by: GPT-6
Hide the following if FSRS is disabled:
* RETRIEVABILITY_ASCENDING,
* RETRIEVABILITY_DESCENDING

Fall back to random for invalid saved selections

Part of 21926
See https://redirect.github.com/ankitects/anki/pull/5407

Assisted-by: GPT-6
* use `InsetDrawable` (8dp) - using a `ldrtl` override for RTL
 handling

Fixes 21030

Assisted-by: Claude Fable 5 - all
Use the unthemed layout for widgets on Android 12 and later.

This prevents dynamic-color being used.

Previously, this was dynamic-color by default, and transitioned to unthemed after
 the first update.

Fixes 22015

Assisted-by: GPT-6
On a vertical scroll, easy days values were set.

This is fixed via a hacky JS wrapper as touch-action:pan-y had no effect

Due to the size & maintenance burden of a 'proper' fix [as this code
should be temporary], I selected a small, readable piece of JS which
disables all touch events, and re-implements 'click'.

The 'drag-to-set' functionality of the range slider is lost, but since
Easy Days is only three distinct values, and this should be a temporary
fix, this feels acceptable

Fixes 20929

Assisted-by: Claude Opus 4.7 - implementation
# Conflicts:
#	AnkiDroid/build.gradle
david-allison and others added 11 commits September 24, 2026 06:59
Review comment on 22004

Assisted-by: GPT-6
Lint rules cannot correlate android:title="@string/..." usages with
string definitions in `:common:android`. They need to be in the same
module

Part of 21500

Assisted-by: Claude Fable 5
`tools:ignore` works when the file is in `:common:android`.

Part of 21500

Assisted-by: Claude Fable 5
lint-release.xml enables this default-disabled issue, but JVM modules
do not apply lint-release.xml. Once :AnkiDroid lints with
checkDependencies = true, an issue enabled in the app must not be
hidden in a dependency module (CannotEnableHidden).

Part of 21500

Assisted-by: Claude Fable 5
Upstream's AcraBuildConfigTest requires every BuildConfig field sent with
crash reports to be listed. ANKIQUEST_RELEASE is the quest release number:
no credentials, no personal data.
`recordCoroutineCaller` adds the caller to stack traces
of suspend functions.

For understanding stack traces which fail inside `withCol`

Assisted-by: GPT-6
Fast-forward main to ankidroid/Anki-Android main every morning and open
a pull request from main into ankiquest when ankiquest is behind. main
stays a mirror; the job fails rather than push over local commits.

Needs UPSTREAM_SYNC_TOKEN: GITHUB_TOKEN cannot push commits that change
upstream's workflows, and pull requests it opens start no CI.
@github-actions

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

Snapshot diff report vs ankiquest. Open screenshot-diff for diffs.

  • AnkiDroidWidgetSmallScreenshotTest: 2 changes
  • AnkiquestHomeScreenshotTest: 2 changes
  • NoteTypeFieldEditorScreenshotTest: 3 changes
  • PreferencesScreenshotTest: 1 change
All 8 changed screenshots

AnkiDroidWidgetSmallScreenshotTest

  • initial_api30_compare.png
  • initial_api31_compare.png

AnkiquestHomeScreenshotTest

  • today_320dp_200percent_compare.png
  • today_320dp_compare.png

NoteTypeFieldEditorScreenshotTest

  • base_compare.png
  • delete_field_dialog_compare.png
  • reposition_field_dialog_compare.png

PreferencesScreenshotTest

  • GeneralSettingsFragment_compare.png

@float3
float3 merged commit 7418014 into ankiquest Sep 24, 2026
29 of 30 checks passed
@float3
float3 deleted the merge/upstream-main branch September 24, 2026 10:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants