diff --git a/.github/check_alpha_release.js b/.github/check_alpha_release.js index 332305a69137..30d732d3659b 100644 --- a/.github/check_alpha_release.js +++ b/.github/check_alpha_release.js @@ -3,12 +3,21 @@ const fs = require("node:fs"); module.exports = async function checkAlphaRelease({ github, context, core }) { + async function skipRelease(reason) { + core.info(`Skipping scheduled release: ${reason}`); + await github.rest.actions.cancelWorkflowRun({ + ...context.repo, + run_id: context.runId, + }); + // Cancellation is asynchronous. Keep this step alive so cancelWorkflowRun can kill it. + await keepProcessAlive(); + } + 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; + return await skipRelease("main is not on an alpha version."); } const releases = await github.paginate(github.rest.repos.listReleases, { @@ -22,18 +31,16 @@ module.exports = async function checkAlphaRelease({ github, context, core }) { 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 await skipRelease( + `${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; + return await skipRelease("no published alpha to compare against."); } const { data: comparison } = await github.rest.repos.compareCommitsWithBasehead({ @@ -41,10 +48,7 @@ module.exports = async function checkAlphaRelease({ github, context, core }) { 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; + return await skipRelease(`no new commits descending from ${latestAlpha.tag_name}.`); } core.info( @@ -52,3 +56,9 @@ module.exports = async function checkAlphaRelease({ github, context, core }) { ); return true; }; + +async function keepProcessAlive() { + // Fail after five minutes if cancellation never arrives. + await new Promise(resolve => setTimeout(resolve, 5 * 60 * 1000)); + throw new Error("Timed out waiting for workflow cancellation."); +} diff --git a/.github/config.yml b/.github/config.yml index 22c2f778b71b..32f22e6eacd2 100644 --- a/.github/config.yml +++ b/.github/config.yml @@ -5,12 +5,14 @@ # Comment to be posted to on first time issues newIssueWelcomeComment: > Hello! 👋 Thanks for logging this issue. Please remember we are all volunteers here, so some patience may be required before we can get to the issue. Also remember that the fastest way to get resolution on an issue is to propose a change directly, https://github.com/ankidroid/Anki-Android/wiki/Contributing + Please read our [AI Policy](https://github.com/ankidroid/Anki-Android/blob/main/AI_POLICY.md) before contributing. # Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome # Comment to be posted to on PRs from first time contributors in your repository newPRWelcomeComment: > First PR! 🚀 We sincerely appreciate that you have taken the time to propose a change to AnkiDroid! Please have patience with us as we are all volunteers - we will get to this as soon as possible. + Please ensure your contribution meets our [AI Policy](https://github.com/ankidroid/Anki-Android/blob/main/AI_POLICY.md) before contributing. # Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge diff --git a/.github/report_test_failures.py b/.github/report_test_failures.py index 718bcdbbfe3a..7acc7ed803a3 100644 --- a/.github/report_test_failures.py +++ b/.github/report_test_failures.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # SPDX-License-Identifier: GPL-3.0-or-later -"""Report failures and skipped tests from JUnit XML using the standard library.""" +"""Report failures, skipped tests, and overview summary from JUnit XML using the standard library.""" import argparse import html @@ -12,6 +12,19 @@ import xml.etree.ElementTree as ET +TABLE_HEADER = ( + "## Test Results\n\n" + "| Suite | Result | Duration | Tests | Passed | Failed | Skipped |\n" + "| ----- | ------ | -------- | ----- | ------ | ------ | ------- |\n" +) + + +def format_duration(seconds): + minutes = int(seconds // 60) + rem_seconds = seconds % 60 + return f"{minutes:02d}m {rem_seconds:06.3f}s" + + def read_ignored_tests(log_file): ignored = set() failed = set() @@ -26,22 +39,61 @@ def read_ignored_tests(log_file): return ignored - failed -def main(results_dir, log_file=None, pattern="TEST-*.xml", title="Test failures"): +def get_report_duration(root): + suites = root.findall("testsuite") + if suites: + total = 0.0 + for s in suites: + try: + total += float(s.get("time", 0) or 0) + except (ValueError, TypeError): + pass + if total > 0.0: + return total + try: + root_time = float(root.get("time", 0) or 0) + if root_time > 0.0: + return root_time + except (ValueError, TypeError): + pass + total = 0.0 + for tc in root.iter("testcase"): + try: + total += float(tc.get("time", 0) or 0) + except (ValueError, TypeError): + pass + return total + + +def main(results_dir, log_file=None, pattern="TEST-*.xml", title="Test failures", suite=None): failures = [] skipped = [] ignored = read_ignored_tests(log_file) + total_duration = 0.0 + passed_count = 0 + failed_count = 0 + skipped_count = 0 + for report in sorted(results_dir.rglob(pattern)): try: root = ET.parse(report).getroot() except (ET.ParseError, OSError) as error: - failures.append(f"Could not read {report}: {error}") + if os.environ.get("GITHUB_ACTIONS") == "true": + print(f"::warning::Could not read {report}: {error}") + else: + print(f"Warning: Could not read {report}: {error}", file=sys.stderr) continue + total_duration += get_report_duration(root) + for test in root.iter("testcase"): + name = f"{test.get('classname', '')}.{test.get('name', '')}" + has_failure = False + has_skipped = False + for result in test: if result.tag not in ("failure", "error", "skipped"): continue - name = f"{test.get('classname', '')}.{test.get('name', '')}" details = "".join(result.itertext()).strip() message = result.get("message", "") # Android can report assumption violations as failures or errors. @@ -56,10 +108,30 @@ def main(results_dir, log_file=None, pattern="TEST-*.xml", title="Test failures" "org.junit.AssumptionViolatedException", "org.junit.internal.AssumptionViolatedException", ): + has_skipped = True skipped.append(f"{name}\n{details or result.get('type', 'Test skipped')}") else: + has_failure = True failures.append(f"{name}\n{details or result.get('type', 'Test failed')}") + if has_failure: + failed_count += 1 + elif has_skipped: + skipped_count += 1 + else: + passed_count += 1 + + total_tests = passed_count + failed_count + skipped_count + is_successful = failed_count == 0 and total_tests > 0 + result_text = "SUCCESS" if is_successful else "FAILURE" + elapsed = format_duration(total_duration) + + if suite: + print( + f"{suite}: {result_text} ({elapsed}) - " + f"{total_tests} tests: {passed_count} passed, {failed_count} failed, {skipped_count} skipped" + ) + for failure in failures: if os.environ.get("GITHUB_ACTIONS") == "true": # GitHub renders the escaped message as a multiline error in the log. @@ -79,19 +151,27 @@ def main(results_dir, log_file=None, pattern="TEST-*.xml", title="Test failures" if os.environ.get("GITHUB_ACTIONS") == "true": print("::endgroup::") - if (failures or skipped) and os.environ.get("GITHUB_STEP_SUMMARY"): - with open(os.environ["GITHUB_STEP_SUMMARY"], "a", encoding="utf-8") as summary: + if os.environ.get("GITHUB_STEP_SUMMARY"): + with open(os.environ["GITHUB_STEP_SUMMARY"], "a+", encoding="utf-8") as summary: + summary.seek(0) + existing_content = summary.read() + if suite: + if "## Test Results" not in existing_content: + summary.write(TABLE_HEADER) + summary.write(f"| {suite} | **{result_text}** | {elapsed} | {total_tests} | {passed_count} | {failed_count} | {skipped_count} |\n\n") + if failures: summary.write(f"### {title}\n\n") for failure in failures: summary.write(f"
{html.escape(failure)}
\n\n") if skipped: + skipped_title = f"Skipped tests ({len(skipped)})" summary.write(f"
{skipped_title}\n\n") for skip in skipped: summary.write(f"
{html.escape(skip)}
\n\n") summary.write("
\n\n") - return 1 if failures else 0 + return 1 if (failures or (suite and not is_successful)) else 0 if __name__ == "__main__": @@ -100,5 +180,6 @@ def main(results_dir, log_file=None, pattern="TEST-*.xml", title="Test failures" parser.add_argument("log_file", type=Path, nargs="?") parser.add_argument("--pattern", default="TEST-*.xml", help="Recursive report glob relative to results_dir") parser.add_argument("--title", default="Test failures", help="Failure heading in the job summary") + parser.add_argument("--suite", help="Suite name for markdown summary table") args = parser.parse_args() - sys.exit(main(args.results_dir, args.log_file, args.pattern, args.title)) + sys.exit(main(args.results_dir, args.log_file, args.pattern, args.title, args.suite)) diff --git a/.github/with_emulator_cleanup.sh b/.github/with_emulator_cleanup.sh new file mode 100644 index 000000000000..1152597454cb --- /dev/null +++ b/.github/with_emulator_cleanup.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-3.0-or-later + +set -euo pipefail + +# Only for dedicated Linux CI runners with one emulator and -no-snapshot-save. +# Forced shutdown must not interrupt saving a snapshot for subsequent jobs. +stop_emulator() { + # #22613 `emu kill` can report success while QEMU keeps running and + # holds the emulator action's output pipes open. Bound both ADB and QEMU. + timeout -s KILL 5s "$ANDROID_HOME/platform-tools/adb" -s "emulator-$EMULATOR_PORT" emu kill || true + + local emulator_pattern="^$ANDROID_HOME/emulator/qemu/" + local deadline=$((SECONDS + 20)) + while pgrep -f "$emulator_pattern" > /dev/null; do + if ((SECONDS >= deadline)); then + echo "Emulator did not stop within 20 seconds; killing QEMU." >&2 + pkill -KILL -f "$emulator_pattern" || true + break + fi + sleep 1 + done +} + +# Preserve the exit status +trap stop_emulator EXIT +"$@" diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index a4361bf82d18..e4d72dc5f713 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -20,6 +20,9 @@ on: schedule: - cron: '42 12 * * 1' +env: + JAVA_TOOL_OPTIONS: -Dkotlin.daemon.options=autoshutdownIdleSeconds=10 + jobs: analyze: name: Analyze (${{ matrix.language }}) diff --git a/.github/workflows/compare_apk_size.yml b/.github/workflows/compare_apk_size.yml index 29127679994e..0385fa82352d 100644 --- a/.github/workflows/compare_apk_size.yml +++ b/.github/workflows/compare_apk_size.yml @@ -18,6 +18,9 @@ permissions: pull-requests: write +env: + JAVA_TOOL_OPTIONS: -Dkotlin.daemon.options=autoshutdownIdleSeconds=10 + jobs: sizeCheck: name: APK Size Check diff --git a/.github/workflows/conflict.yaml b/.github/workflows/conflict.yaml index ac85a1f3b8d3..251f771638f4 100644 --- a/.github/workflows/conflict.yaml +++ b/.github/workflows/conflict.yaml @@ -2,6 +2,8 @@ name: 🛠️ Conflict Scan on: push: + branches-ignore: + - 'gh-readonly-queue/**' schedule: - cron: "0 * * * *" diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 2fd5dbe5b228..9fad62b93163 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -14,6 +14,7 @@ jobs: steps: - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: + retries: 3 script: | let removeLabelsList = [ "Pending Merge", @@ -42,6 +43,7 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, + request: { retries: 0 }, body: `Maintainers: Please [Sync Translations](https://github.com/ankidroid/Anki-Android/actions/workflows/sync_translations.yml) to produce a commit with only the automated changes from this PR. Read more about updating strings on the wiki, @@ -80,6 +82,7 @@ jobs: steps: - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: + retries: 3 script: | const I18N_FILES = [ "01-core", @@ -133,6 +136,7 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, + request: { retries: 0 }, body: `> [!IMPORTANT] > **Maintainers**: This PR contains https://github.com/ankidroid/Anki-Android/labels/Strings changes @@ -207,6 +211,7 @@ jobs: steps: - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: + retries: 3 script: | const creator = context.payload.sender.login const opts = github.rest.issues.listForRepo.endpoint.merge({ @@ -240,6 +245,7 @@ jobs: steps: - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: + retries: 3 script: | await github.rest.issues.addLabels({ issue_number: context.issue.number, diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d5596bdd4277..0eaf7d866b58 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -20,6 +20,9 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true +env: + JAVA_TOOL_OPTIONS: -Dkotlin.daemon.options=autoshutdownIdleSeconds=10 + jobs: lintKotlin: name: Lint Kotlin diff --git a/.github/workflows/merge_requirements.yml b/.github/workflows/merge_requirements.yml index 81302dff8745..dfad37a8f666 100644 --- a/.github/workflows/merge_requirements.yml +++ b/.github/workflows/merge_requirements.yml @@ -9,13 +9,13 @@ on: permissions: {} -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true +# Don't cancel runs: this is a fast check which shows as a failing check when canceled. jobs: squashMerge: name: Squash merge + # perf: stops 'merge_group' from allocating a runner + if: github.event_name == 'pull_request' runs-on: ubuntu-latest timeout-minutes: 5 steps: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 7080bae85db7..ae28495b4f4c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -24,9 +24,15 @@ concurrency: group: ${{ github.workflow }} cancel-in-progress: false +env: + JAVA_TOOL_OPTIONS: -Dkotlin.daemon.options=autoshutdownIdleSeconds=10 + jobs: check_release: name: 'Check whether a release is due' + permissions: + contents: read + actions: write # Cancel this run when a scheduled publish is skipped. if: github.event_name == 'schedule' && github.repository == 'ankidroid/Anki-Android' && github.ref == 'refs/heads/main' timeout-minutes: 20 runs-on: ubuntu-latest diff --git a/.github/workflows/screenshot_comment.yml b/.github/workflows/screenshot_comment.yml index 1e994a187b84..8b28f9a291a1 100644 --- a/.github/workflows/screenshot_comment.yml +++ b/.github/workflows/screenshot_comment.yml @@ -64,7 +64,7 @@ jobs: name: Check if there are valid files shell: bash run: | - # Find Roborazzi diff PNGs in the downloaded artifact (in /). + # Find Roborazzi diff PNGs in the downloaded artifact (in //). mapfile -t files_to_add < <(find . -name "*_compare.png" -type f) if [ ${#files_to_add[@]} -gt 0 ]; then exist_valid_files="true" @@ -82,13 +82,14 @@ jobs: BASE_REF: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.pull_requests[0].base.ref || github.event.repository.default_branch }} shell: bash run: | - # Find Roborazzi diff PNGs to mention in the comment (in /). + # Find Roborazzi diff PNGs to mention in the comment (in //). mapfile -t files < <(find . -name "*_compare.png" -type f | sort) total=${#files[@]} # Cap the full list so we remain within GitHub's comment limit max_details=100 - # Group by test class - the file's immediate parent directory. + # Group by test class, module prefix is dropped for readability. + # Reconsider it once we are heavily mutlimodule. declare -A class_counts class_files for file in "${files[@]}"; do class_dir="${file%/*}" diff --git a/.github/workflows/screenshot_compare.yml b/.github/workflows/screenshot_compare.yml index 0d9599f012d4..7070e6c74962 100644 --- a/.github/workflows/screenshot_compare.yml +++ b/.github/workflows/screenshot_compare.yml @@ -27,6 +27,9 @@ on: permissions: {} +env: + JAVA_TOOL_OPTIONS: -Dkotlin.daemon.options=autoshutdownIdleSeconds=10 + jobs: compare-screenshot-test: name: compare @@ -38,6 +41,17 @@ jobs: actions: write # for upload-artifact steps: + # Work around Ubuntu 26.04's RAM-backed /tmp until the image fix rolls out. + # https://github.com/actions/runner-images/pull/14814 + - name: Keep /tmp on disk + if: runner.os == 'Linux' + run: | + if [ "$(findmnt -n -o FSTYPE --target /tmp)" = "tmpfs" ]; then + sudo systemctl mask tmp.mount + sudo umount -l /tmp + fi + df -hT /tmp + - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -57,13 +71,14 @@ jobs: gradle-version: wrapper - name: Warm Gradle Cache - # This makes sure we fetch gradle network resources with a retry + # Keep compilation here: robolectricSdkDownload only downloads SDK jars. + # Compiling resolves test dependencies within the retry (Issue 21682). uses: nick-fields/retry@ad984534de44a9489a53aefd81eb77f87c70dc60 # v4.0.0 with: timeout_minutes: 10 retry_wait_seconds: 60 max_attempts: 3 - command: ./gradlew robolectricSdkDownload :AnkiDroid:compilePlayDebugUnitTestKotlin -Pscreenshot --daemon + command: ./gradlew robolectricSdkDownload compileScreenshotTests -Pscreenshot --daemon - name: Download base branch screenshots uses: dawidd6/action-download-artifact@eab87c9830c39eff17e5a6eadb20bfb4bc880477 # v27 @@ -72,11 +87,12 @@ jobs: name: screenshot workflow: screenshot_store.yml branch: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.ref || github.event.repository.default_branch }} + event: push - name: Compare screenshots id: compare-screenshot-test run: | - ./gradlew compareRoborazziPlayDebug -Pscreenshot --stacktrace + ./gradlew compareScreenshots -Pscreenshot --stacktrace - name: Stage screenshot diffs if: ${{ always() }} @@ -84,18 +100,19 @@ jobs: # Folder name inside the artifact (e.g. "screenshot-diff-pr-12345" on PRs, "screenshot-diff-main" on push) SUBDIR: ${{ github.event_name == 'pull_request' && format('screenshot-diff-pr-{0}', github.event.number) || format('screenshot-diff-{0}', github.ref_name) }} run: | - # Trim 'AnkiDroid/build/outputs/roborazzi' from the artifact - # Only keep the _compare images of failing cases: /diffs/*_compare.png moves to / + # Preserve module paths so identically named tests cannot overwrite one another. mkdir -p "screenshot-diff/$SUBDIR" - shopt -s nullglob - for diffs_dir in AnkiDroid/build/outputs/roborazzi/*/diffs; do - class_name="$(basename "$(dirname "$diffs_dir")")" - compares=("$diffs_dir"/*_compare.png) - if (( ${#compares[@]} )); then - mkdir -p "screenshot-diff/$SUBDIR/$class_name" - mv "${compares[@]}" "screenshot-diff/$SUBDIR/$class_name/" - fi - done + while IFS= read -r -d '' compare; do + module="${compare%%/build/reports/screenshot-diffs/*}" + relative="${compare#*/build/reports/screenshot-diffs/}" + # Flatten local /diffs/ directory: keeps baselines apart from + # diffs while testing, and means nothing inside artifact + class="${relative%%/*}" + name="${relative##*/}" + destination="screenshot-diff/$SUBDIR/${module#./}/$class/$name" + mkdir -p "$(dirname "$destination")" + cp "$compare" "$destination" + done < <(find . -type f -path '*/build/reports/screenshot-diffs/*_compare.png' -print0) - name: Upload screenshot diffs uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 @@ -132,4 +149,4 @@ jobs: uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: pr # downloaded by screenshot_comment.yml - path: pr/ \ No newline at end of file + path: pr/ diff --git a/.github/workflows/screenshot_store.yml b/.github/workflows/screenshot_store.yml index dc53a73d5829..5ac3539a4bc0 100644 --- a/.github/workflows/screenshot_store.yml +++ b/.github/workflows/screenshot_store.yml @@ -26,22 +26,29 @@ on: push: branches: - main + - dependency-updates # On PRs, only run this when structural changes occur, to be sure 'main' can still store baselines pull_request: paths: - '.github/workflows/screenshot_*.yml' - 'gradle/libs.versions.toml' - - 'AnkiDroid/build.gradle' - - 'AnkiDroid/build.gradle.kts' # future-proof + - '**/build.gradle' + - '**/build.gradle.kts' + - 'settings.gradle.kts' - '**/ScreenshotTest.kt' + - '**/ScreenshotTestCategory.kt' + - 'buildSrc/src/main/kotlin/ankidroid.plugins.screenshots.gradle.kts' - 'tools/compare-screenshot-test.sh' permissions: {} +env: + JAVA_TOOL_OPTIONS: -Dkotlin.daemon.options=autoshutdownIdleSeconds=10 + jobs: store-screenshot-test: # On PRs, this verifies the workflow runs on `main`, it's not a store - name: ${{ github.ref == 'refs/heads/main' && 'store' || 'test' }} + name: ${{ github.event_name == 'push' && 'store' || 'test' }} runs-on: ubuntu-latest timeout-minutes: 20 @@ -50,6 +57,17 @@ jobs: actions: write # for upload-artifact steps: + # Work around Ubuntu 26.04's RAM-backed /tmp until the image fix rolls out. + # https://github.com/actions/runner-images/pull/14814 + - name: Keep /tmp on disk + if: runner.os == 'Linux' + run: | + if [ "$(findmnt -n -o FSTYPE --target /tmp)" = "tmpfs" ]; then + sudo systemctl mask tmp.mount + sudo umount -l /tmp + fi + df -hT /tmp + - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -70,20 +88,21 @@ jobs: gradle-version: wrapper - name: Warm Gradle Cache - # This makes sure we fetch gradle network resources with a retry - # TODO: --rerun-tasks in 'Record screenshots' discards the compilation performed here + # Keep compilation here: robolectricSdkDownload only downloads SDK jars. + # Compiling resolves test dependencies within the retry (Issue 21682). + # --rerun-tasks repeats compilation but reuses downloaded dependencies. uses: nick-fields/retry@ad984534de44a9489a53aefd81eb77f87c70dc60 # v4.0.0 with: timeout_minutes: 10 retry_wait_seconds: 60 max_attempts: 3 - command: ./gradlew robolectricSdkDownload :AnkiDroid:compilePlayDebugUnitTestKotlin -Pscreenshot --daemon + command: ./gradlew robolectricSdkDownload compileScreenshotTests -Pscreenshot --daemon - name: Record screenshots id: record-test run: | # Use --rerun-tasks to disable cache for test task - ./gradlew recordRoborazziPlayDebug -Pscreenshot --stacktrace --rerun-tasks + ./gradlew recordScreenshots -Pscreenshot --stacktrace --rerun-tasks - name: Upload screenshot baseline uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 @@ -110,4 +129,4 @@ jobs: name: screenshot-test-results path: | **/build/test-results - retention-days: 30 \ No newline at end of file + retention-days: 30 diff --git a/.github/workflows/tests_emulator.yml b/.github/workflows/tests_emulator.yml index a8e5dd5abd77..617148033b75 100644 --- a/.github/workflows/tests_emulator.yml +++ b/.github/workflows/tests_emulator.yml @@ -29,6 +29,9 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name == 'schedule' && 'scheduled' || 'ci' }} cancel-in-progress: true +env: + JAVA_TOOL_OPTIONS: -Dkotlin.daemon.options=autoshutdownIdleSeconds=10 + jobs: # We want to generate our matrix dynamically # Initial job generates the matrix as a JSON, and following job will use deserialize and use the result @@ -68,13 +71,23 @@ jobs: // try different architectures, targets, delays etc let arch = ['x86_64']; let target = ['google_apis', 'google_apis_ps16k']; - // Keep API 37 and the 16 KB emulator off the per-change CI path. - // Scheduled and manual runs exercise both API levels and targets. + let include = []; + // Keep API 37, the 16 KB emulator and the tablet off the per-change CI path. + // Scheduled and manual runs exercise both API levels and targets, plus a tablet. if (context.eventName !== 'schedule' && context.eventName !== 'workflow_dispatch') { target = ['google_apis']; } else { // Keep the minor version: SDK 37 packages use android-37.0. apiLevel.push('37.0'); + include = iterationArray.map((iteration) => ({ + "iteration": iteration, + "api-level": 36, + "arch": "x86_64", + "target": "google_apis", + "first-boot-delay": 600, + "device": "tablet", + "profile": "pixel_tablet" + })); } let firstBootDelay = [600]; @@ -83,7 +96,9 @@ jobs: "api-level": apiLevel, "arch": arch, "target": target, - "first-boot-delay": firstBootDelay + "first-boot-delay": firstBootDelay, + "device": ["phone"], + "include": include } - name: Debug Output run: echo "${{ steps.build-matrix.outputs.result }}" @@ -91,7 +106,7 @@ jobs: # This uses the matrix generated from the matrix-prep stage # it will run unit tests on whatever OS combinations are desired emulator_test: - name: Android Emulator Test (${{ matrix.api-level }}, ${{ matrix.arch }}, ${{ matrix.target }}, ${{ matrix.first-boot-delay }}, ${{ matrix.iteration }}) + name: Android Emulator Test (${{ matrix.api-level }}, ${{ matrix.arch }}, ${{ matrix.target }}, ${{ matrix.first-boot-delay }}, ${{ matrix.iteration }}${{ matrix.device == 'tablet' && ', tablet' || '' }}) runs-on: ubuntu-latest needs: matrix_prep timeout-minutes: 75 @@ -152,7 +167,7 @@ jobs: # Cache only the per-change emulator: the 16 KB snapshot costs about 2.5 GiB. - name: AVD cache - if: matrix.target == 'google_apis' + if: matrix.target == 'google_apis' && matrix.device == 'phone' uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 id: avd-cache with: @@ -163,6 +178,9 @@ jobs: restore-keys: | avd-${{ matrix.api-level }}-${{ matrix.arch }}-${{matrix.target}}-v2 + - name: Pin Build Time + run: echo "ORG_GRADLE_PROJECT_buildTime=$(date +%s000)" >> "$GITHUB_ENV" + - name: Warm Gradle Cache # This makes sure we fetch gradle network resources with a retry uses: nick-fields/retry@ad984534de44a9489a53aefd81eb77f87c70dc60 # v4.0.0 @@ -202,15 +220,16 @@ jobs: "${ANDROID_HOME:?}/system-images/android-${SDK_API_LEVEL:?}/${SDK_TARGET:?}/${SDK_ARCH:?}/.installer" - name: AVD Boot and Snapshot Creation - # Warm up the uncached 16 KB emulator on every run; otherwise only on main cache misses. + # Warm up the uncached 16 KB and tablet emulators on every run; otherwise only on main cache misses. # Comment the if out to generate snapshots on branch for performance testing - if: "${{ matrix.target == 'google_apis_ps16k' || (steps.avd-cache.outputs.cache-hit != 'true' && github.ref == 'refs/heads/main') }}" + if: "${{ matrix.target == 'google_apis_ps16k' || matrix.device == 'tablet' || (steps.avd-cache.outputs.cache-hit != 'true' && github.ref == 'refs/heads/main') }}" uses: reactivecircus/android-emulator-runner@a421e43855164a8197daf9d8d40fe71c6996bb0d # v2.38.0 with: api-level: ${{ matrix.api-level }} force-avd-creation: false target: ${{ matrix.target }} arch: ${{ matrix.arch }} + profile: ${{ matrix.profile }} emulator-options: ${{ env.EMULATOR_OPTIONS }} ram-size: ${{ env.EMULATOR_RAM_SIZE }} pre-emulator-launch-script: ${{ env.EMULATOR_PRE_LAUNCH_SCRIPT }} @@ -225,10 +244,10 @@ jobs: # This step is separate so pure install time may be calculated as a step - name: Emulator Snapshot After Firstboot Warmup - # Always warm up the 16 KB emulator. The default emulator only needs it on main cache misses. + # Always warm up the 16 KB and tablet emulators. The default emulator only needs it on main cache misses. # Switch the if statements via comment if generating snapshots for performance testing # if: matrix.first-boot-delay != '0' - if: "${{ matrix.target == 'google_apis_ps16k' || (steps.avd-cache.outputs.cache-hit != 'true' && github.ref == 'refs/heads/main') }}" + if: "${{ matrix.target == 'google_apis_ps16k' || matrix.device == 'tablet' || (steps.avd-cache.outputs.cache-hit != 'true' && github.ref == 'refs/heads/main') }}" env: FIRST_BOOT_DELAY: ${{ matrix.first-boot-delay }} uses: reactivecircus/android-emulator-runner@a421e43855164a8197daf9d8d40fe71c6996bb0d # v2.38.0 @@ -237,6 +256,7 @@ jobs: force-avd-creation: false target: ${{ matrix.target }} arch: ${{ matrix.arch }} + profile: ${{ matrix.profile }} emulator-options: ${{ env.EMULATOR_OPTIONS }} ram-size: ${{ env.EMULATOR_RAM_SIZE }} pre-emulator-launch-script: ${{ env.EMULATOR_PRE_LAUNCH_SCRIPT }} @@ -260,6 +280,7 @@ jobs: force-avd-creation: false target: ${{ matrix.target }} arch: ${{ matrix.arch }} + profile: ${{ matrix.profile }} emulator-options: -no-snapshot-save ${{ env.EMULATOR_OPTIONS }} ram-size: ${{ env.EMULATOR_RAM_SIZE }} pre-emulator-launch-script: ${{ env.EMULATOR_PRE_LAUNCH_SCRIPT }} @@ -274,11 +295,31 @@ jobs: bash .github/adb_retry.sh emu screenrecord start --time-limit 1800 video.webm sleep 5 bash .github/with_emulator_log.sh adb-log.txt python3 .github/run_emulator_tests.py - TEST_RELEASE_BUILD=false ./gradlew :baselineprofile:connectedBenchmarkBenchmarkAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.ichi2.anki.baselineprofile.ReleaseSmokeTest -Pandroid.testInstrumentationRunnerArguments.releaseSmokeTest=true --daemon - name: Report Emulator Test Results if: always() && hashFiles('AnkiDroid/build/outputs/androidTest-results/connected/**/TEST-*.xml') != '' - run: python3 .github/report_test_failures.py AnkiDroid/build/outputs/androidTest-results/connected adb-log.txt --title "Emulator test failures" + run: python3 .github/report_test_failures.py AnkiDroid/build/outputs/androidTest-results/connected adb-log.txt --title "Emulator test failures" --suite ":AnkiDroid:connectedPlayReleaseAndroidTest" + + - name: Build Release Smoke Test + run: TEST_RELEASE_BUILD=false ./gradlew packagePlayRelease :baselineprofile:packageBenchmarkBenchmark --daemon + + - name: Run Release Smoke Test + uses: reactivecircus/android-emulator-runner@a421e43855164a8197daf9d8d40fe71c6996bb0d # v2.38.0 + timeout-minutes: 10 + with: + api-level: ${{ matrix.api-level }} + force-avd-creation: false + target: ${{ matrix.target }} + arch: ${{ matrix.arch }} + emulator-options: -no-snapshot-save ${{ env.EMULATOR_OPTIONS }} + ram-size: ${{ env.EMULATOR_RAM_SIZE }} + pre-emulator-launch-script: ${{ env.EMULATOR_PRE_LAUNCH_SCRIPT }} + sdcard-path-or-size: 100M + disable-animations: true + script: | + bash .github/disable_art_metrics.sh + bash .github/adb_retry.sh shell settings put global hide_error_dialogs 1 + TEST_RELEASE_BUILD=false bash .github/with_emulator_cleanup.sh ./gradlew :baselineprofile:connectedBenchmarkBenchmarkAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.ichi2.anki.baselineprofile.ReleaseSmokeTest -Pandroid.testInstrumentationRunnerArguments.releaseSmokeTest=true --daemon - name: Configure NDK tools PATH for alignment checking run: | @@ -332,21 +373,21 @@ jobs: uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: always() with: - name: ${{ matrix.api-level }}-${{ matrix.arch }}-${{matrix.target}}-${{matrix.first-boot-delay}}-${{matrix.iteration}}-jacocoAndroidTestReport + name: ${{ matrix.api-level }}-${{ matrix.arch }}-${{matrix.target}}-${{matrix.first-boot-delay}}-${{matrix.iteration}}-${{ matrix.device }}-jacocoAndroidTestReport path: ~/work/Anki-Android/Anki-Android/AnkiDroid/build/reports/jacoco/ - name: Upload Emulator Log uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: always() with: - name: ${{ matrix.api-level }}-${{ matrix.arch }}-${{matrix.target}}-${{matrix.first-boot-delay}}-${{matrix.iteration}}-adb_logs + name: ${{ matrix.api-level }}-${{ matrix.arch }}-${{matrix.target}}-${{matrix.first-boot-delay}}-${{matrix.iteration}}-${{ matrix.device }}-adb_logs path: adb-log.txt - name: Upload Emulator Screen Record uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: always() with: - name: ${{ matrix.api-level }}-${{ matrix.arch }}-${{matrix.target}}-${{matrix.first-boot-delay}}-${{matrix.iteration}}-adb_video + name: ${{ matrix.api-level }}-${{ matrix.arch }}-${{matrix.target}}-${{matrix.first-boot-delay}}-${{matrix.iteration}}-${{ matrix.device }}-adb_video path: video.webm - uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1 diff --git a/.github/workflows/tests_unit.yml b/.github/workflows/tests_unit.yml index 13b2b4071a82..50709462a9b9 100644 --- a/.github/workflows/tests_unit.yml +++ b/.github/workflows/tests_unit.yml @@ -41,6 +41,9 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} cancel-in-progress: true +env: + JAVA_TOOL_OPTIONS: -Dkotlin.daemon.options=autoshutdownIdleSeconds=10 + jobs: # We want to generate our matrix dynamically # Initial job generates the matrix as a JSON, and following job will use deserialize and use the result @@ -115,8 +118,8 @@ jobs: # Do not run the scheduled jobs on forks if: (github.event_name == 'schedule' && github.repository == 'ankidroid/Anki-Android') || (github.event_name != 'schedule') needs: matrix_prep - # Windows takes 30-34 minutes when the Gradle cache misses (#21834) - timeout-minutes: 45 + # Windows can take 40m+ on tests + timeout-minutes: 60 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} strategy: @@ -126,6 +129,17 @@ jobs: #env: # CODACY_TOKEN: ${{ secrets.CODACY_TOKEN }} steps: + # Work around Ubuntu 26.04's RAM-backed /tmp until the image fix rolls out. + # https://github.com/actions/runner-images/pull/14814 + - name: Keep /tmp on disk + if: runner.os == 'Linux' + run: | + if [ "$(findmnt -n -o FSTYPE --target /tmp)" = "tmpfs" ]; then + sudo systemctl mask tmp.mount + sudo umount -l /tmp + fi + df -hT /tmp + - name: Configure Windows Pagefile uses: al-cheb/configure-pagefile-action@9b6da52fb72a3c6147c1aad2df22d8d905681adc # v1.5 if: contains(matrix.os, 'windows') @@ -134,6 +148,15 @@ jobs: maximum-size: 12GB disk-root: "C:" + - name: Configure Linux Swap + if: runner.os == 'Linux' + run: | + sudo fallocate -l 8G /swapfile-ci + sudo chmod 600 /swapfile-ci + sudo mkswap /swapfile-ci + sudo swapon /swapfile-ci + swapon --show + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 50 @@ -179,6 +202,17 @@ jobs: if: (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && matrix.iteration == 1 && matrix.os == 'ubuntu-latest' run: ./gradlew testFullDebugUnitTest -PemptyApplication --daemon + # Compile the extra release variant once per scheduled run, keeping PR checks unchanged. + - name: Test Parallel Content Provider (scheduled run only) + if: github.event_name == 'schedule' && matrix.iteration == 1 && matrix.os == 'ubuntu-latest' + env: + TEST_RELEASE_BUILD: "true" + run: > + ./gradlew :AnkiDroid:testFullReleaseUnitTest + -PcustomSuffix=a + --tests 'com.ichi2.anki.provider.CardContentProviderTest' + --daemon + - name: Report Unit Test Results if: always() && hashFiles('**/build/test-results/**/TEST-*.xml') != '' run: python3 .github/report_test_failures.py . --pattern "build/test-results/**/TEST-*.xml" --title "Unit test failures" diff --git a/AI_POLICY.md b/AI_POLICY.md index f1d1b31598d8..f27967614c5e 100644 --- a/AI_POLICY.md +++ b/AI_POLICY.md @@ -26,10 +26,16 @@ You may be banned from the repository if this occurs a second time. ### Contributors * You **must** be able to explain all your contributions. -* AI tools **should not** be used to produce GitHub comments, including filling in the pull request - template. +* When acting as a reviewer, you **may** use AI tools to produce code review comments. Prefer a + summary, with the exact AI-generated wording in a `
` block. +* AI tools **should not** be used to produce other GitHub comments, including filling in the pull + request template. * Contributions that make nontrivial use of AI tools **must** be labelled, with the tool version. +#### Exceptions + +AI-generated issues may be submitted at a maintainer's discretion. + ### Handling Questions about AI Use If you are not sure whether a tool or workflow counts as AI usage under this policy, please ask @@ -42,29 +48,53 @@ or trying to bypass this policy may lead to moderator action. ### Disclosure -**Commit messages** **must** use the `Assisted-by:` - [git trailer](https://git-scm.com/docs/git-interpret-trailers#_description) with an explanation - of the contributions in the description. +Disclose which AI tools were used. +**Commit messages** **must** use the `Assisted-by:` + [git trailer](https://git-scm.com/docs/git-interpret-trailers#_description). ``` docs: example title [Optional commit description] -GPT-5.2 implemented `complexMethod` +Assisted-by: GPT-6-Astra xhigh +Assisted-by: Claude Opus 5.5 +``` + +**GitHub comments** **must** disclose AI tool use, typically using one of the following formats: + +```md +Assisted-by: Claude Opus 5.5 +``` + +```md +[Summary of change] + +
+ +Assisted-by: Claude Opus 5.5 + +Details of change -Assisted-by: GPT-5.2 -Assisted-by: Claude Opus 4.5 [Proofreading/grammar] +
``` +produces: + +[Summary of change] -**GitHub comments** **must** use the `> [!NOTE]` - [alert](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts). +
+ +Assisted-by: Claude Opus 5.5 + +Details of change + +
```md > [!NOTE] -> The following table was generated using Claude Opus 4.5 +> The following table was generated using Claude Opus 5.5 ``` produces: -> [!NOTE] -> The following table was generated using Claude Opus 4.5 \ No newline at end of file +> [!NOTE] +> The following table was generated using Claude Opus 5.5 \ No newline at end of file diff --git a/AnkiDroid/build.gradle.kts b/AnkiDroid/build.gradle.kts index ebcf51b3d8e0..2fe03b88a849 100644 --- a/AnkiDroid/build.gradle.kts +++ b/AnkiDroid/build.gradle.kts @@ -12,13 +12,13 @@ plugins { // Gradle plugin portal alias(libs.plugins.tripletPlay) id("ankidroid.android.app") + id("ankidroid.android.compose") id("ankidroid.plugins.jacoco") id("ankidroid.plugins.robolectric-downloader") alias(libs.plugins.androidx.baselineprofile) alias(libs.plugins.kotlin.serialization) - alias(libs.plugins.kotlin.compose) alias(libs.plugins.keeper) - alias(libs.plugins.roborazzi) + id("ankidroid.plugins.screenshots") id("idea") } @@ -89,7 +89,6 @@ android { aidl = true viewBinding = true resValues = true - compose = true } if (testReleaseBuild) { @@ -131,9 +130,9 @@ android { // // This ensures the correct ordering between the various types of releases (dev < alpha < beta < release) which is // needed for upgrades to be offered correctly. - versionCode = 22600104 + versionCode = 22600109 // If you change this to a new version, you probably also want to update .gradle/workflows/milestone.yml for the new version... - versionName = "2.26.0alpha4" + versionName = "2.26.0alpha9" testApplicationId = "com.ichi2.anki.tests" vectorDrawables.useSupportLibrary = true testInstrumentationRunner = "com.ichi2.testutils.NewCollectionPathTestRunner" @@ -331,11 +330,11 @@ android { animationsDisabled = true unitTests { all { test -> + // Profile coverage checks must rerun when the generated profiles change. + test.inputs.dir("src/main/generated/baselineProfiles") test.useJUnitPlatform { // ./gradlew testFullDebugUnitTest -Pscreenshot if (project.hasProperty("screenshot")) { - includeTags("com.ichi2.anki.ScreenshotTestCategory") - // ./gradlew :AnkiDroid:recordRoborazziPlayDebug -Pscreenshot -Ptheme=black -Pdevice=tablet,foldable val theme = project.findProperty("theme")?.takeIf { it.toString().isNotEmpty() } ?: "light" val device = project.findProperty("device")?.takeIf { it.toString().isNotEmpty() } ?: "phone" @@ -358,8 +357,7 @@ android { test.systemProperty("screenshot.theme", theme) test.systemProperty("screenshot.device", device) - } else { - excludeTags("com.ichi2.anki.ScreenshotTestCategory") + test.systemProperty("screenshot.accessibilityScan", project.hasProperty("accessibilityScan")) } // Ensures that no EmptyApplication test relies on AnkiDroidApp // by only running EmptyApplication tests @@ -728,9 +726,10 @@ android { } } -configurations.configureEach { +configurations.matching { it.name.endsWith("CompileClasspath") || it.name.endsWith("RuntimeClasspath") }.configureEach { resolutionStrategy { - // Timber has this as a dependency but they are not up to date. We want to force our version. + // Keep app dependencies such as Timber on our annotations version. Changing Kotlin's + // compiler classpath creates an extra compiler daemon and increases peak memory use. force(libs.jetbrains.annotations) } } @@ -751,6 +750,7 @@ dependencies { implementation(project(":common:android")) implementation(project(":compat")) implementation(project(":libanki")) + implementation(project(":note-editor")) implementation(project(":vbpd")) "baselineProfile"(project(":baselineprofile")) implementation(project(":widgets")) @@ -758,17 +758,9 @@ dependencies { implementation(libs.google.analytics.kt) implementation(libs.androidx.activity) - // TODO: hoist the Compose enablement (kotlin.compose plugin, buildFeatures.compose, - // and the dependencies below) into a convention plugin under `buildSrc/` once the - // Kotlin-DSL migration of this build script lands implementation(libs.androidx.activity.compose) - implementation(platform(libs.androidx.compose.bom)) - implementation(libs.androidx.compose.ui) - implementation(libs.androidx.compose.ui.tooling.preview) - implementation(libs.androidx.compose.material3) implementation(libs.androidx.lifecycle.viewmodel.compose) implementation(libs.androidx.lifecycle.runtime.compose) - debugImplementation(libs.androidx.compose.ui.tooling) implementation(libs.androidx.annotation) implementation(libs.androidx.appcompat) implementation(libs.androidx.browser) @@ -855,9 +847,6 @@ dependencies { // ankidroid.plugins.robolectric-downloader may need a new SDK jar entry // when Robolectric or targetSdk changes. See the instructions in that plugin. testImplementation(libs.robolectric) - testImplementation(libs.androidx.compose.ui.test.junit4) - // Needed for createComposeRule(), but not for createAndroidComposeRule() - debugImplementation(libs.androidx.compose.ui.test.manifest) testImplementation(libs.androidx.test.core) testImplementation(libs.androidx.test.junit) testImplementation(libs.kotlin.reflect) @@ -877,6 +866,7 @@ dependencies { } testImplementation(libs.androidx.work.testing) testImplementation(libs.roborazzi) + testImplementation(libs.roborazzi.accessibility.check) testImplementation(libs.roborazzi.rule) // for testing flows testImplementation(libs.cashapp.turbine) @@ -908,10 +898,4 @@ dependencies { // Required so the ExperimentalCoroutinesApi opt-in (applied globally) doesn't cause // an "unresolved" warning, which is treated as an error due to allWarningsAsErrors testFixturesImplementation(libs.kotlinx.coroutines.core) - // The Kotlin Compose Compiler plugin attaches to every Kotlin compilation in the - // module including testFixtures, which has no @Composable code and refuses to - // run unless the Compose Runtime is on the classpath. compileOnly satisfies the - // plugin's version check without shipping the runtime in the testFixtures output. - testFixturesCompileOnly(platform(libs.androidx.compose.bom)) - testFixturesCompileOnly(libs.androidx.compose.runtime) } diff --git a/AnkiDroid/src/androidTest/java/com/ichi2/anki/DeckPickerImportTest.kt b/AnkiDroid/src/androidTest/java/com/ichi2/anki/DeckPickerImportTest.kt new file mode 100644 index 000000000000..bfba6bbbd07a --- /dev/null +++ b/AnkiDroid/src/androidTest/java/com/ichi2/anki/DeckPickerImportTest.kt @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki + +import androidx.core.content.edit +import androidx.test.core.app.ActivityScenario +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.ichi2.anki.CollectionManager.withCol +import com.ichi2.anki.common.preferences.sharedPrefs +import com.ichi2.anki.dialogs.DialogHandler +import com.ichi2.anki.tests.InstrumentedTest +import com.ichi2.anki.testutil.GrantStoragePermission.storagePermission +import com.ichi2.anki.testutil.disableIntroductionSlide +import com.ichi2.anki.testutil.grantPermissions +import com.ichi2.anki.testutil.notificationPermission +import com.ichi2.anki.testutil.waitUntil +import com.ichi2.utils.ImportUtils +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext +import org.junit.After +import org.junit.Assume.assumeTrue +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import kotlin.test.assertNull +import kotlin.test.assertTrue + +@RunWith(AndroidJUnit4::class) +class DeckPickerImportTest : InstrumentedTest() { + @get:Rule + val runtimePermissionRule = grantPermissions(storagePermission, notificationPermission) + + private val preferences get() = testContext.sharedPrefs() + private val hadBackupPromptPreference = preferences.contains("backupPromptDisabled") + private val backupPromptDisabled = preferences.getBoolean("backupPromptDisabled", false) + + @Test + fun importConfirmationSurvivesDelayedTabletStartup() { + DialogHandler.storeMessage(ImportUtils.CollectionImportAdd("deck.apkg").toMessage()) + + withDelayedStartup { scenario, resumeStartup -> + assertImportConfirmationVisible() + scenario.assertStartupWaiting() + + resumeStartup() + scenario.awaitStartup() + + assertImportConfirmationVisible() + } + } + + @Before + fun prepareTablet() { + // The study options side panel is selected by layout-sw600dp. + assumeTrue("Requires the tablet layout", testContext.resources.configuration.smallestScreenWidthDp >= 600) + disableIntroductionSlide() + InitialActivity.setUpgradedToLatestVersion(preferences) + preferences.edit { putBoolean("backupPromptDisabled", true) } + addNoteUsingBasicNoteType() + } + + @After + fun restorePreferencesAndPendingDialogs() { + DialogHandler.storeMessage(null) + preferences.edit { + if (hadBackupPromptPreference) { + putBoolean("backupPromptDisabled", backupPromptDisabled) + } else { + remove("backupPromptDisabled") + } + } + } + + private fun withDelayedStartup(test: suspend (scenario: ActivityScenario, resumeStartup: suspend () -> Unit) -> Unit) = + runBlocking { + val collectionQueueHeld = CountDownLatch(1) + val releaseStartup = CountDownLatch(1) + val pendingCollectionOperation = + launch(Dispatchers.IO) { + withCol { + collectionQueueHeld.countDown() + check(releaseStartup.await(30, TimeUnit.SECONDS)) { "Startup was not released" } + } + } + var scenario: ActivityScenario? = null + try { + assertTrue(collectionQueueHeld.await(10, TimeUnit.SECONDS), "The collection queue must be held before launching") + val activityScenario = ActivityScenario.launch(DeckPicker::class.java) + scenario = activityScenario + test(activityScenario) { + releaseStartup.countDown() + pendingCollectionOperation.join() + } + } finally { + releaseStartup.countDown() + withContext(NonCancellable) { + pendingCollectionOperation.join() + scenario?.close() + } + } + } + + private fun ActivityScenario.assertStartupWaiting() { + onActivity { activity -> + assertTrue(activity.fragmented, "The tablet side panel must be present") + assertNull(activity.fragment, "Study options must not have been initialized yet") + assertTrue(activity.viewModel.startupJob?.isActive == true, "Startup must still be waiting") + } + } + + private fun ActivityScenario.awaitStartup() { + waitUntil(message = { "Startup did not finish initializing study options" }) { + var finished = false + onActivity { activity -> + finished = + activity.viewModel.startupJob?.isCompleted == true && + activity.viewModel.loadDeckCounts?.isCompleted == true && + activity.fragment != null + } + finished + } + } + + private fun assertImportConfirmationVisible() { + onView(withText(testContext.getString(CommonString.import_dialog_message_add, "deck.apkg"))) + .check(matches(isDisplayed())) + onView(withText(CommonString.import_message_add)) + .check(matches(isDisplayed())) + } +} diff --git a/AnkiDroid/src/androidTest/java/com/ichi2/anki/cardviewer/HtmlTypeAnswerReviewerTest.kt b/AnkiDroid/src/androidTest/java/com/ichi2/anki/cardviewer/HtmlTypeAnswerReviewerTest.kt index 8dd588fb39a0..23f26fae8e1f 100644 --- a/AnkiDroid/src/androidTest/java/com/ichi2/anki/cardviewer/HtmlTypeAnswerReviewerTest.kt +++ b/AnkiDroid/src/androidTest/java/com/ichi2/anki/cardviewer/HtmlTypeAnswerReviewerTest.kt @@ -2,6 +2,7 @@ package com.ichi2.anki.cardviewer +import android.app.Activity import android.text.InputType import android.view.inputmethod.EditorInfo import android.webkit.WebView @@ -17,6 +18,7 @@ import com.ichi2.anki.Reviewer import com.ichi2.anki.common.preferences.sharedPrefs import com.ichi2.anki.libanki.DeckId import com.ichi2.anki.libanki.NoteTypeId +import com.ichi2.anki.previewer.CardViewerActivity import com.ichi2.anki.tests.InstrumentedTest import com.ichi2.anki.tests.checkWithTimeout import com.ichi2.anki.testutil.AvoidDayRolloverRule @@ -27,6 +29,7 @@ import com.ichi2.anki.testutil.ensureWebViewIsSupported import com.ichi2.anki.testutil.focusInput import com.ichi2.anki.testutil.grantPermissions import com.ichi2.anki.testutil.notificationPermission +import com.ichi2.anki.ui.windows.reviewer.ReviewerFragment import org.junit.After import org.junit.Before import org.junit.Rule @@ -34,13 +37,18 @@ import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.Parameterized import java.util.UUID +import kotlin.test.assertIs import kotlin.test.assertNotNull -/** Checks the legacy reviewer's HTML, script loading, and WebView keyboard support together. */ +/** Checks the real reviewers' HTML, script loading, and WebView keyboard support together. */ @RunWith(Parameterized::class) class HtmlTypeAnswerReviewerTest : InstrumentedTest() { @JvmField // required for Parameter @Parameterized.Parameter + var newReviewer = false + + @JvmField // required for Parameter + @Parameterized.Parameter(1) var autoFocus = false @get:Rule @@ -72,7 +80,7 @@ class HtmlTypeAnswerReviewerTest : InstrumentedTest() { originalPreferences = listOf(newReviewerKey, "useInputTag", "autoFocusTypeInAnswer", doubleTapKey).associateWith { preferences.all[it] } preferences.edit { - putBoolean(newReviewerKey, false) + putBoolean(newReviewerKey, newReviewer) putBoolean("useInputTag", true) putBoolean("autoFocusTypeInAnswer", autoFocus) // These tests intentionally grade immediately after Done. @@ -134,6 +142,8 @@ class HtmlTypeAnswerReviewerTest : InstrumentedTest() { @Test fun onlyTheMarkedAnswerDisablesSuggestions() = withReviewer { webView -> + // Let reviewer autofocus finish before moving to another field. + focusAnswer(webView, noSuggest = true) webView.focusInput("ordinary") val baseline = keyboard.awaitEditor().inputType webView.focusInput("typeans") @@ -165,7 +175,7 @@ class HtmlTypeAnswerReviewerTest : InstrumentedTest() { keyboard.perform("done") webView.awaitJavascript("document.querySelector('#typeans .typeGood')?.textContent === 'été'") if (question != "Third") { - onView(withId(R.id.flashcard_layout_ease3)) + onView(withId(if (newReviewer) R.id.good_button else R.id.flashcard_layout_ease3)) .also { it.checkWithTimeout(matches(isDisplayed())) } .perform(click()) } @@ -190,10 +200,16 @@ class HtmlTypeAnswerReviewerTest : InstrumentedTest() { } private fun withReviewer(block: (WebView) -> Unit) { - ActivityScenario.launch(Reviewer.getIntent(testContext)).use { scenario -> + ActivityScenario.launch(Reviewer.getIntent(testContext)).use { scenario -> lateinit var webView: WebView scenario.onActivity { activity -> - webView = assertNotNull(activity.webView) + webView = + if (newReviewer) { + val fragment = assertIs(assertIs(activity).fragment) + assertIs(fragment.binding.webViewLayout.getChildAt(0)) + } else { + assertNotNull(assertIs(activity).webView) + } } webView.awaitJavascript("document.getElementById('typeans') !== null") block(webView) @@ -202,7 +218,7 @@ class HtmlTypeAnswerReviewerTest : InstrumentedTest() { companion object { @JvmStatic // required for Parameters - @Parameterized.Parameters(name = "autoFocus={0}") - fun focusModes() = listOf(false, true) + @Parameterized.Parameters(name = "newReviewer={0}, autoFocus={1}") + fun reviewers() = listOf(arrayOf(false, false), arrayOf(false, true), arrayOf(true, false), arrayOf(true, true)) } } diff --git a/AnkiDroid/src/androidTest/java/com/ichi2/anki/dialogs/NoteTypeFieldEditorContextMenuTest.kt b/AnkiDroid/src/androidTest/java/com/ichi2/anki/dialogs/NoteTypeFieldEditorContextMenuTest.kt index 2c2cb19c783b..f22833bb5aca 100644 --- a/AnkiDroid/src/androidTest/java/com/ichi2/anki/dialogs/NoteTypeFieldEditorContextMenuTest.kt +++ b/AnkiDroid/src/androidTest/java/com/ichi2/anki/dialogs/NoteTypeFieldEditorContextMenuTest.kt @@ -10,12 +10,12 @@ import androidx.test.espresso.matcher.RootMatchers.isDialog import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.ichi2.anki.R import com.ichi2.anki.dialogs.NoteTypeFieldEditorContextMenu.NoteTypeFieldEditorContextMenuAction import com.ichi2.anki.tests.InstrumentedTest import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith +import com.ichi2.anki.common.android.R as CommonR /** Tests [NoteTypeFieldEditorContextMenu] */ @RunWith(AndroidJUnit4::class) @@ -26,8 +26,8 @@ class NoteTypeFieldEditorContextMenuTest : InstrumentedTest() { @Ignore("flaky") fun showsAllOptions() { launchFragment( - fragmentArgs = Bundle().apply { putString(NoteTypeFieldEditorContextMenu.KEY_LABEL, testDialogTitle) }, - themeResId = R.style.Theme_Light, + fragmentArgs = Bundle().apply { putString(NoteTypeFieldEditorContextMenu.ARG_LABEL, testDialogTitle) }, + themeResId = CommonR.style.Theme_Light, ) { NoteTypeFieldEditorContextMenu() } onView(withText(testDialogTitle)) .inRoot(isDialog()) diff --git a/AnkiDroid/src/androidTest/java/com/ichi2/anki/exception/SanitizedReportCollectorIntegrationTest.kt b/AnkiDroid/src/androidTest/java/com/ichi2/anki/exception/SanitizedReportCollectorIntegrationTest.kt new file mode 100644 index 000000000000..3da3adad95e8 --- /dev/null +++ b/AnkiDroid/src/androidTest/java/com/ichi2/anki/exception/SanitizedReportCollectorIntegrationTest.kt @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.exception + +import android.content.Context +import androidx.test.core.app.ApplicationProvider.getApplicationContext +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.ichi2.anki.AnkiDroidApp +import com.ichi2.anki.logging.ProductionCrashReportingTree +import com.ichi2.anki.servicelayer.ThrowableFilterService +import org.acra.ReportField +import org.acra.builder.ReportBuilder +import org.acra.config.CoreConfigurationBuilder +import org.acra.data.CrashReportData +import org.acra.data.CrashReportDataFactory +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import timber.log.Timber +import java.util.UUID +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertNotNull +import kotlin.test.assertSame +import kotlin.test.assertTrue + +/** Exercises the packaged ACRA collectors against Android's logcat and the uncaught-error filter. */ +@RunWith(AndroidJUnit4::class) +class SanitizedReportCollectorIntegrationTest { + private val tree = ProductionCrashReportingTree() + + @Before + fun setUp() { + Timber.plant(tree) + } + + @After + fun tearDown() { + Timber.uproot(tree) + } + + @Test + fun sanitizedReportsExcludePrivateMessagesAlreadyWrittenToLogcat() { + val privateMessage = "private-${UUID.randomUUID()}@example.com" + val exception = StorageAccessException(privateMessage) + Timber.w(exception) + + // Prove that the real LogCatCollector can read the private message before filtering. + val unfiltered = collectReport(exception, parallel = false) + assertTrue(assertNotNull(unfiltered.getString(ReportField.LOGCAT)).contains(privateMessage)) + + for (parallel in listOf(false, true)) { + val report = collectUnhandledReport(exception, parallel) + + assertEquals( + "Logcat filtered because it may contain personally identifiable information (PII).", + report.getString(ReportField.LOGCAT), + ) + assertFalse(report.toJSON().contains(privateMessage)) + assertTrue(assertNotNull(report.getString(ReportField.STACK_TRACE)).contains(exception.javaClass.name)) + assertFalse(report.getString(ReportField.STACK_TRACE_HASH).isNullOrEmpty()) + } + } + + @Test + fun ordinaryReportsRetainTheirLogcatDiagnostics() { + val message = "ordinary diagnostics ${UUID.randomUUID()}" + val exception = IllegalStateException(message) + Timber.w(exception) + + for (parallel in listOf(false, true)) { + val report = collectUnhandledReport(exception, parallel) + + assertTrue(assertNotNull(report.getString(ReportField.LOGCAT)).contains(message)) + assertTrue(assertNotNull(report.getString(ReportField.STACK_TRACE)).contains(message)) + } + } + + @Test + fun unrelatedThreadFailuresReachOriginalHandler() { + val backgroundFailure = IllegalStateException("unrelated background failure") + val worker = + Thread { throw backgroundFailure }.apply { + uncaughtExceptionHandler = ThrowableFilterService.uncaughtExceptionHandler + } + val originalHandler = ThrowableFilterService.originalUncaughtExceptionHandler + var delegatedThread: Thread? = null + var delegatedFailure: Throwable? = null + val delegate = + Thread.UncaughtExceptionHandler { thread, throwable -> + if (thread === worker) { + delegatedThread = thread + delegatedFailure = throwable + } else { + originalHandler?.uncaughtException(thread, throwable) + } + } + try { + ThrowableFilterService.originalUncaughtExceptionHandler = delegate + val expectedFailure = IllegalStateException("expected report failure") + val report = + collectUnhandledReport(expectedFailure, parallel = false) { + worker.start() + worker.join(5000) + assertFalse(worker.isAlive, "The unrelated exception handler must finish") + assertSame(worker, delegatedThread) + assertSame(backgroundFailure, delegatedFailure) + } + + assertTrue(assertNotNull(report.getString(ReportField.STACK_TRACE)).contains("expected report failure")) + assertSame(delegate, ThrowableFilterService.originalUncaughtExceptionHandler) + } finally { + ThrowableFilterService.originalUncaughtExceptionHandler = originalHandler + } + } + + private fun collectUnhandledReport( + exception: Throwable, + parallel: Boolean, + beforeReport: () -> Unit = {}, + ): CrashReportData { + val reportingThread = Thread.currentThread() + val originalHandler = ThrowableFilterService.originalUncaughtExceptionHandler + var report: CrashReportData? = null + try { + // Capture this thread's report before ACRA's sending and process-termination stages. + ThrowableFilterService.originalUncaughtExceptionHandler = + Thread.UncaughtExceptionHandler { thread, reportable -> + if (thread === reportingThread) { + report = collectReport(reportable, parallel) + } else { + originalHandler?.uncaughtException(thread, reportable) + } + } + beforeReport() + ThrowableFilterService.uncaughtExceptionHandler.uncaughtException(reportingThread, exception) + } finally { + ThrowableFilterService.originalUncaughtExceptionHandler = originalHandler + } + return assertNotNull(report, "The uncaught exception must reach report collection") + } + + private fun collectReport( + exception: Throwable, + parallel: Boolean, + ): CrashReportData { + val config = + CoreConfigurationBuilder() + .withReportContent(ReportField.STACK_TRACE, ReportField.STACK_TRACE_HASH, ReportField.LOGCAT) + .withLogcatArguments("-t", "500", "-v", "time", "${AnkiDroidApp.TAG}:D", "*:S") + .withParallel(parallel) + .build() + return CrashReportDataFactory(getApplicationContext(), config).createCrashData(ReportBuilder().exception(exception)) + } +} diff --git a/AnkiDroid/src/androidTest/java/com/ichi2/anki/tests/ContentProviderTest.kt b/AnkiDroid/src/androidTest/java/com/ichi2/anki/tests/ContentProviderTest.kt index c3672a7eb83b..3dc642ec971e 100644 --- a/AnkiDroid/src/androidTest/java/com/ichi2/anki/tests/ContentProviderTest.kt +++ b/AnkiDroid/src/androidTest/java/com/ichi2/anki/tests/ContentProviderTest.kt @@ -80,7 +80,7 @@ import kotlin.test.junit.JUnitAsserter.assertNotNull */ class ContentProviderTest : InstrumentedTest() { @get:Rule - var runtimePermissionRule = grantPermissions(storagePermission, FlashCardsContract.READ_WRITE_PERMISSION) + var runtimePermissionRule = grantPermissions(storagePermission, FlashCardsContract.getPermission()) // Whether tear down should be executed. I.e. if set up was not cancelled. private var tearDown = false @@ -1062,7 +1062,7 @@ class ContentProviderTest : InstrumentedTest() { val filteredDeckId = col.decks.newFiltered("Raw due filtered deck") testDeckIds.add(filteredDeckId) val filteredDeck = checkNotNull(col.decks.getLegacy(filteredDeckId)) - filteredDeck.getJSONArray("terms").getJSONArray(0).put(0, "cid:${card.id}") + filteredDeck.firstFilter.search = "cid:${card.id}" col.decks.save(filteredDeck) col.sched.rebuildFilteredDeck(filteredDeckId) card.load(col) @@ -1860,7 +1860,7 @@ class ContentProviderTest : InstrumentedTest() { assertNotNull("Check that the deck we received actually exists", deck) assertEquals( "Check that the received deck has the correct name", - deck.getString("name"), + deck.name, deckName, ) } @@ -1894,7 +1894,7 @@ class ContentProviderTest : InstrumentedTest() { ) assertEquals( "Check that received deck name equals real deck name", - realDeck.getString("name"), + realDeck.name, returnedDeckName, ) } diff --git a/AnkiDroid/src/androidTest/java/com/ichi2/anki/testutil/DeckPicker.kt b/AnkiDroid/src/androidTest/java/com/ichi2/anki/testutil/DeckPicker.kt index 5349b53595f0..c0571ba4fb2a 100644 --- a/AnkiDroid/src/androidTest/java/com/ichi2/anki/testutil/DeckPicker.kt +++ b/AnkiDroid/src/androidTest/java/com/ichi2/anki/testutil/DeckPicker.kt @@ -18,6 +18,7 @@ import com.ichi2.anki.R import com.ichi2.anki.TestUtils.clickChildViewWithId import com.ichi2.anki.tests.checkWithTimeout import com.ichi2.anki.testutil.ThreadUtils.sleep +import com.ichi2.anki.common.android.R as CommonR /** * This file contains utility methods to interact with the DeckPicker. @@ -51,7 +52,7 @@ fun createDeckWithUniqueName(): String { val deckName = "TestDeck$testString" onView(withId(R.id.fab_main)).perform(click()) onView(withId(R.id.add_deck_button)).perform(click()) - onView(withId(R.id.dialog_text_input)).perform(typeText(deckName)) + onView(withId(CommonR.id.dialog_text_input)).perform(typeText(deckName)) onView(withText(CommonString.dialog_ok)).perform(click()) return deckName } diff --git a/AnkiDroid/src/androidTest/java/com/ichi2/anki/testutil/IntroductionSlide.kt b/AnkiDroid/src/androidTest/java/com/ichi2/anki/testutil/IntroductionSlide.kt index be89daa4df15..9529ef95aca6 100644 --- a/AnkiDroid/src/androidTest/java/com/ichi2/anki/testutil/IntroductionSlide.kt +++ b/AnkiDroid/src/androidTest/java/com/ichi2/anki/testutil/IntroductionSlide.kt @@ -9,6 +9,6 @@ import com.ichi2.anki.IntroductionActivity fun disableIntroductionSlide() { AnkiDroidApp.sharedPrefs().edit { - putBoolean(IntroductionActivity.INTRODUCTION_SLIDES_SHOWN, true) + putBoolean(IntroductionActivity.PREF_INTRODUCTION_SLIDES_SHOWN, true) } } diff --git a/AnkiDroid/src/main/AndroidManifest.xml b/AnkiDroid/src/main/AndroidManifest.xml index f5c3dc5cc208..805c40bd7732 100644 --- a/AnkiDroid/src/main/AndroidManifest.xml +++ b/AnkiDroid/src/main/AndroidManifest.xml @@ -81,6 +81,10 @@ + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AnkiDroid Changelog
+
+

Version 2.26.0alpha9 is a test build. Its changelog comes with the stable release. Until then, here are the changes in the latest stable version.

+
+
+

Version 2.25.3 (20261017)

+
+
+

Hello everyone out there in AnkiDroid-land 👋

+
+
+

We’re already moving right along on work for 2.26 but we are always listening for and +fixing issues when we hear about them - hopefully this patch release gets rid of some +pain points for everyone

+
+
+

Cheers!

+
+
+
    +
  • +

    Deck Picker: Fix the import confirmation disappearing on tablets during startup

    +
  • +
  • +

    Reviewing: Re-enable HTTP(s) links - our security fixes went too far

    +
  • +
  • +

    Note Editor: Fix filename normalization issues when pasting media

    +
  • +
  • +

    Text-to-speech: Report network errors and timeouts

    +
  • +
  • +

    App-wide: Fix crashes if widgets are unsupported

    +
  • +
+
+
+

Full list of 2.25.3 changes.

+
+
+
+
+

Version 2.25.2 (20261013)

+
+
+

…​aaaaand we’re back! Google has officially blessed our releases and allowed them +out in the wild again after our donation link kerfuffle. In fact, literally millions +of you (nearly 3 million and counting) are already on the new 2.25 release series

+
+
+

For any of you that have opted in to crash reporting, thank you! That’s one of the main +ways we detect new problems, and your reward is this fresh batch of fixes

+
+
+

Enjoy!

+
+
+
    +
  • +

    Deck Picker: Fix 'one way sync' disappearing on tablets

    +
  • +
  • +

    Text-to-speech: Handle AnkiDroid crashing when accessing faulty TTS Engines

    +
  • +
  • +

    Reviewer: Fix TTS freezes when leaving the study screen

    +
  • +
  • +

    Performance: Fix various freezes while syncing

    +
  • +
  • +

    Sync: Fix errors when closing the app

    +
  • +
  • +

    App-wide: Fix some Android region settings blocking backend translations

    +
  • +
  • +

    App-wide: Fix random freezes on some devices (Custom Tabs issue)

    +
  • +
  • +

    App-wide: Fix crashes when closing/rotating screens

    +
  • +
  • +

    Internationalization: Fix tablet panes resizing in the opposite direction

    +
  • +
+
+
+

Full list of 2.25.2 changes.

+
+
+
+
+

Version 2.25.1 (20261006)

+
+
+

Wait what!? What is this? A 2.25.1 and you didn’t even get 2.25.0 yet!

+
+
+

That’s right! 2.25.0 did ship but Google wouldn’t release it because…​well, honestly +we’re not sure, their approval / rejection process is completely opaque! All we know is that +it originally had to do with them rejecting our donations link. And now it appears they’re +rejecting old versions! But we do what we can. And we can keep trying. So here’s 2.25.1!

+
+
+

With sincere wishes all of our lovely AnkiDroid users get to enjoy it ☺️ 🫶

+
+
+

Full 2.25.0 changelog down below 👇

+
+
+

Here’s our 2.25.1 bugfix list:

+
+
+
    +
  • +

    Study screen: Preserve scroll position when flipping a card

    +
  • +
  • +

    Study screen: Reset zoom when changing cards

    +
  • +
  • +

    Reviewing: Fix MathJax font scaling (may change the layout of some cards)

    +
  • +
  • +

    Reviewing: Fix crash on close after a WebView failure

    +
  • +
  • +

    Text-to-speech: Prefer installed voices (fixes issues on Pixel devices)

    +
  • +
  • +

    Text-to-speech: Performance improvements for legacy TTS

    +
  • +
  • +

    Card Browser: Fix crashes while scrolling

    +
  • +
  • +

    Card Browser: Preserve selection in more cases

    +
  • +
  • +

    Card Browser: Fix icon tint being applied globally

    +
  • +
  • +

    Tags: Fix parent tags remaining selected after being unchecked

    +
  • +
  • +

    Tags: Fix checkbox states when editing multiple notes or filtering tags

    +
  • +
  • +

    Tags: Fix ordering (partially selected tags at the top)

    +
  • +
  • +

    Tags: Fix tags being changed on scroll

    +
  • +
  • +

    Tags: Better performance

    +
  • +
  • +

    Note Editor: Handle 'Restore to Default' in the template editor

    +
  • +
  • +

    Note Editor: Match Anki Desktop when switching to a note type without an deck

    +
  • +
  • +

    Note Types: Update state after undo/redo

    +
  • +
  • +

    Various screens: Better edge to edge UI support

    +
  • +
  • +

    Sync: Fix crash on long background syncs

    +
  • +
  • +

    Sync: Fix undismissable notification sometimes appearing after a completed sync

    +
  • +
  • +

    Deck Options: Prevent scrolling from changing Easy Days

    +
  • +
  • +

    Deck Picker Widget: Make the whole deck row tappable

    +
  • +
  • +

    Widgets: Improve layout with large fonts and small widget sizes

    +
  • +
  • +

    Widgets: Hide cut-off rows and refresh the deck list when resized

    +
  • +
  • +

    Widgets: Fix incorrect colors on load (Android 12+)

    +
  • +
  • +

    App-wide: Reduce unnecessary data saved when moving app data to disk

    +
  • +
  • +

    App-wide: Fix crash when TMPDIR is unavailable

    +
  • +
+
+ +
+
+
+

Version 2.25.0 (20260927)

+
+
+

Hey hey hey! It’s new AnkiDroid version time 🎁👀. We’ve got a bunch of new features for you, plus the usual +mix of security fixes, bug fixes and quality of life improvements. We hope you enjoy it.

+
+
+

Removal of donation links: Please see GitHub Issue 21656 for why this has happened and how to help us with this.

+
+
+

Google Summer of Code 2026

+
+

We participated in Google Summer of Code 2026!

+
+
+ +
+
+
+

Security

+
+

A special thank you to the following people for reporting the security issues fixed in this release:

+
+
+ +
+
+
    +
  • +

    Reviewer: cards can no longer open dangerous links [GHSL-2026-085, GHSA-54q9-5c5p-9rxg]

    +
  • +
  • +

    Reviewer: cards require permission to launch apps [GHSL-2026-085, GHSA-54q9-5c5p-9rxg]

    +
    +
      +
    • +

      May be unblocked in advanced settings, if all your cards are trustworthy.

      +
    • +
    +
    +
  • +
  • +

    JavaScript API: blocked calls which could read and modify cards (other than the currently selected card) [GHSL-2026-084, GHSA-54q9-5c5p-9rxg]

    +
    +
      +
    • +

      May be unblocked in advanced settings, if all your cards are trustworthy.

      +
    • +
    +
    +
  • +
  • +

    Reviewer: fix path traversal when loading media [GHSL-2026-083, GHSA-qjjx-px4w-4986]

    +
  • +
  • +

    Import: sanitize filenames to block path traversal [GHSA-q29p-h3pp-mh3v]

    +
  • +
  • +

    Note Editor: reject untrusted files from the image picker [GHSA-cr2g-gf75-cm6r]

    +
  • +
+
+
+
+

AnkiDroid features

+
+
    +
  • +

    Design: All screens now support edge to edge (Android requirement)

    +
    +
      +
    • +

      This required extensive changes to all screens of the app. Please report any bugs.

      +
    • +
    +
    +
  • +
  • +

    Themes: E-ink theme & improved theme selection.

    +
  • +
  • +

    Card Browser: Find & Replace support.

    +
  • +
  • +

    Card Browser: Improved sort screen, with new columns to sort by.

    +
  • +
  • +

    TTS: Support all installed engines.

    +
  • +
  • +

    Analytics: Analytics are fixed. Analytics are opt-in only, and all opt-in flags have been reset.

    +
  • +
  • +

    Deck Picker: Better designed floating action button.

    +
  • +
  • +

    New Study Screen: Card templates can record audio.

    +
  • +
  • +

    Performance: Whiteboard and drawing now save 'webp' files.

    +
  • +
  • +

    Change note type: Huge UI improvements.

    +
  • +
+
+
+
+

Anki 26.05 features

+
+
    +
  • +

    New Cloze syntax: {{c1,2,3::text}} to hide text on cards 1, 2 and 3. (manual)

    +
  • +
  • +

    Reviewing: Card content determines RTL direction (dir="auto") (source)

    +
  • +
  • +

    Search: syntax for ignoring accents: tag:nc:.

    +
  • +
  • +

    Image Occlusion: improved RTL layout.

    +
  • +
  • +

    Image Occlusion: display text annotations during review.

    +
  • +
  • +

    CSV import: supplying a note-type column allows differing field counts.

    +
  • +
  • +

    Deck Options: UI improvements on smaller screens.

    +
  • +
  • +

    FSRS: faster calculations and better spacing of siblings.

    +
  • +
  • +

    FSRS: suspended cards are excluded from rescheduling.

    +
  • +
  • +

    Media: better handling of case-sensitive filenames.

    +
  • +
  • +

    See more in the Anki 26.05 changelog.

    +
  • +
+
+
+
+

Fixes and improvements

+
+
    +
  • +

    Google Play: 'Donate' links removed to comply with Play policies

    +
  • +
  • +

    Custom study: Fix 'due cards' not working when tag selection is skipped.

    +
  • +
  • +

    Deck Picker: A deck is selected when it is created.

    +
  • +
  • +

    Deck Picker: Better navigation via arrow keys.

    +
  • +
  • +

    Deck Picker: Improved 'Rename deck' dialog UX.

    +
  • +
  • +

    Deck Picker: Fix counts when totals above 9,999.

    +
  • +
  • +

    Shared Deck Download: Improved retry logic.

    +
  • +
  • +

    Card Browser: UX: better selection restore and RTL design.

    +
  • +
  • +

    Filtered Decks: UX Improvements.

    +
  • +
  • +

    Filtered Decks: Handle state restoration after process death.

    +
  • +
  • +

    Reviewer: Fix the shake gesture firing rapidly.

    +
  • +
  • +

    Previewer: Fixed background in night mode.

    +
  • +
  • +

    Study Options: Fix 'undo' opening the reviewer.

    +
  • +
  • +

    Deck Options: Improved progress reporting.

    +
  • +
  • +

    Note Editor: Fewer 'unsaved changes' prompts.

    +
  • +
  • +

    Card Template Editor: Better focus handling.

    +
  • +
  • +

    Set Due Date: Fixed crash when opening.

    +
  • +
  • +

    WebViews: Improved outdated WebView detection.

    +
  • +
  • +

    Deck Picker: Fixed "deck not found in limits map" error.

    +
  • +
  • +

    API: Fixed a crash in answerCard.

    +
  • +
  • +

    New Study Screen: better handling of custom scheduling and app restoration.

    +
  • +
  • +

    Widgets: UI improvements.

    +
  • +
  • +

    Note Editor: Fix out of memory crashes.

    +
  • +
  • +

    Accessibility: Improvements for Card Browser and Reviewer.

    +
  • +
+
+
+
+
+
+

Version 2.24.1 (20260831)

+
+
+

Urgent update to our 2.24.0 release: security updates, and temporarily removing donation links to +comply with Play Store policies (more below).

+
+
+

A special thank you to the following people for reporting the security issues fixed in this release:

+
+
+ +
+
+

Removal of donation links: Please see GitHub Issue 21656 for why this has happened and how +to help us with this.

+
+
+

Please see the 2.24.0 changelog below for the main 2.24 features announcement 👇

+
+
+
    +
  • +

    Security

    +
    +
      +
    • +

      Reviewer: cards can no longer open dangerous links [GHSL-2026-085, GHSA-54q9-5c5p-9rxg]

      +
    • +
    • +

      Reviewer: cards require permission to launch apps [GHSL-2026-085, GHSA-54q9-5c5p-9rxg]

      +
      +
        +
      • +

        May be unblocked in advanced settings, if all your cards are trustworthy.

        +
      • +
      +
      +
    • +
    • +

      JavaScript API: blocked calls which could read and modify cards (other than the currently selected card) [GHSL-2026-084, GHSA-54q9-5c5p-9rxg]

      +
      +
        +
      • +

        May be unblocked in advanced settings, if all your cards are trustworthy.

        +
      • +
      +
      +
    • +
    • +

      Reviewer: fix path traversal when loading media [GHSL-2026-083, GHSA-qjjx-px4w-4986]

      +
    • +
    • +

      Import: sanitize filenames to block path traversal [GHSA-q29p-h3pp-mh3v]

      +
    • +
    • +

      Note Editor: reject untrusted files from the image picker [GHSA-cr2g-gf75-cm6r]

      +
    • +
    +
    +
  • +
  • +

    Improvements

    +
    +
      +
    • +

      Privacy: removed a log entry which could hint at your timezone

      +
    • +
    • +

      Card Browser: better 'invalid search' messages

      +
    • +
    • +

      Google Play: 'Donate' links removed to comply with Play policies

      +
    • +
    +
    +
  • +
  • +

    Fixes

    +
    +
      +
    • +

      Deck Picker & Card Browser: Fix memory leaks

      +
    • +
    • +

      Fix crash when sharing an image to the Note Editor

      +
    • +
    • +

      Fix crash when exporting a large number of notes

      +
    • +
    • +

      Fix 'Auto Advance' not following the review queue

      +
    • +
    • +

      Improve error names in error messages

      +
    • +
    • +

      Whiteboard: fix flickering [Samsung/OnePlus]

      +
    • +
    • +

      Whiteboard: fix crash on rotation when 'type in the answer' is open

      +
    • +
    • +

      Note Editor: fix 'MathJax block' syntax

      +
    • +
    • +

      Note Types: only enable 'Save' when there are unsaved changes

      +
    • +
    • +

      Sync: fix conflict dialog only showing its title [Samsung-only]

      +
    • +
    • +

      Export: sharing text is now a text/plain file

      +
    • +
    • +

      Settings: fix crash when dragging reviewer actions and switching screens

      +
    • +
    • +

      Settings: include 'Themes' in search results

      +
    • +
    • +

      Reviewer: fix snackbar position when answer buttons are hidden

      +
    • +
    +
    +
  • +
+
+
+

Full list of 2.24.1 fixes

+
+
+

Version 2.24.0 (20260502)

@@ -520,6 +1119,9 @@

+ +
  • Sync: Added 'Network timeout' preference

  • @@ -1863,6 +2465,85 @@

    +

    Version 2.19.6 (20260831)

    +
    +
    +

    Urgent update to our 2.19.5 release: security updates, and temporarily removing donation links to +comply with Play Store policies (more below).

    +
    +
    +

    A special thank you to the following people for reporting the security issues fixed in this release:

    +
    +
    + +
    +
    +

    Removal of donation links: Please see GitHub Issue 21656 for why this has happened and how +to help us with this.

    +
    +
    +

    Please see the 2.19.1 changelog below for the main 2.19 features announcement 👇

    +
    +
    +
      +
    • +

      Security

      +
      +
        +
      • +

        Reviewer: cards can no longer open dangerous links [GHSL-2026-085, GHSA-54q9-5c5p-9rxg]

        +
      • +
      • +

        Reviewer: cards require permission to launch apps [GHSL-2026-085, GHSA-54q9-5c5p-9rxg]

        +
        +
          +
        • +

          May be unblocked in advanced settings, if all your cards are trustworthy.

          +
        • +
        +
        +
      • +
      • +

        JavaScript API: blocked calls which could read and modify cards (other than the currently selected card) [GHSL-2026-084, GHSA-54q9-5c5p-9rxg]

        +
        +
          +
        • +

          May be unblocked in advanced settings, if all your cards are trustworthy.

          +
        • +
        +
        +
      • +
      • +

        Reviewer: fix path traversal when loading media [GHSA-qjjx-px4w-4986]

        +
      • +
      • +

        Import: sanitize filenames to block path traversal [GHSA-q29p-h3pp-mh3v]

        +
      • +
      +
      +
    • +
    • +

      Improvements

      +
      +
        +
      • +

        Google Play: 'Donate' links removed to comply with Play policies

        +
      • +
      +
      +
    • +
    +
    +
    +

  • +

    Version 2.19.5 (20250711)

    @@ -2795,6 +3476,85 @@

    +

    Version 2.16.6 (20260831)

    +
    +
    +

    Urgent update to our 2.16.5 release: security updates, and temporarily removing donation links to +comply with Play Store policies (more below).

    +
    +
    +

    A special thank you to the following people for reporting the security issues fixed in this release:

    +
    +
    + +
    +
    +

    Removal of donation links: Please see GitHub Issue 21656 for why this has happened and how +to help us with this.

    +
    +
    +

    Please see the 2.16.2 changelog below for the main 2.16 features announcement 👇

    +
    +
    +
      +
    • +

      Security

      +
      +
        +
      • +

        Reviewer: cards can no longer open dangerous links [GHSL-2026-085, GHSA-54q9-5c5p-9rxg]

        +
      • +
      • +

        Reviewer: cards require permission to launch apps [GHSL-2026-085, GHSA-54q9-5c5p-9rxg]

        +
        +
          +
        • +

          May be unblocked in advanced settings, if all your cards are trustworthy.

          +
        • +
        +
        +
      • +
      • +

        JavaScript API: blocked calls which could read and modify cards (other than the currently selected card) [GHSL-2026-084, GHSA-54q9-5c5p-9rxg]

        +
        +
          +
        • +

          May be unblocked in advanced settings, if all your cards are trustworthy.

          +
        • +
        +
        +
      • +
      • +

        Reviewer: fix path traversal when loading media [GHSA-qjjx-px4w-4986]

        +
      • +
      • +

        Import: sanitize filenames to block path traversal [GHSA-q29p-h3pp-mh3v]

        +
      • +
      +
      +
    • +
    • +

      Improvements

      +
      +
        +
      • +

        Google Play: 'Donate' links removed to comply with Play policies

        +
      • +
      +
      +
    • +
    +
    +
    +

    +

    Version 2.16.5 (20230906)

    @@ -5833,8 +6593,8 @@

    <

    - \ No newline at end of file + diff --git a/AnkiDroid/src/main/assets/scripts/ankidroid-reviewer.js b/AnkiDroid/src/main/assets/scripts/ankidroid-reviewer.js index eb63d63752b0..8ea05157cb15 100644 --- a/AnkiDroid/src/main/assets/scripts/ankidroid-reviewer.js +++ b/AnkiDroid/src/main/assets/scripts/ankidroid-reviewer.js @@ -95,55 +95,107 @@ globalThis.ankidroid.onTypeAnswerKeyDown = function (event) { const SCHEME = "gesture"; const MULTI_TOUCH_TIMEOUT = 300; const GESTURE_TIMEOUT = 800; + const TOUCH_SLOP = 10; - let startX = 0, - startY = 0, - touchCount = 0, - touchStartTime = 0; + let maxTouchCount = 0, + touchStartTime = 0, + exceededSlop = false, + primaryStartX = 0, + primaryStartY = 0, + startTouches = new Map(); document.addEventListener( "touchstart", event => { - touchCount = event.touches.length; - startX = event.touches[0].pageX; - startY = event.touches[0].pageY; - // start counting from the first finger touch - if (touchCount === 1) { + if (event.touches.length > maxTouchCount) { + maxTouchCount = event.touches.length; + } + if (startTouches.size === 0) { touchStartTime = Date.now(); + exceededSlop = false; + const firstTouch = event.changedTouches[0] || event.touches[0]; + primaryStartX = firstTouch.pageX; + primaryStartY = firstTouch.pageY; + } + for (let i = 0; i < event.changedTouches.length; i++) { + const touch = event.changedTouches[i]; + startTouches.set(touch.identifier, { + x: touch.pageX, + y: touch.pageY, + }); + } + }, + { passive: true }, + ); + + document.addEventListener( + "touchmove", + event => { + if (exceededSlop) return; + for (let i = 0; i < event.changedTouches.length; i++) { + const touch = event.changedTouches[i]; + const start = startTouches.get(touch.identifier); + if (start) { + const dx = Math.abs(touch.pageX - start.x); + const dy = Math.abs(touch.pageY - start.y); + if (dx > TOUCH_SLOP || dy > TOUCH_SLOP) { + exceededSlop = true; + break; + } + } } }, { passive: true }, ); + document.addEventListener( + "touchcancel", + () => { + resetTouches(); + }, + { passive: true }, + ); + document.addEventListener( "touchend", event => { // Only process after the final finger is lifted - if ( - event.touches.length > 0 || - touchCount > 4 || - isTextSelected() || - isInteractable(event) - ) - return; + if (event.touches.length > 0) return; + + const touchCount = maxTouchCount; + const elapsed = Date.now() - touchStartTime; + const hadMovedPastSlop = exceededSlop; + + // Get primary touch start and end positions before resetting + const firstChangedTouch = event.changedTouches[0]; + const startX = primaryStartX; + const startY = primaryStartY; + const endX = firstChangedTouch ? firstChangedTouch.pageX : startX; + const endY = firstChangedTouch ? firstChangedTouch.pageY : startY; + + resetTouches(); + + if (touchCount > 4 || isTextSelected()) return; // Multi-finger detection if (touchCount > 1) { - if (Date.now() - touchStartTime > MULTI_TOUCH_TIMEOUT) { + if (elapsed > MULTI_TOUCH_TIMEOUT || hadMovedPastSlop) { return; } window.location.href = `${SCHEME}://multiFingerTap/?touchCount=${touchCount}`; return; } + if (isInteractable(event)) { + return; + } + // Ignore gesture if it takes too long - if (Date.now() - touchStartTime > GESTURE_TIMEOUT) { + if (elapsed > GESTURE_TIMEOUT) { return; } // Swipes and tap detection - const endX = event.changedTouches[0].pageX; - const endY = event.changedTouches[0].pageY; const scrollDirection = getScrollDirection(event.target); const params = new URLSearchParams({ x: Math.round(endX), @@ -160,6 +212,15 @@ globalThis.ankidroid.onTypeAnswerKeyDown = function (event) { { passive: true }, ); + function resetTouches() { + maxTouchCount = 0; + touchStartTime = 0; + exceededSlop = false; + primaryStartX = 0; + primaryStartY = 0; + startTouches.clear(); + } + /** * Checks if the target element or its parents are interactive. * @param {TouchEvent} event diff --git a/AnkiDroid/src/main/generated/baselineProfiles/baseline-prof.txt b/AnkiDroid/src/main/generated/baselineProfiles/baseline-prof.txt index c2f91e9b2f03..bc729502fdaf 100644 --- a/AnkiDroid/src/main/generated/baselineProfiles/baseline-prof.txt +++ b/AnkiDroid/src/main/generated/baselineProfiles/baseline-prof.txt @@ -1,22 +1,9 @@ -La/f; -SPLa/f;->()V -SPLa/f;->(La/g;Landroidx/fragment/app/Fragment;)V -SPLa/f;->onFragmentViewDestroyed(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V -La/g; -SPLa/g;->(Lkotlin/jvm/functions/Function1;)V -SPLa/g;->clear()V -SPLa/g;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; -La/l; -SPLa/l;->(Lkotlin/jvm/functions/Function1;)V +Landroid/net/ssl/InvalidEchDataException; Landroid/support/customtabs/ICustomTabsCallback; SPLandroid/support/customtabs/ICustomTabsCallback;->()V Landroid/support/customtabs/ICustomTabsCallback$Stub; SPLandroid/support/customtabs/ICustomTabsCallback$Stub;->()V SPLandroid/support/customtabs/ICustomTabsCallback$Stub;->asBinder()Landroid/os/IBinder; -SPLandroid/support/customtabs/ICustomTabsCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z -Landroid/support/customtabs/ICustomTabsCallback$_Parcel; -SPLandroid/support/customtabs/ICustomTabsCallback$_Parcel;->access$000(Landroid/os/Parcel;Landroid/os/Parcelable$Creator;)Ljava/lang/Object; -SPLandroid/support/customtabs/ICustomTabsCallback$_Parcel;->readTypedObject(Landroid/os/Parcel;Landroid/os/Parcelable$Creator;)Ljava/lang/Object; Landroid/support/customtabs/ICustomTabsService; SPLandroid/support/customtabs/ICustomTabsService;->()V Landroid/support/customtabs/ICustomTabsService$Stub; @@ -29,31 +16,16 @@ Landroidx/activity/ActivityFlags; SPLandroidx/activity/ActivityFlags;->()V SPLandroidx/activity/ActivityFlags;->()V Landroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0; -SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m$1()V -SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/content/pm/ShortcutInfo$Builder;Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder; SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/Insets;)I +SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/Window;Z)V SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/graphics/Insets;)I SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/graphics/Insets;)I SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;)Landroid/window/OnBackInvokedDispatcher; -SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/Context;Ljava/lang/String;)Landroid/content/pm/ShortcutInfo$Builder; -SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;)Landroid/content/pm/ShortcutInfo; -SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;I)Landroid/content/pm/ShortcutInfo$Builder; -SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;Landroid/graphics/drawable/Icon;)Landroid/content/pm/ShortcutInfo$Builder; -SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder; -SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;Z)Landroid/content/pm/ShortcutInfo$Builder; -SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;[Landroid/content/Intent;)Landroid/content/pm/ShortcutInfo$Builder; SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Insets;)I +SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowManager$LayoutParams;I)V SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/window/OnBackInvokedDispatcher;ILandroid/window/OnBackInvokedCallback;)V -SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/window/OnBackInvokedCallback; Landroidx/activity/ComponentActivity; -SPLandroidx/activity/ComponentActivity;->$r8$lambda$54BeH8ZsB-ru0CXI2CCSP2syNys(Landroidx/activity/ComponentActivity;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V -SPLandroidx/activity/ComponentActivity;->$r8$lambda$7aWCLmlNPTirEoC8eOYg0rEvmus(Landroidx/activity/ComponentActivity;)Landroidx/activity/OnBackPressedDispatcher; -SPLandroidx/activity/ComponentActivity;->$r8$lambda$G6Thfp3wAqF9QgDIJrKyBT1uzss(Landroidx/activity/ComponentActivity;)Landroidx/lifecycle/SavedStateViewModelFactory; -SPLandroidx/activity/ComponentActivity;->$r8$lambda$XCwb6u5X87zpWrZW4Zmu6tsKQC8(Landroidx/activity/OnBackPressedDispatcher;Landroidx/activity/ComponentActivity;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V -SPLandroidx/activity/ComponentActivity;->$r8$lambda$cI7dwLT0wnPzJ9a3oRpjgUF1USM(Landroidx/activity/ComponentActivity;)V -SPLandroidx/activity/ComponentActivity;->$r8$lambda$h6vvr6zUWA2U1fE-0KsKpOgpr28(Landroidx/activity/ComponentActivity;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V -SPLandroidx/activity/ComponentActivity;->$r8$lambda$yPQlaAoRiY-RJ3IY_TqzUUTrVH0(Landroidx/activity/ComponentActivity;Landroid/content/Context;)V SPLandroidx/activity/ComponentActivity;->()V SPLandroidx/activity/ComponentActivity;->()V SPLandroidx/activity/ComponentActivity;->(I)V @@ -139,6 +111,25 @@ SPLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorImpl;->(Lan SPLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorImpl;->activityDestroyed()V Landroidx/activity/ComponentActivity$activityResultRegistry$1; SPLandroidx/activity/ComponentActivity$activityResultRegistry$1;->(Landroidx/activity/ComponentActivity;)V +Landroidx/activity/EdgeToEdge; +SPLandroidx/activity/EdgeToEdge;->()V +SPLandroidx/activity/EdgeToEdge;->enable$default(Landroidx/activity/ComponentActivity;Landroidx/activity/SystemBarStyle;Landroidx/activity/SystemBarStyle;ILjava/lang/Object;)V +SPLandroidx/activity/EdgeToEdge;->enable(Landroidx/activity/ComponentActivity;Landroidx/activity/SystemBarStyle;Landroidx/activity/SystemBarStyle;)V +Landroidx/activity/EdgeToEdgeApi26; +SPLandroidx/activity/EdgeToEdgeApi26;->()V +Landroidx/activity/EdgeToEdgeApi28; +SPLandroidx/activity/EdgeToEdgeApi28;->()V +Landroidx/activity/EdgeToEdgeApi29; +SPLandroidx/activity/EdgeToEdgeApi29;->()V +Landroidx/activity/EdgeToEdgeApi30; +SPLandroidx/activity/EdgeToEdgeApi30;->()V +SPLandroidx/activity/EdgeToEdgeApi30;->adjustLayoutInDisplayCutoutMode(Landroid/view/Window;)V +Landroidx/activity/EdgeToEdgeApi35; +SPLandroidx/activity/EdgeToEdgeApi35;->()V +SPLandroidx/activity/EdgeToEdgeApi35;->setUp(Landroidx/activity/SystemBarStyle;Landroidx/activity/SystemBarStyle;Landroid/view/Window;Landroid/view/View;ZZ)V +Landroidx/activity/EdgeToEdgeBase; +SPLandroidx/activity/EdgeToEdgeBase;->()V +Landroidx/activity/EdgeToEdgeImpl; Landroidx/activity/FullyDrawnReporterOwner; Landroidx/activity/OnBackPressedCallback; SPLandroidx/activity/OnBackPressedCallback;->(Z)V @@ -154,7 +145,6 @@ SPLandroidx/activity/OnBackPressedCallback$OnBackPressedEventHandler;->setLifecy Landroidx/activity/OnBackPressedCallbackInfo; SPLandroidx/activity/OnBackPressedCallbackInfo;->(Landroidx/activity/OnBackPressedCallback;Landroidx/lifecycle/LifecycleOwner;)V Landroidx/activity/OnBackPressedDispatcher; -SPLandroidx/activity/OnBackPressedDispatcher;->$r8$lambda$Ce6hmwzpZeR4nJ6cSxwnPFSCXfY(Landroidx/activity/OnBackPressedDispatcher;)Landroidx/activity/OnBackPressedDispatcher$OnBackPressedEventInput; SPLandroidx/activity/OnBackPressedDispatcher;->(Ljava/lang/Runnable;)V SPLandroidx/activity/OnBackPressedDispatcher;->(Ljava/lang/Runnable;Landroidx/core/util/Consumer;)V SPLandroidx/activity/OnBackPressedDispatcher;->access$getOnHasEnabledCallbacksChanged$p(Landroidx/activity/OnBackPressedDispatcher;)Landroidx/core/util/Consumer; @@ -179,6 +169,27 @@ SPLandroidx/activity/OnBackPressedDispatcher$addCallback$lifecycleObserver$1;->c SPLandroidx/activity/OnBackPressedDispatcher$addCallback$lifecycleObserver$1;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V Landroidx/activity/OnBackPressedDispatcherOwner; Landroidx/activity/R$id; +Landroidx/activity/SystemBarStyle; +SPLandroidx/activity/SystemBarStyle;->()V +SPLandroidx/activity/SystemBarStyle;->(IIILkotlin/jvm/functions/Function1;)V +SPLandroidx/activity/SystemBarStyle;->(IIILkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/activity/SystemBarStyle;->getDetectDarkMode$activity()Lkotlin/jvm/functions/Function1; +SPLandroidx/activity/SystemBarStyle;->getNightMode$activity()I +SPLandroidx/activity/SystemBarStyle;->getScrimWithEnforcedContrast$activity(Z)I +Landroidx/activity/SystemBarStyle$Companion; +SPLandroidx/activity/SystemBarStyle$Companion;->()V +SPLandroidx/activity/SystemBarStyle$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/activity/SystemBarStyle$Companion;->auto$default(Landroidx/activity/SystemBarStyle$Companion;IILkotlin/jvm/functions/Function1;ILjava/lang/Object;)Landroidx/activity/SystemBarStyle; +SPLandroidx/activity/SystemBarStyle$Companion;->auto$lambda$0(Landroid/content/res/Resources;)Z +SPLandroidx/activity/SystemBarStyle$Companion;->auto(IILkotlin/jvm/functions/Function1;)Landroidx/activity/SystemBarStyle; +SPLandroidx/activity/SystemBarStyle$Companion;->dark$lambda$0(Landroid/content/res/Resources;)Z +SPLandroidx/activity/SystemBarStyle$Companion;->dark(I)Landroidx/activity/SystemBarStyle; +Landroidx/activity/SystemBarStyle$Companion$$ExternalSyntheticLambda1; +SPLandroidx/activity/SystemBarStyle$Companion$$ExternalSyntheticLambda1;->()V +SPLandroidx/activity/SystemBarStyle$Companion$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/activity/SystemBarStyle$Companion$$ExternalSyntheticLambda2; +SPLandroidx/activity/SystemBarStyle$Companion$$ExternalSyntheticLambda2;->()V +SPLandroidx/activity/SystemBarStyle$Companion$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/activity/ViewTreeFullyDrawnReporterOwner; SPLandroidx/activity/ViewTreeFullyDrawnReporterOwner;->set(Landroid/view/View;Landroidx/activity/FullyDrawnReporterOwner;)V Landroidx/activity/ViewTreeOnBackPressedDispatcherOwner; @@ -196,8 +207,6 @@ Landroidx/activity/result/ActivityResultCaller; Landroidx/activity/result/ActivityResultLauncher; SPLandroidx/activity/result/ActivityResultLauncher;->()V Landroidx/activity/result/ActivityResultRegistry; -SPLandroidx/activity/result/ActivityResultRegistry;->$r8$lambda$-f_tNvtP3uEenATo3uzHmjDoXwg()Ljava/lang/Integer; -SPLandroidx/activity/result/ActivityResultRegistry;->$r8$lambda$TWvtyPFk-iHdx0R-btWVLevVLT0(Landroidx/activity/result/ActivityResultRegistry;Ljava/lang/String;Landroidx/activity/result/ActivityResultCallback;Landroidx/activity/result/contract/ActivityResultContract;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V SPLandroidx/activity/result/ActivityResultRegistry;->()V SPLandroidx/activity/result/ActivityResultRegistry;->()V SPLandroidx/activity/result/ActivityResultRegistry;->bindRcKey(ILjava/lang/String;)V @@ -320,6 +329,7 @@ SPLandroidx/appcompat/app/AppCompatDelegate$$ExternalSyntheticLambda0;->run()V Landroidx/appcompat/app/AppCompatDelegate$Api24Impl; SPLandroidx/appcompat/app/AppCompatDelegate$Api24Impl;->localeListForLanguageTags(Ljava/lang/String;)Landroid/os/LocaleList; Landroidx/appcompat/app/AppCompatDelegate$Api33Impl; +SPLandroidx/appcompat/app/AppCompatDelegate$Api33Impl;->localeManagerGetApplicationLocales(Ljava/lang/Object;)Landroid/os/LocaleList; SPLandroidx/appcompat/app/AppCompatDelegate$Api33Impl;->localeManagerSetApplicationLocales(Ljava/lang/Object;Landroid/os/LocaleList;)V Landroidx/appcompat/app/AppCompatDelegate$SerialExecutor; SPLandroidx/appcompat/app/AppCompatDelegate$SerialExecutor;->(Ljava/util/concurrent/Executor;)V @@ -356,6 +366,7 @@ SPLandroidx/appcompat/app/AppCompatDelegateImpl;->findViewById(I)Landroid/view/V SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getActionBarThemedContext()Landroid/content/Context; SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getActivityHandlesConfigChangesFlags(Landroid/content/Context;)I SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getConfigurationLocales(Landroid/content/res/Configuration;)Landroidx/core/os/LocaleListCompat; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getContextForDelegate()Landroid/content/Context; SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getDrawerToggleDelegate()Landroidx/appcompat/app/ActionBarDrawerToggle$Delegate; SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getMenuInflater()Landroid/view/MenuInflater; SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getPanelState(IZ)Landroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState; @@ -385,19 +396,19 @@ SPLandroidx/appcompat/app/AppCompatDelegateImpl;->setTheme(I)V SPLandroidx/appcompat/app/AppCompatDelegateImpl;->setTitle(Ljava/lang/CharSequence;)V SPLandroidx/appcompat/app/AppCompatDelegateImpl;->shouldRegisterBackInvokedCallback()Z SPLandroidx/appcompat/app/AppCompatDelegateImpl;->throwFeatureRequestIfSubDecorInstalled()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->updateActionModeInsets(Landroidx/core/view/WindowInsetsCompat;Landroid/graphics/Rect;)I SPLandroidx/appcompat/app/AppCompatDelegateImpl;->updateAppConfiguration(ILandroidx/core/os/LocaleListCompat;Z)Z SPLandroidx/appcompat/app/AppCompatDelegateImpl;->updateBackInvokedCallbackState()V -SPLandroidx/appcompat/app/AppCompatDelegateImpl;->updateStatusGuard(Landroidx/core/view/WindowInsetsCompat;Landroid/graphics/Rect;)I +Landroidx/appcompat/app/AppCompatDelegateImpl$1; +SPLandroidx/appcompat/app/AppCompatDelegateImpl$1;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl$1;->run()V Landroidx/appcompat/app/AppCompatDelegateImpl$2; SPLandroidx/appcompat/app/AppCompatDelegateImpl$2;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V -SPLandroidx/appcompat/app/AppCompatDelegateImpl$2;->run()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl$2;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; Landroidx/appcompat/app/AppCompatDelegateImpl$3; SPLandroidx/appcompat/app/AppCompatDelegateImpl$3;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V -SPLandroidx/appcompat/app/AppCompatDelegateImpl$3;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; -Landroidx/appcompat/app/AppCompatDelegateImpl$5; -SPLandroidx/appcompat/app/AppCompatDelegateImpl$5;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V -SPLandroidx/appcompat/app/AppCompatDelegateImpl$5;->onAttachedFromWindow()V -SPLandroidx/appcompat/app/AppCompatDelegateImpl$5;->onDetachedFromWindow()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl$3;->onAttachedFromWindow()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl$3;->onDetachedFromWindow()V Landroidx/appcompat/app/AppCompatDelegateImpl$ActionBarDrawableToggleImpl; SPLandroidx/appcompat/app/AppCompatDelegateImpl$ActionBarDrawableToggleImpl;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V SPLandroidx/appcompat/app/AppCompatDelegateImpl$ActionBarDrawableToggleImpl;->getActionBarThemedContext()Landroid/content/Context; @@ -424,6 +435,7 @@ SPLandroidx/appcompat/app/AppCompatViewInflater;->()V SPLandroidx/appcompat/app/AppCompatViewInflater;->backportAccessibilityAttributes(Landroid/content/Context;Landroid/view/View;Landroid/util/AttributeSet;)V SPLandroidx/appcompat/app/AppCompatViewInflater;->checkOnClickListener(Landroid/view/View;Landroid/util/AttributeSet;)V SPLandroidx/appcompat/app/AppCompatViewInflater;->createCheckedTextView(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatCheckedTextView; +SPLandroidx/appcompat/app/AppCompatViewInflater;->createImageButton(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatImageButton; SPLandroidx/appcompat/app/AppCompatViewInflater;->createImageView(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatImageView; SPLandroidx/appcompat/app/AppCompatViewInflater;->createSpinner(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatSpinner; SPLandroidx/appcompat/app/AppCompatViewInflater;->createView(Landroid/content/Context;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View; @@ -495,6 +507,7 @@ SPLandroidx/appcompat/view/ContextThemeWrapper;->getResources()Landroid/content/ SPLandroidx/appcompat/view/ContextThemeWrapper;->getResourcesInternal()Landroid/content/res/Resources; SPLandroidx/appcompat/view/ContextThemeWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; SPLandroidx/appcompat/view/ContextThemeWrapper;->getTheme()Landroid/content/res/Resources$Theme; +SPLandroidx/appcompat/view/ContextThemeWrapper;->getThemeResId()I SPLandroidx/appcompat/view/ContextThemeWrapper;->initializeTheme()V SPLandroidx/appcompat/view/ContextThemeWrapper;->isEmptyConfiguration(Landroid/content/res/Configuration;)Z SPLandroidx/appcompat/view/ContextThemeWrapper;->onApplyThemeResource(Landroid/content/res/Resources$Theme;IZ)V @@ -550,6 +563,7 @@ SPLandroidx/appcompat/view/menu/MenuBuilder;->findItem(I)Landroid/view/MenuItem; SPLandroidx/appcompat/view/menu/MenuBuilder;->flagActionItems()V SPLandroidx/appcompat/view/menu/MenuBuilder;->getActionItems()Ljava/util/ArrayList; SPLandroidx/appcompat/view/menu/MenuBuilder;->getContext()Landroid/content/Context; +SPLandroidx/appcompat/view/menu/MenuBuilder;->getItem(I)Landroid/view/MenuItem; SPLandroidx/appcompat/view/menu/MenuBuilder;->getNonActionItems()Ljava/util/ArrayList; SPLandroidx/appcompat/view/menu/MenuBuilder;->getOrdering(I)I SPLandroidx/appcompat/view/menu/MenuBuilder;->getResources()Landroid/content/res/Resources; @@ -676,14 +690,16 @@ SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->(Landroid/view/Vi SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->applySupportBackgroundTint()V SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->onSetBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V -SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->onSetBackgroundResource(I)V SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setInternalBackgroundTint(Landroid/content/res/ColorStateList;)V SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->shouldApplyFrameworkTintUsingColorFilter()Z Landroidx/appcompat/widget/AppCompatButton; SPLandroidx/appcompat/widget/AppCompatButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatButton;->access$001(Landroidx/appcompat/widget/AppCompatButton;Landroid/graphics/Typeface;)V SPLandroidx/appcompat/widget/AppCompatButton;->drawableStateChanged()V SPLandroidx/appcompat/widget/AppCompatButton;->getEmojiTextViewHelper()Landroidx/appcompat/widget/AppCompatEmojiTextHelper; +SPLandroidx/appcompat/widget/AppCompatButton;->getFontVariationSettingsManager()Landroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager; +SPLandroidx/appcompat/widget/AppCompatButton;->lambda$getFontVariationSettingsManager$0$androidx-appcompat-widget-AppCompatButton(Landroid/graphics/Typeface;)V SPLandroidx/appcompat/widget/AppCompatButton;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V SPLandroidx/appcompat/widget/AppCompatButton;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V SPLandroidx/appcompat/widget/AppCompatButton;->onLayout(ZIIII)V @@ -692,6 +708,10 @@ SPLandroidx/appcompat/widget/AppCompatButton;->setAllCaps(Z)V SPLandroidx/appcompat/widget/AppCompatButton;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V SPLandroidx/appcompat/widget/AppCompatButton;->setFilters([Landroid/text/InputFilter;)V SPLandroidx/appcompat/widget/AppCompatButton;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V +SPLandroidx/appcompat/widget/AppCompatButton;->setTypeface(Landroid/graphics/Typeface;)V +Landroidx/appcompat/widget/AppCompatButton$$ExternalSyntheticLambda0; +SPLandroidx/appcompat/widget/AppCompatButton$$ExternalSyntheticLambda0;->(Landroidx/appcompat/widget/AppCompatButton;)V +SPLandroidx/appcompat/widget/AppCompatButton$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V Landroidx/appcompat/widget/AppCompatCheckedTextView; SPLandroidx/appcompat/widget/AppCompatCheckedTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V SPLandroidx/appcompat/widget/AppCompatCheckedTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V @@ -706,9 +726,9 @@ SPLandroidx/appcompat/widget/AppCompatCheckedTextViewHelper;->(Landroid/wi SPLandroidx/appcompat/widget/AppCompatCheckedTextViewHelper;->applyCheckMarkTint()V SPLandroidx/appcompat/widget/AppCompatCheckedTextViewHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V Landroidx/appcompat/widget/AppCompatDrawableManager; +SPLandroidx/appcompat/widget/AppCompatDrawableManager;->-$$Nest$sfgetDEFAULT_MODE()Landroid/graphics/PorterDuff$Mode; SPLandroidx/appcompat/widget/AppCompatDrawableManager;->()V SPLandroidx/appcompat/widget/AppCompatDrawableManager;->()V -SPLandroidx/appcompat/widget/AppCompatDrawableManager;->access$000()Landroid/graphics/PorterDuff$Mode; SPLandroidx/appcompat/widget/AppCompatDrawableManager;->get()Landroidx/appcompat/widget/AppCompatDrawableManager; SPLandroidx/appcompat/widget/AppCompatDrawableManager;->getDrawable(Landroid/content/Context;IZ)Landroid/graphics/drawable/Drawable; SPLandroidx/appcompat/widget/AppCompatDrawableManager;->getTintList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; @@ -748,7 +768,6 @@ SPLandroidx/appcompat/widget/AppCompatImageHelper;->applySupportImageTint()V SPLandroidx/appcompat/widget/AppCompatImageHelper;->hasOverlappingRendering()Z SPLandroidx/appcompat/widget/AppCompatImageHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V SPLandroidx/appcompat/widget/AppCompatImageHelper;->obtainLevelFromDrawable(Landroid/graphics/drawable/Drawable;)V -SPLandroidx/appcompat/widget/AppCompatImageHelper;->setImageResource(I)V SPLandroidx/appcompat/widget/AppCompatImageHelper;->shouldApplyFrameworkTintUsingColorFilter()Z Landroidx/appcompat/widget/AppCompatImageView; SPLandroidx/appcompat/widget/AppCompatImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V @@ -756,10 +775,8 @@ SPLandroidx/appcompat/widget/AppCompatImageView;->(Landroid/content/Contex SPLandroidx/appcompat/widget/AppCompatImageView;->drawableStateChanged()V SPLandroidx/appcompat/widget/AppCompatImageView;->hasOverlappingRendering()Z SPLandroidx/appcompat/widget/AppCompatImageView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V -SPLandroidx/appcompat/widget/AppCompatImageView;->setBackgroundResource(I)V SPLandroidx/appcompat/widget/AppCompatImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V Landroidx/appcompat/widget/AppCompatPopupWindow; -SPLandroidx/appcompat/widget/AppCompatPopupWindow;->()V SPLandroidx/appcompat/widget/AppCompatPopupWindow;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V SPLandroidx/appcompat/widget/AppCompatPopupWindow;->init(Landroid/content/Context;Landroid/util/AttributeSet;II)V Landroidx/appcompat/widget/AppCompatSpinner; @@ -783,24 +800,35 @@ SPLandroidx/appcompat/widget/AppCompatTextClassifierHelper;->(Landroid/wid Landroidx/appcompat/widget/AppCompatTextHelper; SPLandroidx/appcompat/widget/AppCompatTextHelper;->(Landroid/widget/TextView;)V SPLandroidx/appcompat/widget/AppCompatTextHelper;->applyCompoundDrawablesTints()V +SPLandroidx/appcompat/widget/AppCompatTextHelper;->applyFontAndVariationSettings(Z)V SPLandroidx/appcompat/widget/AppCompatTextHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatTextHelper;->makeFontCallback(II)Landroidx/core/content/res/ResourcesCompat$FontCallback; SPLandroidx/appcompat/widget/AppCompatTextHelper;->onLayout(ZIIII)V SPLandroidx/appcompat/widget/AppCompatTextHelper;->onSetCompoundDrawables()V SPLandroidx/appcompat/widget/AppCompatTextHelper;->onSetTextAppearance(Landroid/content/Context;I)V SPLandroidx/appcompat/widget/AppCompatTextHelper;->setAllCaps(Z)V SPLandroidx/appcompat/widget/AppCompatTextHelper;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V -SPLandroidx/appcompat/widget/AppCompatTextHelper;->updateTypefaceAndStyle(Landroid/content/Context;Landroidx/appcompat/widget/TintTypedArray;)V +SPLandroidx/appcompat/widget/AppCompatTextHelper;->updateTypefaceAndStyle(Landroid/content/Context;Landroidx/appcompat/widget/TintTypedArray;)Z Landroidx/appcompat/widget/AppCompatTextHelper$1; SPLandroidx/appcompat/widget/AppCompatTextHelper$1;->(Landroidx/appcompat/widget/AppCompatTextHelper;IILjava/lang/ref/WeakReference;)V SPLandroidx/appcompat/widget/AppCompatTextHelper$1;->onFontRetrievalFailed(I)V +Landroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager; +SPLandroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager;->(Landroid/widget/TextView;Landroidx/core/util/Consumer;)V +SPLandroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager;->getTypeface()Landroid/graphics/Typeface; +SPLandroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager;->setTypeface(Landroid/graphics/Typeface;)V +SPLandroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager;->setTypefaceInternal(Landroid/graphics/Typeface;)V Landroidx/appcompat/widget/AppCompatTextView; SPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;)V SPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V SPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatTextView;->access$1301(Landroidx/appcompat/widget/AppCompatTextView;Landroid/graphics/Typeface;)V SPLandroidx/appcompat/widget/AppCompatTextView;->consumeTextFutureAndSetBlocking()V SPLandroidx/appcompat/widget/AppCompatTextView;->drawableStateChanged()V SPLandroidx/appcompat/widget/AppCompatTextView;->getEmojiTextViewHelper()Landroidx/appcompat/widget/AppCompatEmojiTextHelper; +SPLandroidx/appcompat/widget/AppCompatTextView;->getFontVariationSettingsManager()Landroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager; SPLandroidx/appcompat/widget/AppCompatTextView;->getText()Ljava/lang/CharSequence; +SPLandroidx/appcompat/widget/AppCompatTextView;->getTypeface()Landroid/graphics/Typeface; +SPLandroidx/appcompat/widget/AppCompatTextView;->lambda$getFontVariationSettingsManager$0$androidx-appcompat-widget-AppCompatTextView(Landroid/graphics/Typeface;)V SPLandroidx/appcompat/widget/AppCompatTextView;->onDetachedFromWindow()V SPLandroidx/appcompat/widget/AppCompatTextView;->onLayout(ZIIII)V SPLandroidx/appcompat/widget/AppCompatTextView;->onMeasure(II)V @@ -810,8 +838,15 @@ SPLandroidx/appcompat/widget/AppCompatTextView;->setBackgroundDrawable(Landroid/ SPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V SPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V SPLandroidx/appcompat/widget/AppCompatTextView;->setFilters([Landroid/text/InputFilter;)V +SPLandroidx/appcompat/widget/AppCompatTextView;->setLineHeight(I)V SPLandroidx/appcompat/widget/AppCompatTextView;->setTextAppearance(Landroid/content/Context;I)V +SPLandroidx/appcompat/widget/AppCompatTextView;->setTextSize(IF)V +SPLandroidx/appcompat/widget/AppCompatTextView;->setTypeface(Landroid/graphics/Typeface;)V SPLandroidx/appcompat/widget/AppCompatTextView;->setTypeface(Landroid/graphics/Typeface;I)V +Landroidx/appcompat/widget/AppCompatTextView$$ExternalSyntheticLambda0; +SPLandroidx/appcompat/widget/AppCompatTextView$$ExternalSyntheticLambda0;->(Landroidx/appcompat/widget/AppCompatTextView;)V +SPLandroidx/appcompat/widget/AppCompatTextView$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V +Landroidx/appcompat/widget/AppCompatTextView$SuperCaller; Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper; SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->()V SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->(Landroid/widget/TextView;)V @@ -820,8 +855,6 @@ SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->loadFromAttribute SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->supportsAutoSizeText()Z Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl; SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl;->()V -Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl23; -SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl23;->()V Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl29; SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl29;->()V Landroidx/appcompat/widget/ContentFrameLayout; @@ -917,7 +950,6 @@ SPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->gener SPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->get(ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuffColorFilter; SPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->put(ILandroid/graphics/PorterDuff$Mode;Landroid/graphics/PorterDuffColorFilter;)Landroid/graphics/PorterDuffColorFilter; Landroidx/appcompat/widget/ResourceManagerInternal$ResourceManagerHooks; -Landroidx/appcompat/widget/ResourcesWrapper; Landroidx/appcompat/widget/RtlSpacingHelper; SPLandroidx/appcompat/widget/RtlSpacingHelper;->()V SPLandroidx/appcompat/widget/RtlSpacingHelper;->getEnd()I @@ -964,6 +996,7 @@ SPLandroidx/appcompat/widget/SearchView$8;->(Landroidx/appcompat/widget/Se Landroidx/appcompat/widget/SearchView$9; SPLandroidx/appcompat/widget/SearchView$9;->(Landroidx/appcompat/widget/SearchView;)V Landroidx/appcompat/widget/SearchView$OnQueryTextListener; +Landroidx/appcompat/widget/SearchView$PreQAutoCompleteTextViewReflector; Landroidx/appcompat/widget/SearchView$SearchAutoComplete; SPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->(Landroid/content/Context;Landroid/util/AttributeSet;)V SPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V @@ -976,16 +1009,13 @@ SPLandroidx/appcompat/widget/SearchView$SearchAutoComplete$1;->(Landroidx/ Landroidx/appcompat/widget/ThemeUtils; SPLandroidx/appcompat/widget/ThemeUtils;->()V SPLandroidx/appcompat/widget/ThemeUtils;->checkAppCompatTheme(Landroid/view/View;Landroid/content/Context;)V -Landroidx/appcompat/widget/TintContextWrapper; -SPLandroidx/appcompat/widget/TintContextWrapper;->()V -SPLandroidx/appcompat/widget/TintContextWrapper;->shouldWrap(Landroid/content/Context;)Z -SPLandroidx/appcompat/widget/TintContextWrapper;->wrap(Landroid/content/Context;)Landroid/content/Context; +SPLandroidx/appcompat/widget/ThemeUtils;->getThemeAttrColor(Landroid/content/Context;I)I Landroidx/appcompat/widget/TintInfo; SPLandroidx/appcompat/widget/TintInfo;->()V -Landroidx/appcompat/widget/TintResources; Landroidx/appcompat/widget/TintTypedArray; SPLandroidx/appcompat/widget/TintTypedArray;->(Landroid/content/Context;Landroid/content/res/TypedArray;)V SPLandroidx/appcompat/widget/TintTypedArray;->getBoolean(IZ)Z +SPLandroidx/appcompat/widget/TintTypedArray;->getColor(II)I SPLandroidx/appcompat/widget/TintTypedArray;->getColorStateList(I)Landroid/content/res/ColorStateList; SPLandroidx/appcompat/widget/TintTypedArray;->getDimensionPixelOffset(II)I SPLandroidx/appcompat/widget/TintTypedArray;->getDimensionPixelSize(II)I @@ -1104,10 +1134,6 @@ Landroidx/appcompat/widget/TooltipCompat; SPLandroidx/appcompat/widget/TooltipCompat;->setTooltipText(Landroid/view/View;Ljava/lang/CharSequence;)V Landroidx/appcompat/widget/TooltipCompat$Api26Impl; SPLandroidx/appcompat/widget/TooltipCompat$Api26Impl;->setTooltipText(Landroid/view/View;Ljava/lang/CharSequence;)V -Landroidx/appcompat/widget/VectorEnabledTintResources; -SPLandroidx/appcompat/widget/VectorEnabledTintResources;->()V -SPLandroidx/appcompat/widget/VectorEnabledTintResources;->isCompatVectorFromResourcesEnabled()Z -SPLandroidx/appcompat/widget/VectorEnabledTintResources;->shouldBeUsed()Z Landroidx/appcompat/widget/ViewStubCompat; SPLandroidx/appcompat/widget/ViewStubCompat;->(Landroid/content/Context;Landroid/util/AttributeSet;)V SPLandroidx/appcompat/widget/ViewStubCompat;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V @@ -1137,47 +1163,20 @@ Landroidx/arch/core/executor/DefaultTaskExecutor$Api28Impl; SPLandroidx/arch/core/executor/DefaultTaskExecutor$Api28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; Landroidx/arch/core/executor/TaskExecutor; SPLandroidx/arch/core/executor/TaskExecutor;->()V -Landroidx/arch/core/internal/FastSafeIterableMap; -SPLandroidx/arch/core/internal/FastSafeIterableMap;->()V -SPLandroidx/arch/core/internal/FastSafeIterableMap;->ceil(Ljava/lang/Object;)Ljava/util/Map$Entry; -SPLandroidx/arch/core/internal/FastSafeIterableMap;->contains(Ljava/lang/Object;)Z -SPLandroidx/arch/core/internal/FastSafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; -SPLandroidx/arch/core/internal/FastSafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -SPLandroidx/arch/core/internal/FastSafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/arch/core/internal/SafeIterableMap; SPLandroidx/arch/core/internal/SafeIterableMap;->()V -SPLandroidx/arch/core/internal/SafeIterableMap;->descendingIterator()Ljava/util/Iterator; -SPLandroidx/arch/core/internal/SafeIterableMap;->eldest()Ljava/util/Map$Entry; SPLandroidx/arch/core/internal/SafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; SPLandroidx/arch/core/internal/SafeIterableMap;->iteratorWithAdditions()Landroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions; -SPLandroidx/arch/core/internal/SafeIterableMap;->newest()Ljava/util/Map$Entry; SPLandroidx/arch/core/internal/SafeIterableMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; SPLandroidx/arch/core/internal/SafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -SPLandroidx/arch/core/internal/SafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; -SPLandroidx/arch/core/internal/SafeIterableMap;->size()I -Landroidx/arch/core/internal/SafeIterableMap$DescendingIterator; -SPLandroidx/arch/core/internal/SafeIterableMap$DescendingIterator;->(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;)V -SPLandroidx/arch/core/internal/SafeIterableMap$DescendingIterator;->backward(Landroidx/arch/core/internal/SafeIterableMap$Entry;)Landroidx/arch/core/internal/SafeIterableMap$Entry; -SPLandroidx/arch/core/internal/SafeIterableMap$DescendingIterator;->forward(Landroidx/arch/core/internal/SafeIterableMap$Entry;)Landroidx/arch/core/internal/SafeIterableMap$Entry; Landroidx/arch/core/internal/SafeIterableMap$Entry; SPLandroidx/arch/core/internal/SafeIterableMap$Entry;->(Ljava/lang/Object;Ljava/lang/Object;)V -SPLandroidx/arch/core/internal/SafeIterableMap$Entry;->getKey()Ljava/lang/Object; -SPLandroidx/arch/core/internal/SafeIterableMap$Entry;->getValue()Ljava/lang/Object; Landroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions; SPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->(Landroidx/arch/core/internal/SafeIterableMap;)V SPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->hasNext()Z -SPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->next()Ljava/lang/Object; -SPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->next()Ljava/util/Map$Entry; -SPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V -Landroidx/arch/core/internal/SafeIterableMap$ListIterator; -SPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;)V -SPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->hasNext()Z -SPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->next()Ljava/lang/Object; -SPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->next()Ljava/util/Map$Entry; -SPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->nextNode()Landroidx/arch/core/internal/SafeIterableMap$Entry; -SPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V Landroidx/arch/core/internal/SafeIterableMap$SupportRemove; SPLandroidx/arch/core/internal/SafeIterableMap$SupportRemove;->()V +Landroidx/browser/customtabs/CustomTabsCallback; Landroidx/browser/customtabs/CustomTabsClient; SPLandroidx/browser/customtabs/CustomTabsClient;->(Landroid/support/customtabs/ICustomTabsService;Landroid/content/ComponentName;Landroid/content/Context;)V SPLandroidx/browser/customtabs/CustomTabsClient;->bindCustomTabsService(Landroid/content/Context;Ljava/lang/String;Landroidx/browser/customtabs/CustomTabsServiceConnection;)Z @@ -1187,8 +1186,6 @@ SPLandroidx/browser/customtabs/CustomTabsClient;->newSessionInternal(Landroidx/b SPLandroidx/browser/customtabs/CustomTabsClient;->warmup(J)Z Landroidx/browser/customtabs/CustomTabsClient$3; SPLandroidx/browser/customtabs/CustomTabsClient$3;->(Landroidx/browser/customtabs/CustomTabsClient;Landroidx/browser/customtabs/CustomTabsCallback;)V -SPLandroidx/browser/customtabs/CustomTabsClient$3;->extraCallback(Ljava/lang/String;Landroid/os/Bundle;)V -SPLandroidx/browser/customtabs/CustomTabsClient$3;->onWarmupCompleted(Landroid/os/Bundle;)V Landroidx/browser/customtabs/CustomTabsServiceConnection; SPLandroidx/browser/customtabs/CustomTabsServiceConnection;->()V SPLandroidx/browser/customtabs/CustomTabsServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V @@ -1232,11 +1229,26 @@ SPLandroidx/collection/IndexBasedArrayIterator;->(I)V SPLandroidx/collection/IndexBasedArrayIterator;->hasNext()Z SPLandroidx/collection/IndexBasedArrayIterator;->next()Ljava/lang/Object; SPLandroidx/collection/IndexBasedArrayIterator;->remove()V +Landroidx/collection/LongObjectMap; +SPLandroidx/collection/LongObjectMap;->()V +SPLandroidx/collection/LongObjectMap;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/collection/LongObjectMap;->getCapacity()I +Landroidx/collection/LongObjectMapKt; +SPLandroidx/collection/LongObjectMapKt;->()V +SPLandroidx/collection/LongObjectMapKt;->mutableLongObjectMapOf()Landroidx/collection/MutableLongObjectMap; +Landroidx/collection/LongSet; +SPLandroidx/collection/LongSet;->()V +SPLandroidx/collection/LongSet;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/collection/LongSet;->getCapacity()I +Landroidx/collection/LongSetKt; +SPLandroidx/collection/LongSetKt;->()V +SPLandroidx/collection/LongSetKt;->getEmptyLongArray()[J Landroidx/collection/LongSparseArray; SPLandroidx/collection/LongSparseArray;->()V SPLandroidx/collection/LongSparseArray;->(I)V SPLandroidx/collection/LongSparseArray;->(IILkotlin/jvm/internal/DefaultConstructorMarker;)V SPLandroidx/collection/LongSparseArray;->clear()V +SPLandroidx/collection/LongSparseArray;->get(J)Ljava/lang/Object; Landroidx/collection/LruCache; SPLandroidx/collection/LruCache;->(I)V SPLandroidx/collection/LruCache;->create(Ljava/lang/Object;)Ljava/lang/Object; @@ -1245,6 +1257,44 @@ SPLandroidx/collection/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava SPLandroidx/collection/LruCache;->safeSizeOf(Ljava/lang/Object;Ljava/lang/Object;)I SPLandroidx/collection/LruCache;->sizeOf(Ljava/lang/Object;Ljava/lang/Object;)I SPLandroidx/collection/LruCache;->trimToSize(I)V +Landroidx/collection/MutableLongObjectMap; +SPLandroidx/collection/MutableLongObjectMap;->(I)V +SPLandroidx/collection/MutableLongObjectMap;->(IILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/collection/MutableLongObjectMap;->initializeGrowth()V +SPLandroidx/collection/MutableLongObjectMap;->initializeMetadata(I)V +SPLandroidx/collection/MutableLongObjectMap;->initializeStorage(I)V +Landroidx/collection/MutableLongSet; +SPLandroidx/collection/MutableLongSet;->(I)V +SPLandroidx/collection/MutableLongSet;->initializeGrowth()V +SPLandroidx/collection/MutableLongSet;->initializeMetadata(I)V +SPLandroidx/collection/MutableLongSet;->initializeStorage(I)V +Landroidx/collection/MutableScatterMap; +SPLandroidx/collection/MutableScatterMap;->(I)V +SPLandroidx/collection/MutableScatterMap;->(IILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/collection/MutableScatterMap;->adjustStorage$collection()V +SPLandroidx/collection/MutableScatterMap;->findFirstAvailableSlot(I)I +SPLandroidx/collection/MutableScatterMap;->findInsertIndex(Ljava/lang/Object;)I +SPLandroidx/collection/MutableScatterMap;->initializeGrowth()V +SPLandroidx/collection/MutableScatterMap;->initializeMetadata(I)V +SPLandroidx/collection/MutableScatterMap;->initializeStorage(I)V +SPLandroidx/collection/MutableScatterMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/collection/MutableScatterMap;->removeValueAt(I)Ljava/lang/Object; +SPLandroidx/collection/MutableScatterMap;->resizeStorage$collection(I)V +SPLandroidx/collection/MutableScatterMap;->set(Ljava/lang/Object;Ljava/lang/Object;)V +Landroidx/collection/ScatterMap; +SPLandroidx/collection/ScatterMap;->()V +SPLandroidx/collection/ScatterMap;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/collection/ScatterMap;->containsKey(Ljava/lang/Object;)Z +SPLandroidx/collection/ScatterMap;->get(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/collection/ScatterMap;->getCapacity()I +SPLandroidx/collection/ScatterMap;->getSize()I +Landroidx/collection/ScatterMapKt; +SPLandroidx/collection/ScatterMapKt;->()V +SPLandroidx/collection/ScatterMapKt;->loadedCapacity(I)I +SPLandroidx/collection/ScatterMapKt;->mutableScatterMapOf()Landroidx/collection/MutableScatterMap; +SPLandroidx/collection/ScatterMapKt;->nextCapacity(I)I +SPLandroidx/collection/ScatterMapKt;->normalizeCapacity(I)I +SPLandroidx/collection/ScatterMapKt;->unloadedCapacity(I)I Landroidx/collection/SimpleArrayMap; SPLandroidx/collection/SimpleArrayMap;->()V SPLandroidx/collection/SimpleArrayMap;->(I)V @@ -1258,6 +1308,7 @@ SPLandroidx/collection/SimpleArrayMap;->isEmpty()Z SPLandroidx/collection/SimpleArrayMap;->keyAt(I)Ljava/lang/Object; SPLandroidx/collection/SimpleArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; SPLandroidx/collection/SimpleArrayMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/collection/SimpleArrayMap;->removeAt(I)Ljava/lang/Object; SPLandroidx/collection/SimpleArrayMap;->size()I SPLandroidx/collection/SimpleArrayMap;->valueAt(I)Ljava/lang/Object; Landroidx/collection/SparseArrayCompat; @@ -1269,6 +1320,7 @@ SPLandroidx/collection/SparseArrayCompat;->size()I Landroidx/collection/internal/ContainerHelpersKt; SPLandroidx/collection/internal/ContainerHelpersKt;->()V SPLandroidx/collection/internal/ContainerHelpersKt;->binarySearch([III)I +SPLandroidx/collection/internal/ContainerHelpersKt;->binarySearch([JIJ)I SPLandroidx/collection/internal/ContainerHelpersKt;->idealByteArraySize(I)I SPLandroidx/collection/internal/ContainerHelpersKt;->idealIntArraySize(I)I SPLandroidx/collection/internal/ContainerHelpersKt;->idealLongArraySize(I)I @@ -1279,6 +1331,10 @@ SPLandroidx/collection/internal/LruHashMap;->(IF)V SPLandroidx/collection/internal/LruHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object; SPLandroidx/collection/internal/LruHashMap;->isEmpty()Z SPLandroidx/collection/internal/LruHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/core/MutatorMutex$$ExternalSyntheticBackportWithForwarding0; +SPLandroidx/compose/animation/core/MutatorMutex$$ExternalSyntheticBackportWithForwarding0;->m(Ljava/util/concurrent/atomic/AtomicReference;Ljava/lang/Object;Ljava/lang/Object;)Z +Landroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0; +SPLandroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Outline;Landroid/graphics/Path;)V Landroidx/concurrent/futures/AbstractResolvableFuture; SPLandroidx/concurrent/futures/AbstractResolvableFuture;->()V SPLandroidx/concurrent/futures/AbstractResolvableFuture;->()V @@ -1307,6 +1363,7 @@ Landroidx/concurrent/futures/CallbackToFutureAdapter; SPLandroidx/concurrent/futures/CallbackToFutureAdapter;->getFuture(Landroidx/concurrent/futures/CallbackToFutureAdapter$Resolver;)Lcom/google/common/util/concurrent/ListenableFuture; Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer; SPLandroidx/concurrent/futures/CallbackToFutureAdapter$Completer;->()V +PLandroidx/concurrent/futures/CallbackToFutureAdapter$Completer;->finalize()V SPLandroidx/concurrent/futures/CallbackToFutureAdapter$Completer;->set(Ljava/lang/Object;)Z SPLandroidx/concurrent/futures/CallbackToFutureAdapter$Completer;->setCompletedNormally()V Landroidx/concurrent/futures/CallbackToFutureAdapter$Resolver; @@ -1341,6 +1398,7 @@ SPLandroidx/constraintlayout/core/LinearSystem;->minimize()V SPLandroidx/constraintlayout/core/LinearSystem;->releaseRows()V SPLandroidx/constraintlayout/core/LinearSystem;->reset()V Landroidx/constraintlayout/core/LinearSystem$Row; +Landroidx/constraintlayout/core/Metrics; Landroidx/constraintlayout/core/Pools$Pool; Landroidx/constraintlayout/core/Pools$SimplePool; SPLandroidx/constraintlayout/core/Pools$SimplePool;->(I)V @@ -1529,6 +1587,8 @@ SPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solveHorizontalCente SPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solveVerticalMatchConstraint(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V SPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solvingPass(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;)V SPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->verticalSolvingPass(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;)V +Landroidx/constraintlayout/core/widgets/analyzer/HorizontalWidgetRun; +Landroidx/constraintlayout/core/widgets/analyzer/VerticalWidgetRun; Landroidx/constraintlayout/core/widgets/analyzer/WidgetRun; Landroidx/constraintlayout/widget/Barrier; Landroidx/constraintlayout/widget/ConstraintHelper; @@ -1572,6 +1632,8 @@ SPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->(Landroidx SPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->captureLayoutInfo(IIIIII)V SPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->didMeasures()V SPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->measure(Landroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measure;)V +Landroidx/constraintlayout/widget/ConstraintLayoutStates; +Landroidx/constraintlayout/widget/ConstraintSet; Landroidx/constraintlayout/widget/Guideline; Landroidx/constraintlayout/widget/Placeholder; Landroidx/constraintlayout/widget/R$styleable; @@ -1604,6 +1666,7 @@ SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onLayout(ZIIII)V SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onLayoutChild(Landroid/view/View;I)V SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onMeasure(II)V SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onMeasureChild(Landroid/view/View;IIII)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->parseBehavior(Landroid/content/Context;Landroid/util/AttributeSet;Ljava/lang/String;)Landroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior; SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->performIntercept(Landroid/view/MotionEvent;I)Z SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->prepareChildren()V SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->releaseTempRect(Landroid/graphics/Rect;)V @@ -1611,6 +1674,11 @@ SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->resetTouchBehaviors(Z)V SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->resolveGravity(I)I SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->setupForInsets()V Landroidx/coordinatorlayout/widget/CoordinatorLayout$AttachedBehavior; +Landroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior; +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->layoutDependsOn(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onAttachedToLayoutParams(Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z Landroidx/coordinatorlayout/widget/CoordinatorLayout$DefaultBehavior; Landroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener; SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)V @@ -1690,21 +1758,36 @@ Landroidx/core/app/OnMultiWindowModeChangedProvider; Landroidx/core/app/OnNewIntentProvider; Landroidx/core/app/OnPictureInPictureModeChangedProvider; Landroidx/core/app/OnUserLeaveHintProvider; +Landroidx/core/app/PendingIntentCompat; +SPLandroidx/core/app/PendingIntentCompat;->addMutabilityFlags(ZI)I +SPLandroidx/core/app/PendingIntentCompat;->getActivity(Landroid/content/Context;ILandroid/content/Intent;IZ)Landroid/app/PendingIntent; +SPLandroidx/core/app/PendingIntentCompat;->getBroadcast(Landroid/content/Context;ILandroid/content/Intent;IZ)Landroid/app/PendingIntent; +Landroidx/core/app/SharedElementCallback; Landroidx/core/app/TaskStackBuilder$SupportParentable; Landroidx/core/content/ContextCompat; -SPLandroidx/core/content/ContextCompat;->()V SPLandroidx/core/content/ContextCompat;->checkSelfPermission(Landroid/content/Context;Ljava/lang/String;)I SPLandroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I SPLandroidx/core/content/ContextCompat;->getColorStateList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; +SPLandroidx/core/content/ContextCompat;->getDataDir(Landroid/content/Context;)Ljava/io/File; SPLandroidx/core/content/ContextCompat;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; SPLandroidx/core/content/ContextCompat;->getSystemService(Landroid/content/Context;Ljava/lang/Class;)Ljava/lang/Object; SPLandroidx/core/content/ContextCompat;->registerReceiver(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;I)Landroid/content/Intent; SPLandroidx/core/content/ContextCompat;->registerReceiver(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent; -Landroidx/core/content/ContextCompat$Api21Impl; -SPLandroidx/core/content/ContextCompat$Api21Impl;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; -Landroidx/core/content/ContextCompat$Api23Impl; -SPLandroidx/core/content/ContextCompat$Api23Impl;->getColor(Landroid/content/Context;I)I -SPLandroidx/core/content/ContextCompat$Api23Impl;->getSystemService(Landroid/content/Context;Ljava/lang/Class;)Ljava/lang/Object; +Landroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/content/pm/ShortcutInfo$Builder;Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m$3()V +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/Context;Ljava/lang/String;)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;)Landroid/content/pm/ShortcutInfo; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;I)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;Landroid/graphics/drawable/Icon;)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;Z)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;[Landroid/content/Intent;)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowManager;)Landroid/view/WindowMetrics; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowMetrics;)Landroid/graphics/Rect; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V +Landroidx/core/content/ContextCompat$Api24Impl; +SPLandroidx/core/content/ContextCompat$Api24Impl;->getDataDir(Landroid/content/Context;)Ljava/io/File; Landroidx/core/content/ContextCompat$Api33Impl; SPLandroidx/core/content/ContextCompat$Api33Impl;->registerReceiver(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent; Landroidx/core/content/FileProvider; @@ -1767,8 +1850,6 @@ SPLandroidx/core/content/res/ResourcesCompat;->inflateColorStateList(Landroid/co SPLandroidx/core/content/res/ResourcesCompat;->isColorInt(Landroid/content/res/Resources;I)Z SPLandroidx/core/content/res/ResourcesCompat;->loadFont(Landroid/content/Context;ILandroid/util/TypedValue;ILandroidx/core/content/res/ResourcesCompat$FontCallback;Landroid/os/Handler;ZZ)Landroid/graphics/Typeface; SPLandroidx/core/content/res/ResourcesCompat;->loadFont(Landroid/content/Context;Landroid/content/res/Resources;Landroid/util/TypedValue;IILandroidx/core/content/res/ResourcesCompat$FontCallback;Landroid/os/Handler;ZZ)Landroid/graphics/Typeface; -Landroidx/core/content/res/ResourcesCompat$Api23Impl; -SPLandroidx/core/content/res/ResourcesCompat$Api23Impl;->getColorStateList(Landroid/content/res/Resources;ILandroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList; Landroidx/core/content/res/ResourcesCompat$ColorStateListCacheEntry; SPLandroidx/core/content/res/ResourcesCompat$ColorStateListCacheEntry;->(Landroid/content/res/ColorStateList;Landroid/content/res/Configuration;Landroid/content/res/Resources$Theme;)V Landroidx/core/content/res/ResourcesCompat$ColorStateListCacheKey; @@ -1796,6 +1877,8 @@ Landroidx/core/graphics/Insets; SPLandroidx/core/graphics/Insets;->()V SPLandroidx/core/graphics/Insets;->(IIII)V SPLandroidx/core/graphics/Insets;->equals(Ljava/lang/Object;)Z +SPLandroidx/core/graphics/Insets;->max(Landroidx/core/graphics/Insets;Landroidx/core/graphics/Insets;)Landroidx/core/graphics/Insets; +SPLandroidx/core/graphics/Insets;->min(Landroidx/core/graphics/Insets;Landroidx/core/graphics/Insets;)Landroidx/core/graphics/Insets; SPLandroidx/core/graphics/Insets;->of(IIII)Landroidx/core/graphics/Insets; SPLandroidx/core/graphics/Insets;->toCompatInsets(Landroid/graphics/Insets;)Landroidx/core/graphics/Insets; Landroidx/core/graphics/TypefaceCompat; @@ -1818,14 +1901,9 @@ SPLandroidx/core/graphics/TypefaceCompatBaseImpl;->()V Landroidx/core/graphics/TypefaceCompatUtil; SPLandroidx/core/graphics/TypefaceCompatUtil;->mmap(Landroid/content/Context;Landroid/os/CancellationSignal;Landroid/net/Uri;)Ljava/nio/ByteBuffer; Landroidx/core/graphics/drawable/DrawableCompat; -SPLandroidx/core/graphics/drawable/DrawableCompat;->clearColorFilter(Landroid/graphics/drawable/Drawable;)V SPLandroidx/core/graphics/drawable/DrawableCompat;->getLayoutDirection(Landroid/graphics/drawable/Drawable;)I SPLandroidx/core/graphics/drawable/DrawableCompat;->setHotspotBounds(Landroid/graphics/drawable/Drawable;IIII)V SPLandroidx/core/graphics/drawable/DrawableCompat;->wrap(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; -Landroidx/core/graphics/drawable/DrawableCompat$Api21Impl; -SPLandroidx/core/graphics/drawable/DrawableCompat$Api21Impl;->setHotspotBounds(Landroid/graphics/drawable/Drawable;IIII)V -Landroidx/core/graphics/drawable/DrawableCompat$Api23Impl; -SPLandroidx/core/graphics/drawable/DrawableCompat$Api23Impl;->getLayoutDirection(Landroid/graphics/drawable/Drawable;)I Landroidx/core/graphics/drawable/IconCompat; SPLandroidx/core/graphics/drawable/IconCompat;->()V SPLandroidx/core/graphics/drawable/IconCompat;->(I)V @@ -1840,6 +1918,14 @@ Landroidx/core/internal/view/SupportMenu; Landroidx/core/internal/view/SupportMenuItem; Landroidx/core/math/MathUtils; SPLandroidx/core/math/MathUtils;->clamp(III)I +Landroidx/core/os/BuildCompat; +SPLandroidx/core/os/BuildCompat;->()V +SPLandroidx/core/os/BuildCompat;->()V +SPLandroidx/core/os/BuildCompat;->isAtLeastB_1()Z +Landroidx/core/os/BuildCompat$Api30Impl; +SPLandroidx/core/os/BuildCompat$Api30Impl;->()V +SPLandroidx/core/os/BuildCompat$Api30Impl;->()V +SPLandroidx/core/os/BuildCompat$Api30Impl;->getExtensionVersion(I)I Landroidx/core/os/BundleCompat; SPLandroidx/core/os/BundleCompat;->getParcelable(Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; Landroidx/core/os/BundleCompat$Api33Impl; @@ -1862,10 +1948,8 @@ SPLandroidx/core/os/LocaleListCompat;->forLanguageTags(Ljava/lang/String;)Landro SPLandroidx/core/os/LocaleListCompat;->get(I)Ljava/util/Locale; SPLandroidx/core/os/LocaleListCompat;->getEmptyLocaleList()Landroidx/core/os/LocaleListCompat; SPLandroidx/core/os/LocaleListCompat;->isEmpty()Z +SPLandroidx/core/os/LocaleListCompat;->toLanguageTags()Ljava/lang/String; SPLandroidx/core/os/LocaleListCompat;->wrap(Landroid/os/LocaleList;)Landroidx/core/os/LocaleListCompat; -Landroidx/core/os/LocaleListCompat$Api21Impl; -SPLandroidx/core/os/LocaleListCompat$Api21Impl;->()V -SPLandroidx/core/os/LocaleListCompat$Api21Impl;->forLanguageTag(Ljava/lang/String;)Ljava/util/Locale; Landroidx/core/os/LocaleListCompat$Api24Impl; SPLandroidx/core/os/LocaleListCompat$Api24Impl;->createLocaleList([Ljava/util/Locale;)Landroid/os/LocaleList; Landroidx/core/os/LocaleListInterface; @@ -1873,6 +1957,7 @@ Landroidx/core/os/LocaleListPlatformWrapper; SPLandroidx/core/os/LocaleListPlatformWrapper;->(Ljava/lang/Object;)V SPLandroidx/core/os/LocaleListPlatformWrapper;->get(I)Ljava/util/Locale; SPLandroidx/core/os/LocaleListPlatformWrapper;->isEmpty()Z +SPLandroidx/core/os/LocaleListPlatformWrapper;->toLanguageTags()Ljava/lang/String; Landroidx/core/os/Profiling$$ExternalSyntheticApiModelOutline0; SPLandroidx/core/os/Profiling$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/content/pm/ShortcutManager;Ljava/util/List;)Z SPLandroidx/core/os/Profiling$$ExternalSyntheticApiModelOutline0;->m()Ljava/lang/Class; @@ -1884,6 +1969,10 @@ SPLandroidx/core/os/TraceCompat;->endSection()V SPLandroidx/core/os/TraceCompat;->isEnabled()Z Landroidx/core/os/TraceCompat$Api29Impl; SPLandroidx/core/os/TraceCompat$Api29Impl;->isEnabled()Z +Landroidx/core/os/UserManagerCompat; +SPLandroidx/core/os/UserManagerCompat;->isUserUnlocked(Landroid/content/Context;)Z +Landroidx/core/os/UserManagerCompat$Api24Impl; +SPLandroidx/core/os/UserManagerCompat$Api24Impl;->isUserUnlocked(Landroid/content/Context;)Z Landroidx/core/provider/FontProvider; SPLandroidx/core/provider/FontProvider;->()V SPLandroidx/core/provider/FontProvider;->convertToByteArrayList([Landroid/content/pm/Signature;)Ljava/util/List; @@ -1891,6 +1980,7 @@ SPLandroidx/core/provider/FontProvider;->equalsByteArrayList(Ljava/util/List;Lja SPLandroidx/core/provider/FontProvider;->getCertificates(Landroidx/core/provider/FontRequest;Landroid/content/res/Resources;)Ljava/util/List; SPLandroidx/core/provider/FontProvider;->getFontFamilyResult(Landroid/content/Context;Ljava/util/List;Landroid/os/CancellationSignal;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult; SPLandroidx/core/provider/FontProvider;->getProvider(Landroid/content/pm/PackageManager;Landroidx/core/provider/FontRequest;Landroid/content/res/Resources;)Landroid/content/pm/ProviderInfo; +SPLandroidx/core/provider/FontProvider;->getSelectionArgs(Landroidx/core/provider/FontRequest;)[Ljava/lang/String; SPLandroidx/core/provider/FontProvider;->query(Landroid/content/Context;Landroidx/core/provider/FontRequest;Ljava/lang/String;Landroid/os/CancellationSignal;)[Landroidx/core/provider/FontsContractCompat$FontInfo; Landroidx/core/provider/FontProvider$$ExternalSyntheticLambda0; SPLandroidx/core/provider/FontProvider$$ExternalSyntheticLambda0;->()V @@ -1912,6 +2002,7 @@ SPLandroidx/core/provider/FontRequest;->getProviderAuthority()Ljava/lang/String; SPLandroidx/core/provider/FontRequest;->getProviderPackage()Ljava/lang/String; SPLandroidx/core/provider/FontRequest;->getQuery()Ljava/lang/String; SPLandroidx/core/provider/FontRequest;->getSystemFont()Ljava/lang/String; +SPLandroidx/core/provider/FontRequest;->getVariationSettings()Ljava/lang/String; Landroidx/core/provider/FontsContractCompat; SPLandroidx/core/provider/FontsContractCompat;->buildTypeface(Landroid/content/Context;Landroid/os/CancellationSignal;[Landroidx/core/provider/FontsContractCompat$FontInfo;)Landroid/graphics/Typeface; SPLandroidx/core/provider/FontsContractCompat;->fetchFonts(Landroid/content/Context;Landroid/os/CancellationSignal;Landroidx/core/provider/FontRequest;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult; @@ -1921,9 +2012,7 @@ SPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->create(ILjava/u SPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->getFonts()[Landroidx/core/provider/FontsContractCompat$FontInfo; SPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->getStatusCode()I Landroidx/core/provider/FontsContractCompat$FontInfo; -SPLandroidx/core/provider/FontsContractCompat$FontInfo;->(Landroid/net/Uri;IIZI)V SPLandroidx/core/provider/FontsContractCompat$FontInfo;->(Landroid/net/Uri;IIZLjava/lang/String;I)V -SPLandroidx/core/provider/FontsContractCompat$FontInfo;->create(Landroid/net/Uri;IIZI)Landroidx/core/provider/FontsContractCompat$FontInfo; SPLandroidx/core/provider/FontsContractCompat$FontInfo;->getResultCode()I SPLandroidx/core/provider/FontsContractCompat$FontInfo;->getTtcIndex()I SPLandroidx/core/provider/FontsContractCompat$FontInfo;->getUri()Landroid/net/Uri; @@ -1933,11 +2022,19 @@ SPLandroidx/core/provider/FontsContractCompat$FontInfo;->isItalic()Z SPLandroidx/core/provider/FontsContractCompat$FontInfo;->isSystemFont()Z Landroidx/core/util/Consumer; Landroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0; +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m$1()I +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/WindowInsets;I)Landroid/graphics/Insets; +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m$2()I SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/view/WindowInsets;)Landroid/graphics/Insets; +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m$3()I +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m()I SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/WindowInsets$Builder; SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/WindowInsets; +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/view/WindowInsetsAnimation$Callback;)V SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets$Builder;)Landroid/view/WindowInsets; SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;I)Landroid/graphics/Insets; +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;I)Landroid/view/RoundedCorner; Landroidx/core/util/ObjectsCompat; SPLandroidx/core/util/ObjectsCompat;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z SPLandroidx/core/util/ObjectsCompat;->hash([Ljava/lang/Object;)I @@ -1955,6 +2052,7 @@ SPLandroidx/core/util/Pools$SynchronizedPool;->acquire()Ljava/lang/Object; SPLandroidx/core/util/Pools$SynchronizedPool;->release(Ljava/lang/Object;)Z Landroidx/core/util/Preconditions; SPLandroidx/core/util/Preconditions;->checkArgument(ZLjava/lang/Object;)V +SPLandroidx/core/util/Preconditions;->checkArgumentNonnegative(I)I SPLandroidx/core/util/Preconditions;->checkArgumentNonnegative(ILjava/lang/String;)I SPLandroidx/core/util/Preconditions;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object; SPLandroidx/core/util/Preconditions;->checkNotNull(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -1998,6 +2096,7 @@ SPLandroidx/core/view/DifferentialMotionFlingController$$ExternalSyntheticLambda Landroidx/core/view/DifferentialMotionFlingController$DifferentialVelocityProvider; Landroidx/core/view/DifferentialMotionFlingController$FlingVelocityThresholdCalculator; Landroidx/core/view/DifferentialMotionFlingTarget; +Landroidx/core/view/DisplayShapeCompat; Landroidx/core/view/GravityCompat; SPLandroidx/core/view/GravityCompat;->apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;I)V SPLandroidx/core/view/GravityCompat;->getAbsoluteGravity(II)I @@ -2034,7 +2133,17 @@ SPLandroidx/core/view/NestedScrollingParentHelper;->(Landroid/view/ViewGro Landroidx/core/view/OnApplyWindowInsetsListener; Landroidx/core/view/OnReceiveContentListener; Landroidx/core/view/OnReceiveContentViewBehavior; +Landroidx/core/view/RoundedCornerCompat; +SPLandroidx/core/view/RoundedCornerCompat;->toRoundedCornerCompat(Landroid/view/RoundedCorner;)Landroidx/core/view/RoundedCornerCompat; Landroidx/core/view/ScrollingView; +Landroidx/core/view/SoftwareKeyboardControllerCompat; +SPLandroidx/core/view/SoftwareKeyboardControllerCompat;->(Landroid/view/View;)V +Landroidx/core/view/SoftwareKeyboardControllerCompat$Impl; +SPLandroidx/core/view/SoftwareKeyboardControllerCompat$Impl;->()V +Landroidx/core/view/SoftwareKeyboardControllerCompat$Impl20; +SPLandroidx/core/view/SoftwareKeyboardControllerCompat$Impl20;->(Landroid/view/View;)V +Landroidx/core/view/SoftwareKeyboardControllerCompat$Impl30; +SPLandroidx/core/view/SoftwareKeyboardControllerCompat$Impl30;->(Landroid/view/View;)V Landroidx/core/view/TintableBackgroundView; Landroidx/core/view/ViewCompat; SPLandroidx/core/view/ViewCompat;->()V @@ -2072,6 +2181,7 @@ SPLandroidx/core/view/ViewCompat;->setImportantForAccessibilityIfNeeded(Landroid SPLandroidx/core/view/ViewCompat;->setImportantForAutofill(Landroid/view/View;I)V SPLandroidx/core/view/ViewCompat;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V SPLandroidx/core/view/ViewCompat;->setOnReceiveContentListener(Landroid/view/View;[Ljava/lang/String;Landroidx/core/view/OnReceiveContentListener;)V +SPLandroidx/core/view/ViewCompat;->setWindowInsetsAnimationCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V SPLandroidx/core/view/ViewCompat;->stateDescriptionProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; Landroidx/core/view/ViewCompat$$ExternalSyntheticLambda0; SPLandroidx/core/view/ViewCompat$$ExternalSyntheticLambda0;->()V @@ -2105,13 +2215,7 @@ SPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->(ILjava/lang/ SPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->frameworkAvailable()Z SPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->get(Landroid/view/View;)Ljava/lang/Object; SPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->set(Landroid/view/View;Ljava/lang/Object;)V -Landroidx/core/view/ViewCompat$Api20Impl; -SPLandroidx/core/view/ViewCompat$Api20Impl;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; -SPLandroidx/core/view/ViewCompat$Api20Impl;->requestApplyInsets(Landroid/view/View;)V Landroidx/core/view/ViewCompat$Api21Impl; -SPLandroidx/core/view/ViewCompat$Api21Impl;->getElevation(Landroid/view/View;)F -SPLandroidx/core/view/ViewCompat$Api21Impl;->setBackgroundTintList(Landroid/view/View;Landroid/content/res/ColorStateList;)V -SPLandroidx/core/view/ViewCompat$Api21Impl;->setElevation(Landroid/view/View;F)V SPLandroidx/core/view/ViewCompat$Api21Impl;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V Landroidx/core/view/ViewCompat$Api21Impl$1; SPLandroidx/core/view/ViewCompat$Api21Impl$1;->(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V @@ -2140,9 +2244,27 @@ Landroidx/core/view/ViewConfigurationCompat; SPLandroidx/core/view/ViewConfigurationCompat;->()V SPLandroidx/core/view/ViewConfigurationCompat;->getScaledHorizontalScrollFactor(Landroid/view/ViewConfiguration;Landroid/content/Context;)F SPLandroidx/core/view/ViewConfigurationCompat;->getScaledVerticalScrollFactor(Landroid/view/ViewConfiguration;Landroid/content/Context;)F +SPLandroidx/core/view/ViewConfigurationCompat;->shouldShowMenuShortcutsWhenKeyboardPresent(Landroid/view/ViewConfiguration;Landroid/content/Context;)Z Landroidx/core/view/ViewConfigurationCompat$Api26Impl; SPLandroidx/core/view/ViewConfigurationCompat$Api26Impl;->getScaledHorizontalScrollFactor(Landroid/view/ViewConfiguration;)F SPLandroidx/core/view/ViewConfigurationCompat$Api26Impl;->getScaledVerticalScrollFactor(Landroid/view/ViewConfiguration;)F +Landroidx/core/view/ViewConfigurationCompat$Api28Impl; +SPLandroidx/core/view/ViewConfigurationCompat$Api28Impl;->shouldShowMenuShortcutsWhenKeyboardPresent(Landroid/view/ViewConfiguration;)Z +Landroidx/core/view/ViewPropertyAnimatorCompat; +Landroidx/core/view/WindowCompat; +SPLandroidx/core/view/WindowCompat;->setDecorFitsSystemWindows(Landroid/view/Window;Z)V +Landroidx/core/view/WindowCompat$Api35Impl; +SPLandroidx/core/view/WindowCompat$Api35Impl;->setDecorFitsSystemWindows(Landroid/view/Window;Z)V +Landroidx/core/view/WindowInsetsAnimationCompat; +SPLandroidx/core/view/WindowInsetsAnimationCompat;->setCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V +Landroidx/core/view/WindowInsetsAnimationCompat$Callback; +SPLandroidx/core/view/WindowInsetsAnimationCompat$Callback;->(I)V +SPLandroidx/core/view/WindowInsetsAnimationCompat$Callback;->getDispatchMode()I +Landroidx/core/view/WindowInsetsAnimationCompat$Impl; +Landroidx/core/view/WindowInsetsAnimationCompat$Impl30; +SPLandroidx/core/view/WindowInsetsAnimationCompat$Impl30;->setCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V +Landroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback; +SPLandroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback;->(Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V Landroidx/core/view/WindowInsetsCompat; SPLandroidx/core/view/WindowInsetsCompat;->()V SPLandroidx/core/view/WindowInsetsCompat;->(Landroid/view/WindowInsets;)V @@ -2150,16 +2272,22 @@ SPLandroidx/core/view/WindowInsetsCompat;->(Landroidx/core/view/WindowInse SPLandroidx/core/view/WindowInsetsCompat;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; SPLandroidx/core/view/WindowInsetsCompat;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; SPLandroidx/core/view/WindowInsetsCompat;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; -SPLandroidx/core/view/WindowInsetsCompat;->copyRootViewBounds(Landroid/view/View;)V +SPLandroidx/core/view/WindowInsetsCompat;->getInsets(I)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/WindowInsetsCompat;->getInsetsIgnoringVisibility(I)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/WindowInsetsCompat;->getRoundedCorner(I)Landroidx/core/view/RoundedCornerCompat; SPLandroidx/core/view/WindowInsetsCompat;->getSystemGestureInsets()Landroidx/core/graphics/Insets; SPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetBottom()I SPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetLeft()I SPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetRight()I SPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetTop()I -SPLandroidx/core/view/WindowInsetsCompat;->hasSystemWindowInsets()Z +SPLandroidx/core/view/WindowInsetsCompat;->init(Landroid/view/View;)V +SPLandroidx/core/view/WindowInsetsCompat;->isConsumed()Z +SPLandroidx/core/view/WindowInsetsCompat;->setDisplayShape(Landroidx/core/view/DisplayShapeCompat;)V SPLandroidx/core/view/WindowInsetsCompat;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V SPLandroidx/core/view/WindowInsetsCompat;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V SPLandroidx/core/view/WindowInsetsCompat;->setSystemUiVisibility(I)V +SPLandroidx/core/view/WindowInsetsCompat;->setTypeBoundingRectsMap([[Landroid/graphics/Rect;)V +SPLandroidx/core/view/WindowInsetsCompat;->setTypeMaxBoundingRectsMap([[Landroid/graphics/Rect;)V SPLandroidx/core/view/WindowInsetsCompat;->toWindowInsets()Landroid/view/WindowInsets; SPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;)Landroidx/core/view/WindowInsetsCompat; SPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; @@ -2179,6 +2307,9 @@ Landroidx/core/view/WindowInsetsCompat$BuilderImpl31; SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl31;->()V Landroidx/core/view/WindowInsetsCompat$BuilderImpl34; SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl34;->()V +Landroidx/core/view/WindowInsetsCompat$BuilderImpl35; +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl35;->()V +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl35;->initTypeBoundingRects(Landroidx/core/view/WindowInsetsCompat;)V Landroidx/core/view/WindowInsetsCompat$Impl; SPLandroidx/core/view/WindowInsetsCompat$Impl;->()V SPLandroidx/core/view/WindowInsetsCompat$Impl;->(Landroidx/core/view/WindowInsetsCompat;)V @@ -2186,13 +2317,17 @@ Landroidx/core/view/WindowInsetsCompat$Impl20; SPLandroidx/core/view/WindowInsetsCompat$Impl20;->()V SPLandroidx/core/view/WindowInsetsCompat$Impl20;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V SPLandroidx/core/view/WindowInsetsCompat$Impl20;->getSystemWindowInsets()Landroidx/core/graphics/Insets; +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setDisplayShape(Landroidx/core/view/DisplayShapeCompat;)V SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setSystemUiVisibility(I)V +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setTypeBoundingRectsMap([[Landroid/graphics/Rect;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setTypeMaxBoundingRectsMap([[Landroid/graphics/Rect;)V Landroidx/core/view/WindowInsetsCompat$Impl21; SPLandroidx/core/view/WindowInsetsCompat$Impl21;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V SPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; SPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/WindowInsetsCompat$Impl21;->isConsumed()Z Landroidx/core/view/WindowInsetsCompat$Impl28; SPLandroidx/core/view/WindowInsetsCompat$Impl28;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V SPLandroidx/core/view/WindowInsetsCompat$Impl28;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; @@ -2205,15 +2340,48 @@ SPLandroidx/core/view/WindowInsetsCompat$Impl30;->(Landroidx/core/view/Win SPLandroidx/core/view/WindowInsetsCompat$Impl30;->copyRootViewBounds(Landroid/view/View;)V Landroidx/core/view/WindowInsetsCompat$Impl31; SPLandroidx/core/view/WindowInsetsCompat$Impl31;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl31;->getRoundedCorner(I)Landroidx/core/view/RoundedCornerCompat; Landroidx/core/view/WindowInsetsCompat$Impl34; SPLandroidx/core/view/WindowInsetsCompat$Impl34;->()V SPLandroidx/core/view/WindowInsetsCompat$Impl34;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl34;->getInsets(I)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/WindowInsetsCompat$Impl34;->getInsetsIgnoringVisibility(I)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/WindowInsetsCompat$Impl34;->initDisplayShape(Landroid/view/View;)V +Landroidx/core/view/WindowInsetsCompat$Impl35; +SPLandroidx/core/view/WindowInsetsCompat$Impl35;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl35;->initTypeBoundingRectsMaps()V +Landroidx/core/view/WindowInsetsCompat$Type; +SPLandroidx/core/view/WindowInsetsCompat$Type;->displayCutout()I +SPLandroidx/core/view/WindowInsetsCompat$Type;->ime()I +SPLandroidx/core/view/WindowInsetsCompat$Type;->navigationBars()I +SPLandroidx/core/view/WindowInsetsCompat$Type;->systemBars()I +SPLandroidx/core/view/WindowInsetsCompat$Type;->tappableElement()I +Landroidx/core/view/WindowInsetsCompat$TypeImpl34; +SPLandroidx/core/view/WindowInsetsCompat$TypeImpl34;->toPlatformType(I)I +Landroidx/core/view/WindowInsetsControllerCompat; +SPLandroidx/core/view/WindowInsetsControllerCompat;->(Landroid/view/Window;Landroid/view/View;)V +SPLandroidx/core/view/WindowInsetsControllerCompat;->setAppearanceLightNavigationBars(Z)V +SPLandroidx/core/view/WindowInsetsControllerCompat;->setAppearanceLightStatusBars(Z)V +Landroidx/core/view/WindowInsetsControllerCompat$Impl; +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl;->()V +Landroidx/core/view/WindowInsetsControllerCompat$Impl30; +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->(Landroid/view/Window;Landroidx/core/view/WindowInsetsControllerCompat;Landroidx/core/view/SoftwareKeyboardControllerCompat;)V +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->(Landroid/view/WindowInsetsController;Landroidx/core/view/WindowInsetsControllerCompat;Landroidx/core/view/SoftwareKeyboardControllerCompat;)V +Landroidx/core/view/WindowInsetsControllerCompat$Impl31; +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl31;->(Landroid/view/Window;Landroidx/core/view/WindowInsetsControllerCompat;Landroidx/core/view/SoftwareKeyboardControllerCompat;)V +Landroidx/core/view/WindowInsetsControllerCompat$Impl35; +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl35;->(Landroid/view/Window;Landroidx/core/view/WindowInsetsControllerCompat;Landroidx/core/view/SoftwareKeyboardControllerCompat;)V +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl35;->setAppearanceLightNavigationBars(Z)V +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl35;->setAppearanceLightStatusBars(Z)V Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->()V SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addSpansToExtras(Ljava/lang/CharSequence;Landroid/view/View;)V SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->removeAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)Z SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClassName(Ljava/lang/CharSequence;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionInfo(Ljava/lang/Object;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionItemInfo(Ljava/lang/Object;)V SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setFocusable(Z)V SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setFocused(Z)V SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setHeading(Z)V @@ -2231,6 +2399,12 @@ Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl; SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl;->setStateDescription(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api34Impl; SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api34Impl;->getActionScrollInDirection()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat; +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->(Ljava/lang/Object;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->obtain(IIZI)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat; +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;->(Ljava/lang/Object;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;->obtain(IIIIZZ)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat; Landroidx/core/view/accessibility/AccessibilityViewCommand; Landroidx/core/view/accessibility/AccessibilityViewCommand$CommandArguments; Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveAtGranularityArguments; @@ -2240,14 +2414,107 @@ Landroidx/core/view/accessibility/AccessibilityViewCommand$ScrollToPositionArgum Landroidx/core/view/accessibility/AccessibilityViewCommand$SetProgressArguments; Landroidx/core/view/accessibility/AccessibilityViewCommand$SetSelectionArguments; Landroidx/core/view/accessibility/AccessibilityViewCommand$SetTextArguments; +Landroidx/core/view/insets/ColorProtection; +SPLandroidx/core/view/insets/ColorProtection;->(I)V +SPLandroidx/core/view/insets/ColorProtection;->(II)V +SPLandroidx/core/view/insets/ColorProtection;->dispatchColorHint(I)V +SPLandroidx/core/view/insets/ColorProtection;->occupiesCorners()Z +SPLandroidx/core/view/insets/ColorProtection;->setColor(I)V +SPLandroidx/core/view/insets/ColorProtection;->setColorInner(I)V +Landroidx/core/view/insets/Protection; +SPLandroidx/core/view/insets/Protection;->()V +SPLandroidx/core/view/insets/Protection;->(I)V +SPLandroidx/core/view/insets/Protection;->dispatchInsets(Landroidx/core/graphics/Insets;Landroidx/core/graphics/Insets;Landroidx/core/graphics/Insets;)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/insets/Protection;->getAttributes()Landroidx/core/view/insets/Protection$Attributes; +SPLandroidx/core/view/insets/Protection;->getController()Ljava/lang/Object; +SPLandroidx/core/view/insets/Protection;->getSide()I +SPLandroidx/core/view/insets/Protection;->getThickness(I)I +SPLandroidx/core/view/insets/Protection;->setController(Ljava/lang/Object;)V +SPLandroidx/core/view/insets/Protection;->setSystemAlpha(F)V +SPLandroidx/core/view/insets/Protection;->setSystemInsetAmount(F)V +SPLandroidx/core/view/insets/Protection;->setSystemVisible(Z)V +SPLandroidx/core/view/insets/Protection;->updateAlpha()V +SPLandroidx/core/view/insets/Protection;->updateInsetAmount()V +SPLandroidx/core/view/insets/Protection;->updateLayout()Landroidx/core/graphics/Insets; +Landroidx/core/view/insets/Protection$Attributes; +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$fgetmHeight(Landroidx/core/view/insets/Protection$Attributes;)I +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$fgetmWidth(Landroidx/core/view/insets/Protection$Attributes;)I +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetAlpha(Landroidx/core/view/insets/Protection$Attributes;F)V +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetHeight(Landroidx/core/view/insets/Protection$Attributes;I)V +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetMargin(Landroidx/core/view/insets/Protection$Attributes;Landroidx/core/graphics/Insets;)V +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetTranslationX(Landroidx/core/view/insets/Protection$Attributes;F)V +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetTranslationY(Landroidx/core/view/insets/Protection$Attributes;F)V +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetVisible(Landroidx/core/view/insets/Protection$Attributes;Z)V +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetWidth(Landroidx/core/view/insets/Protection$Attributes;I)V +SPLandroidx/core/view/insets/Protection$Attributes;->()V +SPLandroidx/core/view/insets/Protection$Attributes;->getAlpha()F +SPLandroidx/core/view/insets/Protection$Attributes;->getDrawable()Landroid/graphics/drawable/Drawable; +SPLandroidx/core/view/insets/Protection$Attributes;->getHeight()I +SPLandroidx/core/view/insets/Protection$Attributes;->getMargin()Landroidx/core/graphics/Insets; +SPLandroidx/core/view/insets/Protection$Attributes;->getTranslationX()F +SPLandroidx/core/view/insets/Protection$Attributes;->getTranslationY()F +SPLandroidx/core/view/insets/Protection$Attributes;->getWidth()I +SPLandroidx/core/view/insets/Protection$Attributes;->isVisible()Z +SPLandroidx/core/view/insets/Protection$Attributes;->setAlpha(F)V +SPLandroidx/core/view/insets/Protection$Attributes;->setCallback(Landroidx/core/view/insets/Protection$Attributes$Callback;)V +SPLandroidx/core/view/insets/Protection$Attributes;->setHeight(I)V +SPLandroidx/core/view/insets/Protection$Attributes;->setMargin(Landroidx/core/graphics/Insets;)V +SPLandroidx/core/view/insets/Protection$Attributes;->setTranslationX(F)V +SPLandroidx/core/view/insets/Protection$Attributes;->setTranslationY(F)V +SPLandroidx/core/view/insets/Protection$Attributes;->setVisible(Z)V +SPLandroidx/core/view/insets/Protection$Attributes;->setWidth(I)V +Landroidx/core/view/insets/Protection$Attributes$Callback; +Landroidx/core/view/insets/ProtectionGroup; +SPLandroidx/core/view/insets/ProtectionGroup;->(Landroidx/core/view/insets/SystemBarStateMonitor;Ljava/util/List;)V +SPLandroidx/core/view/insets/ProtectionGroup;->addProtections(Ljava/util/List;Z)V +SPLandroidx/core/view/insets/ProtectionGroup;->dispose()V +SPLandroidx/core/view/insets/ProtectionGroup;->getProtection(I)Landroidx/core/view/insets/Protection; +SPLandroidx/core/view/insets/ProtectionGroup;->onColorHintChanged(I)V +SPLandroidx/core/view/insets/ProtectionGroup;->onInsetsChanged(Landroidx/core/graphics/Insets;Landroidx/core/graphics/Insets;)V +SPLandroidx/core/view/insets/ProtectionGroup;->size()I +SPLandroidx/core/view/insets/ProtectionGroup;->updateInsets()V +Landroidx/core/view/insets/ProtectionLayout; +SPLandroidx/core/view/insets/ProtectionLayout;->()V +SPLandroidx/core/view/insets/ProtectionLayout;->(Landroid/content/Context;Ljava/util/List;)V +SPLandroidx/core/view/insets/ProtectionLayout;->addProtectionView(Landroid/content/Context;ILandroidx/core/view/insets/Protection;)V +SPLandroidx/core/view/insets/ProtectionLayout;->addProtectionViews()V +SPLandroidx/core/view/insets/ProtectionLayout;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V +SPLandroidx/core/view/insets/ProtectionLayout;->getOrInstallSystemBarStateMonitor()Landroidx/core/view/insets/SystemBarStateMonitor; +SPLandroidx/core/view/insets/ProtectionLayout;->maybeUninstallSystemBarStateMonitor()V +SPLandroidx/core/view/insets/ProtectionLayout;->onAttachedToWindow()V +SPLandroidx/core/view/insets/ProtectionLayout;->onDetachedFromWindow()V +SPLandroidx/core/view/insets/ProtectionLayout;->removeProtectionViews()V +SPLandroidx/core/view/insets/ProtectionLayout;->setProtections(Ljava/util/List;)V +Landroidx/core/view/insets/ProtectionLayout$1; +SPLandroidx/core/view/insets/ProtectionLayout$1;->(Landroidx/core/view/insets/ProtectionLayout;Landroid/widget/FrameLayout$LayoutParams;Landroid/view/View;)V +SPLandroidx/core/view/insets/ProtectionLayout$1;->onAlphaChanged(F)V +SPLandroidx/core/view/insets/ProtectionLayout$1;->onHeightChanged(I)V +SPLandroidx/core/view/insets/ProtectionLayout$1;->onVisibilityChanged(Z)V +Landroidx/core/view/insets/SystemBarStateMonitor; +SPLandroidx/core/view/insets/SystemBarStateMonitor;->(Landroid/view/ViewGroup;)V +SPLandroidx/core/view/insets/SystemBarStateMonitor;->addCallback(Landroidx/core/view/insets/SystemBarStateMonitor$Callback;)V +SPLandroidx/core/view/insets/SystemBarStateMonitor;->addViewWhenReady(Landroid/view/ViewGroup;Landroid/view/View;I)V +SPLandroidx/core/view/insets/SystemBarStateMonitor;->detachFromWindow()V +SPLandroidx/core/view/insets/SystemBarStateMonitor;->getInsets(Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/insets/SystemBarStateMonitor;->getInsetsIgnoringVisibility(Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/insets/SystemBarStateMonitor;->hasCallback()Z +SPLandroidx/core/view/insets/SystemBarStateMonitor;->lambda$new$0$androidx-core-view-insets-SystemBarStateMonitor(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/insets/SystemBarStateMonitor;->removeCallback(Landroidx/core/view/insets/SystemBarStateMonitor$Callback;)V +Landroidx/core/view/insets/SystemBarStateMonitor$$ExternalSyntheticLambda0; +SPLandroidx/core/view/insets/SystemBarStateMonitor$$ExternalSyntheticLambda0;->(Landroidx/core/view/insets/SystemBarStateMonitor;)V +SPLandroidx/core/view/insets/SystemBarStateMonitor$$ExternalSyntheticLambda0;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +Landroidx/core/view/insets/SystemBarStateMonitor$$ExternalSyntheticLambda1; +SPLandroidx/core/view/insets/SystemBarStateMonitor$$ExternalSyntheticLambda1;->(Landroidx/core/view/insets/SystemBarStateMonitor;)V +Landroidx/core/view/insets/SystemBarStateMonitor$1; +SPLandroidx/core/view/insets/SystemBarStateMonitor$1;->(Landroidx/core/view/insets/SystemBarStateMonitor;Landroid/content/Context;Landroid/view/ViewGroup;)V +Landroidx/core/view/insets/SystemBarStateMonitor$2; +SPLandroidx/core/view/insets/SystemBarStateMonitor$2;->(Landroidx/core/view/insets/SystemBarStateMonitor;I)V +Landroidx/core/view/insets/SystemBarStateMonitor$Callback; Landroidx/core/widget/AutoSizeableTextView; Landroidx/core/widget/CheckedTextViewCompat; SPLandroidx/core/widget/CheckedTextViewCompat;->getCheckMarkDrawable(Landroid/widget/CheckedTextView;)Landroid/graphics/drawable/Drawable; -Landroidx/core/widget/ImageViewCompat; -SPLandroidx/core/widget/ImageViewCompat;->setImageTintList(Landroid/widget/ImageView;Landroid/content/res/ColorStateList;)V -Landroidx/core/widget/ImageViewCompat$Api21Impl; -SPLandroidx/core/widget/ImageViewCompat$Api21Impl;->setImageTintList(Landroid/widget/ImageView;Landroid/content/res/ColorStateList;)V Landroidx/core/widget/TextViewCompat; +SPLandroidx/core/widget/TextViewCompat;->setLineHeight(Landroid/widget/TextView;I)V SPLandroidx/core/widget/TextViewCompat;->setTextAppearance(Landroid/widget/TextView;I)V Landroidx/core/widget/TintableCheckedTextView; Landroidx/core/widget/TintableCompoundDrawablesView; @@ -2273,6 +2540,7 @@ SPLandroidx/customview/widget/ViewDragHelper;->continueSettling(Z)Z SPLandroidx/customview/widget/ViewDragHelper;->create(Landroid/view/ViewGroup;FLandroidx/customview/widget/ViewDragHelper$Callback;)Landroidx/customview/widget/ViewDragHelper; SPLandroidx/customview/widget/ViewDragHelper;->create(Landroid/view/ViewGroup;Landroidx/customview/widget/ViewDragHelper$Callback;)Landroidx/customview/widget/ViewDragHelper; SPLandroidx/customview/widget/ViewDragHelper;->getDefaultEdgeSize()I +SPLandroidx/customview/widget/ViewDragHelper;->requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object; SPLandroidx/customview/widget/ViewDragHelper;->setEdgeSize(I)V SPLandroidx/customview/widget/ViewDragHelper;->setEdgeTrackingEnabled(I)V SPLandroidx/customview/widget/ViewDragHelper;->setMinVelocity(F)V @@ -2280,6 +2548,8 @@ Landroidx/customview/widget/ViewDragHelper$1; SPLandroidx/customview/widget/ViewDragHelper$1;->()V Landroidx/customview/widget/ViewDragHelper$2; SPLandroidx/customview/widget/ViewDragHelper$2;->(Landroidx/customview/widget/ViewDragHelper;)V +Landroidx/customview/widget/ViewDragHelper$3; +SPLandroidx/customview/widget/ViewDragHelper$3;->(Landroidx/customview/widget/ViewDragHelper;)V Landroidx/customview/widget/ViewDragHelper$Callback; SPLandroidx/customview/widget/ViewDragHelper$Callback;->()V Landroidx/draganddrop/DropAffordanceHighlighter; @@ -2320,6 +2590,7 @@ Landroidx/drawerlayout/R$attr; Landroidx/drawerlayout/R$styleable; SPLandroidx/drawerlayout/R$styleable;->()V Landroidx/drawerlayout/widget/ClosableDrawerLayout; +SPLandroidx/drawerlayout/widget/ClosableDrawerLayout;->()V SPLandroidx/drawerlayout/widget/ClosableDrawerLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V SPLandroidx/drawerlayout/widget/ClosableDrawerLayout;->setAnimationEnabled(Z)V Landroidx/drawerlayout/widget/DrawerLayout; @@ -2342,22 +2613,15 @@ SPLandroidx/drawerlayout/widget/DrawerLayout;->isDrawerOpen(I)Z SPLandroidx/drawerlayout/widget/DrawerLayout;->isDrawerOpen(Landroid/view/View;)Z SPLandroidx/drawerlayout/widget/DrawerLayout;->isDrawerView(Landroid/view/View;)Z SPLandroidx/drawerlayout/widget/DrawerLayout;->onAttachedToWindow()V -SPLandroidx/drawerlayout/widget/DrawerLayout;->onDraw(Landroid/graphics/Canvas;)V SPLandroidx/drawerlayout/widget/DrawerLayout;->onLayout(ZIIII)V SPLandroidx/drawerlayout/widget/DrawerLayout;->onMeasure(II)V SPLandroidx/drawerlayout/widget/DrawerLayout;->onRtlPropertiesChanged(I)V SPLandroidx/drawerlayout/widget/DrawerLayout;->removeDrawerListener(Landroidx/drawerlayout/widget/DrawerLayout$DrawerListener;)V SPLandroidx/drawerlayout/widget/DrawerLayout;->requestLayout()V SPLandroidx/drawerlayout/widget/DrawerLayout;->resolveShadowDrawables()V -SPLandroidx/drawerlayout/widget/DrawerLayout;->setChildInsets(Ljava/lang/Object;Z)V -SPLandroidx/drawerlayout/widget/DrawerLayout;->setDrawerShadow(II)V -SPLandroidx/drawerlayout/widget/DrawerLayout;->setDrawerShadow(Landroid/graphics/drawable/Drawable;I)V SPLandroidx/drawerlayout/widget/DrawerLayout;->setStatusBarBackgroundColor(I)V Landroidx/drawerlayout/widget/DrawerLayout$1; SPLandroidx/drawerlayout/widget/DrawerLayout$1;->(Landroidx/drawerlayout/widget/DrawerLayout;)V -Landroidx/drawerlayout/widget/DrawerLayout$2; -SPLandroidx/drawerlayout/widget/DrawerLayout$2;->(Landroidx/drawerlayout/widget/DrawerLayout;)V -SPLandroidx/drawerlayout/widget/DrawerLayout$2;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; Landroidx/drawerlayout/widget/DrawerLayout$AccessibilityDelegate; SPLandroidx/drawerlayout/widget/DrawerLayout$AccessibilityDelegate;->(Landroidx/drawerlayout/widget/DrawerLayout;)V SPLandroidx/drawerlayout/widget/DrawerLayout$AccessibilityDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V @@ -2423,6 +2687,7 @@ Landroidx/dynamicanimation/animation/DynamicAnimation$9; SPLandroidx/dynamicanimation/animation/DynamicAnimation$9;->(Ljava/lang/String;)V Landroidx/dynamicanimation/animation/DynamicAnimation$MassState; SPLandroidx/dynamicanimation/animation/DynamicAnimation$MassState;->()V +Landroidx/dynamicanimation/animation/DynamicAnimation$OnAnimationEndListener; Landroidx/dynamicanimation/animation/DynamicAnimation$ViewProperty; SPLandroidx/dynamicanimation/animation/DynamicAnimation$ViewProperty;->(Ljava/lang/String;)V SPLandroidx/dynamicanimation/animation/DynamicAnimation$ViewProperty;->(Ljava/lang/String;Landroidx/dynamicanimation/animation/DynamicAnimation$1;)V @@ -2433,6 +2698,7 @@ Landroidx/dynamicanimation/animation/FrameCallbackScheduler; Landroidx/dynamicanimation/animation/SpringAnimation; SPLandroidx/dynamicanimation/animation/SpringAnimation;->(Ljava/lang/Object;Landroidx/dynamicanimation/animation/FloatPropertyCompat;)V SPLandroidx/dynamicanimation/animation/SpringAnimation;->canSkipToEnd()Z +SPLandroidx/dynamicanimation/animation/SpringAnimation;->getSpring()Landroidx/dynamicanimation/animation/SpringForce; SPLandroidx/dynamicanimation/animation/SpringAnimation;->setSpring(Landroidx/dynamicanimation/animation/SpringForce;)Landroidx/dynamicanimation/animation/SpringAnimation; SPLandroidx/dynamicanimation/animation/SpringAnimation;->skipToEnd()V Landroidx/dynamicanimation/animation/SpringForce; @@ -2612,8 +2878,8 @@ SPLandroidx/emoji2/text/MetadataRepo;->getRootNode()Landroidx/emoji2/text/Metada SPLandroidx/emoji2/text/MetadataRepo;->put(Landroidx/emoji2/text/TypefaceEmojiRasterizer;)V Landroidx/emoji2/text/MetadataRepo$Node; SPLandroidx/emoji2/text/MetadataRepo$Node;->()V -HSPLandroidx/emoji2/text/MetadataRepo$Node;->(I)V -HSPLandroidx/emoji2/text/MetadataRepo$Node;->get(I)Landroidx/emoji2/text/MetadataRepo$Node; +SPLandroidx/emoji2/text/MetadataRepo$Node;->(I)V +SPLandroidx/emoji2/text/MetadataRepo$Node;->get(I)Landroidx/emoji2/text/MetadataRepo$Node; SPLandroidx/emoji2/text/MetadataRepo$Node;->getData()Landroidx/emoji2/text/TypefaceEmojiRasterizer; SPLandroidx/emoji2/text/MetadataRepo$Node;->put(Landroidx/emoji2/text/TypefaceEmojiRasterizer;II)V Landroidx/emoji2/text/SpannableBuilder; @@ -2628,17 +2894,17 @@ SPLandroidx/emoji2/text/SpannableBuilder;->removeSpan(Ljava/lang/Object;)V SPLandroidx/emoji2/text/SpannableBuilder;->setSpan(Ljava/lang/Object;III)V Landroidx/emoji2/text/TypefaceEmojiRasterizer; SPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->()V -SPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->(Landroidx/emoji2/text/MetadataRepo;I)V -HSPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getCodepointAt(I)I +HSPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->(Landroidx/emoji2/text/MetadataRepo;I)V +SPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getCodepointAt(I)I SPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getCodepointsLength()I SPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getId()I -SPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getMetadataItem()Landroidx/emoji2/text/flatbuffer/MetadataItem; +HSPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getMetadataItem()Landroidx/emoji2/text/flatbuffer/MetadataItem; SPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->isDefaultEmoji()Z Landroidx/emoji2/text/UnprecomputeTextOnModificationSpannable; Landroidx/emoji2/text/flatbuffer/MetadataItem; SPLandroidx/emoji2/text/flatbuffer/MetadataItem;->()V -SPLandroidx/emoji2/text/flatbuffer/MetadataItem;->__assign(ILjava/nio/ByteBuffer;)Landroidx/emoji2/text/flatbuffer/MetadataItem; -SPLandroidx/emoji2/text/flatbuffer/MetadataItem;->__init(ILjava/nio/ByteBuffer;)V +HSPLandroidx/emoji2/text/flatbuffer/MetadataItem;->__assign(ILjava/nio/ByteBuffer;)Landroidx/emoji2/text/flatbuffer/MetadataItem; +HSPLandroidx/emoji2/text/flatbuffer/MetadataItem;->__init(ILjava/nio/ByteBuffer;)V SPLandroidx/emoji2/text/flatbuffer/MetadataItem;->codepoints(I)I SPLandroidx/emoji2/text/flatbuffer/MetadataItem;->codepointsLength()I SPLandroidx/emoji2/text/flatbuffer/MetadataItem;->emojiStyle()Z @@ -2654,7 +2920,7 @@ SPLandroidx/emoji2/text/flatbuffer/MetadataList;->listLength()I Landroidx/emoji2/text/flatbuffer/Table; SPLandroidx/emoji2/text/flatbuffer/Table;->()V HSPLandroidx/emoji2/text/flatbuffer/Table;->__indirect(I)I -SPLandroidx/emoji2/text/flatbuffer/Table;->__offset(I)I +HSPLandroidx/emoji2/text/flatbuffer/Table;->__offset(I)I SPLandroidx/emoji2/text/flatbuffer/Table;->__reset(ILjava/nio/ByteBuffer;)V HSPLandroidx/emoji2/text/flatbuffer/Table;->__vector(I)I SPLandroidx/emoji2/text/flatbuffer/Table;->__vector_len(I)I @@ -2686,6 +2952,7 @@ Landroidx/emoji2/viewsintegration/EmojiInputFilter$InitCallbackImpl; SPLandroidx/emoji2/viewsintegration/EmojiInputFilter$InitCallbackImpl;->(Landroid/widget/TextView;Landroidx/emoji2/viewsintegration/EmojiInputFilter;)V SPLandroidx/emoji2/viewsintegration/EmojiInputFilter$InitCallbackImpl;->isInputFilterCurrentlyRegisteredOnTextView(Landroid/widget/TextView;Landroid/text/InputFilter;)Z SPLandroidx/emoji2/viewsintegration/EmojiInputFilter$InitCallbackImpl;->onInitialized()V +SPLandroidx/emoji2/viewsintegration/EmojiInputFilter$InitCallbackImpl;->run()V Landroidx/emoji2/viewsintegration/EmojiKeyListener; SPLandroidx/emoji2/viewsintegration/EmojiKeyListener;->(Landroid/text/method/KeyListener;)V SPLandroidx/emoji2/viewsintegration/EmojiKeyListener;->(Landroid/text/method/KeyListener;Landroidx/emoji2/viewsintegration/EmojiKeyListener$EmojiCompatHandleKeyDownHelper;)V @@ -2719,11 +2986,12 @@ Landroidx/emoji2/viewsintegration/EmojiTextWatcher; SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->(Landroid/widget/EditText;Z)V SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->afterTextChanged(Landroid/text/Editable;)V SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->beforeTextChanged(Ljava/lang/CharSequence;III)V +SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->getInitCallback()Landroidx/emoji2/text/EmojiCompat$InitCallback; SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->onTextChanged(Ljava/lang/CharSequence;III)V -SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->processTextOnEnablingEvent(Landroid/widget/EditText;I)V SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->setEnabled(Z)V SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->shouldSkipForDisabledOrNotConfigured()Z Landroidx/emoji2/viewsintegration/EmojiTextWatcher$InitCallbackImpl; +SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher$InitCallbackImpl;->(Landroid/widget/EditText;)V SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher$InitCallbackImpl;->onInitialized()V Landroidx/emoji2/viewsintegration/EmojiTransformationMethod; SPLandroidx/emoji2/viewsintegration/EmojiTransformationMethod;->(Landroid/text/method/TransformationMethod;)V @@ -2742,6 +3010,7 @@ SPLandroidx/fragment/app/BackStackRecord;->generateOps(Ljava/util/ArrayList;Ljav SPLandroidx/fragment/app/BackStackRecord;->runOnCommitRunnables()V Landroidx/fragment/app/DefaultSpecialEffectsController; SPLandroidx/fragment/app/DefaultSpecialEffectsController;->(Landroid/view/ViewGroup;)V +Landroidx/fragment/app/DialogFragment; Landroidx/fragment/app/Fragment; SPLandroidx/fragment/app/Fragment;->()V SPLandroidx/fragment/app/Fragment;->()V @@ -2767,7 +3036,25 @@ SPLandroidx/fragment/app/Fragment;->getViewModelStore()Landroidx/lifecycle/ViewM SPLandroidx/fragment/app/Fragment;->initLifecycle()V SPLandroidx/fragment/app/Fragment;->initState()V SPLandroidx/fragment/app/Fragment;->instantiate(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/fragment/app/Fragment; -SPLandroidx/fragment/app/Fragment;->lambda$performCreateView$0$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performActivityCreated$8$androidx-fragment-app-Fragment(Landroid/os/Bundle;)V +SPLandroidx/fragment/app/Fragment;->lambda$performAttach$2$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performCreate$3$androidx-fragment-app-Fragment(Landroid/os/Bundle;)V +SPLandroidx/fragment/app/Fragment;->lambda$performCreate$4$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performCreateView$5$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performCreateView$6$androidx-fragment-app-Fragment(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)V +SPLandroidx/fragment/app/Fragment;->lambda$performDestroy$19$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performDestroyView$18$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performPause$14$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performPause$15$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performResume$11$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performResume$12$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performStart$10$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performStart$9$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performStop$16$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performStop$17$androidx-fragment-app-Fragment()V +SPLandroidx/fragment/app/Fragment;->lambda$performViewCreated$7$androidx-fragment-app-Fragment(Landroid/os/Bundle;)V +SPLandroidx/fragment/app/Fragment;->lambda$restoreViewState$0$androidx-fragment-app-Fragment(Landroid/os/Bundle;)V +SPLandroidx/fragment/app/Fragment;->lambda$restoreViewState$1$androidx-fragment-app-Fragment()V SPLandroidx/fragment/app/Fragment;->noteStateNotSaved()V SPLandroidx/fragment/app/Fragment;->onActivityCreated(Landroid/os/Bundle;)V SPLandroidx/fragment/app/Fragment;->onAttach(Landroid/app/Activity;)V @@ -2814,21 +3101,99 @@ SPLandroidx/fragment/app/Fragment;->setSharedElementNames(Ljava/util/ArrayList;L Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda0; SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda0;->(Landroidx/fragment/app/Fragment;)V SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda0;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda1; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda1;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda1;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda10; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda10;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda10;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda11; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda11;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda11;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda12; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda12;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda12;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda13; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda13;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda13;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda14; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda14;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda14;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda15; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda15;->(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda15;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda16; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda16;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda16;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda17; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda17;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda17;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda18; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda18;->(Landroidx/fragment/app/Fragment;Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda18;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda19; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda19;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda19;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda2; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda2;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda2;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda20; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda20;->(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda20;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda21; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda21;->(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda21;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda22; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda22;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda22;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda23; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda23;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda23;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda24; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda24;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda24;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda25; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda25;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda25;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda26; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda26;->(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda26;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda3; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda3;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda3;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda4; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda4;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda4;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda6; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda6;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda6;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda7; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda7;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda7;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda8; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda8;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda8;->run()V +Landroidx/fragment/app/Fragment$$ExternalSyntheticLambda9; +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda9;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$$ExternalSyntheticLambda9;->run()V Landroidx/fragment/app/Fragment$1; SPLandroidx/fragment/app/Fragment$1;->(Landroidx/fragment/app/Fragment;)V Landroidx/fragment/app/Fragment$2; SPLandroidx/fragment/app/Fragment$2;->(Landroidx/fragment/app/Fragment;)V SPLandroidx/fragment/app/Fragment$2;->onPreAttached()V -Landroidx/fragment/app/Fragment$5; -SPLandroidx/fragment/app/Fragment$5;->(Landroidx/fragment/app/Fragment;)V +Landroidx/fragment/app/Fragment$3; +SPLandroidx/fragment/app/Fragment$3;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$3;->onPreAttached()V Landroidx/fragment/app/Fragment$6; SPLandroidx/fragment/app/Fragment$6;->(Landroidx/fragment/app/Fragment;)V -SPLandroidx/fragment/app/Fragment$6;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/fragment/app/Fragment$7; +SPLandroidx/fragment/app/Fragment$7;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/Fragment$7;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V Landroidx/fragment/app/Fragment$AnimationInfo; SPLandroidx/fragment/app/Fragment$AnimationInfo;->()V Landroidx/fragment/app/Fragment$OnPreAttachedListener; SPLandroidx/fragment/app/Fragment$OnPreAttachedListener;->()V -SPLandroidx/fragment/app/Fragment$OnPreAttachedListener;->(Landroidx/fragment/app/Fragment$1;)V +SPLandroidx/fragment/app/Fragment$OnPreAttachedListener;->(Landroidx/fragment/app/Fragment-IA;)V Landroidx/fragment/app/FragmentActivity; SPLandroidx/fragment/app/FragmentActivity;->(I)V SPLandroidx/fragment/app/FragmentActivity;->dispatchFragmentsOnCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; @@ -2886,8 +3251,10 @@ Landroidx/fragment/app/FragmentContainerView; SPLandroidx/fragment/app/FragmentContainerView;->(Landroid/content/Context;Landroid/util/AttributeSet;Landroidx/fragment/app/FragmentManager;)V SPLandroidx/fragment/app/FragmentContainerView;->addDisappearingFragmentView(Landroid/view/View;)V SPLandroidx/fragment/app/FragmentContainerView;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V +SPLandroidx/fragment/app/FragmentContainerView;->dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; SPLandroidx/fragment/app/FragmentContainerView;->dispatchDraw(Landroid/graphics/Canvas;)V SPLandroidx/fragment/app/FragmentContainerView;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z +SPLandroidx/fragment/app/FragmentContainerView;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; SPLandroidx/fragment/app/FragmentContainerView;->removeView(Landroid/view/View;)V SPLandroidx/fragment/app/FragmentContainerView;->setDrawDisappearingViewsLast(Z)V Landroidx/fragment/app/FragmentController; @@ -2943,10 +3310,10 @@ Landroidx/fragment/app/FragmentLifecycleCallbacksDispatcher$FragmentLifecycleCal SPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher$FragmentLifecycleCallbacksHolder;->(Landroidx/fragment/app/FragmentManager$FragmentLifecycleCallbacks;Z)V SPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher$FragmentLifecycleCallbacksHolder;->getCallback()Landroidx/fragment/app/FragmentManager$FragmentLifecycleCallbacks; Landroidx/fragment/app/FragmentManager; +SPLandroidx/fragment/app/FragmentManager;->-$$Nest$fgetmResultListeners(Landroidx/fragment/app/FragmentManager;)Ljava/util/Map; +SPLandroidx/fragment/app/FragmentManager;->-$$Nest$fgetmResults(Landroidx/fragment/app/FragmentManager;)Ljava/util/Map; SPLandroidx/fragment/app/FragmentManager;->()V SPLandroidx/fragment/app/FragmentManager;->()V -SPLandroidx/fragment/app/FragmentManager;->access$100(Landroidx/fragment/app/FragmentManager;)Ljava/util/Map; -SPLandroidx/fragment/app/FragmentManager;->access$200(Landroidx/fragment/app/FragmentManager;)Ljava/util/Map; SPLandroidx/fragment/app/FragmentManager;->addFragment(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentStateManager; SPLandroidx/fragment/app/FragmentManager;->addFragmentOnAttachListener(Landroidx/fragment/app/FragmentOnAttachListener;)V SPLandroidx/fragment/app/FragmentManager;->attachController(Landroidx/fragment/app/FragmentHostCallback;Landroidx/fragment/app/FragmentContainer;Landroidx/fragment/app/Fragment;)V @@ -2979,6 +3346,7 @@ SPLandroidx/fragment/app/FragmentManager;->execSingleAction(Landroidx/fragment/a SPLandroidx/fragment/app/FragmentManager;->executeOps(Ljava/util/ArrayList;Ljava/util/ArrayList;II)V SPLandroidx/fragment/app/FragmentManager;->executeOpsTogether(Ljava/util/ArrayList;Ljava/util/ArrayList;II)V SPLandroidx/fragment/app/FragmentManager;->findFragmentById(I)Landroidx/fragment/app/Fragment; +SPLandroidx/fragment/app/FragmentManager;->findFragmentByTag(Ljava/lang/String;)Landroidx/fragment/app/Fragment; SPLandroidx/fragment/app/FragmentManager;->findViewFragment(Landroid/view/View;)Landroidx/fragment/app/Fragment; SPLandroidx/fragment/app/FragmentManager;->generateOpsForPendingActions(Ljava/util/ArrayList;Ljava/util/ArrayList;)Z SPLandroidx/fragment/app/FragmentManager;->getBackStackEntryCount()I @@ -3116,6 +3484,7 @@ SPLandroidx/fragment/app/FragmentStore;->burpActive()V SPLandroidx/fragment/app/FragmentStore;->containsActiveFragment(Ljava/lang/String;)Z SPLandroidx/fragment/app/FragmentStore;->dispatchStateChange(I)V SPLandroidx/fragment/app/FragmentStore;->findFragmentById(I)Landroidx/fragment/app/Fragment; +SPLandroidx/fragment/app/FragmentStore;->findFragmentByTag(Ljava/lang/String;)Landroidx/fragment/app/Fragment; SPLandroidx/fragment/app/FragmentStore;->findFragmentIndexInContainer(Landroidx/fragment/app/Fragment;)I SPLandroidx/fragment/app/FragmentStore;->getActiveFragmentStateManagers()Ljava/util/List; SPLandroidx/fragment/app/FragmentStore;->getActiveFragments()Ljava/util/List; @@ -3127,6 +3496,9 @@ SPLandroidx/fragment/app/FragmentStore;->makeInactive(Landroidx/fragment/app/Fra SPLandroidx/fragment/app/FragmentStore;->moveToExpectedState()V SPLandroidx/fragment/app/FragmentStore;->setNonConfig(Landroidx/fragment/app/FragmentManagerViewModel;)V SPLandroidx/fragment/app/FragmentStore;->setSavedState(Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle; +Landroidx/fragment/app/FragmentTracer; +SPLandroidx/fragment/app/FragmentTracer;->(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/FragmentTracer;->trace(Ljava/lang/String;Ljava/lang/Runnable;)V Landroidx/fragment/app/FragmentTransaction; SPLandroidx/fragment/app/FragmentTransaction;->(Landroidx/fragment/app/FragmentFactory;Ljava/lang/ClassLoader;)V SPLandroidx/fragment/app/FragmentTransaction;->add(ILandroidx/fragment/app/Fragment;Ljava/lang/String;)Landroidx/fragment/app/FragmentTransaction; @@ -3147,12 +3519,12 @@ SPLandroidx/fragment/app/FragmentViewLifecycleOwner;->performRestore(Landroid/os SPLandroidx/fragment/app/FragmentViewLifecycleOwner;->performSave(Landroid/os/Bundle;)V SPLandroidx/fragment/app/FragmentViewLifecycleOwner;->setCurrentState(Landroidx/lifecycle/Lifecycle$State;)V Landroidx/fragment/app/SpecialEffectsController; -SPLandroidx/fragment/app/SpecialEffectsController;->$r8$lambda$TeCmoVW0hctjg0BNHLP6mPbAs5U(Landroidx/fragment/app/SpecialEffectsController;Landroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;)V -SPLandroidx/fragment/app/SpecialEffectsController;->$r8$lambda$ahdwWRJghvCwX2xG1GsepYfILrY(Landroidx/fragment/app/SpecialEffectsController;Landroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;)V +SPLandroidx/fragment/app/SpecialEffectsController;->$r8$lambda$1mA-Pl_YYgabeWyXepVIg50-pdw(Landroidx/fragment/app/SpecialEffectsController;Landroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;)V +SPLandroidx/fragment/app/SpecialEffectsController;->$r8$lambda$WWs1PUTSh7Jll0tICvJh6oZeEfQ(Landroidx/fragment/app/SpecialEffectsController;Landroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;)V SPLandroidx/fragment/app/SpecialEffectsController;->()V SPLandroidx/fragment/app/SpecialEffectsController;->(Landroid/view/ViewGroup;)V -SPLandroidx/fragment/app/SpecialEffectsController;->enqueue$lambda$4$lambda$2(Landroidx/fragment/app/SpecialEffectsController;Landroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;)V -SPLandroidx/fragment/app/SpecialEffectsController;->enqueue$lambda$4$lambda$3(Landroidx/fragment/app/SpecialEffectsController;Landroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;)V +SPLandroidx/fragment/app/SpecialEffectsController;->enqueue$lambda$0$0(Landroidx/fragment/app/SpecialEffectsController;Landroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;)V +SPLandroidx/fragment/app/SpecialEffectsController;->enqueue$lambda$0$1(Landroidx/fragment/app/SpecialEffectsController;Landroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;)V SPLandroidx/fragment/app/SpecialEffectsController;->enqueue(Landroidx/fragment/app/SpecialEffectsController$Operation$State;Landroidx/fragment/app/SpecialEffectsController$Operation$LifecycleImpact;Landroidx/fragment/app/FragmentStateManager;)V SPLandroidx/fragment/app/SpecialEffectsController;->enqueueAdd(Landroidx/fragment/app/SpecialEffectsController$Operation$State;Landroidx/fragment/app/FragmentStateManager;)V SPLandroidx/fragment/app/SpecialEffectsController;->enqueueRemove(Landroidx/fragment/app/FragmentStateManager;)V @@ -3180,14 +3552,14 @@ SPLandroidx/fragment/app/SpecialEffectsController$Companion;->getOrCreateControl SPLandroidx/fragment/app/SpecialEffectsController$Companion;->getOrCreateController(Landroid/view/ViewGroup;Landroidx/fragment/app/SpecialEffectsControllerFactory;)Landroidx/fragment/app/SpecialEffectsController; Landroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation; SPLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;->(Landroidx/fragment/app/SpecialEffectsController$Operation$State;Landroidx/fragment/app/SpecialEffectsController$Operation$LifecycleImpact;Landroidx/fragment/app/FragmentStateManager;)V -SPLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;->complete$fragment_release()V +SPLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;->complete$fragment()V SPLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;->onStart()V Landroidx/fragment/app/SpecialEffectsController$Operation; SPLandroidx/fragment/app/SpecialEffectsController$Operation;->(Landroidx/fragment/app/SpecialEffectsController$Operation$State;Landroidx/fragment/app/SpecialEffectsController$Operation$LifecycleImpact;Landroidx/fragment/app/Fragment;)V SPLandroidx/fragment/app/SpecialEffectsController$Operation;->addCompletionListener(Ljava/lang/Runnable;)V SPLandroidx/fragment/app/SpecialEffectsController$Operation;->cancel(Landroid/view/ViewGroup;)V -SPLandroidx/fragment/app/SpecialEffectsController$Operation;->complete$fragment_release()V -SPLandroidx/fragment/app/SpecialEffectsController$Operation;->getEffects$fragment_release()Ljava/util/List; +SPLandroidx/fragment/app/SpecialEffectsController$Operation;->complete$fragment()V +SPLandroidx/fragment/app/SpecialEffectsController$Operation;->getEffects$fragment()Ljava/util/List; SPLandroidx/fragment/app/SpecialEffectsController$Operation;->getFinalState()Landroidx/fragment/app/SpecialEffectsController$Operation$State; SPLandroidx/fragment/app/SpecialEffectsController$Operation;->getFragment()Landroidx/fragment/app/Fragment; SPLandroidx/fragment/app/SpecialEffectsController$Operation;->getLifecycleImpact()Landroidx/fragment/app/SpecialEffectsController$Operation$LifecycleImpact; @@ -3195,7 +3567,7 @@ SPLandroidx/fragment/app/SpecialEffectsController$Operation;->isCanceled()Z SPLandroidx/fragment/app/SpecialEffectsController$Operation;->isStarted()Z SPLandroidx/fragment/app/SpecialEffectsController$Operation;->mergeWith(Landroidx/fragment/app/SpecialEffectsController$Operation$State;Landroidx/fragment/app/SpecialEffectsController$Operation$LifecycleImpact;)V SPLandroidx/fragment/app/SpecialEffectsController$Operation;->onStart()V -SPLandroidx/fragment/app/SpecialEffectsController$Operation;->setSeeking$fragment_release(Z)V +SPLandroidx/fragment/app/SpecialEffectsController$Operation;->setSeeking$fragment(Z)V Landroidx/fragment/app/SpecialEffectsController$Operation$LifecycleImpact; SPLandroidx/fragment/app/SpecialEffectsController$Operation$LifecycleImpact;->$values()[Landroidx/fragment/app/SpecialEffectsController$Operation$LifecycleImpact; SPLandroidx/fragment/app/SpecialEffectsController$Operation$LifecycleImpact;->()V @@ -3237,8 +3609,6 @@ Landroidx/lifecycle/AtomicReference; SPLandroidx/lifecycle/AtomicReference;->(Ljava/lang/Object;)V SPLandroidx/lifecycle/AtomicReference;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z SPLandroidx/lifecycle/AtomicReference;->get()Ljava/lang/Object; -Landroidx/lifecycle/AtomicReference$$ExternalSyntheticBackportWithForwarding0; -SPLandroidx/lifecycle/AtomicReference$$ExternalSyntheticBackportWithForwarding0;->m(Ljava/util/concurrent/atomic/AtomicReference;Ljava/lang/Object;Ljava/lang/Object;)Z Landroidx/lifecycle/DefaultLifecycleObserver; SPLandroidx/lifecycle/DefaultLifecycleObserver;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V SPLandroidx/lifecycle/DefaultLifecycleObserver;->onResume(Landroidx/lifecycle/LifecycleOwner;)V @@ -3256,6 +3626,28 @@ SPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityPaused(Landroi SPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V SPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V SPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStopped(Landroid/app/Activity;)V +Landroidx/lifecycle/FastSafeIterableMap; +SPLandroidx/lifecycle/FastSafeIterableMap;->()V +SPLandroidx/lifecycle/FastSafeIterableMap;->ceil(Ljava/lang/Object;)Ljava/util/Map$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap;->contains(Ljava/lang/Object;)Z +SPLandroidx/lifecycle/FastSafeIterableMap;->first()Ljava/util/Map$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap;->forEachReversed(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/lifecycle/FastSafeIterableMap;->forEachWithAdditions(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/lifecycle/FastSafeIterableMap;->last()Ljava/util/Map$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap;->lastOrNull()Ljava/util/Map$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/lifecycle/FastSafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/lifecycle/FastSafeIterableMap;->size()I +Landroidx/lifecycle/FastSafeIterableMap$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->(Ljava/lang/Object;Ljava/lang/Object;)V +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->getKey()Ljava/lang/Object; +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->getNext()Landroidx/lifecycle/FastSafeIterableMap$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->getPrev()Landroidx/lifecycle/FastSafeIterableMap$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->getValue()Ljava/lang/Object; +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->isRemoved()Z +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->markRemoved()V +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->setNext(Landroidx/lifecycle/FastSafeIterableMap$Entry;)V +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->setPrev(Landroidx/lifecycle/FastSafeIterableMap$Entry;)V Landroidx/lifecycle/FlowExtKt; SPLandroidx/lifecycle/FlowExtKt;->flowWithLifecycle$default(Lkotlinx/coroutines/flow/Flow;Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; SPLandroidx/lifecycle/FlowExtKt;->flowWithLifecycle(Lkotlinx/coroutines/flow/Flow;Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;)Lkotlinx/coroutines/flow/Flow; @@ -3331,29 +3723,37 @@ SPLandroidx/lifecycle/LifecycleRegistry;->()V SPLandroidx/lifecycle/LifecycleRegistry;->(Landroidx/lifecycle/LifecycleOwner;)V SPLandroidx/lifecycle/LifecycleRegistry;->(Landroidx/lifecycle/LifecycleOwner;Z)V SPLandroidx/lifecycle/LifecycleRegistry;->addObserver(Landroidx/lifecycle/LifecycleObserver;)V +SPLandroidx/lifecycle/LifecycleRegistry;->backwardPass$lambda$0(Landroidx/lifecycle/LifecycleRegistry;Landroidx/lifecycle/LifecycleOwner;Ljava/util/Map$Entry;)Lkotlin/Unit; SPLandroidx/lifecycle/LifecycleRegistry;->backwardPass(Landroidx/lifecycle/LifecycleOwner;)V SPLandroidx/lifecycle/LifecycleRegistry;->calculateTargetState(Landroidx/lifecycle/LifecycleObserver;)Landroidx/lifecycle/Lifecycle$State; SPLandroidx/lifecycle/LifecycleRegistry;->enforceMainThreadIfNeeded(Ljava/lang/String;)V +SPLandroidx/lifecycle/LifecycleRegistry;->forwardPass$lambda$0(Landroidx/lifecycle/LifecycleRegistry;Landroidx/lifecycle/LifecycleOwner;Ljava/util/Map$Entry;)Lkotlin/Unit; SPLandroidx/lifecycle/LifecycleRegistry;->forwardPass(Landroidx/lifecycle/LifecycleOwner;)V SPLandroidx/lifecycle/LifecycleRegistry;->getCurrentState()Landroidx/lifecycle/Lifecycle$State; SPLandroidx/lifecycle/LifecycleRegistry;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V SPLandroidx/lifecycle/LifecycleRegistry;->isSynced()Z SPLandroidx/lifecycle/LifecycleRegistry;->moveToState(Landroidx/lifecycle/Lifecycle$State;)V -SPLandroidx/lifecycle/LifecycleRegistry;->popParentState()V -SPLandroidx/lifecycle/LifecycleRegistry;->pushParentState(Landroidx/lifecycle/Lifecycle$State;)V SPLandroidx/lifecycle/LifecycleRegistry;->removeObserver(Landroidx/lifecycle/LifecycleObserver;)V SPLandroidx/lifecycle/LifecycleRegistry;->setCurrentState(Landroidx/lifecycle/Lifecycle$State;)V SPLandroidx/lifecycle/LifecycleRegistry;->sync()V +Landroidx/lifecycle/LifecycleRegistry$$ExternalSyntheticLambda0; +SPLandroidx/lifecycle/LifecycleRegistry$$ExternalSyntheticLambda0;->(Landroidx/lifecycle/LifecycleRegistry;Landroidx/lifecycle/LifecycleOwner;)V +SPLandroidx/lifecycle/LifecycleRegistry$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/lifecycle/LifecycleRegistry$$ExternalSyntheticLambda1; +SPLandroidx/lifecycle/LifecycleRegistry$$ExternalSyntheticLambda1;->(Landroidx/lifecycle/LifecycleRegistry;Landroidx/lifecycle/LifecycleOwner;)V +SPLandroidx/lifecycle/LifecycleRegistry$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/lifecycle/LifecycleRegistry$Companion; SPLandroidx/lifecycle/LifecycleRegistry$Companion;->()V SPLandroidx/lifecycle/LifecycleRegistry$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -SPLandroidx/lifecycle/LifecycleRegistry$Companion;->min$lifecycle_runtime(Landroidx/lifecycle/Lifecycle$State;Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$State; Landroidx/lifecycle/LifecycleRegistry$ObserverWithState; SPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->(Landroidx/lifecycle/LifecycleObserver;Landroidx/lifecycle/Lifecycle$State;)V SPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->dispatchEvent(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V SPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->getState()Landroidx/lifecycle/Lifecycle$State; Landroidx/lifecycle/LifecycleRegistryKt; +SPLandroidx/lifecycle/LifecycleRegistryKt;->access$checkLifecycleStateTransition(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$State;Landroidx/lifecycle/Lifecycle$State;)V +SPLandroidx/lifecycle/LifecycleRegistryKt;->access$min(Landroidx/lifecycle/Lifecycle$State;Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$State; SPLandroidx/lifecycle/LifecycleRegistryKt;->checkLifecycleStateTransition(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$State;Landroidx/lifecycle/Lifecycle$State;)V +SPLandroidx/lifecycle/LifecycleRegistryKt;->min(Landroidx/lifecycle/Lifecycle$State;Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$State; Landroidx/lifecycle/LifecycleRegistryOwner; Landroidx/lifecycle/LifecycleRegistry_androidKt; SPLandroidx/lifecycle/LifecycleRegistry_androidKt;->isMainThread()Z @@ -3430,6 +3830,7 @@ Landroidx/lifecycle/ProcessLifecycleOwner$initializationListener$1; SPLandroidx/lifecycle/ProcessLifecycleOwner$initializationListener$1;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V Landroidx/lifecycle/RepeatOnLifecycleKt; SPLandroidx/lifecycle/RepeatOnLifecycleKt;->repeatOnLifecycle(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/lifecycle/RepeatOnLifecycleKt;->repeatOnLifecycle(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3; SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3;->(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; @@ -3494,12 +3895,22 @@ SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion;->()V SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion;->registerIn(Landroid/app/Activity;)V Landroidx/lifecycle/SavedStateHandle; +SPLandroidx/lifecycle/SavedStateHandle;->()V +SPLandroidx/lifecycle/SavedStateHandle;->(Ljava/util/Map;)V +SPLandroidx/lifecycle/SavedStateHandle;->getMutableStateFlow(Ljava/lang/String;Ljava/lang/Object;)Lkotlinx/coroutines/flow/MutableStateFlow; +Landroidx/lifecycle/SavedStateHandle$Companion; +SPLandroidx/lifecycle/SavedStateHandle$Companion;->()V +SPLandroidx/lifecycle/SavedStateHandle$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/lifecycle/SavedStateHandle$Companion;->createHandle(Landroid/os/Bundle;Landroid/os/Bundle;)Landroidx/lifecycle/SavedStateHandle; Landroidx/lifecycle/SavedStateHandleAttacher; SPLandroidx/lifecycle/SavedStateHandleAttacher;->(Landroidx/lifecycle/SavedStateHandlesProvider;)V SPLandroidx/lifecycle/SavedStateHandleAttacher;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V Landroidx/lifecycle/SavedStateHandleSupport; SPLandroidx/lifecycle/SavedStateHandleSupport;->()V +SPLandroidx/lifecycle/SavedStateHandleSupport;->createSavedStateHandle(Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/SavedStateHandle; +SPLandroidx/lifecycle/SavedStateHandleSupport;->createSavedStateHandle(Landroidx/savedstate/SavedStateRegistryOwner;Landroidx/lifecycle/ViewModelStoreOwner;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/lifecycle/SavedStateHandle; SPLandroidx/lifecycle/SavedStateHandleSupport;->enableSavedStateHandles(Landroidx/savedstate/SavedStateRegistryOwner;)V +SPLandroidx/lifecycle/SavedStateHandleSupport;->getSavedStateHandlesProvider(Landroidx/savedstate/SavedStateRegistryOwner;)Landroidx/lifecycle/SavedStateHandlesProvider; SPLandroidx/lifecycle/SavedStateHandleSupport;->getSavedStateHandlesVM(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/SavedStateHandlesVM; Landroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1; SPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1;->()V @@ -3511,8 +3922,8 @@ SPLandroidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$2;->()V Landroidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$3; SPLandroidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$3;->()V Landroidx/lifecycle/SavedStateHandlesProvider; -SPLandroidx/lifecycle/SavedStateHandlesProvider;->$r8$lambda$BWYiFNbmaxFqlGaoxfo2jDYwXi4(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/SavedStateHandlesVM; SPLandroidx/lifecycle/SavedStateHandlesProvider;->(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/ViewModelStoreOwner;)V +SPLandroidx/lifecycle/SavedStateHandlesProvider;->consumeRestoredStateForKey(Ljava/lang/String;)Landroid/os/Bundle; SPLandroidx/lifecycle/SavedStateHandlesProvider;->getViewModel()Landroidx/lifecycle/SavedStateHandlesVM; SPLandroidx/lifecycle/SavedStateHandlesProvider;->performRestore()V SPLandroidx/lifecycle/SavedStateHandlesProvider;->viewModel_delegate$lambda$0(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/SavedStateHandlesVM; @@ -3521,6 +3932,7 @@ SPLandroidx/lifecycle/SavedStateHandlesProvider$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; Landroidx/lifecycle/SavedStateHandlesVM; SPLandroidx/lifecycle/SavedStateHandlesVM;->()V +SPLandroidx/lifecycle/SavedStateHandlesVM;->getHandles()Ljava/util/Map; Landroidx/lifecycle/SavedStateViewModelFactory; SPLandroidx/lifecycle/SavedStateViewModelFactory;->(Landroid/app/Application;Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;)V SPLandroidx/lifecycle/SavedStateViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; @@ -3593,13 +4005,23 @@ SPLandroidx/lifecycle/ViewModelProvider$special$$inlined$Key$1;->()V Landroidx/lifecycle/ViewModelStore; SPLandroidx/lifecycle/ViewModelStore;->()V SPLandroidx/lifecycle/ViewModelStore;->clear()V -SPLandroidx/lifecycle/ViewModelStore;->get(Ljava/lang/String;)Landroidx/lifecycle/ViewModel; -SPLandroidx/lifecycle/ViewModelStore;->put(Ljava/lang/String;Landroidx/lifecycle/ViewModel;)V +SPLandroidx/lifecycle/ViewModelStore;->get(Ljava/lang/Object;)Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/ViewModelStore;->put(Ljava/lang/Object;Landroidx/lifecycle/ViewModel;)V Landroidx/lifecycle/ViewModelStoreOwner; +Landroidx/lifecycle/ViewModelStoreOwnerDefaults; +SPLandroidx/lifecycle/ViewModelStoreOwnerDefaults;->getViewModelCreationExtras(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/viewmodel/CreationExtras; Landroidx/lifecycle/ViewTreeLifecycleOwner; SPLandroidx/lifecycle/ViewTreeLifecycleOwner;->set(Landroid/view/View;Landroidx/lifecycle/LifecycleOwner;)V Landroidx/lifecycle/ViewTreeViewModelStoreOwner; SPLandroidx/lifecycle/ViewTreeViewModelStoreOwner;->set(Landroid/view/View;Landroidx/lifecycle/ViewModelStoreOwner;)V +Landroidx/lifecycle/WeakReference; +SPLandroidx/lifecycle/WeakReference;->(Ljava/lang/Object;)V +SPLandroidx/lifecycle/WeakReference;->get()Ljava/lang/Object; +Landroidx/lifecycle/internal/SavedStateHandleImpl; +SPLandroidx/lifecycle/internal/SavedStateHandleImpl;->(Ljava/util/Map;)V +SPLandroidx/lifecycle/internal/SavedStateHandleImpl;->getMutableStateFlow(Ljava/lang/String;Ljava/lang/Object;)Lkotlinx/coroutines/flow/MutableStateFlow; +Landroidx/lifecycle/internal/SavedStateHandleImpl$$ExternalSyntheticLambda0; +SPLandroidx/lifecycle/internal/SavedStateHandleImpl$$ExternalSyntheticLambda0;->(Landroidx/lifecycle/internal/SavedStateHandleImpl;)V Landroidx/lifecycle/runtime/R$id; Landroidx/lifecycle/viewmodel/CreationExtras; SPLandroidx/lifecycle/viewmodel/CreationExtras;->()V @@ -3612,6 +4034,13 @@ Landroidx/lifecycle/viewmodel/CreationExtras$Empty; SPLandroidx/lifecycle/viewmodel/CreationExtras$Empty;->()V SPLandroidx/lifecycle/viewmodel/CreationExtras$Empty;->()V Landroidx/lifecycle/viewmodel/CreationExtras$Key; +Landroidx/lifecycle/viewmodel/InitializerViewModelFactory; +SPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;->([Landroidx/lifecycle/viewmodel/ViewModelInitializer;)V +SPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/viewmodel/InitializerViewModelFactoryBuilder; +SPLandroidx/lifecycle/viewmodel/InitializerViewModelFactoryBuilder;->()V +SPLandroidx/lifecycle/viewmodel/InitializerViewModelFactoryBuilder;->addInitializer(Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/lifecycle/viewmodel/InitializerViewModelFactoryBuilder;->build()Landroidx/lifecycle/ViewModelProvider$Factory; Landroidx/lifecycle/viewmodel/MutableCreationExtras; SPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->()V SPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->(Landroidx/lifecycle/viewmodel/CreationExtras;)V @@ -3620,6 +4049,10 @@ SPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->(Ljava/util/Map;)V SPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->get(Landroidx/lifecycle/viewmodel/CreationExtras$Key;)Ljava/lang/Object; SPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->set(Landroidx/lifecycle/viewmodel/CreationExtras$Key;Ljava/lang/Object;)V Landroidx/lifecycle/viewmodel/R$id; +Landroidx/lifecycle/viewmodel/ViewModelInitializer; +SPLandroidx/lifecycle/viewmodel/ViewModelInitializer;->(Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/lifecycle/viewmodel/ViewModelInitializer;->getClazz$lifecycle_viewmodel()Lkotlin/reflect/KClass; +SPLandroidx/lifecycle/viewmodel/ViewModelInitializer;->getInitializer$lifecycle_viewmodel()Lkotlin/jvm/functions/Function1; Landroidx/lifecycle/viewmodel/internal/CanonicalName_jvmKt; SPLandroidx/lifecycle/viewmodel/internal/CanonicalName_jvmKt;->getCanonicalName(Lkotlin/reflect/KClass;)Ljava/lang/String; Landroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope; @@ -3653,7 +4086,8 @@ SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl_androidKt;->creat Landroidx/lifecycle/viewmodel/internal/ViewModelProviders; SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviders;->()V SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviders;->()V -SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviders;->getDefaultCreationExtras$lifecycle_viewmodel(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/viewmodel/CreationExtras; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviders;->createInitializerFactory$lifecycle_viewmodel(Ljava/util/Collection;)Landroidx/lifecycle/ViewModelProvider$Factory; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviders;->createViewModelFromInitializers$lifecycle_viewmodel(Lkotlin/reflect/KClass;Landroidx/lifecycle/viewmodel/CreationExtras;[Landroidx/lifecycle/viewmodel/ViewModelInitializer;)Landroidx/lifecycle/ViewModel; SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviders;->getDefaultKey$lifecycle_viewmodel(Lkotlin/reflect/KClass;)Ljava/lang/String; Landroidx/loader/app/LoaderManager; SPLandroidx/loader/app/LoaderManager;->()V @@ -3671,25 +4105,30 @@ SPLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel;->onCleared()V Landroidx/loader/app/LoaderManagerImpl$LoaderViewModel$1; SPLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel$1;->()V SPLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel$1;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; -Landroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$10()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$11()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$12()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$2()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$3()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$4()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$5()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$6()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$7()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$8()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m$9()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;Landroid/app/Application$ActivityLifecycleCallbacks;)V -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/Looper;)Landroid/os/Handler; -SPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V +Landroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$1()I +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$10()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$11()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$12()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$2()I +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$2()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$3()I +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$3()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$4()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$5()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$6()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$7()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$8()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$9()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;Landroid/app/Application$ActivityLifecycleCallbacks;)V +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/Looper;)Landroid/os/Handler; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;)Landroid/view/WindowInsetsController; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsetsController;II)V PLandroidx/media3/exoplayer/dash/offline/DashDownloader$$ExternalSyntheticLambda1;->()V Landroidx/navigationevent/NavigationEventDispatcher; SPLandroidx/navigationevent/NavigationEventDispatcher;->()V @@ -3829,6 +4268,7 @@ SPLandroidx/recyclerview/R$styleable;->()V Landroidx/recyclerview/widget/AdapterHelper; SPLandroidx/recyclerview/widget/AdapterHelper;->(Landroidx/recyclerview/widget/AdapterHelper$Callback;)V SPLandroidx/recyclerview/widget/AdapterHelper;->(Landroidx/recyclerview/widget/AdapterHelper$Callback;Z)V +SPLandroidx/recyclerview/widget/AdapterHelper;->applyAdd(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V SPLandroidx/recyclerview/widget/AdapterHelper;->consumePostponedUpdates()V SPLandroidx/recyclerview/widget/AdapterHelper;->consumeUpdatesInOnePass()V SPLandroidx/recyclerview/widget/AdapterHelper;->findPositionOffset(I)I @@ -3837,6 +4277,7 @@ SPLandroidx/recyclerview/widget/AdapterHelper;->hasPendingUpdates()Z SPLandroidx/recyclerview/widget/AdapterHelper;->obtainUpdateOp(IIILjava/lang/Object;)Landroidx/recyclerview/widget/AdapterHelper$UpdateOp; SPLandroidx/recyclerview/widget/AdapterHelper;->onItemRangeChanged(IILjava/lang/Object;)Z SPLandroidx/recyclerview/widget/AdapterHelper;->onItemRangeInserted(II)Z +SPLandroidx/recyclerview/widget/AdapterHelper;->postponeAndUpdateViewHolders(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V SPLandroidx/recyclerview/widget/AdapterHelper;->preProcess()V SPLandroidx/recyclerview/widget/AdapterHelper;->recycleUpdateOp(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V SPLandroidx/recyclerview/widget/AdapterHelper;->recycleUpdateOpsAndClearList(Ljava/util/List;)V @@ -3859,6 +4300,7 @@ Landroidx/recyclerview/widget/AsyncListDiffer; SPLandroidx/recyclerview/widget/AsyncListDiffer;->()V SPLandroidx/recyclerview/widget/AsyncListDiffer;->(Landroidx/recyclerview/widget/ListUpdateCallback;Landroidx/recyclerview/widget/AsyncDifferConfig;)V SPLandroidx/recyclerview/widget/AsyncListDiffer;->addListListener(Landroidx/recyclerview/widget/AsyncListDiffer$ListListener;)V +SPLandroidx/recyclerview/widget/AsyncListDiffer;->getCurrentList()Ljava/util/List; SPLandroidx/recyclerview/widget/AsyncListDiffer;->latchList(Ljava/util/List;Landroidx/recyclerview/widget/DiffUtil$DiffResult;Ljava/lang/Runnable;)V SPLandroidx/recyclerview/widget/AsyncListDiffer;->onCurrentListChanged(Ljava/util/List;Ljava/lang/Runnable;)V SPLandroidx/recyclerview/widget/AsyncListDiffer;->submitList(Ljava/util/List;)V @@ -3884,24 +4326,44 @@ SPLandroidx/recyclerview/widget/BatchingListUpdateCallback;->onInserted(II)V Landroidx/recyclerview/widget/ChildHelper; SPLandroidx/recyclerview/widget/ChildHelper;->(Landroidx/recyclerview/widget/ChildHelper$Callback;)V SPLandroidx/recyclerview/widget/ChildHelper;->addView(Landroid/view/View;IZ)V +SPLandroidx/recyclerview/widget/ChildHelper;->attachViewToParent(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;Z)V +SPLandroidx/recyclerview/widget/ChildHelper;->detachViewFromParent(I)V SPLandroidx/recyclerview/widget/ChildHelper;->findHiddenNonRemovedView(I)Landroid/view/View; SPLandroidx/recyclerview/widget/ChildHelper;->getChildAt(I)Landroid/view/View; SPLandroidx/recyclerview/widget/ChildHelper;->getChildCount()I SPLandroidx/recyclerview/widget/ChildHelper;->getOffset(I)I +SPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildAt(I)Landroid/view/View; SPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildCount()I +SPLandroidx/recyclerview/widget/ChildHelper;->isHidden(Landroid/view/View;)Z SPLandroidx/recyclerview/widget/ChildHelper;->removeAllViewsUnfiltered()V +SPLandroidx/recyclerview/widget/ChildHelper;->removeViewIfHidden(Landroid/view/View;)Z Landroidx/recyclerview/widget/ChildHelper$Bucket; SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->()V SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->clear(I)V SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->countOnesBefore(I)I SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->get(I)Z SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->insert(IZ)V +SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->remove(I)Z SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->reset()V Landroidx/recyclerview/widget/ChildHelper$Callback; Landroidx/recyclerview/widget/DefaultItemAnimator; SPLandroidx/recyclerview/widget/DefaultItemAnimator;->()V +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->animateAdd(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->animateAddImpl(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->dispatchFinishedWhenDone()V +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->endAnimation(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V SPLandroidx/recyclerview/widget/DefaultItemAnimator;->endAnimations()V +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->endChangeAnimation(Ljava/util/List;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V SPLandroidx/recyclerview/widget/DefaultItemAnimator;->isRunning()Z +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->resetAnimation(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->runPendingAnimations()V +Landroidx/recyclerview/widget/DefaultItemAnimator$3; +SPLandroidx/recyclerview/widget/DefaultItemAnimator$3;->(Landroidx/recyclerview/widget/DefaultItemAnimator;Ljava/util/ArrayList;)V +SPLandroidx/recyclerview/widget/DefaultItemAnimator$3;->run()V +Landroidx/recyclerview/widget/DefaultItemAnimator$5; +SPLandroidx/recyclerview/widget/DefaultItemAnimator$5;->(Landroidx/recyclerview/widget/DefaultItemAnimator;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroid/view/View;Landroid/view/ViewPropertyAnimator;)V +SPLandroidx/recyclerview/widget/DefaultItemAnimator$5;->onAnimationEnd(Landroid/animation/Animator;)V +SPLandroidx/recyclerview/widget/DefaultItemAnimator$5;->onAnimationStart(Landroid/animation/Animator;)V Landroidx/recyclerview/widget/DiffUtil; SPLandroidx/recyclerview/widget/DiffUtil;->()V SPLandroidx/recyclerview/widget/DiffUtil;->calculateDiff(Landroidx/recyclerview/widget/DiffUtil$Callback;)Landroidx/recyclerview/widget/DiffUtil$DiffResult; @@ -3946,15 +4408,25 @@ SPLandroidx/recyclerview/widget/LinearLayoutManager;->assertNotInLayoutOrScroll( SPLandroidx/recyclerview/widget/LinearLayoutManager;->calculateExtraLayoutSpace(Landroidx/recyclerview/widget/RecyclerView$State;[I)V SPLandroidx/recyclerview/widget/LinearLayoutManager;->canScrollHorizontally()Z SPLandroidx/recyclerview/widget/LinearLayoutManager;->canScrollVertically()Z +SPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->computeVerticalScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->computeVerticalScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->computeVerticalScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I SPLandroidx/recyclerview/widget/LinearLayoutManager;->createLayoutState()Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState; SPLandroidx/recyclerview/widget/LinearLayoutManager;->ensureLayoutState()V SPLandroidx/recyclerview/widget/LinearLayoutManager;->fill(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;Landroidx/recyclerview/widget/RecyclerView$State;Z)I SPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstCompletelyVisibleItemPosition()I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstVisibleChildClosestToEnd(ZZ)Landroid/view/View; +SPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstVisibleChildClosestToStart(ZZ)Landroid/view/View; SPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstVisibleItemPosition()I SPLandroidx/recyclerview/widget/LinearLayoutManager;->findLastVisibleItemPosition()I SPLandroidx/recyclerview/widget/LinearLayoutManager;->findOneVisibleChild(IIZZ)Landroid/view/View; +SPLandroidx/recyclerview/widget/LinearLayoutManager;->findReferenceChild(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;ZZ)Landroid/view/View; SPLandroidx/recyclerview/widget/LinearLayoutManager;->fixLayoutEndGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I SPLandroidx/recyclerview/widget/LinearLayoutManager;->fixLayoutStartGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->getChildClosestToEnd()Landroid/view/View; SPLandroidx/recyclerview/widget/LinearLayoutManager;->getChildClosestToStart()Landroid/view/View; SPLandroidx/recyclerview/widget/LinearLayoutManager;->getExtraLayoutSpace(Landroidx/recyclerview/widget/RecyclerView$State;)I SPLandroidx/recyclerview/widget/LinearLayoutManager;->isAutoMeasureEnabled()Z @@ -3962,11 +4434,14 @@ SPLandroidx/recyclerview/widget/LinearLayoutManager;->isLayoutRTL()Z SPLandroidx/recyclerview/widget/LinearLayoutManager;->layoutChunk(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult;)V SPLandroidx/recyclerview/widget/LinearLayoutManager;->layoutForPredictiveAnimations(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;II)V SPLandroidx/recyclerview/widget/LinearLayoutManager;->onAnchorReady(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;I)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V SPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)V SPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V SPLandroidx/recyclerview/widget/LinearLayoutManager;->recycleByLayoutState(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;)V SPLandroidx/recyclerview/widget/LinearLayoutManager;->recycleChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;II)V SPLandroidx/recyclerview/widget/LinearLayoutManager;->recycleViewsFromEnd(Landroidx/recyclerview/widget/RecyclerView$Recycler;II)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->recycleViewsFromStart(Landroidx/recyclerview/widget/RecyclerView$Recycler;II)V SPLandroidx/recyclerview/widget/LinearLayoutManager;->resolveIsInfinite()Z SPLandroidx/recyclerview/widget/LinearLayoutManager;->resolveShouldLayoutReverse()V SPLandroidx/recyclerview/widget/LinearLayoutManager;->scrollBy(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I @@ -3985,6 +4460,7 @@ SPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutStateToFillSta Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo; SPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->()V SPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->assignCoordinateFromPadding()V +SPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->assignFromView(Landroid/view/View;I)V SPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->reset()V Landroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult; SPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult;->()V @@ -3993,8 +4469,11 @@ Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState; SPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->()V SPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->hasMore(Landroidx/recyclerview/widget/RecyclerView$State;)Z SPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->next(Landroidx/recyclerview/widget/RecyclerView$Recycler;)Landroid/view/View; +Landroidx/recyclerview/widget/LinearLayoutManager$SavedState; Landroidx/recyclerview/widget/ListAdapter; SPLandroidx/recyclerview/widget/ListAdapter;->(Landroidx/recyclerview/widget/DiffUtil$ItemCallback;)V +SPLandroidx/recyclerview/widget/ListAdapter;->getItem(I)Ljava/lang/Object; +SPLandroidx/recyclerview/widget/ListAdapter;->getItemCount()I SPLandroidx/recyclerview/widget/ListAdapter;->onCurrentListChanged(Ljava/util/List;Ljava/util/List;)V SPLandroidx/recyclerview/widget/ListAdapter;->submitList(Ljava/util/List;)V Landroidx/recyclerview/widget/ListAdapter$1; @@ -4014,6 +4493,7 @@ SPLandroidx/recyclerview/widget/OrientationHelper;->createVerticalHelper(Landroi SPLandroidx/recyclerview/widget/OrientationHelper;->onLayoutComplete()V Landroidx/recyclerview/widget/OrientationHelper$2; SPLandroidx/recyclerview/widget/OrientationHelper$2;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V +SPLandroidx/recyclerview/widget/OrientationHelper$2;->getDecoratedEnd(Landroid/view/View;)I SPLandroidx/recyclerview/widget/OrientationHelper$2;->getDecoratedMeasurement(Landroid/view/View;)I SPLandroidx/recyclerview/widget/OrientationHelper$2;->getDecoratedMeasurementInOther(Landroid/view/View;)I SPLandroidx/recyclerview/widget/OrientationHelper$2;->getDecoratedStart(Landroid/view/View;)I @@ -4028,9 +4508,19 @@ Landroidx/recyclerview/widget/RecyclerView; SPLandroidx/recyclerview/widget/RecyclerView;->()V SPLandroidx/recyclerview/widget/RecyclerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V SPLandroidx/recyclerview/widget/RecyclerView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/recyclerview/widget/RecyclerView;->access$000(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V +SPLandroidx/recyclerview/widget/RecyclerView;->access$100(Landroidx/recyclerview/widget/RecyclerView;I)V +SPLandroidx/recyclerview/widget/RecyclerView;->addOnScrollListener(Landroidx/recyclerview/widget/RecyclerView$OnScrollListener;)V +SPLandroidx/recyclerview/widget/RecyclerView;->animateAppearance(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)V SPLandroidx/recyclerview/widget/RecyclerView;->assertNotInLayoutOrScroll(Ljava/lang/String;)V SPLandroidx/recyclerview/widget/RecyclerView;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z SPLandroidx/recyclerview/widget/RecyclerView;->clearOldPositions()V +SPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollExtent()I +SPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollOffset()I +SPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollRange()I +SPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollExtent()I +SPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollOffset()I +SPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollRange()I SPLandroidx/recyclerview/widget/RecyclerView;->createLayoutManager(Landroid/content/Context;Ljava/lang/String;Landroid/util/AttributeSet;II)V SPLandroidx/recyclerview/widget/RecyclerView;->defaultOnMeasure(II)V SPLandroidx/recyclerview/widget/RecyclerView;->didChildRangeChange(II)Z @@ -4042,13 +4532,17 @@ SPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayoutStep2()V SPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayoutStep3()V SPLandroidx/recyclerview/widget/RecyclerView;->dispatchOnScrolled(II)V SPLandroidx/recyclerview/widget/RecyclerView;->dispatchPendingImportantForAccessibilityChanges()V +SPLandroidx/recyclerview/widget/RecyclerView;->draw(Landroid/graphics/Canvas;)V +SPLandroidx/recyclerview/widget/RecyclerView;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z SPLandroidx/recyclerview/widget/RecyclerView;->fillRemainingScrollValues(Landroidx/recyclerview/widget/RecyclerView$State;)V SPLandroidx/recyclerview/widget/RecyclerView;->findMinMaxChildLayoutPositions([I)V SPLandroidx/recyclerview/widget/RecyclerView;->findNestedRecyclerView(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView; SPLandroidx/recyclerview/widget/RecyclerView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; SPLandroidx/recyclerview/widget/RecyclerView;->getAccessibilityClassName()Ljava/lang/CharSequence; +SPLandroidx/recyclerview/widget/RecyclerView;->getChangedHolderKey(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)J SPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolderInt(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; SPLandroidx/recyclerview/widget/RecyclerView;->getItemDecorInsetsForChild(Landroid/view/View;)Landroid/graphics/Rect; +SPLandroidx/recyclerview/widget/RecyclerView;->getLayoutManager()Landroidx/recyclerview/widget/RecyclerView$LayoutManager; SPLandroidx/recyclerview/widget/RecyclerView;->getNanoTime()J SPLandroidx/recyclerview/widget/RecyclerView;->getScrollState()I SPLandroidx/recyclerview/widget/RecyclerView;->getScrollingChildHelper()Landroidx/core/view/NestedScrollingChildHelper; @@ -4063,8 +4557,10 @@ SPLandroidx/recyclerview/widget/RecyclerView;->isComputingLayout()Z SPLandroidx/recyclerview/widget/RecyclerView;->markItemDecorInsetsDirty()V SPLandroidx/recyclerview/widget/RecyclerView;->markKnownViewsInvalid()V SPLandroidx/recyclerview/widget/RecyclerView;->offsetChildrenVertical(I)V +SPLandroidx/recyclerview/widget/RecyclerView;->offsetPositionRecordsForInsert(II)V SPLandroidx/recyclerview/widget/RecyclerView;->onAttachedToWindow()V SPLandroidx/recyclerview/widget/RecyclerView;->onChildAttachedToWindow(Landroid/view/View;)V +SPLandroidx/recyclerview/widget/RecyclerView;->onDraw(Landroid/graphics/Canvas;)V SPLandroidx/recyclerview/widget/RecyclerView;->onEnterLayoutOrScroll()V SPLandroidx/recyclerview/widget/RecyclerView;->onExitLayoutOrScroll()V SPLandroidx/recyclerview/widget/RecyclerView;->onExitLayoutOrScroll(Z)V @@ -4072,14 +4568,17 @@ SPLandroidx/recyclerview/widget/RecyclerView;->onLayout(ZIIII)V SPLandroidx/recyclerview/widget/RecyclerView;->onMeasure(II)V SPLandroidx/recyclerview/widget/RecyclerView;->onScrolled(II)V SPLandroidx/recyclerview/widget/RecyclerView;->onSizeChanged(IIII)V +SPLandroidx/recyclerview/widget/RecyclerView;->postAnimationRunner()V SPLandroidx/recyclerview/widget/RecyclerView;->predictiveItemAnimationsEnabled()Z SPLandroidx/recyclerview/widget/RecyclerView;->processAdapterUpdatesAndSetAnimationFlags()V SPLandroidx/recyclerview/widget/RecyclerView;->processDataSetCompletelyChanged(Z)V SPLandroidx/recyclerview/widget/RecyclerView;->recoverFocusFromState()V SPLandroidx/recyclerview/widget/RecyclerView;->removeAndRecycleViews()V +SPLandroidx/recyclerview/widget/RecyclerView;->removeAnimatingView(Landroid/view/View;)Z SPLandroidx/recyclerview/widget/RecyclerView;->requestLayout()V SPLandroidx/recyclerview/widget/RecyclerView;->resetFocusInfo()V SPLandroidx/recyclerview/widget/RecyclerView;->saveFocusInfo()V +SPLandroidx/recyclerview/widget/RecyclerView;->saveOldPositions()V SPLandroidx/recyclerview/widget/RecyclerView;->sendAccessibilityEventUnchecked(Landroid/view/accessibility/AccessibilityEvent;)V SPLandroidx/recyclerview/widget/RecyclerView;->setAccessibilityDelegateCompat(Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;)V SPLandroidx/recyclerview/widget/RecyclerView;->setAdapter(Landroidx/recyclerview/widget/RecyclerView$Adapter;)V @@ -4099,27 +4598,37 @@ Landroidx/recyclerview/widget/RecyclerView$1; SPLandroidx/recyclerview/widget/RecyclerView$1;->(Landroidx/recyclerview/widget/RecyclerView;)V Landroidx/recyclerview/widget/RecyclerView$2; SPLandroidx/recyclerview/widget/RecyclerView$2;->(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$2;->run()V Landroidx/recyclerview/widget/RecyclerView$3; SPLandroidx/recyclerview/widget/RecyclerView$3;->()V Landroidx/recyclerview/widget/RecyclerView$4; SPLandroidx/recyclerview/widget/RecyclerView$4;->(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$4;->processAppeared(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)V Landroidx/recyclerview/widget/RecyclerView$5; SPLandroidx/recyclerview/widget/RecyclerView$5;->(Landroidx/recyclerview/widget/RecyclerView;)V Landroidx/recyclerview/widget/RecyclerView$6; SPLandroidx/recyclerview/widget/RecyclerView$6;->(Landroidx/recyclerview/widget/RecyclerView;)V SPLandroidx/recyclerview/widget/RecyclerView$6;->addView(Landroid/view/View;I)V +SPLandroidx/recyclerview/widget/RecyclerView$6;->attachViewToParent(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V +SPLandroidx/recyclerview/widget/RecyclerView$6;->detachViewFromParent(I)V SPLandroidx/recyclerview/widget/RecyclerView$6;->getChildAt(I)Landroid/view/View; SPLandroidx/recyclerview/widget/RecyclerView$6;->getChildCount()I +SPLandroidx/recyclerview/widget/RecyclerView$6;->indexOfChild(Landroid/view/View;)I SPLandroidx/recyclerview/widget/RecyclerView$6;->removeAllViews()V Landroidx/recyclerview/widget/RecyclerView$7; SPLandroidx/recyclerview/widget/RecyclerView$7;->(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$7;->dispatchUpdate(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V +SPLandroidx/recyclerview/widget/RecyclerView$7;->offsetPositionsForAdd(II)V +SPLandroidx/recyclerview/widget/RecyclerView$7;->onDispatchSecondPass(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V Landroidx/recyclerview/widget/RecyclerView$Adapter; SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->()V SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->bindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->createViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->getItemViewType(I)I SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->hasObservers()Z SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->hasStableIds()Z SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyDataSetChanged()V +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyItemChanged(I)V SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyItemRangeChanged(II)V SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyItemRangeInserted(II)V SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V @@ -4144,10 +4653,21 @@ Landroidx/recyclerview/widget/RecyclerView$EdgeEffectFactory; SPLandroidx/recyclerview/widget/RecyclerView$EdgeEffectFactory;->()V Landroidx/recyclerview/widget/RecyclerView$ItemAnimator; SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->()V +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->dispatchAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->dispatchAnimationsFinished()V +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->getAddDuration()J +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->obtainHolderInfo()Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->onAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->recordPostLayoutInformation(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->setListener(Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemAnimatorListener;)V Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemAnimatorListener; +Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;->()V +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;->setFrom(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;->setFrom(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; Landroidx/recyclerview/widget/RecyclerView$ItemAnimatorRestoreListener; SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimatorRestoreListener;->(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimatorRestoreListener;->onAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V Landroidx/recyclerview/widget/RecyclerView$LayoutManager; SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->()V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->addView(Landroid/view/View;)V @@ -4157,11 +4677,16 @@ SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->assertNotInLayoutOr SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->checkLayoutParams(Landroidx/recyclerview/widget/RecyclerView$LayoutParams;)Z SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->chooseSize(III)I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachAndScrapAttachedViews(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachViewAt(I)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachViewInternal(ILandroid/view/View;)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->dispatchAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView;)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->generateLayoutParams(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/recyclerview/widget/RecyclerView$LayoutParams; +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getBottomDecorationHeight(Landroid/view/View;)I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildAt(I)Landroid/view/View; SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildCount()I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildMeasureSpec(IIIIZ)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getColumnCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedBottom(Landroid/view/View;)I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredHeight(Landroid/view/View;)I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredWidth(Landroid/view/View;)I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedTop(Landroid/view/View;)I @@ -4174,20 +4699,32 @@ SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingLeft()I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingRight()I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingTop()I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPosition(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRowCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getSelectionModeForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getTopDecorationHeight(Landroid/view/View;)I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getWidth()I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getWidthMode()I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isLayoutHierarchical(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)Z +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isMeasurementUpToDate(III)Z SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->layoutDecoratedWithMargins(Landroid/view/View;IIII)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->measureChildWithMargins(Landroid/view/View;II)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->offsetChildrenVertical(I)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAdapterChanged(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$Adapter;)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityEvent(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroid/view/accessibility/AccessibilityEvent;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsAdded(Landroidx/recyclerview/widget/RecyclerView;II)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsChanged(Landroidx/recyclerview/widget/RecyclerView;)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onMeasure(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;II)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleAllViews(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleScrapInt(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->requestLayout()V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->scrapOrRecycleView(Landroidx/recyclerview/widget/RecyclerView$Recycler;ILandroid/view/View;)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setExactMeasureSpecsFrom(Landroidx/recyclerview/widget/RecyclerView;)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasureSpecs(II)V SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V @@ -4196,6 +4733,9 @@ Landroidx/recyclerview/widget/RecyclerView$LayoutManager$1; SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V Landroidx/recyclerview/widget/RecyclerView$LayoutManager$2; SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getChildAt(I)Landroid/view/View; +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getChildEnd(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getChildStart(Landroid/view/View;)I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getParentEnd()I SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getParentStart()I Landroidx/recyclerview/widget/RecyclerView$LayoutManager$LayoutPrefetchRegistry; @@ -4204,6 +4744,8 @@ SPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->(Landroid/cont SPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->getViewLayoutPosition()I SPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->isItemChanged()Z SPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->isItemRemoved()Z +Landroidx/recyclerview/widget/RecyclerView$OnScrollListener; +SPLandroidx/recyclerview/widget/RecyclerView$OnScrollListener;->()V Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool; SPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->()V SPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->attach()V @@ -4225,6 +4767,7 @@ SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->clearOldPositions()V SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->clearScrap()V SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getRecycledViewPool()Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool; SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getScrapCount()I +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getScrapList()Ljava/util/List; SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getScrapOrCachedViewForId(JIZ)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getScrapOrHiddenOrCachedHolderForPosition(IZ)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getViewForPosition(I)Landroid/view/View; @@ -4232,13 +4775,17 @@ SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getViewForPosition(IZ)La SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->markItemDecorInsetsDirty()V SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->markKnownViewsInvalid()V SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->maybeSendPoolingContainerAttach()V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->offsetPositionRecordsForInsert(II)V SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->onAdapterChanged(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$Adapter;Z)V SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->onAttachedToWindow()V SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->poolingContainerDetach(Landroidx/recyclerview/widget/RecyclerView$Adapter;Z)V SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleAndClearCachedViews()V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->scrapView(Landroid/view/View;)V SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->tryBindViewHolderByDeadline(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;IIJ)Z SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->tryGetViewHolderForPositionByDeadline(IZJ)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->unscrapView(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->updateViewCacheSize()V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->validateViewHolderForOffsetPosition(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z Landroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver; SPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->(Landroidx/recyclerview/widget/RecyclerView;)V SPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onChanged()V @@ -4261,40 +4808,75 @@ SPLandroidx/recyclerview/widget/RecyclerView$ViewFlinger;->stop()V Landroidx/recyclerview/widget/RecyclerView$ViewHolder; SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->()V SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->(Landroid/view/View;)V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->addFlags(I)V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearOldPosition()V SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearPayload()V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearReturnedFromScrapFlag()V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearTmpDetachFlag()V SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getItemViewType()I SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getLayoutPosition()I SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getUnmodifiedPayloads()Ljava/util/List; +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->hasAnyOfTheFlags(I)Z SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isBound()Z +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isInvalid()Z SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isRemoved()Z SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isScrap()Z SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isTmpDetached()Z SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isUpdated()Z +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->needsUpdate()Z SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->setFlags(II)V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->setIsRecyclable(Z)V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->setScrapContainer(Landroidx/recyclerview/widget/RecyclerView$Recycler;Z)V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->shouldBeKeptAsChild()Z SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->shouldIgnore()Z +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->unScrap()V SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->wasReturnedFromScrap()Z Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate; SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->(Landroidx/recyclerview/widget/RecyclerView;)V SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->getItemDelegate()Landroidx/core/view/AccessibilityDelegateCompat; SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->shouldIgnore()Z Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate; SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->(Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;)V SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; +SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->saveOriginalDelegate(Landroid/view/View;)V +Landroidx/recyclerview/widget/ScrollbarHelper; +SPLandroidx/recyclerview/widget/ScrollbarHelper;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;Z)I +SPLandroidx/recyclerview/widget/ScrollbarHelper;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;ZZ)I +SPLandroidx/recyclerview/widget/ScrollbarHelper;->computeScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;Z)I Landroidx/recyclerview/widget/SimpleItemAnimator; SPLandroidx/recyclerview/widget/SimpleItemAnimator;->()V +SPLandroidx/recyclerview/widget/SimpleItemAnimator;->animateAppearance(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z +SPLandroidx/recyclerview/widget/SimpleItemAnimator;->dispatchAddFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/SimpleItemAnimator;->dispatchAddStarting(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/SimpleItemAnimator;->onAddFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/SimpleItemAnimator;->onAddStarting(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V Landroidx/recyclerview/widget/ViewBoundsCheck; SPLandroidx/recyclerview/widget/ViewBoundsCheck;->(Landroidx/recyclerview/widget/ViewBoundsCheck$Callback;)V SPLandroidx/recyclerview/widget/ViewBoundsCheck;->findOneViewWithinBoundFlags(IIII)Landroid/view/View; Landroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags; SPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->()V +SPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->addFlags(I)V +SPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->boundsMatch()Z +SPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->compare(II)I +SPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->resetFlags()V +SPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->setBounds(IIII)V Landroidx/recyclerview/widget/ViewBoundsCheck$Callback; Landroidx/recyclerview/widget/ViewInfoStore; SPLandroidx/recyclerview/widget/ViewInfoStore;->()V +SPLandroidx/recyclerview/widget/ViewInfoStore;->addToPostLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)V SPLandroidx/recyclerview/widget/ViewInfoStore;->clear()V +SPLandroidx/recyclerview/widget/ViewInfoStore;->getFromOldChangeHolders(J)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLandroidx/recyclerview/widget/ViewInfoStore;->onViewDetached(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/ViewInfoStore;->process(Landroidx/recyclerview/widget/ViewInfoStore$ProcessCallback;)V SPLandroidx/recyclerview/widget/ViewInfoStore;->removeFromDisappearedInLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord; +SPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->()V +SPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->()V +SPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->obtain()Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord; +SPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->recycle(Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord;)V Landroidx/recyclerview/widget/ViewInfoStore$ProcessCallback; Landroidx/room/BaseRoomConnectionManager; SPLandroidx/room/BaseRoomConnectionManager;->()V @@ -4319,9 +4901,6 @@ SPLandroidx/room/EntityInsertAdapter;->insert(Landroidx/sqlite/SQLiteConnection; Landroidx/room/InvalidationLiveDataContainer; SPLandroidx/room/InvalidationLiveDataContainer;->(Landroidx/room/RoomDatabase;)V Landroidx/room/InvalidationTracker; -SPLandroidx/room/InvalidationTracker;->$r8$lambda$S0GAeZVlYzHdkENrWO-BCuj8x5g(Landroidx/room/InvalidationTracker;)Lkotlin/Unit; -SPLandroidx/room/InvalidationTracker;->$r8$lambda$rV938R3HpEbbZMJ5mxkZVyQwHqY(Landroidx/room/InvalidationTracker;)Z -SPLandroidx/room/InvalidationTracker;->$r8$lambda$z_vz9Tqx65AifWN0It6OfeI4bTk(Landroidx/room/InvalidationTracker;)Lkotlin/Unit; SPLandroidx/room/InvalidationTracker;->()V SPLandroidx/room/InvalidationTracker;->(Landroidx/room/RoomDatabase;Ljava/util/Map;Ljava/util/Map;[Ljava/lang/String;)V SPLandroidx/room/InvalidationTracker;->_init_$lambda$2(Landroidx/room/InvalidationTracker;)Z @@ -4441,6 +5020,7 @@ SPLandroidx/room/RoomDatabase$MigrationContainer;->addMigration(Landroidx/room/m SPLandroidx/room/RoomDatabase$MigrationContainer;->addMigrations([Landroidx/room/migration/Migration;)V SPLandroidx/room/RoomDatabase$MigrationContainer;->contains(II)Z SPLandroidx/room/RoomDatabase$MigrationContainer;->getMigrations()Ljava/util/Map; +Landroidx/room/RoomDatabase$PrepackagedDatabaseCallback; Landroidx/room/RoomDatabase$closeBarrier$1; SPLandroidx/room/RoomDatabase$closeBarrier$1;->(Ljava/lang/Object;)V Landroidx/room/RoomDatabaseKt; @@ -4462,7 +5042,6 @@ Landroidx/room/TransactionElement$Key; SPLandroidx/room/TransactionElement$Key;->()V SPLandroidx/room/TransactionElement$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Landroidx/room/TransactionExecutor; -SPLandroidx/room/TransactionExecutor;->$r8$lambda$FZWr2PGmP3sgXLCiri-DCcePXSs(Ljava/lang/Runnable;Landroidx/room/TransactionExecutor;)V SPLandroidx/room/TransactionExecutor;->(Ljava/util/concurrent/Executor;)V SPLandroidx/room/TransactionExecutor;->execute$lambda$1$lambda$0(Ljava/lang/Runnable;Landroidx/room/TransactionExecutor;)V SPLandroidx/room/TransactionExecutor;->execute(Ljava/lang/Runnable;)V @@ -4478,14 +5057,12 @@ SPLandroidx/room/Transactor$SQLiteTransactionType;->()V SPLandroidx/room/Transactor$SQLiteTransactionType;->(Ljava/lang/String;I)V SPLandroidx/room/Transactor$SQLiteTransactionType;->values()[Landroidx/room/Transactor$SQLiteTransactionType; Landroidx/room/TransactorKt; -SPLandroidx/room/TransactorKt;->$r8$lambda$VVj_enrVNhrquoXbSKTrpTfnIsI(Landroidx/sqlite/SQLiteStatement;)Z SPLandroidx/room/TransactorKt;->execSQL$lambda$0(Landroidx/sqlite/SQLiteStatement;)Z SPLandroidx/room/TransactorKt;->execSQL(Landroidx/room/PooledConnection;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/room/TransactorKt$$ExternalSyntheticLambda0; SPLandroidx/room/TransactorKt$$ExternalSyntheticLambda0;->()V SPLandroidx/room/TransactorKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/room/TriggerBasedInvalidationTracker; -SPLandroidx/room/TriggerBasedInvalidationTracker;->$r8$lambda$NRZHa3RQXpIcgcxW1BMkNDbO3A8(Landroidx/sqlite/SQLiteStatement;)Ljava/util/Set; SPLandroidx/room/TriggerBasedInvalidationTracker;->()V SPLandroidx/room/TriggerBasedInvalidationTracker;->(Landroidx/room/RoomDatabase;Ljava/util/Map;Ljava/util/Map;[Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)V SPLandroidx/room/TriggerBasedInvalidationTracker;->access$checkInvalidatedTables(Landroidx/room/TriggerBasedInvalidationTracker;Landroidx/room/PooledConnection;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -4758,7 +5335,9 @@ SPLandroidx/savedstate/Recreator$Companion;->()V SPLandroidx/savedstate/Recreator$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Landroidx/savedstate/SavedStateReader; SPLandroidx/savedstate/SavedStateReader;->constructor-impl(Landroid/os/Bundle;)Landroid/os/Bundle; +SPLandroidx/savedstate/SavedStateReader;->contains-impl(Landroid/os/Bundle;Ljava/lang/String;)Z SPLandroidx/savedstate/SavedStateReader;->isEmpty-impl(Landroid/os/Bundle;)Z +SPLandroidx/savedstate/SavedStateReader;->toMap-impl(Landroid/os/Bundle;)Ljava/util/Map; Landroidx/savedstate/SavedStateRegistry; SPLandroidx/savedstate/SavedStateRegistry;->(Landroidx/savedstate/internal/SavedStateRegistryImpl;)V SPLandroidx/savedstate/SavedStateRegistry;->consumeRestoredStateForKey(Ljava/lang/String;)Landroid/os/Bundle; @@ -4775,7 +5354,6 @@ SPLandroidx/savedstate/SavedStateRegistryController;->performAttach()V SPLandroidx/savedstate/SavedStateRegistryController;->performRestore(Landroid/os/Bundle;)V SPLandroidx/savedstate/SavedStateRegistryController;->performSave(Landroid/os/Bundle;)V Landroidx/savedstate/SavedStateRegistryController$Companion; -SPLandroidx/savedstate/SavedStateRegistryController$Companion;->$r8$lambda$mYKAg7nh_JcP4XSEzfHJKM82YOw(Landroidx/savedstate/SavedStateRegistryOwner;)Lkotlin/Unit; SPLandroidx/savedstate/SavedStateRegistryController$Companion;->()V SPLandroidx/savedstate/SavedStateRegistryController$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLandroidx/savedstate/SavedStateRegistryController$Companion;->create$lambda$0(Landroidx/savedstate/SavedStateRegistryOwner;)Lkotlin/Unit; @@ -4789,7 +5367,6 @@ SPLandroidx/savedstate/SavedStateWriter;->constructor-impl(Landroid/os/Bundle;)L Landroidx/savedstate/ViewTreeSavedStateRegistryOwner; SPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner;->set(Landroid/view/View;Landroidx/savedstate/SavedStateRegistryOwner;)V Landroidx/savedstate/internal/SavedStateRegistryImpl; -SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->$r8$lambda$6xnOyEL_uTccN7fW0CY8JkIx-HI(Landroidx/savedstate/internal/SavedStateRegistryImpl;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->()V SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->(Landroidx/savedstate/SavedStateRegistryOwner;Lkotlin/jvm/functions/Function0;)V SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->access$getKeyToProviders$p(Landroidx/savedstate/internal/SavedStateRegistryImpl;)Ljava/util/Map; @@ -4814,10 +5391,8 @@ Landroidx/sqlite/SQLiteConnection; Landroidx/sqlite/SQLiteDriver; Landroidx/sqlite/SQLiteStatement; SPLandroidx/sqlite/SQLiteStatement;->getBoolean(I)Z -Landroidx/sqlite/db/SupportSQLiteCompat$Api21Impl; -SPLandroidx/sqlite/db/SupportSQLiteCompat$Api21Impl;->()V -SPLandroidx/sqlite/db/SupportSQLiteCompat$Api21Impl;->()V -SPLandroidx/sqlite/db/SupportSQLiteCompat$Api21Impl;->getNoBackupFilesDir(Landroid/content/Context;)Ljava/io/File; +Landroidx/sqlite/SQLite__SQLite_nonWebKt; +SPLandroidx/sqlite/SQLite__SQLite_nonWebKt;->execSQL(Landroidx/sqlite/SQLiteConnection;Ljava/lang/String;)V Landroidx/sqlite/db/SupportSQLiteDatabase; Landroidx/sqlite/db/SupportSQLiteOpenHelper; Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback; @@ -4846,22 +5421,18 @@ Landroidx/sqlite/db/SupportSQLiteProgram; Landroidx/sqlite/db/SupportSQLiteQuery; Landroidx/sqlite/db/SupportSQLiteStatement; Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; -SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->$r8$lambda$4rXSxUDV5Jwg_myyvvGbHMZMbGM()Ljava/lang/reflect/Method; -SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->$r8$lambda$TcD1j6gYKY4LbAnrkC-XD1zFcJk(Lkotlin/jvm/functions/Function4;Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)Landroid/database/Cursor; -SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->$r8$lambda$dKqImjZeKtSaT9NYGZ8XQAtPq7s()Ljava/lang/reflect/Method; -SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->$r8$lambda$lJwI5rfEgbbousRT0mbuHaL1K3E(Landroidx/sqlite/db/SupportSQLiteQuery;Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)Landroid/database/sqlite/SQLiteCursor; SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->()V SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->(Landroid/database/sqlite/SQLiteDatabase;)V SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->access$getBeginTransactionMethod$delegate$cp()Lkotlin/Lazy; SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->access$getGetThreadSessionMethod$delegate$cp()Lkotlin/Lazy; SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransaction()V -SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransactionMethod_delegate$lambda$8()Ljava/lang/reflect/Method; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransactionMethod_delegate$lambda$0()Ljava/lang/reflect/Method; SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransactionNonExclusive()V SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransactionReadOnly()V SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->compileStatement(Ljava/lang/String;)Landroidx/sqlite/db/SupportSQLiteStatement; SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->endTransaction()V SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->execSQL(Ljava/lang/String;)V -SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->getThreadSessionMethod_delegate$lambda$7()Ljava/lang/reflect/Method; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->getThreadSessionMethod_delegate$lambda$0()Ljava/lang/reflect/Method; SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->inTransaction()Z SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->internalBeginTransactionWithListenerReadOnly(Landroid/database/sqlite/SQLiteTransactionListener;)V SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isDelegate$sqlite_framework(Landroid/database/sqlite/SQLiteDatabase;)Z @@ -4891,7 +5462,6 @@ SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion;->access$getGe SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion;->getBeginTransactionMethod()Ljava/lang/reflect/Method; SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion;->getGetThreadSessionMethod()Ljava/lang/reflect/Method; Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper; -SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->$r8$lambda$bMXVQYZgPq9YSTqMFpOzwjrmmJ8(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper; SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->()V SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;ZZ)V SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->getDatabaseName()Ljava/lang/String; @@ -4972,29 +5542,20 @@ Landroidx/swiperefreshlayout/widget/CircularProgressDrawable; SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->()V SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->(Landroid/content/Context;)V SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->getOpacity()I -SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setAlpha(I)V -SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setRotation(F)V SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setSizeParameters(FFFF)V SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setStrokeWidth(F)V SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setStyle(I)V SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setupAnimators()V -SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->stop()V Landroidx/swiperefreshlayout/widget/CircularProgressDrawable$1; SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$1;->(Landroidx/swiperefreshlayout/widget/CircularProgressDrawable;Landroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;)V Landroidx/swiperefreshlayout/widget/CircularProgressDrawable$2; SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$2;->(Landroidx/swiperefreshlayout/widget/CircularProgressDrawable;Landroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;)V Landroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring; SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->()V -SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->resetOriginals()V -SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setAlpha(I)V SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setArrowDimensions(FF)V SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setCenterRadius(F)V SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setColorIndex(I)V SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setColors([I)V -SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setEndTrim(F)V -SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setRotation(F)V -SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setShowArrow(Z)V -SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setStartTrim(F)V SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setStrokeWidth(F)V Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout; SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->()V @@ -5005,8 +5566,6 @@ SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->getChildDrawingOrder( SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->moveToStart(F)V SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onLayout(ZIIII)V SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onMeasure(II)V -SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->reset()V -SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setColorViewAlpha(I)V SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setDistanceToTriggerSync(I)V SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setEnabled(Z)V SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setNestedScrollingEnabled(Z)V @@ -5019,16 +5578,143 @@ SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout$6;->(Landroidx/sw Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout$7; SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout$7;->(Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout;)V Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout$OnRefreshListener; +Landroidx/tracing/AbstractTraceSink; +SPLandroidx/tracing/AbstractTraceSink;->()V +Landroidx/tracing/CommonKt; +SPLandroidx/tracing/CommonKt;->()V +SPLandroidx/tracing/CommonKt;->monotonicId()J +Landroidx/tracing/Counter; +Landroidx/tracing/CounterTrack; +SPLandroidx/tracing/CounterTrack;->(Ljava/lang/String;Landroidx/tracing/Track;)V +Landroidx/tracing/EmptyCloseable; +SPLandroidx/tracing/EmptyCloseable;->()V +SPLandroidx/tracing/EmptyCloseable;->()V +SPLandroidx/tracing/EmptyCloseable;->close()V +Landroidx/tracing/EmptyCounterTrack; +SPLandroidx/tracing/EmptyCounterTrack;->(Landroidx/tracing/EmptyProcessTrack;)V +Landroidx/tracing/EmptyEventMetadata; +SPLandroidx/tracing/EmptyEventMetadata;->()V +SPLandroidx/tracing/EmptyEventMetadata;->()V +Landroidx/tracing/EmptyProcessTrack; +SPLandroidx/tracing/EmptyProcessTrack;->(Landroidx/tracing/EmptyTraceContext;)V +Landroidx/tracing/EmptyThreadTrack; +SPLandroidx/tracing/EmptyThreadTrack;->(Landroidx/tracing/EmptyProcessTrack;)V +Landroidx/tracing/EmptyTraceContext; +SPLandroidx/tracing/EmptyTraceContext;->()V +SPLandroidx/tracing/EmptyTraceContext;->()V +SPLandroidx/tracing/EmptyTraceContext;->getProcess()Landroidx/tracing/ProcessTrack; +SPLandroidx/tracing/EmptyTraceContext;->setProcess(Landroidx/tracing/ProcessTrack;)V +Landroidx/tracing/EmptyTraceContext$$ExternalSyntheticLambda0; +SPLandroidx/tracing/EmptyTraceContext$$ExternalSyntheticLambda0;->()V +Landroidx/tracing/EmptyTraceSink; +SPLandroidx/tracing/EmptyTraceSink;->()V +SPLandroidx/tracing/EmptyTraceSink;->()V +Landroidx/tracing/EventMetadata; +SPLandroidx/tracing/EventMetadata;->()V +Landroidx/tracing/EventMetadataCloseable; +SPLandroidx/tracing/EventMetadataCloseable;->(Landroidx/tracing/EventMetadata;Ljava/lang/AutoCloseable;Landroidx/tracing/PropagationToken;)V +SPLandroidx/tracing/EventMetadataCloseable;->(Landroidx/tracing/EventMetadata;Ljava/lang/AutoCloseable;Landroidx/tracing/PropagationToken;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/tracing/PerfettoTracer; +SPLandroidx/tracing/PerfettoTracer;->(Landroidx/tracing/TraceContext;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/tracing/PerfettoTracer;->isCategoryEnabled(Ljava/lang/String;)Z +Landroidx/tracing/PerfettoTracer$$ExternalSyntheticApiModelOutline0; +SPLandroidx/tracing/PerfettoTracer$$ExternalSyntheticApiModelOutline0;->m()Landroid/content/pm/PackageInfo; +SPLandroidx/tracing/PerfettoTracer$$ExternalSyntheticApiModelOutline0;->m()Ljava/lang/String; +Landroidx/tracing/ProcessTrack; +SPLandroidx/tracing/ProcessTrack;->(Landroidx/tracing/TraceContext;ILjava/lang/String;)V +Landroidx/tracing/PropagationToken; +Landroidx/tracing/PropagationUnsupportedToken; +SPLandroidx/tracing/PropagationUnsupportedToken;->()V +SPLandroidx/tracing/PropagationUnsupportedToken;->()V +Landroidx/tracing/SliceTrack; +SPLandroidx/tracing/SliceTrack;->(Landroidx/tracing/TraceContext;J)V +Landroidx/tracing/ThreadTrack; +SPLandroidx/tracing/ThreadTrack;->(JJLjava/lang/String;Landroidx/tracing/ProcessTrack;)V Landroidx/tracing/Trace; +SPLandroidx/tracing/Trace;->()V +SPLandroidx/tracing/Trace;->()V SPLandroidx/tracing/Trace;->beginSection(Ljava/lang/String;)V SPLandroidx/tracing/Trace;->endSection()V SPLandroidx/tracing/Trace;->isEnabled()Z SPLandroidx/tracing/Trace;->truncatedTraceSectionLabel(Ljava/lang/String;)Ljava/lang/String; -Landroidx/tracing/TraceApi18Impl; -SPLandroidx/tracing/TraceApi18Impl;->beginSection(Ljava/lang/String;)V -SPLandroidx/tracing/TraceApi18Impl;->endSection()V Landroidx/tracing/TraceApi29Impl; +SPLandroidx/tracing/TraceApi29Impl;->()V +SPLandroidx/tracing/TraceApi29Impl;->()V SPLandroidx/tracing/TraceApi29Impl;->isEnabled()Z +Landroidx/tracing/TraceAttributes; +SPLandroidx/tracing/TraceAttributes;->()V +Landroidx/tracing/TraceAttributesImpl; +SPLandroidx/tracing/TraceAttributesImpl;->()V +Landroidx/tracing/TraceContext; +SPLandroidx/tracing/TraceContext;->(Landroidx/tracing/AbstractTraceSink;ZLkotlin/jvm/functions/Function1;Z)V +SPLandroidx/tracing/TraceContext;->createProcessTrack(ILjava/lang/String;)V +Landroidx/tracing/TraceEventScope; +SPLandroidx/tracing/TraceEventScope;->()V +Landroidx/tracing/Tracer; +SPLandroidx/tracing/Tracer;->()V +SPLandroidx/tracing/Tracer;->()V +SPLandroidx/tracing/Tracer;->access$getTracer$cp()Landroidx/tracing/Tracer; +SPLandroidx/tracing/Tracer;->stubTracer$lambda$0(Ljava/lang/String;)Z +Landroidx/tracing/Tracer$$ExternalSyntheticLambda0; +SPLandroidx/tracing/Tracer$$ExternalSyntheticLambda0;->()V +SPLandroidx/tracing/Tracer$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/tracing/Tracer$Companion; +SPLandroidx/tracing/Tracer$Companion;->()V +SPLandroidx/tracing/Tracer$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/tracing/Tracer$Companion;->getGlobal()Landroidx/tracing/Tracer; +Landroidx/tracing/Track; +SPLandroidx/tracing/Track;->(Landroidx/tracing/TraceContext;J)V +Landroidx/transition/AutoTransition; +SPLandroidx/transition/AutoTransition;->()V +SPLandroidx/transition/AutoTransition;->init()V +Landroidx/transition/ChangeBounds; +SPLandroidx/transition/ChangeBounds;->()V +SPLandroidx/transition/ChangeBounds;->()V +Landroidx/transition/ChangeBounds$1; +SPLandroidx/transition/ChangeBounds$1;->(Ljava/lang/Class;Ljava/lang/String;)V +Landroidx/transition/ChangeBounds$2; +SPLandroidx/transition/ChangeBounds$2;->(Ljava/lang/Class;Ljava/lang/String;)V +Landroidx/transition/ChangeBounds$3; +SPLandroidx/transition/ChangeBounds$3;->(Ljava/lang/Class;Ljava/lang/String;)V +Landroidx/transition/ChangeBounds$4; +SPLandroidx/transition/ChangeBounds$4;->(Ljava/lang/Class;Ljava/lang/String;)V +Landroidx/transition/ChangeBounds$5; +SPLandroidx/transition/ChangeBounds$5;->(Ljava/lang/Class;Ljava/lang/String;)V +Landroidx/transition/Fade; +SPLandroidx/transition/Fade;->(I)V +Landroidx/transition/PathMotion; +SPLandroidx/transition/PathMotion;->()V +Landroidx/transition/RectEvaluator; +SPLandroidx/transition/RectEvaluator;->()V +Landroidx/transition/Transition; +SPLandroidx/transition/Transition;->()V +SPLandroidx/transition/Transition;->()V +SPLandroidx/transition/Transition;->excludeTarget(Ljava/lang/Class;Z)Landroidx/transition/Transition; +SPLandroidx/transition/Transition;->excludeType(Ljava/util/ArrayList;Ljava/lang/Class;Z)Ljava/util/ArrayList; +SPLandroidx/transition/Transition;->getInterpolator()Landroid/animation/TimeInterpolator; +SPLandroidx/transition/Transition;->setDuration(J)Landroidx/transition/Transition; +SPLandroidx/transition/Transition;->setInterpolator(Landroid/animation/TimeInterpolator;)Landroidx/transition/Transition; +Landroidx/transition/Transition$1; +SPLandroidx/transition/Transition$1;->()V +Landroidx/transition/Transition$ArrayListManager; +SPLandroidx/transition/Transition$ArrayListManager;->add(Ljava/util/ArrayList;Ljava/lang/Object;)Ljava/util/ArrayList; +Landroidx/transition/TransitionManager; +SPLandroidx/transition/TransitionManager;->()V +SPLandroidx/transition/TransitionManager;->beginDelayedTransition(Landroid/view/ViewGroup;Landroidx/transition/Transition;)V +Landroidx/transition/TransitionSet; +SPLandroidx/transition/TransitionSet;->()V +SPLandroidx/transition/TransitionSet;->addTransition(Landroidx/transition/Transition;)Landroidx/transition/TransitionSet; +SPLandroidx/transition/TransitionSet;->addTransitionInternal(Landroidx/transition/Transition;)V +SPLandroidx/transition/TransitionSet;->excludeTarget(Ljava/lang/Class;Z)Landroidx/transition/Transition; +SPLandroidx/transition/TransitionSet;->setDuration(J)Landroidx/transition/TransitionSet; +SPLandroidx/transition/TransitionSet;->setInterpolator(Landroid/animation/TimeInterpolator;)Landroidx/transition/TransitionSet; +SPLandroidx/transition/TransitionSet;->setOrdering(I)Landroidx/transition/TransitionSet; +Landroidx/transition/TransitionValuesMaps; +SPLandroidx/transition/TransitionValuesMaps;->()V +Landroidx/transition/Visibility; +SPLandroidx/transition/Visibility;->()V +SPLandroidx/transition/Visibility;->()V +SPLandroidx/transition/Visibility;->setMode(I)V Landroidx/vectordrawable/graphics/drawable/Animatable2Compat; Landroidx/vectordrawable/graphics/drawable/Animatable2Compat$AnimationCallback; SPLandroidx/vectordrawable/graphics/drawable/Animatable2Compat$AnimationCallback;->()V @@ -5061,41 +5747,44 @@ SPLandroidx/work/Configuration;->getMinimumLoggingLevel()I SPLandroidx/work/Configuration;->getRunnableScheduler()Landroidx/work/RunnableScheduler; SPLandroidx/work/Configuration;->getTaskExecutor()Ljava/util/concurrent/Executor; SPLandroidx/work/Configuration;->getTracer()Landroidx/work/Tracer; +SPLandroidx/work/Configuration;->isGreedySchedulerEnabled()Z SPLandroidx/work/Configuration;->isMarkingJobsAsImportantWhileForeground()Z +SPLandroidx/work/Configuration;->isRepresentativeJobsEnabled()Z Landroidx/work/Configuration$Builder; SPLandroidx/work/Configuration$Builder;->()V SPLandroidx/work/Configuration$Builder;->build()Landroidx/work/Configuration; -SPLandroidx/work/Configuration$Builder;->getClock$work_runtime_release()Landroidx/work/Clock; -SPLandroidx/work/Configuration$Builder;->getContentUriTriggerWorkersLimit$work_runtime_release()I -SPLandroidx/work/Configuration$Builder;->getDefaultProcessName$work_runtime_release()Ljava/lang/String; -SPLandroidx/work/Configuration$Builder;->getExecutor$work_runtime_release()Ljava/util/concurrent/Executor; -SPLandroidx/work/Configuration$Builder;->getInitializationExceptionHandler$work_runtime_release()Landroidx/core/util/Consumer; -SPLandroidx/work/Configuration$Builder;->getInputMergerFactory$work_runtime_release()Landroidx/work/InputMergerFactory; -SPLandroidx/work/Configuration$Builder;->getLoggingLevel$work_runtime_release()I -SPLandroidx/work/Configuration$Builder;->getMarkJobsAsImportantWhileForeground$work_runtime_release()Z -SPLandroidx/work/Configuration$Builder;->getMaxJobSchedulerId$work_runtime_release()I -SPLandroidx/work/Configuration$Builder;->getMaxSchedulerLimit$work_runtime_release()I -SPLandroidx/work/Configuration$Builder;->getMinJobSchedulerId$work_runtime_release()I -SPLandroidx/work/Configuration$Builder;->getRemoteSessionTimeoutMillis$work_runtime_release()J -SPLandroidx/work/Configuration$Builder;->getRunnableScheduler$work_runtime_release()Landroidx/work/RunnableScheduler; -SPLandroidx/work/Configuration$Builder;->getSchedulingExceptionHandler$work_runtime_release()Landroidx/core/util/Consumer; -SPLandroidx/work/Configuration$Builder;->getTaskExecutor$work_runtime_release()Ljava/util/concurrent/Executor; -SPLandroidx/work/Configuration$Builder;->getTracer$work_runtime_release()Landroidx/work/Tracer; -SPLandroidx/work/Configuration$Builder;->getWorkerContext$work_runtime_release()Lkotlin/coroutines/CoroutineContext; -SPLandroidx/work/Configuration$Builder;->getWorkerExecutionExceptionHandler$work_runtime_release()Landroidx/core/util/Consumer; -SPLandroidx/work/Configuration$Builder;->getWorkerFactory$work_runtime_release()Landroidx/work/WorkerFactory; -SPLandroidx/work/Configuration$Builder;->getWorkerInitializationExceptionHandler$work_runtime_release()Landroidx/core/util/Consumer; +SPLandroidx/work/Configuration$Builder;->getClock$work_runtime()Landroidx/work/Clock; +SPLandroidx/work/Configuration$Builder;->getContentUriTriggerWorkersLimit$work_runtime()I +SPLandroidx/work/Configuration$Builder;->getDefaultProcessName$work_runtime()Ljava/lang/String; +SPLandroidx/work/Configuration$Builder;->getEnableGreedyScheduler$work_runtime()Z +SPLandroidx/work/Configuration$Builder;->getEnableRepresentativeJobs$work_runtime()Z +SPLandroidx/work/Configuration$Builder;->getExecutionEventListener$work_runtime()Landroidx/work/ExecutionEventListener; +SPLandroidx/work/Configuration$Builder;->getExecutor$work_runtime()Ljava/util/concurrent/Executor; +SPLandroidx/work/Configuration$Builder;->getInitializationExceptionHandler$work_runtime()Landroidx/core/util/Consumer; +SPLandroidx/work/Configuration$Builder;->getInputMergerFactory$work_runtime()Landroidx/work/InputMergerFactory; +SPLandroidx/work/Configuration$Builder;->getLoggingLevel$work_runtime()I +SPLandroidx/work/Configuration$Builder;->getMarkJobsAsImportantWhileForeground$work_runtime()Z +SPLandroidx/work/Configuration$Builder;->getMaxJobSchedulerId$work_runtime()I +SPLandroidx/work/Configuration$Builder;->getMaxSchedulerLimit$work_runtime()I +SPLandroidx/work/Configuration$Builder;->getMinJobSchedulerId$work_runtime()I +SPLandroidx/work/Configuration$Builder;->getRemoteCancellationPropagationFixEnabled$work_runtime()Z +SPLandroidx/work/Configuration$Builder;->getRemoteSessionTimeoutMillis$work_runtime()J +SPLandroidx/work/Configuration$Builder;->getRunnableScheduler$work_runtime()Landroidx/work/RunnableScheduler; +SPLandroidx/work/Configuration$Builder;->getScheduleEventListener$work_runtime()Landroidx/work/ScheduleEventListener; +SPLandroidx/work/Configuration$Builder;->getSchedulingExceptionHandler$work_runtime()Landroidx/core/util/Consumer; +SPLandroidx/work/Configuration$Builder;->getTaskExecutor$work_runtime()Ljava/util/concurrent/Executor; +SPLandroidx/work/Configuration$Builder;->getTracer$work_runtime()Landroidx/work/Tracer; +SPLandroidx/work/Configuration$Builder;->getWorkerContext$work_runtime()Lkotlin/coroutines/CoroutineContext; +SPLandroidx/work/Configuration$Builder;->getWorkerExecutionExceptionHandler$work_runtime()Landroidx/core/util/Consumer; +SPLandroidx/work/Configuration$Builder;->getWorkerFactory$work_runtime()Landroidx/work/WorkerFactory; +SPLandroidx/work/Configuration$Builder;->getWorkerInitializationExceptionHandler$work_runtime()Landroidx/core/util/Consumer; Landroidx/work/Configuration$Companion; SPLandroidx/work/Configuration$Companion;->()V SPLandroidx/work/Configuration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/work/Configuration$Companion;->calculateExecutorParallelismLimit()I Landroidx/work/ConfigurationKt; -SPLandroidx/work/ConfigurationKt;->access$createDefaultExecutor(Z)Ljava/util/concurrent/Executor; SPLandroidx/work/ConfigurationKt;->access$createDefaultTracer()Landroidx/work/Tracer; -SPLandroidx/work/ConfigurationKt;->createDefaultExecutor(Z)Ljava/util/concurrent/Executor; SPLandroidx/work/ConfigurationKt;->createDefaultTracer()Landroidx/work/Tracer; -Landroidx/work/ConfigurationKt$createDefaultExecutor$factory$1; -SPLandroidx/work/ConfigurationKt$createDefaultExecutor$factory$1;->(Z)V -SPLandroidx/work/ConfigurationKt$createDefaultExecutor$factory$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; Landroidx/work/ConfigurationKt$createDefaultTracer$tracer$1; SPLandroidx/work/ConfigurationKt$createDefaultTracer$tracer$1;->()V SPLandroidx/work/ConfigurationKt$createDefaultTracer$tracer$1;->isEnabled()Z @@ -5105,6 +5794,7 @@ Landroidx/work/Data$Builder; Landroidx/work/DefaultWorkerFactory; SPLandroidx/work/DefaultWorkerFactory;->()V SPLandroidx/work/DefaultWorkerFactory;->()V +Landroidx/work/ExecutionEventListener; Landroidx/work/InputMergerFactory; SPLandroidx/work/InputMergerFactory;->()V Landroidx/work/ListenableWorker; @@ -5117,6 +5807,10 @@ SPLandroidx/work/Logger;->tagWithPrefix(Ljava/lang/String;)Ljava/lang/String; Landroidx/work/Logger$LogcatLogger; SPLandroidx/work/Logger$LogcatLogger;->(I)V SPLandroidx/work/Logger$LogcatLogger;->debug(Ljava/lang/String;Ljava/lang/String;)V +Landroidx/work/NetworkType; +SPLandroidx/work/NetworkType;->$values()[Landroidx/work/NetworkType; +SPLandroidx/work/NetworkType;->()V +SPLandroidx/work/NetworkType;->(Ljava/lang/String;I)V Landroidx/work/NoOpInputMergerFactory; SPLandroidx/work/NoOpInputMergerFactory;->()V SPLandroidx/work/NoOpInputMergerFactory;->()V @@ -5126,17 +5820,16 @@ Landroidx/work/Operation$State; SPLandroidx/work/Operation$State;->()V Landroidx/work/Operation$State$IN_PROGRESS; SPLandroidx/work/Operation$State$IN_PROGRESS;->()V -SPLandroidx/work/Operation$State$IN_PROGRESS;->(Landroidx/work/Operation$1;)V +SPLandroidx/work/Operation$State$IN_PROGRESS;->(Landroidx/work/Operation-IA;)V Landroidx/work/Operation$State$SUCCESS; SPLandroidx/work/Operation$State$SUCCESS;->()V -SPLandroidx/work/Operation$State$SUCCESS;->(Landroidx/work/Operation$1;)V +SPLandroidx/work/Operation$State$SUCCESS;->(Landroidx/work/Operation-IA;)V Landroidx/work/OperationImpl; SPLandroidx/work/OperationImpl;->(Landroidx/lifecycle/LiveData;Lcom/google/common/util/concurrent/ListenableFuture;)V Landroidx/work/OperationKt; -SPLandroidx/work/OperationKt;->$r8$lambda$4AmAQmnwY87AwH_dAIVR-wuDub0(Ljava/util/concurrent/Executor;Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/MutableLiveData;Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer;)Lkotlin/Unit; -SPLandroidx/work/OperationKt;->$r8$lambda$XKAkIiEN7OgIvwuLUZRQpJhjmyE(Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/MutableLiveData;Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer;)V -SPLandroidx/work/OperationKt;->launchOperation$lambda$2$lambda$1(Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/MutableLiveData;Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer;)V -SPLandroidx/work/OperationKt;->launchOperation$lambda$2(Ljava/util/concurrent/Executor;Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/MutableLiveData;Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer;)Lkotlin/Unit; +SPLandroidx/work/OperationKt;->$r8$lambda$HpXEiU5zZrnWi4iuCKdgd7dMYGk(Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/MutableLiveData;Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer;)V +SPLandroidx/work/OperationKt;->launchOperation$lambda$0$0(Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/MutableLiveData;Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer;)V +SPLandroidx/work/OperationKt;->launchOperation$lambda$0(Ljava/util/concurrent/Executor;Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/MutableLiveData;Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer;)Lkotlin/Unit; SPLandroidx/work/OperationKt;->launchOperation(Landroidx/work/Tracer;Ljava/lang/String;Ljava/util/concurrent/Executor;Lkotlin/jvm/functions/Function0;)Landroidx/work/Operation; Landroidx/work/OperationKt$$ExternalSyntheticLambda0; SPLandroidx/work/OperationKt$$ExternalSyntheticLambda0;->(Ljava/util/concurrent/Executor;Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/MutableLiveData;)V @@ -5146,6 +5839,7 @@ SPLandroidx/work/OperationKt$$ExternalSyntheticLambda1;->(Landroidx/work/T SPLandroidx/work/OperationKt$$ExternalSyntheticLambda1;->run()V Landroidx/work/R$bool; Landroidx/work/RunnableScheduler; +Landroidx/work/ScheduleEventListener; Landroidx/work/SystemClock; SPLandroidx/work/SystemClock;->()V SPLandroidx/work/SystemClock;->currentTimeMillis()J @@ -5231,8 +5925,9 @@ SPLandroidx/work/impl/Schedulers;->createBestAvailableBackgroundScheduler(Landro SPLandroidx/work/impl/Schedulers;->markScheduled(Landroidx/work/impl/model/WorkSpecDao;Landroidx/work/Clock;Ljava/util/List;)V SPLandroidx/work/impl/Schedulers;->registerRescheduling(Ljava/util/List;Landroidx/work/impl/Processor;Ljava/util/concurrent/Executor;Landroidx/work/impl/WorkDatabase;Landroidx/work/Configuration;)V SPLandroidx/work/impl/Schedulers;->schedule(Landroidx/work/Configuration;Landroidx/work/impl/WorkDatabase;Ljava/util/List;)V -Landroidx/work/impl/Schedulers$$ExternalSyntheticLambda0; -SPLandroidx/work/impl/Schedulers$$ExternalSyntheticLambda0;->(Ljava/util/concurrent/Executor;Ljava/util/List;Landroidx/work/Configuration;Landroidx/work/impl/WorkDatabase;)V +SPLandroidx/work/impl/Schedulers;->scheduleWorkSpecs(Ljava/util/List;Ljava/util/List;Z)V +Landroidx/work/impl/Schedulers$$ExternalSyntheticLambda1; +SPLandroidx/work/impl/Schedulers$$ExternalSyntheticLambda1;->(Ljava/util/concurrent/Executor;Landroidx/work/impl/WorkDatabase;Ljava/util/List;Landroidx/work/Configuration;)V Landroidx/work/impl/StartStopTokens; SPLandroidx/work/impl/StartStopTokens;->()V SPLandroidx/work/impl/StartStopTokens;->create()Landroidx/work/impl/StartStopTokens; @@ -5261,7 +5956,6 @@ Landroidx/work/impl/WorkDatabase; SPLandroidx/work/impl/WorkDatabase;->()V SPLandroidx/work/impl/WorkDatabase;->()V Landroidx/work/impl/WorkDatabase$Companion; -SPLandroidx/work/impl/WorkDatabase$Companion;->$r8$lambda$d9uKx9JAMiDvrmcMenix4D379lU(Landroid/content/Context;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; SPLandroidx/work/impl/WorkDatabase$Companion;->()V SPLandroidx/work/impl/WorkDatabase$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLandroidx/work/impl/WorkDatabase$Companion;->create$lambda$0(Landroid/content/Context;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; @@ -5295,14 +5989,10 @@ SPLandroidx/work/impl/WorkDatabase_AutoMigration_22_23_Impl;->()V Landroidx/work/impl/WorkDatabase_AutoMigration_23_24_Impl; SPLandroidx/work/impl/WorkDatabase_AutoMigration_23_24_Impl;->()V Landroidx/work/impl/WorkDatabase_Impl; -SPLandroidx/work/impl/WorkDatabase_Impl;->$r8$lambda$EBCBMQRVkN1sQSZgY0tCFd1jjgA(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/WorkSpecDao_Impl; -SPLandroidx/work/impl/WorkDatabase_Impl;->$r8$lambda$Q4e7dMsbchyXlG7si6nJ2S-X0Hg(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/PreferenceDao_Impl; -SPLandroidx/work/impl/WorkDatabase_Impl;->$r8$lambda$VD7PkCdHr0pD6cL8vVPjuCZZsCo(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/SystemIdInfoDao_Impl; -SPLandroidx/work/impl/WorkDatabase_Impl;->$r8$lambda$YXFG2V7GSqY1Fh14uyLBpxHvsJg(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/WorkProgressDao_Impl; SPLandroidx/work/impl/WorkDatabase_Impl;->()V -SPLandroidx/work/impl/WorkDatabase_Impl;->_preferenceDao$lambda$6(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/PreferenceDao_Impl; -SPLandroidx/work/impl/WorkDatabase_Impl;->_systemIdInfoDao$lambda$3(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/SystemIdInfoDao_Impl; -SPLandroidx/work/impl/WorkDatabase_Impl;->_workProgressDao$lambda$5(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/WorkProgressDao_Impl; +SPLandroidx/work/impl/WorkDatabase_Impl;->_preferenceDao$lambda$0(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/PreferenceDao_Impl; +SPLandroidx/work/impl/WorkDatabase_Impl;->_systemIdInfoDao$lambda$0(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/SystemIdInfoDao_Impl; +SPLandroidx/work/impl/WorkDatabase_Impl;->_workProgressDao$lambda$0(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/WorkProgressDao_Impl; SPLandroidx/work/impl/WorkDatabase_Impl;->_workSpecDao$lambda$0(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/WorkSpecDao_Impl; SPLandroidx/work/impl/WorkDatabase_Impl;->access$internalInitInvalidationTracker(Landroidx/work/impl/WorkDatabase_Impl;Landroidx/sqlite/SQLiteConnection;)V SPLandroidx/work/impl/WorkDatabase_Impl;->createAutoMigrations(Ljava/util/Map;)Ljava/util/List; @@ -5370,7 +6060,6 @@ SPLandroidx/work/impl/WorkManagerImplExtKt;->createSchedulers(Landroid/content/C SPLandroidx/work/impl/WorkManagerImplExtKt;->createWorkManager$default(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;Landroidx/work/impl/WorkDatabase;Landroidx/work/impl/constraints/trackers/Trackers;Landroidx/work/impl/Processor;Lkotlin/jvm/functions/Function6;ILjava/lang/Object;)Landroidx/work/impl/WorkManagerImpl; SPLandroidx/work/impl/WorkManagerImplExtKt;->createWorkManager(Landroid/content/Context;Landroidx/work/Configuration;)Landroidx/work/impl/WorkManagerImpl; SPLandroidx/work/impl/WorkManagerImplExtKt;->createWorkManager(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;Landroidx/work/impl/WorkDatabase;Landroidx/work/impl/constraints/trackers/Trackers;Landroidx/work/impl/Processor;Lkotlin/jvm/functions/Function6;)Landroidx/work/impl/WorkManagerImpl; -SPLandroidx/work/impl/WorkManagerImplExtKt;->createWorkManagerScope(Landroidx/work/impl/utils/taskexecutor/TaskExecutor;)Lkotlinx/coroutines/CoroutineScope; Landroidx/work/impl/WorkManagerImplExtKt$WorkManagerImpl$1; SPLandroidx/work/impl/WorkManagerImplExtKt$WorkManagerImpl$1;->()V SPLandroidx/work/impl/WorkManagerImplExtKt$WorkManagerImpl$1;->()V @@ -5422,6 +6111,8 @@ SPLandroidx/work/impl/constraints/WorkConstraintsTracker;->(Ljava/util/Lis Landroidx/work/impl/constraints/WorkConstraintsTrackerKt; SPLandroidx/work/impl/constraints/WorkConstraintsTrackerKt;->()V SPLandroidx/work/impl/constraints/WorkConstraintsTrackerKt;->NetworkRequestConstraintController(Landroid/content/Context;)Landroidx/work/impl/constraints/NetworkRequestConstraintController; +SPLandroidx/work/impl/constraints/WorkConstraintsTrackerKt;->access$createControllers(Landroidx/work/impl/constraints/trackers/Trackers;)Ljava/util/List; +SPLandroidx/work/impl/constraints/WorkConstraintsTrackerKt;->createControllers(Landroidx/work/impl/constraints/trackers/Trackers;)Ljava/util/List; Landroidx/work/impl/constraints/controllers/BaseConstraintController; SPLandroidx/work/impl/constraints/controllers/BaseConstraintController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V Landroidx/work/impl/constraints/controllers/BatteryChargingController; @@ -5429,22 +6120,6 @@ SPLandroidx/work/impl/constraints/controllers/BatteryChargingController;-> Landroidx/work/impl/constraints/controllers/BatteryNotLowController; SPLandroidx/work/impl/constraints/controllers/BatteryNotLowController;->(Landroidx/work/impl/constraints/trackers/BatteryNotLowTracker;)V Landroidx/work/impl/constraints/controllers/ConstraintController; -Landroidx/work/impl/constraints/controllers/NetworkConnectedController; -SPLandroidx/work/impl/constraints/controllers/NetworkConnectedController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V -Landroidx/work/impl/constraints/controllers/NetworkMeteredController; -SPLandroidx/work/impl/constraints/controllers/NetworkMeteredController;->()V -SPLandroidx/work/impl/constraints/controllers/NetworkMeteredController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V -Landroidx/work/impl/constraints/controllers/NetworkMeteredController$Companion; -SPLandroidx/work/impl/constraints/controllers/NetworkMeteredController$Companion;->()V -SPLandroidx/work/impl/constraints/controllers/NetworkMeteredController$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -Landroidx/work/impl/constraints/controllers/NetworkNotRoamingController; -SPLandroidx/work/impl/constraints/controllers/NetworkNotRoamingController;->()V -SPLandroidx/work/impl/constraints/controllers/NetworkNotRoamingController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V -Landroidx/work/impl/constraints/controllers/NetworkNotRoamingController$Companion; -SPLandroidx/work/impl/constraints/controllers/NetworkNotRoamingController$Companion;->()V -SPLandroidx/work/impl/constraints/controllers/NetworkNotRoamingController$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -Landroidx/work/impl/constraints/controllers/NetworkUnmeteredController; -SPLandroidx/work/impl/constraints/controllers/NetworkUnmeteredController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V Landroidx/work/impl/constraints/controllers/StorageNotLowController; SPLandroidx/work/impl/constraints/controllers/StorageNotLowController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V Landroidx/work/impl/constraints/trackers/BatteryChargingTracker; @@ -5457,14 +6132,6 @@ Landroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker$broa SPLandroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker$broadcastReceiver$1;->(Landroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker;)V Landroidx/work/impl/constraints/trackers/ConstraintTracker; SPLandroidx/work/impl/constraints/trackers/ConstraintTracker;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;)V -SPLandroidx/work/impl/constraints/trackers/ConstraintTracker;->getAppContext()Landroid/content/Context; -Landroidx/work/impl/constraints/trackers/NetworkStateTracker24; -SPLandroidx/work/impl/constraints/trackers/NetworkStateTracker24;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;)V -Landroidx/work/impl/constraints/trackers/NetworkStateTracker24$networkCallback$1; -SPLandroidx/work/impl/constraints/trackers/NetworkStateTracker24$networkCallback$1;->(Landroidx/work/impl/constraints/trackers/NetworkStateTracker24;)V -Landroidx/work/impl/constraints/trackers/NetworkStateTrackerKt; -SPLandroidx/work/impl/constraints/trackers/NetworkStateTrackerKt;->()V -SPLandroidx/work/impl/constraints/trackers/NetworkStateTrackerKt;->NetworkStateTracker(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;)Landroidx/work/impl/constraints/trackers/ConstraintTracker; Landroidx/work/impl/constraints/trackers/StorageNotLowTracker; SPLandroidx/work/impl/constraints/trackers/StorageNotLowTracker;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;)V Landroidx/work/impl/constraints/trackers/Trackers; @@ -5473,7 +6140,6 @@ SPLandroidx/work/impl/constraints/trackers/Trackers;->(Landroid/content/Co SPLandroidx/work/impl/constraints/trackers/Trackers;->getBatteryChargingTracker()Landroidx/work/impl/constraints/trackers/ConstraintTracker; SPLandroidx/work/impl/constraints/trackers/Trackers;->getBatteryNotLowTracker()Landroidx/work/impl/constraints/trackers/BatteryNotLowTracker; SPLandroidx/work/impl/constraints/trackers/Trackers;->getContext()Landroid/content/Context; -SPLandroidx/work/impl/constraints/trackers/Trackers;->getNetworkStateTracker()Landroidx/work/impl/constraints/trackers/ConstraintTracker; SPLandroidx/work/impl/constraints/trackers/Trackers;->getStorageNotLowTracker()Landroidx/work/impl/constraints/trackers/ConstraintTracker; Landroidx/work/impl/foreground/ForegroundProcessor; Landroidx/work/impl/model/DependencyDao; @@ -5489,11 +6155,9 @@ SPLandroidx/work/impl/model/Preference;->getKey()Ljava/lang/String; SPLandroidx/work/impl/model/Preference;->getValue()Ljava/lang/Long; Landroidx/work/impl/model/PreferenceDao; Landroidx/work/impl/model/PreferenceDao_Impl; -SPLandroidx/work/impl/model/PreferenceDao_Impl;->$r8$lambda$WOdbRCbcU9bF-o_A_B2dKOhXNig(Ljava/lang/String;Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/lang/Long; -SPLandroidx/work/impl/model/PreferenceDao_Impl;->$r8$lambda$pV7ZAv1ABN_GLbYRS_jnXDCXzyk(Landroidx/work/impl/model/PreferenceDao_Impl;Landroidx/work/impl/model/Preference;Landroidx/sqlite/SQLiteConnection;)Lkotlin/Unit; SPLandroidx/work/impl/model/PreferenceDao_Impl;->()V SPLandroidx/work/impl/model/PreferenceDao_Impl;->(Landroidx/room/RoomDatabase;)V -SPLandroidx/work/impl/model/PreferenceDao_Impl;->getLongValue$lambda$1(Ljava/lang/String;Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/lang/Long; +SPLandroidx/work/impl/model/PreferenceDao_Impl;->getLongValue$lambda$0(Ljava/lang/String;Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/lang/Long; SPLandroidx/work/impl/model/PreferenceDao_Impl;->getLongValue(Ljava/lang/String;)Ljava/lang/Long; SPLandroidx/work/impl/model/PreferenceDao_Impl;->insertPreference$lambda$0(Landroidx/work/impl/model/PreferenceDao_Impl;Landroidx/work/impl/model/Preference;Landroidx/sqlite/SQLiteConnection;)Lkotlin/Unit; SPLandroidx/work/impl/model/PreferenceDao_Impl;->insertPreference(Landroidx/work/impl/model/Preference;)V @@ -5521,10 +6185,9 @@ SPLandroidx/work/impl/model/RawWorkInfoDao_Impl$Companion;->(Lkotlin/jvm/i SPLandroidx/work/impl/model/RawWorkInfoDao_Impl$Companion;->getRequiredConverters()Ljava/util/List; Landroidx/work/impl/model/SystemIdInfoDao; Landroidx/work/impl/model/SystemIdInfoDao_Impl; -SPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->$r8$lambda$NU7j-t1lTm0KFasmFmR5rCrby_s(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; SPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->()V SPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->(Landroidx/room/RoomDatabase;)V -SPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->getWorkSpecIds$lambda$2(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->getWorkSpecIds$lambda$0(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; SPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->getWorkSpecIds()Ljava/util/List; Landroidx/work/impl/model/SystemIdInfoDao_Impl$$ExternalSyntheticLambda1; SPLandroidx/work/impl/model/SystemIdInfoDao_Impl$$ExternalSyntheticLambda1;->(Ljava/lang/String;)V @@ -5544,10 +6207,9 @@ SPLandroidx/work/impl/model/WorkNameDao_Impl$Companion;->(Lkotlin/jvm/inte SPLandroidx/work/impl/model/WorkNameDao_Impl$Companion;->getRequiredConverters()Ljava/util/List; Landroidx/work/impl/model/WorkProgressDao; Landroidx/work/impl/model/WorkProgressDao_Impl; -SPLandroidx/work/impl/model/WorkProgressDao_Impl;->$r8$lambda$HxEzdbtI1meBd-aXYgHdDeKTIRA(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Lkotlin/Unit; SPLandroidx/work/impl/model/WorkProgressDao_Impl;->()V SPLandroidx/work/impl/model/WorkProgressDao_Impl;->(Landroidx/room/RoomDatabase;)V -SPLandroidx/work/impl/model/WorkProgressDao_Impl;->deleteAll$lambda$3(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Lkotlin/Unit; +SPLandroidx/work/impl/model/WorkProgressDao_Impl;->deleteAll$lambda$0(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Lkotlin/Unit; SPLandroidx/work/impl/model/WorkProgressDao_Impl;->deleteAll()V Landroidx/work/impl/model/WorkProgressDao_Impl$$ExternalSyntheticLambda1; SPLandroidx/work/impl/model/WorkProgressDao_Impl$$ExternalSyntheticLambda1;->(Ljava/lang/String;)V @@ -5571,58 +6233,50 @@ SPLandroidx/work/impl/model/WorkSpecDaoKt$dedup$$inlined$map$1$2;->emit(Ljava/la Landroidx/work/impl/model/WorkSpecDaoKt$dedup$$inlined$map$1$2$1; SPLandroidx/work/impl/model/WorkSpecDaoKt$dedup$$inlined$map$1$2$1;->(Landroidx/work/impl/model/WorkSpecDaoKt$dedup$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V Landroidx/work/impl/model/WorkSpecDao_Impl; -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->$r8$lambda$1X8u9KRHqPGLidWnCmxbXa2nlSk(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)I -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->$r8$lambda$5E9Q3WxcAEUU2AazRaO6GyVPULI(Ljava/lang/String;Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->$r8$lambda$7xU4rcngjQY9wTrzM2HFSRzKlTE(Ljava/lang/String;ILandroidx/sqlite/SQLiteConnection;)Ljava/util/List; -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->$r8$lambda$Bmk0Wb4PqGceYkMRz22vPjZLj7s(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->$r8$lambda$WmdU6OWFKOewjux-UcOkDAId0fg(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->$r8$lambda$fnITpoR1PO1p7_VkaDg0ZRzSZ9U(Ljava/lang/String;ILandroidx/sqlite/SQLiteConnection;)Ljava/util/List; -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->$r8$lambda$hFo_x_SZZBoNGDTckdtCQRnSGyo(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Z -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->$r8$lambda$l7G77qMRDypSz_zq-MZ252vex3M(Ljava/lang/String;Ljava/lang/String;Landroidx/work/impl/model/WorkSpecDao_Impl;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; SPLandroidx/work/impl/model/WorkSpecDao_Impl;->()V SPLandroidx/work/impl/model/WorkSpecDao_Impl;->(Landroidx/room/RoomDatabase;)V SPLandroidx/work/impl/model/WorkSpecDao_Impl;->__fetchRelationshipWorkProgressAsandroidxWorkData(Landroidx/sqlite/SQLiteConnection;Landroidx/collection/ArrayMap;)V SPLandroidx/work/impl/model/WorkSpecDao_Impl;->__fetchRelationshipWorkTagAsjavaLangString(Landroidx/sqlite/SQLiteConnection;Landroidx/collection/ArrayMap;)V -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getAllEligibleWorkSpecsForScheduling$lambda$29(Ljava/lang/String;ILandroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getAllEligibleWorkSpecsForScheduling$lambda$0(Ljava/lang/String;ILandroidx/sqlite/SQLiteConnection;)Ljava/util/List; SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getAllEligibleWorkSpecsForScheduling(I)Ljava/util/List; -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getEligibleWorkForScheduling$lambda$25(Ljava/lang/String;ILandroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getEligibleWorkForScheduling$lambda$0(Ljava/lang/String;ILandroidx/sqlite/SQLiteConnection;)Ljava/util/List; SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getEligibleWorkForScheduling(I)Ljava/util/List; -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getEligibleWorkForSchedulingWithContentUris$lambda$27(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getEligibleWorkForSchedulingWithContentUris$lambda$0(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getEligibleWorkForSchedulingWithContentUris()Ljava/util/List; -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getRunningWork$lambda$33(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getRunningWork$lambda$0(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getRunningWork()Ljava/util/List; -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getUnfinishedWorkWithName$lambda$20(Ljava/lang/String;Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getUnfinishedWorkWithName$lambda$0(Ljava/lang/String;Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getUnfinishedWorkWithName(Ljava/lang/String;)Ljava/util/List; -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getWorkStatusPojoFlowForName$lambda$17(Ljava/lang/String;Ljava/lang/String;Landroidx/work/impl/model/WorkSpecDao_Impl;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getWorkStatusPojoFlowForName$lambda$0(Ljava/lang/String;Ljava/lang/String;Landroidx/work/impl/model/WorkSpecDao_Impl;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getWorkStatusPojoFlowForName(Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow; -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->hasUnfinishedWorkFlow$lambda$22(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Z +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->hasUnfinishedWorkFlow$lambda$0(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Z SPLandroidx/work/impl/model/WorkSpecDao_Impl;->hasUnfinishedWorkFlow()Lkotlinx/coroutines/flow/Flow; -SPLandroidx/work/impl/model/WorkSpecDao_Impl;->resetScheduledState$lambda$48(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)I +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->resetScheduledState$lambda$0(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)I SPLandroidx/work/impl/model/WorkSpecDao_Impl;->resetScheduledState()I -Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda12; -SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda12;->(Ljava/lang/String;Ljava/lang/String;)V -SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda12;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda20; -SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda20;->(Ljava/lang/String;I)V -SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda20;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda34; -SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda34;->(Ljava/lang/String;)V -SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda34;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda13; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda13;->(Ljava/lang/String;Ljava/lang/String;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda13;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda23; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda23;->(Ljava/lang/String;I)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda23;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda37; -SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda37;->(Ljava/lang/String;Ljava/lang/String;Landroidx/work/impl/model/WorkSpecDao_Impl;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda37;->(Ljava/lang/String;)V SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda37;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda45; -SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda45;->(Ljava/lang/String;)V -SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda45;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda6; -SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda6;->(Ljava/lang/String;)V -SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda6;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda40; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda40;->(Ljava/lang/String;Ljava/lang/String;Landroidx/work/impl/model/WorkSpecDao_Impl;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda40;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda48; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda48;->(Ljava/lang/String;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda48;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda7; -SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda7;->(Ljava/lang/String;I)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda7;->(Ljava/lang/String;)V SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda7;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda8; -SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda8;->(Ljava/lang/String;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda8;->(Ljava/lang/String;I)V SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda8;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda9; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda9;->(Ljava/lang/String;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda9;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/work/impl/model/WorkSpecDao_Impl$1; SPLandroidx/work/impl/model/WorkSpecDao_Impl$1;->()V Landroidx/work/impl/model/WorkSpecDao_Impl$2; @@ -5643,11 +6297,9 @@ SPLandroidx/work/impl/utils/Api28Impl;->()V SPLandroidx/work/impl/utils/Api28Impl;->()V SPLandroidx/work/impl/utils/Api28Impl;->getProcessName()Ljava/lang/String; Landroidx/work/impl/utils/CancelWorkRunnable; -SPLandroidx/work/impl/utils/CancelWorkRunnable;->$r8$lambda$4QqdN7ggcyUEiyMiYfM9Uxq5r7Q(Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)Lkotlin/Unit; -SPLandroidx/work/impl/utils/CancelWorkRunnable;->$r8$lambda$7CMxqlNCknD_Q1NSUJ5-L0sWGBQ(Landroidx/work/impl/WorkDatabase;Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)V -SPLandroidx/work/impl/utils/CancelWorkRunnable;->forName$lambda$4(Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)Lkotlin/Unit; +SPLandroidx/work/impl/utils/CancelWorkRunnable;->forName$lambda$0(Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)Lkotlin/Unit; SPLandroidx/work/impl/utils/CancelWorkRunnable;->forName(Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)Landroidx/work/Operation; -SPLandroidx/work/impl/utils/CancelWorkRunnable;->forNameInline$lambda$5(Landroidx/work/impl/WorkDatabase;Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)V +SPLandroidx/work/impl/utils/CancelWorkRunnable;->forNameInline$lambda$0(Landroidx/work/impl/WorkDatabase;Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)V SPLandroidx/work/impl/utils/CancelWorkRunnable;->forNameInline(Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)V SPLandroidx/work/impl/utils/CancelWorkRunnable;->reschedulePendingWorkers(Landroidx/work/impl/WorkManagerImpl;)V Landroidx/work/impl/utils/CancelWorkRunnable$$ExternalSyntheticLambda0; @@ -5670,9 +6322,23 @@ SPLandroidx/work/impl/utils/ForceStopRunnable;->shouldRescheduleWorkers()Z Landroidx/work/impl/utils/ForceStopRunnable$BroadcastReceiver; Landroidx/work/impl/utils/PackageManagerHelper; SPLandroidx/work/impl/utils/PackageManagerHelper;->()V -SPLandroidx/work/impl/utils/PackageManagerHelper;->getComponentEnabledSetting(Landroid/content/Context;Ljava/lang/String;)I -SPLandroidx/work/impl/utils/PackageManagerHelper;->isComponentEnabled(IZ)Z -SPLandroidx/work/impl/utils/PackageManagerHelper;->setComponentEnabled(Landroid/content/Context;Ljava/lang/Class;Z)V +SPLandroidx/work/impl/utils/PackageManagerHelper;->access$isReceiverEnabled(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;)Z +SPLandroidx/work/impl/utils/PackageManagerHelper;->access$isServiceEnabled(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;)Z +SPLandroidx/work/impl/utils/PackageManagerHelper;->isReceiverEnabled(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;)Z +SPLandroidx/work/impl/utils/PackageManagerHelper;->isServiceEnabled(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;)Z +SPLandroidx/work/impl/utils/PackageManagerHelper;->setComponentEnabled(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;ZLkotlin/jvm/functions/Function2;)V +SPLandroidx/work/impl/utils/PackageManagerHelper;->setReceiverEnabled(Landroid/content/Context;Ljava/lang/Class;Z)V +SPLandroidx/work/impl/utils/PackageManagerHelper;->setServiceEnabled(Landroid/content/Context;Ljava/lang/Class;Z)V +Landroidx/work/impl/utils/PackageManagerHelper$setReceiverEnabled$1; +SPLandroidx/work/impl/utils/PackageManagerHelper$setReceiverEnabled$1;->()V +SPLandroidx/work/impl/utils/PackageManagerHelper$setReceiverEnabled$1;->()V +SPLandroidx/work/impl/utils/PackageManagerHelper$setReceiverEnabled$1;->invoke(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;)Ljava/lang/Boolean; +SPLandroidx/work/impl/utils/PackageManagerHelper$setReceiverEnabled$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/utils/PackageManagerHelper$setServiceEnabled$1; +SPLandroidx/work/impl/utils/PackageManagerHelper$setServiceEnabled$1;->()V +SPLandroidx/work/impl/utils/PackageManagerHelper$setServiceEnabled$1;->()V +SPLandroidx/work/impl/utils/PackageManagerHelper$setServiceEnabled$1;->invoke(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;)Ljava/lang/Boolean; +SPLandroidx/work/impl/utils/PackageManagerHelper$setServiceEnabled$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/work/impl/utils/PreferenceUtils; SPLandroidx/work/impl/utils/PreferenceUtils;->(Landroidx/work/impl/WorkDatabase;)V SPLandroidx/work/impl/utils/PreferenceUtils;->getLastForceStopEventMillis()J @@ -5683,6 +6349,7 @@ SPLandroidx/work/impl/utils/ProcessUtils;->()V SPLandroidx/work/impl/utils/ProcessUtils;->getProcessName(Landroid/content/Context;)Ljava/lang/String; SPLandroidx/work/impl/utils/ProcessUtils;->isDefaultProcess(Landroid/content/Context;Landroidx/work/Configuration;)Z Landroidx/work/impl/utils/SerialExecutorImpl; +SPLandroidx/work/impl/utils/SerialExecutorImpl;->()V SPLandroidx/work/impl/utils/SerialExecutorImpl;->(Ljava/util/concurrent/Executor;)V SPLandroidx/work/impl/utils/SerialExecutorImpl;->execute(Ljava/lang/Runnable;)V SPLandroidx/work/impl/utils/SerialExecutorImpl;->scheduleNext()V @@ -5694,6 +6361,7 @@ Landroidx/work/impl/utils/taskexecutor/TaskExecutor; SPLandroidx/work/impl/utils/taskexecutor/TaskExecutor;->executeOnTaskThread(Ljava/lang/Runnable;)V Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor; SPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->(Ljava/util/concurrent/Executor;)V +SPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->getCoroutineScope()Lkotlinx/coroutines/CoroutineScope; SPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->getSerialTaskExecutor()Landroidx/work/impl/utils/SerialExecutorImpl; SPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->getSerialTaskExecutor()Landroidx/work/impl/utils/taskexecutor/SerialExecutor; SPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->getTaskCoroutineDispatcher()Lkotlinx/coroutines/CoroutineDispatcher; @@ -5799,12 +6467,14 @@ SPLanki/backend/GeneratedBackend;->getDeckNames(ZZ)Ljava/util/List; SPLanki/backend/GeneratedBackend;->getDeckNamesRaw([B)[B SPLanki/backend/GeneratedBackend;->getUndoStatus()Lanki/collection/UndoStatus; SPLanki/backend/GeneratedBackend;->getUndoStatusRaw([B)[B +SPLanki/backend/GeneratedBackend;->i18nResources(Ljava/lang/Iterable;)Lcom/google/protobuf/ByteString; +SPLanki/backend/GeneratedBackend;->i18nResourcesRaw([B)[B SPLanki/backend/GeneratedBackend;->openCollection(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V SPLanki/backend/GeneratedBackend;->openCollectionRaw([B)[B SPLanki/backend/GeneratedBackend;->runDbCommandProto(Lcom/google/protobuf/ByteString;)Lanki/ankidroid/DbResponse; SPLanki/backend/GeneratedBackend;->runDbCommandProtoRaw([B)[B -SPLanki/backend/GeneratedBackend;->setConfigJson(Ljava/lang/String;Lcom/google/protobuf/ByteString;Z)Lanki/collection/OpChanges; -SPLanki/backend/GeneratedBackend;->setConfigJsonRaw([B)[B +SPLanki/backend/GeneratedBackend;->schedTimingToday()Lanki/scheduler/SchedTimingTodayResponse; +SPLanki/backend/GeneratedBackend;->schedTimingTodayRaw([B)[B SPLanki/backend/GeneratedBackend;->studiedToday()Ljava/lang/String; SPLanki/backend/GeneratedBackend;->studiedTodayRaw([B)[B SPLanki/backend/GeneratedBackend;->translateStringRaw([B)[B @@ -5847,7 +6517,6 @@ SPLanki/collection/OpChanges;->()V SPLanki/collection/OpChanges;->()V SPLanki/collection/OpChanges;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; SPLanki/collection/OpChanges;->newBuilder()Lanki/collection/OpChanges$Builder; -SPLanki/collection/OpChanges;->parseFrom([B)Lanki/collection/OpChanges; SPLanki/collection/OpChanges;->setBrowserSidebar(Z)V SPLanki/collection/OpChanges;->setBrowserTable(Z)V SPLanki/collection/OpChanges;->setCard(Z)V @@ -5938,6 +6607,12 @@ SPLanki/config/ConfigKey$Bool;->(Ljava/lang/String;II)V SPLanki/config/ConfigKey$Bool;->getNumber()I Lanki/config/ConfigKey$Bool$1; SPLanki/config/ConfigKey$Bool$1;->()V +Lanki/config/ConfigKey$String; +SPLanki/config/ConfigKey$String;->$values()[Lanki/config/ConfigKey$String; +SPLanki/config/ConfigKey$String;->()V +SPLanki/config/ConfigKey$String;->(Ljava/lang/String;II)V +Lanki/config/ConfigKey$String$1; +SPLanki/config/ConfigKey$String$1;->()V Lanki/config/GetConfigBoolRequest; SPLanki/config/GetConfigBoolRequest;->-$$Nest$msetKey(Lanki/config/GetConfigBoolRequest;Lanki/config/ConfigKey$Bool;)V SPLanki/config/GetConfigBoolRequest;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/config/GetConfigBoolRequest; @@ -5953,27 +6628,6 @@ SPLanki/config/GetConfigBoolRequest$Builder;->()V SPLanki/config/GetConfigBoolRequest$Builder;->(Lanki/config/GetConfigBoolRequest-IA;)V SPLanki/config/GetConfigBoolRequest$Builder;->setKey(Lanki/config/ConfigKey$Bool;)Lanki/config/GetConfigBoolRequest$Builder; Lanki/config/GetConfigBoolRequestOrBuilder; -Lanki/config/SetConfigJsonRequest; -SPLanki/config/SetConfigJsonRequest;->-$$Nest$msetKey(Lanki/config/SetConfigJsonRequest;Ljava/lang/String;)V -SPLanki/config/SetConfigJsonRequest;->-$$Nest$msetUndoable(Lanki/config/SetConfigJsonRequest;Z)V -SPLanki/config/SetConfigJsonRequest;->-$$Nest$msetValueJson(Lanki/config/SetConfigJsonRequest;Lcom/google/protobuf/ByteString;)V -SPLanki/config/SetConfigJsonRequest;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/config/SetConfigJsonRequest; -SPLanki/config/SetConfigJsonRequest;->()V -SPLanki/config/SetConfigJsonRequest;->()V -SPLanki/config/SetConfigJsonRequest;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -SPLanki/config/SetConfigJsonRequest;->newBuilder()Lanki/config/SetConfigJsonRequest$Builder; -SPLanki/config/SetConfigJsonRequest;->setKey(Ljava/lang/String;)V -SPLanki/config/SetConfigJsonRequest;->setUndoable(Z)V -SPLanki/config/SetConfigJsonRequest;->setValueJson(Lcom/google/protobuf/ByteString;)V -Lanki/config/SetConfigJsonRequest$1; -SPLanki/config/SetConfigJsonRequest$1;->()V -Lanki/config/SetConfigJsonRequest$Builder; -SPLanki/config/SetConfigJsonRequest$Builder;->()V -SPLanki/config/SetConfigJsonRequest$Builder;->(Lanki/config/SetConfigJsonRequest-IA;)V -SPLanki/config/SetConfigJsonRequest$Builder;->setKey(Ljava/lang/String;)Lanki/config/SetConfigJsonRequest$Builder; -SPLanki/config/SetConfigJsonRequest$Builder;->setUndoable(Z)Lanki/config/SetConfigJsonRequest$Builder; -SPLanki/config/SetConfigJsonRequest$Builder;->setValueJson(Lcom/google/protobuf/ByteString;)Lanki/config/SetConfigJsonRequest$Builder; -Lanki/config/SetConfigJsonRequestOrBuilder; Lanki/decks/Deck; SPLanki/decks/Deck;->()V SPLanki/decks/Deck;->()V @@ -6161,9 +6815,30 @@ SPLanki/generic/String$Builder;->(Lanki/generic/String-IA;)V SPLanki/generic/String$Builder;->setVal(Ljava/lang/String;)Lanki/generic/String$Builder; Lanki/generic/StringOrBuilder; Lanki/i18n/GeneratedTranslations; +SPLanki/i18n/GeneratedTranslations;->actionsDecks()Ljava/lang/String; +SPLanki/i18n/GeneratedTranslations;->actionsEmptyCards()Ljava/lang/String; SPLanki/i18n/GeneratedTranslations;->actionsExport()Ljava/lang/String; +SPLanki/i18n/GeneratedTranslations;->actionsImport()Ljava/lang/String; SPLanki/i18n/GeneratedTranslations;->databaseCheckTitle()Ljava/lang/String; +SPLanki/i18n/GeneratedTranslations;->decksCreateDeck()Ljava/lang/String; SPLanki/i18n/GeneratedTranslations;->mediaCheckCheckMediaAction()Ljava/lang/String; +SPLanki/i18n/GeneratedTranslations;->statisticsTitle()Ljava/lang/String; +Lanki/i18n/I18nResourcesRequest; +SPLanki/i18n/I18nResourcesRequest;->-$$Nest$maddAllModules(Lanki/i18n/I18nResourcesRequest;Ljava/lang/Iterable;)V +SPLanki/i18n/I18nResourcesRequest;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/i18n/I18nResourcesRequest; +SPLanki/i18n/I18nResourcesRequest;->()V +SPLanki/i18n/I18nResourcesRequest;->()V +SPLanki/i18n/I18nResourcesRequest;->addAllModules(Ljava/lang/Iterable;)V +SPLanki/i18n/I18nResourcesRequest;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/i18n/I18nResourcesRequest;->ensureModulesIsMutable()V +SPLanki/i18n/I18nResourcesRequest;->newBuilder()Lanki/i18n/I18nResourcesRequest$Builder; +Lanki/i18n/I18nResourcesRequest$1; +SPLanki/i18n/I18nResourcesRequest$1;->()V +Lanki/i18n/I18nResourcesRequest$Builder; +SPLanki/i18n/I18nResourcesRequest$Builder;->()V +SPLanki/i18n/I18nResourcesRequest$Builder;->(Lanki/i18n/I18nResourcesRequest-IA;)V +SPLanki/i18n/I18nResourcesRequest$Builder;->addAllModules(Ljava/lang/Iterable;)Lanki/i18n/I18nResourcesRequest$Builder; +Lanki/i18n/I18nResourcesRequestOrBuilder; Lanki/i18n/TranslateArgValue; SPLanki/i18n/TranslateArgValue;->()V SPLanki/i18n/TranslateArgValue;->()V @@ -6193,6 +6868,15 @@ SPLanki/i18n/TranslateStringRequest$Builder;->putAllArgs(Ljava/util/Map;)Lanki/i SPLanki/i18n/TranslateStringRequest$Builder;->setMessageIndex(I)Lanki/i18n/TranslateStringRequest$Builder; SPLanki/i18n/TranslateStringRequest$Builder;->setModuleIndex(I)Lanki/i18n/TranslateStringRequest$Builder; Lanki/i18n/TranslateStringRequestOrBuilder; +Lanki/scheduler/SchedTimingTodayResponse; +SPLanki/scheduler/SchedTimingTodayResponse;->()V +SPLanki/scheduler/SchedTimingTodayResponse;->()V +SPLanki/scheduler/SchedTimingTodayResponse;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/scheduler/SchedTimingTodayResponse;->getNextDayAt()J +SPLanki/scheduler/SchedTimingTodayResponse;->parseFrom([B)Lanki/scheduler/SchedTimingTodayResponse; +Lanki/scheduler/SchedTimingTodayResponse$1; +SPLanki/scheduler/SchedTimingTodayResponse$1;->()V +Lanki/scheduler/SchedTimingTodayResponseOrBuilder; Lanki/sync/SyncStatusResponse$Required; SPLanki/sync/SyncStatusResponse$Required;->$values()[Lanki/sync/SyncStatusResponse$Required; SPLanki/sync/SyncStatusResponse$Required;->()V @@ -6200,144 +6884,121 @@ SPLanki/sync/SyncStatusResponse$Required;->(Ljava/lang/String;II)V SPLanki/sync/SyncStatusResponse$Required;->values()[Lanki/sync/SyncStatusResponse$Required; Lanki/sync/SyncStatusResponse$Required$1; SPLanki/sync/SyncStatusResponse$Required$1;->()V -Lb/a; -SPLb/a;->(Ljava/lang/Object;)V -SPLb/a;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; -Lcom/arcao/slf4j/timber/TimberLoggerAdapter; -SPLcom/arcao/slf4j/timber/TimberLoggerAdapter;->(Ljava/lang/String;)V -SPLcom/arcao/slf4j/timber/TimberLoggerAdapter;->info(Ljava/lang/String;)V -SPLcom/arcao/slf4j/timber/TimberLoggerAdapter;->log(Lcom/arcao/slf4j/timber/TimberLoggerAdapter$LogType;Ljava/lang/String;Ljava/lang/Throwable;)V -Lcom/arcao/slf4j/timber/TimberLoggerAdapter$1; -SPLcom/arcao/slf4j/timber/TimberLoggerAdapter$1;->()V -Lcom/arcao/slf4j/timber/TimberLoggerAdapter$LogType; -SPLcom/arcao/slf4j/timber/TimberLoggerAdapter$LogType;->()V -SPLcom/arcao/slf4j/timber/TimberLoggerAdapter$LogType;->(Ljava/lang/String;I)V -SPLcom/arcao/slf4j/timber/TimberLoggerAdapter$LogType;->values()[Lcom/arcao/slf4j/timber/TimberLoggerAdapter$LogType; -Lcom/arcao/slf4j/timber/TimberLoggerFactory; -SPLcom/arcao/slf4j/timber/TimberLoggerFactory;->()V -SPLcom/arcao/slf4j/timber/TimberLoggerFactory;->()V -SPLcom/arcao/slf4j/timber/TimberLoggerFactory;->createTag(Ljava/lang/String;)Ljava/lang/String; -SPLcom/arcao/slf4j/timber/TimberLoggerFactory;->getLogger(Ljava/lang/String;)Lorg/slf4j/Logger; -Lcom/brsanthu/googleanalytics/GoogleAnalytics; -SPLcom/brsanthu/googleanalytics/GoogleAnalytics;->builder()Lcom/brsanthu/googleanalytics/GoogleAnalyticsBuilder; -Lcom/brsanthu/googleanalytics/GoogleAnalyticsBuilder; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsBuilder;->()V -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsBuilder;->build()Lcom/brsanthu/googleanalytics/GoogleAnalytics; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsBuilder;->createHttpClient()Lcom/brsanthu/googleanalytics/httpclient/HttpClient; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsBuilder;->withConfig(Lcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;)Lcom/brsanthu/googleanalytics/GoogleAnalyticsBuilder; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsBuilder;->withDefaultRequest(Lcom/brsanthu/googleanalytics/request/DefaultRequest;)Lcom/brsanthu/googleanalytics/GoogleAnalyticsBuilder; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsBuilder;->withHttpClient(Lcom/brsanthu/googleanalytics/httpclient/HttpClient;)Lcom/brsanthu/googleanalytics/GoogleAnalyticsBuilder; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsBuilder;->withTrackingId(Ljava/lang/String;)Lcom/brsanthu/googleanalytics/GoogleAnalyticsBuilder; -Lcom/brsanthu/googleanalytics/GoogleAnalyticsConfig; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;->()V -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;->getMaxHttpConnectionsPerRoute()I -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;->getProxyHost()Ljava/lang/String; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;->getRequestParameterDiscoverer()Lcom/brsanthu/googleanalytics/discovery/RequestParameterDiscoverer; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;->getSamplePercentage()I -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;->getUserAgent()Ljava/lang/String; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;->isDiscoverRequestParameters()Z -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;->isEnabled()Z -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;->setBatchSize(I)Lcom/brsanthu/googleanalytics/GoogleAnalyticsConfig; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;->setBatchingEnabled(Z)Lcom/brsanthu/googleanalytics/GoogleAnalyticsConfig; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;->setEnabled(Z)Lcom/brsanthu/googleanalytics/GoogleAnalyticsConfig; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;->setSamplePercentage(I)Lcom/brsanthu/googleanalytics/GoogleAnalyticsConfig; -SPLcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;->setUserAgent(Ljava/lang/String;)Lcom/brsanthu/googleanalytics/GoogleAnalyticsConfig; -Lcom/brsanthu/googleanalytics/GoogleAnalyticsExecutor; -Lcom/brsanthu/googleanalytics/GoogleAnalyticsStats; -Lcom/brsanthu/googleanalytics/discovery/DefaultRequestParameterDiscoverer; -SPLcom/brsanthu/googleanalytics/discovery/DefaultRequestParameterDiscoverer;->()V -SPLcom/brsanthu/googleanalytics/discovery/DefaultRequestParameterDiscoverer;->()V -SPLcom/brsanthu/googleanalytics/discovery/DefaultRequestParameterDiscoverer;->discoverParameters(Lcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;Lcom/brsanthu/googleanalytics/request/DefaultRequest;)Lcom/brsanthu/googleanalytics/request/DefaultRequest; -SPLcom/brsanthu/googleanalytics/discovery/DefaultRequestParameterDiscoverer;->getUserAgentString()Ljava/lang/String; -Lcom/brsanthu/googleanalytics/discovery/RequestParameterDiscoverer; -Lcom/brsanthu/googleanalytics/httpclient/HttpClient; -Lcom/brsanthu/googleanalytics/httpclient/OkHttpClientImpl; -SPLcom/brsanthu/googleanalytics/httpclient/OkHttpClientImpl;->()V -SPLcom/brsanthu/googleanalytics/httpclient/OkHttpClientImpl;->(Lcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;)V -SPLcom/brsanthu/googleanalytics/httpclient/OkHttpClientImpl;->checkConfigForUnsupportedConfiguration(Lcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;)V -SPLcom/brsanthu/googleanalytics/httpclient/OkHttpClientImpl;->createHttpClient(Lcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;)Lokhttp3/OkHttpClient; -Lcom/brsanthu/googleanalytics/internal/GaUtils; -SPLcom/brsanthu/googleanalytics/internal/GaUtils;->appendSystemProperty(Ljava/lang/StringBuilder;Ljava/lang/String;)Ljava/lang/StringBuilder; -SPLcom/brsanthu/googleanalytics/internal/GaUtils;->firstNotNull([Ljava/lang/Object;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/internal/GaUtils;->isBlank(Ljava/lang/String;)Z -SPLcom/brsanthu/googleanalytics/internal/GaUtils;->isEmpty(Ljava/lang/String;)Z -SPLcom/brsanthu/googleanalytics/internal/GaUtils;->isNotEmpty(Ljava/lang/String;)Z -Lcom/brsanthu/googleanalytics/internal/GoogleAnalyticsImpl; -SPLcom/brsanthu/googleanalytics/internal/GoogleAnalyticsImpl;->()V -SPLcom/brsanthu/googleanalytics/internal/GoogleAnalyticsImpl;->(Lcom/brsanthu/googleanalytics/GoogleAnalyticsConfig;Lcom/brsanthu/googleanalytics/request/DefaultRequest;Lcom/brsanthu/googleanalytics/httpclient/HttpClient;)V -SPLcom/brsanthu/googleanalytics/internal/GoogleAnalyticsImpl;->flush()V -SPLcom/brsanthu/googleanalytics/internal/GoogleAnalyticsImpl;->getConfig()Lcom/brsanthu/googleanalytics/GoogleAnalyticsConfig; -SPLcom/brsanthu/googleanalytics/internal/GoogleAnalyticsImpl;->inSample()Z -SPLcom/brsanthu/googleanalytics/internal/GoogleAnalyticsImpl;->performSamplingElection()Z -SPLcom/brsanthu/googleanalytics/internal/GoogleAnalyticsImpl;->submitBatch(Z)V -Lcom/brsanthu/googleanalytics/internal/GoogleAnalyticsStatsImpl; -SPLcom/brsanthu/googleanalytics/internal/GoogleAnalyticsStatsImpl;->()V -Lcom/brsanthu/googleanalytics/request/DefaultRequest; -SPLcom/brsanthu/googleanalytics/request/DefaultRequest;->()V -SPLcom/brsanthu/googleanalytics/request/DefaultRequest;->()V -SPLcom/brsanthu/googleanalytics/request/DefaultRequest;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V -Lcom/brsanthu/googleanalytics/request/GoogleAnalyticsParameter; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsParameter;->()V -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsParameter;->(Ljava/lang/String;ILjava/lang/String;)V -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsParameter;->(Ljava/lang/String;ILjava/lang/String;I)V -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsParameter;->(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsParameter;->(Ljava/lang/String;ILjava/lang/String;Z)V -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsParameter;->(Ljava/lang/String;ILjava/lang/String;ZLjava/lang/String;[Ljava/lang/String;)V -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsParameter;->(Ljava/lang/String;ILjava/lang/String;ZLjava/lang/String;[Ljava/lang/String;I)V -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsParameter;->(Ljava/lang/String;ILjava/lang/String;[Ljava/lang/String;I)V -Lcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->()V -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->anonymizeIp(Ljava/lang/Boolean;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->applicationId(Ljava/lang/String;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->applicationName(Ljava/lang/String;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->applicationVersion(Ljava/lang/String;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->clientId(Ljava/lang/String;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->customDimension(ILjava/lang/String;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->documentEncoding()Ljava/lang/String; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->documentEncoding(Ljava/lang/String;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->fromBoolean(Ljava/lang/Boolean;)Ljava/lang/String; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->getString(Lcom/brsanthu/googleanalytics/request/GoogleAnalyticsParameter;)Ljava/lang/String; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->hitType(Ljava/lang/String;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->protocolVersion(Ljava/lang/String;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->screenResolution(Ljava/lang/String;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->setBoolean(Lcom/brsanthu/googleanalytics/request/GoogleAnalyticsParameter;Ljava/lang/Boolean;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->setString(Lcom/brsanthu/googleanalytics/request/GoogleAnalyticsParameter;Ljava/lang/String;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->trackingId(Ljava/lang/String;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->userAgent(Ljava/lang/String;)Ljava/lang/Object; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->userLanguage()Ljava/lang/String; -SPLcom/brsanthu/googleanalytics/request/GoogleAnalyticsRequest;->userLanguage(Ljava/lang/String;)Ljava/lang/Object; -Lcom/canhub/cropper/BitmapUtils$$ExternalSyntheticApiModelOutline0; -SPLcom/canhub/cropper/BitmapUtils$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/WindowManager;)Landroid/view/WindowMetrics; -SPLcom/canhub/cropper/BitmapUtils$$ExternalSyntheticApiModelOutline0;->m()Landroid/content/pm/PackageInfo; -SPLcom/canhub/cropper/BitmapUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ActivityManager;Ljava/lang/String;II)Ljava/util/List; -SPLcom/canhub/cropper/BitmapUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ApplicationExitInfo;)I -SPLcom/canhub/cropper/BitmapUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ApplicationExitInfo;)J -SPLcom/canhub/cropper/BitmapUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/job/JobScheduler;Ljava/lang/String;)Landroid/app/job/JobScheduler; -SPLcom/canhub/cropper/BitmapUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Outline;Landroid/graphics/Path;)V -SPLcom/canhub/cropper/BitmapUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowMetrics;)Landroid/graphics/Rect; -SPLcom/canhub/cropper/BitmapUtils$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/app/ApplicationExitInfo; Lcom/canhub/cropper/CropFileProvider; SPLcom/canhub/cropper/CropFileProvider;->()V Lcom/canhub/cropper/R$xml; +Lcom/criticalay/GoogleAnalytics; +SPLcom/criticalay/GoogleAnalytics;->()V +Lcom/criticalay/GoogleAnalytics$Companion; +SPLcom/criticalay/GoogleAnalytics$Companion;->()V +SPLcom/criticalay/GoogleAnalytics$Companion;->()V +SPLcom/criticalay/GoogleAnalytics$Companion;->builder(Lkotlin/jvm/functions/Function1;)Lcom/criticalay/GoogleAnalytics; +Lcom/criticalay/GoogleAnalyticsBuilder; +SPLcom/criticalay/GoogleAnalyticsBuilder;->()V +SPLcom/criticalay/GoogleAnalyticsBuilder;->build()Lcom/criticalay/GoogleAnalytics; +SPLcom/criticalay/GoogleAnalyticsBuilder;->setApiSecret(Ljava/lang/String;)V +SPLcom/criticalay/GoogleAnalyticsBuilder;->setAppName(Ljava/lang/String;)V +SPLcom/criticalay/GoogleAnalyticsBuilder;->setAppVersion(Ljava/lang/String;)V +SPLcom/criticalay/GoogleAnalyticsBuilder;->setDebug(Z)V +SPLcom/criticalay/GoogleAnalyticsBuilder;->setEnabled(Z)V +SPLcom/criticalay/GoogleAnalyticsBuilder;->setMeasurementId(Ljava/lang/String;)V +SPLcom/criticalay/GoogleAnalyticsBuilder;->setSamplePercentage(I)V +Lcom/criticalay/GoogleAnalyticsConfig; +SPLcom/criticalay/GoogleAnalyticsConfig;->()V +SPLcom/criticalay/GoogleAnalyticsConfig;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZIZILjava/lang/String;Ljava/lang/String;IJJ)V +SPLcom/criticalay/GoogleAnalyticsConfig;->getConnectTimeoutMs()J +SPLcom/criticalay/GoogleAnalyticsConfig;->getProxyHost()Ljava/lang/String; +SPLcom/criticalay/GoogleAnalyticsConfig;->getReadTimeoutMs()J +SPLcom/criticalay/GoogleAnalyticsConfig;->getSamplePercentage()I +Lcom/criticalay/GoogleAnalyticsConfig$Companion; +SPLcom/criticalay/GoogleAnalyticsConfig$Companion;->()V +SPLcom/criticalay/GoogleAnalyticsConfig$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/criticalay/httpclient/OkHttpClientImpl; +SPLcom/criticalay/httpclient/OkHttpClientImpl;->(Lcom/criticalay/GoogleAnalyticsConfig;)V +SPLcom/criticalay/httpclient/OkHttpClientImpl;->buildClient()Lokhttp3/OkHttpClient; +SPLcom/criticalay/httpclient/OkHttpClientImpl;->json$lambda$0(Lkotlinx/serialization/json/JsonBuilder;)Lkotlin/Unit; +Lcom/criticalay/httpclient/OkHttpClientImpl$$ExternalSyntheticLambda1; +SPLcom/criticalay/httpclient/OkHttpClientImpl$$ExternalSyntheticLambda1;->()V +SPLcom/criticalay/httpclient/OkHttpClientImpl$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/criticalay/internal/GaImpl; +SPLcom/criticalay/internal/GaImpl;->(Lcom/criticalay/GoogleAnalyticsConfig;Lcom/criticalay/httpclient/OkHttpClientImpl;)V +SPLcom/criticalay/internal/GaImpl;->getConfig()Lcom/criticalay/GoogleAnalyticsConfig; +SPLcom/criticalay/internal/GaImpl;->getInSample()Z +SPLcom/criticalay/internal/GaImpl;->performSamplingElection$lambda$0(ILcom/criticalay/internal/GaImpl;)Ljava/lang/Object; +SPLcom/criticalay/internal/GaImpl;->performSamplingElection$lambda$1(ILcom/criticalay/internal/GaImpl;)Ljava/lang/Object; +SPLcom/criticalay/internal/GaImpl;->performSamplingElection()Z +Lcom/criticalay/internal/GaImpl$$ExternalSyntheticLambda4; +SPLcom/criticalay/internal/GaImpl$$ExternalSyntheticLambda4;->(ILcom/criticalay/internal/GaImpl;)V +SPLcom/criticalay/internal/GaImpl$$ExternalSyntheticLambda4;->invoke()Ljava/lang/Object; +Lcom/criticalay/internal/GaImpl$$ExternalSyntheticLambda5; +SPLcom/criticalay/internal/GaImpl$$ExternalSyntheticLambda5;->(ILcom/criticalay/internal/GaImpl;)V +SPLcom/criticalay/internal/GaImpl$$ExternalSyntheticLambda5;->invoke()Ljava/lang/Object; +Lcom/criticalay/internal/GaImplKt; +SPLcom/criticalay/internal/GaImplKt;->()V +SPLcom/criticalay/internal/GaImplKt;->access$getLogger$p()Lio/github/oshai/kotlinlogging/KLogger; +Lcom/criticalay/internal/GaImplKt$$ExternalSyntheticLambda0; +SPLcom/criticalay/internal/GaImplKt$$ExternalSyntheticLambda0;->()V Lcom/google/android/material/R$anim; Lcom/google/android/material/R$attr; Lcom/google/android/material/R$dimen; +Lcom/google/android/material/R$drawable; Lcom/google/android/material/R$id; +Lcom/google/android/material/R$integer; Lcom/google/android/material/R$layout; Lcom/google/android/material/R$style; Lcom/google/android/material/R$styleable; SPLcom/google/android/material/R$styleable;->()V Lcom/google/android/material/animation/AnimationUtils; SPLcom/google/android/material/animation/AnimationUtils;->()V +SPLcom/google/android/material/animation/AnimationUtils;->lerp(FFF)F +SPLcom/google/android/material/animation/AnimationUtils;->lerp(FFFFF)F Lcom/google/android/material/animation/MotionSpec; +SPLcom/google/android/material/animation/MotionSpec;->()V +SPLcom/google/android/material/animation/MotionSpec;->addInfoFromAnimator(Lcom/google/android/material/animation/MotionSpec;Landroid/animation/Animator;)V SPLcom/google/android/material/animation/MotionSpec;->createFromAttribute(Landroid/content/Context;Landroid/content/res/TypedArray;I)Lcom/google/android/material/animation/MotionSpec; +SPLcom/google/android/material/animation/MotionSpec;->createFromResource(Landroid/content/Context;I)Lcom/google/android/material/animation/MotionSpec; +SPLcom/google/android/material/animation/MotionSpec;->createSpecFromAnimators(Ljava/util/List;)Lcom/google/android/material/animation/MotionSpec; +SPLcom/google/android/material/animation/MotionSpec;->setPropertyValues(Ljava/lang/String;[Landroid/animation/PropertyValuesHolder;)V +SPLcom/google/android/material/animation/MotionSpec;->setTiming(Ljava/lang/String;Lcom/google/android/material/animation/MotionTiming;)V +Lcom/google/android/material/animation/MotionTiming; +SPLcom/google/android/material/animation/MotionTiming;->(JJLandroid/animation/TimeInterpolator;)V +SPLcom/google/android/material/animation/MotionTiming;->createFromAnimator(Landroid/animation/ValueAnimator;)Lcom/google/android/material/animation/MotionTiming; +Lcom/google/android/material/badge/BadgeDrawable; +Lcom/google/android/material/behavior/HideViewOnScrollBehavior; +SPLcom/google/android/material/behavior/HideViewOnScrollBehavior;->()V +SPLcom/google/android/material/behavior/HideViewOnScrollBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +Lcom/google/android/material/bottomnavigation/BottomNavigationItemView; +SPLcom/google/android/material/bottomnavigation/BottomNavigationItemView;->(Landroid/content/Context;)V +SPLcom/google/android/material/bottomnavigation/BottomNavigationItemView;->getItemDefaultMarginResId()I +SPLcom/google/android/material/bottomnavigation/BottomNavigationItemView;->getItemLayoutResId()I +Lcom/google/android/material/bottomnavigation/BottomNavigationMenuView; +SPLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;->(Landroid/content/Context;)V +SPLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;->createNavigationBarItemView(Landroid/content/Context;)Lcom/google/android/material/navigation/NavigationBarItemView; +SPLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;->isItemHorizontalTranslationEnabled()Z +Lcom/google/android/material/bottomnavigation/BottomNavigationView; +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->applyWindowInsets()V +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->createNavigationBarMenuView(Landroid/content/Context;)Lcom/google/android/material/navigation/NavigationBarMenuView; +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->getMaxItemCount()I +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->setItemHorizontalTranslationEnabled(Z)V +Lcom/google/android/material/bottomnavigation/BottomNavigationView$1; +SPLcom/google/android/material/bottomnavigation/BottomNavigationView$1;->(Lcom/google/android/material/bottomnavigation/BottomNavigationView;)V +SPLcom/google/android/material/bottomnavigation/BottomNavigationView$1;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)Landroidx/core/view/WindowInsetsCompat; Lcom/google/android/material/button/MaterialButton; SPLcom/google/android/material/button/MaterialButton;->()V SPLcom/google/android/material/button/MaterialButton;->(Landroid/content/Context;Landroid/util/AttributeSet;)V SPLcom/google/android/material/button/MaterialButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/button/MaterialButton;->canUpdateWithoutTextAlignment(I)Z SPLcom/google/android/material/button/MaterialButton;->getA11yClassName()Ljava/lang/String; +SPLcom/google/android/material/button/MaterialButton;->getActualTextAlignment()Landroid/text/Layout$Alignment; +SPLcom/google/android/material/button/MaterialButton;->getGravityTextAlignment()Landroid/text/Layout$Alignment; +SPLcom/google/android/material/button/MaterialButton;->getIcon()Landroid/graphics/drawable/Drawable; +SPLcom/google/android/material/button/MaterialButton;->getIconPadding()I +SPLcom/google/android/material/button/MaterialButton;->getIconSize()I SPLcom/google/android/material/button/MaterialButton;->getTextLayoutWidth()I +SPLcom/google/android/material/button/MaterialButton;->getUpdatedIconFor(I)Landroid/graphics/drawable/Drawable; SPLcom/google/android/material/button/MaterialButton;->isCheckable()Z SPLcom/google/android/material/button/MaterialButton;->isChecked()Z SPLcom/google/android/material/button/MaterialButton;->isIconEnd()Z @@ -6358,14 +7019,21 @@ SPLcom/google/android/material/button/MaterialButton;->refreshDrawableState()V SPLcom/google/android/material/button/MaterialButton;->setBackgroundTintList(Landroid/content/res/ColorStateList;)V SPLcom/google/android/material/button/MaterialButton;->setChecked(Z)V SPLcom/google/android/material/button/MaterialButton;->setCheckedInternal(Z)V +SPLcom/google/android/material/button/MaterialButton;->setCompoundDrawablePadding(I)V SPLcom/google/android/material/button/MaterialButton;->setElevation(F)V SPLcom/google/android/material/button/MaterialButton;->setInternalBackground(Landroid/graphics/drawable/Drawable;)V SPLcom/google/android/material/button/MaterialButton;->setOpticalCenterEnabled(Z)V SPLcom/google/android/material/button/MaterialButton;->setPressed(Z)V +SPLcom/google/android/material/button/MaterialButton;->setShapeAppearanceModel(Lcom/google/android/material/shape/ShapeAppearanceModel;)V SPLcom/google/android/material/button/MaterialButton;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/button/MaterialButton;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V SPLcom/google/android/material/button/MaterialButton;->toggle()V SPLcom/google/android/material/button/MaterialButton;->updateIcon(Z)V SPLcom/google/android/material/button/MaterialButton;->updateIconPosition(II)V +SPLcom/google/android/material/button/MaterialButton;->updateSecondaryIcon(Z)V +SPLcom/google/android/material/button/MaterialButton;->updateSecondaryIconPosition(II)V +SPLcom/google/android/material/button/MaterialButton;->validateIconGravity()V +SPLcom/google/android/material/button/MaterialButton;->validateSecondaryIconGravity()V Lcom/google/android/material/button/MaterialButton$1; SPLcom/google/android/material/button/MaterialButton$1;->(Ljava/lang/String;)V Lcom/google/android/material/button/MaterialButton$SavedState; @@ -6373,17 +7041,25 @@ SPLcom/google/android/material/button/MaterialButton$SavedState;->()V SPLcom/google/android/material/button/MaterialButton$SavedState;->(Landroid/os/Parcelable;)V Lcom/google/android/material/button/MaterialButton$SavedState$1; SPLcom/google/android/material/button/MaterialButton$SavedState$1;->()V +Lcom/google/android/material/button/MaterialButton$WidthChangeDirection; +SPLcom/google/android/material/button/MaterialButton$WidthChangeDirection;->$values()[Lcom/google/android/material/button/MaterialButton$WidthChangeDirection; +SPLcom/google/android/material/button/MaterialButton$WidthChangeDirection;->()V +SPLcom/google/android/material/button/MaterialButton$WidthChangeDirection;->(Ljava/lang/String;I)V Lcom/google/android/material/button/MaterialButtonGroup; Lcom/google/android/material/button/MaterialButtonHelper; -SPLcom/google/android/material/button/MaterialButtonHelper;->(Lcom/google/android/material/button/MaterialButton;Lcom/google/android/material/shape/ShapeAppearanceModel;)V +SPLcom/google/android/material/button/MaterialButtonHelper;->(Lcom/google/android/material/button/MaterialButton;Lcom/google/android/material/shape/ShapeAppearance;)V SPLcom/google/android/material/button/MaterialButtonHelper;->createBackground()Landroid/graphics/drawable/Drawable; +SPLcom/google/android/material/button/MaterialButtonHelper;->getMaskDrawable()Lcom/google/android/material/shape/Shapeable; SPLcom/google/android/material/button/MaterialButtonHelper;->getMaterialShapeDrawable()Lcom/google/android/material/shape/MaterialShapeDrawable; SPLcom/google/android/material/button/MaterialButtonHelper;->getMaterialShapeDrawable(Z)Lcom/google/android/material/shape/MaterialShapeDrawable; +SPLcom/google/android/material/button/MaterialButtonHelper;->getSurfaceColorStrokeDrawable()Lcom/google/android/material/shape/MaterialShapeDrawable; SPLcom/google/android/material/button/MaterialButtonHelper;->isBackgroundOverwritten()Z SPLcom/google/android/material/button/MaterialButtonHelper;->isCheckable()Z SPLcom/google/android/material/button/MaterialButtonHelper;->isToggleCheckedStateOnClick()Z SPLcom/google/android/material/button/MaterialButtonHelper;->loadFromAttributes(Landroid/content/res/TypedArray;)V +SPLcom/google/android/material/button/MaterialButtonHelper;->setShapeAppearance(Lcom/google/android/material/shape/ShapeAppearance;)V SPLcom/google/android/material/button/MaterialButtonHelper;->updateBackground()V +SPLcom/google/android/material/button/MaterialButtonHelper;->updateButtonShape()V SPLcom/google/android/material/button/MaterialButtonHelper;->wrapDrawableWithInset(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/InsetDrawable; Lcom/google/android/material/color/MaterialColors; SPLcom/google/android/material/color/MaterialColors;->getColor(Landroid/content/Context;II)I @@ -6403,67 +7079,83 @@ SPLcom/google/android/material/elevation/ElevationOverlayProvider;->compositeOve SPLcom/google/android/material/elevation/ElevationOverlayProvider;->compositeOverlayIfNeeded(IF)I SPLcom/google/android/material/elevation/ElevationOverlayProvider;->isThemeElevationOverlayEnabled()Z SPLcom/google/android/material/elevation/ElevationOverlayProvider;->isThemeSurfaceColor(I)Z -Lcom/google/android/material/expandable/ExpandableTransformationWidget; -Lcom/google/android/material/expandable/ExpandableWidget; -Lcom/google/android/material/expandable/ExpandableWidgetHelper; -SPLcom/google/android/material/expandable/ExpandableWidgetHelper;->(Lcom/google/android/material/expandable/ExpandableWidget;)V -Lcom/google/android/material/floatingactionbutton/FloatingActionButton; -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->()V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->access$000(Lcom/google/android/material/floatingactionbutton/FloatingActionButton;)I -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->access$101(Lcom/google/android/material/floatingactionbutton/FloatingActionButton;Landroid/graphics/drawable/Drawable;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->drawableStateChanged()V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->getAccessibilityClassName()Ljava/lang/CharSequence; -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->getImpl()Lcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl; -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->getSizeDimension()I -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->getSizeDimension(I)I -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->jumpDrawablesToCurrentState()V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->onApplySupportImageTint()V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->onAttachedToWindow()V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->onMeasure(II)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->setBackgroundTintList(Landroid/content/res/ColorStateList;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->setElevation(F)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->setImageResource(I)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->setMaxImageSize(I)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->setTranslationZ(F)V -Lcom/google/android/material/floatingactionbutton/FloatingActionButton$ShadowDelegateImpl; -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton$ShadowDelegateImpl;->(Lcom/google/android/material/floatingactionbutton/FloatingActionButton;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton$ShadowDelegateImpl;->isCompatPaddingEnabled()Z -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton$ShadowDelegateImpl;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButton$ShadowDelegateImpl;->setShadowPadding(IIII)V -Lcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl; -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->()V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->(Lcom/google/android/material/floatingactionbutton/FloatingActionButton;Lcom/google/android/material/shadow/ShadowViewDelegate;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->calculateImageMatrixFromScale(FLandroid/graphics/Matrix;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->createShapeDrawable()Lcom/google/android/material/shape/MaterialShapeDrawable; -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->getPadding(Landroid/graphics/Rect;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->ignoreExpandBoundsForA11y()Z -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->initializeBackgroundDrawable(Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;Landroid/content/res/ColorStateList;I)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->onAttachedToWindow()V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->onElevationsChanged(FFF)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->onPaddingUpdated(Landroid/graphics/Rect;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->onTranslationChanged()V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->setElevation(F)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->setEnsureMinTouchTargetSize(Z)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->setHideMotionSpec(Lcom/google/android/material/animation/MotionSpec;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->setHoveredFocusedTranslationZ(F)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->setImageMatrixScale(F)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->setMaxImageSize(I)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->setMinTouchTargetSize(I)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->setPressedTranslationZ(F)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->setShapeAppearance(Lcom/google/android/material/shape/ShapeAppearanceModel;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->setShowMotionSpec(Lcom/google/android/material/animation/MotionSpec;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->shouldAddPadding()Z -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->updateImageMatrixScale()V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->updatePadding()V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->updateShapeElevation(F)V -Lcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl$AlwaysStatefulMaterialShapeDrawable; -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl$AlwaysStatefulMaterialShapeDrawable;->(Lcom/google/android/material/shape/ShapeAppearanceModel;)V -SPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl$AlwaysStatefulMaterialShapeDrawable;->isStateful()Z +Lcom/google/android/material/floatingactionbutton/AnimatorTracker; +SPLcom/google/android/material/floatingactionbutton/AnimatorTracker;->()V +Lcom/google/android/material/floatingactionbutton/BaseMotionStrategy; +SPLcom/google/android/material/floatingactionbutton/BaseMotionStrategy;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/AnimatorTracker;)V +SPLcom/google/android/material/floatingactionbutton/BaseMotionStrategy;->setMotionSpec(Lcom/google/android/material/animation/MotionSpec;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->()V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->access$202(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;I)I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->access$302(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;I)I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->access$500(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;)Z +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->access$502(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Z)Z +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->access$600(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->getAccessibilityClassName()Ljava/lang/CharSequence; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->getCollapsedPadding()I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->getCollapsedSize()I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->getSizeFromExtendStrategyType(I)Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$Size; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->onAttachedToWindow()V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->saveOriginalTextCsl()V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->setClickable(Z)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->setContentDescription(Ljava/lang/CharSequence;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->setExtended(Z)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->setPaddingRelative(IIII)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->setTextColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->silentlyUpdateTextColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->updateTooltip()V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1;->getHeight()I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1;->getLayoutParams()Landroid/view/ViewGroup$LayoutParams; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1;->getPaddingEnd()I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1;->getPaddingStart()I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1;->getWidth()I +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$2; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$2;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$3; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$3;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$Size;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$4; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$4;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$Size;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$Size;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$6; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$6;->(Ljava/lang/Class;Ljava/lang/String;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$7; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$7;->(Ljava/lang/Class;Ljava/lang/String;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$8; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$8;->(Ljava/lang/Class;Ljava/lang/String;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$9; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$9;->(Ljava/lang/Class;Ljava/lang/String;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ChangeSizeStrategy; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ChangeSizeStrategy;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/AnimatorTracker;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$Size;Z)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ChangeSizeStrategy;->performNow()V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ChangeSizeStrategy;->shouldCancel()Z +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ExtendedFloatingActionButtonBehavior; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ExtendedFloatingActionButtonBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$HideStrategy; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$HideStrategy;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/AnimatorTracker;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ShowStrategy; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ShowStrategy;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/AnimatorTracker;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$Size; +Lcom/google/android/material/floatingactionbutton/MotionStrategy; +Lcom/google/android/material/focus/FocusRingDrawable; +SPLcom/google/android/material/focus/FocusRingDrawable;->()V +SPLcom/google/android/material/focus/FocusRingDrawable;->find(Landroid/graphics/drawable/Drawable;)Lcom/google/android/material/focus/FocusRingDrawable; +SPLcom/google/android/material/focus/FocusRingDrawable;->layer(Landroid/content/Context;Landroid/graphics/drawable/LayerDrawable;)Lcom/google/android/material/focus/FocusRingDrawable; +SPLcom/google/android/material/focus/FocusRingDrawable;->layer(Landroid/content/Context;Landroid/graphics/drawable/LayerDrawable;Lcom/google/android/material/shape/MaterialShapeDrawable;)Lcom/google/android/material/focus/FocusRingDrawable; +SPLcom/google/android/material/focus/FocusRingDrawable;->shouldUseFocusRing(Landroid/content/Context;)Z +Lcom/google/android/material/focus/FocusRingDrawable$1; +SPLcom/google/android/material/focus/FocusRingDrawable$1;->(Ljava/lang/String;)V +Lcom/google/android/material/internal/BaselineLayout; +SPLcom/google/android/material/internal/BaselineLayout;->(Landroid/content/Context;)V +SPLcom/google/android/material/internal/BaselineLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/google/android/material/internal/BaselineLayout;->setMeasurePaddingFromBaseline(Z)V Lcom/google/android/material/internal/ContextUtils; SPLcom/google/android/material/internal/ContextUtils;->getActivity(Landroid/content/Context;)Landroid/app/Activity; +Lcom/google/android/material/internal/EdgeToEdgeUtils; +SPLcom/google/android/material/internal/EdgeToEdgeUtils;->getNavigationBarColor(Landroid/view/Window;)I Lcom/google/android/material/internal/ForegroundLinearLayout; SPLcom/google/android/material/internal/ForegroundLinearLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V SPLcom/google/android/material/internal/ForegroundLinearLayout;->drawableStateChanged()V @@ -6501,10 +7193,9 @@ Lcom/google/android/material/internal/NavigationMenuPresenter; SPLcom/google/android/material/internal/NavigationMenuPresenter;->()V SPLcom/google/android/material/internal/NavigationMenuPresenter;->access$300(Lcom/google/android/material/internal/NavigationMenuPresenter;)I SPLcom/google/android/material/internal/NavigationMenuPresenter;->addHeaderView(Landroid/view/View;)V -SPLcom/google/android/material/internal/NavigationMenuPresenter;->dispatchApplyWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V -SPLcom/google/android/material/internal/NavigationMenuPresenter;->getHeaderCount()I +SPLcom/google/android/material/internal/NavigationMenuPresenter;->getDividerInsetStart()I +SPLcom/google/android/material/internal/NavigationMenuPresenter;->getItemHorizontalPadding()I SPLcom/google/android/material/internal/NavigationMenuPresenter;->getMenuView(Landroid/view/ViewGroup;)Landroidx/appcompat/view/menu/MenuView; -SPLcom/google/android/material/internal/NavigationMenuPresenter;->hasHeader()Z SPLcom/google/android/material/internal/NavigationMenuPresenter;->inflateHeaderView(I)Landroid/view/View; SPLcom/google/android/material/internal/NavigationMenuPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V SPLcom/google/android/material/internal/NavigationMenuPresenter;->setBehindStatusBar(Z)V @@ -6531,13 +7222,14 @@ SPLcom/google/android/material/internal/NavigationMenuPresenter;->updateAllDivid SPLcom/google/android/material/internal/NavigationMenuPresenter;->updateAllSubHeaderMenuItems()V SPLcom/google/android/material/internal/NavigationMenuPresenter;->updateAllTextMenuItems()V SPLcom/google/android/material/internal/NavigationMenuPresenter;->updateMenuView(Z)V -SPLcom/google/android/material/internal/NavigationMenuPresenter;->updateTopPadding()V Lcom/google/android/material/internal/NavigationMenuPresenter$1; SPLcom/google/android/material/internal/NavigationMenuPresenter$1;->(Lcom/google/android/material/internal/NavigationMenuPresenter;)V Lcom/google/android/material/internal/NavigationMenuPresenter$HeaderViewHolder; SPLcom/google/android/material/internal/NavigationMenuPresenter$HeaderViewHolder;->(Landroid/view/View;)V Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter; SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->(Lcom/google/android/material/internal/NavigationMenuPresenter;)V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->access$000(Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;)V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->access$200(Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;)V SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->getItemCount()I SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->getItemId(I)J SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->getItemViewType(I)I @@ -6550,6 +7242,8 @@ SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAd SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->setCheckedItem(Landroidx/appcompat/view/menu/MenuItemImpl;)V SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->setUpdateSuspended(Z)V SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->update()V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->updateAllDividerMenuItems()V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->updateAllTextMenuItems()V Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter$1; SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter$1;->(Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;IZ)V Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuHeaderItem; @@ -6582,21 +7276,35 @@ SPLcom/google/android/material/internal/ScrimInsetsFrameLayout;->setDrawRightIns SPLcom/google/android/material/internal/ScrimInsetsFrameLayout;->setDrawTopInsetForeground(Z)V Lcom/google/android/material/internal/ScrimInsetsFrameLayout$1; SPLcom/google/android/material/internal/ScrimInsetsFrameLayout$1;->(Lcom/google/android/material/internal/ScrimInsetsFrameLayout;)V -SPLcom/google/android/material/internal/ScrimInsetsFrameLayout$1;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +Lcom/google/android/material/internal/TextDrawableHelper$TextDrawableDelegate; +Lcom/google/android/material/internal/TextScale; +SPLcom/google/android/material/internal/TextScale;->()V Lcom/google/android/material/internal/ThemeEnforcement; SPLcom/google/android/material/internal/ThemeEnforcement;->()V SPLcom/google/android/material/internal/ThemeEnforcement;->checkAppCompatTheme(Landroid/content/Context;)V SPLcom/google/android/material/internal/ThemeEnforcement;->checkCompatibleTheme(Landroid/content/Context;Landroid/util/AttributeSet;II)V SPLcom/google/android/material/internal/ThemeEnforcement;->checkTextAppearance(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)V SPLcom/google/android/material/internal/ThemeEnforcement;->checkTheme(Landroid/content/Context;[ILjava/lang/String;)V +SPLcom/google/android/material/internal/ThemeEnforcement;->isCustomTextAppearanceValid(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)Z SPLcom/google/android/material/internal/ThemeEnforcement;->isTheme(Landroid/content/Context;[I)Z SPLcom/google/android/material/internal/ThemeEnforcement;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)Landroid/content/res/TypedArray; SPLcom/google/android/material/internal/ThemeEnforcement;->obtainTintedStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)Landroidx/appcompat/widget/TintTypedArray; Lcom/google/android/material/internal/ViewUtils; +SPLcom/google/android/material/internal/ViewUtils;->doOnApplyWindowInsets(Landroid/view/View;Lcom/google/android/material/internal/ViewUtils$OnApplyWindowInsetsListener;)V SPLcom/google/android/material/internal/ViewUtils;->getParentAbsoluteElevation(Landroid/view/View;)F SPLcom/google/android/material/internal/ViewUtils;->parseTintMode(ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuff$Mode; -Lcom/google/android/material/internal/VisibilityAwareImageButton; -SPLcom/google/android/material/internal/VisibilityAwareImageButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/internal/ViewUtils;->requestApplyInsetsWhenAttached(Landroid/view/View;)V +Lcom/google/android/material/internal/ViewUtils$2; +SPLcom/google/android/material/internal/ViewUtils$2;->(Lcom/google/android/material/internal/ViewUtils$OnApplyWindowInsetsListener;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)V +SPLcom/google/android/material/internal/ViewUtils$2;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +Lcom/google/android/material/internal/ViewUtils$3; +SPLcom/google/android/material/internal/ViewUtils$3;->()V +SPLcom/google/android/material/internal/ViewUtils$3;->onViewAttachedToWindow(Landroid/view/View;)V +Lcom/google/android/material/internal/ViewUtils$OnApplyWindowInsetsListener; +Lcom/google/android/material/internal/ViewUtils$RelativePadding; +SPLcom/google/android/material/internal/ViewUtils$RelativePadding;->(IIII)V +SPLcom/google/android/material/internal/ViewUtils$RelativePadding;->(Lcom/google/android/material/internal/ViewUtils$RelativePadding;)V +SPLcom/google/android/material/internal/ViewUtils$RelativePadding;->applyToView(Landroid/view/View;)V Lcom/google/android/material/internal/WindowUtils; SPLcom/google/android/material/internal/WindowUtils;->getCurrentWindowBounds(Landroid/content/Context;)Landroid/graphics/Rect; Lcom/google/android/material/internal/WindowUtils$Api30Impl; @@ -6619,13 +7327,210 @@ Lcom/google/android/material/motion/MaterialBackOrchestrator$BackCallbackDelegat Lcom/google/android/material/motion/MaterialSideContainerBackHelper; SPLcom/google/android/material/motion/MaterialSideContainerBackHelper;->(Landroid/view/View;)V Lcom/google/android/material/motion/MotionUtils; +SPLcom/google/android/material/motion/MotionUtils;->getLegacyControlPoint([Ljava/lang/String;I)F +SPLcom/google/android/material/motion/MotionUtils;->getLegacyEasingContent(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +SPLcom/google/android/material/motion/MotionUtils;->getLegacyThemeInterpolator(Ljava/lang/String;)Landroid/animation/TimeInterpolator; +SPLcom/google/android/material/motion/MotionUtils;->isLegacyEasingAttribute(Ljava/lang/String;)Z +SPLcom/google/android/material/motion/MotionUtils;->isLegacyEasingType(Ljava/lang/String;Ljava/lang/String;)Z SPLcom/google/android/material/motion/MotionUtils;->resolveThemeDuration(Landroid/content/Context;II)I +SPLcom/google/android/material/motion/MotionUtils;->resolveThemeInterpolator(Landroid/content/Context;ILandroid/animation/TimeInterpolator;)Landroid/animation/TimeInterpolator; +Lcom/google/android/material/navigation/DividerMenuItem; +Lcom/google/android/material/navigation/NavigationBarItemView; +SPLcom/google/android/material/navigation/NavigationBarItemView;->()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->(Landroid/content/Context;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->calculateTextScaleFactors()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->getActiveIndicatorDrawable()Landroid/graphics/drawable/Drawable; +SPLcom/google/android/material/navigation/NavigationBarItemView;->getItemBackgroundResId()I +SPLcom/google/android/material/navigation/NavigationBarItemView;->getItemData()Landroidx/appcompat/view/menu/MenuItemImpl; +SPLcom/google/android/material/navigation/NavigationBarItemView;->initialize(Landroidx/appcompat/view/menu/MenuItemImpl;I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->initializeDefaultExpandedLabelGroupViews()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->isActiveIndicatorResizeableAndUnlabeled()Z +SPLcom/google/android/material/navigation/NavigationBarItemView;->maybeAnimateActiveIndicatorToProgress(F)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->onCreateDrawableState(I)[I +SPLcom/google/android/material/navigation/NavigationBarItemView;->refreshChecked()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->refreshItemBackground()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorDrawable(Landroid/graphics/drawable/Drawable;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorExpandedHeight(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorExpandedMarginHorizontal(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorExpandedPadding(Landroid/graphics/Rect;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorExpandedWidth(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorHeight(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorLabelPadding(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorMarginHorizontal(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorProgress(FF)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorResizeable(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorWidth(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setCheckable(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setChecked(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setExpanded(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setExpandedLabelGroupMargins()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setHorizontalTextAppearanceActive(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setHorizontalTextAppearanceInactive(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setIcon(Landroid/graphics/drawable/Drawable;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setIconLabelHorizontalSpacing(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setIconSize(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setIconTintList(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemBackground(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemBackground(Landroid/graphics/drawable/Drawable;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemGravity(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemIconGravity(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemPaddingBottom(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemPaddingTop(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemPosition(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemRippleColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setLabelFontScalingEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setLabelMaxLines(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setLabelPivots(Landroid/widget/TextView;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setLabelVisibilityMode(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setLayoutConfigurationIconAndLabel(Landroid/view/View;Landroid/view/View;FF)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setMeasureBottomPaddingFromLabelBaseline(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setOnlyShowWhenExpanded(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setShifting(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceActive(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceActiveBoldEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceForLabel(Landroid/widget/TextView;I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceInactive(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceWithoutFontScaling(Landroid/widget/TextView;I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTextColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTitle(Ljava/lang/CharSequence;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setViewMarginAndGravity(Landroid/view/View;III)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setViewScaleValues(Landroid/view/View;FFI)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateActiveIndicatorLayoutParams(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateActiveIndicatorTransform()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateActiveLabelBoldness()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateActiveLabelTextAppearance(Landroid/widget/TextView;I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateInactiveLabelTextAppearance(Landroid/widget/TextView;I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateViewPaddingBottom(Landroid/view/View;I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateVisibility()V +Lcom/google/android/material/navigation/NavigationBarItemView$$ExternalSyntheticLambda1; +SPLcom/google/android/material/navigation/NavigationBarItemView$$ExternalSyntheticLambda1;->(Lcom/google/android/material/navigation/NavigationBarItemView;)V +Lcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform; +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform;->()V +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform;->(Lcom/google/android/material/navigation/NavigationBarItemView$1;)V +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform;->calculateAlpha(FF)F +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform;->calculateScaleX(F)F +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform;->calculateScaleY(F)F +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform;->updateForProgress(FFLandroid/view/View;)V +Lcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorUnlabeledTransform; +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorUnlabeledTransform;->()V +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorUnlabeledTransform;->(Lcom/google/android/material/navigation/NavigationBarItemView$1;)V +Lcom/google/android/material/navigation/NavigationBarMenu; +SPLcom/google/android/material/navigation/NavigationBarMenu;->(Landroid/content/Context;Ljava/lang/Class;IZ)V +SPLcom/google/android/material/navigation/NavigationBarMenu;->addInternal(IIILjava/lang/CharSequence;)Landroid/view/MenuItem; +Lcom/google/android/material/navigation/NavigationBarMenuBuilder; +SPLcom/google/android/material/navigation/NavigationBarMenuBuilder;->(Landroidx/appcompat/view/menu/MenuBuilder;)V +SPLcom/google/android/material/navigation/NavigationBarMenuBuilder;->getContentItemCount()I +SPLcom/google/android/material/navigation/NavigationBarMenuBuilder;->getItemAt(I)Landroid/view/MenuItem; +SPLcom/google/android/material/navigation/NavigationBarMenuBuilder;->getVisibleMainContentItemCount()I +SPLcom/google/android/material/navigation/NavigationBarMenuBuilder;->refreshItems()V +SPLcom/google/android/material/navigation/NavigationBarMenuBuilder;->size()I +Lcom/google/android/material/navigation/NavigationBarMenuItemView; +Lcom/google/android/material/navigation/NavigationBarMenuView; +SPLcom/google/android/material/navigation/NavigationBarMenuView;->()V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->(Landroid/content/Context;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->buildMenuView()V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->createDefaultColorStateList(I)Landroid/content/res/ColorStateList; +SPLcom/google/android/material/navigation/NavigationBarMenuView;->createItemActiveIndicatorDrawable()Landroid/graphics/drawable/Drawable; +SPLcom/google/android/material/navigation/NavigationBarMenuView;->createMenuItem(ILandroidx/appcompat/view/menu/MenuItemImpl;ZZ)Lcom/google/android/material/navigation/NavigationBarItemView; +SPLcom/google/android/material/navigation/NavigationBarMenuView;->getCollapsedVisibleItemCount()I +SPLcom/google/android/material/navigation/NavigationBarMenuView;->getCurrentVisibleContentItemCount()I +SPLcom/google/android/material/navigation/NavigationBarMenuView;->getItemGravity()I +SPLcom/google/android/material/navigation/NavigationBarMenuView;->getItemIconGravity()I +SPLcom/google/android/material/navigation/NavigationBarMenuView;->getLabelVisibilityMode()I +SPLcom/google/android/material/navigation/NavigationBarMenuView;->getNewItem()Lcom/google/android/material/navigation/NavigationBarItemView; +SPLcom/google/android/material/navigation/NavigationBarMenuView;->initialize(Landroidx/appcompat/view/menu/MenuBuilder;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->isMenuStructureSame()Z +SPLcom/google/android/material/navigation/NavigationBarMenuView;->isShifting(II)Z +SPLcom/google/android/material/navigation/NavigationBarMenuView;->isValidId(I)Z +SPLcom/google/android/material/navigation/NavigationBarMenuView;->releaseItemPool()V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->removeUnusedBadges()V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setActiveIndicatorLabelPadding(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setBadgeIfNeeded(Lcom/google/android/material/navigation/NavigationBarItemView;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setCheckedItem(Landroid/view/MenuItem;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setCollapsedMaxItemCount(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setIconLabelHorizontalSpacing(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setIconTintList(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorExpandedHeight(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorExpandedMarginHorizontal(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorExpandedPadding(IIII)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorExpandedWidth(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorHeight(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorMarginHorizontal(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorShapeAppearance(Lcom/google/android/material/shape/ShapeAppearanceModel;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorWidth(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemIconSize(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemPaddingBottom(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemPaddingTop(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemRippleColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextAppearanceActive(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextAppearanceActiveBoldEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextAppearanceInactive(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setLabelFontScalingEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setLabelMaxLines(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setLabelVisibilityMode(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setMeasurePaddingFromLabelBaseline(Z)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setPresenter(Lcom/google/android/material/navigation/NavigationBarPresenter;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->updateMenuView()V +Lcom/google/android/material/navigation/NavigationBarMenuView$1; +SPLcom/google/android/material/navigation/NavigationBarMenuView$1;->(Lcom/google/android/material/navigation/NavigationBarMenuView;)V +Lcom/google/android/material/navigation/NavigationBarPresenter; +SPLcom/google/android/material/navigation/NavigationBarPresenter;->()V +SPLcom/google/android/material/navigation/NavigationBarPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V +SPLcom/google/android/material/navigation/NavigationBarPresenter;->setId(I)V +SPLcom/google/android/material/navigation/NavigationBarPresenter;->setMenuView(Lcom/google/android/material/navigation/NavigationBarMenuView;)V +SPLcom/google/android/material/navigation/NavigationBarPresenter;->setUpdateSuspended(Z)V +SPLcom/google/android/material/navigation/NavigationBarPresenter;->updateMenuView(Z)V +Lcom/google/android/material/navigation/NavigationBarView; +SPLcom/google/android/material/navigation/NavigationBarView;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V +SPLcom/google/android/material/navigation/NavigationBarView;->getCollapsedMaxItemCount()I +SPLcom/google/android/material/navigation/NavigationBarView;->getMenuInflater()Landroid/view/MenuInflater; +SPLcom/google/android/material/navigation/NavigationBarView;->getMenuView()Landroidx/appcompat/view/menu/MenuView; +SPLcom/google/android/material/navigation/NavigationBarView;->inflateMenu(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->isSubMenuSupported()Z +SPLcom/google/android/material/navigation/NavigationBarView;->onAttachedToWindow()V +SPLcom/google/android/material/navigation/NavigationBarView;->setActiveIndicatorLabelPadding(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setElevation(F)V +SPLcom/google/android/material/navigation/NavigationBarView;->setIconLabelHorizontalSpacing(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorExpandedHeight(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorExpandedMarginHorizontal(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorExpandedPadding(IIII)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorExpandedWidth(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorHeight(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorMarginHorizontal(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorShapeAppearance(Lcom/google/android/material/shape/ShapeAppearanceModel;)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorWidth(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemGravity(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemIconGravity(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemIconSize(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemPaddingBottom(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemPaddingTop(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemRippleColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemTextAppearanceActive(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemTextAppearanceActiveBoldEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemTextAppearanceInactive(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemTextColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarView;->setLabelFontScalingEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarView;->setLabelMaxLines(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setLabelVisibilityMode(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setMeasureBottomPaddingFromLabelBaseline(Z)V +SPLcom/google/android/material/navigation/NavigationBarView;->shouldAddMenuView()Z +Lcom/google/android/material/navigation/NavigationBarView$1; +SPLcom/google/android/material/navigation/NavigationBarView$1;->(Lcom/google/android/material/navigation/NavigationBarView;)V Lcom/google/android/material/navigation/NavigationView; SPLcom/google/android/material/navigation/NavigationView;->()V SPLcom/google/android/material/navigation/NavigationView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V SPLcom/google/android/material/navigation/NavigationView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -SPLcom/google/android/material/navigation/NavigationView;->access$200(Lcom/google/android/material/navigation/NavigationView;)[I -SPLcom/google/android/material/navigation/NavigationView;->access$300(Lcom/google/android/material/navigation/NavigationView;)Lcom/google/android/material/internal/NavigationMenuPresenter; +SPLcom/google/android/material/navigation/NavigationView;->access$300(Lcom/google/android/material/navigation/NavigationView;)[I +SPLcom/google/android/material/navigation/NavigationView;->access$400(Lcom/google/android/material/navigation/NavigationView;)Lcom/google/android/material/internal/NavigationMenuPresenter; +SPLcom/google/android/material/navigation/NavigationView;->getDividerInsetStart()I +SPLcom/google/android/material/navigation/NavigationView;->getItemHorizontalPadding()I SPLcom/google/android/material/navigation/NavigationView;->getMenu()Landroid/view/Menu; SPLcom/google/android/material/navigation/NavigationView;->getMenuInflater()Landroid/view/MenuInflater; SPLcom/google/android/material/navigation/NavigationView;->inflateHeaderView(I)Landroid/view/View; @@ -6634,7 +7539,6 @@ SPLcom/google/android/material/navigation/NavigationView;->isStartInsetScrimEnab SPLcom/google/android/material/navigation/NavigationView;->isTopInsetScrimEnabled()Z SPLcom/google/android/material/navigation/NavigationView;->maybeUpdateCornerSizeForDrawerLayout(II)V SPLcom/google/android/material/navigation/NavigationView;->onAttachedToWindow()V -SPLcom/google/android/material/navigation/NavigationView;->onInsetsChanged(Landroidx/core/view/WindowInsetsCompat;)V SPLcom/google/android/material/navigation/NavigationView;->onMeasure(II)V SPLcom/google/android/material/navigation/NavigationView;->onSizeChanged(IIII)V SPLcom/google/android/material/navigation/NavigationView;->setBottomInsetScrimEnabled(Z)V @@ -6660,6 +7564,10 @@ SPLcom/google/android/material/navigation/NavigationView$2;->(Lcom/google/ Lcom/google/android/material/navigation/NavigationView$3; SPLcom/google/android/material/navigation/NavigationView$3;->(Lcom/google/android/material/navigation/NavigationView;)V SPLcom/google/android/material/navigation/NavigationView$3;->onGlobalLayout()V +Lcom/google/android/material/navigation/NavigationView$FocusDrawerListener; +SPLcom/google/android/material/navigation/NavigationView$FocusDrawerListener;->(Lcom/google/android/material/navigation/NavigationView;)V +SPLcom/google/android/material/navigation/NavigationView$FocusDrawerListener;->(Lcom/google/android/material/navigation/NavigationView;Lcom/google/android/material/navigation/NavigationView$1;)V +SPLcom/google/android/material/navigation/NavigationView$FocusDrawerListener;->clearLastFocusedView()V Lcom/google/android/material/navigation/NavigationView$OnNavigationItemSelectedListener; Lcom/google/android/material/progressindicator/AnimatorDurationScaleProvider; SPLcom/google/android/material/progressindicator/AnimatorDurationScaleProvider;->()V @@ -6685,6 +7593,8 @@ SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->setProg SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->setProgressDrawable(Landroid/graphics/drawable/Drawable;)V SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->unregisterAnimationCallbacks()V SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->visibleToUser()Z +Lcom/google/android/material/progressindicator/BaseProgressIndicator$$ExternalSyntheticLambda0; +SPLcom/google/android/material/progressindicator/BaseProgressIndicator$$ExternalSyntheticLambda0;->(Lcom/google/android/material/progressindicator/BaseProgressIndicator;)V Lcom/google/android/material/progressindicator/BaseProgressIndicator$1; SPLcom/google/android/material/progressindicator/BaseProgressIndicator$1;->(Lcom/google/android/material/progressindicator/BaseProgressIndicator;)V Lcom/google/android/material/progressindicator/BaseProgressIndicator$2; @@ -6802,14 +7712,21 @@ SPLcom/google/android/material/progressindicator/LinearProgressIndicatorSpec;->< SPLcom/google/android/material/progressindicator/LinearProgressIndicatorSpec;->validateSpec()V Lcom/google/android/material/resources/MaterialAttributes; SPLcom/google/android/material/resources/MaterialAttributes;->resolve(Landroid/content/Context;I)Landroid/util/TypedValue; +SPLcom/google/android/material/resources/MaterialAttributes;->resolve(Landroid/content/res/Resources$Theme;I)Landroid/util/TypedValue; SPLcom/google/android/material/resources/MaterialAttributes;->resolveBoolean(Landroid/content/Context;IZ)Z +SPLcom/google/android/material/resources/MaterialAttributes;->resolveBoolean(Landroid/content/res/Resources$Theme;IZ)Z SPLcom/google/android/material/resources/MaterialAttributes;->resolveInteger(Landroid/content/Context;II)I +SPLcom/google/android/material/resources/MaterialAttributes;->resolveInteger(Landroid/content/res/Resources$Theme;II)I SPLcom/google/android/material/resources/MaterialAttributes;->resolveTypedValueOrThrow(Landroid/content/Context;ILjava/lang/String;)Landroid/util/TypedValue; SPLcom/google/android/material/resources/MaterialAttributes;->resolveTypedValueOrThrow(Landroid/view/View;I)Landroid/util/TypedValue; Lcom/google/android/material/resources/MaterialResources; SPLcom/google/android/material/resources/MaterialResources;->getColorStateList(Landroid/content/Context;Landroid/content/res/TypedArray;I)Landroid/content/res/ColorStateList; +SPLcom/google/android/material/resources/MaterialResources;->getColorStateList(Landroid/content/Context;Landroidx/appcompat/widget/TintTypedArray;I)Landroid/content/res/ColorStateList; +SPLcom/google/android/material/resources/MaterialResources;->getComplexUnit(Landroid/util/TypedValue;)I SPLcom/google/android/material/resources/MaterialResources;->getDimensionPixelSize(Landroid/content/Context;Landroid/content/res/TypedArray;II)I SPLcom/google/android/material/resources/MaterialResources;->getDrawable(Landroid/content/Context;Landroid/content/res/TypedArray;I)Landroid/graphics/drawable/Drawable; +SPLcom/google/android/material/resources/MaterialResources;->getUnscaledLineHeight(Landroid/content/Context;II)I +SPLcom/google/android/material/resources/MaterialResources;->getUnscaledTextSize(Landroid/content/Context;II)I Lcom/google/android/material/ripple/RippleUtils; SPLcom/google/android/material/ripple/RippleUtils;->()V SPLcom/google/android/material/ripple/RippleUtils;->sanitizeRippleDrawableColor(Landroid/content/res/ColorStateList;)Landroid/content/res/ColorStateList; @@ -6818,7 +7735,6 @@ SPLcom/google/android/material/shadow/ShadowRenderer;->()V SPLcom/google/android/material/shadow/ShadowRenderer;->()V SPLcom/google/android/material/shadow/ShadowRenderer;->(I)V SPLcom/google/android/material/shadow/ShadowRenderer;->setShadowColor(I)V -Lcom/google/android/material/shadow/ShadowViewDelegate; Lcom/google/android/material/shape/AbsoluteCornerSize; SPLcom/google/android/material/shape/AbsoluteCornerSize;->(F)V SPLcom/google/android/material/shape/AbsoluteCornerSize;->getCornerSize(Landroid/graphics/RectF;)F @@ -6833,15 +7749,11 @@ SPLcom/google/android/material/shape/EdgeTreatment;->getEdgePath(FFFLcom/google/ Lcom/google/android/material/shape/MaterialShapeDrawable; SPLcom/google/android/material/shape/MaterialShapeDrawable;->()V SPLcom/google/android/material/shape/MaterialShapeDrawable;->(Lcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->(Lcom/google/android/material/shape/ShapeAppearance;)V SPLcom/google/android/material/shape/MaterialShapeDrawable;->(Lcom/google/android/material/shape/ShapeAppearanceModel;)V -SPLcom/google/android/material/shape/MaterialShapeDrawable;->access$100(Lcom/google/android/material/shape/MaterialShapeDrawable;)Ljava/util/BitSet; -SPLcom/google/android/material/shape/MaterialShapeDrawable;->access$200(Lcom/google/android/material/shape/MaterialShapeDrawable;)[Lcom/google/android/material/shape/ShapePath$ShadowCompatOperation; -SPLcom/google/android/material/shape/MaterialShapeDrawable;->access$300(Lcom/google/android/material/shape/MaterialShapeDrawable;)[Lcom/google/android/material/shape/ShapePath$ShadowCompatOperation; SPLcom/google/android/material/shape/MaterialShapeDrawable;->access$602(Lcom/google/android/material/shape/MaterialShapeDrawable;Z)Z SPLcom/google/android/material/shape/MaterialShapeDrawable;->access$702(Lcom/google/android/material/shape/MaterialShapeDrawable;Z)Z SPLcom/google/android/material/shape/MaterialShapeDrawable;->calculatePaintColorTintFilter(Landroid/graphics/Paint;Z)Landroid/graphics/PorterDuffColorFilter; -SPLcom/google/android/material/shape/MaterialShapeDrawable;->calculatePath(Landroid/graphics/RectF;Landroid/graphics/Path;)V -SPLcom/google/android/material/shape/MaterialShapeDrawable;->calculatePathForSize(Landroid/graphics/RectF;Landroid/graphics/Path;)V SPLcom/google/android/material/shape/MaterialShapeDrawable;->calculateRoundRectCornerSize(Landroid/graphics/RectF;Lcom/google/android/material/shape/ShapeAppearanceModel;[F)F SPLcom/google/android/material/shape/MaterialShapeDrawable;->calculateTintColorTintFilter(Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;Z)Landroid/graphics/PorterDuffColorFilter; SPLcom/google/android/material/shape/MaterialShapeDrawable;->calculateTintFilter(Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;Landroid/graphics/Paint;Z)Landroid/graphics/PorterDuffColorFilter; @@ -6878,6 +7790,7 @@ SPLcom/google/android/material/shape/MaterialShapeDrawable;->setColorFilter(Land SPLcom/google/android/material/shape/MaterialShapeDrawable;->setElevation(F)V SPLcom/google/android/material/shape/MaterialShapeDrawable;->setFillColor(Landroid/content/res/ColorStateList;)V SPLcom/google/android/material/shape/MaterialShapeDrawable;->setParentAbsoluteElevation(F)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setShapeAppearance(Lcom/google/android/material/shape/ShapeAppearance;)V SPLcom/google/android/material/shape/MaterialShapeDrawable;->setShapeAppearanceModel(Lcom/google/android/material/shape/ShapeAppearanceModel;)V SPLcom/google/android/material/shape/MaterialShapeDrawable;->setStroke(FI)V SPLcom/google/android/material/shape/MaterialShapeDrawable;->setStroke(FLandroid/content/res/ColorStateList;)V @@ -6886,6 +7799,7 @@ SPLcom/google/android/material/shape/MaterialShapeDrawable;->setStrokeWidth(F)V SPLcom/google/android/material/shape/MaterialShapeDrawable;->setTint(I)V SPLcom/google/android/material/shape/MaterialShapeDrawable;->setTintList(Landroid/content/res/ColorStateList;)V SPLcom/google/android/material/shape/MaterialShapeDrawable;->setTintMode(Landroid/graphics/PorterDuff$Mode;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->shouldCalculatePath()Z SPLcom/google/android/material/shape/MaterialShapeDrawable;->updateColorsForState([I)Z SPLcom/google/android/material/shape/MaterialShapeDrawable;->updateTintFilter()Z SPLcom/google/android/material/shape/MaterialShapeDrawable;->updateZ()V @@ -6893,11 +7807,9 @@ Lcom/google/android/material/shape/MaterialShapeDrawable$1; SPLcom/google/android/material/shape/MaterialShapeDrawable$1;->(Lcom/google/android/material/shape/MaterialShapeDrawable;)V Lcom/google/android/material/shape/MaterialShapeDrawable$2; SPLcom/google/android/material/shape/MaterialShapeDrawable$2;->(Lcom/google/android/material/shape/MaterialShapeDrawable;)V -SPLcom/google/android/material/shape/MaterialShapeDrawable$2;->onCornerPathCreated(Lcom/google/android/material/shape/ShapePath;Landroid/graphics/Matrix;I)V -SPLcom/google/android/material/shape/MaterialShapeDrawable$2;->onEdgePathCreated(Lcom/google/android/material/shape/ShapePath;Landroid/graphics/Matrix;I)V Lcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState; SPLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;->(Lcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;)V -SPLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;->(Lcom/google/android/material/shape/ShapeAppearanceModel;Lcom/google/android/material/elevation/ElevationOverlayProvider;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;->(Lcom/google/android/material/shape/ShapeAppearance;Lcom/google/android/material/elevation/ElevationOverlayProvider;)V SPLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;->newDrawable()Landroid/graphics/drawable/Drawable; Lcom/google/android/material/shape/MaterialShapeDrawable$SpringAnimatedCornerSizeProperty; SPLcom/google/android/material/shape/MaterialShapeDrawable$SpringAnimatedCornerSizeProperty;->(I)V @@ -6915,23 +7827,29 @@ SPLcom/google/android/material/shape/RelativeCornerSize;->getMaxCornerSize(Landr Lcom/google/android/material/shape/RoundedCornerTreatment; SPLcom/google/android/material/shape/RoundedCornerTreatment;->()V SPLcom/google/android/material/shape/RoundedCornerTreatment;->getCornerPath(Lcom/google/android/material/shape/ShapePath;FFF)V +Lcom/google/android/material/shape/ShapeAppearance; Lcom/google/android/material/shape/ShapeAppearanceModel; SPLcom/google/android/material/shape/ShapeAppearanceModel;->()V SPLcom/google/android/material/shape/ShapeAppearanceModel;->(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)V SPLcom/google/android/material/shape/ShapeAppearanceModel;->(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;Lcom/google/android/material/shape/ShapeAppearanceModel$1;)V SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder()Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;II)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;III)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;IILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;Landroid/util/AttributeSet;II)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;Landroid/util/AttributeSet;III)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;Landroid/util/AttributeSet;IILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/res/TypedArray;Lcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; SPLcom/google/android/material/shape/ShapeAppearanceModel;->getBottomEdge()Lcom/google/android/material/shape/EdgeTreatment; SPLcom/google/android/material/shape/ShapeAppearanceModel;->getBottomLeftCorner()Lcom/google/android/material/shape/CornerTreatment; SPLcom/google/android/material/shape/ShapeAppearanceModel;->getBottomLeftCornerSize()Lcom/google/android/material/shape/CornerSize; SPLcom/google/android/material/shape/ShapeAppearanceModel;->getBottomRightCorner()Lcom/google/android/material/shape/CornerTreatment; SPLcom/google/android/material/shape/ShapeAppearanceModel;->getBottomRightCornerSize()Lcom/google/android/material/shape/CornerSize; SPLcom/google/android/material/shape/ShapeAppearanceModel;->getCornerSize(Landroid/content/res/TypedArray;ILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/CornerSize; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getDefaultShape()Lcom/google/android/material/shape/ShapeAppearanceModel; SPLcom/google/android/material/shape/ShapeAppearanceModel;->getLeftEdge()Lcom/google/android/material/shape/EdgeTreatment; SPLcom/google/android/material/shape/ShapeAppearanceModel;->getRightEdge()Lcom/google/android/material/shape/EdgeTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getShapeForState([I)Lcom/google/android/material/shape/ShapeAppearanceModel; SPLcom/google/android/material/shape/ShapeAppearanceModel;->getTopEdge()Lcom/google/android/material/shape/EdgeTreatment; SPLcom/google/android/material/shape/ShapeAppearanceModel;->getTopLeftCorner()Lcom/google/android/material/shape/CornerTreatment; SPLcom/google/android/material/shape/ShapeAppearanceModel;->getTopLeftCornerSize()Lcom/google/android/material/shape/CornerSize; @@ -6939,6 +7857,7 @@ SPLcom/google/android/material/shape/ShapeAppearanceModel;->getTopRightCorner()L SPLcom/google/android/material/shape/ShapeAppearanceModel;->getTopRightCornerSize()Lcom/google/android/material/shape/CornerSize; SPLcom/google/android/material/shape/ShapeAppearanceModel;->hasRoundedCorners()Z SPLcom/google/android/material/shape/ShapeAppearanceModel;->isRoundRect(Landroid/graphics/RectF;)Z +SPLcom/google/android/material/shape/ShapeAppearanceModel;->isStateful()Z SPLcom/google/android/material/shape/ShapeAppearanceModel;->toBuilder()Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->()V @@ -6991,6 +7910,7 @@ SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->getCornerTrea SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->getEdgeCenterForIndex(Landroid/graphics/RectF;I)F SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->getEdgeTreatmentForIndex(ILcom/google/android/material/shape/ShapeAppearanceModel;)Lcom/google/android/material/shape/EdgeTreatment; SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->getInstance()Lcom/google/android/material/shape/ShapeAppearancePathProvider; +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->getInstanceOrCreate()Lcom/google/android/material/shape/ShapeAppearancePathProvider; SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->pathOverlapsCorner(Landroid/graphics/Path;I)Z SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->setCornerPathAndTransform(Lcom/google/android/material/shape/ShapeAppearancePathProvider$ShapeAppearancePathSpec;I[F)V SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->setEdgePathAndTransform(I)V @@ -7005,10 +7925,7 @@ SPLcom/google/android/material/shape/ShapePath;->addArc(FFFFFF)V SPLcom/google/android/material/shape/ShapePath;->addConnectingShadowIfNecessary(F)V SPLcom/google/android/material/shape/ShapePath;->addShadowCompatOperation(Lcom/google/android/material/shape/ShapePath$ShadowCompatOperation;FF)V SPLcom/google/android/material/shape/ShapePath;->applyToPath(Landroid/graphics/Matrix;Landroid/graphics/Path;)V -SPLcom/google/android/material/shape/ShapePath;->containsIncompatibleShadowOp()Z -SPLcom/google/android/material/shape/ShapePath;->createShadowCompatOperation(Landroid/graphics/Matrix;)Lcom/google/android/material/shape/ShapePath$ShadowCompatOperation; SPLcom/google/android/material/shape/ShapePath;->getCurrentShadowAngle()F -SPLcom/google/android/material/shape/ShapePath;->getEndShadowAngle()F SPLcom/google/android/material/shape/ShapePath;->getEndX()F SPLcom/google/android/material/shape/ShapePath;->getEndY()F SPLcom/google/android/material/shape/ShapePath;->getStartX()F @@ -7022,8 +7939,6 @@ SPLcom/google/android/material/shape/ShapePath;->setEndX(F)V SPLcom/google/android/material/shape/ShapePath;->setEndY(F)V SPLcom/google/android/material/shape/ShapePath;->setStartX(F)V SPLcom/google/android/material/shape/ShapePath;->setStartY(F)V -Lcom/google/android/material/shape/ShapePath$1; -SPLcom/google/android/material/shape/ShapePath$1;->(Lcom/google/android/material/shape/ShapePath;Ljava/util/List;Landroid/graphics/Matrix;)V Lcom/google/android/material/shape/ShapePath$ArcShadowOperation; SPLcom/google/android/material/shape/ShapePath$ArcShadowOperation;->(Lcom/google/android/material/shape/ShapePath$PathArcOperation;)V Lcom/google/android/material/shape/ShapePath$LineShadowOperation; @@ -7088,6 +8003,7 @@ SPLcom/google/android/material/textview/MaterialTextView;->canApplyTextAppearanc SPLcom/google/android/material/textview/MaterialTextView;->findViewAppearanceResourceId(Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;II)I SPLcom/google/android/material/textview/MaterialTextView;->initialize(Landroid/util/AttributeSet;II)V SPLcom/google/android/material/textview/MaterialTextView;->readFirstAvailableDimension(Landroid/content/Context;Landroid/content/res/TypedArray;[I)I +SPLcom/google/android/material/textview/MaterialTextView;->setTextAppearance(Landroid/content/Context;I)V SPLcom/google/android/material/textview/MaterialTextView;->viewAttrsHasLineHeight(Landroid/content/Context;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;II)Z Lcom/google/android/material/theme/MaterialComponentsViewInflater; SPLcom/google/android/material/theme/MaterialComponentsViewInflater;->()V @@ -7172,9 +8088,8 @@ SPLcom/google/protobuf/CodedInputStream;->newInstance([BIIZ)Lcom/google/protobuf Lcom/google/protobuf/CodedInputStream$ArrayDecoder; SPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->([BIIZ)V SPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->([BIIZLcom/google/protobuf/CodedInputStream$1;)V -SPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->getTotalBytesRead()I SPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->pushLimit(I)I -SPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->recomputeBufferSizeAfterLimit()V +SPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->setCurrentLimit(I)V Lcom/google/protobuf/CodedInputStream$ArrayDecoderOldVarint; SPLcom/google/protobuf/CodedInputStream$ArrayDecoderOldVarint;->([BIIZ)V SPLcom/google/protobuf/CodedInputStream$ArrayDecoderOldVarint;->([BIIZLcom/google/protobuf/CodedInputStream$1;)V @@ -7183,10 +8098,8 @@ SPLcom/google/protobuf/CodedInputStream$VarintExperiment;->$values()[Lcom/google SPLcom/google/protobuf/CodedInputStream$VarintExperiment;->()V SPLcom/google/protobuf/CodedInputStream$VarintExperiment;->(Ljava/lang/String;I)V Lcom/google/protobuf/CodedOutputStream; -SPLcom/google/protobuf/CodedOutputStream;->()V SPLcom/google/protobuf/CodedOutputStream;->()V SPLcom/google/protobuf/CodedOutputStream;->(Lcom/google/protobuf/CodedOutputStream$1;)V -SPLcom/google/protobuf/CodedOutputStream;->access$100()Z SPLcom/google/protobuf/CodedOutputStream;->checkNoSpaceLeft()V SPLcom/google/protobuf/CodedOutputStream;->computeBoolSize(IZ)I SPLcom/google/protobuf/CodedOutputStream;->computeBoolSizeNoTag(Z)I @@ -7215,6 +8128,7 @@ SPLcom/google/protobuf/CodedOutputStream;->writeInt64(IJ)V SPLcom/google/protobuf/CodedOutputStream;->writeSInt32(II)V Lcom/google/protobuf/CodedOutputStream$ArrayEncoder; SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->([BII)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->([BIILcom/google/protobuf/CodedOutputStream$ByteBufferFlusher;)V SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->spaceLeft()I SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->write(B)V SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->write([BII)V @@ -7231,9 +8145,9 @@ SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeUInt32(II)V SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeUInt32NoTag(I)V SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeUInt64(IJ)V SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeUInt64NoTag(J)V +Lcom/google/protobuf/CodedOutputStream$ByteBufferFlusher; Lcom/google/protobuf/CodedOutputStreamWriter; SPLcom/google/protobuf/CodedOutputStreamWriter;->(Lcom/google/protobuf/CodedOutputStream;)V -SPLcom/google/protobuf/CodedOutputStreamWriter;->fieldOrder()Lcom/google/protobuf/Writer$FieldOrder; SPLcom/google/protobuf/CodedOutputStreamWriter;->forCodedOutput(Lcom/google/protobuf/CodedOutputStream;)Lcom/google/protobuf/CodedOutputStreamWriter; SPLcom/google/protobuf/CodedOutputStreamWriter;->writeBool(IZ)V SPLcom/google/protobuf/CodedOutputStreamWriter;->writeBytes(ILcom/google/protobuf/ByteString;)V @@ -7253,6 +8167,11 @@ Lcom/google/protobuf/ExtensionRegistryLite; SPLcom/google/protobuf/ExtensionRegistryLite;->()V SPLcom/google/protobuf/ExtensionRegistryLite;->(Z)V SPLcom/google/protobuf/ExtensionRegistryLite;->getEmptyRegistry()Lcom/google/protobuf/ExtensionRegistryLite; +Lcom/google/protobuf/ExtensionRegistryLite$LazyExtensionMode; +SPLcom/google/protobuf/ExtensionRegistryLite$LazyExtensionMode;->$values()[Lcom/google/protobuf/ExtensionRegistryLite$LazyExtensionMode; +SPLcom/google/protobuf/ExtensionRegistryLite$LazyExtensionMode;->()V +SPLcom/google/protobuf/ExtensionRegistryLite$LazyExtensionMode;->(Ljava/lang/String;I)V +Lcom/google/protobuf/ExtensionSchema; Lcom/google/protobuf/FieldType; SPLcom/google/protobuf/FieldType;->$values()[Lcom/google/protobuf/FieldType; SPLcom/google/protobuf/FieldType;->()V @@ -7269,7 +8188,6 @@ Lcom/google/protobuf/GeneratedMessageInfoFactory; SPLcom/google/protobuf/GeneratedMessageInfoFactory;->()V SPLcom/google/protobuf/GeneratedMessageInfoFactory;->()V SPLcom/google/protobuf/GeneratedMessageInfoFactory;->getInstance()Lcom/google/protobuf/GeneratedMessageInfoFactory; -SPLcom/google/protobuf/GeneratedMessageInfoFactory;->isSupported(Ljava/lang/Class;)Z SPLcom/google/protobuf/GeneratedMessageInfoFactory;->messageInfoFor(Ljava/lang/Class;)Lcom/google/protobuf/MessageInfo; Lcom/google/protobuf/GeneratedMessageLite; SPLcom/google/protobuf/GeneratedMessageLite;->()V @@ -7334,24 +8252,16 @@ SPLcom/google/protobuf/ListFieldSchemaLite;->makeImmutableListAt(Ljava/lang/Obje Lcom/google/protobuf/ListFieldSchemas; SPLcom/google/protobuf/ListFieldSchemas;->()V SPLcom/google/protobuf/ListFieldSchemas;->lite()Lcom/google/protobuf/ListFieldSchema; -SPLcom/google/protobuf/ListFieldSchemas;->loadSchemaForFullRuntime()Lcom/google/protobuf/ListFieldSchema; Lcom/google/protobuf/ManifestSchemaFactory; -SPLcom/google/protobuf/ManifestSchemaFactory;->()V SPLcom/google/protobuf/ManifestSchemaFactory;->()V SPLcom/google/protobuf/ManifestSchemaFactory;->(Lcom/google/protobuf/MessageInfoFactory;)V SPLcom/google/protobuf/ManifestSchemaFactory;->allowExtensions(Lcom/google/protobuf/MessageInfo;)Z SPLcom/google/protobuf/ManifestSchemaFactory;->createSchema(Ljava/lang/Class;)Lcom/google/protobuf/Schema; SPLcom/google/protobuf/ManifestSchemaFactory;->getDefaultMessageInfoFactory()Lcom/google/protobuf/MessageInfoFactory; -SPLcom/google/protobuf/ManifestSchemaFactory;->getDescriptorMessageInfoFactory()Lcom/google/protobuf/MessageInfoFactory; SPLcom/google/protobuf/ManifestSchemaFactory;->newSchema(Ljava/lang/Class;Lcom/google/protobuf/MessageInfo;)Lcom/google/protobuf/Schema; SPLcom/google/protobuf/ManifestSchemaFactory;->useLiteRuntime(Ljava/lang/Class;)Z Lcom/google/protobuf/ManifestSchemaFactory$1; -SPLcom/google/protobuf/ManifestSchemaFactory$1;->()V -Lcom/google/protobuf/ManifestSchemaFactory$2; -SPLcom/google/protobuf/ManifestSchemaFactory$2;->()V -Lcom/google/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory; -SPLcom/google/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory;->([Lcom/google/protobuf/MessageInfoFactory;)V -SPLcom/google/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory;->messageInfoFor(Ljava/lang/Class;)Lcom/google/protobuf/MessageInfo; +SPLcom/google/protobuf/ManifestSchemaFactory$1;->()V Lcom/google/protobuf/MapEntryLite; SPLcom/google/protobuf/MapEntryLite;->(Lcom/google/protobuf/WireFormat$FieldType;Ljava/lang/Object;Lcom/google/protobuf/WireFormat$FieldType;Ljava/lang/Object;)V SPLcom/google/protobuf/MapEntryLite;->getMetadata()Lcom/google/protobuf/MapEntryLite$Metadata; @@ -7380,7 +8290,6 @@ SPLcom/google/protobuf/MapFieldSchemaLite;->toImmutable(Ljava/lang/Object;)Ljava Lcom/google/protobuf/MapFieldSchemas; SPLcom/google/protobuf/MapFieldSchemas;->()V SPLcom/google/protobuf/MapFieldSchemas;->lite()Lcom/google/protobuf/MapFieldSchema; -SPLcom/google/protobuf/MapFieldSchemas;->loadSchemaForFullRuntime()Lcom/google/protobuf/MapFieldSchema; Lcom/google/protobuf/MessageInfo; Lcom/google/protobuf/MessageInfoFactory; Lcom/google/protobuf/MessageLite; @@ -7423,11 +8332,10 @@ SPLcom/google/protobuf/MessageSchema;->storeMessageField(Ljava/lang/Object;ILjav SPLcom/google/protobuf/MessageSchema;->storeOneofMessageField(Ljava/lang/Object;IILjava/lang/Object;)V SPLcom/google/protobuf/MessageSchema;->type(I)I SPLcom/google/protobuf/MessageSchema;->typeAndOffsetAt(I)I -SPLcom/google/protobuf/MessageSchema;->writeFieldsInAscendingOrder(Ljava/lang/Object;Lcom/google/protobuf/Writer;)V -SPLcom/google/protobuf/MessageSchema;->writeMapHelper(Lcom/google/protobuf/Writer;ILjava/lang/Object;I)V -SPLcom/google/protobuf/MessageSchema;->writeString(ILjava/lang/Object;Lcom/google/protobuf/Writer;)V -SPLcom/google/protobuf/MessageSchema;->writeTo(Ljava/lang/Object;Lcom/google/protobuf/Writer;)V -SPLcom/google/protobuf/MessageSchema;->writeUnknownInMessageTo(Lcom/google/protobuf/UnknownFieldSchema;Ljava/lang/Object;Lcom/google/protobuf/Writer;)V +SPLcom/google/protobuf/MessageSchema;->writeMapHelper(Lcom/google/protobuf/CodedOutputStreamWriter;ILjava/lang/Object;I)V +SPLcom/google/protobuf/MessageSchema;->writeString(ILjava/lang/Object;Lcom/google/protobuf/CodedOutputStreamWriter;)V +SPLcom/google/protobuf/MessageSchema;->writeTo(Ljava/lang/Object;Lcom/google/protobuf/CodedOutputStreamWriter;)V +SPLcom/google/protobuf/MessageSchema;->writeUnknownInMessageTo(Lcom/google/protobuf/UnknownFieldSchema;Ljava/lang/Object;Lcom/google/protobuf/CodedOutputStreamWriter;)V Lcom/google/protobuf/NewInstanceSchema; Lcom/google/protobuf/NewInstanceSchemaLite; SPLcom/google/protobuf/NewInstanceSchemaLite;->()V @@ -7435,7 +8343,6 @@ SPLcom/google/protobuf/NewInstanceSchemaLite;->newInstance(Ljava/lang/Object;)Lj Lcom/google/protobuf/NewInstanceSchemas; SPLcom/google/protobuf/NewInstanceSchemas;->()V SPLcom/google/protobuf/NewInstanceSchemas;->lite()Lcom/google/protobuf/NewInstanceSchema; -SPLcom/google/protobuf/NewInstanceSchemas;->loadSchemaForFullRuntime()Lcom/google/protobuf/NewInstanceSchema; Lcom/google/protobuf/PrimitiveNonBoxingCollection; Lcom/google/protobuf/ProtoSyntax; SPLcom/google/protobuf/ProtoSyntax;->$values()[Lcom/google/protobuf/ProtoSyntax; @@ -7446,8 +8353,9 @@ Lcom/google/protobuf/Protobuf; SPLcom/google/protobuf/Protobuf;->()V SPLcom/google/protobuf/Protobuf;->()V SPLcom/google/protobuf/Protobuf;->getInstance()Lcom/google/protobuf/Protobuf; +SPLcom/google/protobuf/Protobuf;->registerSchema(Ljava/lang/Class;)Lcom/google/protobuf/Schema; +SPLcom/google/protobuf/Protobuf;->schemaFor(Lcom/google/protobuf/GeneratedMessageLite;)Lcom/google/protobuf/Schema; SPLcom/google/protobuf/Protobuf;->schemaFor(Ljava/lang/Class;)Lcom/google/protobuf/Schema; -SPLcom/google/protobuf/Protobuf;->schemaFor(Ljava/lang/Object;)Lcom/google/protobuf/Schema; Lcom/google/protobuf/ProtobufArrayList; SPLcom/google/protobuf/ProtobufArrayList;->()V SPLcom/google/protobuf/ProtobufArrayList;->([Ljava/lang/Object;IZ)V @@ -7468,16 +8376,13 @@ SPLcom/google/protobuf/RawMessageInfo;->getStringInfo()Ljava/lang/String; SPLcom/google/protobuf/RawMessageInfo;->getSyntax()Lcom/google/protobuf/ProtoSyntax; SPLcom/google/protobuf/RawMessageInfo;->isMessageSetWireFormat()Z Lcom/google/protobuf/Schema; -Lcom/google/protobuf/SchemaFactory; Lcom/google/protobuf/SchemaUtil; SPLcom/google/protobuf/SchemaUtil;->()V SPLcom/google/protobuf/SchemaUtil;->computeSizeStringList(ILjava/util/List;)I SPLcom/google/protobuf/SchemaUtil;->getGeneratedMessageClass()Ljava/lang/Class; -SPLcom/google/protobuf/SchemaUtil;->getUnknownFieldSetSchema()Lcom/google/protobuf/UnknownFieldSchema; -SPLcom/google/protobuf/SchemaUtil;->getUnknownFieldSetSchemaClass()Ljava/lang/Class; SPLcom/google/protobuf/SchemaUtil;->requireGeneratedMessage(Ljava/lang/Class;)V SPLcom/google/protobuf/SchemaUtil;->unknownFieldSetLiteSchema()Lcom/google/protobuf/UnknownFieldSchema; -SPLcom/google/protobuf/SchemaUtil;->writeStringList(ILjava/util/List;Lcom/google/protobuf/Writer;)V +SPLcom/google/protobuf/SchemaUtil;->writeStringList(ILjava/util/List;Lcom/google/protobuf/CodedOutputStreamWriter;)V Lcom/google/protobuf/UninitializedMessageException; Lcom/google/protobuf/UnknownFieldSchema; SPLcom/google/protobuf/UnknownFieldSchema;->()V @@ -7488,7 +8393,7 @@ SPLcom/google/protobuf/UnknownFieldSetLite;->(I[I[Ljava/lang/Object;Z)V SPLcom/google/protobuf/UnknownFieldSetLite;->getDefaultInstance()Lcom/google/protobuf/UnknownFieldSetLite; SPLcom/google/protobuf/UnknownFieldSetLite;->getSerializedSize()I SPLcom/google/protobuf/UnknownFieldSetLite;->makeImmutable()V -SPLcom/google/protobuf/UnknownFieldSetLite;->writeTo(Lcom/google/protobuf/Writer;)V +SPLcom/google/protobuf/UnknownFieldSetLite;->writeTo(Lcom/google/protobuf/CodedOutputStreamWriter;)V Lcom/google/protobuf/UnknownFieldSetLiteSchema; SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->()V SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->getFromMessage(Ljava/lang/Object;)Lcom/google/protobuf/UnknownFieldSetLite; @@ -7496,8 +8401,8 @@ SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->getFromMessage(Ljava/lang/Obj SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->getSerializedSize(Lcom/google/protobuf/UnknownFieldSetLite;)I SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->getSerializedSize(Ljava/lang/Object;)I SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->makeImmutable(Ljava/lang/Object;)V -SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->writeTo(Lcom/google/protobuf/UnknownFieldSetLite;Lcom/google/protobuf/Writer;)V -SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->writeTo(Ljava/lang/Object;Lcom/google/protobuf/Writer;)V +SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->writeTo(Lcom/google/protobuf/UnknownFieldSetLite;Lcom/google/protobuf/CodedOutputStreamWriter;)V +SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->writeTo(Ljava/lang/Object;Lcom/google/protobuf/CodedOutputStreamWriter;)V Lcom/google/protobuf/UnsafeUtil; SPLcom/google/protobuf/UnsafeUtil;->()V SPLcom/google/protobuf/UnsafeUtil;->access$700(Ljava/lang/Object;J)Z @@ -7516,8 +8421,6 @@ SPLcom/google/protobuf/UnsafeUtil;->getLong(Ljava/lang/Object;J)J SPLcom/google/protobuf/UnsafeUtil;->getMemoryAccessor()Lcom/google/protobuf/UnsafeUtil$MemoryAccessor; SPLcom/google/protobuf/UnsafeUtil;->getObject(Ljava/lang/Object;J)Ljava/lang/Object; SPLcom/google/protobuf/UnsafeUtil;->getUnsafe()Lsun/misc/Unsafe; -SPLcom/google/protobuf/UnsafeUtil;->hasUnsafeArrayOperations()Z -SPLcom/google/protobuf/UnsafeUtil;->hasUnsafeByteBufferOperations()Z SPLcom/google/protobuf/UnsafeUtil;->putBoolean(Ljava/lang/Object;JZ)V SPLcom/google/protobuf/UnsafeUtil;->putBooleanLittleEndian(Ljava/lang/Object;JZ)V SPLcom/google/protobuf/UnsafeUtil;->putByteLittleEndian(Ljava/lang/Object;JB)V @@ -7545,15 +8448,16 @@ SPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->putInt(Ljava/lang/Object;JI)V SPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->supportsUnsafeArrayOperations()Z Lcom/google/protobuf/Utf8; SPLcom/google/protobuf/Utf8;->()V +SPLcom/google/protobuf/Utf8;->createProcessor()Lcom/google/protobuf/Utf8$Processor; SPLcom/google/protobuf/Utf8;->decodeUtf8([BII)Ljava/lang/String; SPLcom/google/protobuf/Utf8;->encode(Ljava/lang/String;[BII)I SPLcom/google/protobuf/Utf8;->encodedLength(Ljava/lang/String;)I Lcom/google/protobuf/Utf8$DecodeUtil; -SPLcom/google/protobuf/Utf8$DecodeUtil;->access$100(B)Z -SPLcom/google/protobuf/Utf8$DecodeUtil;->access$200(B[CI)V -SPLcom/google/protobuf/Utf8$DecodeUtil;->access$300(B)Z -SPLcom/google/protobuf/Utf8$DecodeUtil;->access$500(B)Z -SPLcom/google/protobuf/Utf8$DecodeUtil;->access$600(BBB[CI)V +SPLcom/google/protobuf/Utf8$DecodeUtil;->access$000(B)Z +SPLcom/google/protobuf/Utf8$DecodeUtil;->access$100(B[CI)V +SPLcom/google/protobuf/Utf8$DecodeUtil;->access$200(B)Z +SPLcom/google/protobuf/Utf8$DecodeUtil;->access$400(B)Z +SPLcom/google/protobuf/Utf8$DecodeUtil;->access$500(BBB[CI)V SPLcom/google/protobuf/Utf8$DecodeUtil;->handleOneByte(B[CI)V SPLcom/google/protobuf/Utf8$DecodeUtil;->handleThreeBytes(BBB[CI)V SPLcom/google/protobuf/Utf8$DecodeUtil;->isNotTrailingByte(B)Z @@ -7561,15 +8465,14 @@ SPLcom/google/protobuf/Utf8$DecodeUtil;->isOneByte(B)Z SPLcom/google/protobuf/Utf8$DecodeUtil;->isThreeBytes(B)Z SPLcom/google/protobuf/Utf8$DecodeUtil;->isTwoBytes(B)Z SPLcom/google/protobuf/Utf8$DecodeUtil;->trailingByteValue(B)I +Lcom/google/protobuf/Utf8$MobileProcessor; +SPLcom/google/protobuf/Utf8$MobileProcessor;->()V +SPLcom/google/protobuf/Utf8$MobileProcessor;->decodeUtf8([BII)Ljava/lang/String; +SPLcom/google/protobuf/Utf8$MobileProcessor;->encodeUtf8(Ljava/lang/String;[BII)I Lcom/google/protobuf/Utf8$Processor; SPLcom/google/protobuf/Utf8$Processor;->()V -Lcom/google/protobuf/Utf8$SafeProcessor; -SPLcom/google/protobuf/Utf8$SafeProcessor;->()V -SPLcom/google/protobuf/Utf8$SafeProcessor;->decodeUtf8([BII)Ljava/lang/String; -SPLcom/google/protobuf/Utf8$SafeProcessor;->encodeUtf8(Ljava/lang/String;[BII)I +SPLcom/google/protobuf/Utf8$Processor;->encodedLength(Ljava/lang/String;)I Lcom/google/protobuf/Utf8$UnpairedSurrogateException; -Lcom/google/protobuf/Utf8$UnsafeProcessor; -SPLcom/google/protobuf/Utf8$UnsafeProcessor;->isAvailable()Z Lcom/google/protobuf/WireFormat; SPLcom/google/protobuf/WireFormat;->()V SPLcom/google/protobuf/WireFormat;->makeTag(II)I @@ -7590,24 +8493,10 @@ Lcom/google/protobuf/WireFormat$JavaType; SPLcom/google/protobuf/WireFormat$JavaType;->$values()[Lcom/google/protobuf/WireFormat$JavaType; SPLcom/google/protobuf/WireFormat$JavaType;->()V SPLcom/google/protobuf/WireFormat$JavaType;->(Ljava/lang/String;ILjava/lang/Object;)V -Lcom/google/protobuf/Writer; -Lcom/google/protobuf/Writer$FieldOrder; -SPLcom/google/protobuf/Writer$FieldOrder;->$values()[Lcom/google/protobuf/Writer$FieldOrder; -SPLcom/google/protobuf/Writer$FieldOrder;->()V -SPLcom/google/protobuf/Writer$FieldOrder;->(Ljava/lang/String;I)V -Lcom/google/protobuf/kotlin/ByteStringsKt; -SPLcom/google/protobuf/kotlin/ByteStringsKt;->toByteStringUtf8(Ljava/lang/String;)Lcom/google/protobuf/ByteString; Lcom/ichi2/anim/ActivityTransitionAnimation; SPLcom/ichi2/anim/ActivityTransitionAnimation;->()V SPLcom/ichi2/anim/ActivityTransitionAnimation;->()V -SPLcom/ichi2/anim/ActivityTransitionAnimation;->slide(Landroid/app/Activity;Lcom/ichi2/anim/ActivityTransitionAnimation$Direction;)V -Lcom/ichi2/anim/ActivityTransitionAnimation$Direction; -SPLcom/ichi2/anim/ActivityTransitionAnimation$Direction;->$values()[Lcom/ichi2/anim/ActivityTransitionAnimation$Direction; -SPLcom/ichi2/anim/ActivityTransitionAnimation$Direction;->()V -SPLcom/ichi2/anim/ActivityTransitionAnimation$Direction;->(Ljava/lang/String;I)V -SPLcom/ichi2/anim/ActivityTransitionAnimation$Direction;->values()[Lcom/ichi2/anim/ActivityTransitionAnimation$Direction; -Lcom/ichi2/anim/ActivityTransitionAnimation$Direction$Creator; -SPLcom/ichi2/anim/ActivityTransitionAnimation$Direction$Creator;->()V +SPLcom/ichi2/anim/ActivityTransitionAnimation;->slide(Landroid/app/Activity;Lcom/ichi2/anki/common/ui/TransitionDirection;Z)V Lcom/ichi2/anim/ActivityTransitionAnimation$WhenMappings; SPLcom/ichi2/anim/ActivityTransitionAnimation$WhenMappings;->()V Lcom/ichi2/anki/AbstractFlashcardViewer; @@ -7616,24 +8505,52 @@ Lcom/ichi2/anki/AbstractFlashcardViewer$Companion; SPLcom/ichi2/anki/AbstractFlashcardViewer$Companion;->()V SPLcom/ichi2/anki/AbstractFlashcardViewer$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lcom/ichi2/anki/AbstractIntentHandler; +SPLcom/ichi2/anki/AbstractIntentHandler;->()V SPLcom/ichi2/anki/AbstractIntentHandler;->()V SPLcom/ichi2/anki/AbstractIntentHandler;->onCreate(Landroid/os/Bundle;)V +SPLcom/ichi2/anki/AbstractIntentHandler;->showedActivityFailedScreen(Landroid/os/Bundle;)Z +Lcom/ichi2/anki/AbstractIntentHandler$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/AbstractIntentHandler$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/AbstractIntentHandler;)V +Lcom/ichi2/anki/AcraCrashReporter; +SPLcom/ichi2/anki/AcraCrashReporter;->()V +SPLcom/ichi2/anki/AcraCrashReporter;->()V +SPLcom/ichi2/anki/AcraCrashReporter;->createAcraCoreConfigBuilder()Lorg/acra/config/CoreConfigurationBuilder; +SPLcom/ichi2/anki/AcraCrashReporter;->fetchWebViewInformation()Ljava/util/HashMap; +SPLcom/ichi2/anki/AcraCrashReporter;->initialize(Landroid/app/Application;)V +SPLcom/ichi2/anki/AcraCrashReporter;->isEnabled(Landroid/content/Context;Z)Z +SPLcom/ichi2/anki/AcraCrashReporter;->isProperServiceProcess()Z +SPLcom/ichi2/anki/AcraCrashReporter;->setProductionACRAConfig(Landroid/content/SharedPreferences;)V +SPLcom/ichi2/anki/AcraCrashReporter;->setReportingMode(Ljava/lang/String;)V +Lcom/ichi2/anki/AcraCrashReporter$ToastType; +SPLcom/ichi2/anki/AcraCrashReporter$ToastType;->$values()[Lcom/ichi2/anki/AcraCrashReporter$ToastType; +SPLcom/ichi2/anki/AcraCrashReporter$ToastType;->()V +SPLcom/ichi2/anki/AcraCrashReporter$ToastType;->(Ljava/lang/String;II)V +SPLcom/ichi2/anki/AcraCrashReporter$ToastType;->getToastMessage(Landroid/content/Context;)Ljava/lang/String; +Lcom/ichi2/anki/AcraCrashReporterKt; +SPLcom/ichi2/anki/AcraCrashReporterKt;->initializeAcraCrashReporter(Landroid/app/Application;)V +SPLcom/ichi2/anki/AcraCrashReporterKt;->isAcraSenderProcess()Z Lcom/ichi2/anki/ActionProviderCompat; +SPLcom/ichi2/anki/ActionProviderCompat;->()V SPLcom/ichi2/anki/ActionProviderCompat;->(Landroid/content/Context;)V Lcom/ichi2/anki/AndroidTtsVoice; +SPLcom/ichi2/anki/AndroidTtsVoice;->()V SPLcom/ichi2/anki/AndroidTtsVoice;->(Landroid/speech/tts/Voice;Ljava/lang/String;)V +SPLcom/ichi2/anki/AndroidTtsVoice;->getEngine()Ljava/lang/String; +SPLcom/ichi2/anki/AndroidTtsVoice;->getVoice()Landroid/speech/tts/Voice; Lcom/ichi2/anki/AnkiActivity; SPLcom/ichi2/anki/AnkiActivity;->()V SPLcom/ichi2/anki/AnkiActivity;->(Ljava/lang/Integer;)V -SPLcom/ichi2/anki/AnkiActivity;->animationDisabled()Z -SPLcom/ichi2/anki/AnkiActivity;->animationEnabled()Z -SPLcom/ichi2/anki/AnkiActivity;->enableActivityAnimation(Lcom/ichi2/anim/ActivityTransitionAnimation$Direction;)V +SPLcom/ichi2/anki/AnkiActivity;->enableActivityAnimation(Lcom/ichi2/anki/common/ui/TransitionDirection;Z)V SPLcom/ichi2/anki/AnkiActivity;->enableIntentAnimation(Landroid/content/Intent;)V SPLcom/ichi2/anki/AnkiActivity;->enableToolbar()Landroidx/appcompat/app/ActionBar; +SPLcom/ichi2/anki/AnkiActivity;->exportReadyViewModel_delegate$lambda$0()Landroidx/lifecycle/ViewModelProvider$Factory; SPLcom/ichi2/anki/AnkiActivity;->finish()V -SPLcom/ichi2/anki/AnkiActivity;->finishWithAnimation(Lcom/ichi2/anim/ActivityTransitionAnimation$Direction;)V +SPLcom/ichi2/anki/AnkiActivity;->finishWithAnimation(Lcom/ichi2/anki/common/ui/TransitionDirection;)V +SPLcom/ichi2/anki/AnkiActivity;->getAnalyticsScreenName()Ljava/lang/String; SPLcom/ichi2/anki/AnkiActivity;->getBroadcastsActions()Ljava/util/Map; +SPLcom/ichi2/anki/AnkiActivity;->getDefaultViewModelCreationExtras()Landroidx/lifecycle/viewmodel/CreationExtras; SPLcom/ichi2/anki/AnkiActivity;->getDialogHandler()Lcom/ichi2/anki/dialogs/DialogHandler; +SPLcom/ichi2/anki/AnkiActivity;->getExportReadyViewModel()Lcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel; SPLcom/ichi2/anki/AnkiActivity;->hideProgressBar()V SPLcom/ichi2/anki/AnkiActivity;->onCreate(Landroid/os/Bundle;)V SPLcom/ichi2/anki/AnkiActivity;->onDestroy()V @@ -7644,7 +8561,7 @@ SPLcom/ichi2/anki/AnkiActivity;->registerReceiver()V SPLcom/ichi2/anki/AnkiActivity;->setContentView(Landroid/view/View;)V SPLcom/ichi2/anki/AnkiActivity;->showedActivityFailedScreen(Landroid/os/Bundle;)Z SPLcom/ichi2/anki/AnkiActivity;->startActivity(Landroid/content/Intent;)V -SPLcom/ichi2/anki/AnkiActivity;->startActivityWithAnimation(Landroid/content/Intent;Lcom/ichi2/anim/ActivityTransitionAnimation$Direction;)V +SPLcom/ichi2/anki/AnkiActivity;->startActivityWithAnimation(Landroid/content/Intent;Lcom/ichi2/anki/common/ui/TransitionDirection;)V Lcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda0; SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/AnkiActivity;)V Lcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda1; @@ -7652,80 +8569,136 @@ SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda1;->(Lcom/ichi2/ank Lcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda2; SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda2;->(Lcom/ichi2/anki/AnkiActivity;)V Lcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda3; -SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda3;->(Lcom/ichi2/anki/AnkiActivity;)V +SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda3;->()V +SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda3;->invoke()Ljava/lang/Object; Lcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda4; SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda4;->(Lcom/ichi2/anki/AnkiActivity;)V +Lcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda5; +SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda5;->(Lcom/ichi2/anki/AnkiActivity;)V Lcom/ichi2/anki/AnkiActivity$Companion; SPLcom/ichi2/anki/AnkiActivity$Companion;->()V SPLcom/ichi2/anki/AnkiActivity$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/AnkiActivity$onCreate$3; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3;->(Lcom/ichi2/anki/AnkiActivity;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/AnkiActivity$onCreate$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/AnkiActivity$onCreate$3$1; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3$1;->(Lcom/ichi2/anki/AnkiActivity;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/AnkiActivity$onCreate$3$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/AnkiActivity$onCreate$3$1$1; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3$1$1;->(Lcom/ichi2/anki/AnkiActivity;)V Lcom/ichi2/anki/AnkiActivity$registerReceiver$1; SPLcom/ichi2/anki/AnkiActivity$registerReceiver$1;->(Lcom/ichi2/anki/AnkiActivity;)V +Lcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$2; +SPLcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$2;->(Landroidx/activity/ComponentActivity;)V +SPLcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$2;->invoke()Landroidx/lifecycle/ViewModelStore; +SPLcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$2;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$3; +SPLcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$3;->(Lkotlin/jvm/functions/Function0;Landroidx/activity/ComponentActivity;)V +SPLcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$3;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +SPLcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$3;->invoke()Ljava/lang/Object; Lcom/ichi2/anki/AnkiActivityProvider; Lcom/ichi2/anki/AnkiDroidApp; -SPLcom/ichi2/anki/AnkiDroidApp;->$r8$lambda$ZK6dATWn0LJelHcBgV-4TIMEho4()Lkotlinx/coroutines/CoroutineScope; SPLcom/ichi2/anki/AnkiDroidApp;->()V SPLcom/ichi2/anki/AnkiDroidApp;->()V -SPLcom/ichi2/anki/AnkiDroidApp;->access$getApplicationScope$delegate$cp()Lkotlin/Lazy; SPLcom/ichi2/anki/AnkiDroidApp;->access$getFatalInitializationError$p(Lcom/ichi2/anki/AnkiDroidApp;)Lcom/ichi2/anki/FatalInitializationError; -SPLcom/ichi2/anki/AnkiDroidApp;->access$getINSTRUMENTATION_TESTING$cp()Z SPLcom/ichi2/anki/AnkiDroidApp;->access$getInstance$cp()Lcom/ichi2/anki/AnkiDroidApp; +SPLcom/ichi2/anki/AnkiDroidApp;->access$getNotifications$p(Lcom/ichi2/anki/AnkiDroidApp;)Landroidx/lifecycle/MutableLiveData; SPLcom/ichi2/anki/AnkiDroidApp;->access$getSharedPreferencesTestingOverride$cp()Landroid/content/SharedPreferences; -SPLcom/ichi2/anki/AnkiDroidApp;->applicationScope_delegate$lambda$0()Lkotlinx/coroutines/CoroutineScope; +SPLcom/ichi2/anki/AnkiDroidApp;->access$setAppLifecycleObserver$p(Lcom/ichi2/anki/AnkiDroidApp;Lcom/ichi2/anki/AppLifecycleObserver;)V +SPLcom/ichi2/anki/AnkiDroidApp;->access$setInstance$cp(Lcom/ichi2/anki/AnkiDroidApp;)V +SPLcom/ichi2/anki/AnkiDroidApp;->access$syncPlatform(Lcom/ichi2/anki/AnkiDroidApp;)Ljava/lang/String; +SPLcom/ichi2/anki/AnkiDroidApp;->attachBaseContext(Landroid/content/Context;)V SPLcom/ichi2/anki/AnkiDroidApp;->checkWebViewAvailable()Z -SPLcom/ichi2/anki/AnkiDroidApp;->initializeAnkiDroidDirectory()V +SPLcom/ichi2/anki/AnkiDroidApp;->getCacheDir()Ljava/io/File; +SPLcom/ichi2/anki/AnkiDroidApp;->getDatabasePath(Ljava/lang/String;)Ljava/io/File; +SPLcom/ichi2/anki/AnkiDroidApp;->getDir(Ljava/lang/String;I)Ljava/io/File; +SPLcom/ichi2/anki/AnkiDroidApp;->getFilesDir()Ljava/io/File; +SPLcom/ichi2/anki/AnkiDroidApp;->getNoBackupFilesDir()Ljava/io/File; +SPLcom/ichi2/anki/AnkiDroidApp;->getProfileContext()Landroid/content/Context; +SPLcom/ichi2/anki/AnkiDroidApp;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/AnkiDroidApp;->initAnkiBackend(Z)V +SPLcom/ichi2/anki/AnkiDroidApp;->initializeAnkiDroidDirectory(Lcom/ichi2/anki/AnkiDroidApp$AnkiContext;)V +SPLcom/ichi2/anki/AnkiDroidApp;->launchCacheCleanup()Lkotlinx/coroutines/Job; +SPLcom/ichi2/anki/AnkiDroidApp;->onCreate$lambda$2(Landroid/content/Context;)Lcom/ichi2/anki/common/preferences/AnimationPreferences; SPLcom/ichi2/anki/AnkiDroidApp;->onCreate()V SPLcom/ichi2/anki/AnkiDroidApp;->setActivityAgnosticDialogs(Lcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs;)V +SPLcom/ichi2/anki/AnkiDroidApp;->setupAnkiBackend()V +SPLcom/ichi2/anki/AnkiDroidApp;->setupAnkiDroidApp()Z +SPLcom/ichi2/anki/AnkiDroidApp;->setupAppLifecycleObserver()V +SPLcom/ichi2/anki/AnkiDroidApp;->setupBackendChangeManager()V +SPLcom/ichi2/anki/AnkiDroidApp;->setupContextMenus()V +SPLcom/ichi2/anki/AnkiDroidApp;->setupCustomFieldFilters()V +SPLcom/ichi2/anki/AnkiDroidApp;->setupDayRollover(Lcom/ichi2/anki/AnkiDroidApp$AnkiContext;)V +SPLcom/ichi2/anki/AnkiDroidApp;->setupLifecycleLogging()V +SPLcom/ichi2/anki/AnkiDroidApp;->setupNotifications()Ljava/lang/Object; +SPLcom/ichi2/anki/AnkiDroidApp;->setupTextToSpeech()V SPLcom/ichi2/anki/AnkiDroidApp;->syncPlatform()Ljava/lang/String; Lcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda0; SPLcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/AnkiDroidApp;)V Lcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda1; SPLcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda1;->()V -SPLcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda1;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda2;->()V +SPLcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda3;->(Lcom/ichi2/anki/AnkiDroidApp;)V +Lcom/ichi2/anki/AnkiDroidApp$AnkiContext; +SPLcom/ichi2/anki/AnkiDroidApp$AnkiContext;->()V +SPLcom/ichi2/anki/AnkiDroidApp$AnkiContext;->()V Lcom/ichi2/anki/AnkiDroidApp$Companion; SPLcom/ichi2/anki/AnkiDroidApp$Companion;->()V SPLcom/ichi2/anki/AnkiDroidApp$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/AnkiDroidApp$Companion;->_get_sharedPreferencesProvider_$lambda$0()Landroid/content/SharedPreferences; SPLcom/ichi2/anki/AnkiDroidApp$Companion;->getAppResources()Landroid/content/res/Resources; -SPLcom/ichi2/anki/AnkiDroidApp$Companion;->getApplicationScope()Lkotlinx/coroutines/CoroutineScope; SPLcom/ichi2/anki/AnkiDroidApp$Companion;->getFatalError()Lcom/ichi2/anki/FatalInitializationError; -SPLcom/ichi2/anki/AnkiDroidApp$Companion;->getINSTRUMENTATION_TESTING()Z SPLcom/ichi2/anki/AnkiDroidApp$Companion;->getInstance()Lcom/ichi2/anki/AnkiDroidApp; +SPLcom/ichi2/anki/AnkiDroidApp$Companion;->getSharedPreferencesProvider()Lcom/ichi2/anki/preferences/SharedPreferencesProvider; SPLcom/ichi2/anki/AnkiDroidApp$Companion;->getSharedPreferencesTestingOverride()Landroid/content/SharedPreferences; SPLcom/ichi2/anki/AnkiDroidApp$Companion;->isInitialized()Z SPLcom/ichi2/anki/AnkiDroidApp$Companion;->makeBackendUsable(Landroid/content/Context;)V SPLcom/ichi2/anki/AnkiDroidApp$Companion;->sharedPrefs()Landroid/content/SharedPreferences; +Lcom/ichi2/anki/AnkiDroidApp$Companion$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/AnkiDroidApp$Companion$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/AnkiDroidApp$Companion$$ExternalSyntheticLambda0;->sharedPrefs()Landroid/content/SharedPreferences; Lcom/ichi2/anki/AnkiDroidApp$WhenMappings; SPLcom/ichi2/anki/AnkiDroidApp$WhenMappings;->()V -Lcom/ichi2/anki/AnkiDroidApp$onCreate$2; -SPLcom/ichi2/anki/AnkiDroidApp$onCreate$2;->(Lcom/ichi2/anki/AnkiDroidApp;Lkotlin/coroutines/Continuation;)V -SPLcom/ichi2/anki/AnkiDroidApp$onCreate$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -SPLcom/ichi2/anki/AnkiDroidApp$onCreate$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/ichi2/anki/AnkiDroidApp$onCreate$4; -SPLcom/ichi2/anki/AnkiDroidApp$onCreate$4;->()V -SPLcom/ichi2/anki/AnkiDroidApp$onCreate$4;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V -SPLcom/ichi2/anki/AnkiDroidApp$onCreate$4;->onActivityDestroyed(Landroid/app/Activity;)V -SPLcom/ichi2/anki/AnkiDroidApp$onCreate$4;->onActivityPaused(Landroid/app/Activity;)V -SPLcom/ichi2/anki/AnkiDroidApp$onCreate$4;->onActivityResumed(Landroid/app/Activity;)V -SPLcom/ichi2/anki/AnkiDroidApp$onCreate$4;->onActivityStarted(Landroid/app/Activity;)V -SPLcom/ichi2/anki/AnkiDroidApp$onCreate$4;->onActivityStopped(Landroid/app/Activity;)V +Lcom/ichi2/anki/AnkiDroidApp$launchCacheCleanup$1; +SPLcom/ichi2/anki/AnkiDroidApp$launchCacheCleanup$1;->(Lcom/ichi2/anki/AnkiDroidApp;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/AnkiDroidApp$launchCacheCleanup$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/AnkiDroidApp$launchCacheCleanup$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/AnkiDroidApp$onCreate$5; +SPLcom/ichi2/anki/AnkiDroidApp$onCreate$5;->(Lcom/ichi2/anki/AnkiDroidApp;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/AnkiDroidApp$onCreate$5;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/AnkiDroidApp$onCreate$5;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/AnkiDroidApp$sam$androidx_lifecycle_Observer$0; SPLcom/ichi2/anki/AnkiDroidApp$sam$androidx_lifecycle_Observer$0;->(Lkotlin/jvm/functions/Function1;)V -Lcom/ichi2/anki/AnkiDroidFolder; -SPLcom/ichi2/anki/AnkiDroidFolder;->(Lcom/ichi2/anki/PermissionSet;)V -SPLcom/ichi2/anki/AnkiDroidFolder;->(Lcom/ichi2/anki/PermissionSet;Lkotlin/jvm/internal/DefaultConstructorMarker;)V -SPLcom/ichi2/anki/AnkiDroidFolder;->hasRequiredPermissions(Landroid/content/Context;)Z -Lcom/ichi2/anki/AnkiDroidFolder$AppPrivateFolder; -SPLcom/ichi2/anki/AnkiDroidFolder$AppPrivateFolder;->()V -SPLcom/ichi2/anki/AnkiDroidFolder$AppPrivateFolder;->()V +Lcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1; +SPLcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1;->()V +SPLcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1;->onActivityDestroyed(Landroid/app/Activity;)V +SPLcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1;->onActivityPaused(Landroid/app/Activity;)V +SPLcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1;->onActivityResumed(Landroid/app/Activity;)V +SPLcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1;->onActivityStarted(Landroid/app/Activity;)V +SPLcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1;->onActivityStopped(Landroid/app/Activity;)V +Lcom/ichi2/anki/AnkiDroidApp$setupNotifications$1$2; +SPLcom/ichi2/anki/AnkiDroidApp$setupNotifications$1$2;->(Landroid/content/Context;)V Lcom/ichi2/anki/AppLifecycleObserver; +SPLcom/ichi2/anki/AppLifecycleObserver;->()V SPLcom/ichi2/anki/AppLifecycleObserver;->(Landroid/content/Context;)V SPLcom/ichi2/anki/AppLifecycleObserver;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V SPLcom/ichi2/anki/AppLifecycleObserver;->onResume(Landroidx/lifecycle/LifecycleOwner;)V SPLcom/ichi2/anki/AppLifecycleObserver;->onStart(Landroidx/lifecycle/LifecycleOwner;)V Lcom/ichi2/anki/BackendBackupsKt; -SPLcom/ichi2/anki/BackendBackupsKt;->$r8$lambda$VE13hT4gNARNfKQDjZC_TfzqKjM(ZLcom/ichi2/anki/libanki/Collection;)Z +SPLcom/ichi2/anki/BackendBackupsKt;->()V SPLcom/ichi2/anki/BackendBackupsKt;->access$createBackup(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/BackendBackupsKt;->createBackup$lambda$0(ZLcom/ichi2/anki/libanki/Collection;)Z +SPLcom/ichi2/anki/BackendBackupsKt;->access$createBackupHoldingLock(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/BackendBackupsKt;->createBackup(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/BackendBackupsKt;->createBackupHoldingLock$lambda$0(ZLcom/ichi2/anki/libanki/Collection;)Z +SPLcom/ichi2/anki/BackendBackupsKt;->createBackupHoldingLock(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/BackendBackupsKt;->performBackupInBackground$default(ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; SPLcom/ichi2/anki/BackendBackupsKt;->performBackupInBackground(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; Lcom/ichi2/anki/BackendBackupsKt$$ExternalSyntheticLambda0; @@ -7734,12 +8707,15 @@ SPLcom/ichi2/anki/BackendBackupsKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang Lcom/ichi2/anki/BackendBackupsKt$createBackup$1; SPLcom/ichi2/anki/BackendBackupsKt$createBackup$1;->(Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/BackendBackupsKt$createBackup$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/ichi2/anki/BackendBackupsKt$createBackup$3; -SPLcom/ichi2/anki/BackendBackupsKt$createBackup$3;->(Lkotlin/coroutines/Continuation;)V -SPLcom/ichi2/anki/BackendBackupsKt$createBackup$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -SPLcom/ichi2/anki/BackendBackupsKt$createBackup$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -SPLcom/ichi2/anki/BackendBackupsKt$createBackup$3;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/BackendBackupsKt$createBackup$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$1; +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$1;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$2; +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$2;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/BackendBackupsKt$performBackupInBackground$1; SPLcom/ichi2/anki/BackendBackupsKt$performBackupInBackground$1;->(Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/BackendBackupsKt$performBackupInBackground$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; @@ -7754,6 +8730,14 @@ SPLcom/ichi2/anki/BackupManager$Companion;->enoughDiscSpace(Ljava/io/File;)Z SPLcom/ichi2/anki/BackupManager$Companion;->getBackupDirectory(Ljava/io/File;)Ljava/io/File; SPLcom/ichi2/anki/BackupManager$Companion;->getBackupDirectoryFromCollection(Ljava/io/File;)Ljava/lang/String; SPLcom/ichi2/anki/BackupManager$Companion;->getFreeDiscSpace(Ljava/io/File;)J +Lcom/ichi2/anki/BottomNavController$NavigationItem; +SPLcom/ichi2/anki/BottomNavController$NavigationItem;->$values()[Lcom/ichi2/anki/BottomNavController$NavigationItem; +SPLcom/ichi2/anki/BottomNavController$NavigationItem;->()V +SPLcom/ichi2/anki/BottomNavController$NavigationItem;->(Ljava/lang/String;IILjava/lang/String;ILjava/lang/String;)V +SPLcom/ichi2/anki/BottomNavController$NavigationItem;->getTag()Ljava/lang/String; +Lcom/ichi2/anki/BottomNavController$NavigationItem$Companion; +SPLcom/ichi2/anki/BottomNavController$NavigationItem$Companion;->()V +SPLcom/ichi2/anki/BottomNavController$NavigationItem$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lcom/ichi2/anki/BuildConfig; SPLcom/ichi2/anki/BuildConfig;->()V Lcom/ichi2/anki/CardBrowser; @@ -7762,41 +8746,22 @@ Lcom/ichi2/anki/CardBrowser$Companion; SPLcom/ichi2/anki/CardBrowser$Companion;->()V SPLcom/ichi2/anki/CardBrowser$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLcom/ichi2/anki/CardBrowser$Companion;->clearLastDeckId()V -Lcom/ichi2/anki/Channel; -SPLcom/ichi2/anki/Channel;->$values()[Lcom/ichi2/anki/Channel; -SPLcom/ichi2/anki/Channel;->()V -SPLcom/ichi2/anki/Channel;->(Ljava/lang/String;ILjava/lang/String;I)V -SPLcom/ichi2/anki/Channel;->getEntries()Lkotlin/enums/EnumEntries; -SPLcom/ichi2/anki/Channel;->getId()Ljava/lang/String; -SPLcom/ichi2/anki/Channel;->getName(Landroid/content/res/Resources;)Ljava/lang/String; -Lcom/ichi2/anki/CollectionHelper; -SPLcom/ichi2/anki/CollectionHelper;->()V -SPLcom/ichi2/anki/CollectionHelper;->()V -SPLcom/ichi2/anki/CollectionHelper;->getAppSpecificExternalDirectories(Landroid/content/Context;)Ljava/util/List; -SPLcom/ichi2/anki/CollectionHelper;->getAppSpecificInternalAnkiDroidDirectory(Landroid/content/Context;)Ljava/lang/String; -SPLcom/ichi2/anki/CollectionHelper;->getCurrentAnkiDroidDirectory(Landroid/content/Context;)Ljava/io/File; -SPLcom/ichi2/anki/CollectionHelper;->getCurrentAnkiDroidDirectoryOptionalContext$AnkiDroid_playNonMinifiedRelease(Landroid/content/SharedPreferences;Lkotlin/jvm/functions/Function0;)Ljava/io/File; -SPLcom/ichi2/anki/CollectionHelper;->initializeAnkiDroidDirectory(Ljava/io/File;)V -Lcom/ichi2/anki/CollectionHelper$$ExternalSyntheticLambda1; -SPLcom/ichi2/anki/CollectionHelper$$ExternalSyntheticLambda1;->(Lkotlin/jvm/functions/Function0;)V -Lcom/ichi2/anki/CollectionHelper$$ExternalSyntheticLambda2; -SPLcom/ichi2/anki/CollectionHelper$$ExternalSyntheticLambda2;->(Landroid/content/Context;)V +Lcom/ichi2/anki/CollectionLeaseManager; +SPLcom/ichi2/anki/CollectionLeaseManager;->()V +SPLcom/ichi2/anki/CollectionLeaseManager;->()V +SPLcom/ichi2/anki/CollectionLeaseManager;->getFlowOfLease()Lkotlinx/coroutines/flow/StateFlow; Lcom/ichi2/anki/CollectionManager; -SPLcom/ichi2/anki/CollectionManager;->$r8$lambda$A3eVuVLc79cO7kS8pQ3SMoriiy4()Lcom/ichi2/anki/libanki/Collection; SPLcom/ichi2/anki/CollectionManager;->$r8$lambda$CVrn_Kh6Msxahpe8OehADhoCTBs(Lcom/ichi2/anki/CollectionManager;)Lcom/ichi2/anki/libanki/Collection; -SPLcom/ichi2/anki/CollectionManager;->$r8$lambda$CdEUfwruqg89QRB7ootI6f97AOo(Lkotlin/jvm/functions/Function1;Lcom/ichi2/anki/CollectionManager;)Ljava/lang/Object; -SPLcom/ichi2/anki/CollectionManager;->$r8$lambda$LNk46KshV-5ez7Cho-SNGjzWnlA(Lnet/ankiweb/rsdroid/Backend;)Lcom/ichi2/anki/libanki/DB; SPLcom/ichi2/anki/CollectionManager;->$r8$lambda$W1MuSlVHYw8laATlr7Q27r6qm7c(Lcom/ichi2/anki/CollectionManager;)Z -SPLcom/ichi2/anki/CollectionManager;->$r8$lambda$YWF2-7xOSLjf6_Rj2swd1g-bkIA(Lkotlin/jvm/functions/Function1;Lcom/ichi2/anki/CollectionManager;)Ljava/lang/Object; -SPLcom/ichi2/anki/CollectionManager;->$r8$lambda$nApnmIuefbWwgL9QU2GbrZ3jC2g()Z SPLcom/ichi2/anki/CollectionManager;->()V SPLcom/ichi2/anki/CollectionManager;->()V +SPLcom/ichi2/anki/CollectionManager;->access$ensureBackendInner(Lcom/ichi2/anki/CollectionManager;)V SPLcom/ichi2/anki/CollectionManager;->access$withQueue(Lcom/ichi2/anki/CollectionManager;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/CollectionManager;->backend()Lnet/ankiweb/rsdroid/Backend; SPLcom/ichi2/anki/CollectionManager;->blockForQueue(Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; SPLcom/ichi2/anki/CollectionManager;->collectionPathInValidFolder()Lcom/ichi2/anki/libanki/CollectionFiles; SPLcom/ichi2/anki/CollectionManager;->ensureBackendInner()V -SPLcom/ichi2/anki/CollectionManager;->ensureOpenInner$lambda$0(Lnet/ankiweb/rsdroid/Backend;)Lcom/ichi2/anki/libanki/DB; +SPLcom/ichi2/anki/CollectionManager;->ensureOpenInner$lambda$1(Lnet/ankiweb/rsdroid/Backend;)Lcom/ichi2/anki/libanki/DB; SPLcom/ichi2/anki/CollectionManager;->ensureOpenInner()V SPLcom/ichi2/anki/CollectionManager;->getBackend()Lnet/ankiweb/rsdroid/Backend; SPLcom/ichi2/anki/CollectionManager;->getColUnsafe$lambda$0$0(Lcom/ichi2/anki/CollectionManager;)Lcom/ichi2/anki/libanki/Collection; @@ -7812,31 +8777,29 @@ SPLcom/ichi2/anki/CollectionManager;->logUIHangs(Lkotlin/jvm/functions/Function0 SPLcom/ichi2/anki/CollectionManager;->setBackend(Lnet/ankiweb/rsdroid/Backend;)V SPLcom/ichi2/anki/CollectionManager;->setCollection(Lcom/ichi2/anki/libanki/Collection;)V SPLcom/ichi2/anki/CollectionManager;->updateCustomCertificate(Ljava/lang/String;)Z -SPLcom/ichi2/anki/CollectionManager;->withCol$lambda$0(Lkotlin/jvm/functions/Function1;Lcom/ichi2/anki/CollectionManager;)Ljava/lang/Object; -SPLcom/ichi2/anki/CollectionManager;->withCol(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/CollectionManager;->withColInternal$lambda$0(Lkotlin/jvm/functions/Function1;Lcom/ichi2/anki/CollectionManager;)Ljava/lang/Object; +SPLcom/ichi2/anki/CollectionManager;->withColInternal(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/CollectionManager;->withOpenColOrNull$lambda$0(Lkotlin/jvm/functions/Function1;Lcom/ichi2/anki/CollectionManager;)Ljava/lang/Object; SPLcom/ichi2/anki/CollectionManager;->withOpenColOrNull(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/CollectionManager;->withQueue(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda1; -SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda1;->(Lkotlin/jvm/functions/Function1;)V +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda1;->()V SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda11; SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda11;->()V SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda11;->invoke()Ljava/lang/Object; -Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda14; -SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda14;->()V -SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda14;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda5; -SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda5;->()V -SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda5;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda2;->(Lkotlin/jvm/functions/Function1;)V +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda6; SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda6;->()V +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda6;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda7; -SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda7;->(Lkotlin/jvm/functions/Function1;)V -SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda7;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda7;->()V +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda7;->invoke()Ljava/lang/Object; Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda8; -SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda8;->()V -SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda8;->invoke()Ljava/lang/Object; +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda8;->(Lkotlin/jvm/functions/Function1;)V +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda8;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda9; SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda9;->()V SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda9;->invoke(Ljava/lang/Object;)Ljava/lang/Object; @@ -7844,6 +8807,14 @@ Lcom/ichi2/anki/CollectionManager$blockForQueue$2; SPLcom/ichi2/anki/CollectionManager$blockForQueue$2;->(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/CollectionManager$blockForQueue$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; SPLcom/ichi2/anki/CollectionManager$blockForQueue$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$getBackend$1; +SPLcom/ichi2/anki/CollectionManager$getBackend$1;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/CollectionManager$getBackend$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/CollectionManager$getBackend$1;->invokeSuspend$lambda$0(Lcom/ichi2/anki/CollectionManager;)Lkotlin/Unit; +SPLcom/ichi2/anki/CollectionManager$getBackend$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$getBackend$1$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/CollectionManager$getBackend$1$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/CollectionManager$getBackend$1$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/CollectionManager$withQueue$3; SPLcom/ichi2/anki/CollectionManager$withQueue$3;->(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/CollectionManager$withQueue$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; @@ -7852,19 +8823,14 @@ Lcom/ichi2/anki/CoroutineHelpersKt; SPLcom/ichi2/anki/CoroutineHelpersKt;->()V SPLcom/ichi2/anki/CoroutineHelpersKt;->access$dismissDialogIfShowing(Landroid/app/Dialog;)V SPLcom/ichi2/anki/CoroutineHelpersKt;->dismissDialogIfShowing(Landroid/app/Dialog;)V -SPLcom/ichi2/anki/CoroutineHelpersKt;->launchCatching(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; SPLcom/ichi2/anki/CoroutineHelpersKt;->launchCatchingIO(Landroidx/lifecycle/ViewModel;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; SPLcom/ichi2/anki/CoroutineHelpersKt;->launchCatchingTask$default(Landroidx/fragment/app/FragmentActivity;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; SPLcom/ichi2/anki/CoroutineHelpersKt;->launchCatchingTask(Landroidx/fragment/app/FragmentActivity;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; SPLcom/ichi2/anki/CoroutineHelpersKt;->runCatching(Landroidx/fragment/app/FragmentActivity;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/CoroutineHelpersKt;->withProgress$default(Landroid/app/Activity;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; SPLcom/ichi2/anki/CoroutineHelpersKt;->withProgress(Landroid/app/Activity;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/CoroutineHelpersKt;->withProgressDialog$default(Landroid/app/Activity;Lkotlin/jvm/functions/Function0;JLjava/lang/Integer;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; -SPLcom/ichi2/anki/CoroutineHelpersKt;->withProgressDialog(Landroid/app/Activity;Lkotlin/jvm/functions/Function0;JLjava/lang/Integer;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -Lcom/ichi2/anki/CoroutineHelpersKt$launchCatching$1; -SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatching$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V -SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatching$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatching$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt;->withProgressDialog-WPi__2c$default(Landroid/app/Activity;Lkotlin/jvm/functions/Function0;JLjava/lang/Integer;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt;->withProgressDialog-WPi__2c(Landroid/app/Activity;Lkotlin/jvm/functions/Function0;JLjava/lang/Integer;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lcom/ichi2/anki/CoroutineHelpersKt$launchCatchingIO$1; SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingIO$1;->(Landroidx/lifecycle/ViewModel;Lkotlin/coroutines/Continuation;)V Lcom/ichi2/anki/CoroutineHelpersKt$launchCatchingIO$2; @@ -7893,8 +8859,6 @@ SPLcom/ichi2/anki/CoroutineHelpersKt$withProgress$8;->invoke(Landroid/app/Progre SPLcom/ichi2/anki/CoroutineHelpersKt$withProgress$8;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; SPLcom/ichi2/anki/CoroutineHelpersKt$withProgress$8;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2; -SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2;->$r8$lambda$Ig687pjO6PY-xJRAdVlVIngnZ4Q(Landroid/app/Activity;)V -SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2;->$r8$lambda$hOqt-ECZDfdDp0GItaFz0S8D73Q(Landroid/app/Activity;)V SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2;->(Landroid/app/Activity;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Ljava/lang/Integer;JLkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -7912,146 +8876,188 @@ Lcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$dialogJob$1; SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$dialogJob$1;->(JLkotlin/jvm/functions/Function0;Ljava/lang/Integer;Landroid/app/ProgressDialog;Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$dialogJob$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$dialogJob$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/ichi2/anki/CrashReportService; -SPLcom/ichi2/anki/CrashReportService;->()V -SPLcom/ichi2/anki/CrashReportService;->()V -SPLcom/ichi2/anki/CrashReportService;->createAcraCoreConfigBuilder()Lorg/acra/config/CoreConfigurationBuilder; -SPLcom/ichi2/anki/CrashReportService;->fetchWebViewInformation()Ljava/util/HashMap; -SPLcom/ichi2/anki/CrashReportService;->initialize(Landroid/app/Application;)V -SPLcom/ichi2/anki/CrashReportService;->isAcraEnabled(Landroid/content/Context;Z)Z -SPLcom/ichi2/anki/CrashReportService;->isProperServiceProcess()Z -SPLcom/ichi2/anki/CrashReportService;->setAcraReportingMode(Ljava/lang/String;)V -SPLcom/ichi2/anki/CrashReportService;->setProductionACRAConfig(Landroid/content/SharedPreferences;)V -Lcom/ichi2/anki/CrashReportService$ToastType; -SPLcom/ichi2/anki/CrashReportService$ToastType;->$values()[Lcom/ichi2/anki/CrashReportService$ToastType; -SPLcom/ichi2/anki/CrashReportService$ToastType;->()V -SPLcom/ichi2/anki/CrashReportService$ToastType;->(Ljava/lang/String;II)V -SPLcom/ichi2/anki/CrashReportService$ToastType;->getToastMessage(Landroid/content/Context;)Ljava/lang/String; -Lcom/ichi2/anki/CrashReportServiceKt; -SPLcom/ichi2/anki/CrashReportServiceKt;->runCatchingWithReport(Ljava/lang/String;ZLkotlin/jvm/functions/Function0;)Ljava/lang/Object; Lcom/ichi2/anki/DayRolloverHandler; +SPLcom/ichi2/anki/DayRolloverHandler;->$r8$lambda$UUd88d_6FpFa_FHFUjhALzYt_Sw(Lcom/ichi2/anki/libanki/Collection;)J SPLcom/ichi2/anki/DayRolloverHandler;->()V SPLcom/ichi2/anki/DayRolloverHandler;->()V +SPLcom/ichi2/anki/DayRolloverHandler;->handleTimeChange$AnkiDroid(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DayRolloverHandler;->handleTimeChange$lambda$0$0(Lcom/ichi2/anki/libanki/Collection;)J SPLcom/ichi2/anki/DayRolloverHandler;->listenForRolloverEvents$register(Landroid/content/Context;Landroid/content/IntentFilter;)Landroid/content/Intent; SPLcom/ichi2/anki/DayRolloverHandler;->listenForRolloverEvents(Landroid/content/Context;)V +SPLcom/ichi2/anki/DayRolloverHandler;->onReceiveBroadcast(Landroid/content/Context;Landroid/content/Intent;)V +Lcom/ichi2/anki/DayRolloverHandler$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/DayRolloverHandler$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/DayRolloverHandler$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DayRolloverHandler$handleTimeChange$1; +SPLcom/ichi2/anki/DayRolloverHandler$handleTimeChange$1;->(Lcom/ichi2/anki/DayRolloverHandler;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DayRolloverHandler$handleTimeChange$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$1; +SPLcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$1;->(Lkotlin/coroutines/Continuation;)V +Lcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$2; +SPLcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$2;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/DeckPicker; -SPLcom/ichi2/anki/DeckPicker;->$r8$lambda$DMaxOB3raCRB9rKUgk2jx15uCGU(Lcom/ichi2/anki/DeckPicker;)V -SPLcom/ichi2/anki/DeckPicker;->$r8$lambda$ZhK_jVuQN1upte6e9X7ETJzpuF4(Lcom/ichi2/anki/DeckPicker;Z)V -SPLcom/ichi2/anki/DeckPicker;->$r8$lambda$bwwEepgyylOiXrrLhsc1zTHvEW0(Lcom/ichi2/anki/DeckPicker;I)V SPLcom/ichi2/anki/DeckPicker;->()V SPLcom/ichi2/anki/DeckPicker;->()V SPLcom/ichi2/anki/DeckPicker;->access$applyDeckPickerBackground(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onCardsDueChanged$21(Lcom/ichi2/anki/DeckPicker;Ljava/lang/Integer;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onCollectionStatusChanged$20(Lcom/ichi2/anki/DeckPicker;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onDeckListChanged$23(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onDecksReloaded$26(Lcom/ichi2/anki/DeckPicker;Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onFocusedDeckChanged$24(Lcom/ichi2/anki/DeckPicker;Ljava/lang/Long;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onResizingDividerVisibilityChanged$25(Lcom/ichi2/anki/DeckPicker;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onStartupResponse$27(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onStudiedTodayChanged$19(Lcom/ichi2/anki/DeckPicker;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onStudyOptionsVisibilityChanged$22(Lcom/ichi2/anki/DeckPicker;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onUndoUpdated$18(Lcom/ichi2/anki/DeckPicker;Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker;->access$getDecksLayoutManager$p(Lcom/ichi2/anki/DeckPicker;)Landroidx/recyclerview/widget/LinearLayoutManager; +SPLcom/ichi2/anki/DeckPicker;->access$getPullToSyncWrapper$p(Lcom/ichi2/anki/DeckPicker;)Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout; +SPLcom/ichi2/anki/DeckPicker;->access$restoreSearchState(Lcom/ichi2/anki/DeckPicker;Landroid/view/Menu;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onCardsDueChanged(Lcom/ichi2/anki/DeckPicker;Ljava/lang/Integer;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onCollectionStatusChanged(Lcom/ichi2/anki/DeckPicker;Z)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onDeckListChanged(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onDecksReloaded(Lcom/ichi2/anki/DeckPicker;Lkotlin/Unit;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onFocusedDeckChanged(Lcom/ichi2/anki/DeckPicker;Ljava/lang/Long;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onOptionsMenuUpdated(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/OptionsMenuState;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onResizingDividerVisibilityChanged(Lcom/ichi2/anki/DeckPicker;Z)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onStartupResponse(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onStudiedTodayChanged(Lcom/ichi2/anki/DeckPicker;Ljava/lang/String;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onStudyOptionsVisibilityChanged(Lcom/ichi2/anki/DeckPicker;Z)V SPLcom/ichi2/anki/DeckPicker;->access$updateDeckRelatedMenuItems(Lcom/ichi2/anki/DeckPicker;Landroid/view/Menu;)V SPLcom/ichi2/anki/DeckPicker;->access$updateSearchVisibilityFromState(Lcom/ichi2/anki/DeckPicker;Landroid/view/Menu;)V SPLcom/ichi2/anki/DeckPicker;->applyDeckPickerBackground(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker;->automaticSync$default(Lcom/ichi2/anki/DeckPicker;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker;->automaticSync(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker;->fitsSystemWindows()Z +SPLcom/ichi2/anki/DeckPicker;->getAnalyticsScreenName()Ljava/lang/String; +SPLcom/ichi2/anki/DeckPicker;->getBinding$AnkiDroid()Lcom/ichi2/anki/databinding/ActivityHomescreenBinding; +SPLcom/ichi2/anki/DeckPicker;->getBottomNavigationEnabled$AnkiDroid()Z SPLcom/ichi2/anki/DeckPicker;->getBroadcastsActions()Ljava/util/Map; -SPLcom/ichi2/anki/DeckPicker;->getDeckPickerBinding$AnkiDroid_playNonMinifiedRelease()Lcom/ichi2/anki/databinding/IncludeDeckPickerBinding; +SPLcom/ichi2/anki/DeckPicker;->getDeckPickerBinding$AnkiDroid()Lcom/ichi2/anki/databinding/IncludeDeckPickerBinding; +SPLcom/ichi2/anki/DeckPicker;->getFloatingActionButtonBinding()Lcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding; +SPLcom/ichi2/anki/DeckPicker;->getFragment()Lcom/ichi2/anki/StudyOptionsFragment; SPLcom/ichi2/anki/DeckPicker;->getFragmented()Z -SPLcom/ichi2/anki/DeckPicker;->getOptionsMenuState()Lcom/ichi2/anki/deckpicker/OptionsMenuState; +SPLcom/ichi2/anki/DeckPicker;->getImportViewModel()Lcom/ichi2/anki/dialogs/ImportViewModel; SPLcom/ichi2/anki/DeckPicker;->getViewModel()Lcom/ichi2/anki/deckpicker/DeckPickerViewModel; SPLcom/ichi2/anki/DeckPicker;->handleStartup()V SPLcom/ichi2/anki/DeckPicker;->onAttachedToWindow()V -SPLcom/ichi2/anki/DeckPicker;->onCreate$lambda$4$1(Lcom/ichi2/anki/DeckPicker;)V -SPLcom/ichi2/anki/DeckPicker;->onCreate$lambda$5$0(Lcom/ichi2/anki/DeckPicker;Z)V +SPLcom/ichi2/anki/DeckPicker;->onCreate$lambda$0(Landroid/content/res/Resources;)Z SPLcom/ichi2/anki/DeckPicker;->onCreate(Landroid/os/Bundle;)V SPLcom/ichi2/anki/DeckPicker;->onCreateOptionsMenu(Landroid/view/Menu;)Z SPLcom/ichi2/anki/DeckPicker;->onFinishedStartup()V -SPLcom/ichi2/anki/DeckPicker;->onPrepareOptionsMenu(Landroid/view/Menu;)Z SPLcom/ichi2/anki/DeckPicker;->onResume()V +SPLcom/ichi2/anki/DeckPicker;->raiseFabAboveSummary(I)V SPLcom/ichi2/anki/DeckPicker;->recreateActivityResultLauncher(Lcom/ichi2/anki/AnkiActivity;)Landroidx/activity/result/ActivityResultLauncher; SPLcom/ichi2/anki/DeckPicker;->refreshState()V -SPLcom/ichi2/anki/DeckPicker;->setOptionsMenuState(Lcom/ichi2/anki/deckpicker/OptionsMenuState;)V +SPLcom/ichi2/anki/DeckPicker;->restoreSearchState(Landroid/view/Menu;)V +SPLcom/ichi2/anki/DeckPicker;->setFloatingActionMenu(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V SPLcom/ichi2/anki/DeckPicker;->setupBackPressedCallbacks()V -SPLcom/ichi2/anki/DeckPicker;->setupFlows$onCardsDueChanged$21(Lcom/ichi2/anki/DeckPicker;Ljava/lang/Integer;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge$lambda$0(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge$lambda$1(Lcom/ichi2/anki/DeckPicker;Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge$lambda$2(Lcom/ichi2/anki/DeckPicker;)Lkotlin/Unit; +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge$lambda$3(Lcom/ichi2/anki/DeckPicker;Landroid/view/View;IIIIIIII)V +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge$listAnchor(Lcom/ichi2/anki/DeckPicker;)Landroid/view/View; +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge$setRecyclerViewBottomPaddingAbove(Lcom/ichi2/anki/DeckPicker;Landroid/view/View;)V +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge()V SPLcom/ichi2/anki/DeckPicker;->setupFlows$onCardsDueChanged(Lcom/ichi2/anki/DeckPicker;Ljava/lang/Integer;)V -SPLcom/ichi2/anki/DeckPicker;->setupFlows$onCollectionStatusChanged$20(Lcom/ichi2/anki/DeckPicker;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker;->setupFlows$onCollectionStatusChanged(Lcom/ichi2/anki/DeckPicker;Z)V -SPLcom/ichi2/anki/DeckPicker;->setupFlows$onDeckListChanged$23(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker;->setupFlows$onDeckListChanged(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;)V -SPLcom/ichi2/anki/DeckPicker;->setupFlows$onDecksReloaded$26(Lcom/ichi2/anki/DeckPicker;Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker;->setupFlows$onDecksReloaded(Lcom/ichi2/anki/DeckPicker;Lkotlin/Unit;)V -SPLcom/ichi2/anki/DeckPicker;->setupFlows$onFocusedDeckChanged$24(Lcom/ichi2/anki/DeckPicker;Ljava/lang/Long;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker;->setupFlows$onFocusedDeckChanged$lambda$7(Lcom/ichi2/anki/DeckPicker;I)V +SPLcom/ichi2/anki/DeckPicker;->setupFlows$onFocusedDeckChanged$lambda$4(Lcom/ichi2/anki/DeckPicker;I)V SPLcom/ichi2/anki/DeckPicker;->setupFlows$onFocusedDeckChanged(Lcom/ichi2/anki/DeckPicker;Ljava/lang/Long;)V -SPLcom/ichi2/anki/DeckPicker;->setupFlows$onResizingDividerVisibilityChanged$25(Lcom/ichi2/anki/DeckPicker;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker;->setupFlows$onOptionsMenuUpdated(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/OptionsMenuState;)V SPLcom/ichi2/anki/DeckPicker;->setupFlows$onResizingDividerVisibilityChanged(Lcom/ichi2/anki/DeckPicker;Z)V -SPLcom/ichi2/anki/DeckPicker;->setupFlows$onStartupResponse$27(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker;->setupFlows$onStartupResponse(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;)V -SPLcom/ichi2/anki/DeckPicker;->setupFlows$onStudiedTodayChanged$19(Lcom/ichi2/anki/DeckPicker;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker;->setupFlows$onStudiedTodayChanged(Lcom/ichi2/anki/DeckPicker;Ljava/lang/String;)V -SPLcom/ichi2/anki/DeckPicker;->setupFlows$onStudyOptionsVisibilityChanged$22(Lcom/ichi2/anki/DeckPicker;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker;->setupFlows$onStudyOptionsVisibilityChanged(Lcom/ichi2/anki/DeckPicker;Z)V -SPLcom/ichi2/anki/DeckPicker;->setupFlows$onUndoUpdated$18(Lcom/ichi2/anki/DeckPicker;Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker;->setupFlows$onUndoUpdated(Lcom/ichi2/anki/DeckPicker;Lkotlin/Unit;)V SPLcom/ichi2/anki/DeckPicker;->setupFlows()V SPLcom/ichi2/anki/DeckPicker;->setupMediaSyncMenuItem(Landroid/view/Menu;)V +SPLcom/ichi2/anki/DeckPicker;->setupPullToSync()V SPLcom/ichi2/anki/DeckPicker;->setupSearchIcon(Landroid/view/MenuItem;)V SPLcom/ichi2/anki/DeckPicker;->showStartupScreensAndDialogs(Landroid/content/SharedPreferences;I)V SPLcom/ichi2/anki/DeckPicker;->tryShowStudyOptionsPanel()Z SPLcom/ichi2/anki/DeckPicker;->updateDeckList()V SPLcom/ichi2/anki/DeckPicker;->updateDeckRelatedMenuItems(Landroid/view/Menu;)V SPLcom/ichi2/anki/DeckPicker;->updateMenuFromState(Landroid/view/Menu;)V -SPLcom/ichi2/anki/DeckPicker;->updateMenuState(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker;->updateSearchVisibilityFromState(Landroid/view/Menu;)V SPLcom/ichi2/anki/DeckPicker;->updateSyncIconFromState(Landroid/view/MenuItem;Lcom/ichi2/anki/deckpicker/OptionsMenuState;)V SPLcom/ichi2/anki/DeckPicker;->updateUndoLabelFromState(Landroid/view/MenuItem;Ljava/lang/String;Z)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/content/pm/PackageManager;Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Landroid/content/pm/ResolveInfo; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/Bitmap$CompressFormat; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/BlendMode; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(J)Landroid/content/pm/PackageManager$PackageInfoFlags; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(J)Landroid/content/pm/PackageManager$ResolveInfoFlags; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;)I +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ActivityManager;Ljava/lang/String;II)Ljava/util/List; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ApplicationExitInfo;)I +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageManager;Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Landroid/content/pm/ResolveInfo; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageManager;Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Ljava/util/List; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageManager;Ljava/lang/String;Landroid/content/pm/PackageManager$PackageInfoFlags;)Landroid/content/pm/PackageInfo; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Paint;Landroid/graphics/BlendMode;)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;Z)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/app/ApplicationExitInfo; Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda1; SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/DeckPicker;)V -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda1;->onScrollChanged()V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda10; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda10;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda12; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda12;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda13; -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda13;->(Lcom/ichi2/anki/DeckPicker;I)V -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda13;->run()V -Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda15; -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda15;->(Lcom/ichi2/anki/DeckPicker;)V -Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda16; -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda16;->(Lcom/ichi2/anki/DeckPicker;)V -Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda17; -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda17;->(Lcom/ichi2/anki/DeckPicker;)V -Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda18; -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda18;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda13;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda19; -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda19;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda19;->()V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda19;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda2; SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda2;->(Lcom/ichi2/anki/DeckPicker;)V -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda2;->onBeginToggle(Z)V Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda20; SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda20;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda20;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda21; SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda21;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda21;->invoke()Ljava/lang/Object; Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda23; SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda23;->(Lcom/ichi2/anki/DeckPicker;)V -Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda24; -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda24;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda23;->onLayoutChange(Landroid/view/View;IIIIIIII)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda26; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda26;->(Lcom/ichi2/anki/DeckPicker;I)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda26;->run()V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda28; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda28;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda29; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda29;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda3; -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda3;->(Lcom/ichi2/anki/DeckPicker;)V -Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda38; -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda38;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda3;->()V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda30; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda30;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda31; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda31;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda32; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda32;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda34; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda34;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda35; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda35;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda36; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda36;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda37; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda37;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda39; SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda39;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda4; SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda4;->(Lcom/ichi2/anki/DeckPicker;)V -Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda40; -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda40;->(Lcom/ichi2/anki/DeckPicker;)V -Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda41; -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda41;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda42; SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda42;->(Lcom/ichi2/anki/DeckPicker;)V -Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda43; -SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda43;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda5; SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda5;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda50; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda50;->()V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda50;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda51; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda51;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda52; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda52;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda6; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda6;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda7; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda7;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda8; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda8;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda9; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda9;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$Companion; SPLcom/ichi2/anki/DeckPicker$Companion;->()V SPLcom/ichi2/anki/DeckPicker$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -8075,14 +9081,20 @@ SPLcom/ichi2/anki/DeckPicker$closeFloatingActionBarBackPressCallback$1;->( Lcom/ichi2/anki/DeckPicker$exitAndSyncBackCallback$1; SPLcom/ichi2/anki/DeckPicker$exitAndSyncBackCallback$1;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$handleStartup$environment$1; -SPLcom/ichi2/anki/DeckPicker$handleStartup$environment$1;->(Lcom/ichi2/anki/AnkiDroidApp;)V +SPLcom/ichi2/anki/DeckPicker$handleStartup$environment$1;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/DeckPicker$handleStartup$environment$1;->decideStorageIfUndecided()V +SPLcom/ichi2/anki/DeckPicker$handleStartup$environment$1;->getPreferences()Landroid/content/SharedPreferences; SPLcom/ichi2/anki/DeckPicker$handleStartup$environment$1;->hasRequiredPermissions()Z -Lcom/ichi2/anki/DeckPicker$onCreate$4; -SPLcom/ichi2/anki/DeckPicker$onCreate$4;->(Ljava/lang/Object;)V -Lcom/ichi2/anki/DeckPicker$onCreate$6; -SPLcom/ichi2/anki/DeckPicker$onCreate$6;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V -SPLcom/ichi2/anki/DeckPicker$onCreate$6;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -SPLcom/ichi2/anki/DeckPicker$onCreate$6;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$onCreate$8; +SPLcom/ichi2/anki/DeckPicker$onCreate$8;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DeckPicker$onCreate$8;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/DeckPicker$onCreate$8;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$onCreate$8$1; +SPLcom/ichi2/anki/DeckPicker$onCreate$8$1;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DeckPicker$onCreate$8$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/DeckPicker$onCreate$8$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$onCreate$8$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$onCreate$8$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/DeckPicker$onCreateOptionsMenu$2; SPLcom/ichi2/anki/DeckPicker$onCreateOptionsMenu$2;->(Lcom/ichi2/anki/DeckPicker;Landroid/view/Menu;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/DeckPicker$onCreateOptionsMenu$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; @@ -8098,74 +9110,77 @@ SPLcom/ichi2/anki/DeckPicker$onFinishedStartup$1;->invokeSuspend(Ljava/lang/Obje Lcom/ichi2/anki/DeckPicker$setupFlows$1; SPLcom/ichi2/anki/DeckPicker$setupFlows$1;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$setupFlows$10; -SPLcom/ichi2/anki/DeckPicker$setupFlows$10;->(Lcom/ichi2/anki/DeckPicker;)V -SPLcom/ichi2/anki/DeckPicker$setupFlows$10;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker$setupFlows$10;->invoke(Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$10;->(Ljava/lang/Object;)V Lcom/ichi2/anki/DeckPicker$setupFlows$11; -SPLcom/ichi2/anki/DeckPicker$setupFlows$11;->(Lcom/ichi2/anki/DeckPicker;)V -SPLcom/ichi2/anki/DeckPicker$setupFlows$11;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker$setupFlows$11;->invoke(Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$11;->(Ljava/lang/Object;)V Lcom/ichi2/anki/DeckPicker$setupFlows$12; SPLcom/ichi2/anki/DeckPicker$setupFlows$12;->(Lcom/ichi2/anki/DeckPicker;)V -SPLcom/ichi2/anki/DeckPicker$setupFlows$12;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker$setupFlows$12;->invoke(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; Lcom/ichi2/anki/DeckPicker$setupFlows$13; SPLcom/ichi2/anki/DeckPicker$setupFlows$13;->(Lcom/ichi2/anki/DeckPicker;)V -SPLcom/ichi2/anki/DeckPicker$setupFlows$13;->invoke(Ljava/lang/Integer;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker$setupFlows$13;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/DeckPicker$setupFlows$14; SPLcom/ichi2/anki/DeckPicker$setupFlows$14;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$14;->invoke(Lcom/ichi2/anki/deckpicker/OptionsMenuState;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker$setupFlows$14;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker$setupFlows$14;->invoke(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; Lcom/ichi2/anki/DeckPicker$setupFlows$15; SPLcom/ichi2/anki/DeckPicker$setupFlows$15;->(Lcom/ichi2/anki/DeckPicker;)V -SPLcom/ichi2/anki/DeckPicker$setupFlows$15;->invoke(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker$setupFlows$15;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$15;->invoke(Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lcom/ichi2/anki/DeckPicker$setupFlows$16; SPLcom/ichi2/anki/DeckPicker$setupFlows$16;->(Lcom/ichi2/anki/DeckPicker;)V -SPLcom/ichi2/anki/DeckPicker$setupFlows$16;->invoke(Ljava/lang/Long;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker$setupFlows$16;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$16;->invoke(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; Lcom/ichi2/anki/DeckPicker$setupFlows$17; SPLcom/ichi2/anki/DeckPicker$setupFlows$17;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$17;->invoke(Ljava/lang/Integer;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker$setupFlows$17;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker$setupFlows$17;->invoke(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; Lcom/ichi2/anki/DeckPicker$setupFlows$18; SPLcom/ichi2/anki/DeckPicker$setupFlows$18;->(Lcom/ichi2/anki/DeckPicker;)V SPLcom/ichi2/anki/DeckPicker$setupFlows$18;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker$setupFlows$18;->invoke(Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$18;->invoke(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; Lcom/ichi2/anki/DeckPicker$setupFlows$19; SPLcom/ichi2/anki/DeckPicker$setupFlows$19;->(Lcom/ichi2/anki/DeckPicker;)V -SPLcom/ichi2/anki/DeckPicker$setupFlows$19;->invoke(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$19;->invoke(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker$setupFlows$19;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/DeckPicker$setupFlows$2; -SPLcom/ichi2/anki/DeckPicker$setupFlows$2;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$2;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$20; +SPLcom/ichi2/anki/DeckPicker$setupFlows$20;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$20;->invoke(Ljava/lang/Long;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$20;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$21; +SPLcom/ichi2/anki/DeckPicker$setupFlows$21;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$21;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$21;->invoke(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$22; +SPLcom/ichi2/anki/DeckPicker$setupFlows$22;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$22;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$22;->invoke(Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$23; +SPLcom/ichi2/anki/DeckPicker$setupFlows$23;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$23;->invoke(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$23;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$24; +SPLcom/ichi2/anki/DeckPicker$setupFlows$24;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$25; +SPLcom/ichi2/anki/DeckPicker$setupFlows$25;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$26; +SPLcom/ichi2/anki/DeckPicker$setupFlows$26;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$27; +SPLcom/ichi2/anki/DeckPicker$setupFlows$27;->(Ljava/lang/Object;)V Lcom/ichi2/anki/DeckPicker$setupFlows$3; -SPLcom/ichi2/anki/DeckPicker$setupFlows$3;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$3;->(Ljava/lang/Object;)V Lcom/ichi2/anki/DeckPicker$setupFlows$4; -SPLcom/ichi2/anki/DeckPicker$setupFlows$4;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$4;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V Lcom/ichi2/anki/DeckPicker$setupFlows$5; SPLcom/ichi2/anki/DeckPicker$setupFlows$5;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$setupFlows$6; -SPLcom/ichi2/anki/DeckPicker$setupFlows$6;->(Ljava/lang/Object;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$6;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$setupFlows$7; -SPLcom/ichi2/anki/DeckPicker$setupFlows$7;->(Ljava/lang/Object;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$7;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$setupFlows$8; -SPLcom/ichi2/anki/DeckPicker$setupFlows$8;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$8;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V Lcom/ichi2/anki/DeckPicker$setupFlows$9; SPLcom/ichi2/anki/DeckPicker$setupFlows$9;->(Lcom/ichi2/anki/DeckPicker;)V -Lcom/ichi2/anki/DeckPicker$setupFlows$onStudiedTodayChanged$$inlined$doOnLayout$1; -SPLcom/ichi2/anki/DeckPicker$setupFlows$onStudiedTodayChanged$$inlined$doOnLayout$1;->(Lcom/ichi2/anki/DeckPicker;)V -Lcom/ichi2/anki/DeckPicker$setupFlows$onUndoUpdated$1; -SPLcom/ichi2/anki/DeckPicker$setupFlows$onUndoUpdated$1;->$r8$lambda$oIFVYnbmddw0jolB0yipsgJjdRQ(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/libanki/Collection;)Lkotlin/Unit; -SPLcom/ichi2/anki/DeckPicker$setupFlows$onUndoUpdated$1;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V -SPLcom/ichi2/anki/DeckPicker$setupFlows$onUndoUpdated$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -SPLcom/ichi2/anki/DeckPicker$setupFlows$onUndoUpdated$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker$setupFlows$onUndoUpdated$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/DeckPicker$setupFlows$onUndoUpdated$1;->invokeSuspend$lambda$0(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/libanki/Collection;)Lkotlin/Unit; -SPLcom/ichi2/anki/DeckPicker$setupFlows$onUndoUpdated$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/ichi2/anki/DeckPicker$setupFlows$onUndoUpdated$1$$ExternalSyntheticLambda0; -SPLcom/ichi2/anki/DeckPicker$setupFlows$onUndoUpdated$1$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/DeckPicker;)V -SPLcom/ichi2/anki/DeckPicker$setupFlows$onUndoUpdated$1$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1; SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1;->(Lkotlinx/coroutines/flow/Flow;Lcom/ichi2/anki/DeckPicker;Lcom/google/android/material/progressindicator/LinearProgressIndicator;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; @@ -8176,10 +9191,13 @@ SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1$1;->create(Ljava/lang/Obje SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1$1;->invoke(Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupPullToSync$$inlined$doOnScrolled$1; +SPLcom/ichi2/anki/DeckPicker$setupPullToSync$$inlined$doOnScrolled$1;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupPullToSync$$inlined$doOnScrolled$1;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V Lcom/ichi2/anki/DeckPicker$setupSearchIcon$1; SPLcom/ichi2/anki/DeckPicker$setupSearchIcon$1;->(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/DeckPicker$setupSearchIcon$2$1; -SPLcom/ichi2/anki/DeckPicker$setupSearchIcon$2$1;->(Lcom/ichi2/ui/AccessibleSearchView;Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupSearchIcon$2$1;->(Lcom/ichi2/ui/AccessibleSearchView;Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/ui/AccessibleSearchView;Landroid/view/MenuItem;)V Lcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$1; SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$1;->(Landroidx/activity/ComponentActivity;)V SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$1;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; @@ -8192,6 +9210,18 @@ Lcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$3; SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$3;->(Lkotlin/jvm/functions/Function0;Landroidx/activity/ComponentActivity;)V SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$3;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$3;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$4; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$4;->(Landroidx/activity/ComponentActivity;)V +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$4;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$4;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$5; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$5;->(Landroidx/activity/ComponentActivity;)V +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$5;->invoke()Landroidx/lifecycle/ViewModelStore; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$5;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$6; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$6;->(Lkotlin/jvm/functions/Function0;Landroidx/activity/ComponentActivity;)V +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$6;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$6;->invoke()Ljava/lang/Object; Lcom/ichi2/anki/DeckPicker$updateDeckList$1; SPLcom/ichi2/anki/DeckPicker$updateDeckList$1;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/DeckPicker$updateDeckList$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; @@ -8204,36 +9234,29 @@ SPLcom/ichi2/anki/DeckPicker$updateDeckList$1$1;->create(Lkotlin/coroutines/Cont SPLcom/ichi2/anki/DeckPicker$updateDeckList$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker$updateDeckList$1$1;->invoke(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/DeckPicker$updateDeckList$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/ichi2/anki/DeckPicker$updateMenuState$1; -SPLcom/ichi2/anki/DeckPicker$updateMenuState$1;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V -SPLcom/ichi2/anki/DeckPicker$updateMenuState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/DeckPickerFloatingActionMenu; -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->$r8$lambda$LNLVbyL2ZOjV8NBtr-vvg5EWjbY(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->(Landroid/content/Context;Lcom/ichi2/anki/databinding/ActivityHomescreenBinding;Lcom/ichi2/anki/DeckPicker;)V -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->closeFloatingActionMenu$lambda$4$0(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->closeFloatingActionMenu(Z)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->()V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->(Landroid/content/Context;Lcom/ichi2/anki/databinding/ActivityHomescreenBinding;Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/DeckPickerFloatingActionMenu$FloatingActionBarToggleListener;Z)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->access$resetMenuAfterAdding(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->createActivationKeyListener(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Landroid/view/View$OnKeyListener; -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->isFABOpen()Z -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->setToggleListener(Lcom/ichi2/anki/DeckPickerFloatingActionMenu$FloatingActionBarToggleListener;)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->resetMenuAfterAdding()V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->setCreateDeckButtonLabel()V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda1; -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda1;->(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda10; SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda10;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V -Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda11; -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda11;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V -Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda12; -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda12;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V -Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda13; -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda13;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda2; SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda2;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda3; SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda3;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda4; -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda4;->(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda4;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda5; SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda5;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda5;->run()V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda6; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda6;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda7; SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda7;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda8; @@ -8241,20 +9264,16 @@ SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda8;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V Lcom/ichi2/anki/DeckPickerFloatingActionMenu$1; -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$1;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;Landroid/content/Context;)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$1;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$1;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$1;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$2; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$2;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;Landroid/content/Context;)V Lcom/ichi2/anki/DeckPickerFloatingActionMenu$FloatingActionBarToggleListener; -Lcom/ichi2/anki/DeckPickerFloatingActionMenu$closeFloatingActionMenu$6$1; -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$closeFloatingActionMenu$6$1;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;Lcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding;)V -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$closeFloatingActionMenu$6$1;->onAnimationCancel(Landroid/animation/Animator;)V -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$closeFloatingActionMenu$6$1;->onAnimationEnd(Landroid/animation/Animator;)V -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$closeFloatingActionMenu$6$1;->onAnimationStart(Landroid/animation/Animator;)V -Lcom/ichi2/anki/DeckPickerFloatingActionMenu$closeFloatingActionMenu$6$2; -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$closeFloatingActionMenu$6$2;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;Lcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding;)V -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$closeFloatingActionMenu$6$2;->onAnimationCancel(Landroid/animation/Animator;)V -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$closeFloatingActionMenu$6$2;->onAnimationEnd(Landroid/animation/Animator;)V -SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$closeFloatingActionMenu$6$2;->onAnimationStart(Landroid/animation/Animator;)V Lcom/ichi2/anki/DeckPickerKt; SPLcom/ichi2/anki/DeckPickerKt;->getStudyoptionsFrame(Lcom/ichi2/anki/databinding/ActivityHomescreenBinding;)Landroidx/fragment/app/FragmentContainerView; +Lcom/ichi2/anki/DispatchKeyEventListener; Lcom/ichi2/anki/Flag; SPLcom/ichi2/anki/Flag;->$values()[Lcom/ichi2/anki/Flag; SPLcom/ichi2/anki/Flag;->()V @@ -8267,33 +9286,45 @@ SPLcom/ichi2/anki/Flag$Companion;->(Lkotlin/jvm/internal/DefaultConstructo Lcom/ichi2/anki/FlashCardsContract; SPLcom/ichi2/anki/FlashCardsContract;->()V SPLcom/ichi2/anki/FlashCardsContract;->()V +SPLcom/ichi2/anki/FlashCardsContract;->getAuthority$default(Lcom/ichi2/anki/FlashCardsContract;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; +SPLcom/ichi2/anki/FlashCardsContract;->getAuthority(Ljava/lang/String;)Ljava/lang/String; +SPLcom/ichi2/anki/FlashCardsContract;->getAuthorityUri$default(Lcom/ichi2/anki/FlashCardsContract;Ljava/lang/String;ILjava/lang/Object;)Landroid/net/Uri; +SPLcom/ichi2/anki/FlashCardsContract;->getAuthorityUri(Ljava/lang/String;)Landroid/net/Uri; +SPLcom/ichi2/anki/FlashCardsContract;->getPermission(Ljava/lang/String;)Ljava/lang/String; Lcom/ichi2/anki/FlashCardsContract$Note; SPLcom/ichi2/anki/FlashCardsContract$Note;->()V SPLcom/ichi2/anki/FlashCardsContract$Note;->()V +SPLcom/ichi2/anki/FlashCardsContract$Note;->getDefaultColumns()[Ljava/lang/String; +Lcom/ichi2/anki/HomeScreenNavigationKt; +SPLcom/ichi2/anki/HomeScreenNavigationKt;->selectedBottomNavItem(Lcom/ichi2/anki/DeckPicker;)Lcom/ichi2/anki/BottomNavController$NavigationItem; +SPLcom/ichi2/anki/HomeScreenNavigationKt;->setupBottomNavigation(Lcom/ichi2/anki/DeckPicker;)V Lcom/ichi2/anki/ImportColpkgListener; Lcom/ichi2/anki/InitialActivity; SPLcom/ichi2/anki/InitialActivity;->()V SPLcom/ichi2/anki/InitialActivity;->()V -SPLcom/ichi2/anki/InitialActivity;->getStartupFailureType(Lkotlin/jvm/functions/Function0;)Lcom/ichi2/anki/InitialActivity$StartupFailure; +SPLcom/ichi2/anki/InitialActivity;->decideStorageIfUndecided(Landroid/content/Context;)V +SPLcom/ichi2/anki/InitialActivity;->getStartupFailureType(Landroid/content/SharedPreferences;Lkotlin/jvm/functions/Function0;)Lcom/ichi2/anki/InitialActivity$StartupFailure; +SPLcom/ichi2/anki/InitialActivity;->isLatestVersion(Landroid/content/SharedPreferences;)Z SPLcom/ichi2/anki/InitialActivity;->performSetupFromFreshInstallOrClearedPreferences(Landroid/content/SharedPreferences;)Z SPLcom/ichi2/anki/InitialActivity;->setUpgradedToLatestVersion(Landroid/content/SharedPreferences;)V SPLcom/ichi2/anki/InitialActivity;->wasFreshInstall(Landroid/content/SharedPreferences;)Z +Lcom/ichi2/anki/InitialActivity$StartupFailure; Lcom/ichi2/anki/InitialActivityKt; SPLcom/ichi2/anki/InitialActivityKt;->configureRenderingMode()V -SPLcom/ichi2/anki/InitialActivityKt;->selectAnkiDroidFolder(Landroid/content/Context;)Lcom/ichi2/anki/AnkiDroidFolder; -SPLcom/ichi2/anki/InitialActivityKt;->selectAnkiDroidFolder(ZZ)Lcom/ichi2/anki/AnkiDroidFolder; +SPLcom/ichi2/anki/InitialActivityKt;->selectStoragePermissions(Landroid/content/Context;)Lcom/ichi2/anki/StoragePermissionSet; Lcom/ichi2/anki/IntentHandler; SPLcom/ichi2/anki/IntentHandler;->()V SPLcom/ichi2/anki/IntentHandler;->()V SPLcom/ichi2/anki/IntentHandler;->launchDeckPickerIfNoOtherTasks(Landroid/content/Intent;)V SPLcom/ichi2/anki/IntentHandler;->onCreate(Landroid/os/Bundle;)V +SPLcom/ichi2/anki/IntentHandler;->onDestroy()V Lcom/ichi2/anki/IntentHandler$$ExternalSyntheticLambda0; SPLcom/ichi2/anki/IntentHandler$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/IntentHandler;Landroid/content/Intent;Ljava/lang/String;)V Lcom/ichi2/anki/IntentHandler$Companion; SPLcom/ichi2/anki/IntentHandler$Companion;->()V SPLcom/ichi2/anki/IntentHandler$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLcom/ichi2/anki/IntentHandler$Companion;->getLaunchType(Landroid/content/Intent;)Lcom/ichi2/anki/IntentHandler$LaunchType; -SPLcom/ichi2/anki/IntentHandler$Companion;->grantedStoragePermissions(Landroid/content/Context;Z)Z +SPLcom/ichi2/anki/IntentHandler$Companion;->isBrowserDeepLink(Landroid/content/Intent;)Z SPLcom/ichi2/anki/IntentHandler$Companion;->requiresCollectionAccess(Lcom/ichi2/anki/IntentHandler$LaunchType;)Z Lcom/ichi2/anki/IntentHandler$Companion$WhenMappings; SPLcom/ichi2/anki/IntentHandler$Companion$WhenMappings;->()V @@ -8306,7 +9337,6 @@ Lcom/ichi2/anki/IntentHandler$WhenMappings; SPLcom/ichi2/anki/IntentHandler$WhenMappings;->()V Lcom/ichi2/anki/IntentHandler2; Lcom/ichi2/anki/IntroductionActivity; -SPLcom/ichi2/anki/IntroductionActivity;->$r8$lambda$FFZVZ3pUWAq7hknvRFwnlXXyQ4Y(Lcom/ichi2/anki/IntroductionActivity;Ljava/lang/String;Landroid/os/Bundle;)Lkotlin/Unit; SPLcom/ichi2/anki/IntroductionActivity;->()V SPLcom/ichi2/anki/IntroductionActivity;->()V SPLcom/ichi2/anki/IntroductionActivity;->onCreate$lambda$0(Lcom/ichi2/anki/IntroductionActivity;Ljava/lang/String;Landroid/os/Bundle;)Lkotlin/Unit; @@ -8318,6 +9348,8 @@ SPLcom/ichi2/anki/IntroductionActivity$$ExternalSyntheticLambda0;->(Lcom/i SPLcom/ichi2/anki/IntroductionActivity$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/IntroductionActivity$$ExternalSyntheticLambda1; SPLcom/ichi2/anki/IntroductionActivity$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/IntroductionActivity;)V +Lcom/ichi2/anki/IntroductionActivity$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/IntroductionActivity$$ExternalSyntheticLambda2;->(Lcom/ichi2/anki/IntroductionActivity;)V Lcom/ichi2/anki/IntroductionActivity$Companion; SPLcom/ichi2/anki/IntroductionActivity$Companion;->()V SPLcom/ichi2/anki/IntroductionActivity$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -8325,20 +9357,31 @@ Lcom/ichi2/anki/IntroductionActivity$WhenMappings; SPLcom/ichi2/anki/IntroductionActivity$WhenMappings;->()V Lcom/ichi2/anki/IntroductionActivityKt; SPLcom/ichi2/anki/IntroductionActivityKt;->hasShownAppIntro(Landroid/content/Context;)Z +Lcom/ichi2/anki/LaunchCatchingKt; +SPLcom/ichi2/anki/LaunchCatchingKt;->launchCatching(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; +Lcom/ichi2/anki/LaunchCatchingKt$launchCatching$1; +SPLcom/ichi2/anki/LaunchCatchingKt$launchCatching$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/LaunchCatchingKt$launchCatching$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/LaunchCatchingKt$launchCatching$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/LeakCanaryConfiguration; SPLcom/ichi2/anki/LeakCanaryConfiguration;->()V SPLcom/ichi2/anki/LeakCanaryConfiguration;->()V SPLcom/ichi2/anki/LeakCanaryConfiguration;->disable()V +Lcom/ichi2/anki/MetaDbWidgetRepository; +SPLcom/ichi2/anki/MetaDbWidgetRepository;->()V +SPLcom/ichi2/anki/MetaDbWidgetRepository;->(Landroid/content/Context;)V +Lcom/ichi2/anki/MetaDbWidgetRepositoryKt; +SPLcom/ichi2/anki/MetaDbWidgetRepositoryKt;->initializeWidgetRepository(Landroid/app/Application;)V Lcom/ichi2/anki/NavigationDrawerActivity; SPLcom/ichi2/anki/NavigationDrawerActivity;->()V SPLcom/ichi2/anki/NavigationDrawerActivity;->(Ljava/lang/Integer;)V SPLcom/ichi2/anki/NavigationDrawerActivity;->(Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -SPLcom/ichi2/anki/NavigationDrawerActivity;->fitsSystemWindows()Z SPLcom/ichi2/anki/NavigationDrawerActivity;->getDrawerLayout()Landroidx/drawerlayout/widget/DrawerLayout; SPLcom/ichi2/anki/NavigationDrawerActivity;->getDrawerToggle()Landroidx/appcompat/app/ActionBarDrawerToggle; SPLcom/ichi2/anki/NavigationDrawerActivity;->getNavigationDrawerLayout()I SPLcom/ichi2/anki/NavigationDrawerActivity;->initNavigationDrawer$default(Lcom/ichi2/anki/NavigationDrawerActivity;Landroid/view/View;ILjava/lang/Object;)V SPLcom/ichi2/anki/NavigationDrawerActivity;->initNavigationDrawer(Landroid/view/View;)V +SPLcom/ichi2/anki/NavigationDrawerActivity;->isDrawerOpen()Z SPLcom/ichi2/anki/NavigationDrawerActivity;->navDrawerIsReady()Z SPLcom/ichi2/anki/NavigationDrawerActivity;->onPostCreate(Landroid/os/Bundle;)V SPLcom/ichi2/anki/NavigationDrawerActivity;->selectNavigationItem(I)V @@ -8346,18 +9389,24 @@ SPLcom/ichi2/anki/NavigationDrawerActivity;->setDrawerLayout(Landroidx/drawerlay SPLcom/ichi2/anki/NavigationDrawerActivity;->setTitle(Ljava/lang/CharSequence;)V SPLcom/ichi2/anki/NavigationDrawerActivity;->setViewBinding(Landroidx/viewbinding/ViewBinding;)V SPLcom/ichi2/anki/NavigationDrawerActivity;->setupBackPressedCallbacks()V +SPLcom/ichi2/anki/NavigationDrawerActivity;->setupDrawerInsets$lambda$0(Lkotlin/jvm/internal/Ref$IntRef;Lcom/google/android/material/navigation/NavigationView;IIILandroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +SPLcom/ichi2/anki/NavigationDrawerActivity;->setupDrawerInsets(Lcom/google/android/material/navigation/NavigationView;)V Lcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda0; SPLcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/NavigationDrawerActivity;)V Lcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda1; SPLcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/NavigationDrawerActivity;)V +Lcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda2;->(Lkotlin/jvm/internal/Ref$IntRef;Lcom/google/android/material/navigation/NavigationView;III)V +SPLcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda2;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; Lcom/ichi2/anki/NavigationDrawerActivity$Companion; SPLcom/ichi2/anki/NavigationDrawerActivity$Companion;->()V SPLcom/ichi2/anki/NavigationDrawerActivity$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLcom/ichi2/anki/NavigationDrawerActivity$Companion;->enablePostShortcut(Landroid/content/Context;)V Lcom/ichi2/anki/NavigationDrawerActivity$drawerBackCallback$1; SPLcom/ichi2/anki/NavigationDrawerActivity$drawerBackCallback$1;->(Lcom/ichi2/anki/NavigationDrawerActivity;)V -Lcom/ichi2/anki/NavigationDrawerActivity$initNavigationDrawer$2; -SPLcom/ichi2/anki/NavigationDrawerActivity$initNavigationDrawer$2;->(Lcom/ichi2/anki/NavigationDrawerActivity;Landroidx/drawerlayout/widget/DrawerLayout;II)V +Lcom/ichi2/anki/NavigationDrawerActivity$initNavigationDrawer$3; +SPLcom/ichi2/anki/NavigationDrawerActivity$initNavigationDrawer$3;->(Lcom/ichi2/anki/NavigationDrawerActivity;Landroidx/drawerlayout/widget/DrawerLayout;II)V +Lcom/ichi2/anki/NoteEditorActivity; Lcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller; SPLcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller;->$values()[Lcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller; SPLcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller;->()V @@ -8366,19 +9415,21 @@ SPLcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller;->getValue()I Lcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller$Companion; SPLcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller$Companion;->()V SPLcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/NotificationChannel; +SPLcom/ichi2/anki/NotificationChannel;->$values()[Lcom/ichi2/anki/NotificationChannel; +SPLcom/ichi2/anki/NotificationChannel;->()V +SPLcom/ichi2/anki/NotificationChannel;->(Ljava/lang/String;ILjava/lang/String;II)V +SPLcom/ichi2/anki/NotificationChannel;->getEntries()Lkotlin/enums/EnumEntries; +SPLcom/ichi2/anki/NotificationChannel;->getId()Ljava/lang/String; +SPLcom/ichi2/anki/NotificationChannel;->getImportance()I +SPLcom/ichi2/anki/NotificationChannel;->getName(Landroid/content/res/Resources;)Ljava/lang/String; Lcom/ichi2/anki/NotificationChannelKt; +SPLcom/ichi2/anki/NotificationChannelKt;->()V SPLcom/ichi2/anki/NotificationChannelKt;->setupNotificationChannels(Landroid/content/Context;)V Lcom/ichi2/anki/OnErrorListener; Lcom/ichi2/anki/OnPageFinishedCallback; Lcom/ichi2/anki/PermissionSet; -SPLcom/ichi2/anki/PermissionSet;->$values()[Lcom/ichi2/anki/PermissionSet; -SPLcom/ichi2/anki/PermissionSet;->()V -SPLcom/ichi2/anki/PermissionSet;->(Ljava/lang/String;ILjava/util/List;Ljava/lang/Class;)V -SPLcom/ichi2/anki/PermissionSet;->getPermissions()Ljava/util/List; -Lcom/ichi2/anki/PermissionSet$Creator; -SPLcom/ichi2/anki/PermissionSet$Creator;->()V -Lcom/ichi2/anki/R$attr; -Lcom/ichi2/anki/R$bool; +SPLcom/ichi2/anki/PermissionSet;->hasRequiredPermissions(Landroid/content/Context;)Z Lcom/ichi2/anki/R$color; Lcom/ichi2/anki/R$dimen; Lcom/ichi2/anki/R$drawable; @@ -8390,11 +9441,35 @@ Lcom/ichi2/anki/R$string; Lcom/ichi2/anki/R$style; Lcom/ichi2/anki/Reviewer; SPLcom/ichi2/anki/Reviewer;->()V +Lcom/ichi2/anki/Reviewer$$ExternalSyntheticLambda17; +SPLcom/ichi2/anki/Reviewer$$ExternalSyntheticLambda17;->()V +Lcom/ichi2/anki/Reviewer$$ExternalSyntheticLambda18; +SPLcom/ichi2/anki/Reviewer$$ExternalSyntheticLambda18;->()V Lcom/ichi2/anki/Reviewer$Companion; SPLcom/ichi2/anki/Reviewer$Companion;->()V SPLcom/ichi2/anki/Reviewer$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLcom/ichi2/anki/Reviewer$Companion;->getIntent(Landroid/content/Context;)Landroid/content/Intent; +Lcom/ichi2/anki/StoragePermissionSet; +SPLcom/ichi2/anki/StoragePermissionSet;->$values()[Lcom/ichi2/anki/StoragePermissionSet; +SPLcom/ichi2/anki/StoragePermissionSet;->()V +SPLcom/ichi2/anki/StoragePermissionSet;->(Ljava/lang/String;ILjava/util/List;Ljava/lang/Class;)V +SPLcom/ichi2/anki/StoragePermissionSet;->getPermissions()Ljava/util/List; +SPLcom/ichi2/anki/StoragePermissionSet;->hasRequiredPermissions(Landroid/content/Context;)Z +Lcom/ichi2/anki/StoragePermissionSet$Creator; +SPLcom/ichi2/anki/StoragePermissionSet$Creator;->()V +Lcom/ichi2/anki/StudyOptionsFragment; +SPLcom/ichi2/anki/StudyOptionsFragment;->()V +Lcom/ichi2/anki/StudyOptionsFragment$Companion; +SPLcom/ichi2/anki/StudyOptionsFragment$Companion;->()V +SPLcom/ichi2/anki/StudyOptionsFragment$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/StudyOptionsFragment$Companion;->registerStudyOptionsAddEditReminderHandler(Landroidx/fragment/app/FragmentActivity;Lkotlin/jvm/functions/Function1;)V +SPLcom/ichi2/anki/StudyOptionsFragment$Companion;->registerStudyOptionsStudyHandler(Landroidx/fragment/app/FragmentActivity;Lkotlin/jvm/functions/Function0;)V +Lcom/ichi2/anki/StudyOptionsFragment$Companion$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/StudyOptionsFragment$Companion$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function0;)V +Lcom/ichi2/anki/StudyOptionsFragment$Companion$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/StudyOptionsFragment$Companion$$ExternalSyntheticLambda1;->(Lkotlin/jvm/functions/Function1;)V Lcom/ichi2/anki/SyncActionProvider; +SPLcom/ichi2/anki/SyncActionProvider;->()V SPLcom/ichi2/anki/SyncActionProvider;->(Landroid/content/Context;)V SPLcom/ichi2/anki/SyncActionProvider;->getIcon()Landroid/graphics/drawable/Drawable; SPLcom/ichi2/anki/SyncActionProvider;->onCreateActionView(Landroid/view/MenuItem;)Landroid/view/View; @@ -8403,30 +9478,49 @@ SPLcom/ichi2/anki/SyncActionProvider;->setTooltipText(Ljava/lang/CharSequence;)V Lcom/ichi2/anki/SyncActionProvider$$ExternalSyntheticLambda0; SPLcom/ichi2/anki/SyncActionProvider$$ExternalSyntheticLambda0;->(Landroid/view/MenuItem;Lcom/ichi2/anki/SyncActionProvider;)V Lcom/ichi2/anki/SyncKt; +SPLcom/ichi2/anki/SyncKt;->()V SPLcom/ichi2/anki/SyncKt;->getEndpoint()Ljava/lang/String; -SPLcom/ichi2/anki/SyncKt;->syncAuth()Lanki/sync/SyncAuth; +SPLcom/ichi2/anki/SyncKt;->syncAuth()Lcom/ichi2/anki/sync/SyncAuth; Lcom/ichi2/anki/TtsVoices; SPLcom/ichi2/anki/TtsVoices;->()V SPLcom/ichi2/anki/TtsVoices;->()V -SPLcom/ichi2/anki/TtsVoices;->access$getAvailableLocaleData$p()Ljava/util/List; -SPLcom/ichi2/anki/TtsVoices;->access$loadTtsVoicesData(Lcom/ichi2/anki/TtsVoices;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices;->access$getAvailableVoices$p()Ljava/util/List; +SPLcom/ichi2/anki/TtsVoices;->access$setAvailableVoices$p(Ljava/util/List;)V SPLcom/ichi2/anki/TtsVoices;->access$setBuildLocalesJob$p(Lkotlinx/coroutines/Job;)V SPLcom/ichi2/anki/TtsVoices;->access$setTtsEngine$p(Ljava/lang/String;)V -SPLcom/ichi2/anki/TtsVoices;->createTts(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices;->createTts(Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/TtsVoices;->launchBuildLocalesJob()V -SPLcom/ichi2/anki/TtsVoices;->loadTtsVoicesData(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices;->loadVoices$AnkiDroid(Lkotlinx/coroutines/CompletableDeferred;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices;->loadVoicesFromEngines$AnkiDroid(Ljava/util/List;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices;->readLocales(Landroid/speech/tts/TextToSpeech;)Ljava/util/List; +Lcom/ichi2/anki/TtsVoices$EngineLocales; +SPLcom/ichi2/anki/TtsVoices$EngineLocales;->()V +SPLcom/ichi2/anki/TtsVoices$EngineLocales;->(Ljava/lang/String;Ljava/util/List;)V Lcom/ichi2/anki/TtsVoices$createTts$2$1; SPLcom/ichi2/anki/TtsVoices$createTts$2$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;)V -Lcom/ichi2/anki/TtsVoices$createTts$2$2; -SPLcom/ichi2/anki/TtsVoices$createTts$2$2;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/CancellableContinuation;)V -SPLcom/ichi2/anki/TtsVoices$createTts$2$2;->onInit(I)V +Lcom/ichi2/anki/TtsVoices$createTts$2$onInit$1; +SPLcom/ichi2/anki/TtsVoices$createTts$2$onInit$1;->(Ljava/lang/String;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/CancellableContinuation;)V +SPLcom/ichi2/anki/TtsVoices$createTts$2$onInit$1;->onInit(I)V Lcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1; -SPLcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1;->(Lkotlinx/coroutines/CompletableDeferred;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; SPLcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/ichi2/anki/TtsVoices$loadTtsVoicesData$1; -SPLcom/ichi2/anki/TtsVoices$loadTtsVoicesData$1;->(Lcom/ichi2/anki/TtsVoices;Lkotlin/coroutines/Continuation;)V -SPLcom/ichi2/anki/TtsVoices$loadTtsVoicesData$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1$1; +SPLcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1$1;->(Ljava/lang/Object;)V +SPLcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1$1;->invoke(Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/TtsVoices$loadVoices$1; +SPLcom/ichi2/anki/TtsVoices$loadVoices$1;->(Lcom/ichi2/anki/TtsVoices;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/TtsVoices$loadVoices$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/TtsVoices$loadVoices$2; +SPLcom/ichi2/anki/TtsVoices$loadVoices$2;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/TtsVoices$loadVoices$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/TtsVoices$loadVoices$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices$loadVoices$2;->invoke(Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices$loadVoices$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/TtsVoices$loadVoicesFromEngines$1; +SPLcom/ichi2/anki/TtsVoices$loadVoicesFromEngines$1;->(Lcom/ichi2/anki/TtsVoices;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/TtsVoices$loadVoicesFromEngines$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/TtsVoicesFieldFilter; SPLcom/ichi2/anki/TtsVoicesFieldFilter;->()V SPLcom/ichi2/anki/TtsVoicesFieldFilter;->()V @@ -8437,32 +9531,62 @@ SPLcom/ichi2/anki/TtsVoicesFieldFilter$Companion;->ensureApplied()V Lcom/ichi2/anki/TtsVoicesKt; SPLcom/ichi2/anki/TtsVoicesKt;->toTtsVoice(Landroid/speech/tts/Voice;Ljava/lang/String;)Lcom/ichi2/anki/AndroidTtsVoice; Lcom/ichi2/anki/WhiteboardMultiTouchMethods; +Lcom/ichi2/anki/analytics/AnalyticsConstants; +SPLcom/ichi2/anki/analytics/AnalyticsConstants;->()V +SPLcom/ichi2/anki/analytics/AnalyticsConstants;->()V +SPLcom/ichi2/anki/analytics/AnalyticsConstants;->getReportablePrefKeys()Ljava/util/Set; +Lcom/ichi2/anki/analytics/AnalyticsExceptionHandler; +SPLcom/ichi2/anki/analytics/AnalyticsExceptionHandler;->()V +SPLcom/ichi2/anki/analytics/AnalyticsExceptionHandler;->(Ljava/lang/Thread$UncaughtExceptionHandler;Lkotlin/jvm/functions/Function2;)V +Lcom/ichi2/anki/analytics/AnalyticsExceptionHandler$Companion; +SPLcom/ichi2/anki/analytics/AnalyticsExceptionHandler$Companion;->()V +SPLcom/ichi2/anki/analytics/AnalyticsExceptionHandler$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/analytics/AnalyticsExceptionHandler$Companion;->install(Lkotlin/jvm/functions/Function2;)V +Lcom/ichi2/anki/analytics/AnalyticsSamplePercentage; +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage;->()V +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage;->access$getUninitialized$cp()I +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage;->constructor-impl(I)I +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage;->isInitialized-impl(I)Z +Lcom/ichi2/anki/analytics/AnalyticsSamplePercentage$Companion; +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage$Companion;->()V +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage$Companion;->getUninitialized--UvX6DQ()I Lcom/ichi2/anki/analytics/AnkiDroidCrashReportDialog; -Lcom/ichi2/anki/analytics/UsageAnalytics; -SPLcom/ichi2/anki/analytics/UsageAnalytics;->$r8$lambda$zAhSKf_JYwU6Jy5QWJJPNKyvXVM(Landroid/content/SharedPreferences;Ljava/lang/String;)V -SPLcom/ichi2/anki/analytics/UsageAnalytics;->()V -SPLcom/ichi2/anki/analytics/UsageAnalytics;->()V -SPLcom/ichi2/anki/analytics/UsageAnalytics;->canGetDefaultUserAgent$AnkiDroid_playNonMinifiedRelease()Z -SPLcom/ichi2/anki/analytics/UsageAnalytics;->getAnalyticsSamplePercentage(Landroid/content/Context;)I -SPLcom/ichi2/anki/analytics/UsageAnalytics;->getAnalyticsTag(Landroid/content/Context;)Ljava/lang/String; -SPLcom/ichi2/anki/analytics/UsageAnalytics;->getOptIn()Z -SPLcom/ichi2/anki/analytics/UsageAnalytics;->initialize$lambda$0(Landroid/content/SharedPreferences;Ljava/lang/String;)V -SPLcom/ichi2/anki/analytics/UsageAnalytics;->initialize(Landroid/content/Context;)Lcom/brsanthu/googleanalytics/GoogleAnalytics; -SPLcom/ichi2/anki/analytics/UsageAnalytics;->initializePrefKeys(Landroid/content/Context;)V -SPLcom/ichi2/anki/analytics/UsageAnalytics;->installDefaultExceptionHandler()V -SPLcom/ichi2/anki/analytics/UsageAnalytics;->sendAnalyticsScreenView(Ljava/lang/Object;)V -SPLcom/ichi2/anki/analytics/UsageAnalytics;->sendAnalyticsScreenView(Ljava/lang/String;)V -SPLcom/ichi2/anki/analytics/UsageAnalytics;->setOptIn(Z)V -SPLcom/ichi2/anki/analytics/UsageAnalytics;->setPreferencesWhoseChangesShouldBeReported(Ljava/util/Set;)V -Lcom/ichi2/anki/analytics/UsageAnalytics$$ExternalSyntheticLambda0; -SPLcom/ichi2/anki/analytics/UsageAnalytics$$ExternalSyntheticLambda0;->()V -Lcom/ichi2/anki/analytics/UsageAnalytics$$ExternalSyntheticLambda1; -SPLcom/ichi2/anki/analytics/UsageAnalytics$$ExternalSyntheticLambda1;->()V -SPLcom/ichi2/anki/analytics/UsageAnalytics$$ExternalSyntheticLambda1;->onSharedPreferenceChanged(Landroid/content/SharedPreferences;Ljava/lang/String;)V -Lcom/ichi2/anki/analytics/UsageAnalytics$AnalyticsLoggingExceptionHandler; -Lcom/ichi2/anki/analytics/UsageAnalytics$AndroidDefaultRequest; -SPLcom/ichi2/anki/analytics/UsageAnalytics$AndroidDefaultRequest;->()V -SPLcom/ichi2/anki/analytics/UsageAnalytics$AndroidDefaultRequest;->setAndroidRequestParameters(Landroid/content/Context;)Lcom/brsanthu/googleanalytics/request/DefaultRequest; +Lcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->()V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->()V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->configure$lambda$0(Lcom/criticalay/GoogleAnalyticsBuilder;)Lkotlin/Unit; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->configure(Landroid/content/Context;)V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->getAnalyticsSamplePercentage(Landroid/content/Context;)I +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->handlePreferences(Landroid/content/Context;)V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->initialize(Landroid/content/Context;)V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->initializePrefKeys(Landroid/content/Context;)V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->sendAnalyticsScreenView(Ljava/lang/String;)V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->sharedPrefsListener$lambda$0(Landroid/content/SharedPreferences;Ljava/lang/String;)V +Lcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda1;->()V +Lcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda2;->()V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda2;->onSharedPreferenceChanged(Landroid/content/SharedPreferences;Ljava/lang/String;)V +Lcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$initialize$1; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$initialize$1;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/analytics/AnkiDroidUsageAnalyticsKt; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalyticsKt;->initializeAnalytics(Landroid/app/Application;)V +Lcom/ichi2/anki/analytics/PreviousAnrReporterKt; +SPLcom/ichi2/anki/analytics/PreviousAnrReporterKt;->launchPreviousAnrReporting(Lcom/ichi2/anki/AnkiDroidApp;)V +SPLcom/ichi2/anki/analytics/PreviousAnrReporterKt;->reportPreviousAnr(Lcom/ichi2/anki/AnkiDroidApp;)V +Lcom/ichi2/anki/analytics/PreviousAnrReporterKt$launchPreviousAnrReporting$1; +SPLcom/ichi2/anki/analytics/PreviousAnrReporterKt$launchPreviousAnrReporting$1;->(Lcom/ichi2/anki/AnkiDroidApp;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/analytics/PreviousAnrReporterKt$launchPreviousAnrReporting$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/analytics/PreviousAnrReporterKt$launchPreviousAnrReporting$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/analytics/SharedPreferencesAnrReportState; +SPLcom/ichi2/anki/analytics/SharedPreferencesAnrReportState;->()V +SPLcom/ichi2/anki/analytics/SharedPreferencesAnrReportState;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/analytics/SharedPreferencesAnrReportState;->getLastProcessedTimestamp()J +SPLcom/ichi2/anki/analytics/SharedPreferencesAnrReportState;->getPreferences()Landroid/content/SharedPreferences; Lcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt; SPLcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt;->$r8$lambda$sbRJqOl07LNxTzNXor0XAVnGA1Q(Lcom/ichi2/anki/AnkiActivity;Lcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt$exitViaDoubleTapBackCallback$1;Landroid/content/SharedPreferences;Ljava/lang/String;)V SPLcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt;->exitViaDoubleTapBackCallback$lambda$0$0(Lcom/ichi2/anki/AnkiActivity;Lcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt$exitViaDoubleTapBackCallback$1;Landroid/content/SharedPreferences;Ljava/lang/String;)V @@ -8475,15 +9599,46 @@ SPLcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt$exitViaDo SPLcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt$exitViaDoubleTapBackCallback$1;->getStrongListenerReference()Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener; SPLcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt$exitViaDoubleTapBackCallback$1;->setStrongListenerReference(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V Lcom/ichi2/anki/android/input/ShortcutGroupProvider; -Lcom/ichi2/anki/backend/BackendDBUtilsKt; -SPLcom/ichi2/anki/backend/BackendDBUtilsKt;->createDatabaseUsingRustBackend(Lnet/ankiweb/rsdroid/Backend;)Lcom/ichi2/anki/libanki/DB; +Lcom/ichi2/anki/android/view/ViewLocation; +SPLcom/ichi2/anki/android/view/ViewLocation;->constructor-impl([I)[I +SPLcom/ichi2/anki/android/view/ViewLocation;->getY-impl([I)I +Lcom/ichi2/anki/android/view/ViewLocationKt; +SPLcom/ichi2/anki/android/view/ViewLocationKt;->locationInWindow$default(Landroid/view/View;[IILjava/lang/Object;)[I +SPLcom/ichi2/anki/android/view/ViewLocationKt;->locationInWindow(Landroid/view/View;[I)[I +SPLcom/ichi2/anki/android/view/ViewLocationKt;->locationOnScreen(Landroid/view/View;[I)[I +Lcom/ichi2/anki/ankicommon/R$string; +Lcom/ichi2/anki/backend/AnkiBackendLanguage; +SPLcom/ichi2/anki/backend/AnkiBackendLanguage;->()V +SPLcom/ichi2/anki/backend/AnkiBackendLanguage;->access$constructor-impl(Ljava/lang/String;)Ljava/lang/String; +SPLcom/ichi2/anki/backend/AnkiBackendLanguage;->access$getLANGUAGE_IDENTIFIER$cp()Lkotlin/text/Regex; +SPLcom/ichi2/anki/backend/AnkiBackendLanguage;->constructor-impl(Ljava/lang/String;)Ljava/lang/String; +Lcom/ichi2/anki/backend/AnkiBackendLanguage$Companion; +SPLcom/ichi2/anki/backend/AnkiBackendLanguage$Companion;->()V +SPLcom/ichi2/anki/backend/AnkiBackendLanguage$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/backend/AnkiBackendLanguage$Companion;->fromIdentifier-hHuSVNI(Ljava/lang/String;)Ljava/lang/String; +SPLcom/ichi2/anki/backend/AnkiBackendLanguage$Companion;->fromLanguageTag-hHuSVNI(Ljava/lang/String;)Ljava/lang/String; +Lcom/ichi2/anki/backend/BackendDatabaseKt; +SPLcom/ichi2/anki/backend/BackendDatabaseKt;->createDatabaseUsingRustBackend(Lnet/ankiweb/rsdroid/Backend;)Lcom/ichi2/anki/libanki/DB; +Lcom/ichi2/anki/backend/BackendLocales; +SPLcom/ichi2/anki/backend/BackendLocales;->()V +SPLcom/ichi2/anki/backend/BackendLocales;->(Ljava/util/List;)V +SPLcom/ichi2/anki/backend/BackendLocales;->getAll()Ljava/util/List; +Lcom/ichi2/anki/backend/BackendLocalesKt; +SPLcom/ichi2/anki/backend/BackendLocalesKt;->getLocales(Lnet/ankiweb/rsdroid/Backend;)Lcom/ichi2/anki/backend/BackendLocales; +Lcom/ichi2/anki/browser/BrowserDestinationKt; +SPLcom/ichi2/anki/browser/BrowserDestinationKt;->toIntent(Lcom/ichi2/anki/common/destinations/BrowserDestination;Landroid/content/Context;)Landroid/content/Intent; Lcom/ichi2/anki/browser/CardBrowserColumn; SPLcom/ichi2/anki/browser/CardBrowserColumn;->$values()[Lcom/ichi2/anki/browser/CardBrowserColumn; SPLcom/ichi2/anki/browser/CardBrowserColumn;->()V -SPLcom/ichi2/anki/browser/CardBrowserColumn;->(Ljava/lang/String;ILjava/lang/String;)V +SPLcom/ichi2/anki/browser/CardBrowserColumn;->(Ljava/lang/String;ILjava/lang/String;Lcom/ichi2/anki/browser/ColumnType;Lcom/ichi2/anki/browser/ColumnType;)V +SPLcom/ichi2/anki/browser/CardBrowserColumn;->(Ljava/lang/String;ILjava/lang/String;Lcom/ichi2/anki/browser/ColumnType;Lcom/ichi2/anki/browser/ColumnType;ILkotlin/jvm/internal/DefaultConstructorMarker;)V Lcom/ichi2/anki/browser/CardBrowserColumn$Companion; SPLcom/ichi2/anki/browser/CardBrowserColumn$Companion;->()V SPLcom/ichi2/anki/browser/CardBrowserColumn$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/browser/ColumnType; +SPLcom/ichi2/anki/browser/ColumnType;->$values()[Lcom/ichi2/anki/browser/ColumnType; +SPLcom/ichi2/anki/browser/ColumnType;->()V +SPLcom/ichi2/anki/browser/ColumnType;->(Ljava/lang/String;I)V Lcom/ichi2/anki/browser/LastDeckIdRepository; Lcom/ichi2/anki/browser/SharedPreferencesLastDeckIdRepository; SPLcom/ichi2/anki/browser/SharedPreferencesLastDeckIdRepository;->()V @@ -8500,14 +9655,183 @@ SPLcom/ichi2/anki/cardviewer/MediaErrorHandler$Companion;->()V SPLcom/ichi2/anki/cardviewer/MediaErrorHandler$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lcom/ichi2/anki/cardviewer/MediaErrorListener; Lcom/ichi2/anki/cardviewer/ViewerCommand$CommandProcessor; +Lcom/ichi2/anki/common/analytics/Analytics; +SPLcom/ichi2/anki/common/analytics/Analytics;->()V +SPLcom/ichi2/anki/common/analytics/Analytics;->()V +SPLcom/ichi2/anki/common/analytics/Analytics;->sendAnalyticsScreenView(Ljava/lang/String;)V +SPLcom/ichi2/anki/common/analytics/Analytics;->setAnalytics(Lcom/ichi2/anki/common/analytics/UsageAnalytics;)V +Lcom/ichi2/anki/common/analytics/Analytics$Unregistered; +SPLcom/ichi2/anki/common/analytics/Analytics$Unregistered;->()V +SPLcom/ichi2/anki/common/analytics/Analytics$Unregistered;->()V +Lcom/ichi2/anki/common/analytics/UsageAnalytics; +SPLcom/ichi2/anki/common/analytics/UsageAnalytics;->()V +Lcom/ichi2/anki/common/analytics/UsageAnalytics$Companion; +SPLcom/ichi2/anki/common/analytics/UsageAnalytics$Companion;->()V +SPLcom/ichi2/anki/common/analytics/UsageAnalytics$Companion;->()V +Lcom/ichi2/anki/common/android/AdaptionUtil; +SPLcom/ichi2/anki/common/android/AdaptionUtil;->()V +SPLcom/ichi2/anki/common/android/AdaptionUtil;->()V +SPLcom/ichi2/anki/common/android/AdaptionUtil;->isRunningUnderFirebaseTestLab()Z +SPLcom/ichi2/anki/common/android/AdaptionUtil;->isRunningUnderFirebaseTestLab(Landroid/content/ContentResolver;)Z +SPLcom/ichi2/anki/common/android/AdaptionUtil;->isUserATestClient()Z +Lcom/ichi2/anki/common/android/AdaptionUtil$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/common/android/AdaptionUtil$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/common/android/AdaptionUtil$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/common/android/AdaptionUtil$$ExternalSyntheticLambda1;->()V +Lcom/ichi2/anki/common/android/AlarmManagement; +SPLcom/ichi2/anki/common/android/AlarmManagement;->()V +SPLcom/ichi2/anki/common/android/AlarmManagement;->()V +SPLcom/ichi2/anki/common/android/AlarmManagement;->getWINDOW_LENGTH_MS()J +SPLcom/ichi2/anki/common/android/AlarmManagement;->useAlarmManager$default(Lcom/ichi2/anki/common/android/AlarmManagement;Landroid/content/Context;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +SPLcom/ichi2/anki/common/android/AlarmManagement;->useAlarmManager(Landroid/content/Context;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/anki/common/android/AlarmManagement$useAlarmManager$1; +SPLcom/ichi2/anki/common/android/AlarmManagement$useAlarmManager$1;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/common/android/Animations; +SPLcom/ichi2/anki/common/android/Animations;->()V +SPLcom/ichi2/anki/common/android/Animations;->()V +SPLcom/ichi2/anki/common/android/Animations;->areAnimationsEnabled(Landroid/content/Context;)Z +SPLcom/ichi2/anki/common/android/Animations;->areSystemAnimationsEnabled(Landroid/content/Context;)Z +SPLcom/ichi2/anki/common/android/Animations;->setPreferencesProvider(Landroid/app/Application;Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/anki/common/android/AnimationsKt; +SPLcom/ichi2/anki/common/android/AnimationsKt;->animationDisabled(Landroidx/fragment/app/FragmentActivity;)Z +SPLcom/ichi2/anki/common/android/AnimationsKt;->animationEnabled(Landroidx/fragment/app/FragmentActivity;)Z +Lcom/ichi2/anki/common/android/AnkiBroadcastReceiver; +SPLcom/ichi2/anki/common/android/AnkiBroadcastReceiver;->()V +SPLcom/ichi2/anki/common/android/AnkiBroadcastReceiver;->()V +SPLcom/ichi2/anki/common/android/AnkiBroadcastReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V +Lcom/ichi2/anki/common/android/AppLocaleKt; +SPLcom/ichi2/anki/common/android/AppLocaleKt;->getCurrentLocaleTag()Ljava/lang/String; +SPLcom/ichi2/anki/common/android/AppLocaleKt;->withAppLocale(Landroid/content/Context;)Landroid/content/Context; +Lcom/ichi2/anki/common/android/ApplicationContextInitializer; +SPLcom/ichi2/anki/common/android/ApplicationContextInitializer;->()V +SPLcom/ichi2/anki/common/android/ApplicationContextInitializer;->()V +SPLcom/ichi2/anki/common/android/ApplicationContextInitializer;->getInstanceOrNull()Landroid/content/Context; +SPLcom/ichi2/anki/common/android/ApplicationContextInitializer;->setInstance(Landroid/app/Application;)V +Lcom/ichi2/anki/common/android/ApplicationContextInitializerKt; +SPLcom/ichi2/anki/common/android/ApplicationContextInitializerKt;->access$getAppContext$p()Landroid/content/Context; +SPLcom/ichi2/anki/common/android/ApplicationContextInitializerKt;->access$setAppContext$p(Landroid/content/Context;)V +SPLcom/ichi2/anki/common/android/ApplicationContextInitializerKt;->getAppContext()Landroid/content/Context; +Lcom/ichi2/anki/common/android/R$attr; +Lcom/ichi2/anki/common/android/R$color; +Lcom/ichi2/anki/common/android/R$drawable; +Lcom/ichi2/anki/common/android/R$string; +Lcom/ichi2/anki/common/android/R$style; +Lcom/ichi2/anki/common/android/themes/XiaomiKt; +SPLcom/ichi2/anki/common/android/themes/XiaomiKt;->disableXiaomiForceDarkMode(Landroid/content/Context;)V +Lcom/ichi2/anki/common/coroutines/ApplicationScopeKt; +SPLcom/ichi2/anki/common/coroutines/ApplicationScopeKt;->()V +SPLcom/ichi2/anki/common/coroutines/ApplicationScopeKt;->applicationScope_delegate$lambda$0()Lkotlinx/coroutines/CoroutineScope; +SPLcom/ichi2/anki/common/coroutines/ApplicationScopeKt;->getApplicationScope()Lkotlinx/coroutines/CoroutineScope; +Lcom/ichi2/anki/common/coroutines/ApplicationScopeKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/common/coroutines/ApplicationScopeKt$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/common/coroutines/ApplicationScopeKt$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/common/crashreporting/CrashReportService; +SPLcom/ichi2/anki/common/crashreporting/CrashReportService;->()V +SPLcom/ichi2/anki/common/crashreporting/CrashReportService;->()V +SPLcom/ichi2/anki/common/crashreporting/CrashReportService;->isEnabled(Landroid/content/Context;Z)Z +SPLcom/ichi2/anki/common/crashreporting/CrashReportService;->setReporter(Lcom/ichi2/anki/common/crashreporting/CrashReporter;)V +Lcom/ichi2/anki/common/crashreporting/CrashReportServiceKt; +SPLcom/ichi2/anki/common/crashreporting/CrashReportServiceKt;->runCatchingWithReport(Ljava/lang/String;ZLkotlin/jvm/functions/Function0;)Ljava/lang/Object; +Lcom/ichi2/anki/common/crashreporting/CrashReporter; +Lcom/ichi2/anki/common/crashreporting/UninitializedCrashReporter; +SPLcom/ichi2/anki/common/crashreporting/UninitializedCrashReporter;->()V +SPLcom/ichi2/anki/common/crashreporting/UninitializedCrashReporter;->()V +Lcom/ichi2/anki/common/destinations/BrowserDestination; +SPLcom/ichi2/anki/common/destinations/BrowserDestination;->()V +SPLcom/ichi2/anki/common/destinations/BrowserDestination;->()V +SPLcom/ichi2/anki/common/destinations/BrowserDestination;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/common/destinations/BrowserDestination$Open; +SPLcom/ichi2/anki/common/destinations/BrowserDestination$Open;->()V +SPLcom/ichi2/anki/common/destinations/BrowserDestination$Open;->()V +Lcom/ichi2/anki/common/destinations/CardInfoDestination; +Lcom/ichi2/anki/common/destinations/DeferredNavigation; +SPLcom/ichi2/anki/common/destinations/DeferredNavigation;->()V +Lcom/ichi2/anki/common/destinations/DeferredNavigation$Companion; +SPLcom/ichi2/anki/common/destinations/DeferredNavigation$Companion;->()V +SPLcom/ichi2/anki/common/destinations/DeferredNavigation$Companion;->()V +Lcom/ichi2/anki/common/destinations/Destination; +SPLcom/ichi2/anki/common/destinations/Destination;->()V +SPLcom/ichi2/anki/common/destinations/Destination;->()V +SPLcom/ichi2/anki/common/destinations/Destination;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/common/destinations/Navigator; +SPLcom/ichi2/anki/common/destinations/Navigator;->()V +Lcom/ichi2/anki/common/destinations/Navigator$Companion; +SPLcom/ichi2/anki/common/destinations/Navigator$Companion;->()V +SPLcom/ichi2/anki/common/destinations/Navigator$Companion;->()V +SPLcom/ichi2/anki/common/destinations/Navigator$Companion;->register(Lcom/ichi2/anki/common/destinations/Navigator;)V +Lcom/ichi2/anki/common/destinations/NavigatorKt; +SPLcom/ichi2/anki/common/destinations/NavigatorKt;->access$setNavigatorInstance$p(Lcom/ichi2/anki/common/destinations/Navigator;)V +SPLcom/ichi2/anki/common/destinations/NavigatorKt;->toIntent(Lcom/ichi2/anki/common/destinations/DeferredNavigation;Lcom/ichi2/anki/common/destinations/Destination;)Landroid/content/Intent; +Lcom/ichi2/anki/common/destinations/NoteEditorDestination; +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination;->()V +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination;->()V +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/common/destinations/NoteEditorDestination$AddNote; +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination$AddNote;->()V +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination$AddNote;->(Ljava/lang/Long;)V +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination$AddNote;->(Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination$AddNote;->getDeckId()Ljava/lang/Long; +Lcom/ichi2/anki/common/json/JSONContainerKt; +SPLcom/ichi2/anki/common/json/JSONContainerKt;->jsonArray(Lcom/ichi2/anki/common/json/JSONObjectHolder;Ljava/lang/String;)Lcom/ichi2/anki/common/json/JsonArrayDelegate; +SPLcom/ichi2/anki/common/json/JSONContainerKt;->jsonBoolean(Lcom/ichi2/anki/common/json/JSONObjectHolder;Ljava/lang/String;)Lcom/ichi2/anki/common/json/JsonBooleanDelegate; +SPLcom/ichi2/anki/common/json/JSONContainerKt;->jsonBoolean(Lcom/ichi2/anki/common/json/JSONObjectHolder;Ljava/lang/String;Z)Lcom/ichi2/anki/common/json/JsonBooleanDelegate; +SPLcom/ichi2/anki/common/json/JSONContainerKt;->jsonLong(Lcom/ichi2/anki/common/json/JSONObjectHolder;Ljava/lang/String;)Lcom/ichi2/anki/common/json/JsonLongDelegate; +SPLcom/ichi2/anki/common/json/JSONContainerKt;->jsonString(Lcom/ichi2/anki/common/json/JSONObjectHolder;Ljava/lang/String;)Lcom/ichi2/anki/common/json/JsonStringDelegate; +SPLcom/ichi2/anki/common/json/JSONContainerKt;->jsonString(Lcom/ichi2/anki/common/json/JSONObjectHolder;Ljava/lang/String;Ljava/lang/String;)Lcom/ichi2/anki/common/json/JsonStringDelegate; +Lcom/ichi2/anki/common/json/JSONObjectHolder; +Lcom/ichi2/anki/common/json/JsonArrayDelegate; +SPLcom/ichi2/anki/common/json/JsonArrayDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;)V +Lcom/ichi2/anki/common/json/JsonBooleanDelegate; +SPLcom/ichi2/anki/common/json/JsonBooleanDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;Ljava/lang/Boolean;)V +SPLcom/ichi2/anki/common/json/JsonBooleanDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/common/json/JsonLongDelegate; +SPLcom/ichi2/anki/common/json/JsonLongDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;Ljava/lang/Long;)V +SPLcom/ichi2/anki/common/json/JsonLongDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/common/json/JsonLongDelegate;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)J +Lcom/ichi2/anki/common/json/JsonStringDelegate; +SPLcom/ichi2/anki/common/json/JsonStringDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;Ljava/lang/String;)V +SPLcom/ichi2/anki/common/json/JsonStringDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/common/permissions/PermissionsKt; +SPLcom/ichi2/anki/common/permissions/PermissionsKt;->hasAllPermissions(Landroid/content/Context;Ljava/util/Collection;)Z +SPLcom/ichi2/anki/common/permissions/PermissionsKt;->hasPermission(Landroid/content/Context;Ljava/lang/String;)Z +Lcom/ichi2/anki/common/permissions/StoragePermissionsKt; +SPLcom/ichi2/anki/common/permissions/StoragePermissionsKt;->hasLegacyStorageAccessPermission(Landroid/content/Context;)Z +SPLcom/ichi2/anki/common/permissions/StoragePermissionsKt;->hasStorageReadAccessPermission(Landroid/content/Context;)Z +Lcom/ichi2/anki/common/preferences/AnimationPreferences; +Lcom/ichi2/anki/common/preferences/NotificationPreferences; +Lcom/ichi2/anki/common/preferences/SharedPreferencesTestHook; +SPLcom/ichi2/anki/common/preferences/SharedPreferencesTestHook;->()V +SPLcom/ichi2/anki/common/preferences/SharedPreferencesTestHook;->()V +SPLcom/ichi2/anki/common/preferences/SharedPreferencesTestHook;->getOverride()Lkotlin/jvm/functions/Function1; +Lcom/ichi2/anki/common/preferences/SharedPrefsKt; +SPLcom/ichi2/anki/common/preferences/SharedPrefsKt;->sharedPrefs(Landroid/content/Context;)Landroid/content/SharedPreferences; +Lcom/ichi2/anki/common/storage/CollectionHelper; +SPLcom/ichi2/anki/common/storage/CollectionHelper;->()V +SPLcom/ichi2/anki/common/storage/CollectionHelper;->()V +SPLcom/ichi2/anki/common/storage/CollectionHelper;->getAppSpecificExternalDirectories(Landroid/content/Context;)Ljava/util/List; +SPLcom/ichi2/anki/common/storage/CollectionHelper;->getAppSpecificInternalAnkiDroidDirectory(Landroid/content/Context;)Ljava/lang/String; +SPLcom/ichi2/anki/common/storage/CollectionHelper;->getCurrentAnkiDroidDirectory(Landroid/content/Context;)Ljava/io/File; +SPLcom/ichi2/anki/common/storage/CollectionHelper;->getCurrentAnkiDroidDirectory(Landroid/content/SharedPreferences;)Ljava/io/File; +SPLcom/ichi2/anki/common/storage/CollectionHelper;->getStorageDecisionTestOverride()Lcom/ichi2/anki/common/storage/StorageDecision; +SPLcom/ichi2/anki/common/storage/CollectionHelper;->initializeAnkiDroidDirectory(Ljava/io/File;)V +SPLcom/ichi2/anki/common/storage/CollectionHelper;->storageDecision(Landroid/content/SharedPreferences;)Lcom/ichi2/anki/common/storage/StorageDecision; +Lcom/ichi2/anki/common/storage/LegacyStorageKt; +SPLcom/ichi2/anki/common/storage/LegacyStorageKt;->grantedStoragePermissions(Landroid/content/Context;)Z +SPLcom/ichi2/anki/common/storage/LegacyStorageKt;->grantedStoragePermissions(Landroid/content/Context;Z)Z +SPLcom/ichi2/anki/common/storage/LegacyStorageKt;->isLegacyStorage(Landroid/content/Context;)Z +SPLcom/ichi2/anki/common/storage/LegacyStorageKt;->isLegacyStorage(Landroid/content/Context;Z)Ljava/lang/Boolean; +SPLcom/ichi2/anki/common/storage/LegacyStorageKt;->isLegacyStorage(Ljava/io/File;Landroid/content/Context;)Z +Lcom/ichi2/anki/common/storage/StorageDecision; +Lcom/ichi2/anki/common/storage/StorageDecision$Decided; +SPLcom/ichi2/anki/common/storage/StorageDecision$Decided;->()V +SPLcom/ichi2/anki/common/storage/StorageDecision$Decided;->()V +SPLcom/ichi2/anki/common/storage/StorageDecision$Decided;->equals(Ljava/lang/Object;)Z Lcom/ichi2/anki/common/time/SystemTime; SPLcom/ichi2/anki/common/time/SystemTime;->()V SPLcom/ichi2/anki/common/time/SystemTime;->intTimeMS()J Lcom/ichi2/anki/common/time/Time; SPLcom/ichi2/anki/common/time/Time;->()V SPLcom/ichi2/anki/common/time/Time;->()V -SPLcom/ichi2/anki/common/time/Time;->calendar()Ljava/util/Calendar; -SPLcom/ichi2/anki/common/time/Time;->getCurrentDate()Ljava/util/Date; SPLcom/ichi2/anki/common/time/Time;->intTime()J Lcom/ichi2/anki/common/time/Time$Companion; SPLcom/ichi2/anki/common/time/Time$Companion;->()V @@ -8516,19 +9840,146 @@ Lcom/ichi2/anki/common/time/TimeManager; SPLcom/ichi2/anki/common/time/TimeManager;->()V SPLcom/ichi2/anki/common/time/TimeManager;->()V SPLcom/ichi2/anki/common/time/TimeManager;->getTime()Lcom/ichi2/anki/common/time/Time; -Lcom/ichi2/anki/common/time/TimeUtilsKt; -SPLcom/ichi2/anki/common/time/TimeUtilsKt;->getDayStart(Lcom/ichi2/anki/common/time/Time;)J +Lcom/ichi2/anki/common/ui/TransitionDirection; +SPLcom/ichi2/anki/common/ui/TransitionDirection;->$values()[Lcom/ichi2/anki/common/ui/TransitionDirection; +SPLcom/ichi2/anki/common/ui/TransitionDirection;->()V +SPLcom/ichi2/anki/common/ui/TransitionDirection;->(Ljava/lang/String;I)V +SPLcom/ichi2/anki/common/ui/TransitionDirection;->values()[Lcom/ichi2/anki/common/ui/TransitionDirection; +Lcom/ichi2/anki/common/ui/TransitionDirection$Creator; +SPLcom/ichi2/anki/common/ui/TransitionDirection$Creator;->()V +Lcom/ichi2/anki/common/utils/ConfigProperty; +SPLcom/ichi2/anki/common/utils/ConfigProperty;->()V +SPLcom/ichi2/anki/common/utils/ConfigProperty;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V +SPLcom/ichi2/anki/common/utils/ConfigProperty;->getValue(Lcom/ichi2/anki/libanki/Config;Lkotlin/reflect/KProperty;)Ljava/lang/Object; +SPLcom/ichi2/anki/common/utils/ConfigProperty;->mapped$lambda$0(Lkotlin/jvm/functions/Function1;Lcom/ichi2/anki/common/utils/ConfigProperty;Lcom/ichi2/anki/libanki/Config;)Ljava/lang/Object; +SPLcom/ichi2/anki/common/utils/ConfigProperty;->mapped(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/ichi2/anki/common/utils/ConfigProperty; +Lcom/ichi2/anki/common/utils/ConfigProperty$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/common/utils/ConfigProperty$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;Lcom/ichi2/anki/common/utils/ConfigProperty;)V +SPLcom/ichi2/anki/common/utils/ConfigProperty$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/common/utils/ConfigProperty$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/common/utils/ConfigProperty$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/common/utils/ConfigProperty;Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/anki/common/utils/ConfigPropertyKt; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt;->configProperty(Lanki/config/ConfigKey$Bool;)Lcom/ichi2/anki/common/utils/ConfigProperty; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt;->configProperty(Lanki/config/ConfigKey$String;)Lcom/ichi2/anki/common/utils/ConfigProperty; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt;->orDefault$lambda$0(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt;->orDefault(Lcom/ichi2/anki/common/utils/ConfigProperty;Ljava/lang/Object;)Lcom/ichi2/anki/common/utils/ConfigProperty; +Lcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda0;->(Ljava/lang/Object;)V +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda1;->()V +Lcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda2;->(Lanki/config/ConfigKey$String;)V +Lcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda3;->(Lanki/config/ConfigKey$String;)V +Lcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda4;->(Lanki/config/ConfigKey$Bool;)V +Lcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda5; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda5;->(Lanki/config/ConfigKey$Bool;)V +Lcom/ichi2/anki/common/utils/Dp; +SPLcom/ichi2/anki/common/utils/Dp;->constructor-impl(F)F +SPLcom/ichi2/anki/common/utils/Dp;->toPx-impl(FLandroid/content/Context;)I +Lcom/ichi2/anki/common/utils/DpKt; +SPLcom/ichi2/anki/common/utils/DpKt;->access$dpToPx(FLandroid/content/Context;)I +SPLcom/ichi2/anki/common/utils/DpKt;->dpToPx(FLandroid/content/Context;)I +SPLcom/ichi2/anki/common/utils/DpKt;->getDp(I)F +Lcom/ichi2/anki/common/utils/android/HandlerUtils; +SPLcom/ichi2/anki/common/utils/android/HandlerUtils;->()V +SPLcom/ichi2/anki/common/utils/android/HandlerUtils;->()V +SPLcom/ichi2/anki/common/utils/android/HandlerUtils;->getDefaultLooper()Landroid/os/Looper; Lcom/ichi2/anki/common/utils/android/TestUtilsKt; +SPLcom/ichi2/anki/common/utils/android/TestUtilsKt;->()V +SPLcom/ichi2/anki/common/utils/android/TestUtilsKt;->isInstrumentationTest()Z SPLcom/ichi2/anki/common/utils/android/TestUtilsKt;->isRobolectric()Z +Lcom/ichi2/anki/common/utils/android/ThemeUtilsKt; +SPLcom/ichi2/anki/common/utils/android/ThemeUtilsKt;->systemIsInNightMode(Landroid/content/Context;)Z +Lcom/ichi2/anki/common/utils/android/Threads; +SPLcom/ichi2/anki/common/utils/android/Threads;->()V +SPLcom/ichi2/anki/common/utils/android/Threads;->()V +SPLcom/ichi2/anki/common/utils/android/Threads;->isOnMainThread()Z +Lcom/ichi2/anki/common/utils/ext/ConfigKt; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt;->()V +SPLcom/ichi2/anki/common/utils/ext/ConfigKt;->getFsrsEnabled(Lcom/ichi2/anki/libanki/Config;)Ljava/lang/Boolean; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt;->getSchedulerVersion(Lcom/ichi2/anki/libanki/Config;)J +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda1;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda2;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda3;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda4;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda5; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda5;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda6; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda6;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda7; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda7;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$1; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$1;->(Ljava/lang/String;Ljava/lang/Object;)V +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$1;->invoke(Lcom/ichi2/anki/libanki/Config;)Ljava/lang/Object; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$2; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$2;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$1; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$1;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$10; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$10;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$11; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$11;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$12; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$12;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$13; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$13;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$14; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$14;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$15; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$15;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$16; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$16;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$17; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$17;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$18; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$18;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$19; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$19;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$2; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$2;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$20; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$20;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$3; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$3;->(Ljava/lang/String;Ljava/lang/Object;)V +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$3;->invoke(Lcom/ichi2/anki/libanki/Config;)Ljava/lang/Object; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$4; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$4;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$5; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$5;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$6; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$6;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$7; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$7;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$8; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$8;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$9; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$9;->(Ljava/lang/String;Ljava/lang/Object;)V Lcom/ichi2/anki/common/utils/ext/JSONArrayKt; -SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt;->deepClone(Lorg/json/JSONArray;)Lorg/json/JSONArray; -Lcom/ichi2/anki/common/utils/ext/JSONObjectKt; -SPLcom/ichi2/anki/common/utils/ext/JSONObjectKt;->deepClonedInto(Lorg/json/JSONObject;Lorg/json/JSONObject;)Lorg/json/JSONObject; +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt;->stringIterable(Lorg/json/JSONArray;)Ljava/lang/Iterable; +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt;->stringIterator(Lorg/json/JSONArray;)Ljava/util/Iterator; +Lcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterable$$inlined$Iterable$1; +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterable$$inlined$Iterable$1;->(Lorg/json/JSONArray;)V +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterable$$inlined$Iterable$1;->iterator()Ljava/util/Iterator; +Lcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterator$1; +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterator$1;->(Lorg/json/JSONArray;)V +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterator$1;->hasNext()Z +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterator$1;->next()Ljava/lang/Object; +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterator$1;->next()Ljava/lang/String; Lcom/ichi2/anki/compat/BaseCompat; SPLcom/ichi2/anki/compat/BaseCompat;->()V Lcom/ichi2/anki/compat/Compat; Lcom/ichi2/anki/compat/CompatHelper; -SPLcom/ichi2/anki/compat/CompatHelper;->$r8$lambda$rBMX6dDRkhYSInWuODlGN2hVjio()Lcom/ichi2/anki/compat/CompatHelper; SPLcom/ichi2/anki/compat/CompatHelper;->()V SPLcom/ichi2/anki/compat/CompatHelper;->()V SPLcom/ichi2/anki/compat/CompatHelper;->access$getCompatValue$p(Lcom/ichi2/anki/compat/CompatHelper;)Lcom/ichi2/anki/compat/Compat; @@ -8550,15 +10001,19 @@ SPLcom/ichi2/anki/compat/CompatHelper$Companion;->registerReceiverCompat(Landroi SPLcom/ichi2/anki/compat/CompatHelper$Companion;->resolveActivityCompat(Landroid/content/pm/PackageManager;Landroid/content/Intent;Lcom/ichi2/anki/compat/ResolveInfoFlagsCompat;)Landroid/content/pm/ResolveInfo; SPLcom/ichi2/anki/compat/CompatHelper$Companion;->resolveServiceCompat(Landroid/content/pm/PackageManager;Landroid/content/Intent;Lcom/ichi2/anki/compat/ResolveInfoFlagsCompat;)Landroid/content/pm/ResolveInfo; Lcom/ichi2/anki/compat/CompatHelperKt; +SPLcom/ichi2/anki/compat/CompatHelperKt;->setDstOutBlendCompat(Landroid/graphics/Paint;)V SPLcom/ichi2/anki/compat/CompatHelperKt;->setTooltipTextCompat(Landroid/view/View;Ljava/lang/CharSequence;)V Lcom/ichi2/anki/compat/CompatV26; SPLcom/ichi2/anki/compat/CompatV26;->()V Lcom/ichi2/anki/compat/CompatV29; SPLcom/ichi2/anki/compat/CompatV29;->()V SPLcom/ichi2/anki/compat/CompatV29;->()V +SPLcom/ichi2/anki/compat/CompatV29;->setDstOutBlend(Landroid/graphics/Paint;)V Lcom/ichi2/anki/compat/CompatV29$Companion; SPLcom/ichi2/anki/compat/CompatV29$Companion;->()V SPLcom/ichi2/anki/compat/CompatV29$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/compat/CompatV30; +SPLcom/ichi2/anki/compat/CompatV30;->()V Lcom/ichi2/anki/compat/CompatV31; SPLcom/ichi2/anki/compat/CompatV31;->()V Lcom/ichi2/anki/compat/CompatV33; @@ -8607,31 +10062,62 @@ SPLcom/ichi2/anki/contextmenu/CardBrowserContextMenu$Companion;->()V SPLcom/ichi2/anki/contextmenu/CardBrowserContextMenu$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLcom/ichi2/anki/contextmenu/CardBrowserContextMenu$Companion;->ensureConsistentStateWithPreferenceStatus(Landroid/content/Context;Z)V Lcom/ichi2/anki/contextmenu/SystemContextMenu; +SPLcom/ichi2/anki/contextmenu/SystemContextMenu;->()V SPLcom/ichi2/anki/contextmenu/SystemContextMenu;->(Landroid/content/Context;)V SPLcom/ichi2/anki/contextmenu/SystemContextMenu;->ensureConsistentStateWithPreferenceStatus(Z)V SPLcom/ichi2/anki/contextmenu/SystemContextMenu;->getComponentName()Landroid/content/ComponentName; SPLcom/ichi2/anki/contextmenu/SystemContextMenu;->getPackageManager()Landroid/content/pm/PackageManager; SPLcom/ichi2/anki/contextmenu/SystemContextMenu;->getSystemMenuStatus()Ljava/lang/Boolean; Lcom/ichi2/anki/databinding/ActivityHomescreenBinding; -SPLcom/ichi2/anki/databinding/ActivityHomescreenBinding;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/ichi2/anki/databinding/IncludeDeckPickerBinding;Landroid/widget/LinearLayout;Lcom/ichi2/anki/ui/ResizingDivider;Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroidx/fragment/app/FragmentContainerView;)V +SPLcom/ichi2/anki/databinding/ActivityHomescreenBinding;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroidx/fragment/app/FragmentContainerView;Lcom/google/android/material/bottomnavigation/BottomNavigationView;Landroid/widget/LinearLayout;Lcom/ichi2/anki/databinding/IncludeDeckPickerBinding;Lcom/ichi2/anki/ui/ResizablePaneLayout;Lcom/ichi2/anki/ui/ResizingDivider;Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroidx/fragment/app/FragmentContainerView;Landroid/widget/FrameLayout;)V SPLcom/ichi2/anki/databinding/ActivityHomescreenBinding;->bind(Landroid/view/View;)Lcom/ichi2/anki/databinding/ActivityHomescreenBinding; SPLcom/ichi2/anki/databinding/ActivityHomescreenBinding;->getRoot()Landroid/view/View; SPLcom/ichi2/anki/databinding/ActivityHomescreenBinding;->getRoot()Landroidx/coordinatorlayout/widget/CoordinatorLayout; SPLcom/ichi2/anki/databinding/ActivityHomescreenBinding;->inflate(Landroid/view/LayoutInflater;)Lcom/ichi2/anki/databinding/ActivityHomescreenBinding; SPLcom/ichi2/anki/databinding/ActivityHomescreenBinding;->inflate(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Z)Lcom/ichi2/anki/databinding/ActivityHomescreenBinding; Lcom/ichi2/anki/databinding/FragmentIntroductionBinding; -SPLcom/ichi2/anki/databinding/FragmentIntroductionBinding;->(Landroid/view/View;Landroid/widget/ImageView;Landroidx/constraintlayout/widget/Barrier;Landroid/widget/LinearLayout;Lcom/google/android/material/button/MaterialButton;Lcom/ichi2/ui/FixedTextView;Lcom/ichi2/ui/FixedTextView;Lcom/ichi2/ui/FixedTextView;Lcom/google/android/material/button/MaterialButton;Landroid/view/View;Landroid/widget/ImageView;)V +SPLcom/ichi2/anki/databinding/FragmentIntroductionBinding;->(Landroid/view/View;Landroid/widget/ImageView;Landroidx/constraintlayout/widget/Barrier;Landroid/widget/LinearLayout;Lcom/google/android/material/button/MaterialButton;Landroidx/constraintlayout/widget/ConstraintLayout;Lcom/ichi2/ui/FixedTextView;Lcom/ichi2/ui/FixedTextView;Lcom/ichi2/ui/FixedTextView;Lcom/google/android/material/button/MaterialButton;Landroid/view/View;Landroid/widget/ImageView;Landroidx/constraintlayout/widget/Guideline;)V SPLcom/ichi2/anki/databinding/FragmentIntroductionBinding;->bind(Landroid/view/View;)Lcom/ichi2/anki/databinding/FragmentIntroductionBinding; Lcom/ichi2/anki/databinding/IncludeDeckPickerBinding; -SPLcom/ichi2/anki/databinding/IncludeDeckPickerBinding;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/widget/ImageView;Landroid/widget/RelativeLayout;Landroid/widget/LinearLayout;Landroidx/recyclerview/widget/RecyclerView;Lcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding;Landroid/widget/LinearLayout;Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout;Lcom/ichi2/ui/FixedTextView;Landroidx/coordinatorlayout/widget/CoordinatorLayout;)V +SPLcom/ichi2/anki/databinding/IncludeDeckPickerBinding;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/widget/ImageView;Landroid/widget/RelativeLayout;Landroid/widget/LinearLayout;Landroidx/recyclerview/widget/RecyclerView;Lcom/ichi2/anki/ui/BottomFadeFrameLayout;Lcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding;Landroid/widget/LinearLayout;Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout;Lcom/ichi2/ui/FixedTextView;Landroidx/coordinatorlayout/widget/CoordinatorLayout;)V SPLcom/ichi2/anki/databinding/IncludeDeckPickerBinding;->bind(Landroid/view/View;)Lcom/ichi2/anki/databinding/IncludeDeckPickerBinding; +SPLcom/ichi2/anki/databinding/IncludeDeckPickerBinding;->getRoot()Landroidx/coordinatorlayout/widget/CoordinatorLayout; Lcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding; -SPLcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/floatingactionbutton/FloatingActionButton;Landroid/widget/TextView;Landroid/widget/LinearLayout;Lcom/google/android/material/floatingactionbutton/FloatingActionButton;Landroid/widget/TextView;Landroid/widget/LinearLayout;Landroid/widget/TextView;Lcom/google/android/material/floatingactionbutton/FloatingActionButton;Landroid/widget/TextView;Landroid/widget/LinearLayout;Landroid/view/View;Landroid/widget/LinearLayout;Lcom/google/android/material/floatingactionbutton/FloatingActionButton;)V +SPLcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Landroid/view/View;Landroid/widget/LinearLayout;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;)V SPLcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding;->bind(Landroid/view/View;)Lcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding; +SPLcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding;->getRoot()Landroidx/coordinatorlayout/widget/CoordinatorLayout; +Lcom/ichi2/anki/databinding/ItemDeckBinding; +SPLcom/ichi2/anki/databinding/ItemDeckBinding;->(Landroid/widget/RelativeLayout;Landroid/widget/LinearLayout;Landroid/widget/ImageButton;Landroid/widget/RelativeLayout;Lcom/ichi2/ui/FixedTextView;Lcom/ichi2/ui/FixedTextView;Landroid/widget/LinearLayout;Lcom/ichi2/ui/FixedTextView;Lcom/ichi2/ui/FixedTextView;Landroid/widget/ImageButton;)V +SPLcom/ichi2/anki/databinding/ItemDeckBinding;->bind(Landroid/view/View;)Lcom/ichi2/anki/databinding/ItemDeckBinding; +SPLcom/ichi2/anki/databinding/ItemDeckBinding;->getRoot()Landroid/widget/RelativeLayout; +SPLcom/ichi2/anki/databinding/ItemDeckBinding;->inflate(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Z)Lcom/ichi2/anki/databinding/ItemDeckBinding; +Lcom/ichi2/anki/deckpicker/BackgroundImage; +SPLcom/ichi2/anki/deckpicker/BackgroundImage;->()V +SPLcom/ichi2/anki/deckpicker/BackgroundImage;->()V +SPLcom/ichi2/anki/deckpicker/BackgroundImage;->resolve(Landroid/content/Context;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/BackgroundImage$ResolveResult; +Lcom/ichi2/anki/deckpicker/BackgroundImage$ResolveResult$Failure; +Lcom/ichi2/anki/deckpicker/BackgroundImage$ResolveResult$None; +SPLcom/ichi2/anki/deckpicker/BackgroundImage$ResolveResult$None;->()V +SPLcom/ichi2/anki/deckpicker/BackgroundImage$ResolveResult$None;->()V +Lcom/ichi2/anki/deckpicker/BackgroundImage$ResolveResult$Ready; +Lcom/ichi2/anki/deckpicker/BackgroundImage$resolve$1; +SPLcom/ichi2/anki/deckpicker/BackgroundImage$resolve$1;->(Lcom/ichi2/anki/deckpicker/BackgroundImage;Lkotlin/coroutines/Continuation;)V +Lcom/ichi2/anki/deckpicker/DeckFilters; +SPLcom/ichi2/anki/deckpicker/DeckFilters;->()V +SPLcom/ichi2/anki/deckpicker/DeckFilters;->(Ljava/util/List;)V +SPLcom/ichi2/anki/deckpicker/DeckFilters;->accept(Ljava/lang/String;)Z +SPLcom/ichi2/anki/deckpicker/DeckFilters;->isActive()Z +Lcom/ichi2/anki/deckpicker/DeckFilters$Companion; +SPLcom/ichi2/anki/deckpicker/DeckFilters$Companion;->()V +SPLcom/ichi2/anki/deckpicker/DeckFilters$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/deckpicker/DeckFilters$Companion;->create(Ljava/lang/CharSequence;)Lcom/ichi2/anki/deckpicker/DeckFilters; Lcom/ichi2/anki/deckpicker/DeckPickerViewModel; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->$r8$lambda$Wxk-7C57DNHGjBrAfsSr9ge2lXo(Lcom/ichi2/anki/libanki/Collection;)Lcom/ichi2/anki/deckpicker/OptionsMenuState; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->()V SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->access$getFlowOfRefreshDeckList$p(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;)Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->access$loadDeckList(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->access$refreshUndoMenuState(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->access$setDueTree(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lcom/ichi2/anki/libanki/sched/DeckNode;)V SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->access$setSchedulerUpgradeDialogShownForVersion$p(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Ljava/lang/Long;)V SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->fetchSyncIconState(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -8646,26 +10132,42 @@ SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDeckCountsChanged()L SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDeckList()Lkotlinx/coroutines/flow/StateFlow; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDeckListInInitialState()Lkotlinx/coroutines/flow/StateFlow; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDecksReloaded()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDeleteDeckConfirmation()Lkotlinx/coroutines/flow/MutableSharedFlow; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDestination()Lkotlinx/coroutines/flow/MutableSharedFlow; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDisableShortcuts()Lkotlinx/coroutines/flow/MutableSharedFlow; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfExportDeck()Lkotlinx/coroutines/flow/MutableSharedFlow; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfFocusedDeck()Lkotlinx/coroutines/flow/MutableStateFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfNavigate()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfOptionsMenuState()Lkotlinx/coroutines/flow/MutableStateFlow; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfPromptUserToUpdateScheduler()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfRenameDeck()Lkotlinx/coroutines/flow/MutableSharedFlow; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfResizingDividerVisible()Lkotlinx/coroutines/flow/Flow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfShowContextMenu()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfShowRightClickContextMenu()Lkotlinx/coroutines/flow/MutableSharedFlow; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfStartupResponse()Lkotlinx/coroutines/flow/MutableStateFlow; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfStudiedTodayStats()Lkotlinx/coroutines/flow/MutableStateFlow; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfUndoUpdated()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfStudyDeck()Lkotlinx/coroutines/flow/MutableSharedFlow; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getOnError()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getOptionsMenuState()Lcom/ichi2/anki/deckpicker/OptionsMenuState; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getProgressManager()Lcom/ichi2/anki/progress/ProgressManager; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->handleStartup(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$AnkiDroidEnvironment;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->isDeckSearchExpanded()Z +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->loadDeckList(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->onScreenResumed()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->refreshMenuState$lambda$0(Lcom/ichi2/anki/libanki/Collection;)Lcom/ichi2/anki/deckpicker/OptionsMenuState; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->refreshMenuState(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->refreshUndoMenuState$lambda$0(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lcom/ichi2/anki/libanki/Collection;)Lkotlin/Unit; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->refreshUndoMenuState(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->reloadDeckCounts()Lkotlinx/coroutines/Job; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->setDueTree(Lcom/ichi2/anki/libanki/sched/DeckNode;)V SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->setFocusedDeck(Ljava/lang/Long;)V SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->updateDeckList()Lkotlinx/coroutines/Job; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->updateMenuState$lambda$0(Lcom/ichi2/anki/libanki/Collection;)Lcom/ichi2/anki/deckpicker/OptionsMenuState; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->updateMenuState(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$$ExternalSyntheticLambda0; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$$ExternalSyntheticLambda0;->()V SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$AnkiDroidEnvironment; Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$Companion; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$Companion;->()V @@ -8682,6 +10184,7 @@ SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList$Companion;->< SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList$Companion;->getEmpty()Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList; Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;->()V SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;->()V SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse$FatalError; @@ -8705,7 +10208,6 @@ SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$1;->invoke(Ljava SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$1;->invoke(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2;->$r8$lambda$bFRSR_7wm94-WeK-JvfxQv1iRaE(Lcom/ichi2/anki/libanki/Collection;)J SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2;->(Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2;->invoke(Lcom/ichi2/anki/libanki/sched/DeckNode;Ljava/lang/String;Ljava/lang/Long;Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -8724,13 +10226,33 @@ SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfResizingDividerVisible$1; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfResizingDividerVisible$1;->invoke(Ljava/lang/Boolean;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfResizingDividerVisible$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfResizingDividerVisible$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$failure$1; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$failure$1;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$AnkiDroidEnvironment;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$failure$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$failure$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$AnkiDroidEnvironment;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$failure$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$failure$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$failure$1$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$failure$1$1;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$loadDeckList$2; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$loadDeckList$2;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$loadDeckList$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$loadDeckList$2;->invoke(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$loadDeckList$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$loadDeckList$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$refreshMenuState$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$refreshMenuState$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$refreshMenuState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$refreshUndoMenuState$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$refreshUndoMenuState$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$refreshUndoMenuState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->$r8$lambda$BMMoQ96tPYpNvjZLGFOSUwmF4X8(Lcom/ichi2/anki/libanki/Collection;)Ljava/lang/String; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->$r8$lambda$N1WL__Mg32xDn5DI1zSWiKu7MsY(Lcom/ichi2/anki/libanki/Collection;)J -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->$r8$lambda$QMAFwqxX2rgmL-9V3MSRhm-DbRk(Lcom/ichi2/anki/libanki/Collection;)Lkotlin/Pair; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->$r8$lambda$gDm8O8QuQetku415Dzd_FfysJsE(Lcom/ichi2/anki/libanki/Collection;)J SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->invokeSuspend$lambda$0(Lcom/ichi2/anki/libanki/Collection;)Lkotlin/Pair; @@ -8750,19 +10272,6 @@ SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda3; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda3;->()V SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$updateDeckList$1; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$updateDeckList$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)V -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$updateDeckList$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$updateDeckList$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$updateDeckList$1$1; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$updateDeckList$1$1;->(Lkotlin/coroutines/Continuation;)V -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$updateDeckList$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$updateDeckList$1$1;->invoke(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$updateDeckList$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$updateDeckList$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$updateMenuState$1; -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$updateMenuState$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)V -SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$updateMenuState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/deckpicker/DeckPickerViewModelKt; SPLcom/ichi2/anki/deckpicker/DeckPickerViewModelKt;->onlyHasDefaultDeck(Lcom/ichi2/anki/libanki/sched/DeckNode;)Z Lcom/ichi2/anki/deckpicker/DisplayDeckNode; @@ -8770,6 +10279,16 @@ SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->()V SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->(JLjava/lang/String;Ljava/lang/String;ZZIZIIIZ)V SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->(JLjava/lang/String;Ljava/lang/String;ZZIZIIIZLkotlin/jvm/internal/DefaultConstructorMarker;)V SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->equals(Ljava/lang/Object;)Z +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getCanCollapse()Z +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getCollapsed()Z +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getDepth()I +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getDid()J +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getFiltered()Z +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getLastDeckNameComponent()Ljava/lang/String; +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getLrnCount()I +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getNewCount()I +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getRevCount()I +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->isSelected()Z SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->setDeckNode(Lcom/ichi2/anki/libanki/sched/DeckNode;)V Lcom/ichi2/anki/deckpicker/DisplayDeckNode$Companion; SPLcom/ichi2/anki/deckpicker/DisplayDeckNode$Companion;->()V @@ -8777,15 +10296,14 @@ SPLcom/ichi2/anki/deckpicker/DisplayDeckNode$Companion;->(Lkotlin/jvm/inte SPLcom/ichi2/anki/deckpicker/DisplayDeckNode$Companion;->from(Lcom/ichi2/anki/libanki/sched/DeckNode;ZJ)Lcom/ichi2/anki/deckpicker/DisplayDeckNode; Lcom/ichi2/anki/deckpicker/DisplayDeckNodeKt; SPLcom/ichi2/anki/deckpicker/DisplayDeckNodeKt;->addVisibleToList(Lcom/ichi2/anki/libanki/sched/DeckNode;Ljava/util/List;ZJ)V -SPLcom/ichi2/anki/deckpicker/DisplayDeckNodeKt;->filterAndFlattenDisplay(Lcom/ichi2/anki/libanki/sched/DeckNode;Ljava/lang/CharSequence;J)Ljava/util/List; -SPLcom/ichi2/anki/deckpicker/DisplayDeckNodeKt;->filterAndFlattenDisplayInner(Lcom/ichi2/anki/libanki/sched/DeckNode;Ljava/lang/CharSequence;Ljava/util/List;ZJ)V -SPLcom/ichi2/anki/deckpicker/DisplayDeckNodeKt;->nameMatchesFilter(Lcom/ichi2/anki/libanki/sched/DeckNode;Ljava/lang/CharSequence;)Z +SPLcom/ichi2/anki/deckpicker/DisplayDeckNodeKt;->filterAndFlattenDisplay(Lcom/ichi2/anki/libanki/sched/DeckNode;Lcom/ichi2/anki/deckpicker/DeckFilters;J)Ljava/util/List; +SPLcom/ichi2/anki/deckpicker/DisplayDeckNodeKt;->filterAndFlattenDisplayInner(Lcom/ichi2/anki/libanki/sched/DeckNode;Lcom/ichi2/anki/deckpicker/DeckFilters;Ljava/util/List;ZJ)V Lcom/ichi2/anki/deckpicker/OptionsMenuState; +SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->()V SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->(ZLjava/lang/String;Lcom/ichi2/anki/deckpicker/SyncIconState;ZZ)V -SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->component1()Z -SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->component2()Ljava/lang/String; -SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->component4()Z -SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->component5()Z +SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->copy$default(Lcom/ichi2/anki/deckpicker/OptionsMenuState;ZLjava/lang/String;Lcom/ichi2/anki/deckpicker/SyncIconState;ZZILjava/lang/Object;)Lcom/ichi2/anki/deckpicker/OptionsMenuState; +SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->copy(ZLjava/lang/String;Lcom/ichi2/anki/deckpicker/SyncIconState;ZZ)Lcom/ichi2/anki/deckpicker/OptionsMenuState; +SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->equals(Ljava/lang/Object;)Z SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->getSearchIcon()Z SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->getSyncIcon()Lcom/ichi2/anki/deckpicker/SyncIconState; SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->getUndoAvailable()Z @@ -8796,11 +10314,11 @@ SPLcom/ichi2/anki/deckpicker/SyncIconState;->()V SPLcom/ichi2/anki/deckpicker/SyncIconState;->(Ljava/lang/String;I)V SPLcom/ichi2/anki/deckpicker/SyncIconState;->values()[Lcom/ichi2/anki/deckpicker/SyncIconState; Lcom/ichi2/anki/dialogs/BackupPromptDialog; -SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->$r8$lambda$PdAG4heO00k13asnXbfRwGgVFTM(Lcom/ichi2/anki/libanki/Collection;)Z SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->()V SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->(Landroid/content/Context;)V SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->(Landroid/content/Context;Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->access$shouldShowDialog(Lcom/ichi2/anki/dialogs/BackupPromptDialog;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->access$userIsNewToAnkiDroid(Lcom/ichi2/anki/dialogs/BackupPromptDialog;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->getFirstInstallTime()Ljava/lang/Long; SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->shouldShowDialog(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->userIsNewToAnkiDroid$lambda$0(Lcom/ichi2/anki/libanki/Collection;)Z @@ -8818,12 +10336,23 @@ SPLcom/ichi2/anki/dialogs/BackupPromptDialog$Companion$showIfAvailable$1;->invok Lcom/ichi2/anki/dialogs/BackupPromptDialog$shouldShowDialog$1; SPLcom/ichi2/anki/dialogs/BackupPromptDialog$shouldShowDialog$1;->(Lcom/ichi2/anki/dialogs/BackupPromptDialog;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/dialogs/BackupPromptDialog$shouldShowDialog$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/dialogs/BackupPromptDialog$userIsNewToAnkiDroid$1; +SPLcom/ichi2/anki/dialogs/BackupPromptDialog$userIsNewToAnkiDroid$1;->(Lcom/ichi2/anki/dialogs/BackupPromptDialog;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/dialogs/BackupPromptDialog$userIsNewToAnkiDroid$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption; SPLcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption;->$values()[Lcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption; SPLcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption;->()V -SPLcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption;->(Ljava/lang/String;II)V +SPLcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption;->(Ljava/lang/String;I)V SPLcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption;->values()[Lcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption; -Lcom/ichi2/anki/dialogs/DeckSelectionDialog$DeckSelectionListener; +Lcom/ichi2/anki/dialogs/DeckPickerContextMenuKt; +SPLcom/ichi2/anki/dialogs/DeckPickerContextMenuKt;->setDeckPickerContextMenuResultListener(Landroidx/fragment/app/FragmentActivity;Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/anki/dialogs/DeckPickerContextMenuKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/dialogs/DeckPickerContextMenuKt$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/anki/dialogs/DeckPickerMaintenanceDialog$Check; +SPLcom/ichi2/anki/dialogs/DeckPickerMaintenanceDialog$Check;->$values()[Lcom/ichi2/anki/dialogs/DeckPickerMaintenanceDialog$Check; +SPLcom/ichi2/anki/dialogs/DeckPickerMaintenanceDialog$Check;->()V +SPLcom/ichi2/anki/dialogs/DeckPickerMaintenanceDialog$Check;->(Ljava/lang/String;ILjava/lang/String;)V +SPLcom/ichi2/anki/dialogs/DeckPickerMaintenanceDialog$Check;->getRequestKey()Ljava/lang/String; Lcom/ichi2/anki/dialogs/DialogHandler; SPLcom/ichi2/anki/dialogs/DialogHandler;->()V SPLcom/ichi2/anki/dialogs/DialogHandler;->(Lcom/ichi2/anki/AnkiActivity;)V @@ -8832,9 +10361,17 @@ SPLcom/ichi2/anki/dialogs/DialogHandler;->popMessage()Landroid/os/Message; Lcom/ichi2/anki/dialogs/DialogHandler$Companion; SPLcom/ichi2/anki/dialogs/DialogHandler$Companion;->()V SPLcom/ichi2/anki/dialogs/DialogHandler$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -Lcom/ichi2/anki/dialogs/ImportDialog$ImportDialogListener; Lcom/ichi2/anki/dialogs/ImportFileSelectionFragment$ApkgImportResultLauncherProvider; Lcom/ichi2/anki/dialogs/ImportFileSelectionFragment$CsvImportResultLauncherProvider; +Lcom/ichi2/anki/dialogs/ImportViewModel; +SPLcom/ichi2/anki/dialogs/ImportViewModel;->()V +SPLcom/ichi2/anki/dialogs/ImportViewModel;->()V +SPLcom/ichi2/anki/dialogs/ImportViewModel;->getImportAddFlow()Lkotlinx/coroutines/flow/SharedFlow; +SPLcom/ichi2/anki/dialogs/ImportViewModel;->getImportReplaceFlow()Lkotlinx/coroutines/flow/SharedFlow; +Lcom/ichi2/anki/dialogs/LoadingDialogFragment; +Lcom/ichi2/anki/dialogs/LoadingDialogFragmentKt; +SPLcom/ichi2/anki/dialogs/LoadingDialogFragmentKt;->dismissLoadingDialog(Lcom/ichi2/anki/AnkiActivity;Ljava/lang/String;)V +SPLcom/ichi2/anki/dialogs/LoadingDialogFragmentKt;->removeImmediately(Lcom/ichi2/anki/AnkiActivity;Lcom/ichi2/anki/dialogs/LoadingDialogFragment;)V Lcom/ichi2/anki/dialogs/SyncErrorDialog$SyncErrorDialogListener; Lcom/ichi2/anki/dialogs/customstudy/CustomStudyDialog$CustomStudyAction; SPLcom/ichi2/anki/dialogs/customstudy/CustomStudyDialog$CustomStudyAction;->$values()[Lcom/ichi2/anki/dialogs/customstudy/CustomStudyDialog$CustomStudyAction; @@ -8849,13 +10386,40 @@ SPLcom/ichi2/anki/dialogs/tags/TagsDialogListener;->()V Lcom/ichi2/anki/dialogs/tags/TagsDialogListener$Companion; SPLcom/ichi2/anki/dialogs/tags/TagsDialogListener$Companion;->()V SPLcom/ichi2/anki/dialogs/tags/TagsDialogListener$Companion;->()V +Lcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel; +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel;->()V +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel;->(Landroidx/lifecycle/SavedStateHandle;)V +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel;->access$getFactory$cp()Landroidx/lifecycle/ViewModelProvider$Factory; +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel;->getExportReadyDestination()Lkotlinx/coroutines/flow/StateFlow; +Lcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$Companion; +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$Companion;->()V +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$Companion;->getFactory()Landroidx/lifecycle/ViewModelProvider$Factory; +Lcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$special$$inlined$savedStateViewModelFactory$1; +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$special$$inlined$savedStateViewModelFactory$1;->()V +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$special$$inlined$savedStateViewModelFactory$1;->invoke(Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$special$$inlined$savedStateViewModelFactory$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/exception/CollectionLockedException; +SPLcom/ichi2/anki/exception/CollectionLockedException;->()V +SPLcom/ichi2/anki/exception/CollectionLockedException;->access$setMessageProvider$cp(Lkotlin/jvm/functions/Function0;)V +Lcom/ichi2/anki/exception/CollectionLockedException$Companion; +SPLcom/ichi2/anki/exception/CollectionLockedException$Companion;->()V +SPLcom/ichi2/anki/exception/CollectionLockedException$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/exception/CollectionLockedException$Companion;->setMessageProvider(Lkotlin/jvm/functions/Function0;)V +Lcom/ichi2/anki/exception/SanitizedReportCollector; +SPLcom/ichi2/anki/exception/SanitizedReportCollector;->()V +SPLcom/ichi2/anki/exception/SanitizedReportCollector;->()V +SPLcom/ichi2/anki/exception/SanitizedReportCollector;->enabled(Lorg/acra/config/CoreConfiguration;)Z +SPLcom/ichi2/anki/exception/SanitizedReportCollector;->getOrder()Lorg/acra/collector/Collector$Order; Lcom/ichi2/anki/exception/StorageAccessException; +Lcom/ichi2/anki/exception/StorageNotConfiguredException; Lcom/ichi2/anki/exception/SystemStorageException; Lcom/ichi2/anki/i18n/LocaleCodesKt; SPLcom/ichi2/anki/i18n/LocaleCodesKt;->()V -SPLcom/ichi2/anki/i18n/LocaleCodesKt;->getIso3Code(Ljava/util/Locale;)Ljava/lang/String; SPLcom/ichi2/anki/i18n/LocaleCodesKt;->normalize(Ljava/util/Locale;)Ljava/util/Locale; SPLcom/ichi2/anki/i18n/LocaleCodesKt;->toAnkiTwoLetterCode(Ljava/util/Locale;)Ljava/lang/String; +Lcom/ichi2/anki/i18n/LocaleCodesKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/i18n/LocaleCodesKt$$ExternalSyntheticLambda0;->()V Lcom/ichi2/anki/introduction/CollectionPermissionScreenLauncher; SPLcom/ichi2/anki/introduction/CollectionPermissionScreenLauncher;->recreateActivityResultLauncher(Lcom/ichi2/anki/AnkiActivity;)Landroidx/activity/result/ActivityResultLauncher; Lcom/ichi2/anki/introduction/CollectionPermissionScreenLauncher$$ExternalSyntheticLambda0; @@ -8863,18 +10427,22 @@ SPLcom/ichi2/anki/introduction/CollectionPermissionScreenLauncher$$ExternalSynth Lcom/ichi2/anki/introduction/CollectionPermissionScreenLauncherKt; SPLcom/ichi2/anki/introduction/CollectionPermissionScreenLauncherKt;->hasCollectionStoragePermissions(Lcom/ichi2/anki/AnkiActivity;)Z Lcom/ichi2/anki/introduction/SetupCollectionFragment; -SPLcom/ichi2/anki/introduction/SetupCollectionFragment;->$r8$lambda$xSwG1EYOxFolza8kS5BHiAcsUlY(Lcom/ichi2/anki/introduction/SetupCollectionFragment;Landroid/view/View;)V SPLcom/ichi2/anki/introduction/SetupCollectionFragment;->()V SPLcom/ichi2/anki/introduction/SetupCollectionFragment;->()V SPLcom/ichi2/anki/introduction/SetupCollectionFragment;->getBinding()Lcom/ichi2/anki/databinding/FragmentIntroductionBinding; SPLcom/ichi2/anki/introduction/SetupCollectionFragment;->onViewCreated$lambda$0(Lcom/ichi2/anki/introduction/SetupCollectionFragment;Landroid/view/View;)V SPLcom/ichi2/anki/introduction/SetupCollectionFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V SPLcom/ichi2/anki/introduction/SetupCollectionFragment;->setResult(Lcom/ichi2/anki/introduction/SetupCollectionFragment$CollectionSetupOption;)V +SPLcom/ichi2/anki/introduction/SetupCollectionFragment;->setupEdgeToEdge$lambda$0(Lcom/ichi2/anki/introduction/SetupCollectionFragment;Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +SPLcom/ichi2/anki/introduction/SetupCollectionFragment;->setupEdgeToEdge(Landroid/view/View;)V Lcom/ichi2/anki/introduction/SetupCollectionFragment$$ExternalSyntheticLambda0; SPLcom/ichi2/anki/introduction/SetupCollectionFragment$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/introduction/SetupCollectionFragment;)V SPLcom/ichi2/anki/introduction/SetupCollectionFragment$$ExternalSyntheticLambda0;->onClick(Landroid/view/View;)V Lcom/ichi2/anki/introduction/SetupCollectionFragment$$ExternalSyntheticLambda1; SPLcom/ichi2/anki/introduction/SetupCollectionFragment$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/introduction/SetupCollectionFragment;)V +Lcom/ichi2/anki/introduction/SetupCollectionFragment$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/introduction/SetupCollectionFragment$$ExternalSyntheticLambda2;->(Lcom/ichi2/anki/introduction/SetupCollectionFragment;)V +SPLcom/ichi2/anki/introduction/SetupCollectionFragment$$ExternalSyntheticLambda2;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; Lcom/ichi2/anki/introduction/SetupCollectionFragment$CollectionSetupOption; SPLcom/ichi2/anki/introduction/SetupCollectionFragment$CollectionSetupOption;->$values()[Lcom/ichi2/anki/introduction/SetupCollectionFragment$CollectionSetupOption; SPLcom/ichi2/anki/introduction/SetupCollectionFragment$CollectionSetupOption;->()V @@ -8934,14 +10502,15 @@ SPLcom/ichi2/anki/libanki/Config;->getBackend()Lnet/ankiweb/rsdroid/Backend; Lcom/ichi2/anki/libanki/DB; SPLcom/ichi2/anki/libanki/DB;->()V SPLcom/ichi2/anki/libanki/DB;->(Landroidx/sqlite/db/SupportSQLiteDatabase;)V -SPLcom/ichi2/anki/libanki/DB;->execute(Ljava/lang/String;[Ljava/lang/Object;)V SPLcom/ichi2/anki/libanki/DB;->queryScalar(Ljava/lang/String;[Ljava/lang/Object;)I Lcom/ichi2/anki/libanki/DB$Companion; SPLcom/ichi2/anki/libanki/DB$Companion;->()V SPLcom/ichi2/anki/libanki/DB$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lcom/ichi2/anki/libanki/Deck; +SPLcom/ichi2/anki/libanki/Deck;->()V SPLcom/ichi2/anki/libanki/Deck;->(Lorg/json/JSONObject;)V SPLcom/ichi2/anki/libanki/Deck;->getId()J +SPLcom/ichi2/anki/libanki/Deck;->getJsonObject()Lorg/json/JSONObject; Lcom/ichi2/anki/libanki/DeckNameId; SPLcom/ichi2/anki/libanki/DeckNameId;->(Ljava/lang/String;J)V Lcom/ichi2/anki/libanki/Decks; @@ -8982,8 +10551,7 @@ Lcom/ichi2/anki/libanki/Storage; SPLcom/ichi2/anki/libanki/Storage;->()V SPLcom/ichi2/anki/libanki/Storage;->()V SPLcom/ichi2/anki/libanki/Storage;->collection(Lcom/ichi2/anki/libanki/CollectionFiles;Lkotlin/jvm/functions/Function1;Lnet/ankiweb/rsdroid/Backend;)Lcom/ichi2/anki/libanki/Collection; -SPLcom/ichi2/anki/libanki/Storage;->createDB(Lcom/ichi2/anki/libanki/DB;Lcom/ichi2/anki/common/time/Time;)V -SPLcom/ichi2/anki/libanki/Storage;->openDB$libanki_release(Lcom/ichi2/anki/libanki/Storage$OpenDbArgs;Lnet/ankiweb/rsdroid/Backend;ZLkotlin/jvm/functions/Function1;)Lkotlin/Pair; +SPLcom/ichi2/anki/libanki/Storage;->openDB$libanki(Lcom/ichi2/anki/libanki/Storage$OpenDbArgs;Lnet/ankiweb/rsdroid/Backend;ZLkotlin/jvm/functions/Function1;)Lkotlin/Pair; Lcom/ichi2/anki/libanki/Storage$OpenDbArgs; SPLcom/ichi2/anki/libanki/Storage$OpenDbArgs;->()V SPLcom/ichi2/anki/libanki/Storage$OpenDbArgs;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -9004,7 +10572,6 @@ SPLcom/ichi2/anki/libanki/TemplateManager$Companion;->()V SPLcom/ichi2/anki/libanki/TemplateManager$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLcom/ichi2/anki/libanki/TemplateManager$Companion;->getFieldFilters()Ljava/util/Map; Lcom/ichi2/anki/libanki/TemplateManager$FieldFilter; -SPLcom/ichi2/anki/libanki/TemplateManager$FieldFilter;->()V Lcom/ichi2/anki/libanki/TtsVoice; SPLcom/ichi2/anki/libanki/TtsVoice;->(Ljava/lang/String;Ljava/lang/String;)V Lcom/ichi2/anki/libanki/UndoStatus; @@ -9037,15 +10604,48 @@ SPLcom/ichi2/anki/libanki/sched/DeckNode;->getNewCount()I SPLcom/ichi2/anki/libanki/sched/DeckNode;->getParent()Ljava/lang/ref/WeakReference; SPLcom/ichi2/anki/libanki/sched/DeckNode;->getRevCount()I SPLcom/ichi2/anki/libanki/sched/DeckNode;->isSyntheticDeck()Z +SPLcom/ichi2/anki/libanki/sched/DeckNode;->totalCardsDue()I Lcom/ichi2/anki/libanki/sched/Scheduler; SPLcom/ichi2/anki/libanki/sched/Scheduler;->(Lcom/ichi2/anki/libanki/Collection;)V SPLcom/ichi2/anki/libanki/sched/Scheduler;->deckDueTree()Lcom/ichi2/anki/libanki/sched/DeckNode; SPLcom/ichi2/anki/libanki/sched/Scheduler;->deckTree(Z)Lcom/ichi2/anki/libanki/sched/DeckNode; +SPLcom/ichi2/anki/libanki/sched/Scheduler;->getDayCutoff()J SPLcom/ichi2/anki/libanki/sched/Scheduler;->studiedToday()Ljava/lang/String; +SPLcom/ichi2/anki/libanki/sched/Scheduler;->timingToday()Lanki/scheduler/SchedTimingTodayResponse; Lcom/ichi2/anki/libanki/utils/PythonExtensionsKt; SPLcom/ichi2/anki/libanki/utils/PythonExtensionsKt;->append(Ljava/util/List;Ljava/lang/Object;)V SPLcom/ichi2/anki/libanki/utils/PythonExtensionsKt;->len(Ljava/util/List;)I +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->()V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation$lambda$2(Landroid/content/Intent;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation$lambda$3(Landroid/content/Intent;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation$lambda$4(Landroid/app/Activity;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation$lambda$5(Landroid/app/Activity;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation$lambda$6(Landroid/app/Activity;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation$lambda$7(Landroid/os/Bundle;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->readSafely(Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->summarizeNames(Ljava/util/Set;Ljava/util/Set;)Ljava/util/Map; +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda1;->(Landroid/content/Intent;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda1;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda2;->(Landroid/content/Intent;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda2;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda3;->(Landroid/app/Activity;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda3;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda4;->(Landroid/app/Activity;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda4;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda5; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda5;->(Landroid/app/Activity;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda5;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda6; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda6;->(Landroid/os/Bundle;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda6;->invoke()Ljava/lang/Object; Lcom/ichi2/anki/logging/FragmentLifecycleLogger; +SPLcom/ichi2/anki/logging/FragmentLifecycleLogger;->()V SPLcom/ichi2/anki/logging/FragmentLifecycleLogger;->(Landroid/app/Activity;)V SPLcom/ichi2/anki/logging/FragmentLifecycleLogger;->onFragmentAttached(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Landroid/content/Context;)V SPLcom/ichi2/anki/logging/FragmentLifecycleLogger;->onFragmentCreated(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Landroid/os/Bundle;)V @@ -9069,51 +10669,313 @@ SPLcom/ichi2/anki/logging/LogType$Companion;->getValue()Lcom/ichi2/anki/logging/ Lcom/ichi2/anki/logging/ProductionCrashReportingTree; SPLcom/ichi2/anki/logging/ProductionCrashReportingTree;->()V SPLcom/ichi2/anki/logging/ProductionCrashReportingTree;->()V +PLcom/ichi2/anki/logging/ProductionCrashReportingTree;->createStackElementTag(Ljava/lang/StackTraceElement;)Ljava/lang/String; +PLcom/ichi2/anki/logging/ProductionCrashReportingTree;->getTag()Ljava/lang/String; SPLcom/ichi2/anki/logging/ProductionCrashReportingTree;->log(ILjava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V Lcom/ichi2/anki/logging/ProductionCrashReportingTree$Companion; SPLcom/ichi2/anki/logging/ProductionCrashReportingTree$Companion;->()V SPLcom/ichi2/anki/logging/ProductionCrashReportingTree$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/logging/TimberLogger; +SPLcom/ichi2/anki/logging/TimberLogger;->(Ljava/lang/String;)V +SPLcom/ichi2/anki/logging/TimberLogger;->handleNormalizedLoggingCall(Lorg/slf4j/event/Level;Lorg/slf4j/Marker;Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V +SPLcom/ichi2/anki/logging/TimberLogger;->isDebugEnabled()Z +SPLcom/ichi2/anki/logging/TimberLogger;->isInfoEnabled()Z +Lcom/ichi2/anki/logging/TimberLoggerFactory; +SPLcom/ichi2/anki/logging/TimberLoggerFactory;->()V +SPLcom/ichi2/anki/logging/TimberLoggerFactory;->getLogger$lambda$0(Ljava/lang/String;)Lorg/slf4j/Logger; +SPLcom/ichi2/anki/logging/TimberLoggerFactory;->getLogger$lambda$1(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Lorg/slf4j/Logger; +SPLcom/ichi2/anki/logging/TimberLoggerFactory;->getLogger(Ljava/lang/String;)Lorg/slf4j/Logger; +Lcom/ichi2/anki/logging/TimberLoggerFactory$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/logging/TimberLoggerFactory$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/logging/TimberLoggerFactory$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/logging/TimberLoggerFactory$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/logging/TimberLoggerFactory$$ExternalSyntheticLambda1;->(Lkotlin/jvm/functions/Function1;)V +SPLcom/ichi2/anki/logging/TimberLoggerFactory$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/logging/TimberServiceProvider; +SPLcom/ichi2/anki/logging/TimberServiceProvider;->()V +SPLcom/ichi2/anki/logging/TimberServiceProvider;->()V +SPLcom/ichi2/anki/logging/TimberServiceProvider;->getLoggerFactory()Lorg/slf4j/ILoggerFactory; +SPLcom/ichi2/anki/logging/TimberServiceProvider;->getMDCAdapter()Lorg/slf4j/spi/MDCAdapter; +SPLcom/ichi2/anki/logging/TimberServiceProvider;->getRequestedApiVersion()Ljava/lang/String; +SPLcom/ichi2/anki/logging/TimberServiceProvider;->initialize()V +Lcom/ichi2/anki/logging/TimberServiceProviderKt; +SPLcom/ichi2/anki/logging/TimberServiceProviderKt;->access$getPriority(Lorg/slf4j/event/Level;)I +SPLcom/ichi2/anki/logging/TimberServiceProviderKt;->getPriority(Lorg/slf4j/event/Level;)I +Lcom/ichi2/anki/logging/TimberServiceProviderKt$WhenMappings; +SPLcom/ichi2/anki/logging/TimberServiceProviderKt$WhenMappings;->()V +Lcom/ichi2/anki/model/FieldFilter; +Lcom/ichi2/anki/model/FieldFilters$NoSuggestFilter; +SPLcom/ichi2/anki/model/FieldFilters$NoSuggestFilter;->()V +SPLcom/ichi2/anki/model/FieldFilters$NoSuggestFilter;->()V +SPLcom/ichi2/anki/model/FieldFilters$NoSuggestFilter;->ensureApplied()V +SPLcom/ichi2/anki/model/FieldFilters$NoSuggestFilter;->getName()Ljava/lang/String; +Lcom/ichi2/anki/multimedia/MultimediaArgsStorage; +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage;->()V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage;->(Ljava/io/File;)V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage;->(Ljava/io/File;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage;->removeExpiredFiles$default(Lcom/ichi2/anki/multimedia/MultimediaArgsStorage;JILjava/lang/Object;)V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage;->removeExpiredFiles$lambda$0(Ljava/io/File;Ljava/lang/String;)Z +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage;->removeExpiredFiles(J)V +Lcom/ichi2/anki/multimedia/MultimediaArgsStorage$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage$$ExternalSyntheticLambda0;->accept(Ljava/io/File;Ljava/lang/String;)Z +Lcom/ichi2/anki/multimedia/MultimediaArgsStorage$Companion; +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage$Companion;->()V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage$Companion;->create(Landroid/content/Context;)Lcom/ichi2/anki/multimedia/MultimediaArgsStorage; +Lcom/ichi2/anki/multiprofile/AppRestartKt; +SPLcom/ichi2/anki/multiprofile/AppRestartKt;->currentProcessName()Ljava/lang/String; +SPLcom/ichi2/anki/multiprofile/AppRestartKt;->isPhoenixProcess()Z +SPLcom/ichi2/anki/multiprofile/AppRestartKt;->isPhoenixProcessName(Ljava/lang/String;)Z +Lcom/ichi2/anki/multiprofile/ProfileContextWrapper; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->()V +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->(Landroid/content/Context;Ljava/lang/String;Ljava/io/File;)V +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->(Landroid/content/Context;Ljava/lang/String;Ljava/io/File;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->access$requireCustomDirectories(Lcom/ichi2/anki/multiprofile/ProfileContextWrapper;)V +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getCacheDir()Ljava/io/File; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getDatabasePath(Ljava/lang/String;)Ljava/io/File; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getDir(Ljava/lang/String;I)Ljava/io/File; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getFilesDir()Ljava/io/File; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getNoBackupFilesDir()Ljava/io/File; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getProfileId-evi8WI0()Ljava/lang/String; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->requireCustomDirectories()V +Lcom/ichi2/anki/multiprofile/ProfileContextWrapper$Companion; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper$Companion;->()V +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper$Companion;->create-vKkjgeQ(Landroid/content/Context;Ljava/lang/String;Ljava/io/File;)Lcom/ichi2/anki/multiprofile/ProfileContextWrapper; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper$Companion;->requirePathInFilesDir(Ljava/io/File;Landroid/content/Context;)V +Lcom/ichi2/anki/multiprofile/ProfileId; +SPLcom/ichi2/anki/multiprofile/ProfileId;->()V +SPLcom/ichi2/anki/multiprofile/ProfileId;->constructor-impl(Ljava/lang/String;)Ljava/lang/String; +SPLcom/ichi2/anki/multiprofile/ProfileId;->equals-impl0(Ljava/lang/String;Ljava/lang/String;)Z +SPLcom/ichi2/anki/multiprofile/ProfileId;->isDefault-impl(Ljava/lang/String;)Z +SPLcom/ichi2/anki/multiprofile/ProfileId;->toString-impl(Ljava/lang/String;)Ljava/lang/String; +Lcom/ichi2/anki/multiprofile/ProfileId$Companion; +SPLcom/ichi2/anki/multiprofile/ProfileId$Companion;->()V +SPLcom/ichi2/anki/multiprofile/ProfileId$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/multiprofile/ProfileManager; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->()V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->(Landroid/content/Context;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->access$getAttachError$cp()Ljava/lang/Throwable; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->access$initializeActiveProfile(Lcom/ichi2/anki/multiprofile/ProfileManager;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->access$setAttachError$cp(Ljava/lang/Throwable;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->configureWebView-eoBvq2w(Ljava/lang/String;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->ensureProfileCollectionPath(Lcom/ichi2/anki/multiprofile/ProfileContextWrapper;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->getActiveProfileContext()Landroid/content/Context; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->getGlobalProfilePrefs()Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->getProfileRegistry()Lcom/ichi2/anki/multiprofile/ProfileManager$ProfileRegistry; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->globalProfilePrefs_delegate$lambda$0(Lcom/ichi2/anki/multiprofile/ProfileManager;)Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->initializeActiveProfile()V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->loadProfileData-eoBvq2w(Ljava/lang/String;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->profileRegistry_delegate$lambda$0(Lcom/ichi2/anki/multiprofile/ProfileManager;)Lcom/ichi2/anki/multiprofile/ProfileManager$ProfileRegistry; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->resolveProfileDirectory-TRoClbo(Ljava/lang/String;)Ljava/io/File; +Lcom/ichi2/anki/multiprofile/ProfileManager$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/multiprofile/ProfileManager$$ExternalSyntheticLambda3;->(Lcom/ichi2/anki/multiprofile/ProfileManager;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager$$ExternalSyntheticLambda3;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/multiprofile/ProfileManager$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/multiprofile/ProfileManager$$ExternalSyntheticLambda4;->(Lcom/ichi2/anki/multiprofile/ProfileManager;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager$$ExternalSyntheticLambda4;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/multiprofile/ProfileManager$Companion; +SPLcom/ichi2/anki/multiprofile/ProfileManager$Companion;->()V +SPLcom/ichi2/anki/multiprofile/ProfileManager$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager$Companion;->create(Landroid/content/Context;)Lcom/ichi2/anki/multiprofile/ProfileManager; +SPLcom/ichi2/anki/multiprofile/ProfileManager$Companion;->createOrNull(Landroid/content/Context;)Lcom/ichi2/anki/multiprofile/ProfileManager; +SPLcom/ichi2/anki/multiprofile/ProfileManager$Companion;->getAttachError()Ljava/lang/Throwable; +Lcom/ichi2/anki/multiprofile/ProfileManager$ProfileRegistry; +SPLcom/ichi2/anki/multiprofile/ProfileManager$ProfileRegistry;->(Landroid/content/SharedPreferences;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager$ProfileRegistry;->getLastActiveProfileId-K_c7ANI()Ljava/lang/String; +Lcom/ichi2/anki/multiprofile/ProfileRestrictedDirectory; +SPLcom/ichi2/anki/multiprofile/ProfileRestrictedDirectory;->constructor-impl(Ljava/io/File;)Ljava/io/File; +Lcom/ichi2/anki/navigation/AnkiDroidNavigator; +SPLcom/ichi2/anki/navigation/AnkiDroidNavigator;->()V +SPLcom/ichi2/anki/navigation/AnkiDroidNavigator;->()V +SPLcom/ichi2/anki/navigation/AnkiDroidNavigator;->initialize(Landroid/app/Application;)V +SPLcom/ichi2/anki/navigation/AnkiDroidNavigator;->toIntent(Lcom/ichi2/anki/common/destinations/Destination;)Landroid/content/Intent; +Lcom/ichi2/anki/navigation/AnkiDroidNavigatorKt; +SPLcom/ichi2/anki/navigation/AnkiDroidNavigatorKt;->initializeNavigator(Landroid/app/Application;)V +Lcom/ichi2/anki/noteeditor/NoteEditorDestinationKt; +SPLcom/ichi2/anki/noteeditor/NoteEditorDestinationKt;->toIntent(Lcom/ichi2/anki/common/destinations/NoteEditorDestination;Landroid/content/Context;)Landroid/content/Intent; +Lcom/ichi2/anki/noteeditor/NoteEditorFragmentDelegate; Lcom/ichi2/anki/observability/ChangeManager; -SPLcom/ichi2/anki/observability/ChangeManager;->$r8$lambda$BU3Q3o0l2QAhizGR2mPtL6erRiA(Lcom/ichi2/anki/observability/ChangeManager$Subscriber;Lcom/ichi2/anki/observability/ChangeManager$Subscriber;)Z SPLcom/ichi2/anki/observability/ChangeManager;->()V SPLcom/ichi2/anki/observability/ChangeManager;->()V SPLcom/ichi2/anki/observability/ChangeManager;->access$getSubscribers$p()Ljava/util/concurrent/CopyOnWriteArrayList; +SPLcom/ichi2/anki/observability/ChangeManager;->setThrowOnDuplicateSubscription(Z)V SPLcom/ichi2/anki/observability/ChangeManager;->subscribe$default(Lcom/ichi2/anki/observability/ChangeManager;Lcom/ichi2/anki/observability/ChangeManager$Subscriber;Landroidx/lifecycle/LifecycleOwner;ILjava/lang/Object;)V SPLcom/ichi2/anki/observability/ChangeManager;->subscribe(Lcom/ichi2/anki/observability/ChangeManager$Subscriber;Landroidx/lifecycle/LifecycleOwner;)V SPLcom/ichi2/anki/observability/ChangeManager;->unsubscribe$lambda$0(Lcom/ichi2/anki/observability/ChangeManager$Subscriber;Lcom/ichi2/anki/observability/ChangeManager$Subscriber;)Z SPLcom/ichi2/anki/observability/ChangeManager;->unsubscribe(Lcom/ichi2/anki/observability/ChangeManager$Subscriber;)V Lcom/ichi2/anki/observability/ChangeManager$$ExternalSyntheticLambda0; -SPLcom/ichi2/anki/observability/ChangeManager$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/observability/ChangeManager$Subscriber;)V -SPLcom/ichi2/anki/observability/ChangeManager$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/observability/ChangeManager$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/observability/ChangeManager$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/observability/ChangeManager$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/observability/ChangeManager$Subscriber;)V +SPLcom/ichi2/anki/observability/ChangeManager$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/observability/ChangeManager$Subscriber; -Lcom/ichi2/anki/observability/ChangeManager$subscribe$1; -SPLcom/ichi2/anki/observability/ChangeManager$subscribe$1;->(Ljava/lang/ref/WeakReference;Lcom/ichi2/anki/observability/ChangeManager$Subscriber;)V -SPLcom/ichi2/anki/observability/ChangeManager$subscribe$1;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V -SPLcom/ichi2/anki/observability/ChangeManager$subscribe$1;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V -SPLcom/ichi2/anki/observability/ChangeManager$subscribe$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V -SPLcom/ichi2/anki/observability/ChangeManager$subscribe$1;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +Lcom/ichi2/anki/observability/ChangeManager$subscribe$2; +SPLcom/ichi2/anki/observability/ChangeManager$subscribe$2;->(Ljava/lang/ref/WeakReference;Lcom/ichi2/anki/observability/ChangeManager$Subscriber;)V +SPLcom/ichi2/anki/observability/ChangeManager$subscribe$2;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/observability/ChangeManager$subscribe$2;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/observability/ChangeManager$subscribe$2;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/observability/ChangeManager$subscribe$2;->onStart(Landroidx/lifecycle/LifecycleOwner;)V Lcom/ichi2/anki/observability/ChangeManagerKt; -SPLcom/ichi2/anki/observability/ChangeManagerKt;->$r8$lambda$8t0n24DDrX6UZIBasO-85q-Nf8I(Lkotlin/jvm/functions/Function1;Ljava/lang/ref/WeakReference;)Z SPLcom/ichi2/anki/observability/ChangeManagerKt;->access$removeWeakReferences(Ljava/util/List;Lkotlin/jvm/functions/Function1;)V SPLcom/ichi2/anki/observability/ChangeManagerKt;->removeWeakReferences$lambda$0(Lkotlin/jvm/functions/Function1;Ljava/lang/ref/WeakReference;)Z SPLcom/ichi2/anki/observability/ChangeManagerKt;->removeWeakReferences(Ljava/util/List;Lkotlin/jvm/functions/Function1;)V Lcom/ichi2/anki/observability/ChangeManagerKt$$ExternalSyntheticLambda0; SPLcom/ichi2/anki/observability/ChangeManagerKt$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V SPLcom/ichi2/anki/observability/ChangeManagerKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/observability/OpChangesPublisher; +SPLcom/ichi2/anki/observability/OpChangesPublisher;->()V +SPLcom/ichi2/anki/observability/OpChangesPublisher;->(Lkotlin/jvm/functions/Function2;)V Lcom/ichi2/anki/pages/PostRequestHandler; -Lcom/ichi2/anki/preferences/PreferenceUtilsKt; -SPLcom/ichi2/anki/preferences/PreferenceUtilsKt;->sharedPrefs(Landroid/content/Context;)Landroid/content/SharedPreferences; +Lcom/ichi2/anki/preferences/SharedPreferencesProvider; +Lcom/ichi2/anki/progress/HasProgress; +Lcom/ichi2/anki/progress/ProgressManager; +SPLcom/ichi2/anki/progress/ProgressManager;->()V +SPLcom/ichi2/anki/progress/ProgressManager;->()V +SPLcom/ichi2/anki/progress/ProgressManager;->getProgress()Lkotlinx/coroutines/flow/StateFlow; +Lcom/ichi2/anki/progress/ProgressObserverKt; +SPLcom/ichi2/anki/progress/ProgressObserverKt;->()V +SPLcom/ichi2/anki/progress/ProgressObserverKt;->access$observeProgress_exY8QGI$unblockInput(Lkotlin/jvm/internal/Ref$ObjectRef;Lcom/ichi2/anki/AnkiActivity;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt;->blockTouches(Landroid/view/Window;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt;->observeProgress-exY8QGI$default(Lcom/ichi2/anki/AnkiActivity;Lcom/ichi2/anki/progress/HasProgress;JLkotlin/jvm/functions/Function2;ILjava/lang/Object;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt;->observeProgress-exY8QGI(Lcom/ichi2/anki/AnkiActivity;Lcom/ichi2/anki/progress/HasProgress;JLkotlin/jvm/functions/Function2;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt;->observeProgress_exY8QGI$unblockInput(Lkotlin/jvm/internal/Ref$ObjectRef;Lcom/ichi2/anki/AnkiActivity;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt;->unblockTouches(Landroid/view/Window;)V +Lcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1;->(Lcom/ichi2/anki/AnkiActivity;Lcom/ichi2/anki/progress/HasProgress;Lkotlin/jvm/internal/Ref$BooleanRef;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/internal/Ref$ObjectRef;JLkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1;->(Lcom/ichi2/anki/progress/HasProgress;Lkotlin/jvm/internal/Ref$BooleanRef;Lcom/ichi2/anki/AnkiActivity;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/internal/Ref$ObjectRef;JLkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1$1; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlin/jvm/internal/Ref$BooleanRef;Lcom/ichi2/anki/AnkiActivity;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lcom/ichi2/anki/progress/HasProgress;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/internal/Ref$ObjectRef;J)V +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1$1;->emit(Lcom/ichi2/anki/progress/ViewModelProgress;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/progress/ViewModelProgress; +Lcom/ichi2/anki/progress/ViewModelProgress$Idle; +SPLcom/ichi2/anki/progress/ViewModelProgress$Idle;->()V +SPLcom/ichi2/anki/progress/ViewModelProgress$Idle;->()V Lcom/ichi2/anki/provider/CardContentProvider; SPLcom/ichi2/anki/provider/CardContentProvider;->()V SPLcom/ichi2/anki/provider/CardContentProvider;->()V SPLcom/ichi2/anki/provider/CardContentProvider;->_init_$addUri(Ljava/lang/String;I)V SPLcom/ichi2/anki/provider/CardContentProvider;->onCreate()Z +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda1;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda10; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda10;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda11; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda11;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda12; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda12;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda13; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda13;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda14; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda14;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda15; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda15;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda16; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda16;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda17; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda17;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda18; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda18;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda19; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda19;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda2;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda21; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda21;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda22; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda22;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda23; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda23;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda24; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda24;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda25; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda25;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda26; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda26;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda27; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda27;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda28; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda28;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda3;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda4;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda5; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda5;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda6; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda6;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda7; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda7;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda8; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda8;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda9; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda9;->()V Lcom/ichi2/anki/provider/CardContentProvider$Companion; SPLcom/ichi2/anki/provider/CardContentProvider$Companion;->()V SPLcom/ichi2/anki/provider/CardContentProvider$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/provider/ContentProviderStartup; +SPLcom/ichi2/anki/provider/ContentProviderStartup;->()V +SPLcom/ichi2/anki/provider/ContentProviderStartup;->()V +SPLcom/ichi2/anki/provider/ContentProviderStartup;->onProviderCreate$lambda$0(Lcom/ichi2/anki/provider/ContentProviderStartup;)V +SPLcom/ichi2/anki/provider/ContentProviderStartup;->onProviderCreate()V +Lcom/ichi2/anki/provider/ContentProviderStartup$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/provider/ContentProviderStartup$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/provider/ContentProviderStartup;)V +SPLcom/ichi2/anki/provider/ContentProviderStartup$$ExternalSyntheticLambda0;->run()V +Lcom/ichi2/anki/recorder/VoiceRecorder; +SPLcom/ichi2/anki/recorder/VoiceRecorder;->()V +SPLcom/ichi2/anki/recorder/VoiceRecorder;->access$getRECORDING_RETENTION$cp()J +Lcom/ichi2/anki/recorder/VoiceRecorder$Companion; +SPLcom/ichi2/anki/recorder/VoiceRecorder$Companion;->()V +SPLcom/ichi2/anki/recorder/VoiceRecorder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/recorder/VoiceRecorder$Companion;->recordingsDirectory(Landroid/content/Context;)Ljava/io/File; +SPLcom/ichi2/anki/recorder/VoiceRecorder$Companion;->removeExpiredRecordings$default(Lcom/ichi2/anki/recorder/VoiceRecorder$Companion;Ljava/io/File;JILjava/lang/Object;)V +SPLcom/ichi2/anki/recorder/VoiceRecorder$Companion;->removeExpiredRecordings(Ljava/io/File;J)V +Lcom/ichi2/anki/recorder/VoiceRecorder$Companion$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/recorder/VoiceRecorder$Companion$$ExternalSyntheticLambda0;->()V Lcom/ichi2/anki/reviewer/AutomaticAnswer$AutomaticallyAnswered; Lcom/ichi2/anki/reviewer/BindingProcessor; Lcom/ichi2/anki/reviewer/ReviewerUi; +Lcom/ichi2/anki/reviewreminders/ReminderLogTree; +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree;->()V +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree;->isLoggable(Ljava/lang/String;I)Z +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree;->log(ILjava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V +Lcom/ichi2/anki/reviewreminders/ReminderLogTree$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/reviewreminders/ReminderLogTree$Companion; +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree$Companion;->()V +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/reviewreminders/ReviewReminder; +Lcom/ichi2/anki/reviewreminders/ReviewReminderSchema; +Lcom/ichi2/anki/reviewreminders/ReviewReminderSchemaV1; +Lcom/ichi2/anki/reviewreminders/ReviewReminderSchemaV2; +Lcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion; +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion;->()V +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion;->(I)V +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion;->box-impl(I)Lcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion; +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion;->constructor-impl(I)I +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion;->hashCode()I +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion;->hashCode-impl(I)I +Lcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion$Companion; +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion$Companion;->()V +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/reviewreminders/ReviewRemindersDatabase; +SPLcom/ichi2/anki/reviewreminders/ReviewRemindersDatabase;->()V +SPLcom/ichi2/anki/reviewreminders/ReviewRemindersDatabase;->()V +SPLcom/ichi2/anki/reviewreminders/ReviewRemindersDatabase;->checkDeserializationErrors(Landroid/content/Context;)V Lcom/ichi2/anki/servicelayer/DebugInfoService; SPLcom/ichi2/anki/servicelayer/DebugInfoService;->()V SPLcom/ichi2/anki/servicelayer/DebugInfoService;->()V @@ -9123,7 +10985,6 @@ Lcom/ichi2/anki/servicelayer/DebugInfoService$getDebugInfo$1; SPLcom/ichi2/anki/servicelayer/DebugInfoService$getDebugInfo$1;->(Lcom/ichi2/anki/servicelayer/DebugInfoService;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/servicelayer/DebugInfoService$getDebugInfo$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/servicelayer/DebugInfoServiceKt; -SPLcom/ichi2/anki/servicelayer/DebugInfoServiceKt;->$r8$lambda$XQy_klgseapixA9pLanAm7mGlT8(Lcom/ichi2/anki/libanki/Collection;)Ljava/lang/Boolean; SPLcom/ichi2/anki/servicelayer/DebugInfoServiceKt;->getFSRSStatus$lambda$0(Lcom/ichi2/anki/libanki/Collection;)Ljava/lang/Boolean; SPLcom/ichi2/anki/servicelayer/DebugInfoServiceKt;->getFSRSStatus(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lcom/ichi2/anki/servicelayer/DebugInfoServiceKt$$ExternalSyntheticLambda0; @@ -9142,7 +11003,6 @@ SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade;->(ILkotlin/jvm/internal/DefaultConstructorMarker;)V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade;->getVersionIdentifier()I Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Companion; -SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Companion;->$r8$lambda$HOrn_rnH3_n7IHpuOTYCym4fziY(Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade;)I SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Companion;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Companion;->getAllInstances(J)Lkotlin/sequences/Sequence; @@ -9150,7 +11010,7 @@ SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Compan SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Companion;->getAllVersionIdentifiers()Lkotlin/sequences/Sequence; SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Companion;->getLatestVersion()I SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Companion;->setPreferenceToLatestVersion(Landroid/content/SharedPreferences;)V -SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Companion;->setPreferenceVersion$AnkiDroid_playNonMinifiedRelease(Landroid/content/SharedPreferences;I)V +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Companion;->setPreferenceVersion$AnkiDroid(Landroid/content/SharedPreferences;I)V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Companion$$ExternalSyntheticLambda0; SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Companion$$ExternalSyntheticLambda0;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$Companion$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; @@ -9165,32 +11025,52 @@ Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$LegacyPr SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$LegacyPreferenceUpgrade$Companion;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$LegacyPreferenceUpgrade$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveAnswerRecommended; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveAnswerRecommended;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveAnswerRecommended;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveBackupMax; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveBackupMax;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveBackupMax;->()V +Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveDeveloperFindReplace; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveDeveloperFindReplace;->()V +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveDeveloperFindReplace;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveHostNum; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveHostNum;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveHostNum;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveInCardsMode; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveInCardsMode;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveInCardsMode;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveLastExportedAtTime; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveLastExportedAtTime;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveLastExportedAtTime;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveLongTouchGesture; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveLongTouchGesture;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveLongTouchGesture;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveNoCodeFormatting; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveNoCodeFormatting;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveNoCodeFormatting;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveReviewerETA; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveReviewerETA;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveReviewerETA;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveScrollingButtons; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveScrollingButtons;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$RemoveScrollingButtons;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$ResetAnalyticsOptIn; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$ResetAnalyticsOptIn;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$ResetAnalyticsOptIn;->()V +Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$ResetAnalyticsOptIn2; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$ResetAnalyticsOptIn2;->()V +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$ResetAnalyticsOptIn2;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$SetShowDeckTitle; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$SetShowDeckTitle;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$SetShowDeckTitle;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpdateNoteEditorToolbarPrefs; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpdateNoteEditorToolbarPrefs;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpdateNoteEditorToolbarPrefs;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeAnswerControls; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeAnswerControls;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeAnswerControls;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeAppLocale; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeAppLocale;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeAppLocale;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeBrowserColumns; SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeBrowserColumns;->()V @@ -9199,14 +11079,19 @@ Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeB SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeBrowserColumns$Companion;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeBrowserColumns$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeDayAndNightThemes; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeDayAndNightThemes;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeDayAndNightThemes;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeDoubleTapTimeout; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeDoubleTapTimeout;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeDoubleTapTimeout;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeFetchMedia; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeFetchMedia;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeFetchMedia;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeGesturesToControls; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeGesturesToControls;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeGesturesToControls;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeHideAnswerButtons; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeHideAnswerButtons;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeHideAnswerButtons;->()V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeThemes; SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeThemes;->()V @@ -9215,12 +11100,8 @@ Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeT SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeThemes$Companion;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeThemes$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeToggleBacksideOnlyControl; +SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeToggleBacksideOnlyControl;->()V SPLcom/ichi2/anki/servicelayer/PreferenceUpgradeService$PreferenceUpgrade$UpgradeToggleBacksideOnlyControl;->()V -Lcom/ichi2/anki/servicelayer/ScopedStorageService; -SPLcom/ichi2/anki/servicelayer/ScopedStorageService;->()V -SPLcom/ichi2/anki/servicelayer/ScopedStorageService;->()V -SPLcom/ichi2/anki/servicelayer/ScopedStorageService;->isLegacyStorage(Landroid/content/Context;)Z -SPLcom/ichi2/anki/servicelayer/ScopedStorageService;->isLegacyStorage(Ljava/io/File;Landroid/content/Context;)Z Lcom/ichi2/anki/servicelayer/ThrowableFilterService; SPLcom/ichi2/anki/servicelayer/ThrowableFilterService;->()V SPLcom/ichi2/anki/servicelayer/ThrowableFilterService;->()V @@ -9230,13 +11111,12 @@ Lcom/ichi2/anki/servicelayer/ThrowableFilterService$$ExternalSyntheticLambda0; SPLcom/ichi2/anki/servicelayer/ThrowableFilterService$$ExternalSyntheticLambda0;->()V Lcom/ichi2/anki/servicelayer/ThrowableFilterService$FilteringExceptionHandler; Lcom/ichi2/anki/services/BootService; -SPLcom/ichi2/anki/services/BootService;->$r8$lambda$SEeZpcFOCw0DBTJRBFzGzRpEJ5A(Landroid/content/Context;)V SPLcom/ichi2/anki/services/BootService;->()V SPLcom/ichi2/anki/services/BootService;->()V SPLcom/ichi2/anki/services/BootService;->catchAlarmManagerErrors(Landroid/content/Context;Ljava/lang/Runnable;)V SPLcom/ichi2/anki/services/BootService;->getColSafe()Lcom/ichi2/anki/libanki/Collection; -SPLcom/ichi2/anki/services/BootService;->onReceive$lambda$1(Landroid/content/Context;)V -SPLcom/ichi2/anki/services/BootService;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V +SPLcom/ichi2/anki/services/BootService;->onReceiveBroadcast$lambda$1(Landroid/content/Context;)V +SPLcom/ichi2/anki/services/BootService;->onReceiveBroadcast(Landroid/content/Context;Landroid/content/Intent;)V Lcom/ichi2/anki/services/BootService$$ExternalSyntheticLambda0; SPLcom/ichi2/anki/services/BootService$$ExternalSyntheticLambda0;->(Landroid/content/Context;)V SPLcom/ichi2/anki/services/BootService$$ExternalSyntheticLambda0;->run()V @@ -9251,20 +11131,24 @@ Lcom/ichi2/anki/settings/PrefsRepository; SPLcom/ichi2/anki/settings/PrefsRepository;->()V SPLcom/ichi2/anki/settings/PrefsRepository;->(Landroid/content/Context;)V SPLcom/ichi2/anki/settings/PrefsRepository;->(Landroid/content/SharedPreferences;Landroid/content/res/Resources;)V +SPLcom/ichi2/anki/settings/PrefsRepository;->(Lcom/ichi2/anki/preferences/SharedPreferencesProvider;Landroid/content/res/Resources;)V +SPLcom/ichi2/anki/settings/PrefsRepository;->_init_$lambda$0(Landroid/content/SharedPreferences;)Landroid/content/SharedPreferences; SPLcom/ichi2/anki/settings/PrefsRepository;->booleanPref(IZ)Lkotlin/properties/ReadWriteProperty; SPLcom/ichi2/anki/settings/PrefsRepository;->booleanPref(Ljava/lang/String;Z)Lkotlin/properties/ReadWriteProperty; SPLcom/ichi2/anki/settings/PrefsRepository;->enumPref(ILjava/lang/Enum;)Lkotlin/properties/ReadWriteProperty; -SPLcom/ichi2/anki/settings/PrefsRepository;->getAllowSyncOnMeteredConnections()Z SPLcom/ichi2/anki/settings/PrefsRepository;->getAppTheme()Lcom/ichi2/anki/settings/enums/AppTheme; SPLcom/ichi2/anki/settings/PrefsRepository;->getBoolean(IZ)Z SPLcom/ichi2/anki/settings/PrefsRepository;->getCurrentSyncUri()Ljava/lang/String; SPLcom/ichi2/anki/settings/PrefsRepository;->getCustomSyncCertificate()Ljava/lang/String; SPLcom/ichi2/anki/settings/PrefsRepository;->getDayTheme()Lcom/ichi2/anki/settings/enums/DayTheme; +SPLcom/ichi2/anki/settings/PrefsRepository;->getDevBottomNavEnabled()Z SPLcom/ichi2/anki/settings/PrefsRepository;->getDisplaySyncStatus()Z SPLcom/ichi2/anki/settings/PrefsRepository;->getEnum(ILjava/lang/Enum;)Ljava/lang/Enum; SPLcom/ichi2/anki/settings/PrefsRepository;->getExitViaDoubleTapBack()Z SPLcom/ichi2/anki/settings/PrefsRepository;->getHkey()Ljava/lang/String; SPLcom/ichi2/anki/settings/PrefsRepository;->getNewReviewRemindersEnabled()Z +SPLcom/ichi2/anki/settings/PrefsRepository;->getRemoveAppAnimations()Z +SPLcom/ichi2/anki/settings/PrefsRepository;->getReviewReminderDeserializationErrors()Ljava/lang/String; SPLcom/ichi2/anki/settings/PrefsRepository;->getSharedPrefs()Landroid/content/SharedPreferences; SPLcom/ichi2/anki/settings/PrefsRepository;->getString(ILjava/lang/String;)Ljava/lang/String; SPLcom/ichi2/anki/settings/PrefsRepository;->intPref(II)Lkotlin/properties/ReadWriteProperty; @@ -9277,6 +11161,9 @@ SPLcom/ichi2/anki/settings/PrefsRepository;->key(I)Ljava/lang/String; SPLcom/ichi2/anki/settings/PrefsRepository;->longPref(IJ)Lkotlin/properties/ReadWriteProperty; SPLcom/ichi2/anki/settings/PrefsRepository;->stringPref$default(Lcom/ichi2/anki/settings/PrefsRepository;ILjava/lang/String;ILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; SPLcom/ichi2/anki/settings/PrefsRepository;->stringPref(ILjava/lang/String;)Lkotlin/properties/ReadWriteProperty; +Lcom/ichi2/anki/settings/PrefsRepository$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/settings/PrefsRepository$$ExternalSyntheticLambda0;->(Landroid/content/SharedPreferences;)V +SPLcom/ichi2/anki/settings/PrefsRepository$$ExternalSyntheticLambda0;->sharedPrefs()Landroid/content/SharedPreferences; Lcom/ichi2/anki/settings/PrefsRepository$Companion; SPLcom/ichi2/anki/settings/PrefsRepository$Companion;->()V SPLcom/ichi2/anki/settings/PrefsRepository$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -9328,16 +11215,37 @@ SPLcom/ichi2/anki/settings/enums/ToolbarPosition;->$values()[Lcom/ichi2/anki/set SPLcom/ichi2/anki/settings/enums/ToolbarPosition;->()V SPLcom/ichi2/anki/settings/enums/ToolbarPosition;->(Ljava/lang/String;II)V Lcom/ichi2/anki/snackbar/BaseSnackbarBuilderProvider; +Lcom/ichi2/anki/startup/BackendSetupKt; +SPLcom/ichi2/anki/startup/BackendSetupKt;->configureBackendTemporaryDirectory(Landroid/content/Context;)V +SPLcom/ichi2/anki/startup/BackendSetupKt;->isUsableTemporaryDirectory(Ljava/lang/String;)Z +Lcom/ichi2/anki/startup/SetupStorageKt; +SPLcom/ichi2/anki/startup/SetupStorageKt;->ensureCollectionPathSet(Landroid/content/Context;)V +Lcom/ichi2/anki/ui/BottomFadeFrameLayout; +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->()V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->dispatchDraw(Landroid/graphics/Canvas;)V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->setAnchorView(Landroid/view/View;)V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->setup(Landroid/view/Window;)V +Lcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion; +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion;->()V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion;->navigationBarStyle$lambda$0(Landroid/content/res/Resources;)Z +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion;->navigationBarStyle()Landroidx/activity/SystemBarStyle; +Lcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/ui/DoubleTapListener; +SPLcom/ichi2/anki/ui/DoubleTapListener;->()V SPLcom/ichi2/anki/ui/DoubleTapListener;->(Landroid/content/Context;)V Lcom/ichi2/anki/ui/DoubleTapListener$detector$1; SPLcom/ichi2/anki/ui/DoubleTapListener$detector$1;->(Landroid/content/Context;Lcom/ichi2/anki/ui/DoubleTapListener$detector$2;)V Lcom/ichi2/anki/ui/DoubleTapListener$detector$2; SPLcom/ichi2/anki/ui/DoubleTapListener$detector$2;->(Lcom/ichi2/anki/ui/DoubleTapListener;)V +Lcom/ichi2/anki/ui/ResizablePaneLayout; Lcom/ichi2/anki/ui/ResizingDivider; Lcom/ichi2/anki/ui/animations/ViewAnimationsKt; -SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt;->$r8$lambda$Md8x5lxmN9HxCdJZ36q-a8cpNV8(Landroid/view/View;)V -SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt;->$r8$lambda$ZsJKR0iOPvQsTUfpc_6Uyiv_GfI(Landroid/view/View;)V SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt;->fadeIn$default(Landroid/view/View;IFLjava/lang/Runnable;ILjava/lang/Object;)Landroid/view/ViewPropertyAnimator; SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt;->fadeIn$lambda$0(Landroid/view/View;)V SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt;->fadeIn(Landroid/view/View;IFLjava/lang/Runnable;)Landroid/view/ViewPropertyAnimator; @@ -9379,71 +11287,124 @@ SPLcom/ichi2/anki/ui/internationalization/SentenceCase;->()V SPLcom/ichi2/anki/ui/internationalization/SentenceCase;->()V SPLcom/ichi2/anki/ui/internationalization/SentenceCase;->getCheckDatabase(Landroid/content/Context;)Ljava/lang/String; SPLcom/ichi2/anki/ui/internationalization/SentenceCase;->getCheckMediaAction(Landroid/content/Context;)Ljava/lang/String; +SPLcom/ichi2/anki/ui/internationalization/SentenceCase;->getCreateDeck(Landroid/content/Context;)Ljava/lang/String; +SPLcom/ichi2/anki/ui/internationalization/SentenceCase;->getEmptyCards(Landroid/content/Context;)Ljava/lang/String; Lcom/ichi2/anki/ui/internationalization/SentenceCaseKt; SPLcom/ichi2/anki/ui/internationalization/SentenceCaseKt;->getSentenceCase(Lanki/i18n/GeneratedTranslations;)Lcom/ichi2/anki/ui/internationalization/SentenceCase; +SPLcom/ichi2/anki/ui/internationalization/SentenceCaseKt;->matchesSentenceCaseResource(Ljava/lang/String;Ljava/lang/String;)Z SPLcom/ichi2/anki/ui/internationalization/SentenceCaseKt;->toSentenceCase(Landroid/content/Context;Ljava/lang/String;I)Ljava/lang/String; SPLcom/ichi2/anki/ui/internationalization/SentenceCaseKt;->toSentenceCase(Ljava/lang/String;Landroid/content/Context;I)Ljava/lang/String; Lcom/ichi2/anki/ui/windows/permissions/InternetPermissionFragment; -Lcom/ichi2/anki/ui/windows/permissions/NotificationsPermissionFragment; Lcom/ichi2/anki/ui/windows/permissions/PermissionsFragment; Lcom/ichi2/anki/ui/windows/permissions/PermissionsStartingAt30Fragment; Lcom/ichi2/anki/ui/windows/permissions/PermissionsUntil29Fragment; +Lcom/ichi2/anki/utils/ExceptionsKt; +SPLcom/ichi2/anki/utils/ExceptionsKt;->runWithOOMCheck(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; +Lcom/ichi2/anki/utils/InsetsKt; +SPLcom/ichi2/anki/utils/InsetsKt;->bottomCornerClearance(Landroidx/core/view/WindowInsetsCompat;Landroid/view/View;)I +SPLcom/ichi2/anki/utils/InsetsKt;->getBottomRoundedCornerRadius(Landroidx/core/view/WindowInsetsCompat;)I Lcom/ichi2/anki/utils/MimeTypeUtils; SPLcom/ichi2/anki/utils/MimeTypeUtils;->()V SPLcom/ichi2/anki/utils/MimeTypeUtils;->()V SPLcom/ichi2/anki/utils/MimeTypeUtils;->getCSV_TSV_MIME_TYPES()[Ljava/lang/String; Lcom/ichi2/anki/utils/ext/FlowKt; +SPLcom/ichi2/anki/utils/ext/FlowKt;->launchCollectionInLifecycleScope(Lcom/ichi2/anki/AnkiActivity;Lkotlinx/coroutines/flow/Flow;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;)V SPLcom/ichi2/anki/utils/ext/FlowKt;->launchCollectionInLifecycleScope(Lcom/ichi2/anki/AnkiActivity;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)V SPLcom/ichi2/anki/utils/ext/FlowKt;->launchCollectionInLifecycleScope(Lcom/ichi2/anki/AnkiActivity;Lkotlinx/coroutines/flow/StateFlow;Lkotlin/jvm/functions/Function2;)V Lcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2; -SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2;->(Lcom/ichi2/anki/AnkiActivity;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2;->(Lcom/ichi2/anki/AnkiActivity;Landroidx/lifecycle/Lifecycle$State;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1; -SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1;->(Lkotlinx/coroutines/flow/Flow;Lcom/ichi2/anki/AnkiActivity;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1$1; -SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1$1;->(Lkotlin/jvm/functions/Function2;)V +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1$1;->(Lcom/ichi2/anki/AnkiActivity;Lkotlin/jvm/functions/Function2;)V SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3; SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3;->(Lcom/ichi2/anki/AnkiActivity;Lkotlinx/coroutines/flow/StateFlow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1; -SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1;->(Lkotlinx/coroutines/flow/StateFlow;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1;->(Lkotlinx/coroutines/flow/StateFlow;Lkotlin/jvm/internal/Ref$ObjectRef;Lcom/ichi2/anki/AnkiActivity;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1$1; -SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/flow/StateFlow;Lkotlin/jvm/functions/Function2;)V +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lcom/ichi2/anki/AnkiActivity;Lkotlin/jvm/functions/Function2;)V SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lcom/ichi2/anki/utils/ext/FragmentResultKt; -SPLcom/ichi2/anki/utils/ext/FragmentResultKt;->$r8$lambda$do_Bsiwo5JBIz41hVRKHFyiUqo4(Lkotlin/jvm/functions/Function2;Ljava/lang/String;Landroid/os/Bundle;)V SPLcom/ichi2/anki/utils/ext/FragmentResultKt;->setFragmentResultListener$lambda$0(Lkotlin/jvm/functions/Function2;Ljava/lang/String;Landroid/os/Bundle;)V SPLcom/ichi2/anki/utils/ext/FragmentResultKt;->setFragmentResultListener(Landroidx/fragment/app/FragmentActivity;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V Lcom/ichi2/anki/utils/ext/FragmentResultKt$$ExternalSyntheticLambda0; SPLcom/ichi2/anki/utils/ext/FragmentResultKt$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function2;)V SPLcom/ichi2/anki/utils/ext/FragmentResultKt$$ExternalSyntheticLambda0;->onFragmentResult(Ljava/lang/String;Landroid/os/Bundle;)V +Lcom/ichi2/anki/utils/ext/ImageViewKt; +SPLcom/ichi2/anki/utils/ext/ImageViewKt;->setImageDrawableSafe$lambda$1(Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;)Z +SPLcom/ichi2/anki/utils/ext/ImageViewKt;->setImageDrawableSafe(Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;Lkotlin/jvm/functions/Function1;)Z +Lcom/ichi2/anki/utils/ext/ImageViewKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/utils/ext/ImageViewKt$$ExternalSyntheticLambda0;->(Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;)V +SPLcom/ichi2/anki/utils/ext/ImageViewKt$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; Lcom/ichi2/anki/utils/ext/LinearLayoutManagerKt; SPLcom/ichi2/anki/utils/ext/LinearLayoutManagerKt;->getVisibleItemPositions(Landroidx/recyclerview/widget/LinearLayoutManager;)Lkotlin/ranges/IntRange; SPLcom/ichi2/anki/utils/ext/LinearLayoutManagerKt;->positionIsVisible(Landroidx/recyclerview/widget/LinearLayoutManager;I)Z +Lcom/ichi2/anki/utils/ext/ViewKt; +SPLcom/ichi2/anki/utils/ext/ViewKt;->onGlobalLayout$lambda$0(Lkotlin/jvm/functions/Function0;)V +SPLcom/ichi2/anki/utils/ext/ViewKt;->onGlobalLayout(Landroid/view/View;Landroidx/lifecycle/LifecycleOwner;Lkotlin/jvm/functions/Function0;)V +Lcom/ichi2/anki/utils/ext/ViewKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/utils/ext/ViewKt$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function0;)V +SPLcom/ichi2/anki/utils/ext/ViewKt$$ExternalSyntheticLambda0;->onGlobalLayout()V +Lcom/ichi2/anki/utils/ext/ViewKt$onGlobalLayout$1; +SPLcom/ichi2/anki/utils/ext/ViewKt$onGlobalLayout$1;->(Landroid/view/View;Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V +SPLcom/ichi2/anki/utils/ext/ViewKt$onGlobalLayout$1;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/utils/ext/ViewKt$onGlobalLayout$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/utils/ext/ViewKt$onGlobalLayout$1;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +Lcom/ichi2/anki/widget/WidgetRegistryKt; +SPLcom/ichi2/anki/widget/WidgetRegistryKt;->()V +SPLcom/ichi2/anki/widget/WidgetRegistryKt;->getRECURRING_WIDGETS()Ljava/util/List; Lcom/ichi2/anki/widgets/DeckAdapter; SPLcom/ichi2/anki/widgets/DeckAdapter;->()V SPLcom/ichi2/anki/widgets/DeckAdapter;->(Landroid/content/Context;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;)V +SPLcom/ichi2/anki/widgets/DeckAdapter;->access$setDeckExpander(Lcom/ichi2/anki/widgets/DeckAdapter;Landroid/widget/ImageButton;Landroid/widget/ImageButton;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V +SPLcom/ichi2/anki/widgets/DeckAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V +SPLcom/ichi2/anki/widgets/DeckAdapter;->onBindViewHolder(Lcom/ichi2/anki/widgets/DeckAdapter$ViewHolder;I)V +SPLcom/ichi2/anki/widgets/DeckAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLcom/ichi2/anki/widgets/DeckAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Lcom/ichi2/anki/widgets/DeckAdapter$ViewHolder; SPLcom/ichi2/anki/widgets/DeckAdapter;->setActivityHasBackground(Z)V +SPLcom/ichi2/anki/widgets/DeckAdapter;->setDeckExpander(Landroid/widget/ImageButton;Landroid/widget/ImageButton;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V SPLcom/ichi2/anki/widgets/DeckAdapter;->submit(Ljava/util/List;Z)V +Lcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/widgets/DeckAdapter;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V +Lcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/widgets/DeckAdapter;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V +Lcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda2;->(Lcom/ichi2/anki/widgets/DeckAdapter;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V +Lcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda3;->(Lcom/ichi2/anki/widgets/DeckAdapter;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V +Lcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda4;->(Lcom/ichi2/anki/widgets/DeckAdapter;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V Lcom/ichi2/anki/widgets/DeckAdapter$Companion; SPLcom/ichi2/anki/widgets/DeckAdapter$Companion;->()V SPLcom/ichi2/anki/widgets/DeckAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/widgets/DeckAdapter$ViewHolder; +SPLcom/ichi2/anki/widgets/DeckAdapter$ViewHolder;->()V +SPLcom/ichi2/anki/widgets/DeckAdapter$ViewHolder;->(Lcom/ichi2/anki/databinding/ItemDeckBinding;)V +SPLcom/ichi2/anki/widgets/DeckAdapter$ViewHolder;->getBinding()Lcom/ichi2/anki/databinding/ItemDeckBinding; +Lcom/ichi2/anki/widgets/DeckAdapter$onBindViewHolder$1; +SPLcom/ichi2/anki/widgets/DeckAdapter$onBindViewHolder$1;->(Lcom/ichi2/anki/widgets/DeckAdapter;Lcom/ichi2/anki/databinding/ItemDeckBinding;Lcom/ichi2/anki/widgets/DeckAdapter$ViewHolder;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/widgets/DeckAdapter$onBindViewHolder$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/widgets/DeckAdapter$onBindViewHolder$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/anki/widgets/DeckAdapterKt; SPLcom/ichi2/anki/widgets/DeckAdapterKt;->()V SPLcom/ichi2/anki/widgets/DeckAdapterKt;->access$getDeckNodeDiffCallback$p()Lcom/ichi2/anki/widgets/DeckAdapterKt$deckNodeDiffCallback$1; Lcom/ichi2/anki/widgets/DeckAdapterKt$deckNodeDiffCallback$1; SPLcom/ichi2/anki/widgets/DeckAdapterKt$deckNodeDiffCallback$1;->()V +Lcom/ichi2/anki/widgets/R$id; +Lcom/ichi2/anki/widgets/R$layout; Lcom/ichi2/anki/workarounds/AppLoadedFromBackupWorkaround; SPLcom/ichi2/anki/workarounds/AppLoadedFromBackupWorkaround;->()V SPLcom/ichi2/anki/workarounds/AppLoadedFromBackupWorkaround;->()V @@ -9456,16 +11417,29 @@ SPLcom/ichi2/anki/worker/SyncWorker$Companion;->(Lkotlin/jvm/internal/Defa SPLcom/ichi2/anki/worker/SyncWorker$Companion;->cancel(Landroid/content/Context;)V Lcom/ichi2/compat/customtabs/CustomTabActivityHelper; SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->()V -SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->()V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->(Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/CoroutineDispatcher;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->(Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/CoroutineDispatcher;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->access$getIoDispatcher$p(Lcom/ichi2/compat/customtabs/CustomTabActivityHelper;)Lkotlinx/coroutines/CoroutineDispatcher; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->access$setCustomTabsSession$p(Lcom/ichi2/compat/customtabs/CustomTabActivityHelper;Landroidx/browser/customtabs/CustomTabsSession;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->access$warmup(Lcom/ichi2/compat/customtabs/CustomTabActivityHelper;Landroidx/browser/customtabs/CustomTabsClient;)V SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->bindCustomTabsService(Landroid/app/Activity;)V -SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->getSession()Landroidx/browser/customtabs/CustomTabsSession; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->getProviderInfo(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String; SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->onServiceConnected(Landroidx/browser/customtabs/CustomTabsClient;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->onServiceDisconnected()V SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->unbindCustomTabsService(Landroid/app/Activity;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->warmup(Landroidx/browser/customtabs/CustomTabsClient;)V Lcom/ichi2/compat/customtabs/CustomTabActivityHelper$Companion; SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$Companion;->()V SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1;->(Lcom/ichi2/compat/customtabs/CustomTabActivityHelper;Landroidx/browser/customtabs/CustomTabsClient;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1$1; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1$1;->(Lcom/ichi2/compat/customtabs/CustomTabActivityHelper;Landroidx/browser/customtabs/CustomTabsClient;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lcom/ichi2/compat/customtabs/CustomTabsHelper; -SPLcom/ichi2/compat/customtabs/CustomTabsHelper;->$r8$lambda$gXetRGjBtEa98neoLMiNRJltawM(Landroid/content/pm/PackageManager;Landroid/content/Intent;)Landroid/content/pm/ResolveInfo; SPLcom/ichi2/compat/customtabs/CustomTabsHelper;->()V SPLcom/ichi2/compat/customtabs/CustomTabsHelper;->()V SPLcom/ichi2/compat/customtabs/CustomTabsHelper;->getPackageNameToUse$lambda$0(Landroid/content/pm/PackageManager;Landroid/content/Intent;)Landroid/content/pm/ResolveInfo; @@ -9474,21 +11448,22 @@ Lcom/ichi2/compat/customtabs/CustomTabsHelper$$ExternalSyntheticLambda0; SPLcom/ichi2/compat/customtabs/CustomTabsHelper$$ExternalSyntheticLambda0;->(Landroid/content/pm/PackageManager;Landroid/content/Intent;)V SPLcom/ichi2/compat/customtabs/CustomTabsHelper$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; Lcom/ichi2/compat/customtabs/ServiceConnection; +SPLcom/ichi2/compat/customtabs/ServiceConnection;->()V SPLcom/ichi2/compat/customtabs/ServiceConnection;->(Lcom/ichi2/compat/customtabs/ServiceConnectionCallback;)V SPLcom/ichi2/compat/customtabs/ServiceConnection;->onCustomTabsServiceConnected(Landroid/content/ComponentName;Landroidx/browser/customtabs/CustomTabsClient;)V Lcom/ichi2/compat/customtabs/ServiceConnectionCallback; -Lcom/ichi2/preferences/PreferenceExtensionsKt; -SPLcom/ichi2/preferences/PreferenceExtensionsKt;->getOrSetString(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/util/function/Supplier;)Ljava/lang/String; Lcom/ichi2/themes/Themes; SPLcom/ichi2/themes/Themes;->()V SPLcom/ichi2/themes/Themes;->()V -SPLcom/ichi2/themes/Themes;->disableXiaomiForceDarkMode(Landroid/content/Context;)V +SPLcom/ichi2/themes/Themes;->getCurrentTheme()Lcom/ichi2/anki/settings/enums/Theme; +SPLcom/ichi2/themes/Themes;->isNightTheme()Z +SPLcom/ichi2/themes/Themes;->setTheme(Landroid/app/Activity;Landroid/os/Bundle;)V SPLcom/ichi2/themes/Themes;->setTheme(Landroid/content/Context;)V -SPLcom/ichi2/themes/Themes;->systemIsInNightMode(Landroid/content/Context;)Z SPLcom/ichi2/themes/Themes;->updateCurrentTheme(Landroid/content/Context;)V Lcom/ichi2/themes/Themes$WhenMappings; SPLcom/ichi2/themes/Themes$WhenMappings;->()V Lcom/ichi2/ui/AccessibleSearchView; +SPLcom/ichi2/ui/AccessibleSearchView;->()V SPLcom/ichi2/ui/AccessibleSearchView;->(Landroid/content/Context;)V Lcom/ichi2/ui/BadgeDrawable; SPLcom/ichi2/ui/BadgeDrawable;->()V @@ -9508,12 +11483,13 @@ Lcom/ichi2/ui/BadgeDrawableBuilder; SPLcom/ichi2/ui/BadgeDrawableBuilder;->()V SPLcom/ichi2/ui/BadgeDrawableBuilder;->(Landroid/content/Context;)V SPLcom/ichi2/ui/BadgeDrawableBuilder;->replaceBadge(Lcom/ichi2/anki/SyncActionProvider;)V -SPLcom/ichi2/ui/BadgeDrawableBuilder;->withColor(Ljava/lang/Integer;)Lcom/ichi2/ui/BadgeDrawableBuilder; +SPLcom/ichi2/ui/BadgeDrawableBuilder;->withColorAttr(I)Lcom/ichi2/ui/BadgeDrawableBuilder; SPLcom/ichi2/ui/BadgeDrawableBuilder;->withText(C)Lcom/ichi2/ui/BadgeDrawableBuilder; Lcom/ichi2/ui/BadgeDrawableBuilder$Companion; SPLcom/ichi2/ui/BadgeDrawableBuilder$Companion;->()V SPLcom/ichi2/ui/BadgeDrawableBuilder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lcom/ichi2/ui/FixedTextView; +SPLcom/ichi2/ui/FixedTextView;->()V SPLcom/ichi2/ui/FixedTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V SPLcom/ichi2/ui/FixedTextView;->onDraw(Landroid/graphics/Canvas;)V SPLcom/ichi2/ui/FixedTextView;->onMeasure(II)V @@ -9524,122 +11500,239 @@ Lcom/ichi2/ui/RtlCompliantActionProvider$Companion; SPLcom/ichi2/ui/RtlCompliantActionProvider$Companion;->()V SPLcom/ichi2/ui/RtlCompliantActionProvider$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLcom/ichi2/ui/RtlCompliantActionProvider$Companion;->unwrapContext(Landroid/content/Context;)Landroid/app/Activity; -Lcom/ichi2/utils/AdaptionUtil; -SPLcom/ichi2/utils/AdaptionUtil;->()V -SPLcom/ichi2/utils/AdaptionUtil;->()V -SPLcom/ichi2/utils/AdaptionUtil;->isRunningUnderFirebaseTestLab()Z -SPLcom/ichi2/utils/AdaptionUtil;->isRunningUnderFirebaseTestLab(Landroid/content/ContentResolver;)Z -SPLcom/ichi2/utils/AdaptionUtil;->isUserATestClient()Z -Lcom/ichi2/utils/AdaptionUtil$$ExternalSyntheticLambda0; -SPLcom/ichi2/utils/AdaptionUtil$$ExternalSyntheticLambda0;->()V -Lcom/ichi2/utils/AdaptionUtil$$ExternalSyntheticLambda1; -SPLcom/ichi2/utils/AdaptionUtil$$ExternalSyntheticLambda1;->()V Lcom/ichi2/utils/ClipboardUtil; SPLcom/ichi2/utils/ClipboardUtil;->()V SPLcom/ichi2/utils/ClipboardUtil;->()V SPLcom/ichi2/utils/ClipboardUtil;->getIMPORT_MIME_TYPES()[Ljava/lang/String; -Lcom/ichi2/utils/DisplayUtils; -SPLcom/ichi2/utils/DisplayUtils;->()V -SPLcom/ichi2/utils/DisplayUtils;->()V -SPLcom/ichi2/utils/DisplayUtils;->getDisplayDimensions(Landroid/content/Context;)Landroid/graphics/Point; -SPLcom/ichi2/utils/DisplayUtils;->getDisplayDimensions(Landroid/view/WindowManager;)Landroid/graphics/Point; -Lcom/ichi2/utils/Dp; -SPLcom/ichi2/utils/Dp;->constructor-impl(F)F -SPLcom/ichi2/utils/Dp;->toPx-impl(FLandroid/content/Context;)I Lcom/ichi2/utils/FileUtil; SPLcom/ichi2/utils/FileUtil;->()V SPLcom/ichi2/utils/FileUtil;->()V SPLcom/ichi2/utils/FileUtil;->getFreeDiskSpace(Ljava/io/File;J)J -Lcom/ichi2/utils/HandlerUtils; -SPLcom/ichi2/utils/HandlerUtils;->()V -SPLcom/ichi2/utils/HandlerUtils;->()V -SPLcom/ichi2/utils/HandlerUtils;->getDefaultLooper()Landroid/os/Looper; +Lcom/ichi2/utils/LanguageDebugInfo; +SPLcom/ichi2/utils/LanguageDebugInfo;->()V +SPLcom/ichi2/utils/LanguageDebugInfo;->(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V +SPLcom/ichi2/utils/LanguageDebugInfo;->getAppLocale()Ljava/lang/String; +SPLcom/ichi2/utils/LanguageDebugInfo;->getBackendLocales()Ljava/util/List; +SPLcom/ichi2/utils/LanguageDebugInfo;->getSystemLocale()Ljava/lang/String; Lcom/ichi2/utils/LanguageUtil; SPLcom/ichi2/utils/LanguageUtil;->()V SPLcom/ichi2/utils/LanguageUtil;->()V SPLcom/ichi2/utils/LanguageUtil;->getLocaleCompat(Landroid/content/res/Resources;)Ljava/util/Locale; SPLcom/ichi2/utils/LanguageUtil;->getSystemLocale()Ljava/util/Locale; -SPLcom/ichi2/utils/LanguageUtil;->languageTagToBackendCode(Ljava/lang/String;)Ljava/lang/String; SPLcom/ichi2/utils/LanguageUtil;->setDefaultBackendLanguages$default(Lcom/ichi2/utils/LanguageUtil;Ljava/lang/String;ILjava/lang/Object;)V SPLcom/ichi2/utils/LanguageUtil;->setDefaultBackendLanguages(Ljava/lang/String;)V -Lcom/ichi2/utils/NetworkUtils; -SPLcom/ichi2/utils/NetworkUtils;->()V -SPLcom/ichi2/utils/NetworkUtils;->()V -SPLcom/ichi2/utils/NetworkUtils;->getConnectivityManager()Landroid/net/ConnectivityManager; -SPLcom/ichi2/utils/NetworkUtils;->isActiveNetworkMetered()Z -SPLcom/ichi2/utils/NetworkUtils;->isOnline()Z +Lcom/ichi2/utils/LanguageUtilKt; +SPLcom/ichi2/utils/LanguageUtilKt;->getLanguageDebugInfo(Landroid/content/Context;)Lcom/ichi2/utils/LanguageDebugInfo; Lcom/ichi2/utils/Permissions; SPLcom/ichi2/utils/Permissions;->()V SPLcom/ichi2/utils/Permissions;->()V -SPLcom/ichi2/utils/Permissions;->arePermissionsDefinedInAnkiDroidManifest(Landroid/content/Context;[Ljava/lang/String;)Z -SPLcom/ichi2/utils/Permissions;->arePermissionsDefinedInManifest(Landroid/content/Context;Ljava/lang/String;[Ljava/lang/String;)Z -SPLcom/ichi2/utils/Permissions;->canManageExternalStorage(Landroid/content/Context;)Z SPLcom/ichi2/utils/Permissions;->getAppPrivateStartupPermissions()Ljava/util/List; SPLcom/ichi2/utils/Permissions;->getExternalManagerStorageAccessStartupPermissions()Ljava/util/List; SPLcom/ichi2/utils/Permissions;->getLegacyStorageAccessStartupPermissions()Ljava/util/List; -SPLcom/ichi2/utils/Permissions;->getPermissionsDefinedInManifest(Landroid/content/Context;Ljava/lang/String;)[Ljava/lang/String; -SPLcom/ichi2/utils/Permissions;->hasAllPermissions(Landroid/content/Context;Ljava/util/Collection;)Z -SPLcom/ichi2/utils/Permissions;->hasLegacyStorageAccessPermission(Landroid/content/Context;)Z -SPLcom/ichi2/utils/Permissions;->hasPermission(Landroid/content/Context;Ljava/lang/String;)Z -SPLcom/ichi2/utils/Permissions;->hasStorageReadAccessPermission(Landroid/content/Context;)Z -Lcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0; -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m$1()I -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/content/pm/PackageManager;Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Landroid/content/pm/ResolveInfo; -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/Insets;)I -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/graphics/Insets;)I -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/graphics/Insets;)I -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m()I -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m()Z -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m(J)Landroid/content/pm/PackageManager$PackageInfoFlags; -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m(J)Landroid/content/pm/PackageManager$ResolveInfoFlags; -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageManager;Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Landroid/content/pm/ResolveInfo; -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageManager;Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Ljava/util/List; -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageManager;Ljava/lang/String;Landroid/content/pm/PackageManager$PackageInfoFlags;)Landroid/content/pm/PackageInfo; -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Insets;)I -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;I)Landroid/graphics/Insets; -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowManager;)Landroid/view/WindowMetrics; -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowMetrics;)Landroid/graphics/Rect; -SPLcom/ichi2/utils/Permissions$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowMetrics;)Landroid/view/WindowInsets; -Lcom/ichi2/utils/Threads; -SPLcom/ichi2/utils/Threads;->()V -SPLcom/ichi2/utils/Threads;->()V -SPLcom/ichi2/utils/Threads;->isOnMainThread()Z Lcom/ichi2/utils/VersionUtils; SPLcom/ichi2/utils/VersionUtils;->()V SPLcom/ichi2/utils/VersionUtils;->()V SPLcom/ichi2/utils/VersionUtils;->getApplicationInstance()Landroid/content/Context; SPLcom/ichi2/utils/VersionUtils;->getPkgVersionName()Ljava/lang/String; Lcom/ichi2/utils/ViewUtilsKt; -SPLcom/ichi2/utils/ViewUtilsKt;->access$dpToPx(FLandroid/content/Context;)I SPLcom/ichi2/utils/ViewUtilsKt;->configureView(Landroid/view/View;Landroid/app/Activity;[Ljava/lang/String;Landroidx/draganddrop/DropHelper$Options;Landroidx/core/view/OnReceiveContentListener;)V -SPLcom/ichi2/utils/ViewUtilsKt;->dpToPx(FLandroid/content/Context;)I -SPLcom/ichi2/utils/ViewUtilsKt;->getDp(I)F +SPLcom/ichi2/utils/ViewUtilsKt;->isRtl(Landroid/content/res/Resources;)Z +SPLcom/ichi2/utils/ViewUtilsKt;->isRtl(Landroid/view/View;)Z Lcom/ichi2/utils/WebViewInfo; +SPLcom/ichi2/utils/WebViewInfo;->()V SPLcom/ichi2/utils/WebViewInfo;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;)V SPLcom/ichi2/utils/WebViewInfo;->getPackageName()Ljava/lang/String; SPLcom/ichi2/utils/WebViewInfo;->getUserAgent()Ljava/lang/String; SPLcom/ichi2/utils/WebViewInfo;->getVersionCode()Ljava/lang/Long; Lcom/ichi2/utils/WebViewUtilsKt; -SPLcom/ichi2/utils/WebViewUtilsKt;->checkWebViewVersionComponents(Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;)Ljava/lang/Integer; -SPLcom/ichi2/utils/WebViewUtilsKt;->checkWebviewVersion(Lcom/ichi2/anki/AnkiActivity;)V -SPLcom/ichi2/utils/WebViewUtilsKt;->getAndroidSystemWebViewPackageInfo$getPackage(Landroid/content/pm/PackageManager;Ljava/lang/String;)Landroid/content/pm/PackageInfo; -SPLcom/ichi2/utils/WebViewUtilsKt;->getAndroidSystemWebViewPackageInfo(Landroid/content/pm/PackageManager;)Landroid/content/pm/PackageInfo; -SPLcom/ichi2/utils/WebViewUtilsKt;->getChromeLikeWebViewVersionIfOutdated(Lcom/ichi2/anki/AnkiActivity;)Ljava/lang/Integer; +SPLcom/ichi2/utils/WebViewUtilsKt;->()V +SPLcom/ichi2/utils/WebViewUtilsKt;->checkWebViewVersionComponents-kAAzjZc(Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;I)Ljava/lang/Integer; +SPLcom/ichi2/utils/WebViewUtilsKt;->getChromeLikeWebViewVersionIfOutdated-3O3hvnY(Landroid/content/Context;I)Ljava/lang/Integer; SPLcom/ichi2/utils/WebViewUtilsKt;->getWebViewInfo(Landroid/content/Context;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLcom/ichi2/utils/WebViewUtilsKt;->getWebviewUserAgent(Landroid/content/Context;)Ljava/lang/String; SPLcom/ichi2/utils/WebViewUtilsKt;->setWebContentsDebuggingEnabled(Z)V +SPLcom/ichi2/utils/WebViewUtilsKt;->showDialogIfWebViewOutdated-DpGE9L0$default(Landroid/content/Context;ILkotlin/jvm/functions/Function0;ILjava/lang/Object;)Z +SPLcom/ichi2/utils/WebViewUtilsKt;->showDialogIfWebViewOutdated-DpGE9L0(Landroid/content/Context;ILkotlin/jvm/functions/Function0;)Z +Lcom/ichi2/utils/WebViewUtilsKt$$ExternalSyntheticLambda1; +SPLcom/ichi2/utils/WebViewUtilsKt$$ExternalSyntheticLambda1;->()V Lcom/ichi2/utils/WebViewUtilsKt$getWebViewInfo$2; SPLcom/ichi2/utils/WebViewUtilsKt$getWebViewInfo$2;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V SPLcom/ichi2/utils/WebViewUtilsKt$getWebViewInfo$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; SPLcom/ichi2/utils/WebViewUtilsKt$getWebViewInfo$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/utils/WebViewVersion; +SPLcom/ichi2/utils/WebViewVersion;->constructor-impl(I)I +Lcom/ichi2/utils/WebViewVersionCode; +SPLcom/ichi2/utils/WebViewVersionCode;->constructor-impl(J)J +Lcom/ichi2/widget/AddNoteWidget; +SPLcom/ichi2/widget/AddNoteWidget;->()V +Lcom/ichi2/widget/AddNoteWidget$Companion; +SPLcom/ichi2/widget/AddNoteWidget$Companion;->()V +SPLcom/ichi2/widget/AddNoteWidget$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/widget/AddNoteWidget$Companion;->updateWidgets-g9s5mYc(Landroid/content/Context;Landroid/appwidget/AppWidgetManager;[I)V +Lcom/ichi2/widget/AnalyticsWidgetProvider; +Lcom/ichi2/widget/AnkiDroidWidgetSmall; +Lcom/ichi2/widget/AppWidgetIds; +SPLcom/ichi2/widget/AppWidgetIds;->()V +SPLcom/ichi2/widget/AppWidgetIds;->constructor-impl([I)[I +Lcom/ichi2/widget/AppWidgetIds$Companion; +SPLcom/ichi2/widget/AppWidgetIds$Companion;->()V +SPLcom/ichi2/widget/AppWidgetIds$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/widget/DayRolloverAlarm; +SPLcom/ichi2/widget/DayRolloverAlarm;->()V +Lcom/ichi2/widget/DayRolloverAlarm$Companion; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->()V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->access$nextFutureCutoffMs(Lcom/ichi2/widget/DayRolloverAlarm$Companion;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->buildPendingIntent(Landroid/content/Context;Ljava/lang/String;)Landroid/app/PendingIntent; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->nextFutureCutoffMs$lambda$0(Lcom/ichi2/anki/libanki/Collection;)J +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->nextFutureCutoffMs(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->scheduleNext(Landroid/content/Context;)V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->scheduleNextInternal$lambda$0(JLandroid/app/PendingIntent;Landroid/app/AlarmManager;)Lkotlin/Unit; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->scheduleNextInternal(Landroid/content/Context;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/widget/DayRolloverAlarm$Companion$$ExternalSyntheticLambda0; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$$ExternalSyntheticLambda0;->(JLandroid/app/PendingIntent;)V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/widget/DayRolloverAlarm$Companion$$ExternalSyntheticLambda1; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$$ExternalSyntheticLambda1;->()V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/widget/DayRolloverAlarm$Companion$nextFutureCutoffMs$1; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$nextFutureCutoffMs$1;->(Lcom/ichi2/widget/DayRolloverAlarm$Companion;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$nextFutureCutoffMs$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNext$1; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNext$1;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNext$1;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNext$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNext$1;->invoke(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNext$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNextInternal$1; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNextInternal$1;->(Lcom/ichi2/widget/DayRolloverAlarm$Companion;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNextInternal$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/widget/DayRolloverAlarmKt; +SPLcom/ichi2/widget/DayRolloverAlarmKt;->access$launchCatchingIoWithReport(Lkotlinx/coroutines/CoroutineScope;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V +SPLcom/ichi2/widget/DayRolloverAlarmKt;->launchCatchingIoWithReport(Lkotlinx/coroutines/CoroutineScope;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$1; +SPLcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$1;->(Ljava/lang/String;Lkotlin/coroutines/Continuation;)V +Lcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$2; +SPLcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$2;->(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/widget/IdKt; +SPLcom/ichi2/widget/IdKt;->getAppWidgetIdsEx(Landroid/appwidget/AppWidgetManager;Landroid/content/ComponentName;)[I +SPLcom/ichi2/widget/IdKt;->updateAppWidget-DMUWGG8(Landroid/appwidget/AppWidgetManager;[ILandroid/widget/RemoteViews;)V +Lcom/ichi2/widget/WidgetAlarmKt; +SPLcom/ichi2/widget/WidgetAlarmKt;->getAppWidgetIds(Landroid/appwidget/AppWidgetManager;Landroid/content/Context;Ljava/lang/Class;)Ljava/util/List; +SPLcom/ichi2/widget/WidgetAlarmKt;->restoreRecurringAlarms(Landroid/content/Context;Ljava/util/List;)V +Lcom/ichi2/widget/WidgetNotificationScheduler; +SPLcom/ichi2/widget/WidgetNotificationScheduler;->()V +Lcom/ichi2/widget/WidgetNotificationScheduler$Companion; +SPLcom/ichi2/widget/WidgetNotificationScheduler$Companion;->()V +SPLcom/ichi2/widget/WidgetNotificationScheduler$Companion;->()V +SPLcom/ichi2/widget/WidgetNotificationScheduler$Companion;->register(Lcom/ichi2/widget/WidgetNotificationScheduler;)V +Lcom/ichi2/widget/WidgetNotificationSchedulerKt; +SPLcom/ichi2/widget/WidgetNotificationSchedulerKt;->access$setWidgetNotificationScheduler$p(Lcom/ichi2/widget/WidgetNotificationScheduler;)V +Lcom/ichi2/widget/WidgetPermissionReceiver; +SPLcom/ichi2/widget/WidgetPermissionReceiver;->()V +SPLcom/ichi2/widget/WidgetPermissionReceiver;->onReceiveBroadcast(Landroid/content/Context;Landroid/content/Intent;)V +Lcom/ichi2/widget/WidgetRepository; +SPLcom/ichi2/widget/WidgetRepository;->()V +Lcom/ichi2/widget/WidgetRepository$Companion; +SPLcom/ichi2/widget/WidgetRepository$Companion;->()V +SPLcom/ichi2/widget/WidgetRepository$Companion;->()V +SPLcom/ichi2/widget/WidgetRepository$Companion;->register(Lcom/ichi2/widget/WidgetRepository;)V +Lcom/ichi2/widget/WidgetRepositoryKt; +SPLcom/ichi2/widget/WidgetRepositoryKt;->access$setWidgetRepository$p(Lcom/ichi2/widget/WidgetRepository;)V +Lcom/ichi2/widget/WidgetStatus; +SPLcom/ichi2/widget/WidgetStatus;->()V +SPLcom/ichi2/widget/WidgetStatus;->()V +SPLcom/ichi2/widget/WidgetStatus;->register(Landroid/app/Application;Lcom/ichi2/anki/common/preferences/NotificationPreferences;Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/widget/WidgetUtilsKt; +SPLcom/ichi2/widget/WidgetUtilsKt;->getAppWidgetManager(Landroid/content/Context;)Landroid/appwidget/AppWidgetManager; +Lcom/ichi2/widget/cardanalysis/CardAnalysisWidget; +Lcom/ichi2/widget/deckpicker/DeckPickerWidget; +Ldev/androidbroadcast/vbpd/FragmentViewBindingProperty; +SPLdev/androidbroadcast/vbpd/FragmentViewBindingProperty;->(Lkotlin/jvm/functions/Function1;)V +SPLdev/androidbroadcast/vbpd/FragmentViewBindingProperty;->clear()V +SPLdev/androidbroadcast/vbpd/FragmentViewBindingProperty;->getValue(Landroidx/fragment/app/Fragment;Lkotlin/reflect/KProperty;)Landroidx/viewbinding/ViewBinding; +SPLdev/androidbroadcast/vbpd/FragmentViewBindingProperty;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; +SPLdev/androidbroadcast/vbpd/FragmentViewBindingProperty;->registerLifecycleCallbacksIfNeeded(Landroidx/fragment/app/Fragment;)V +Ldev/androidbroadcast/vbpd/FragmentViewBindingProperty$VBFragmentLifecycleCallback; +SPLdev/androidbroadcast/vbpd/FragmentViewBindingProperty$VBFragmentLifecycleCallback;->()V +SPLdev/androidbroadcast/vbpd/FragmentViewBindingProperty$VBFragmentLifecycleCallback;->(Ldev/androidbroadcast/vbpd/FragmentViewBindingProperty;Landroidx/fragment/app/Fragment;)V +SPLdev/androidbroadcast/vbpd/FragmentViewBindingProperty$VBFragmentLifecycleCallback;->getFragment()Landroidx/fragment/app/Fragment; +SPLdev/androidbroadcast/vbpd/FragmentViewBindingProperty$VBFragmentLifecycleCallback;->onFragmentViewDestroyed(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V Ldev/androidbroadcast/vbpd/FragmentViewBindings; SPLdev/androidbroadcast/vbpd/FragmentViewBindings;->fragmentViewBinding(Lkotlin/jvm/functions/Function1;)Ldev/androidbroadcast/vbpd/ViewBindingProperty; +Ldev/androidbroadcast/vbpd/LazyViewBindingProperty; +SPLdev/androidbroadcast/vbpd/LazyViewBindingProperty;->(Lkotlin/jvm/functions/Function1;)V +SPLdev/androidbroadcast/vbpd/LazyViewBindingProperty;->clear()V +SPLdev/androidbroadcast/vbpd/LazyViewBindingProperty;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Landroidx/viewbinding/ViewBinding; Ldev/androidbroadcast/vbpd/ViewBindingProperty; Ldev/androidbroadcast/vbpd/internal/VbpdUtilsKt; SPLdev/androidbroadcast/vbpd/internal/VbpdUtilsKt;->weakReference(Ljava/lang/Object;)Lkotlin/properties/ReadWriteProperty; +Ldev/androidbroadcast/vbpd/internal/VbpdUtilsKt$weakReference$1; +SPLdev/androidbroadcast/vbpd/internal/VbpdUtilsKt$weakReference$1;->(Ljava/lang/Object;)V +SPLdev/androidbroadcast/vbpd/internal/VbpdUtilsKt$weakReference$1;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; +Lio/github/oshai/kotlinlogging/DelegatingKLogger; +Lio/github/oshai/kotlinlogging/KLogger; +Lio/github/oshai/kotlinlogging/KLogger$DefaultImpls; +SPLio/github/oshai/kotlinlogging/KLogger$DefaultImpls;->at$default(Lio/github/oshai/kotlinlogging/KLogger;Lio/github/oshai/kotlinlogging/Level;Lio/github/oshai/kotlinlogging/Marker;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +SPLio/github/oshai/kotlinlogging/KLogger$DefaultImpls;->info(Lio/github/oshai/kotlinlogging/KLogger;Lkotlin/jvm/functions/Function0;)V +Lio/github/oshai/kotlinlogging/KLogger$info$1; +SPLio/github/oshai/kotlinlogging/KLogger$info$1;->(Lkotlin/jvm/functions/Function0;)V +SPLio/github/oshai/kotlinlogging/KLogger$info$1;->invoke(Lio/github/oshai/kotlinlogging/KLoggingEventBuilder;)V +SPLio/github/oshai/kotlinlogging/KLogger$info$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lio/github/oshai/kotlinlogging/KLoggingEventBuilder; +SPLio/github/oshai/kotlinlogging/KLoggingEventBuilder;->()V +SPLio/github/oshai/kotlinlogging/KLoggingEventBuilder;->getCause()Ljava/lang/Throwable; +SPLio/github/oshai/kotlinlogging/KLoggingEventBuilder;->getMessage()Ljava/lang/String; +SPLio/github/oshai/kotlinlogging/KLoggingEventBuilder;->getPayload()Ljava/util/Map; +SPLio/github/oshai/kotlinlogging/KLoggingEventBuilder;->setMessage(Ljava/lang/String;)V +Lio/github/oshai/kotlinlogging/KotlinLogging; +SPLio/github/oshai/kotlinlogging/KotlinLogging;->()V +SPLio/github/oshai/kotlinlogging/KotlinLogging;->()V +SPLio/github/oshai/kotlinlogging/KotlinLogging;->logger(Ljava/lang/String;)Lio/github/oshai/kotlinlogging/KLogger; +SPLio/github/oshai/kotlinlogging/KotlinLogging;->logger(Lkotlin/jvm/functions/Function0;)Lio/github/oshai/kotlinlogging/KLogger; +Lio/github/oshai/kotlinlogging/Level; +SPLio/github/oshai/kotlinlogging/Level;->$values()[Lio/github/oshai/kotlinlogging/Level; +SPLio/github/oshai/kotlinlogging/Level;->()V +SPLio/github/oshai/kotlinlogging/Level;->(Ljava/lang/String;IILjava/lang/String;)V +SPLio/github/oshai/kotlinlogging/Level;->values()[Lio/github/oshai/kotlinlogging/Level; +Lio/github/oshai/kotlinlogging/internal/KLoggerFactory; +SPLio/github/oshai/kotlinlogging/internal/KLoggerFactory;->()V +SPLio/github/oshai/kotlinlogging/internal/KLoggerFactory;->()V +SPLio/github/oshai/kotlinlogging/internal/KLoggerFactory;->logger$kotlin_logging(Ljava/lang/String;)Lio/github/oshai/kotlinlogging/KLogger; +Lio/github/oshai/kotlinlogging/internal/KLoggerNameResolver; +SPLio/github/oshai/kotlinlogging/internal/KLoggerNameResolver;->()V +SPLio/github/oshai/kotlinlogging/internal/KLoggerNameResolver;->()V +SPLio/github/oshai/kotlinlogging/internal/KLoggerNameResolver;->name$kotlin_logging(Lkotlin/jvm/functions/Function0;)Ljava/lang/String; +Lio/github/oshai/kotlinlogging/internal/MessageInvokerKt; +SPLio/github/oshai/kotlinlogging/internal/MessageInvokerKt;->toStringSafe(Lkotlin/jvm/functions/Function0;)Ljava/lang/String; +Lio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger; +SPLio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger;->(Lorg/slf4j/Logger;)V +SPLio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger;->at(Lio/github/oshai/kotlinlogging/Level;Lio/github/oshai/kotlinlogging/Marker;Lkotlin/jvm/functions/Function1;)V +SPLio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger;->getUnderlyingLogger()Lorg/slf4j/Logger; +SPLio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger;->isLoggingEnabledFor(Lio/github/oshai/kotlinlogging/Level;Lio/github/oshai/kotlinlogging/Marker;)Z +SPLio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger;->logWithoutPayload(Lio/github/oshai/kotlinlogging/KLoggingEventBuilder;Lio/github/oshai/kotlinlogging/Level;Lio/github/oshai/kotlinlogging/Marker;)V +Lio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger$WhenMappings; +SPLio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger$WhenMappings;->()V +Lio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLogger; +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLogger;->()V +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLogger;->info(Lkotlin/jvm/functions/Function0;)V +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLogger;->isLoggingEnabledFor(Lorg/slf4j/Logger;Lio/github/oshai/kotlinlogging/Level;Lio/github/oshai/kotlinlogging/Marker;)Z +Lio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLogger$WhenMappings; +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLogger$WhenMappings;->()V +Lio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLoggerFactory; +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLoggerFactory;->()V +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLoggerFactory;->()V +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLoggerFactory;->jLogger$kotlin_logging(Ljava/lang/String;)Lorg/slf4j/Logger; +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLoggerFactory;->wrapJLogger$kotlin_logging(Lorg/slf4j/Logger;)Lio/github/oshai/kotlinlogging/KLogger; Lj$/util/DesugarTimeZone; SPLj$/util/DesugarTimeZone;->getTimeZone(Ljava/lang/String;)Ljava/util/TimeZone; Lkotlin/Function; +Lkotlin/InitializedLazyImpl; +SPLkotlin/InitializedLazyImpl;->(Ljava/lang/Object;)V Lkotlin/Lazy; Lkotlin/LazyKt; Lkotlin/LazyKt__LazyJVMKt; @@ -9648,6 +11741,7 @@ SPLkotlin/LazyKt__LazyJVMKt;->lazy(Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy Lkotlin/LazyKt__LazyJVMKt$WhenMappings; SPLkotlin/LazyKt__LazyJVMKt$WhenMappings;->()V Lkotlin/LazyKt__LazyKt; +SPLkotlin/LazyKt__LazyKt;->lazyOf(Ljava/lang/Object;)Lkotlin/Lazy; Lkotlin/LazyThreadSafetyMode; SPLkotlin/LazyThreadSafetyMode;->$values()[Lkotlin/LazyThreadSafetyMode; SPLkotlin/LazyThreadSafetyMode;->()V @@ -9661,6 +11755,7 @@ SPLkotlin/Pair;->component1()Ljava/lang/Object; SPLkotlin/Pair;->component2()Ljava/lang/Object; SPLkotlin/Pair;->getFirst()Ljava/lang/Object; SPLkotlin/Pair;->getSecond()Ljava/lang/Object; +SPLkotlin/Pair;->hashCode()I Lkotlin/Result; SPLkotlin/Result;->()V SPLkotlin/Result;->constructor-impl(Ljava/lang/Object;)Ljava/lang/Object; @@ -9689,16 +11784,45 @@ SPLkotlin/SynchronizedLazyImpl;->getValue()Ljava/lang/Object; SPLkotlin/SynchronizedLazyImpl;->isInitialized()Z Lkotlin/TuplesKt; SPLkotlin/TuplesKt;->to(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair; +Lkotlin/UByte; +SPLkotlin/UByte;->()V Lkotlin/UByte$$ExternalSyntheticBackport0; +SPLkotlin/UByte$$ExternalSyntheticBackport0;->m(JJ)I SPLkotlin/UByte$$ExternalSyntheticBackport0;->m(Ljava/lang/Object;)Ljava/util/List; SPLkotlin/UByte$$ExternalSyntheticBackport0;->m(Ljava/lang/Object;)V SPLkotlin/UByte$$ExternalSyntheticBackport0;->m([Ljava/lang/Object;)Ljava/util/List; +Lkotlin/UByte$Companion; +SPLkotlin/UByte$Companion;->()V +SPLkotlin/UByte$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/UByteArray; +Lkotlin/UInt; +SPLkotlin/UInt;->()V +Lkotlin/UInt$Companion; +SPLkotlin/UInt$Companion;->()V +SPLkotlin/UInt$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/UIntArray; +Lkotlin/ULong; +SPLkotlin/ULong;->()V +SPLkotlin/ULong;->constructor-impl(J)J +Lkotlin/ULong$Companion; +SPLkotlin/ULong$Companion;->()V +SPLkotlin/ULong$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/ULongArray; Lkotlin/UNINITIALIZED_VALUE; SPLkotlin/UNINITIALIZED_VALUE;->()V SPLkotlin/UNINITIALIZED_VALUE;->()V +Lkotlin/UShort; +SPLkotlin/UShort;->()V +Lkotlin/UShort$Companion; +SPLkotlin/UShort$Companion;->()V +SPLkotlin/UShort$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/UShortArray; Lkotlin/Unit; SPLkotlin/Unit;->()V SPLkotlin/Unit;->()V +Lkotlin/annotation/MustBeDocumented; +Lkotlin/annotation/Retention; +Lkotlin/annotation/Target; Lkotlin/collections/AbstractCollection; SPLkotlin/collections/AbstractCollection;->()V SPLkotlin/collections/AbstractCollection;->size()I @@ -9710,6 +11834,7 @@ Lkotlin/collections/AbstractList$Companion; SPLkotlin/collections/AbstractList$Companion;->()V SPLkotlin/collections/AbstractList$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLkotlin/collections/AbstractList$Companion;->checkElementIndex$kotlin_stdlib(II)V +SPLkotlin/collections/AbstractList$Companion;->newCapacity$kotlin_stdlib(II)I Lkotlin/collections/AbstractList$IteratorImpl; SPLkotlin/collections/AbstractList$IteratorImpl;->(Lkotlin/collections/AbstractList;)V SPLkotlin/collections/AbstractList$IteratorImpl;->hasNext()Z @@ -9742,7 +11867,6 @@ SPLkotlin/collections/ArrayDeque;->removeAt(I)Ljava/lang/Object; SPLkotlin/collections/ArrayDeque;->removeFirst()Ljava/lang/Object; SPLkotlin/collections/ArrayDeque;->removeFirstOrNull()Ljava/lang/Object; SPLkotlin/collections/ArrayDeque;->removeLast()Ljava/lang/Object; -SPLkotlin/collections/ArrayDeque;->removeLastOrNull()Ljava/lang/Object; Lkotlin/collections/ArrayDeque$Companion; SPLkotlin/collections/ArrayDeque$Companion;->()V SPLkotlin/collections/ArrayDeque$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -9757,20 +11881,19 @@ SPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto$default([Ljava/lang/Obje SPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([I[IIII)[I SPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([Ljava/lang/Object;[Ljava/lang/Object;III)[Ljava/lang/Object; SPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyOfRange([Ljava/lang/Object;II)[Ljava/lang/Object; +SPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill$default([JJIIILjava/lang/Object;)V SPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill$default([Ljava/lang/Object;Ljava/lang/Object;IIILjava/lang/Object;)V +SPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill([JJII)V SPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill([Ljava/lang/Object;Ljava/lang/Object;II)V SPLkotlin/collections/ArraysKt___ArraysJvmKt;->sortWith([Ljava/lang/Object;Ljava/util/Comparator;)V Lkotlin/collections/ArraysKt___ArraysKt; -SPLkotlin/collections/ArraysKt___ArraysKt;->contains([Ljava/lang/Object;Ljava/lang/Object;)Z SPLkotlin/collections/ArraysKt___ArraysKt;->filterNotNull([Ljava/lang/Object;)Ljava/util/List; SPLkotlin/collections/ArraysKt___ArraysKt;->filterNotNullTo([Ljava/lang/Object;Ljava/util/Collection;)Ljava/util/Collection; SPLkotlin/collections/ArraysKt___ArraysKt;->getLastIndex([Ljava/lang/Object;)I -SPLkotlin/collections/ArraysKt___ArraysKt;->indexOf([Ljava/lang/Object;Ljava/lang/Object;)I SPLkotlin/collections/ArraysKt___ArraysKt;->sortedArrayWith([Ljava/lang/Object;Ljava/util/Comparator;)[Ljava/lang/Object; SPLkotlin/collections/ArraysKt___ArraysKt;->sortedWith([Ljava/lang/Object;Ljava/util/Comparator;)Ljava/util/List; SPLkotlin/collections/ArraysKt___ArraysKt;->toCollection([Ljava/lang/Object;Ljava/util/Collection;)Ljava/util/Collection; SPLkotlin/collections/ArraysKt___ArraysKt;->toList([Ljava/lang/Object;)Ljava/util/List; -SPLkotlin/collections/ArraysKt___ArraysKt;->toMutableList([Ljava/lang/Object;)Ljava/util/List; SPLkotlin/collections/ArraysKt___ArraysKt;->toSet([Ljava/lang/Object;)Ljava/util/Set; Lkotlin/collections/ArraysUtilJVM; SPLkotlin/collections/ArraysUtilJVM;->asList([Ljava/lang/Object;)Ljava/util/List; @@ -9781,12 +11904,14 @@ SPLkotlin/collections/CollectionsKt__CollectionsJVMKt;->copyToArrayOfAny([Ljava/ SPLkotlin/collections/CollectionsKt__CollectionsJVMKt;->createListBuilder()Ljava/util/List; SPLkotlin/collections/CollectionsKt__CollectionsJVMKt;->listOf(Ljava/lang/Object;)Ljava/util/List; Lkotlin/collections/CollectionsKt__CollectionsKt; -SPLkotlin/collections/CollectionsKt__CollectionsKt;->asCollection$default([Ljava/lang/Object;ZILjava/lang/Object;)Ljava/util/Collection; SPLkotlin/collections/CollectionsKt__CollectionsKt;->asCollection([Ljava/lang/Object;Z)Ljava/util/Collection; SPLkotlin/collections/CollectionsKt__CollectionsKt;->emptyList()Ljava/util/List; SPLkotlin/collections/CollectionsKt__CollectionsKt;->getLastIndex(Ljava/util/List;)I SPLkotlin/collections/CollectionsKt__CollectionsKt;->listOf([Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt__CollectionsKt;->listOfNotNull(Ljava/lang/Object;)Ljava/util/List; SPLkotlin/collections/CollectionsKt__CollectionsKt;->listOfNotNull([Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt__CollectionsKt;->mutableListOf([Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt__CollectionsKt;->optimizeReadOnlyList(Ljava/util/List;)Ljava/util/List; Lkotlin/collections/CollectionsKt__IterablesKt; SPLkotlin/collections/CollectionsKt__IterablesKt;->collectionSizeOrDefault(Ljava/lang/Iterable;I)I SPLkotlin/collections/CollectionsKt__IterablesKt;->collectionSizeOrNull(Ljava/lang/Iterable;)Ljava/lang/Integer; @@ -9798,10 +11923,12 @@ SPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->addAll(Ljava/util/Co SPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->addAll(Ljava/util/Collection;[Ljava/lang/Object;)Z SPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->filterInPlace$CollectionsKt__MutableCollectionsKt(Ljava/util/List;Lkotlin/jvm/functions/Function1;Z)Z SPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->removeAll(Ljava/util/List;Lkotlin/jvm/functions/Function1;)Z +SPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->removeLastOrNull(Ljava/util/List;)Ljava/lang/Object; Lkotlin/collections/CollectionsKt__ReversedViewsKt; Lkotlin/collections/CollectionsKt___CollectionsJvmKt; Lkotlin/collections/CollectionsKt___CollectionsKt; SPLkotlin/collections/CollectionsKt___CollectionsKt;->any(Ljava/lang/Iterable;)Z +SPLkotlin/collections/CollectionsKt___CollectionsKt;->distinct(Ljava/lang/Iterable;)Ljava/util/List; SPLkotlin/collections/CollectionsKt___CollectionsKt;->joinTo$default(Ljava/lang/Iterable;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Appendable; SPLkotlin/collections/CollectionsKt___CollectionsKt;->joinTo(Ljava/lang/Iterable;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/Appendable; SPLkotlin/collections/CollectionsKt___CollectionsKt;->joinToString$default(Ljava/lang/Iterable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/String; @@ -9815,7 +11942,9 @@ SPLkotlin/collections/CollectionsKt___CollectionsKt;->singleOrNull(Ljava/util/Li SPLkotlin/collections/CollectionsKt___CollectionsKt;->sortedWith(Ljava/lang/Iterable;Ljava/util/Comparator;)Ljava/util/List; SPLkotlin/collections/CollectionsKt___CollectionsKt;->toCollection(Ljava/lang/Iterable;Ljava/util/Collection;)Ljava/util/Collection; SPLkotlin/collections/CollectionsKt___CollectionsKt;->toList(Ljava/lang/Iterable;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableList(Ljava/lang/Iterable;)Ljava/util/List; SPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableList(Ljava/util/Collection;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableSet(Ljava/lang/Iterable;)Ljava/util/Set; SPLkotlin/collections/CollectionsKt___CollectionsKt;->toSet(Ljava/lang/Iterable;)Ljava/util/Set; Lkotlin/collections/EmptyIterator; SPLkotlin/collections/EmptyIterator;->()V @@ -9852,6 +11981,9 @@ SPLkotlin/collections/IndexedValue;->getValue()Ljava/lang/Object; Lkotlin/collections/MapsKt; Lkotlin/collections/MapsKt__MapWithDefaultKt; Lkotlin/collections/MapsKt__MapsJVMKt; +SPLkotlin/collections/MapsKt__MapsJVMKt;->build(Ljava/util/Map;)Ljava/util/Map; +SPLkotlin/collections/MapsKt__MapsJVMKt;->createMapBuilder()Ljava/util/Map; +SPLkotlin/collections/MapsKt__MapsJVMKt;->createMapBuilder(I)Ljava/util/Map; SPLkotlin/collections/MapsKt__MapsJVMKt;->mapCapacity(I)I SPLkotlin/collections/MapsKt__MapsJVMKt;->mapOf(Lkotlin/Pair;)Ljava/util/Map; Lkotlin/collections/MapsKt__MapsKt; @@ -9899,6 +12031,7 @@ SPLkotlin/collections/builders/ListBuilder$Companion;->()V SPLkotlin/collections/builders/ListBuilder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/collections/builders/ListBuilderKt; SPLkotlin/collections/builders/ListBuilderKt;->arrayOfUninitializedElements(I)[Ljava/lang/Object; +SPLkotlin/collections/builders/ListBuilderKt;->copyOfUninitializedElements([Ljava/lang/Object;I)[Ljava/lang/Object; Lkotlin/collections/builders/MapBuilder; SPLkotlin/collections/builders/MapBuilder;->()V SPLkotlin/collections/builders/MapBuilder;->()V @@ -9910,15 +12043,24 @@ SPLkotlin/collections/builders/MapBuilder;->access$getLength$p(Lkotlin/collectio SPLkotlin/collections/builders/MapBuilder;->access$getModCount$p(Lkotlin/collections/builders/MapBuilder;)I SPLkotlin/collections/builders/MapBuilder;->access$getPresenceArray$p(Lkotlin/collections/builders/MapBuilder;)[I SPLkotlin/collections/builders/MapBuilder;->addKey$kotlin_stdlib(Ljava/lang/Object;)I +SPLkotlin/collections/builders/MapBuilder;->allocateValuesArray()[Ljava/lang/Object; SPLkotlin/collections/builders/MapBuilder;->build()Ljava/util/Map; SPLkotlin/collections/builders/MapBuilder;->checkIsMutable$kotlin_stdlib()V +SPLkotlin/collections/builders/MapBuilder;->ensureCapacity(I)V +SPLkotlin/collections/builders/MapBuilder;->ensureExtraCapacity(I)V +SPLkotlin/collections/builders/MapBuilder;->findKey(Ljava/lang/Object;)I +SPLkotlin/collections/builders/MapBuilder;->get(Ljava/lang/Object;)Ljava/lang/Object; SPLkotlin/collections/builders/MapBuilder;->getCapacity$kotlin_stdlib()I SPLkotlin/collections/builders/MapBuilder;->getHashSize()I SPLkotlin/collections/builders/MapBuilder;->getSize()I SPLkotlin/collections/builders/MapBuilder;->hash(Ljava/lang/Object;)I SPLkotlin/collections/builders/MapBuilder;->isEmpty()Z SPLkotlin/collections/builders/MapBuilder;->keysIterator$kotlin_stdlib()Lkotlin/collections/builders/MapBuilder$KeysItr; +SPLkotlin/collections/builders/MapBuilder;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlin/collections/builders/MapBuilder;->putRehash(I)Z SPLkotlin/collections/builders/MapBuilder;->registerModification()V +SPLkotlin/collections/builders/MapBuilder;->rehash(I)V +SPLkotlin/collections/builders/MapBuilder;->shouldCompact(I)Z SPLkotlin/collections/builders/MapBuilder;->size()I Lkotlin/collections/builders/MapBuilder$Companion; SPLkotlin/collections/builders/MapBuilder$Companion;->()V @@ -9980,7 +12122,7 @@ Lkotlin/coroutines/Continuation; Lkotlin/coroutines/ContinuationInterceptor; SPLkotlin/coroutines/ContinuationInterceptor;->()V Lkotlin/coroutines/ContinuationInterceptor$DefaultImpls; -SPLkotlin/coroutines/ContinuationInterceptor$DefaultImpls;->get(Lkotlin/coroutines/ContinuationInterceptor;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +HSPLkotlin/coroutines/ContinuationInterceptor$DefaultImpls;->get(Lkotlin/coroutines/ContinuationInterceptor;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; SPLkotlin/coroutines/ContinuationInterceptor$DefaultImpls;->minusKey(Lkotlin/coroutines/ContinuationInterceptor;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; Lkotlin/coroutines/ContinuationInterceptor$Key; SPLkotlin/coroutines/ContinuationInterceptor$Key;->()V @@ -9989,8 +12131,7 @@ Lkotlin/coroutines/ContinuationKt; SPLkotlin/coroutines/ContinuationKt;->startCoroutine(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V Lkotlin/coroutines/CoroutineContext; Lkotlin/coroutines/CoroutineContext$DefaultImpls; -SPLkotlin/coroutines/CoroutineContext$DefaultImpls;->$r8$lambda$IMQRUXJxEerD0hyYDf50b5mQ5Cc(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext$Element;)Lkotlin/coroutines/CoroutineContext; -SPLkotlin/coroutines/CoroutineContext$DefaultImpls;->plus$lambda$0(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext$Element;)Lkotlin/coroutines/CoroutineContext; +HSPLkotlin/coroutines/CoroutineContext$DefaultImpls;->plus$lambda$0(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext$Element;)Lkotlin/coroutines/CoroutineContext; SPLkotlin/coroutines/CoroutineContext$DefaultImpls;->plus(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; Lkotlin/coroutines/CoroutineContext$DefaultImpls$$ExternalSyntheticLambda0; SPLkotlin/coroutines/CoroutineContext$DefaultImpls$$ExternalSyntheticLambda0;->()V @@ -10121,10 +12262,15 @@ Lkotlin/jvm/functions/Function9; Lkotlin/jvm/internal/AdaptedFunctionReference; SPLkotlin/jvm/internal/AdaptedFunctionReference;->(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V SPLkotlin/jvm/internal/AdaptedFunctionReference;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +Lkotlin/jvm/internal/BooleanCompanionObject; +SPLkotlin/jvm/internal/BooleanCompanionObject;->()V +SPLkotlin/jvm/internal/BooleanCompanionObject;->()V +Lkotlin/jvm/internal/ByteCompanionObject; +SPLkotlin/jvm/internal/ByteCompanionObject;->()V +SPLkotlin/jvm/internal/ByteCompanionObject;->()V Lkotlin/jvm/internal/CallableReference; SPLkotlin/jvm/internal/CallableReference;->()V SPLkotlin/jvm/internal/CallableReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Z)V -SPLkotlin/jvm/internal/CallableReference;->getBoundReceiver()Ljava/lang/Object; SPLkotlin/jvm/internal/CallableReference;->getName()Ljava/lang/String; SPLkotlin/jvm/internal/CallableReference;->getOwner()Lkotlin/reflect/KDeclarationContainer; SPLkotlin/jvm/internal/CallableReference;->getSignature()Ljava/lang/String; @@ -10132,8 +12278,17 @@ Lkotlin/jvm/internal/CallableReference$NoReceiver; SPLkotlin/jvm/internal/CallableReference$NoReceiver;->()V SPLkotlin/jvm/internal/CallableReference$NoReceiver;->()V SPLkotlin/jvm/internal/CallableReference$NoReceiver;->access$000()Lkotlin/jvm/internal/CallableReference$NoReceiver; +Lkotlin/jvm/internal/CharCompanionObject; +SPLkotlin/jvm/internal/CharCompanionObject;->()V +SPLkotlin/jvm/internal/CharCompanionObject;->()V Lkotlin/jvm/internal/ClassBasedDeclarationContainer; Lkotlin/jvm/internal/DefaultConstructorMarker; +Lkotlin/jvm/internal/DoubleCompanionObject; +SPLkotlin/jvm/internal/DoubleCompanionObject;->()V +SPLkotlin/jvm/internal/DoubleCompanionObject;->()V +Lkotlin/jvm/internal/FloatCompanionObject; +SPLkotlin/jvm/internal/FloatCompanionObject;->()V +SPLkotlin/jvm/internal/FloatCompanionObject;->()V Lkotlin/jvm/internal/FunctionAdapter; Lkotlin/jvm/internal/FunctionBase; Lkotlin/jvm/internal/FunctionReference; @@ -10142,8 +12297,11 @@ SPLkotlin/jvm/internal/FunctionReference;->getArity()I Lkotlin/jvm/internal/FunctionReferenceImpl; SPLkotlin/jvm/internal/FunctionReferenceImpl;->(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V SPLkotlin/jvm/internal/FunctionReferenceImpl;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +Lkotlin/jvm/internal/IntCompanionObject; +SPLkotlin/jvm/internal/IntCompanionObject;->()V +SPLkotlin/jvm/internal/IntCompanionObject;->()V Lkotlin/jvm/internal/Intrinsics; -SPLkotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z +HSPLkotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z SPLkotlin/jvm/internal/Intrinsics;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V SPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;)V SPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V @@ -10152,8 +12310,15 @@ SPLkotlin/jvm/internal/Intrinsics;->checkNotNullParameter(Ljava/lang/Object;Ljav SPLkotlin/jvm/internal/Intrinsics;->checkParameterIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V SPLkotlin/jvm/internal/Intrinsics;->compare(II)I Lkotlin/jvm/internal/Intrinsics$Kotlin; +Lkotlin/jvm/internal/KTypeBase; +Lkotlin/jvm/internal/KotlinGenericDeclaration; Lkotlin/jvm/internal/Lambda; SPLkotlin/jvm/internal/Lambda;->(I)V +Lkotlin/jvm/internal/LongCompanionObject; +SPLkotlin/jvm/internal/LongCompanionObject;->()V +SPLkotlin/jvm/internal/LongCompanionObject;->()V +Lkotlin/jvm/internal/MagicApiIntrinsics; +SPLkotlin/jvm/internal/MagicApiIntrinsics;->voidMagicApiCall(Ljava/lang/Object;)V Lkotlin/jvm/internal/MutablePropertyReference; SPLkotlin/jvm/internal/MutablePropertyReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V Lkotlin/jvm/internal/MutablePropertyReference1; @@ -10168,15 +12333,20 @@ Lkotlin/jvm/internal/PropertyReference1Impl; SPLkotlin/jvm/internal/PropertyReference1Impl;->(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V Lkotlin/jvm/internal/Ref$BooleanRef; SPLkotlin/jvm/internal/Ref$BooleanRef;->()V +Lkotlin/jvm/internal/Ref$IntRef; +SPLkotlin/jvm/internal/Ref$IntRef;->()V Lkotlin/jvm/internal/Ref$ObjectRef; SPLkotlin/jvm/internal/Ref$ObjectRef;->()V Lkotlin/jvm/internal/Reflection; SPLkotlin/jvm/internal/Reflection;->()V SPLkotlin/jvm/internal/Reflection;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/KClass; SPLkotlin/jvm/internal/Reflection;->mutableProperty1(Lkotlin/jvm/internal/MutablePropertyReference1;)Lkotlin/reflect/KMutableProperty1; -SPLkotlin/jvm/internal/Reflection;->property1(Lkotlin/jvm/internal/PropertyReference1;)Lkotlin/reflect/KProperty1; +SPLkotlin/jvm/internal/Reflection;->nullableTypeOf(Ljava/lang/Class;)Lkotlin/reflect/KType; Lkotlin/jvm/internal/ReflectionFactory; SPLkotlin/jvm/internal/ReflectionFactory;->()V +Lkotlin/jvm/internal/ShortCompanionObject; +SPLkotlin/jvm/internal/ShortCompanionObject;->()V +SPLkotlin/jvm/internal/ShortCompanionObject;->()V Lkotlin/jvm/internal/SpreadBuilder; SPLkotlin/jvm/internal/SpreadBuilder;->(I)V SPLkotlin/jvm/internal/SpreadBuilder;->addSpread(Ljava/lang/Object;)V @@ -10217,9 +12387,11 @@ Lkotlin/random/Random$Default; SPLkotlin/random/Random$Default;->()V SPLkotlin/random/Random$Default;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLkotlin/random/Random$Default;->nextInt(I)I +SPLkotlin/random/Random$Default;->nextInt(II)I Lkotlin/random/jdk8/PlatformThreadLocalRandom; SPLkotlin/random/jdk8/PlatformThreadLocalRandom;->()V SPLkotlin/random/jdk8/PlatformThreadLocalRandom;->getImpl()Ljava/util/Random; +SPLkotlin/random/jdk8/PlatformThreadLocalRandom;->nextInt(II)I Lkotlin/ranges/ClosedRange; Lkotlin/ranges/IntProgression; SPLkotlin/ranges/IntProgression;->()V @@ -10255,6 +12427,10 @@ Lkotlin/reflect/KMutableProperty; Lkotlin/reflect/KMutableProperty1; Lkotlin/reflect/KProperty; Lkotlin/reflect/KProperty1; +Lkotlin/reflect/KType; +Lkotlin/reflect/full/KClassifiers; +SPLkotlin/reflect/full/KClassifiers;->createTypeImpl$default(Lkotlin/reflect/KClassifier;Ljava/util/List;ZLjava/util/List;Lkotlin/reflect/KClass;ILjava/lang/Object;)Lkotlin/reflect/jvm/internal/types/AbstractKType; +SPLkotlin/reflect/full/KClassifiers;->createTypeImpl(Lkotlin/reflect/KClassifier;Ljava/util/List;ZLjava/util/List;Lkotlin/reflect/KClass;)Lkotlin/reflect/jvm/internal/types/AbstractKType; Lkotlin/reflect/jvm/internal/CacheByClass; SPLkotlin/reflect/jvm/internal/CacheByClass;->()V Lkotlin/reflect/jvm/internal/CacheByClassKt; @@ -10262,8 +12438,11 @@ SPLkotlin/reflect/jvm/internal/CacheByClassKt;->()V SPLkotlin/reflect/jvm/internal/CacheByClassKt;->createCache(Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/CacheByClass; Lkotlin/reflect/jvm/internal/CachesKt; SPLkotlin/reflect/jvm/internal/CachesKt;->()V +SPLkotlin/reflect/jvm/internal/CachesKt;->CACHE_FOR_NULLABLE_BASE_CLASSIFIERS$lambda$0(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/types/AbstractKType; SPLkotlin/reflect/jvm/internal/CachesKt;->K_CLASS_CACHE$lambda$0(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/KClassImpl; SPLkotlin/reflect/jvm/internal/CachesKt;->accessor$CachesKt$lambda0(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/KClassImpl; +SPLkotlin/reflect/jvm/internal/CachesKt;->accessor$CachesKt$lambda3(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/types/AbstractKType; +SPLkotlin/reflect/jvm/internal/CachesKt;->getOrCreateKType(Ljava/lang/Class;Ljava/util/List;Z)Lkotlin/reflect/KType; SPLkotlin/reflect/jvm/internal/CachesKt;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/KClassImpl; Lkotlin/reflect/jvm/internal/CachesKt$$Lambda$0; SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$0;->()V @@ -10278,6 +12457,7 @@ SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$2;->()V Lkotlin/reflect/jvm/internal/CachesKt$$Lambda$3; SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$3;->()V SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$3;->()V +SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/CachesKt$$Lambda$4; SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$4;->()V SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$4;->()V @@ -10290,50 +12470,13 @@ Lkotlin/reflect/jvm/internal/ComputableClassValue; SPLkotlin/reflect/jvm/internal/ComputableClassValue;->(Lkotlin/jvm/functions/Function1;)V SPLkotlin/reflect/jvm/internal/ComputableClassValue;->computeValue(Ljava/lang/Class;)Ljava/lang/Object; SPLkotlin/reflect/jvm/internal/ComputableClassValue;->computeValue(Ljava/lang/Class;)Ljava/lang/ref/SoftReference; -Lkotlin/reflect/jvm/internal/DescriptorKCallable; -SPLkotlin/reflect/jvm/internal/DescriptorKCallable;->()V -Lkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$0; -SPLkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$0;->(Lkotlin/reflect/jvm/internal/DescriptorKCallable;)V -Lkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$1; -SPLkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$1;->(Lkotlin/reflect/jvm/internal/DescriptorKCallable;)V -Lkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$2; -SPLkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$2;->(Lkotlin/reflect/jvm/internal/DescriptorKCallable;)V -Lkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$3; -SPLkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$3;->(Lkotlin/reflect/jvm/internal/DescriptorKCallable;)V -Lkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$4; -SPLkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$4;->(Lkotlin/reflect/jvm/internal/DescriptorKCallable;)V -Lkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$5; -SPLkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$5;->(Lkotlin/reflect/jvm/internal/DescriptorKCallable;)V -Lkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$6; -SPLkotlin/reflect/jvm/internal/DescriptorKCallable$$Lambda$6;->(Lkotlin/reflect/jvm/internal/DescriptorKCallable;)V -Lkotlin/reflect/jvm/internal/DescriptorKMutableProperty1; -SPLkotlin/reflect/jvm/internal/DescriptorKMutableProperty1;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V -Lkotlin/reflect/jvm/internal/DescriptorKMutableProperty1$$Lambda$0; -SPLkotlin/reflect/jvm/internal/DescriptorKMutableProperty1$$Lambda$0;->(Lkotlin/reflect/jvm/internal/DescriptorKMutableProperty1;)V -Lkotlin/reflect/jvm/internal/DescriptorKProperty; -SPLkotlin/reflect/jvm/internal/DescriptorKProperty;->()V -SPLkotlin/reflect/jvm/internal/DescriptorKProperty;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V -SPLkotlin/reflect/jvm/internal/DescriptorKProperty;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Lkotlin/reflect/jvm/internal/impl/descriptors/PropertyDescriptor;Ljava/lang/Object;)V -Lkotlin/reflect/jvm/internal/DescriptorKProperty$$Lambda$0; -SPLkotlin/reflect/jvm/internal/DescriptorKProperty$$Lambda$0;->(Lkotlin/reflect/jvm/internal/DescriptorKProperty;)V -Lkotlin/reflect/jvm/internal/DescriptorKProperty$$Lambda$1; -SPLkotlin/reflect/jvm/internal/DescriptorKProperty$$Lambda$1;->(Lkotlin/reflect/jvm/internal/DescriptorKProperty;)V -Lkotlin/reflect/jvm/internal/DescriptorKProperty$Companion; -SPLkotlin/reflect/jvm/internal/DescriptorKProperty$Companion;->()V -SPLkotlin/reflect/jvm/internal/DescriptorKProperty$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -Lkotlin/reflect/jvm/internal/DescriptorKProperty1; -SPLkotlin/reflect/jvm/internal/DescriptorKProperty1;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V -Lkotlin/reflect/jvm/internal/DescriptorKProperty1$$Lambda$0; -SPLkotlin/reflect/jvm/internal/DescriptorKProperty1$$Lambda$0;->(Lkotlin/reflect/jvm/internal/DescriptorKProperty1;)V -Lkotlin/reflect/jvm/internal/DescriptorKProperty1$$Lambda$1; -SPLkotlin/reflect/jvm/internal/DescriptorKProperty1$$Lambda$1;->(Lkotlin/reflect/jvm/internal/DescriptorKProperty1;)V Lkotlin/reflect/jvm/internal/KClassImpl; SPLkotlin/reflect/jvm/internal/KClassImpl;->()V SPLkotlin/reflect/jvm/internal/KClassImpl;->(Ljava/lang/Class;)V -SPLkotlin/reflect/jvm/internal/KClassImpl;->access$getClassId(Lkotlin/reflect/jvm/internal/KClassImpl;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; SPLkotlin/reflect/jvm/internal/KClassImpl;->accessor$KClassImpl$lambda0(Lkotlin/reflect/jvm/internal/KClassImpl;)Lkotlin/reflect/jvm/internal/KClassImpl$Data; SPLkotlin/reflect/jvm/internal/KClassImpl;->data$lambda$0(Lkotlin/reflect/jvm/internal/KClassImpl;)Lkotlin/reflect/jvm/internal/KClassImpl$Data; -SPLkotlin/reflect/jvm/internal/KClassImpl;->getClassId()Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/KClassImpl;->equals(Ljava/lang/Object;)Z +SPLkotlin/reflect/jvm/internal/KClassImpl;->getClassId$kotlin_reflection()Lkotlin/reflect/jvm/internal/impl/name/ClassId; SPLkotlin/reflect/jvm/internal/KClassImpl;->getJClass()Ljava/lang/Class; SPLkotlin/reflect/jvm/internal/KClassImpl;->getQualifiedName()Ljava/lang/String; SPLkotlin/reflect/jvm/internal/KClassImpl;->getSimpleName()Ljava/lang/String; @@ -10363,23 +12506,13 @@ SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$10;->(Lkotlin/refle Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$11; SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$11;->(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$12; -SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$12;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$12;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$13; SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$13;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$14; -SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$14;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V -Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$15; -SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$15;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V -Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$16; -SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$16;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V -Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$17; -SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$17;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V -Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$18; -SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$18;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V -Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$19; -SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$19;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$14;->(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$2; -SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$3; SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$3;->(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$3;->invoke()Ljava/lang/Object; @@ -10387,7 +12520,7 @@ Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$4; SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$4;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$4;->invoke()Ljava/lang/Object; Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$5; -SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$5;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$5;->(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$6; SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$6;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$7; @@ -10396,6 +12529,11 @@ Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$8; SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$8;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$9; SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$9;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$allMembers$2; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$allMembers$2;->(Ljava/lang/Object;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$declaredMembers$2; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$declaredMembers$2;->(Ljava/lang/Object;)V +Lkotlin/reflect/jvm/internal/KClassMembersKt; Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl; SPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl;->()V SPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl;->()V @@ -10408,8 +12546,12 @@ SPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data;->(Lkotlin/r Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data$$Lambda$0; SPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data$$Lambda$0;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;)V Lkotlin/reflect/jvm/internal/KTypeParameterOwnerImpl; -Lkotlin/reflect/jvm/internal/ReflectKCallable; -Lkotlin/reflect/jvm/internal/ReflectKProperty; +Lkotlin/reflect/jvm/internal/LazyKMutableProperty1; +SPLkotlin/reflect/jvm/internal/LazyKMutableProperty1;->(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V +Lkotlin/reflect/jvm/internal/LazyKProperty; +SPLkotlin/reflect/jvm/internal/LazyKProperty;->(Lkotlin/jvm/functions/Function0;)V +Lkotlin/reflect/jvm/internal/LazyKProperty1; +SPLkotlin/reflect/jvm/internal/LazyKProperty1;->(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V Lkotlin/reflect/jvm/internal/ReflectProperties; SPLkotlin/reflect/jvm/internal/ReflectProperties;->lazySoft(Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal; SPLkotlin/reflect/jvm/internal/ReflectProperties;->lazySoft(Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal; @@ -10429,12 +12571,17 @@ SPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->()V SPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/KClass; SPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->getOwner(Lkotlin/jvm/internal/CallableReference;)Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl; SPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->mutableProperty1(Lkotlin/jvm/internal/MutablePropertyReference1;)Lkotlin/reflect/KMutableProperty1; -SPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->property1(Lkotlin/jvm/internal/PropertyReference1;)Lkotlin/reflect/KProperty1; +SPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->typeOf(Lkotlin/reflect/KClassifier;Ljava/util/List;Z)Lkotlin/reflect/KType; +Lkotlin/reflect/jvm/internal/ReflectionFactoryImpl$$Lambda$3; +SPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl$$Lambda$3;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/internal/MutablePropertyReference1;)V Lkotlin/reflect/jvm/internal/RuntimeTypeMapper; SPLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->()V SPLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->()V SPLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->getPrimitiveType(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType; SPLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->mapJvmClassToKotlinClassId(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +Lkotlin/reflect/jvm/internal/SystemPropertiesKt; +SPLkotlin/reflect/jvm/internal/SystemPropertiesKt;->()V +SPLkotlin/reflect/jvm/internal/SystemPropertiesKt;->getUseK1Implementation()Z Lkotlin/reflect/jvm/internal/impl/SpecialJvmAnnotations; SPLkotlin/reflect/jvm/internal/impl/SpecialJvmAnnotations;->()V SPLkotlin/reflect/jvm/internal/impl/SpecialJvmAnnotations;->()V @@ -10475,9 +12622,15 @@ SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->internalNam SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->rangesFqName(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->reflect(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind; -SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/lang/String;ZLkotlin/reflect/jvm/internal/impl/name/ClassId;Z)V +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/lang/String;ZLkotlin/reflect/jvm/internal/impl/name/ClassId;ZI)V +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/lang/String;ZLkotlin/reflect/jvm/internal/impl/name/ClassId;ZIILkotlin/jvm/internal/DefaultConstructorMarker;)V SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->getClassNamePrefix()Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->getMaxArity()I SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->getPackageFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; +Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Companion; +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Companion;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Function; SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Function;->()V SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Function;->()V @@ -10503,9 +12656,9 @@ SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->classId( SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->mapJavaToKotlin(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping; SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)V -SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->component1()Lkotlin/reflect/jvm/internal/impl/name/ClassId; -SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->component2()Lkotlin/reflect/jvm/internal/impl/name/ClassId; -SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->component3()Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->getJavaClass()Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->getKotlinMutable()Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->getKotlinReadOnly()Lkotlin/reflect/jvm/internal/impl/name/ClassId; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt; SPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->()V SPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getClassId(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; @@ -10593,6 +12746,7 @@ SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_ENUMS_PACKAG SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_KOTLIN_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_RANGES_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_REFLECT_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_SEQUENCES_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getKClass()Lkotlin/reflect/jvm/internal/impl/name/ClassId; SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getKFunction()Lkotlin/reflect/jvm/internal/impl/name/ClassId; Lkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt; @@ -10606,6 +12760,7 @@ SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$inverseMap( SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$primitiveArrayId(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$rangesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$reflectId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$sequencesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$unsignedId(Lkotlin/reflect/jvm/internal/impl/name/ClassId;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->annotationId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->atomicsId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; @@ -10617,6 +12772,7 @@ SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->inverseMap(Ljava/u SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->primitiveArrayId(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->rangesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->reflectId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->sequencesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->unsignedId(Lkotlin/reflect/jvm/internal/impl/name/ClassId;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmClassName; SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmClassName;->(Ljava/lang/String;)V @@ -10630,11 +12786,25 @@ SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getJavaKeywor SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getPrimitiveType()Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType; SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getWrapperFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->values()[Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType; +Lkotlin/reflect/jvm/internal/impl/types/model/DefinitelyNotNullTypeMarker; +Lkotlin/reflect/jvm/internal/impl/types/model/FlexibleTypeMarker; +Lkotlin/reflect/jvm/internal/impl/types/model/KotlinTypeMarker; +Lkotlin/reflect/jvm/internal/impl/types/model/RigidTypeMarker; +Lkotlin/reflect/jvm/internal/impl/types/model/SimpleTypeMarker; +Lkotlin/reflect/jvm/internal/impl/types/model/TypeArgumentListMarker; Lkotlin/reflect/jvm/internal/impl/types/model/TypeConstructorMarker; Lkotlin/reflect/jvm/internal/impl/utils/CollectionsKt; SPLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->capacity(I)I SPLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->newHashMapWithExpectedSize(I)Ljava/util/HashMap; SPLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->newHashSetWithExpectedSize(I)Ljava/util/HashSet; +Lkotlin/reflect/jvm/internal/types/AbstractKType; +SPLkotlin/reflect/jvm/internal/types/AbstractKType;->(Lkotlin/jvm/functions/Function0;)V +Lkotlin/reflect/jvm/internal/types/SimpleKType; +SPLkotlin/reflect/jvm/internal/types/SimpleKType;->(Lkotlin/reflect/KClassifier;Ljava/util/List;ZLkotlin/Lazy;Lkotlin/reflect/KType;ZZZLkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;)V +SPLkotlin/reflect/jvm/internal/types/SimpleKType;->(Lkotlin/reflect/KClassifier;Ljava/util/List;ZLkotlin/Lazy;Lkotlin/reflect/KType;ZZZLkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/reflect/jvm/internal/types/SimpleKType;->getArguments()Ljava/util/List; +SPLkotlin/reflect/jvm/internal/types/SimpleKType;->getClassifier()Lkotlin/reflect/KClassifier; +SPLkotlin/reflect/jvm/internal/types/SimpleKType;->isMarkedNullable()Z Lkotlin/sequences/ConstrainedOnceSequence; SPLkotlin/sequences/ConstrainedOnceSequence;->(Lkotlin/sequences/Sequence;)V SPLkotlin/sequences/ConstrainedOnceSequence;->iterator()Ljava/util/Iterator; @@ -10701,13 +12871,35 @@ SPLkotlin/text/LinesIterator;->next()Ljava/lang/String; Lkotlin/text/LinesIterator$State; SPLkotlin/text/LinesIterator$State;->()V SPLkotlin/text/LinesIterator$State;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/text/MatchGroupCollection; +Lkotlin/text/MatchNamedGroupCollection; +Lkotlin/text/MatchResult; +Lkotlin/text/MatcherMatchResult; +SPLkotlin/text/MatcherMatchResult;->(Ljava/util/regex/Matcher;Ljava/lang/CharSequence;)V +SPLkotlin/text/MatcherMatchResult;->access$getMatchResult(Lkotlin/text/MatcherMatchResult;)Ljava/util/regex/MatchResult; +SPLkotlin/text/MatcherMatchResult;->getGroupValues()Ljava/util/List; +SPLkotlin/text/MatcherMatchResult;->getMatchResult()Ljava/util/regex/MatchResult; +Lkotlin/text/MatcherMatchResult$groupValues$1; +SPLkotlin/text/MatcherMatchResult$groupValues$1;->(Lkotlin/text/MatcherMatchResult;)V +SPLkotlin/text/MatcherMatchResult$groupValues$1;->get(I)Ljava/lang/Object; +SPLkotlin/text/MatcherMatchResult$groupValues$1;->get(I)Ljava/lang/String; +Lkotlin/text/MatcherMatchResult$groups$1; +SPLkotlin/text/MatcherMatchResult$groups$1;->(Lkotlin/text/MatcherMatchResult;)V Lkotlin/text/Regex; SPLkotlin/text/Regex;->()V SPLkotlin/text/Regex;->(Ljava/lang/String;)V SPLkotlin/text/Regex;->(Ljava/util/regex/Pattern;)V +SPLkotlin/text/Regex;->find$default(Lkotlin/text/Regex;Ljava/lang/CharSequence;IILjava/lang/Object;)Lkotlin/text/MatchResult; +SPLkotlin/text/Regex;->find(Ljava/lang/CharSequence;I)Lkotlin/text/MatchResult; +SPLkotlin/text/Regex;->matchAt(Ljava/lang/CharSequence;I)Lkotlin/text/MatchResult; +SPLkotlin/text/Regex;->matches(Ljava/lang/CharSequence;)Z +SPLkotlin/text/Regex;->split(Ljava/lang/CharSequence;I)Ljava/util/List; Lkotlin/text/Regex$Companion; SPLkotlin/text/Regex$Companion;->()V SPLkotlin/text/Regex$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/text/RegexKt; +SPLkotlin/text/RegexKt;->access$findNext(Ljava/util/regex/Matcher;ILjava/lang/CharSequence;)Lkotlin/text/MatchResult; +SPLkotlin/text/RegexKt;->findNext(Ljava/util/regex/Matcher;ILjava/lang/CharSequence;)Lkotlin/text/MatchResult; Lkotlin/text/StringsKt; Lkotlin/text/StringsKt__AppendableKt; SPLkotlin/text/StringsKt__AppendableKt;->appendElement(Ljava/lang/Appendable;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V @@ -10739,16 +12931,29 @@ SPLkotlin/text/StringsKt__StringsJVMKt;->replace(Ljava/lang/String;Ljava/lang/St SPLkotlin/text/StringsKt__StringsJVMKt;->startsWith$default(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z SPLkotlin/text/StringsKt__StringsJVMKt;->startsWith(Ljava/lang/String;Ljava/lang/String;Z)Z Lkotlin/text/StringsKt__StringsKt; +SPLkotlin/text/StringsKt__StringsKt;->contains$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z +SPLkotlin/text/StringsKt__StringsKt;->contains(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z SPLkotlin/text/StringsKt__StringsKt;->endsWith$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z SPLkotlin/text/StringsKt__StringsKt;->endsWith(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z +SPLkotlin/text/StringsKt__StringsKt;->getLastIndex(Ljava/lang/CharSequence;)I +SPLkotlin/text/StringsKt__StringsKt;->indexOf$default(Ljava/lang/CharSequence;Ljava/lang/String;IZILjava/lang/Object;)I SPLkotlin/text/StringsKt__StringsKt;->indexOf(Ljava/lang/CharSequence;Ljava/lang/String;IZ)I SPLkotlin/text/StringsKt__StringsKt;->isBlank(Ljava/lang/CharSequence;)Z +SPLkotlin/text/StringsKt__StringsKt;->lastIndexOf$default(Ljava/lang/CharSequence;CIZILjava/lang/Object;)I +SPLkotlin/text/StringsKt__StringsKt;->lastIndexOf(Ljava/lang/CharSequence;CIZ)I SPLkotlin/text/StringsKt__StringsKt;->lineSequence(Ljava/lang/CharSequence;)Lkotlin/sequences/Sequence; SPLkotlin/text/StringsKt__StringsKt;->lines(Ljava/lang/CharSequence;)Ljava/util/List; +SPLkotlin/text/StringsKt__StringsKt;->padStart(Ljava/lang/CharSequence;IC)Ljava/lang/CharSequence; +SPLkotlin/text/StringsKt__StringsKt;->padStart(Ljava/lang/String;IC)Ljava/lang/String; SPLkotlin/text/StringsKt__StringsKt;->removePrefix(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/String; SPLkotlin/text/StringsKt__StringsKt;->removeSuffix(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsKt;->requireNonNegativeLimit(I)V SPLkotlin/text/StringsKt__StringsKt;->startsWith$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z SPLkotlin/text/StringsKt__StringsKt;->startsWith(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z +SPLkotlin/text/StringsKt__StringsKt;->substringAfterLast$default(Ljava/lang/String;CLjava/lang/String;ILjava/lang/Object;)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsKt;->substringAfterLast(Ljava/lang/String;CLjava/lang/String;)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsKt;->substringBefore$default(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsKt;->substringBefore(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; SPLkotlin/text/StringsKt__StringsKt;->trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; Lkotlin/text/StringsKt__StringsKt$lineSequence$$inlined$Sequence$1; SPLkotlin/text/StringsKt__StringsKt$lineSequence$$inlined$Sequence$1;->(Ljava/lang/CharSequence;)V @@ -10756,6 +12961,91 @@ SPLkotlin/text/StringsKt__StringsKt$lineSequence$$inlined$Sequence$1;->iterator( Lkotlin/text/StringsKt___StringsJvmKt; Lkotlin/text/StringsKt___StringsKt; SPLkotlin/text/StringsKt___StringsKt;->drop(Ljava/lang/String;I)Ljava/lang/String; +Lkotlin/time/ComparableTimeMark; +Lkotlin/time/Duration; +SPLkotlin/time/Duration;->()V +SPLkotlin/time/Duration;->(J)V +SPLkotlin/time/Duration;->appendFractional-impl(JLjava/lang/StringBuilder;IIILjava/lang/String;Z)V +SPLkotlin/time/Duration;->box-impl(J)Lkotlin/time/Duration; +SPLkotlin/time/Duration;->constructor-impl(J)J +SPLkotlin/time/Duration;->getAbsoluteValue-UwyO8pc(J)J +SPLkotlin/time/Duration;->getHoursComponent-impl(J)I +SPLkotlin/time/Duration;->getInWholeDays-impl(J)J +SPLkotlin/time/Duration;->getInWholeHours-impl(J)J +SPLkotlin/time/Duration;->getInWholeMilliseconds-impl(J)J +SPLkotlin/time/Duration;->getInWholeMinutes-impl(J)J +SPLkotlin/time/Duration;->getInWholeSeconds-impl(J)J +SPLkotlin/time/Duration;->getMinutesComponent-impl(J)I +SPLkotlin/time/Duration;->getNanosecondsComponent-impl(J)I +SPLkotlin/time/Duration;->getSecondsComponent-impl(J)I +SPLkotlin/time/Duration;->getStorageUnit-impl(J)Lkotlin/time/DurationUnit; +SPLkotlin/time/Duration;->getValue-impl(J)J +SPLkotlin/time/Duration;->isInMillis-impl(J)Z +SPLkotlin/time/Duration;->isInNanos-impl(J)Z +SPLkotlin/time/Duration;->isInfinite-impl(J)Z +SPLkotlin/time/Duration;->isNegative-impl(J)Z +SPLkotlin/time/Duration;->isPositive-impl(J)Z +SPLkotlin/time/Duration;->plus-LRDsOJo(JJ)J +SPLkotlin/time/Duration;->toLong-impl(JLkotlin/time/DurationUnit;)J +SPLkotlin/time/Duration;->toString()Ljava/lang/String; +SPLkotlin/time/Duration;->toString-impl(J)Ljava/lang/String; +SPLkotlin/time/Duration;->unbox-impl()J +Lkotlin/time/Duration$Companion; +SPLkotlin/time/Duration$Companion;->()V +SPLkotlin/time/Duration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/time/Duration$Companion;->fromRawValue-UwyO8pc$kotlin_stdlib(J)J +Lkotlin/time/DurationJvmKt; +SPLkotlin/time/DurationJvmKt;->()V +SPLkotlin/time/DurationJvmKt;->getDurationAssertionsEnabled()Z +Lkotlin/time/DurationKt; +SPLkotlin/time/DurationKt;->access$durationOfMillis(J)J +SPLkotlin/time/DurationKt;->access$durationOfNanosNormalized(J)J +SPLkotlin/time/DurationKt;->durationOfMillis(J)J +SPLkotlin/time/DurationKt;->durationOfNanos(J)J +SPLkotlin/time/DurationKt;->durationOfNanosNormalized(J)J +SPLkotlin/time/DurationKt;->toDuration(ILkotlin/time/DurationUnit;)J +SPLkotlin/time/DurationKt;->toDuration(JLkotlin/time/DurationUnit;)J +Lkotlin/time/DurationUnit; +SPLkotlin/time/DurationUnit;->$values()[Lkotlin/time/DurationUnit; +SPLkotlin/time/DurationUnit;->()V +SPLkotlin/time/DurationUnit;->(Ljava/lang/String;ILjava/util/concurrent/TimeUnit;)V +SPLkotlin/time/DurationUnit;->getTimeUnit$kotlin_stdlib()Ljava/util/concurrent/TimeUnit; +Lkotlin/time/DurationUnitKt; +Lkotlin/time/DurationUnitKt__DurationUnitJvmKt; +SPLkotlin/time/DurationUnitKt__DurationUnitJvmKt;->convertDurationUnit(JLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)J +SPLkotlin/time/DurationUnitKt__DurationUnitJvmKt;->convertDurationUnitOverflow(JLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)J +Lkotlin/time/DurationUnitKt__DurationUnitKt; +Lkotlin/time/Instant; +SPLkotlin/time/Instant;->()V +SPLkotlin/time/Instant;->(JI)V +Lkotlin/time/Instant$Companion; +SPLkotlin/time/Instant$Companion;->()V +SPLkotlin/time/Instant$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/time/LongSaturatedMathKt; +SPLkotlin/time/LongSaturatedMathKt;->saturatingDiff(JJLkotlin/time/DurationUnit;)J +SPLkotlin/time/LongSaturatedMathKt;->saturatingFiniteDiff(JJLkotlin/time/DurationUnit;)J +Lkotlin/time/MonotonicTimeSource; +SPLkotlin/time/MonotonicTimeSource;->()V +SPLkotlin/time/MonotonicTimeSource;->()V +SPLkotlin/time/MonotonicTimeSource;->elapsedFrom-6eNON_k(J)J +SPLkotlin/time/MonotonicTimeSource;->markNow-z9LOYto()J +SPLkotlin/time/MonotonicTimeSource;->read()J +Lkotlin/time/TimeMark; +Lkotlin/time/TimeSource; +Lkotlin/time/TimeSource$Monotonic; +SPLkotlin/time/TimeSource$Monotonic;->()V +SPLkotlin/time/TimeSource$Monotonic;->()V +SPLkotlin/time/TimeSource$Monotonic;->markNow-z9LOYto()J +Lkotlin/time/TimeSource$Monotonic$ValueTimeMark; +SPLkotlin/time/TimeSource$Monotonic$ValueTimeMark;->constructor-impl(J)J +SPLkotlin/time/TimeSource$Monotonic$ValueTimeMark;->elapsedNow-UwyO8pc(J)J +Lkotlin/time/TimeSource$WithComparableMarks; +Lkotlin/uuid/Uuid; +SPLkotlin/uuid/Uuid;->()V +SPLkotlin/uuid/Uuid;->(JJ)V +Lkotlin/uuid/Uuid$Companion; +SPLkotlin/uuid/Uuid$Companion;->()V +SPLkotlin/uuid/Uuid$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/coroutines/AbstractCoroutine; SPLkotlinx/coroutines/AbstractCoroutine;->(Lkotlin/coroutines/CoroutineContext;ZZ)V SPLkotlinx/coroutines/AbstractCoroutine;->afterResume(Ljava/lang/Object;)V @@ -10786,29 +13076,35 @@ SPLkotlinx/coroutines/BuildersKt;->launch$default(Lkotlinx/coroutines/CoroutineS SPLkotlinx/coroutines/BuildersKt;->launch(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; SPLkotlinx/coroutines/BuildersKt;->runBlocking$default(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Ljava/lang/Object; SPLkotlinx/coroutines/BuildersKt;->runBlocking(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlinx/coroutines/BuildersKt;->runBlockingImpl(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/EventLoop;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlinx/coroutines/BuildersKt;->runBlockingK$default(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/BuildersKt;->runBlockingK(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; SPLkotlinx/coroutines/BuildersKt;->withContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/BuildersKt__BuildersKt; SPLkotlinx/coroutines/BuildersKt__BuildersKt;->runBlocking$default(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Ljava/lang/Object; SPLkotlinx/coroutines/BuildersKt__BuildersKt;->runBlocking(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlinx/coroutines/BuildersKt__BuildersKt;->runBlockingImpl(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/EventLoop;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; Lkotlinx/coroutines/BuildersKt__Builders_commonKt; SPLkotlinx/coroutines/BuildersKt__Builders_commonKt;->launch$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; SPLkotlinx/coroutines/BuildersKt__Builders_commonKt;->launch(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; SPLkotlinx/coroutines/BuildersKt__Builders_commonKt;->withContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/BuildersKt__Builders_concurrentKt; +SPLkotlinx/coroutines/BuildersKt__Builders_concurrentKt;->runBlockingK$default(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/BuildersKt__Builders_concurrentKt;->runBlockingK(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; Lkotlinx/coroutines/CancelHandler; Lkotlinx/coroutines/CancelHandler$UserSupplied; SPLkotlinx/coroutines/CancelHandler$UserSupplied;->(Lkotlin/jvm/functions/Function1;)V -SPLkotlinx/coroutines/CancelHandler$UserSupplied;->invoke(Ljava/lang/Throwable;)V Lkotlinx/coroutines/CancellableContinuation; Lkotlinx/coroutines/CancellableContinuationImpl; SPLkotlinx/coroutines/CancellableContinuationImpl;->()V SPLkotlinx/coroutines/CancellableContinuationImpl;->(Lkotlin/coroutines/Continuation;I)V -SPLkotlinx/coroutines/CancellableContinuationImpl;->callCancelHandler(Lkotlinx/coroutines/CancelHandler;Ljava/lang/Throwable;)V SPLkotlinx/coroutines/CancellableContinuationImpl;->callSegmentOnCancellation(Lkotlinx/coroutines/internal/Segment;Ljava/lang/Throwable;)V SPLkotlinx/coroutines/CancellableContinuationImpl;->cancel(Ljava/lang/Throwable;)Z +SPLkotlinx/coroutines/CancellableContinuationImpl;->cancelCompletedResult$kotlinx_coroutines_core(Ljava/lang/Object;Ljava/lang/Throwable;)V SPLkotlinx/coroutines/CancellableContinuationImpl;->cancelLater(Ljava/lang/Throwable;)Z SPLkotlinx/coroutines/CancellableContinuationImpl;->completeResume(Ljava/lang/Object;)V SPLkotlinx/coroutines/CancellableContinuationImpl;->detachChild$kotlinx_coroutines_core()V -SPLkotlinx/coroutines/CancellableContinuationImpl;->detachChildIfNonResuable()V +SPLkotlinx/coroutines/CancellableContinuationImpl;->detachChildIfNonReusable()V SPLkotlinx/coroutines/CancellableContinuationImpl;->dispatchResume(I)V SPLkotlinx/coroutines/CancellableContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext; SPLkotlinx/coroutines/CancellableContinuationImpl;->getContinuationCancellationCause(Lkotlinx/coroutines/Job;)Ljava/lang/Throwable; @@ -10851,8 +13147,6 @@ SPLkotlinx/coroutines/CancellableContinuationKt;->invokeOnCancellation(Lkotlinx/ Lkotlinx/coroutines/CancelledContinuation; SPLkotlinx/coroutines/CancelledContinuation;->()V SPLkotlinx/coroutines/CancelledContinuation;->(Lkotlin/coroutines/Continuation;Ljava/lang/Throwable;Z)V -SPLkotlinx/coroutines/CancelledContinuation;->get_resumed$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; -SPLkotlinx/coroutines/CancelledContinuation;->makeResumed()Z Lkotlinx/coroutines/ChildContinuation; SPLkotlinx/coroutines/ChildContinuation;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V SPLkotlinx/coroutines/ChildContinuation;->getOnCancelling()Z @@ -10891,7 +13185,6 @@ SPLkotlinx/coroutines/CompletionStateKt;->toState(Ljava/lang/Object;Lkotlinx/cor Lkotlinx/coroutines/CopyableThreadContextElement; Lkotlinx/coroutines/CopyableThrowable; Lkotlinx/coroutines/CoroutineContextKt; -SPLkotlinx/coroutines/CoroutineContextKt;->$r8$lambda$as3AdS3orsv2Ts0OahuRhLd1z7g(ZLkotlin/coroutines/CoroutineContext$Element;)Z SPLkotlinx/coroutines/CoroutineContextKt;->foldCopies(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;Z)Lkotlin/coroutines/CoroutineContext; SPLkotlinx/coroutines/CoroutineContextKt;->hasCopyableElements$lambda$0(ZLkotlin/coroutines/CoroutineContext$Element;)Z SPLkotlinx/coroutines/CoroutineContextKt;->hasCopyableElements(Lkotlin/coroutines/CoroutineContext;)Z @@ -10926,7 +13219,11 @@ SPLkotlinx/coroutines/CoroutineName$Key;->(Lkotlin/jvm/internal/DefaultCon Lkotlinx/coroutines/CoroutineScope; Lkotlinx/coroutines/CoroutineScopeKt; SPLkotlinx/coroutines/CoroutineScopeKt;->CoroutineScope(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/CoroutineScope; +SPLkotlinx/coroutines/CoroutineScopeKt;->MainScope()Lkotlinx/coroutines/CoroutineScope; +SPLkotlinx/coroutines/CoroutineScopeKt;->cancel$default(Lkotlinx/coroutines/CoroutineScope;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V +SPLkotlinx/coroutines/CoroutineScopeKt;->cancel(Lkotlinx/coroutines/CoroutineScope;Ljava/util/concurrent/CancellationException;)V SPLkotlinx/coroutines/CoroutineScopeKt;->coroutineScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/CoroutineScopeKt;->ensureActive(Lkotlinx/coroutines/CoroutineScope;)V Lkotlinx/coroutines/CoroutineStart; SPLkotlinx/coroutines/CoroutineStart;->$values()[Lkotlinx/coroutines/CoroutineStart; SPLkotlinx/coroutines/CoroutineStart;->()V @@ -10959,8 +13256,14 @@ SPLkotlinx/coroutines/DefaultExecutorKt;->initializeDefaultDelay()Lkotlinx/corou Lkotlinx/coroutines/Deferred; Lkotlinx/coroutines/Delay; Lkotlinx/coroutines/DelayKt; +SPLkotlinx/coroutines/DelayKt;->awaitCancellation(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLkotlinx/coroutines/DelayKt;->delay(JLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/DelayKt;->delay-VtjQ1oo(JLkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLkotlinx/coroutines/DelayKt;->getDelay(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Delay; +SPLkotlinx/coroutines/DelayKt;->toDelayMillis-LRDsOJo(J)J +Lkotlinx/coroutines/DelayKt$awaitCancellation$1; +SPLkotlinx/coroutines/DelayKt$awaitCancellation$1;->(Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/DispatchException; Lkotlinx/coroutines/DispatchedCoroutine; SPLkotlinx/coroutines/DispatchedCoroutine;->()V SPLkotlinx/coroutines/DispatchedCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V @@ -10982,6 +13285,7 @@ SPLkotlinx/coroutines/DispatchedTaskKt;->isReusableMode(I)Z SPLkotlinx/coroutines/DispatchedTaskKt;->resume(Lkotlinx/coroutines/DispatchedTask;Lkotlin/coroutines/Continuation;Z)V SPLkotlinx/coroutines/DispatchedTaskKt;->resumeUnconfined(Lkotlinx/coroutines/DispatchedTask;)V Lkotlinx/coroutines/DispatcherExecutor; +SPLkotlinx/coroutines/DispatcherExecutor;->(Lkotlinx/coroutines/CoroutineDispatcher;)V Lkotlinx/coroutines/Dispatchers; SPLkotlinx/coroutines/Dispatchers;->()V SPLkotlinx/coroutines/Dispatchers;->()V @@ -11066,6 +13370,7 @@ SPLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->dispatch(Lkotlin/corouti SPLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->equals(Ljava/lang/Object;)Z SPLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->getExecutor()Ljava/util/concurrent/Executor; Lkotlinx/coroutines/ExecutorsKt; +SPLkotlinx/coroutines/ExecutorsKt;->asExecutor(Lkotlinx/coroutines/CoroutineDispatcher;)Ljava/util/concurrent/Executor; SPLkotlinx/coroutines/ExecutorsKt;->from(Ljava/util/concurrent/Executor;)Lkotlinx/coroutines/CoroutineDispatcher; Lkotlinx/coroutines/GlobalScope; SPLkotlinx/coroutines/GlobalScope;->()V @@ -11076,6 +13381,7 @@ Lkotlinx/coroutines/Incomplete; Lkotlinx/coroutines/IncompleteStateBox; Lkotlinx/coroutines/Job; SPLkotlinx/coroutines/Job;->()V +SPLkotlinx/coroutines/Job;->cancel$default(Lkotlinx/coroutines/Job;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V Lkotlinx/coroutines/Job$DefaultImpls; SPLkotlinx/coroutines/Job$DefaultImpls;->cancel$default(Lkotlinx/coroutines/Job;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V SPLkotlinx/coroutines/Job$DefaultImpls;->fold(Lkotlinx/coroutines/Job;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; @@ -11091,10 +13397,14 @@ SPLkotlinx/coroutines/JobCancellationException;->equals(Ljava/lang/Object;)Z SPLkotlinx/coroutines/JobCancellationException;->fillInStackTrace()Ljava/lang/Throwable; Lkotlinx/coroutines/JobImpl; SPLkotlinx/coroutines/JobImpl;->(Lkotlinx/coroutines/Job;)V +SPLkotlinx/coroutines/JobImpl;->complete()Z +SPLkotlinx/coroutines/JobImpl;->getOnCancelComplete$kotlinx_coroutines_core()Z SPLkotlinx/coroutines/JobImpl;->handlesException()Z Lkotlinx/coroutines/JobKt; SPLkotlinx/coroutines/JobKt;->Job$default(Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/CompletableJob; SPLkotlinx/coroutines/JobKt;->Job(Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/CompletableJob; +SPLkotlinx/coroutines/JobKt;->cancel$default(Lkotlin/coroutines/CoroutineContext;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V +SPLkotlinx/coroutines/JobKt;->cancel(Lkotlin/coroutines/CoroutineContext;Ljava/util/concurrent/CancellationException;)V SPLkotlinx/coroutines/JobKt;->ensureActive(Lkotlin/coroutines/CoroutineContext;)V SPLkotlinx/coroutines/JobKt;->ensureActive(Lkotlinx/coroutines/Job;)V SPLkotlinx/coroutines/JobKt;->invokeOnCompletion$default(Lkotlinx/coroutines/Job;ZLkotlinx/coroutines/JobNode;ILjava/lang/Object;)Lkotlinx/coroutines/DisposableHandle; @@ -11102,6 +13412,8 @@ SPLkotlinx/coroutines/JobKt;->invokeOnCompletion(Lkotlinx/coroutines/Job;ZLkotli Lkotlinx/coroutines/JobKt__JobKt; SPLkotlinx/coroutines/JobKt__JobKt;->Job$default(Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/CompletableJob; SPLkotlinx/coroutines/JobKt__JobKt;->Job(Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/CompletableJob; +SPLkotlinx/coroutines/JobKt__JobKt;->cancel$default(Lkotlin/coroutines/CoroutineContext;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V +SPLkotlinx/coroutines/JobKt__JobKt;->cancel(Lkotlin/coroutines/CoroutineContext;Ljava/util/concurrent/CancellationException;)V SPLkotlinx/coroutines/JobKt__JobKt;->ensureActive(Lkotlin/coroutines/CoroutineContext;)V SPLkotlinx/coroutines/JobKt__JobKt;->ensureActive(Lkotlinx/coroutines/Job;)V SPLkotlinx/coroutines/JobKt__JobKt;->invokeOnCompletion$default(Lkotlinx/coroutines/Job;ZLkotlinx/coroutines/JobNode;ILjava/lang/Object;)Lkotlinx/coroutines/DisposableHandle; @@ -11124,7 +13436,9 @@ SPLkotlinx/coroutines/JobSupport;->attachChild(Lkotlinx/coroutines/ChildJob;)Lko SPLkotlinx/coroutines/JobSupport;->cancel(Ljava/util/concurrent/CancellationException;)V SPLkotlinx/coroutines/JobSupport;->cancelImpl$kotlinx_coroutines_core(Ljava/lang/Object;)Z SPLkotlinx/coroutines/JobSupport;->cancelInternal(Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/JobSupport;->cancelMakeCompleting(Ljava/lang/Object;)Ljava/lang/Object; SPLkotlinx/coroutines/JobSupport;->cancelParent(Ljava/lang/Throwable;)Z +SPLkotlinx/coroutines/JobSupport;->cancellationExceptionMessage()Ljava/lang/String; SPLkotlinx/coroutines/JobSupport;->childCancelled(Ljava/lang/Throwable;)Z SPLkotlinx/coroutines/JobSupport;->completeStateFinalization(Lkotlinx/coroutines/Incomplete;Ljava/lang/Object;)V SPLkotlinx/coroutines/JobSupport;->continueCompleting(Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)V @@ -11196,12 +13510,14 @@ SPLkotlinx/coroutines/JobSupport$Finishing;->isSealed()Z SPLkotlinx/coroutines/JobSupport$Finishing;->sealLocked(Ljava/lang/Throwable;)Ljava/util/List; SPLkotlinx/coroutines/JobSupport$Finishing;->setCompleting(Z)V SPLkotlinx/coroutines/JobSupport$Finishing;->setExceptionsHolder(Ljava/lang/Object;)V +SPLkotlinx/coroutines/JobSupport$Finishing;->setRootCause(Ljava/lang/Throwable;)V Lkotlinx/coroutines/JobSupportKt; SPLkotlinx/coroutines/JobSupportKt;->()V SPLkotlinx/coroutines/JobSupportKt;->access$getCOMPLETING_ALREADY$p()Lkotlinx/coroutines/internal/Symbol; SPLkotlinx/coroutines/JobSupportKt;->access$getCOMPLETING_RETRY$p()Lkotlinx/coroutines/internal/Symbol; SPLkotlinx/coroutines/JobSupportKt;->access$getEMPTY_ACTIVE$p()Lkotlinx/coroutines/Empty; SPLkotlinx/coroutines/JobSupportKt;->access$getSEALED$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/JobSupportKt;->access$getTOO_LATE_TO_CANCEL$p()Lkotlinx/coroutines/internal/Symbol; SPLkotlinx/coroutines/JobSupportKt;->boxIncomplete(Ljava/lang/Object;)Ljava/lang/Object; SPLkotlinx/coroutines/JobSupportKt;->unboxState(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/MainCoroutineDispatcher; @@ -11218,6 +13534,7 @@ Lkotlinx/coroutines/NotCompleted; Lkotlinx/coroutines/ParentJob; Lkotlinx/coroutines/ResumeOnCompletion; SPLkotlinx/coroutines/ResumeOnCompletion;->(Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/ResumeOnCompletion;->getOnCancelling()Z SPLkotlinx/coroutines/ResumeOnCompletion;->invoke(Ljava/lang/Throwable;)V Lkotlinx/coroutines/StandaloneCoroutine; SPLkotlinx/coroutines/StandaloneCoroutine;->(Lkotlin/coroutines/CoroutineContext;Z)V @@ -11240,7 +13557,9 @@ SPLkotlinx/coroutines/Unconfined;->()V SPLkotlinx/coroutines/Unconfined;->()V Lkotlinx/coroutines/UndispatchedCoroutine; SPLkotlinx/coroutines/UndispatchedCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/UndispatchedCoroutine;->afterCompletionUndispatched()V SPLkotlinx/coroutines/UndispatchedCoroutine;->afterResume(Ljava/lang/Object;)V +SPLkotlinx/coroutines/UndispatchedCoroutine;->clearThreadLocal()V Lkotlinx/coroutines/UndispatchedMarker; SPLkotlinx/coroutines/UndispatchedMarker;->()V SPLkotlinx/coroutines/UndispatchedMarker;->()V @@ -11260,7 +13579,6 @@ Lkotlinx/coroutines/android/AndroidDispatcherFactory; SPLkotlinx/coroutines/android/AndroidDispatcherFactory;->()V SPLkotlinx/coroutines/android/AndroidDispatcherFactory;->createDispatcher(Ljava/util/List;)Lkotlinx/coroutines/MainCoroutineDispatcher; Lkotlinx/coroutines/android/HandlerContext; -SPLkotlinx/coroutines/android/HandlerContext;->$r8$lambda$fBQRGWcdO7g7Y_pFpufN5oy9B_I(Lkotlinx/coroutines/android/HandlerContext;Ljava/lang/Runnable;Ljava/lang/Throwable;)Lkotlin/Unit; SPLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;)V SPLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V SPLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;Z)V @@ -11269,13 +13587,6 @@ SPLkotlinx/coroutines/android/HandlerContext;->equals(Ljava/lang/Object;)Z SPLkotlinx/coroutines/android/HandlerContext;->getImmediate()Lkotlinx/coroutines/MainCoroutineDispatcher; SPLkotlinx/coroutines/android/HandlerContext;->getImmediate()Lkotlinx/coroutines/android/HandlerContext; SPLkotlinx/coroutines/android/HandlerContext;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z -SPLkotlinx/coroutines/android/HandlerContext;->scheduleResumeAfterDelay$lambda$2(Lkotlinx/coroutines/android/HandlerContext;Ljava/lang/Runnable;Ljava/lang/Throwable;)Lkotlin/Unit; -SPLkotlinx/coroutines/android/HandlerContext;->scheduleResumeAfterDelay(JLkotlinx/coroutines/CancellableContinuation;)V -Lkotlinx/coroutines/android/HandlerContext$$ExternalSyntheticLambda1; -SPLkotlinx/coroutines/android/HandlerContext$$ExternalSyntheticLambda1;->(Lkotlinx/coroutines/android/HandlerContext;Ljava/lang/Runnable;)V -SPLkotlinx/coroutines/android/HandlerContext$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -Lkotlinx/coroutines/android/HandlerContext$scheduleResumeAfterDelay$$inlined$Runnable$1; -SPLkotlinx/coroutines/android/HandlerContext$scheduleResumeAfterDelay$$inlined$Runnable$1;->(Lkotlinx/coroutines/CancellableContinuation;Lkotlinx/coroutines/android/HandlerContext;)V Lkotlinx/coroutines/android/HandlerDispatcher; SPLkotlinx/coroutines/android/HandlerDispatcher;->()V SPLkotlinx/coroutines/android/HandlerDispatcher;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -11345,7 +13656,6 @@ SPLkotlinx/coroutines/channels/BufferedChannel;->send$suspendImpl(Lkotlinx/corou SPLkotlinx/coroutines/channels/BufferedChannel;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLkotlinx/coroutines/channels/BufferedChannel;->tryReceive-PtdJZtk()Ljava/lang/Object; SPLkotlinx/coroutines/channels/BufferedChannel;->tryResumeReceiver(Ljava/lang/Object;Ljava/lang/Object;)Z -SPLkotlinx/coroutines/channels/BufferedChannel;->trySendDropOldest-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object; SPLkotlinx/coroutines/channels/BufferedChannel;->updateCellReceive(Lkotlinx/coroutines/channels/ChannelSegment;IJLjava/lang/Object;)Ljava/lang/Object; SPLkotlinx/coroutines/channels/BufferedChannel;->updateCellSend(Lkotlinx/coroutines/channels/ChannelSegment;ILjava/lang/Object;JLjava/lang/Object;Z)I SPLkotlinx/coroutines/channels/BufferedChannel;->waitExpandBufferCompletion$kotlinx_coroutines_core(J)V @@ -11373,13 +13683,10 @@ SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getDONE_RCV$p()Lkotlin SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getEXPAND_BUFFER_COMPLETION_WAIT_ITERATIONS$p()I SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getFAILED$p()Lkotlinx/coroutines/internal/Symbol; SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getINTERRUPTED_RCV$p()Lkotlinx/coroutines/internal/Symbol; -SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getINTERRUPTED_SEND$p()Lkotlinx/coroutines/internal/Symbol; SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getIN_BUFFER$p()Lkotlinx/coroutines/internal/Symbol; SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getNO_CLOSE_CAUSE$p()Lkotlinx/coroutines/internal/Symbol; SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getNO_RECEIVE_RESULT$p()Lkotlinx/coroutines/internal/Symbol; SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getNULL_SEGMENT$p()Lkotlinx/coroutines/channels/ChannelSegment; -SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getRESUMING_BY_EB$p()Lkotlinx/coroutines/internal/Symbol; -SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getRESUMING_BY_RCV$p()Lkotlinx/coroutines/internal/Symbol; SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getSUSPEND$p()Lkotlinx/coroutines/internal/Symbol; SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getSUSPEND_NO_WAITER$p()Lkotlinx/coroutines/internal/Symbol; SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$initialBufferEnd(I)J @@ -11444,6 +13751,7 @@ SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->(ILkotlinx/corou SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->isConflatedDropOldest()Z SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->send$suspendImpl(Lkotlinx/coroutines/channels/ConflatedBufferedChannel;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->trySendDropOldest-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object; SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->trySendImpl-Mj0NB7M(Ljava/lang/Object;Z)Ljava/lang/Object; Lkotlinx/coroutines/channels/ProduceKt; SPLkotlinx/coroutines/channels/ProduceKt;->produce$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; @@ -11707,6 +14015,7 @@ Lkotlinx/coroutines/flow/StateFlowImpl; SPLkotlinx/coroutines/flow/StateFlowImpl;->()V SPLkotlinx/coroutines/flow/StateFlowImpl;->(Ljava/lang/Object;)V SPLkotlinx/coroutines/flow/StateFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/StateFlowImpl;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z SPLkotlinx/coroutines/flow/StateFlowImpl;->createSlot()Lkotlinx/coroutines/flow/StateFlowSlot; SPLkotlinx/coroutines/flow/StateFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; SPLkotlinx/coroutines/flow/StateFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/StateFlowSlot; @@ -11823,8 +14132,7 @@ SPLkotlinx/coroutines/flow/internal/FlowCoroutine;->(Lkotlin/coroutines/Co Lkotlinx/coroutines/flow/internal/FlowCoroutineKt; SPLkotlinx/coroutines/flow/internal/FlowCoroutineKt;->flowScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/FusibleFlow; -Lkotlinx/coroutines/flow/internal/FusibleFlow$DefaultImpls; -SPLkotlinx/coroutines/flow/internal/FusibleFlow$DefaultImpls;->fuse$default(Lkotlinx/coroutines/flow/internal/FusibleFlow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/internal/FusibleFlow;->fuse$default(Lkotlinx/coroutines/flow/internal/FusibleFlow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; Lkotlinx/coroutines/flow/internal/NoOpContinuation; SPLkotlinx/coroutines/flow/internal/NoOpContinuation;->()V SPLkotlinx/coroutines/flow/internal/NoOpContinuation;->()V @@ -11835,7 +14143,6 @@ SPLkotlinx/coroutines/flow/internal/NopCollector;->emit(Ljava/lang/Object;Lkotli Lkotlinx/coroutines/flow/internal/NullSurrogateKt; SPLkotlinx/coroutines/flow/internal/NullSurrogateKt;->()V Lkotlinx/coroutines/flow/internal/SafeCollector; -SPLkotlinx/coroutines/flow/internal/SafeCollector;->$r8$lambda$idxg0bEmSgrK6v2pQsR7xybd4HY(ILkotlin/coroutines/CoroutineContext$Element;)I SPLkotlinx/coroutines/flow/internal/SafeCollector;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/CoroutineContext;)V SPLkotlinx/coroutines/flow/internal/SafeCollector;->checkContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V SPLkotlinx/coroutines/flow/internal/SafeCollector;->collectContextSize$lambda$0(ILkotlin/coroutines/CoroutineContext$Element;)I @@ -11856,7 +14163,6 @@ SPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->()V SPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; SPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->invoke(Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/SafeCollector_commonKt; -SPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt;->$r8$lambda$0mv-1vIMKs5GqhpegvxZ5k4J09Y(Lkotlinx/coroutines/flow/internal/SafeCollector;ILkotlin/coroutines/CoroutineContext$Element;)I SPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt;->checkContext$lambda$0(Lkotlinx/coroutines/flow/internal/SafeCollector;ILkotlin/coroutines/CoroutineContext$Element;)I SPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt;->checkContext(Lkotlinx/coroutines/flow/internal/SafeCollector;Lkotlin/coroutines/CoroutineContext;)V SPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt;->transitiveCoroutineParent(Lkotlinx/coroutines/Job;Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/Job; @@ -11866,6 +14172,9 @@ SPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt$$ExternalSyntheticLam Lkotlinx/coroutines/flow/internal/SendingCollector; SPLkotlinx/coroutines/flow/internal/SendingCollector;->(Lkotlinx/coroutines/channels/SendChannel;)V SPLkotlinx/coroutines/flow/internal/SendingCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/internal/ConcurrentKt; +SPLkotlinx/coroutines/internal/ConcurrentKt;->()V +SPLkotlinx/coroutines/internal/ConcurrentKt;->removeFutureOnCancel(Ljava/util/concurrent/Executor;)Z Lkotlinx/coroutines/internal/ConcurrentLinkedListKt; SPLkotlinx/coroutines/internal/ConcurrentLinkedListKt;->()V SPLkotlinx/coroutines/internal/ConcurrentLinkedListKt;->access$getCLOSED$p()Lkotlinx/coroutines/internal/Symbol; @@ -11877,6 +14186,7 @@ SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->access$getNextOrClosed SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->cleanPrev()V SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->getNext()Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->getNextOrClosed()Ljava/lang/Object; +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->getPrev()Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->get_next$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->get_prev$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->markAsClosed()Z @@ -11905,7 +14215,9 @@ SPLkotlinx/coroutines/internal/DispatchedContinuation;->tryReleaseClaimedContinu Lkotlinx/coroutines/internal/DispatchedContinuationKt; SPLkotlinx/coroutines/internal/DispatchedContinuationKt;->()V SPLkotlinx/coroutines/internal/DispatchedContinuationKt;->access$getUNDEFINED$p()Lkotlinx/coroutines/internal/Symbol; -SPLkotlinx/coroutines/internal/DispatchedContinuationKt;->resumeCancellableWith(Lkotlin/coroutines/Continuation;Ljava/lang/Object;)V +SPLkotlinx/coroutines/internal/DispatchedContinuationKt;->resumeCancellableWithInternal(Lkotlin/coroutines/Continuation;Ljava/lang/Object;)V +SPLkotlinx/coroutines/internal/DispatchedContinuationKt;->safeDispatch(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/internal/DispatchedContinuationKt;->safeIsDispatchNeeded(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/coroutines/CoroutineContext;)Z Lkotlinx/coroutines/internal/FastServiceLoader; SPLkotlinx/coroutines/internal/FastServiceLoader;->()V SPLkotlinx/coroutines/internal/FastServiceLoader;->()V @@ -12024,7 +14336,6 @@ SPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp( SPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; SPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;Z)Z Lkotlinx/coroutines/internal/ThreadContextKt; -SPLkotlinx/coroutines/internal/ThreadContextKt;->$r8$lambda$JV-_KVVI_n23GsB5XC6MwwiLObk(Ljava/lang/Object;Lkotlin/coroutines/CoroutineContext$Element;)Ljava/lang/Object; SPLkotlinx/coroutines/internal/ThreadContextKt;->()V SPLkotlinx/coroutines/internal/ThreadContextKt;->countAll$lambda$0(Ljava/lang/Object;Lkotlin/coroutines/CoroutineContext$Element;)Ljava/lang/Object; SPLkotlinx/coroutines/internal/ThreadContextKt;->restoreThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V @@ -12057,6 +14368,7 @@ Lkotlinx/coroutines/intrinsics/CancellableKt; SPLkotlinx/coroutines/intrinsics/CancellableKt;->startCoroutineCancellable(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V Lkotlinx/coroutines/intrinsics/UndispatchedKt; SPLkotlinx/coroutines/intrinsics/UndispatchedKt;->startCoroutineUndispatched(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/intrinsics/UndispatchedKt;->startUndispatched(Lkotlinx/coroutines/internal/ScopeCoroutine;ZLjava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; SPLkotlinx/coroutines/intrinsics/UndispatchedKt;->startUndispatchedOrReturn(Lkotlinx/coroutines/internal/ScopeCoroutine;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; Lkotlinx/coroutines/scheduling/CoroutineScheduler; SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->()V @@ -12066,7 +14378,9 @@ SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->addToGlobalQueue(Lkotlinx/ SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->createNewWorker()I SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->createTask(Ljava/lang/Runnable;Z)Lkotlinx/coroutines/scheduling/Task; SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->currentWorker()Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->dispatch$default(Lkotlinx/coroutines/scheduling/CoroutineScheduler;Ljava/lang/Runnable;ZZILjava/lang/Object;)V SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->dispatch(Ljava/lang/Runnable;ZZ)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->execute(Ljava/lang/Runnable;)V SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->getControlState$volatile$FU()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->getParkedWorkersStack$volatile$FU()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->get_isTerminated$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; @@ -12075,7 +14389,7 @@ SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackNextInde SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackPop()Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker; SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackPush(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;)Z SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->runSafely(Lkotlinx/coroutines/scheduling/Task;)V -SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->signalBlockingWork(JZ)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->signalBlockingWork(J)V SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->signalCpuWork()V SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->submitToLocalQueue(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;Lkotlinx/coroutines/scheduling/Task;Z)Lkotlinx/coroutines/scheduling/Task; SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryCreateWorker$default(Lkotlinx/coroutines/scheduling/CoroutineScheduler;JILjava/lang/Object;)Z @@ -12094,7 +14408,7 @@ SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->findAnyTask(Z)Lkotl SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->findTask(Z)Lkotlinx/coroutines/scheduling/Task; SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getIndexInArray()I SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getNextParkedWorker()Ljava/lang/Object; -SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getWorkerCtl$volatile$FU$kotlinx_coroutines_core()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getWorkerCtl$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->inStack()Z SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->nextInt(I)I SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->park()V @@ -12119,6 +14433,7 @@ SPLkotlinx/coroutines/scheduling/DefaultIoScheduler;->limitedParallelism(ILjava/ Lkotlinx/coroutines/scheduling/DefaultScheduler; SPLkotlinx/coroutines/scheduling/DefaultScheduler;->()V SPLkotlinx/coroutines/scheduling/DefaultScheduler;->()V +SPLkotlinx/coroutines/scheduling/DefaultScheduler;->limitedParallelism(ILjava/lang/String;)Lkotlinx/coroutines/CoroutineDispatcher; Lkotlinx/coroutines/scheduling/GlobalQueue; SPLkotlinx/coroutines/scheduling/GlobalQueue;->()V Lkotlinx/coroutines/scheduling/NanoTimeSource; @@ -12129,6 +14444,7 @@ Lkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher; SPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->(IIJLjava/lang/String;)V SPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->createScheduler()Lkotlinx/coroutines/scheduling/CoroutineScheduler; SPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->dispatchWithContext$kotlinx_coroutines_core(Ljava/lang/Runnable;ZZ)V +SPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->getExecutor()Ljava/util/concurrent/Executor; Lkotlinx/coroutines/scheduling/SchedulerTimeSource; SPLkotlinx/coroutines/scheduling/SchedulerTimeSource;->()V Lkotlinx/coroutines/scheduling/Task; @@ -12194,117 +14510,430 @@ SPLkotlinx/coroutines/sync/SemaphoreKt;->access$getSEGMENT_SIZE$p()I Lkotlinx/coroutines/sync/SemaphoreSegment; SPLkotlinx/coroutines/sync/SemaphoreSegment;->(JLkotlinx/coroutines/sync/SemaphoreSegment;I)V Lkotlinx/serialization/DeserializationStrategy; +Lkotlinx/serialization/InternalSerializationApi; Lkotlinx/serialization/KSerializer; Lkotlinx/serialization/MissingFieldException; +Lkotlinx/serialization/Polymorphic; Lkotlinx/serialization/SerialFormat; +Lkotlinx/serialization/Serializable; Lkotlinx/serialization/SerializationException; Lkotlinx/serialization/SerializationStrategy; +Lkotlinx/serialization/SerializersCacheKt; +SPLkotlinx/serialization/SerializersCacheKt;->()V +SPLkotlinx/serialization/SerializersCacheKt;->SERIALIZERS_CACHE_NULLABLE$lambda$0(Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/SerializersCacheKt;->findCachedSerializer(Lkotlin/reflect/KClass;Z)Lkotlinx/serialization/KSerializer; +Lkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda0; +SPLkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda0;->()V +Lkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda1; +SPLkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda1;->()V +SPLkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda2; +SPLkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda2;->()V +Lkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda3; +SPLkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda3;->()V +Lkotlinx/serialization/SerializersKt; +SPLkotlinx/serialization/SerializersKt;->serializer(Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/SerializersKt;->serializerOrNull(Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer; +Lkotlinx/serialization/SerializersKt__SerializersKt; +SPLkotlinx/serialization/SerializersKt__SerializersKt;->serializer(Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/SerializersKt__SerializersKt;->serializerByKTypeImpl$SerializersKt__SerializersKt(Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;Z)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/SerializersKt__SerializersKt;->serializerOrNull(Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer; Lkotlinx/serialization/StringFormat; Lkotlinx/serialization/builtins/BuiltinSerializersKt; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->BooleanArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->ByteArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->CharArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->DoubleArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->FloatArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->IntArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->LongArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->NothingSerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->ShortArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->UByteArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->UIntArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->ULongArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->UShortArraySerializer()Lkotlinx/serialization/KSerializer; SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->getNullable(Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/UByte$Companion;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/UInt$Companion;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/ULong$Companion;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/UShort$Companion;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/Unit;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/BooleanCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/ByteCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/CharCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/DoubleCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/FloatCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/IntCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/LongCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/ShortCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/StringCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/time/Duration$Companion;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/time/Instant$Companion;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/uuid/Uuid$Companion;)Lkotlinx/serialization/KSerializer; Lkotlinx/serialization/descriptors/PrimitiveKind; SPLkotlinx/serialization/descriptors/PrimitiveKind;->()V SPLkotlinx/serialization/descriptors/PrimitiveKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/descriptors/PrimitiveKind$BOOLEAN; +SPLkotlinx/serialization/descriptors/PrimitiveKind$BOOLEAN;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$BOOLEAN;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$BYTE; +SPLkotlinx/serialization/descriptors/PrimitiveKind$BYTE;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$BYTE;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$CHAR; +SPLkotlinx/serialization/descriptors/PrimitiveKind$CHAR;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$CHAR;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$DOUBLE; +SPLkotlinx/serialization/descriptors/PrimitiveKind$DOUBLE;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$DOUBLE;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$FLOAT; +SPLkotlinx/serialization/descriptors/PrimitiveKind$FLOAT;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$FLOAT;->()V Lkotlinx/serialization/descriptors/PrimitiveKind$INT; SPLkotlinx/serialization/descriptors/PrimitiveKind$INT;->()V SPLkotlinx/serialization/descriptors/PrimitiveKind$INT;->()V Lkotlinx/serialization/descriptors/PrimitiveKind$LONG; SPLkotlinx/serialization/descriptors/PrimitiveKind$LONG;->()V SPLkotlinx/serialization/descriptors/PrimitiveKind$LONG;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$SHORT; +SPLkotlinx/serialization/descriptors/PrimitiveKind$SHORT;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$SHORT;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$STRING; +SPLkotlinx/serialization/descriptors/PrimitiveKind$STRING;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$STRING;->()V Lkotlinx/serialization/descriptors/SerialDescriptor; SPLkotlinx/serialization/descriptors/SerialDescriptor;->isNullable()Z Lkotlinx/serialization/descriptors/SerialKind; SPLkotlinx/serialization/descriptors/SerialKind;->()V SPLkotlinx/serialization/descriptors/SerialKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/descriptors/StructureKind; +SPLkotlinx/serialization/descriptors/StructureKind;->()V +SPLkotlinx/serialization/descriptors/StructureKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/descriptors/StructureKind$OBJECT; +SPLkotlinx/serialization/descriptors/StructureKind$OBJECT;->()V +SPLkotlinx/serialization/descriptors/StructureKind$OBJECT;->()V Lkotlinx/serialization/encoding/AbstractDecoder; SPLkotlinx/serialization/encoding/AbstractDecoder;->()V -Lkotlinx/serialization/encoding/AbstractEncoder; -SPLkotlinx/serialization/encoding/AbstractEncoder;->()V Lkotlinx/serialization/encoding/ChunkedDecoder; Lkotlinx/serialization/encoding/CompositeDecoder; SPLkotlinx/serialization/encoding/CompositeDecoder;->()V Lkotlinx/serialization/encoding/CompositeDecoder$Companion; SPLkotlinx/serialization/encoding/CompositeDecoder$Companion;->()V SPLkotlinx/serialization/encoding/CompositeDecoder$Companion;->()V -Lkotlinx/serialization/encoding/CompositeEncoder; Lkotlinx/serialization/encoding/Decoder; -Lkotlinx/serialization/encoding/Encoder; +Lkotlinx/serialization/internal/AbstractCollectionSerializer; +SPLkotlinx/serialization/internal/AbstractCollectionSerializer;->()V +SPLkotlinx/serialization/internal/AbstractCollectionSerializer;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/serialization/internal/AbstractPolymorphicSerializer; +Lkotlinx/serialization/internal/BooleanArraySerializer; +SPLkotlinx/serialization/internal/BooleanArraySerializer;->()V +SPLkotlinx/serialization/internal/BooleanArraySerializer;->()V +Lkotlinx/serialization/internal/BooleanSerializer; +SPLkotlinx/serialization/internal/BooleanSerializer;->()V +SPLkotlinx/serialization/internal/BooleanSerializer;->()V +SPLkotlinx/serialization/internal/BooleanSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/ByteArraySerializer; +SPLkotlinx/serialization/internal/ByteArraySerializer;->()V +SPLkotlinx/serialization/internal/ByteArraySerializer;->()V +Lkotlinx/serialization/internal/ByteSerializer; +SPLkotlinx/serialization/internal/ByteSerializer;->()V +SPLkotlinx/serialization/internal/ByteSerializer;->()V +SPLkotlinx/serialization/internal/ByteSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/CacheEntry; +SPLkotlinx/serialization/internal/CacheEntry;->(Lkotlinx/serialization/KSerializer;)V Lkotlinx/serialization/internal/CachedNames; +Lkotlinx/serialization/internal/CachingKt; +SPLkotlinx/serialization/internal/CachingKt;->()V +SPLkotlinx/serialization/internal/CachingKt;->createCache(Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/internal/SerializerCache; +SPLkotlinx/serialization/internal/CachingKt;->createParametrizedCache(Lkotlin/jvm/functions/Function2;)Lkotlinx/serialization/internal/ParametrizedSerializerCache; +Lkotlinx/serialization/internal/CharArraySerializer; +SPLkotlinx/serialization/internal/CharArraySerializer;->()V +SPLkotlinx/serialization/internal/CharArraySerializer;->()V +Lkotlinx/serialization/internal/CharSerializer; +SPLkotlinx/serialization/internal/CharSerializer;->()V +SPLkotlinx/serialization/internal/CharSerializer;->()V +SPLkotlinx/serialization/internal/CharSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/ClassValueCache; +SPLkotlinx/serialization/internal/ClassValueCache;->(Lkotlin/jvm/functions/Function1;)V +SPLkotlinx/serialization/internal/ClassValueCache;->get(Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/ClassValueCache;->getCompute()Lkotlin/jvm/functions/Function1; +Lkotlinx/serialization/internal/ClassValueCache$$ExternalSyntheticApiModelOutline0; +SPLkotlinx/serialization/internal/ClassValueCache$$ExternalSyntheticApiModelOutline0;->m(Lkotlinx/serialization/internal/ClassValueReferences;Ljava/lang/Class;)Ljava/lang/Object; +Lkotlinx/serialization/internal/ClassValueCache$get$$inlined$getOrSet$1; +SPLkotlinx/serialization/internal/ClassValueCache$get$$inlined$getOrSet$1;->(Lkotlinx/serialization/internal/ClassValueCache;Lkotlin/reflect/KClass;)V +SPLkotlinx/serialization/internal/ClassValueCache$get$$inlined$getOrSet$1;->invoke()Ljava/lang/Object; +Lkotlinx/serialization/internal/ClassValueParametrizedCache; +SPLkotlinx/serialization/internal/ClassValueParametrizedCache;->(Lkotlin/jvm/functions/Function2;)V +Lkotlinx/serialization/internal/ClassValueReferences; +SPLkotlinx/serialization/internal/ClassValueReferences;->()V +SPLkotlinx/serialization/internal/ClassValueReferences;->computeValue(Ljava/lang/Class;)Ljava/lang/Object; +SPLkotlinx/serialization/internal/ClassValueReferences;->computeValue(Ljava/lang/Class;)Lkotlinx/serialization/internal/MutableSoftReference; +Lkotlinx/serialization/internal/CollectionLikeSerializer; +SPLkotlinx/serialization/internal/CollectionLikeSerializer;->(Lkotlinx/serialization/KSerializer;)V +SPLkotlinx/serialization/internal/CollectionLikeSerializer;->(Lkotlinx/serialization/KSerializer;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/internal/DoubleArraySerializer; +SPLkotlinx/serialization/internal/DoubleArraySerializer;->()V +SPLkotlinx/serialization/internal/DoubleArraySerializer;->()V +Lkotlinx/serialization/internal/DoubleSerializer; +SPLkotlinx/serialization/internal/DoubleSerializer;->()V +SPLkotlinx/serialization/internal/DoubleSerializer;->()V +SPLkotlinx/serialization/internal/DoubleSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/DurationSerializer; +SPLkotlinx/serialization/internal/DurationSerializer;->()V +SPLkotlinx/serialization/internal/DurationSerializer;->()V +Lkotlinx/serialization/internal/FloatArraySerializer; +SPLkotlinx/serialization/internal/FloatArraySerializer;->()V +SPLkotlinx/serialization/internal/FloatArraySerializer;->()V +Lkotlinx/serialization/internal/FloatSerializer; +SPLkotlinx/serialization/internal/FloatSerializer;->()V +SPLkotlinx/serialization/internal/FloatSerializer;->()V +SPLkotlinx/serialization/internal/FloatSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/GeneratedSerializer; +Lkotlinx/serialization/internal/InlineClassDescriptor; +SPLkotlinx/serialization/internal/InlineClassDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;)V +Lkotlinx/serialization/internal/InlineClassDescriptorKt; +SPLkotlinx/serialization/internal/InlineClassDescriptorKt;->InlinePrimitiveDescriptor(Ljava/lang/String;Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/InlineClassDescriptorKt$InlinePrimitiveDescriptor$1; +SPLkotlinx/serialization/internal/InlineClassDescriptorKt$InlinePrimitiveDescriptor$1;->(Lkotlinx/serialization/KSerializer;)V +Lkotlinx/serialization/internal/InstantSerializer; +SPLkotlinx/serialization/internal/InstantSerializer;->()V +SPLkotlinx/serialization/internal/InstantSerializer;->()V +Lkotlinx/serialization/internal/IntArraySerializer; +SPLkotlinx/serialization/internal/IntArraySerializer;->()V +SPLkotlinx/serialization/internal/IntArraySerializer;->()V Lkotlinx/serialization/internal/IntSerializer; SPLkotlinx/serialization/internal/IntSerializer;->()V SPLkotlinx/serialization/internal/IntSerializer;->()V SPLkotlinx/serialization/internal/IntSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Integer; SPLkotlinx/serialization/internal/IntSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; SPLkotlinx/serialization/internal/IntSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; -SPLkotlinx/serialization/internal/IntSerializer;->serialize(Lkotlinx/serialization/encoding/Encoder;I)V -SPLkotlinx/serialization/internal/IntSerializer;->serialize(Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V +Lkotlinx/serialization/internal/ListLikeDescriptor; +SPLkotlinx/serialization/internal/ListLikeDescriptor;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V +SPLkotlinx/serialization/internal/ListLikeDescriptor;->(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/internal/LongArraySerializer; +SPLkotlinx/serialization/internal/LongArraySerializer;->()V +SPLkotlinx/serialization/internal/LongArraySerializer;->()V Lkotlinx/serialization/internal/LongSerializer; SPLkotlinx/serialization/internal/LongSerializer;->()V SPLkotlinx/serialization/internal/LongSerializer;->()V SPLkotlinx/serialization/internal/LongSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Long; SPLkotlinx/serialization/internal/LongSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; SPLkotlinx/serialization/internal/LongSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/MutableSoftReference; +SPLkotlinx/serialization/internal/MutableSoftReference;->()V +SPLkotlinx/serialization/internal/MutableSoftReference;->getOrSetWithLock(Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; +Lkotlinx/serialization/internal/NamedCompanion; +Lkotlinx/serialization/internal/NothingSerialDescriptor; +SPLkotlinx/serialization/internal/NothingSerialDescriptor;->()V +SPLkotlinx/serialization/internal/NothingSerialDescriptor;->()V +Lkotlinx/serialization/internal/NothingSerializer; +SPLkotlinx/serialization/internal/NothingSerializer;->()V +SPLkotlinx/serialization/internal/NothingSerializer;->()V Lkotlinx/serialization/internal/NullableSerializer; SPLkotlinx/serialization/internal/NullableSerializer;->(Lkotlinx/serialization/KSerializer;)V SPLkotlinx/serialization/internal/NullableSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; SPLkotlinx/serialization/internal/NullableSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/ObjectSerializer; +SPLkotlinx/serialization/internal/ObjectSerializer;->(Ljava/lang/String;Ljava/lang/Object;)V +Lkotlinx/serialization/internal/ObjectSerializer$$ExternalSyntheticLambda1; +SPLkotlinx/serialization/internal/ObjectSerializer$$ExternalSyntheticLambda1;->(Ljava/lang/String;Lkotlinx/serialization/internal/ObjectSerializer;)V +Lkotlinx/serialization/internal/ParametrizedSerializerCache; +Lkotlinx/serialization/internal/PlatformKt; +SPLkotlinx/serialization/internal/PlatformKt;->companionOrNull(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object; +SPLkotlinx/serialization/internal/PlatformKt;->compiledSerializerImpl(Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/PlatformKt;->constructSerializerForGivenTypeArgs(Ljava/lang/Class;[Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/PlatformKt;->constructSerializerForGivenTypeArgs(Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/PlatformKt;->findInNamedCompanion(Ljava/lang/Class;[Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/PlatformKt;->findNamedCompanionByAnnotation(Ljava/lang/Class;)Ljava/lang/Object; +SPLkotlinx/serialization/internal/PlatformKt;->findObjectSerializer(Ljava/lang/Class;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/PlatformKt;->initBuiltins()Ljava/util/Map; +SPLkotlinx/serialization/internal/PlatformKt;->invokeSerializerOnDefaultCompanion(Ljava/lang/Class;[Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/PlatformKt;->isInterface(Lkotlin/reflect/KClass;)Z +SPLkotlinx/serialization/internal/PlatformKt;->isPolymorphicSerializer(Ljava/lang/Class;)Z Lkotlinx/serialization/internal/Platform_commonKt; SPLkotlinx/serialization/internal/Platform_commonKt;->()V SPLkotlinx/serialization/internal/Platform_commonKt;->cachedSerialNames(Lkotlinx/serialization/descriptors/SerialDescriptor;)Ljava/util/Set; +SPLkotlinx/serialization/internal/Platform_commonKt;->kclass(Lkotlin/reflect/KType;)Lkotlin/reflect/KClass; +Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor; +SPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;I)V +SPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getSerialName()Ljava/lang/String; +Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$$ExternalSyntheticLambda0; +SPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$$ExternalSyntheticLambda0;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V +Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$$ExternalSyntheticLambda1; +SPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$$ExternalSyntheticLambda1;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V +Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$$ExternalSyntheticLambda2; +SPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$$ExternalSyntheticLambda2;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V +Lkotlinx/serialization/internal/PrimitiveArrayDescriptor; +SPLkotlinx/serialization/internal/PrimitiveArrayDescriptor;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V +Lkotlinx/serialization/internal/PrimitiveArraySerializer; +SPLkotlinx/serialization/internal/PrimitiveArraySerializer;->(Lkotlinx/serialization/KSerializer;)V Lkotlinx/serialization/internal/PrimitiveSerialDescriptor; SPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/descriptors/PrimitiveKind;)V SPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->getElementsCount()I SPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->getSerialName()Ljava/lang/String; SPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->isNullable()Z +Lkotlinx/serialization/internal/PrimitivesKt; +SPLkotlinx/serialization/internal/PrimitivesKt;->()V +SPLkotlinx/serialization/internal/PrimitivesKt;->builtinSerializerOrNull(Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer; Lkotlinx/serialization/internal/SerialDescriptorForNullable; SPLkotlinx/serialization/internal/SerialDescriptorForNullable;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V +Lkotlinx/serialization/internal/SerializerCache; +Lkotlinx/serialization/internal/ShortArraySerializer; +SPLkotlinx/serialization/internal/ShortArraySerializer;->()V +SPLkotlinx/serialization/internal/ShortArraySerializer;->()V +Lkotlinx/serialization/internal/ShortSerializer; +SPLkotlinx/serialization/internal/ShortSerializer;->()V +SPLkotlinx/serialization/internal/ShortSerializer;->()V +SPLkotlinx/serialization/internal/ShortSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/StringSerializer; +SPLkotlinx/serialization/internal/StringSerializer;->()V +SPLkotlinx/serialization/internal/StringSerializer;->()V +Lkotlinx/serialization/internal/UByteArraySerializer; +SPLkotlinx/serialization/internal/UByteArraySerializer;->()V +SPLkotlinx/serialization/internal/UByteArraySerializer;->()V +Lkotlinx/serialization/internal/UByteSerializer; +SPLkotlinx/serialization/internal/UByteSerializer;->()V +SPLkotlinx/serialization/internal/UByteSerializer;->()V +SPLkotlinx/serialization/internal/UByteSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/UIntArraySerializer; +SPLkotlinx/serialization/internal/UIntArraySerializer;->()V +SPLkotlinx/serialization/internal/UIntArraySerializer;->()V +Lkotlinx/serialization/internal/UIntSerializer; +SPLkotlinx/serialization/internal/UIntSerializer;->()V +SPLkotlinx/serialization/internal/UIntSerializer;->()V +SPLkotlinx/serialization/internal/UIntSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/ULongArraySerializer; +SPLkotlinx/serialization/internal/ULongArraySerializer;->()V +SPLkotlinx/serialization/internal/ULongArraySerializer;->()V +Lkotlinx/serialization/internal/ULongSerializer; +SPLkotlinx/serialization/internal/ULongSerializer;->()V +SPLkotlinx/serialization/internal/ULongSerializer;->()V +SPLkotlinx/serialization/internal/ULongSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/UShortArraySerializer; +SPLkotlinx/serialization/internal/UShortArraySerializer;->()V +SPLkotlinx/serialization/internal/UShortArraySerializer;->()V +Lkotlinx/serialization/internal/UShortSerializer; +SPLkotlinx/serialization/internal/UShortSerializer;->()V +SPLkotlinx/serialization/internal/UShortSerializer;->()V +SPLkotlinx/serialization/internal/UShortSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/UnitSerializer; +SPLkotlinx/serialization/internal/UnitSerializer;->()V +SPLkotlinx/serialization/internal/UnitSerializer;->()V +Lkotlinx/serialization/internal/UuidSerializer; +SPLkotlinx/serialization/internal/UuidSerializer;->()V +SPLkotlinx/serialization/internal/UuidSerializer;->()V Lkotlinx/serialization/json/ClassDiscriminatorMode; SPLkotlinx/serialization/json/ClassDiscriminatorMode;->$values()[Lkotlinx/serialization/json/ClassDiscriminatorMode; SPLkotlinx/serialization/json/ClassDiscriminatorMode;->()V SPLkotlinx/serialization/json/ClassDiscriminatorMode;->(Ljava/lang/String;I)V -SPLkotlinx/serialization/json/ClassDiscriminatorMode;->values()[Lkotlinx/serialization/json/ClassDiscriminatorMode; Lkotlinx/serialization/json/Json; SPLkotlinx/serialization/json/Json;->()V SPLkotlinx/serialization/json/Json;->(Lkotlinx/serialization/json/JsonConfiguration;Lkotlinx/serialization/modules/SerializersModule;)V SPLkotlinx/serialization/json/Json;->(Lkotlinx/serialization/json/JsonConfiguration;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLkotlinx/serialization/json/Json;->decodeFromString(Lkotlinx/serialization/DeserializationStrategy;Ljava/lang/String;)Ljava/lang/Object; -SPLkotlinx/serialization/json/Json;->encodeToString(Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ljava/lang/String; SPLkotlinx/serialization/json/Json;->getConfiguration()Lkotlinx/serialization/json/JsonConfiguration; SPLkotlinx/serialization/json/Json;->getSerializersModule()Lkotlinx/serialization/modules/SerializersModule; Lkotlinx/serialization/json/Json$Default; SPLkotlinx/serialization/json/Json$Default;->()V SPLkotlinx/serialization/json/Json$Default;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/json/JsonArray; +SPLkotlinx/serialization/json/JsonArray;->()V +SPLkotlinx/serialization/json/JsonArray;->(Ljava/util/List;)V +SPLkotlinx/serialization/json/JsonArray;->toString()Ljava/lang/String; +Lkotlinx/serialization/json/JsonArray$Companion; +SPLkotlinx/serialization/json/JsonArray$Companion;->()V +SPLkotlinx/serialization/json/JsonArray$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/json/JsonArrayBuilder; +SPLkotlinx/serialization/json/JsonArrayBuilder;->()V +SPLkotlinx/serialization/json/JsonArrayBuilder;->build()Lkotlinx/serialization/json/JsonArray; +Lkotlinx/serialization/json/JsonBuilder; +SPLkotlinx/serialization/json/JsonBuilder;->(Lkotlinx/serialization/json/Json;)V +SPLkotlinx/serialization/json/JsonBuilder;->build$kotlinx_serialization_json()Lkotlinx/serialization/json/JsonConfiguration; +SPLkotlinx/serialization/json/JsonBuilder;->getSerializersModule()Lkotlinx/serialization/modules/SerializersModule; +SPLkotlinx/serialization/json/JsonBuilder;->setEncodeDefaults(Z)V +SPLkotlinx/serialization/json/JsonBuilder;->setExplicitNulls(Z)V Lkotlinx/serialization/json/JsonConfiguration; -SPLkotlinx/serialization/json/JsonConfiguration;->(ZZZZZZLjava/lang/String;ZZLjava/lang/String;ZZLkotlinx/serialization/json/JsonNamingStrategy;ZZZLkotlinx/serialization/json/ClassDiscriminatorMode;)V -SPLkotlinx/serialization/json/JsonConfiguration;->(ZZZZZZLjava/lang/String;ZZLjava/lang/String;ZZLkotlinx/serialization/json/JsonNamingStrategy;ZZZLkotlinx/serialization/json/ClassDiscriminatorMode;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlinx/serialization/json/JsonConfiguration;->(ZZZZZZLjava/lang/String;ZZLjava/lang/String;ZZLkotlinx/serialization/json/JsonNamingStrategy;ZZZLkotlinx/serialization/json/ClassDiscriminatorMode;Z)V +SPLkotlinx/serialization/json/JsonConfiguration;->(ZZZZZZLjava/lang/String;ZZLjava/lang/String;ZZLkotlinx/serialization/json/JsonNamingStrategy;ZZZLkotlinx/serialization/json/ClassDiscriminatorMode;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V SPLkotlinx/serialization/json/JsonConfiguration;->getAllowComments()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getAllowSpecialFloatingPointValues()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getAllowStructuredMapKeys()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getAllowTrailingComma()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getClassDiscriminator()Ljava/lang/String; SPLkotlinx/serialization/json/JsonConfiguration;->getClassDiscriminatorMode()Lkotlinx/serialization/json/ClassDiscriminatorMode; +SPLkotlinx/serialization/json/JsonConfiguration;->getCoerceInputValues()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getDecodeEnumsCaseInsensitive()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getEncodeDefaults()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getExceptionsWithDebugInfo()Z SPLkotlinx/serialization/json/JsonConfiguration;->getExplicitNulls()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getIgnoreUnknownKeys()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getNamingStrategy()Lkotlinx/serialization/json/JsonNamingStrategy; SPLkotlinx/serialization/json/JsonConfiguration;->getPrettyPrint()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getPrettyPrintIndent()Ljava/lang/String; +SPLkotlinx/serialization/json/JsonConfiguration;->getUseAlternativeNames()Z SPLkotlinx/serialization/json/JsonConfiguration;->getUseArrayPolymorphism()Z +SPLkotlinx/serialization/json/JsonConfiguration;->isLenient()Z Lkotlinx/serialization/json/JsonDecoder; -Lkotlinx/serialization/json/JsonEncoder; +Lkotlinx/serialization/json/JsonDecodingException; +Lkotlinx/serialization/json/JsonElement; +SPLkotlinx/serialization/json/JsonElement;->()V +SPLkotlinx/serialization/json/JsonElement;->()V +SPLkotlinx/serialization/json/JsonElement;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/json/JsonElement$Companion; +SPLkotlinx/serialization/json/JsonElement$Companion;->()V +SPLkotlinx/serialization/json/JsonElement$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/json/JsonElementBuildersKt; +SPLkotlinx/serialization/json/JsonElementBuildersKt;->put(Lkotlinx/serialization/json/JsonObjectBuilder;Ljava/lang/String;Ljava/lang/Boolean;)Lkotlinx/serialization/json/JsonElement; +SPLkotlinx/serialization/json/JsonElementBuildersKt;->put(Lkotlinx/serialization/json/JsonObjectBuilder;Ljava/lang/String;Ljava/lang/String;)Lkotlinx/serialization/json/JsonElement; +SPLkotlinx/serialization/json/JsonElementBuildersKt;->putJsonArray(Lkotlinx/serialization/json/JsonObjectBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/json/JsonElement; +Lkotlinx/serialization/json/JsonElementKt; +SPLkotlinx/serialization/json/JsonElementKt;->()V +SPLkotlinx/serialization/json/JsonElementKt;->JsonPrimitive(Ljava/lang/Boolean;)Lkotlinx/serialization/json/JsonPrimitive; +SPLkotlinx/serialization/json/JsonElementKt;->JsonPrimitive(Ljava/lang/String;)Lkotlinx/serialization/json/JsonPrimitive; +Lkotlinx/serialization/json/JsonException; +Lkotlinx/serialization/json/JsonImpl; +SPLkotlinx/serialization/json/JsonImpl;->(Lkotlinx/serialization/json/JsonConfiguration;Lkotlinx/serialization/modules/SerializersModule;)V +SPLkotlinx/serialization/json/JsonImpl;->validateConfiguration()V +Lkotlinx/serialization/json/JsonKt; +SPLkotlinx/serialization/json/JsonKt;->Json$default(Lkotlinx/serialization/json/Json;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/serialization/json/Json; +SPLkotlinx/serialization/json/JsonKt;->Json(Lkotlinx/serialization/json/Json;Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/json/Json; +Lkotlinx/serialization/json/JsonLiteral; +SPLkotlinx/serialization/json/JsonLiteral;->(Ljava/lang/Object;ZLkotlinx/serialization/descriptors/SerialDescriptor;)V +SPLkotlinx/serialization/json/JsonLiteral;->(Ljava/lang/Object;ZLkotlinx/serialization/descriptors/SerialDescriptor;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlinx/serialization/json/JsonLiteral;->getContent()Ljava/lang/String; +SPLkotlinx/serialization/json/JsonLiteral;->isString()Z +SPLkotlinx/serialization/json/JsonLiteral;->toString()Ljava/lang/String; +Lkotlinx/serialization/json/JsonNamingStrategy; +Lkotlinx/serialization/json/JsonObject; +SPLkotlinx/serialization/json/JsonObject;->()V +SPLkotlinx/serialization/json/JsonObject;->(Ljava/util/Map;)V +SPLkotlinx/serialization/json/JsonObject;->toString$lambda$0(Ljava/util/Map$Entry;)Ljava/lang/CharSequence; +SPLkotlinx/serialization/json/JsonObject;->toString()Ljava/lang/String; +Lkotlinx/serialization/json/JsonObject$$ExternalSyntheticLambda0; +SPLkotlinx/serialization/json/JsonObject$$ExternalSyntheticLambda0;->()V +SPLkotlinx/serialization/json/JsonObject$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/serialization/json/JsonObject$Companion; +SPLkotlinx/serialization/json/JsonObject$Companion;->()V +SPLkotlinx/serialization/json/JsonObject$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/json/JsonObjectBuilder; +SPLkotlinx/serialization/json/JsonObjectBuilder;->()V +SPLkotlinx/serialization/json/JsonObjectBuilder;->build()Lkotlinx/serialization/json/JsonObject; +SPLkotlinx/serialization/json/JsonObjectBuilder;->put(Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lkotlinx/serialization/json/JsonElement; +Lkotlinx/serialization/json/JsonPrimitive; +SPLkotlinx/serialization/json/JsonPrimitive;->()V +SPLkotlinx/serialization/json/JsonPrimitive;->()V +SPLkotlinx/serialization/json/JsonPrimitive;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/json/JsonPrimitive$Companion; +SPLkotlinx/serialization/json/JsonPrimitive$Companion;->()V +SPLkotlinx/serialization/json/JsonPrimitive$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/serialization/json/internal/AbstractJsonLexer; -SPLkotlinx/serialization/json/internal/AbstractJsonLexer;->()V +SPLkotlinx/serialization/json/internal/AbstractJsonLexer;->(Lkotlinx/serialization/json/JsonConfiguration;)V SPLkotlinx/serialization/json/internal/AbstractJsonLexer;->consumeNumericLiteral()J SPLkotlinx/serialization/json/internal/AbstractJsonLexer;->expectEof()V SPLkotlinx/serialization/json/internal/AbstractJsonLexer;->tryConsumeNull$default(Lkotlinx/serialization/json/internal/AbstractJsonLexer;ZILjava/lang/Object;)Z SPLkotlinx/serialization/json/internal/AbstractJsonLexer;->tryConsumeNull(Z)Z Lkotlinx/serialization/json/internal/AbstractJsonLexerKt; SPLkotlinx/serialization/json/internal/AbstractJsonLexerKt;->charToTokenClass(C)B -Lkotlinx/serialization/json/internal/ArrayPoolsKt; -SPLkotlinx/serialization/json/internal/ArrayPoolsKt;->()V -SPLkotlinx/serialization/json/internal/ArrayPoolsKt;->access$getMAX_CHARS_IN_POOL$p()I -Lkotlinx/serialization/json/internal/CharArrayPool; -SPLkotlinx/serialization/json/internal/CharArrayPool;->()V -SPLkotlinx/serialization/json/internal/CharArrayPool;->()V -SPLkotlinx/serialization/json/internal/CharArrayPool;->release([C)V -SPLkotlinx/serialization/json/internal/CharArrayPool;->take()[C -Lkotlinx/serialization/json/internal/CharArrayPoolBase; -SPLkotlinx/serialization/json/internal/CharArrayPoolBase;->()V -SPLkotlinx/serialization/json/internal/CharArrayPoolBase;->releaseImpl([C)V -SPLkotlinx/serialization/json/internal/CharArrayPoolBase;->take(I)[C Lkotlinx/serialization/json/internal/CharMappings; SPLkotlinx/serialization/json/internal/CharMappings;->()V SPLkotlinx/serialization/json/internal/CharMappings;->()V @@ -12314,44 +14943,22 @@ SPLkotlinx/serialization/json/internal/CharMappings;->initC2TC(CB)V SPLkotlinx/serialization/json/internal/CharMappings;->initC2TC(IB)V SPLkotlinx/serialization/json/internal/CharMappings;->initCharToToken()V SPLkotlinx/serialization/json/internal/CharMappings;->initEscape()V -Lkotlinx/serialization/json/internal/Composer; -SPLkotlinx/serialization/json/internal/Composer;->(Lkotlinx/serialization/json/internal/InternalJsonWriter;)V -SPLkotlinx/serialization/json/internal/Composer;->print(I)V -Lkotlinx/serialization/json/internal/ComposersKt; -SPLkotlinx/serialization/json/internal/ComposersKt;->Composer(Lkotlinx/serialization/json/internal/InternalJsonWriter;Lkotlinx/serialization/json/Json;)Lkotlinx/serialization/json/internal/Composer; Lkotlinx/serialization/json/internal/CreateMapForCacheKt; SPLkotlinx/serialization/json/internal/CreateMapForCacheKt;->createMapForCache(I)Ljava/util/Map; Lkotlinx/serialization/json/internal/DescriptorSchemaCache; SPLkotlinx/serialization/json/internal/DescriptorSchemaCache;->()V -Lkotlinx/serialization/json/internal/InternalJsonWriter; +Lkotlinx/serialization/json/internal/JsonElementMarker; Lkotlinx/serialization/json/internal/JsonPath; -SPLkotlinx/serialization/json/internal/JsonPath;->()V -Lkotlinx/serialization/json/internal/JsonStreamsKt; -SPLkotlinx/serialization/json/internal/JsonStreamsKt;->encodeByWriter(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/json/internal/InternalJsonWriter;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V -Lkotlinx/serialization/json/internal/JsonToStringWriter; -SPLkotlinx/serialization/json/internal/JsonToStringWriter;->()V -SPLkotlinx/serialization/json/internal/JsonToStringWriter;->ensureAdditionalCapacity(I)V -SPLkotlinx/serialization/json/internal/JsonToStringWriter;->ensureTotalCapacity(II)I -SPLkotlinx/serialization/json/internal/JsonToStringWriter;->release()V -SPLkotlinx/serialization/json/internal/JsonToStringWriter;->toString()Ljava/lang/String; -SPLkotlinx/serialization/json/internal/JsonToStringWriter;->write(Ljava/lang/String;)V -SPLkotlinx/serialization/json/internal/JsonToStringWriter;->writeLong(J)V -Lkotlinx/serialization/json/internal/PolymorphicKt$WhenMappings; -SPLkotlinx/serialization/json/internal/PolymorphicKt$WhenMappings;->()V +SPLkotlinx/serialization/json/internal/JsonPath;->(Lkotlinx/serialization/json/JsonConfiguration;)V Lkotlinx/serialization/json/internal/StreamingJsonDecoder; SPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/json/internal/WriteMode;Lkotlinx/serialization/json/internal/AbstractJsonLexer;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/internal/StreamingJsonDecoder$DiscriminatorHolder;)V SPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeInt()I SPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeLong()J SPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeNotNullMark()Z SPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeSerializableValue(Lkotlinx/serialization/DeserializationStrategy;)Ljava/lang/Object; -Lkotlinx/serialization/json/internal/StreamingJsonEncoder; -SPLkotlinx/serialization/json/internal/StreamingJsonEncoder;->(Lkotlinx/serialization/json/internal/Composer;Lkotlinx/serialization/json/Json;Lkotlinx/serialization/json/internal/WriteMode;[Lkotlinx/serialization/json/JsonEncoder;)V -SPLkotlinx/serialization/json/internal/StreamingJsonEncoder;->(Lkotlinx/serialization/json/internal/InternalJsonWriter;Lkotlinx/serialization/json/Json;Lkotlinx/serialization/json/internal/WriteMode;[Lkotlinx/serialization/json/JsonEncoder;)V -SPLkotlinx/serialization/json/internal/StreamingJsonEncoder;->encodeInt(I)V -SPLkotlinx/serialization/json/internal/StreamingJsonEncoder;->encodeSerializableValue(Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V -SPLkotlinx/serialization/json/internal/StreamingJsonEncoder;->getJson()Lkotlinx/serialization/json/Json; +Lkotlinx/serialization/json/internal/StreamingJsonDecoder$DiscriminatorHolder; Lkotlinx/serialization/json/internal/StringJsonLexer; -SPLkotlinx/serialization/json/internal/StringJsonLexer;->(Ljava/lang/String;)V +SPLkotlinx/serialization/json/internal/StringJsonLexer;->(Ljava/lang/String;Lkotlinx/serialization/json/JsonConfiguration;)V SPLkotlinx/serialization/json/internal/StringJsonLexer;->consumeNextToken()B SPLkotlinx/serialization/json/internal/StringJsonLexer;->getSource()Ljava/lang/CharSequence; SPLkotlinx/serialization/json/internal/StringJsonLexer;->getSource()Ljava/lang/String; @@ -12359,11 +14966,14 @@ SPLkotlinx/serialization/json/internal/StringJsonLexer;->prefetchOrEof(I)I SPLkotlinx/serialization/json/internal/StringJsonLexer;->skipWhitespaces()I Lkotlinx/serialization/json/internal/StringJsonLexerKt; SPLkotlinx/serialization/json/internal/StringJsonLexerKt;->StringJsonLexer(Lkotlinx/serialization/json/Json;Ljava/lang/String;)Lkotlinx/serialization/json/internal/StringJsonLexer; +Lkotlinx/serialization/json/internal/StringOpsKt; +SPLkotlinx/serialization/json/internal/StringOpsKt;->()V +SPLkotlinx/serialization/json/internal/StringOpsKt;->printQuoted(Ljava/lang/StringBuilder;Ljava/lang/String;)V +SPLkotlinx/serialization/json/internal/StringOpsKt;->toHexChar(I)C Lkotlinx/serialization/json/internal/WriteMode; SPLkotlinx/serialization/json/internal/WriteMode;->$values()[Lkotlinx/serialization/json/internal/WriteMode; SPLkotlinx/serialization/json/internal/WriteMode;->()V SPLkotlinx/serialization/json/internal/WriteMode;->(Ljava/lang/String;ICC)V -SPLkotlinx/serialization/json/internal/WriteMode;->getEntries()Lkotlin/enums/EnumEntries; Lkotlinx/serialization/modules/SerialModuleImpl; SPLkotlinx/serialization/modules/SerialModuleImpl;->(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Z)V Lkotlinx/serialization/modules/SerializersModule; @@ -12573,25 +15183,17 @@ Lleakcanary/internal/LeakCanaryFileProvider$PathStrategy; Lleakcanary/internal/LeakCanaryFileProvider$SimplePathStrategy; SPLleakcanary/internal/LeakCanaryFileProvider$SimplePathStrategy;->(Ljava/lang/String;)V SPLleakcanary/internal/LeakCanaryFileProvider$SimplePathStrategy;->addRoot(Ljava/lang/String;Ljava/io/File;)V -Lleakcanary/internal/Notifications$$ExternalSyntheticApiModelOutline0; -SPLleakcanary/internal/Notifications$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageInfo;)J Lleakcanary/internal/PlumberInstaller; SPLleakcanary/internal/PlumberInstaller;->()V SPLleakcanary/internal/PlumberInstaller;->onCreate()Z Lnet/ankiweb/rsdroid/Backend; -SPLnet/ankiweb/rsdroid/Backend;->$r8$lambda$JmyIHcNIqENm31LmKFP63FgKLHI(Lnet/ankiweb/rsdroid/Backend;)Lnet/ankiweb/rsdroid/Translations; -SPLnet/ankiweb/rsdroid/Backend;->$r8$lambda$rLALQVYPlbbEmpwIB7kwMA6SO_U(II[BJ)[B SPLnet/ankiweb/rsdroid/Backend;->()V SPLnet/ankiweb/rsdroid/Backend;->(Ljava/lang/Iterable;)V SPLnet/ankiweb/rsdroid/Backend;->cancelCurrentProtoQuery(I)V -SPLnet/ankiweb/rsdroid/Backend;->checkMainThreadOp$default(Lnet/ankiweb/rsdroid/Backend;Ljava/lang/String;ILjava/lang/Object;)V -SPLnet/ankiweb/rsdroid/Backend;->checkMainThreadOp(Ljava/lang/String;)V -SPLnet/ankiweb/rsdroid/Backend;->checkMainThreadSQL(Ljava/lang/String;)V SPLnet/ankiweb/rsdroid/Backend;->fullQueryProto(Ljava/lang/String;[Ljava/lang/Object;)Lanki/ankidroid/DbResponse; SPLnet/ankiweb/rsdroid/Backend;->getTr()Lnet/ankiweb/rsdroid/Translations; SPLnet/ankiweb/rsdroid/Backend;->openCollection(Ljava/lang/String;)V -SPLnet/ankiweb/rsdroid/Backend;->openCollection(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V -SPLnet/ankiweb/rsdroid/Backend;->runMethodRaw$lambda$1(II[BJ)[B +SPLnet/ankiweb/rsdroid/Backend;->runMethodRaw$lambda$0(II[BJ)[B SPLnet/ankiweb/rsdroid/Backend;->runMethodRaw(II[B)[B SPLnet/ankiweb/rsdroid/Backend;->tr_delegate$lambda$0(Lnet/ankiweb/rsdroid/Backend;)Lnet/ankiweb/rsdroid/Translations; SPLnet/ankiweb/rsdroid/Backend;->withBackend(Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; @@ -12608,7 +15210,9 @@ Lnet/ankiweb/rsdroid/BackendException; SPLnet/ankiweb/rsdroid/BackendException;->()V SPLnet/ankiweb/rsdroid/BackendException;->(Lanki/backend/BackendError;)V Lnet/ankiweb/rsdroid/BackendException$BackendDbException; +Lnet/ankiweb/rsdroid/BackendException$BackendDbException$BackendDbCorruptException; Lnet/ankiweb/rsdroid/BackendException$BackendDbException$BackendDbFileTooNewException; +Lnet/ankiweb/rsdroid/BackendException$BackendDbException$BackendDbFullException; Lnet/ankiweb/rsdroid/BackendException$BackendDbException$BackendDbLockedException; Lnet/ankiweb/rsdroid/BackendException$BackendSearchException; Lnet/ankiweb/rsdroid/BackendException$Companion; @@ -12624,18 +15228,30 @@ SPLnet/ankiweb/rsdroid/BackendFactory;->getBackend$default(Ljava/lang/Iterable;I SPLnet/ankiweb/rsdroid/BackendFactory;->getBackend(Ljava/lang/Iterable;)Lnet/ankiweb/rsdroid/Backend; SPLnet/ankiweb/rsdroid/BackendFactory;->setDefaultLanguages(Ljava/lang/Iterable;)V Lnet/ankiweb/rsdroid/BackendKt; +SPLnet/ankiweb/rsdroid/BackendKt;->$r8$lambda$h6IVCdbvnaDg_XJznVj3rmenO90([Ljava/lang/Object;Lkotlinx/serialization/json/JsonArrayBuilder;)Lkotlin/Unit; +SPLnet/ankiweb/rsdroid/BackendKt;->()V +SPLnet/ankiweb/rsdroid/BackendKt;->access$getLogger$p()Lorg/slf4j/Logger; SPLnet/ankiweb/rsdroid/BackendKt;->access$unpackResult([[B)[B SPLnet/ankiweb/rsdroid/BackendKt;->dbRequestJson$default(Ljava/lang/String;[Ljava/lang/Object;ZILjava/lang/Object;)Lcom/google/protobuf/ByteString; +SPLnet/ankiweb/rsdroid/BackendKt;->dbRequestJson$lambda$0$0([Ljava/lang/Object;Lkotlinx/serialization/json/JsonArrayBuilder;)Lkotlin/Unit; SPLnet/ankiweb/rsdroid/BackendKt;->dbRequestJson(Ljava/lang/String;[Ljava/lang/Object;Z)Lcom/google/protobuf/ByteString; SPLnet/ankiweb/rsdroid/BackendKt;->unpackResult([[B)[B +Lnet/ankiweb/rsdroid/BackendKt$$ExternalSyntheticLambda1; +SPLnet/ankiweb/rsdroid/BackendKt$$ExternalSyntheticLambda1;->([Ljava/lang/Object;)V +SPLnet/ankiweb/rsdroid/BackendKt$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lnet/ankiweb/rsdroid/NativeMethods; SPLnet/ankiweb/rsdroid/NativeMethods;->()V SPLnet/ankiweb/rsdroid/NativeMethods;->()V Lnet/ankiweb/rsdroid/Translations; SPLnet/ankiweb/rsdroid/Translations;->(Lnet/ankiweb/rsdroid/Backend;)V +SPLnet/ankiweb/rsdroid/Translations;->actionsDecks()Ljava/lang/String; +SPLnet/ankiweb/rsdroid/Translations;->actionsEmptyCards()Ljava/lang/String; SPLnet/ankiweb/rsdroid/Translations;->actionsExport()Ljava/lang/String; +SPLnet/ankiweb/rsdroid/Translations;->actionsImport()Ljava/lang/String; SPLnet/ankiweb/rsdroid/Translations;->databaseCheckTitle()Ljava/lang/String; +SPLnet/ankiweb/rsdroid/Translations;->decksCreateDeck()Ljava/lang/String; SPLnet/ankiweb/rsdroid/Translations;->mediaCheckCheckMediaAction()Ljava/lang/String; +SPLnet/ankiweb/rsdroid/Translations;->statisticsTitle()Ljava/lang/String; SPLnet/ankiweb/rsdroid/Translations;->translate(IILjava/util/Map;)Ljava/lang/String; Lnet/ankiweb/rsdroid/database/AnkiDatabaseCursor; SPLnet/ankiweb/rsdroid/database/AnkiDatabaseCursor;->()V @@ -12649,7 +15265,6 @@ SPLnet/ankiweb/rsdroid/database/AnkiSupportSQLiteDatabase$Companion;->withRustBa Lnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase; SPLnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase;->()V SPLnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase;->(Lnet/ankiweb/rsdroid/Backend;)V -SPLnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase;->execSQL(Ljava/lang/String;[Ljava/lang/Object;)V SPLnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase;->query(Ljava/lang/String;[Ljava/lang/Object;)Landroid/database/Cursor; Lnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase$Companion; SPLnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase$Companion;->()V @@ -12679,6 +15294,7 @@ SPLokhttp3/Authenticator$Companion;->()V SPLokhttp3/Authenticator$Companion;->()V Lokhttp3/Authenticator$Companion$AuthenticatorNone; SPLokhttp3/Authenticator$Companion$AuthenticatorNone;->()V +Lokhttp3/Cache; Lokhttp3/Call$Factory; Lokhttp3/CertificatePinner; SPLokhttp3/CertificatePinner;->()V @@ -12738,8 +15354,8 @@ SPLokhttp3/Dns;->()V Lokhttp3/Dns$Companion; SPLokhttp3/Dns$Companion;->()V SPLokhttp3/Dns$Companion;->()V -Lokhttp3/Dns$Companion$DnsSystem; -SPLokhttp3/Dns$Companion$DnsSystem;->()V +Lokhttp3/Dns$Companion$SYSTEM$1; +SPLokhttp3/Dns$Companion$SYSTEM$1;->()V Lokhttp3/EventListener; SPLokhttp3/EventListener;->()V SPLokhttp3/EventListener;->()V @@ -12758,6 +15374,7 @@ SPLokhttp3/OkHttpClient;->verifyClientState()V Lokhttp3/OkHttpClient$Builder; SPLokhttp3/OkHttpClient$Builder;->()V SPLokhttp3/OkHttpClient$Builder;->build()Lokhttp3/OkHttpClient; +SPLokhttp3/OkHttpClient$Builder;->connectTimeout(JLjava/util/concurrent/TimeUnit;)Lokhttp3/OkHttpClient$Builder; SPLokhttp3/OkHttpClient$Builder;->getAuthenticator$okhttp()Lokhttp3/Authenticator; SPLokhttp3/OkHttpClient$Builder;->getCache$okhttp()Lokhttp3/Cache; SPLokhttp3/OkHttpClient$Builder;->getCallTimeout$okhttp()I @@ -12789,6 +15406,7 @@ SPLokhttp3/OkHttpClient$Builder;->getSslSocketFactoryOrNull$okhttp()Ljavax/net/s SPLokhttp3/OkHttpClient$Builder;->getTaskRunner$okhttp()Lokhttp3/internal/concurrent/TaskRunner; SPLokhttp3/OkHttpClient$Builder;->getWebSocketCloseTimeout$okhttp()I SPLokhttp3/OkHttpClient$Builder;->getWriteTimeout$okhttp()I +SPLokhttp3/OkHttpClient$Builder;->readTimeout(JLjava/util/concurrent/TimeUnit;)Lokhttp3/OkHttpClient$Builder; SPLokhttp3/OkHttpClient$Builder;->setConnectionPool$okhttp(Lokhttp3/ConnectionPool;)V Lokhttp3/OkHttpClient$Companion; SPLokhttp3/OkHttpClient$Companion;->()V @@ -12811,9 +15429,18 @@ Lokhttp3/TlsVersion$Companion; SPLokhttp3/TlsVersion$Companion;->()V SPLokhttp3/TlsVersion$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/WebSocket$Factory; +Lokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0; +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ActivityManager;Ljava/lang/String;II)Ljava/util/List; +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ApplicationExitInfo;)I +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ApplicationExitInfo;)J +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/job/JobScheduler;Ljava/lang/String;)Landroid/app/job/JobScheduler; +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageInfo;)J +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Lcom/google/android/material/navigation/NavigationBarItemView;Z)V +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/app/ApplicationExitInfo; Lokhttp3/internal/_UtilJvmKt; SPLokhttp3/internal/_UtilJvmKt;->()V SPLokhttp3/internal/_UtilJvmKt;->asFactory(Lokhttp3/EventListener;)Lokhttp3/EventListener$Factory; +SPLokhttp3/internal/_UtilJvmKt;->checkDuration(Ljava/lang/String;JLjava/util/concurrent/TimeUnit;)I SPLokhttp3/internal/_UtilJvmKt;->immutableListOf([Ljava/lang/Object;)Ljava/util/List; SPLokhttp3/internal/_UtilJvmKt;->threadFactory(Ljava/lang/String;Z)Ljava/util/concurrent/ThreadFactory; SPLokhttp3/internal/_UtilJvmKt;->toImmutableList(Ljava/util/List;)Ljava/util/List; @@ -12882,6 +15509,7 @@ Lokhttp3/internal/platform/Platform; SPLokhttp3/internal/platform/Platform;->()V SPLokhttp3/internal/platform/Platform;->()V SPLokhttp3/internal/platform/Platform;->access$getPlatform$cp()Lokhttp3/internal/platform/Platform; +SPLokhttp3/internal/platform/Platform;->getSocketFactory()Ljavax/net/SocketFactory; SPLokhttp3/internal/platform/Platform;->newSSLContext()Ljavax/net/ssl/SSLContext; SPLokhttp3/internal/platform/Platform;->newSslSocketFactory(Ljavax/net/ssl/X509TrustManager;)Ljavax/net/ssl/SSLSocketFactory; SPLokhttp3/internal/platform/Platform;->platformTrustManager()Ljavax/net/ssl/X509TrustManager; @@ -12912,6 +15540,13 @@ SPLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->() SPLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->buildIfSupported()Lokhttp3/internal/platform/android/SocketAdapter; SPLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->isSupported()Z +Lokhttp3/internal/platform/android/Android17SocketAdapter; +SPLokhttp3/internal/platform/android/Android17SocketAdapter;->()V +Lokhttp3/internal/platform/android/Android17SocketAdapter$Companion; +SPLokhttp3/internal/platform/android/Android17SocketAdapter$Companion;->()V +SPLokhttp3/internal/platform/android/Android17SocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/internal/platform/android/Android17SocketAdapter$Companion;->buildIfSupported()Lokhttp3/internal/platform/android/SocketAdapter; +SPLokhttp3/internal/platform/android/Android17SocketAdapter$Companion;->isSupported()Z Lokhttp3/internal/platform/android/AndroidCertificateChainCleaner; SPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->()V SPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->(Ljavax/net/ssl/X509TrustManager;Landroid/net/http/X509TrustManagerExtensions;)V @@ -13476,7 +16111,6 @@ Lorg/acra/plugins/Plugin; SPLorg/acra/plugins/Plugin;->enabled(Lorg/acra/config/CoreConfiguration;)Z Lorg/acra/plugins/PluginLoader; Lorg/acra/plugins/ServicePluginLoader; -SPLorg/acra/plugins/ServicePluginLoader;->$r8$lambda$X5rStCy9IDyElcrTUR-B0dHkgMM(Lorg/acra/config/CoreConfiguration;Lorg/acra/plugins/Plugin;)Z SPLorg/acra/plugins/ServicePluginLoader;->()V SPLorg/acra/plugins/ServicePluginLoader;->loadEnabled$lambda$1(Lorg/acra/config/CoreConfiguration;Lorg/acra/plugins/Plugin;)Z SPLorg/acra/plugins/ServicePluginLoader;->loadEnabled(Lorg/acra/config/CoreConfiguration;Ljava/lang/Class;)Ljava/util/List; @@ -13523,8 +16157,6 @@ SPLorg/acra/startup/LimiterStartupProcessor;->getAppVersion(Landroid/content/Con SPLorg/acra/startup/LimiterStartupProcessor;->processReports(Landroid/content/Context;Lorg/acra/config/CoreConfiguration;Ljava/util/List;)V Lorg/acra/startup/StartupProcessor; Lorg/acra/startup/StartupProcessorExecutor; -SPLorg/acra/startup/StartupProcessorExecutor;->$r8$lambda$W_8qJ1kpfZSMo-TAJnbbb_8HKG0(Lorg/acra/startup/StartupProcessorExecutor;Ljava/util/Calendar;Z)V -SPLorg/acra/startup/StartupProcessorExecutor;->$r8$lambda$b6D4DyjR05uSsPw8YS-CzMN464s(Lorg/acra/startup/StartupProcessorExecutor;Ljava/util/Calendar;Z)V SPLorg/acra/startup/StartupProcessorExecutor;->(Landroid/content/Context;Lorg/acra/config/CoreConfiguration;Lorg/acra/scheduler/SchedulerStarter;)V SPLorg/acra/startup/StartupProcessorExecutor;->processReports$lambda$6$lambda$5(Lorg/acra/startup/StartupProcessorExecutor;Ljava/util/Calendar;Z)V SPLorg/acra/startup/StartupProcessorExecutor;->processReports$lambda$6(Lorg/acra/startup/StartupProcessorExecutor;Ljava/util/Calendar;Z)V @@ -13569,42 +16201,100 @@ Lorg/acra/util/StubCreator$$ExternalSyntheticLambda0; SPLorg/acra/util/StubCreator$$ExternalSyntheticLambda0;->()V Lorg/acra/util/SystemServices$ServiceNotReachedException; Lorg/slf4j/ILoggerFactory; +Lorg/slf4j/IMarkerFactory; Lorg/slf4j/Logger; Lorg/slf4j/LoggerFactory; SPLorg/slf4j/LoggerFactory;->()V SPLorg/slf4j/LoggerFactory;->bind()V +SPLorg/slf4j/LoggerFactory;->earlyBindMDCAdapter()V +SPLorg/slf4j/LoggerFactory;->findServiceProviders()Ljava/util/List; SPLorg/slf4j/LoggerFactory;->fixSubstituteLoggers()V SPLorg/slf4j/LoggerFactory;->getILoggerFactory()Lorg/slf4j/ILoggerFactory; SPLorg/slf4j/LoggerFactory;->getLogger(Ljava/lang/Class;)Lorg/slf4j/Logger; SPLorg/slf4j/LoggerFactory;->getLogger(Ljava/lang/String;)Lorg/slf4j/Logger; -SPLorg/slf4j/LoggerFactory;->isAndroid()Z +SPLorg/slf4j/LoggerFactory;->getProvider()Lorg/slf4j/spi/SLF4JServiceProvider; +SPLorg/slf4j/LoggerFactory;->getServiceLoader(Ljava/lang/ClassLoader;)Ljava/util/ServiceLoader; +SPLorg/slf4j/LoggerFactory;->isAmbiguousProviderList(Ljava/util/List;)Z +SPLorg/slf4j/LoggerFactory;->loadExplicitlySpecified(Ljava/lang/ClassLoader;)Lorg/slf4j/spi/SLF4JServiceProvider; SPLorg/slf4j/LoggerFactory;->performInitialization()V SPLorg/slf4j/LoggerFactory;->postBindCleanUp()V SPLorg/slf4j/LoggerFactory;->replayEvents()V -SPLorg/slf4j/LoggerFactory;->reportActualBinding(Ljava/util/Set;)V +SPLorg/slf4j/LoggerFactory;->reportActualBinding(Ljava/util/List;)V +SPLorg/slf4j/LoggerFactory;->reportMultipleBindingAmbiguity(Ljava/util/List;)V +SPLorg/slf4j/LoggerFactory;->safelyInstantiate(Ljava/util/List;Ljava/util/Iterator;)V SPLorg/slf4j/LoggerFactory;->versionSanityCheck()V -Lorg/slf4j/helpers/MarkerIgnoringBase; -SPLorg/slf4j/helpers/MarkerIgnoringBase;->()V +Lorg/slf4j/MDC; +SPLorg/slf4j/MDC;->setMDCAdapter(Lorg/slf4j/spi/MDCAdapter;)V +Lorg/slf4j/event/Level; +SPLorg/slf4j/event/Level;->$values()[Lorg/slf4j/event/Level; +SPLorg/slf4j/event/Level;->()V +SPLorg/slf4j/event/Level;->(Ljava/lang/String;IILjava/lang/String;)V +SPLorg/slf4j/event/Level;->values()[Lorg/slf4j/event/Level; +Lorg/slf4j/helpers/AbstractLogger; +SPLorg/slf4j/helpers/AbstractLogger;->()V +SPLorg/slf4j/helpers/AbstractLogger;->debug(Ljava/lang/String;Ljava/lang/Object;)V +SPLorg/slf4j/helpers/AbstractLogger;->handle_0ArgsCall(Lorg/slf4j/event/Level;Lorg/slf4j/Marker;Ljava/lang/String;Ljava/lang/Throwable;)V +SPLorg/slf4j/helpers/AbstractLogger;->handle_1ArgsCall(Lorg/slf4j/event/Level;Lorg/slf4j/Marker;Ljava/lang/String;Ljava/lang/Object;)V +SPLorg/slf4j/helpers/AbstractLogger;->info(Lorg/slf4j/Marker;Ljava/lang/String;Ljava/lang/Throwable;)V +Lorg/slf4j/helpers/BasicMDCAdapter; +SPLorg/slf4j/helpers/BasicMDCAdapter;->()V +Lorg/slf4j/helpers/BasicMDCAdapter$1; +SPLorg/slf4j/helpers/BasicMDCAdapter$1;->(Lorg/slf4j/helpers/BasicMDCAdapter;)V +Lorg/slf4j/helpers/BasicMarkerFactory; +SPLorg/slf4j/helpers/BasicMarkerFactory;->()V +Lorg/slf4j/helpers/FormattingTuple; +SPLorg/slf4j/helpers/FormattingTuple;->()V +SPLorg/slf4j/helpers/FormattingTuple;->(Ljava/lang/String;)V +SPLorg/slf4j/helpers/FormattingTuple;->(Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V +SPLorg/slf4j/helpers/FormattingTuple;->getMessage()Ljava/lang/String; +Lorg/slf4j/helpers/LegacyAbstractLogger; +SPLorg/slf4j/helpers/LegacyAbstractLogger;->()V +SPLorg/slf4j/helpers/LegacyAbstractLogger;->isInfoEnabled(Lorg/slf4j/Marker;)Z +Lorg/slf4j/helpers/MessageFormatter; +SPLorg/slf4j/helpers/MessageFormatter;->arrayFormat(Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)Lorg/slf4j/helpers/FormattingTuple; +SPLorg/slf4j/helpers/MessageFormatter;->basicArrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; +SPLorg/slf4j/helpers/MessageFormatter;->deeplyAppendParameter(Ljava/lang/StringBuilder;Ljava/lang/Object;Ljava/util/Map;)V +SPLorg/slf4j/helpers/MessageFormatter;->isEscapedDelimeter(Ljava/lang/String;I)Z +SPLorg/slf4j/helpers/MessageFormatter;->safeObjectAppend(Ljava/lang/StringBuilder;Ljava/lang/Object;)V Lorg/slf4j/helpers/NOPLoggerFactory; SPLorg/slf4j/helpers/NOPLoggerFactory;->()V -Lorg/slf4j/helpers/NamedLoggerBase; -SPLorg/slf4j/helpers/NamedLoggerBase;->()V +Lorg/slf4j/helpers/NOPMDCAdapter; +SPLorg/slf4j/helpers/NOPMDCAdapter;->()V +Lorg/slf4j/helpers/NOP_FallbackServiceProvider; +SPLorg/slf4j/helpers/NOP_FallbackServiceProvider;->()V +SPLorg/slf4j/helpers/NOP_FallbackServiceProvider;->()V +Lorg/slf4j/helpers/Reporter; +SPLorg/slf4j/helpers/Reporter;->()V +SPLorg/slf4j/helpers/Reporter;->debug(Ljava/lang/String;)V +SPLorg/slf4j/helpers/Reporter;->getTargetChoice()Lorg/slf4j/helpers/Reporter$TargetChoice; +SPLorg/slf4j/helpers/Reporter;->initVerbosity()Lorg/slf4j/helpers/Reporter$Level; +SPLorg/slf4j/helpers/Reporter;->isEnabledFor(Lorg/slf4j/helpers/Reporter$Level;)Z +Lorg/slf4j/helpers/Reporter$Level; +SPLorg/slf4j/helpers/Reporter$Level;->$values()[Lorg/slf4j/helpers/Reporter$Level; +SPLorg/slf4j/helpers/Reporter$Level;->()V +SPLorg/slf4j/helpers/Reporter$Level;->(Ljava/lang/String;II)V +Lorg/slf4j/helpers/Reporter$TargetChoice; +SPLorg/slf4j/helpers/Reporter$TargetChoice;->$values()[Lorg/slf4j/helpers/Reporter$TargetChoice; +SPLorg/slf4j/helpers/Reporter$TargetChoice;->()V +SPLorg/slf4j/helpers/Reporter$TargetChoice;->(Ljava/lang/String;I)V Lorg/slf4j/helpers/SubstituteLoggerFactory; SPLorg/slf4j/helpers/SubstituteLoggerFactory;->()V SPLorg/slf4j/helpers/SubstituteLoggerFactory;->clear()V SPLorg/slf4j/helpers/SubstituteLoggerFactory;->getEventQueue()Ljava/util/concurrent/LinkedBlockingQueue; SPLorg/slf4j/helpers/SubstituteLoggerFactory;->getLoggers()Ljava/util/List; SPLorg/slf4j/helpers/SubstituteLoggerFactory;->postInitialization()V +Lorg/slf4j/helpers/SubstituteServiceProvider; +SPLorg/slf4j/helpers/SubstituteServiceProvider;->()V +SPLorg/slf4j/helpers/SubstituteServiceProvider;->getSubstituteLoggerFactory()Lorg/slf4j/helpers/SubstituteLoggerFactory; +Lorg/slf4j/helpers/ThreadLocalMapOfStacks; +SPLorg/slf4j/helpers/ThreadLocalMapOfStacks;->()V Lorg/slf4j/helpers/Util; SPLorg/slf4j/helpers/Util;->()V SPLorg/slf4j/helpers/Util;->safeGetBooleanSystemProperty(Ljava/lang/String;)Z SPLorg/slf4j/helpers/Util;->safeGetSystemProperty(Ljava/lang/String;)Ljava/lang/String; -Lorg/slf4j/impl/StaticLoggerBinder; -SPLorg/slf4j/impl/StaticLoggerBinder;->()V -SPLorg/slf4j/impl/StaticLoggerBinder;->()V -SPLorg/slf4j/impl/StaticLoggerBinder;->getLoggerFactory()Lorg/slf4j/ILoggerFactory; -SPLorg/slf4j/impl/StaticLoggerBinder;->getSingleton()Lorg/slf4j/impl/StaticLoggerBinder; -Lorg/slf4j/spi/LoggerFactoryBinder; +Lorg/slf4j/spi/LocationAwareLogger; +Lorg/slf4j/spi/MDCAdapter; +Lorg/slf4j/spi/SLF4JServiceProvider; Lshark/AndroidMetadataExtractor; SPLshark/AndroidMetadataExtractor;->()V SPLshark/AndroidMetadataExtractor;->()V @@ -14384,15 +17074,16 @@ SPLtimber/log/Timber;->()V SPLtimber/log/Timber;->access$getTreeArray$cp()[Ltimber/log/Timber$Tree; SPLtimber/log/Timber;->access$getTrees$cp()Ljava/util/ArrayList; SPLtimber/log/Timber;->access$setTreeArray$cp([Ltimber/log/Timber$Tree;)V -SPLtimber/log/Timber;->tag(Ljava/lang/String;)Ltimber/log/Timber$Tree; Ltimber/log/Timber$Forest; SPLtimber/log/Timber$Forest;->()V SPLtimber/log/Timber$Forest;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V SPLtimber/log/Timber$Forest;->d(Ljava/lang/String;[Ljava/lang/Object;)V SPLtimber/log/Timber$Forest;->i(Ljava/lang/String;[Ljava/lang/Object;)V +SPLtimber/log/Timber$Forest;->log(ILjava/lang/Throwable;Ljava/lang/String;[Ljava/lang/Object;)V SPLtimber/log/Timber$Forest;->plant(Ltimber/log/Timber$Tree;)V SPLtimber/log/Timber$Forest;->tag(Ljava/lang/String;)Ltimber/log/Timber$Tree; SPLtimber/log/Timber$Forest;->v(Ljava/lang/String;[Ljava/lang/Object;)V +PLtimber/log/Timber$Forest;->w(Ljava/lang/String;[Ljava/lang/Object;)V Ltimber/log/Timber$Tree; SPLtimber/log/Timber$Tree;->()V SPLtimber/log/Timber$Tree;->d(Ljava/lang/String;[Ljava/lang/Object;)V @@ -14402,5 +17093,7 @@ SPLtimber/log/Timber$Tree;->getTag$timber_release()Ljava/lang/String; SPLtimber/log/Timber$Tree;->i(Ljava/lang/String;[Ljava/lang/Object;)V SPLtimber/log/Timber$Tree;->isLoggable(I)Z SPLtimber/log/Timber$Tree;->isLoggable(Ljava/lang/String;I)Z +SPLtimber/log/Timber$Tree;->log(ILjava/lang/Throwable;Ljava/lang/String;[Ljava/lang/Object;)V SPLtimber/log/Timber$Tree;->prepareLog(ILjava/lang/Throwable;Ljava/lang/String;[Ljava/lang/Object;)V -SPLtimber/log/Timber$Tree;->v(Ljava/lang/String;[Ljava/lang/Object;)V \ No newline at end of file +SPLtimber/log/Timber$Tree;->v(Ljava/lang/String;[Ljava/lang/Object;)V +PLtimber/log/Timber$Tree;->w(Ljava/lang/String;[Ljava/lang/Object;)V \ No newline at end of file diff --git a/AnkiDroid/src/main/generated/baselineProfiles/startup-prof.txt b/AnkiDroid/src/main/generated/baselineProfiles/startup-prof.txt new file mode 100644 index 000000000000..7fcf022abff2 --- /dev/null +++ b/AnkiDroid/src/main/generated/baselineProfiles/startup-prof.txt @@ -0,0 +1,15846 @@ +Landroid/net/ssl/InvalidEchDataException; +Landroid/support/customtabs/ICustomTabsCallback; +SPLandroid/support/customtabs/ICustomTabsCallback;->()V +Landroid/support/customtabs/ICustomTabsCallback$Stub; +SPLandroid/support/customtabs/ICustomTabsCallback$Stub;->()V +SPLandroid/support/customtabs/ICustomTabsCallback$Stub;->asBinder()Landroid/os/IBinder; +Landroid/support/customtabs/ICustomTabsService; +SPLandroid/support/customtabs/ICustomTabsService;->()V +Landroid/support/customtabs/ICustomTabsService$Stub; +SPLandroid/support/customtabs/ICustomTabsService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/support/customtabs/ICustomTabsService; +Landroid/support/customtabs/ICustomTabsService$Stub$Proxy; +SPLandroid/support/customtabs/ICustomTabsService$Stub$Proxy;->(Landroid/os/IBinder;)V +SPLandroid/support/customtabs/ICustomTabsService$Stub$Proxy;->newSession(Landroid/support/customtabs/ICustomTabsCallback;)Z +SPLandroid/support/customtabs/ICustomTabsService$Stub$Proxy;->warmup(J)Z +Landroidx/activity/ActivityFlags; +SPLandroidx/activity/ActivityFlags;->()V +SPLandroidx/activity/ActivityFlags;->()V +Landroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0; +SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/Insets;)I +SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/Window;Z)V +SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/graphics/Insets;)I +SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/graphics/Insets;)I +SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;)Landroid/window/OnBackInvokedDispatcher; +SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Insets;)I +SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowManager$LayoutParams;I)V +SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/window/OnBackInvokedDispatcher;ILandroid/window/OnBackInvokedCallback;)V +SPLandroidx/activity/BackEventCompat$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/window/OnBackInvokedCallback; +Landroidx/activity/ComponentActivity; +SPLandroidx/activity/ComponentActivity;->()V +SPLandroidx/activity/ComponentActivity;->()V +SPLandroidx/activity/ComponentActivity;->(I)V +SPLandroidx/activity/ComponentActivity;->_init_$lambda$1(Landroidx/activity/ComponentActivity;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/activity/ComponentActivity;->_init_$lambda$2(Landroidx/activity/ComponentActivity;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/activity/ComponentActivity;->_init_$lambda$4(Landroidx/activity/ComponentActivity;Landroid/content/Context;)V +SPLandroidx/activity/ComponentActivity;->access$ensureViewModelStore(Landroidx/activity/ComponentActivity;)V +SPLandroidx/activity/ComponentActivity;->addMenuProvider(Landroidx/core/view/MenuProvider;)V +SPLandroidx/activity/ComponentActivity;->addObserverForBackInvoker$lambda$0(Landroidx/activity/OnBackPressedDispatcher;Landroidx/activity/ComponentActivity;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/activity/ComponentActivity;->addObserverForBackInvoker(Landroidx/activity/OnBackPressedDispatcher;)V +SPLandroidx/activity/ComponentActivity;->addOnConfigurationChangedListener(Landroidx/core/util/Consumer;)V +SPLandroidx/activity/ComponentActivity;->addOnContextAvailableListener(Landroidx/activity/contextaware/OnContextAvailableListener;)V +SPLandroidx/activity/ComponentActivity;->addOnMultiWindowModeChangedListener(Landroidx/core/util/Consumer;)V +SPLandroidx/activity/ComponentActivity;->addOnNewIntentListener(Landroidx/core/util/Consumer;)V +SPLandroidx/activity/ComponentActivity;->addOnPictureInPictureModeChangedListener(Landroidx/core/util/Consumer;)V +SPLandroidx/activity/ComponentActivity;->addOnTrimMemoryListener(Landroidx/core/util/Consumer;)V +SPLandroidx/activity/ComponentActivity;->createFullyDrawnExecutor()Landroidx/activity/ComponentActivity$ReportFullyDrawnExecutor; +SPLandroidx/activity/ComponentActivity;->defaultViewModelProviderFactory_delegate$lambda$0(Landroidx/activity/ComponentActivity;)Landroidx/lifecycle/SavedStateViewModelFactory; +SPLandroidx/activity/ComponentActivity;->ensureViewModelStore()V +SPLandroidx/activity/ComponentActivity;->getActivityResultRegistry()Landroidx/activity/result/ActivityResultRegistry; +SPLandroidx/activity/ComponentActivity;->getDefaultViewModelCreationExtras()Landroidx/lifecycle/viewmodel/CreationExtras; +SPLandroidx/activity/ComponentActivity;->getDefaultViewModelProviderFactory()Landroidx/lifecycle/ViewModelProvider$Factory; +SPLandroidx/activity/ComponentActivity;->getLifecycle()Landroidx/lifecycle/Lifecycle; +SPLandroidx/activity/ComponentActivity;->getOnBackPressedDispatcher()Landroidx/activity/OnBackPressedDispatcher; +SPLandroidx/activity/ComponentActivity;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; +SPLandroidx/activity/ComponentActivity;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; +SPLandroidx/activity/ComponentActivity;->initializeViewTreeOwners()V +SPLandroidx/activity/ComponentActivity;->invalidateMenu()V +SPLandroidx/activity/ComponentActivity;->menuHostHelper$lambda$0(Landroidx/activity/ComponentActivity;)V +SPLandroidx/activity/ComponentActivity;->onBackPressedDispatcher_delegate$lambda$0(Landroidx/activity/ComponentActivity;)Landroidx/activity/OnBackPressedDispatcher; +SPLandroidx/activity/ComponentActivity;->onCreate(Landroid/os/Bundle;)V +SPLandroidx/activity/ComponentActivity;->onCreatePanelMenu(ILandroid/view/Menu;)Z +SPLandroidx/activity/ComponentActivity;->onPreparePanel(ILandroid/view/View;Landroid/view/Menu;)Z +SPLandroidx/activity/ComponentActivity;->registerForActivityResult(Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher; +SPLandroidx/activity/ComponentActivity;->registerForActivityResult(Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultRegistry;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher; +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda0; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;->(Landroidx/activity/ComponentActivity;)V +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;->run()V +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda10; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda10;->(Landroidx/activity/ComponentActivity;)V +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda10;->invoke()Ljava/lang/Object; +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda11; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda11;->(Landroidx/activity/ComponentActivity;)V +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda11;->invoke()Ljava/lang/Object; +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda12; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda12;->(Landroidx/activity/ComponentActivity;)V +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda2; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;->(Landroidx/activity/OnBackPressedDispatcher;Landroidx/activity/ComponentActivity;)V +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda4; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda4;->(Landroidx/activity/ComponentActivity;)V +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda5; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda5;->(Landroidx/activity/ComponentActivity;)V +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda6; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda6;->(Landroidx/activity/ComponentActivity;)V +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda6;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda7; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda7;->(Landroidx/activity/ComponentActivity;)V +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda7;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda8; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda8;->(Landroidx/activity/ComponentActivity;)V +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda9; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda9;->(Landroidx/activity/ComponentActivity;)V +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda9;->onContextAvailable(Landroid/content/Context;)V +Landroidx/activity/ComponentActivity$4; +SPLandroidx/activity/ComponentActivity$4;->(Landroidx/activity/ComponentActivity;)V +SPLandroidx/activity/ComponentActivity$4;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/activity/ComponentActivity$Companion; +SPLandroidx/activity/ComponentActivity$Companion;->()V +SPLandroidx/activity/ComponentActivity$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/activity/ComponentActivity$NonConfigurationInstances; +Landroidx/activity/ComponentActivity$ReportFullyDrawnExecutor; +Landroidx/activity/ComponentActivity$ReportFullyDrawnExecutorImpl; +SPLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorImpl;->(Landroidx/activity/ComponentActivity;)V +Landroidx/activity/ComponentActivity$activityResultRegistry$1; +SPLandroidx/activity/ComponentActivity$activityResultRegistry$1;->(Landroidx/activity/ComponentActivity;)V +Landroidx/activity/EdgeToEdge; +SPLandroidx/activity/EdgeToEdge;->()V +SPLandroidx/activity/EdgeToEdge;->enable(Landroidx/activity/ComponentActivity;Landroidx/activity/SystemBarStyle;Landroidx/activity/SystemBarStyle;)V +Landroidx/activity/EdgeToEdgeApi26; +SPLandroidx/activity/EdgeToEdgeApi26;->()V +Landroidx/activity/EdgeToEdgeApi28; +SPLandroidx/activity/EdgeToEdgeApi28;->()V +Landroidx/activity/EdgeToEdgeApi29; +SPLandroidx/activity/EdgeToEdgeApi29;->()V +Landroidx/activity/EdgeToEdgeApi30; +SPLandroidx/activity/EdgeToEdgeApi30;->()V +SPLandroidx/activity/EdgeToEdgeApi30;->adjustLayoutInDisplayCutoutMode(Landroid/view/Window;)V +Landroidx/activity/EdgeToEdgeApi35; +SPLandroidx/activity/EdgeToEdgeApi35;->()V +SPLandroidx/activity/EdgeToEdgeApi35;->setUp(Landroidx/activity/SystemBarStyle;Landroidx/activity/SystemBarStyle;Landroid/view/Window;Landroid/view/View;ZZ)V +Landroidx/activity/EdgeToEdgeBase; +SPLandroidx/activity/EdgeToEdgeBase;->()V +Landroidx/activity/EdgeToEdgeImpl; +Landroidx/activity/FullyDrawnReporterOwner; +Landroidx/activity/OnBackPressedCallback; +SPLandroidx/activity/OnBackPressedCallback;->(Z)V +SPLandroidx/activity/OnBackPressedCallback;->addCloseable$activity(Ljava/lang/AutoCloseable;)V +SPLandroidx/activity/OnBackPressedCallback;->createNavigationEventHandler$activity(Landroidx/navigationevent/NavigationEventInfo;)Landroidx/activity/OnBackPressedCallback$OnBackPressedEventHandler; +SPLandroidx/activity/OnBackPressedCallback;->isEnabled()Z +SPLandroidx/activity/OnBackPressedCallback;->setEnabled(Z)V +Landroidx/activity/OnBackPressedCallback$OnBackPressedEventHandler; +SPLandroidx/activity/OnBackPressedCallback$OnBackPressedEventHandler;->(Landroidx/activity/OnBackPressedCallback;Landroidx/navigationevent/NavigationEventInfo;)V +SPLandroidx/activity/OnBackPressedCallback$OnBackPressedEventHandler;->isLifecycleActive()Z +SPLandroidx/activity/OnBackPressedCallback$OnBackPressedEventHandler;->setLifecycleActive(Z)V +Landroidx/activity/OnBackPressedCallbackInfo; +SPLandroidx/activity/OnBackPressedCallbackInfo;->(Landroidx/activity/OnBackPressedCallback;Landroidx/lifecycle/LifecycleOwner;)V +Landroidx/activity/OnBackPressedDispatcher; +SPLandroidx/activity/OnBackPressedDispatcher;->(Ljava/lang/Runnable;)V +SPLandroidx/activity/OnBackPressedDispatcher;->(Ljava/lang/Runnable;Landroidx/core/util/Consumer;)V +SPLandroidx/activity/OnBackPressedDispatcher;->access$getOnHasEnabledCallbacksChanged$p(Landroidx/activity/OnBackPressedDispatcher;)Landroidx/core/util/Consumer; +SPLandroidx/activity/OnBackPressedDispatcher;->access$setHasEnabledCallbacks$p(Landroidx/activity/OnBackPressedDispatcher;Z)V +SPLandroidx/activity/OnBackPressedDispatcher;->addCallback(Landroidx/lifecycle/LifecycleOwner;Landroidx/activity/OnBackPressedCallback;)V +SPLandroidx/activity/OnBackPressedDispatcher;->eventInput_delegate$lambda$0(Landroidx/activity/OnBackPressedDispatcher;)Landroidx/activity/OnBackPressedDispatcher$OnBackPressedEventInput; +SPLandroidx/activity/OnBackPressedDispatcher;->getEventDispatcher$activity()Landroidx/navigationevent/NavigationEventDispatcher; +SPLandroidx/activity/OnBackPressedDispatcher;->getEventInput()Landroidx/activity/OnBackPressedDispatcher$OnBackPressedEventInput; +SPLandroidx/activity/OnBackPressedDispatcher;->setOnBackInvokedDispatcher(Landroid/window/OnBackInvokedDispatcher;)V +Landroidx/activity/OnBackPressedDispatcher$$ExternalSyntheticLambda0; +SPLandroidx/activity/OnBackPressedDispatcher$$ExternalSyntheticLambda0;->(Landroidx/activity/OnBackPressedDispatcher;)V +SPLandroidx/activity/OnBackPressedDispatcher$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/activity/OnBackPressedDispatcher$OnBackPressedEventInput; +SPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedEventInput;->(Landroidx/activity/OnBackPressedDispatcher;)V +SPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedEventInput;->getDispatcher()Landroidx/navigationevent/NavigationEventDispatcher; +SPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedEventInput;->onHasEnabledHandlersChanged(Z)V +Landroidx/activity/OnBackPressedDispatcher$OnBackPressedEventInput$$ExternalSyntheticLambda0; +SPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedEventInput$$ExternalSyntheticLambda0;->(Landroidx/activity/OnBackPressedDispatcher;)V +Landroidx/activity/OnBackPressedDispatcher$addCallback$lifecycleObserver$1; +SPLandroidx/activity/OnBackPressedDispatcher$addCallback$lifecycleObserver$1;->(Landroidx/activity/OnBackPressedCallback$OnBackPressedEventHandler;Landroidx/activity/OnBackPressedDispatcher;Landroidx/lifecycle/Lifecycle;)V +SPLandroidx/activity/OnBackPressedDispatcher$addCallback$lifecycleObserver$1;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/activity/OnBackPressedDispatcherOwner; +Landroidx/activity/R$id; +Landroidx/activity/SystemBarStyle; +SPLandroidx/activity/SystemBarStyle;->()V +SPLandroidx/activity/SystemBarStyle;->(IIILkotlin/jvm/functions/Function1;)V +SPLandroidx/activity/SystemBarStyle;->(IIILkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/activity/SystemBarStyle;->getDetectDarkMode$activity()Lkotlin/jvm/functions/Function1; +SPLandroidx/activity/SystemBarStyle;->getNightMode$activity()I +SPLandroidx/activity/SystemBarStyle;->getScrimWithEnforcedContrast$activity(Z)I +Landroidx/activity/SystemBarStyle$Companion; +SPLandroidx/activity/SystemBarStyle$Companion;->()V +SPLandroidx/activity/SystemBarStyle$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/activity/SystemBarStyle$Companion;->auto(IILkotlin/jvm/functions/Function1;)Landroidx/activity/SystemBarStyle; +Landroidx/activity/ViewTreeFullyDrawnReporterOwner; +SPLandroidx/activity/ViewTreeFullyDrawnReporterOwner;->set(Landroid/view/View;Landroidx/activity/FullyDrawnReporterOwner;)V +Landroidx/activity/ViewTreeOnBackPressedDispatcherOwner; +SPLandroidx/activity/ViewTreeOnBackPressedDispatcherOwner;->set(Landroid/view/View;Landroidx/activity/OnBackPressedDispatcherOwner;)V +Landroidx/activity/contextaware/ContextAware; +Landroidx/activity/contextaware/ContextAwareHelper; +SPLandroidx/activity/contextaware/ContextAwareHelper;->()V +SPLandroidx/activity/contextaware/ContextAwareHelper;->addOnContextAvailableListener(Landroidx/activity/contextaware/OnContextAvailableListener;)V +SPLandroidx/activity/contextaware/ContextAwareHelper;->dispatchOnContextAvailable(Landroid/content/Context;)V +Landroidx/activity/contextaware/OnContextAvailableListener; +Landroidx/activity/result/ActivityResult; +Landroidx/activity/result/ActivityResultCallback; +Landroidx/activity/result/ActivityResultCaller; +Landroidx/activity/result/ActivityResultLauncher; +SPLandroidx/activity/result/ActivityResultLauncher;->()V +Landroidx/activity/result/ActivityResultRegistry; +SPLandroidx/activity/result/ActivityResultRegistry;->()V +SPLandroidx/activity/result/ActivityResultRegistry;->()V +SPLandroidx/activity/result/ActivityResultRegistry;->bindRcKey(ILjava/lang/String;)V +SPLandroidx/activity/result/ActivityResultRegistry;->generateRandomNumber$lambda$0()Ljava/lang/Integer; +SPLandroidx/activity/result/ActivityResultRegistry;->generateRandomNumber()I +SPLandroidx/activity/result/ActivityResultRegistry;->register$lambda$1(Landroidx/activity/result/ActivityResultRegistry;Ljava/lang/String;Landroidx/activity/result/ActivityResultCallback;Landroidx/activity/result/contract/ActivityResultContract;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/activity/result/ActivityResultRegistry;->register(Ljava/lang/String;Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher; +SPLandroidx/activity/result/ActivityResultRegistry;->register(Ljava/lang/String;Landroidx/lifecycle/LifecycleOwner;Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher; +SPLandroidx/activity/result/ActivityResultRegistry;->registerKey(Ljava/lang/String;)V +Landroidx/activity/result/ActivityResultRegistry$$ExternalSyntheticLambda0; +SPLandroidx/activity/result/ActivityResultRegistry$$ExternalSyntheticLambda0;->(Landroidx/activity/result/ActivityResultRegistry;Ljava/lang/String;Landroidx/activity/result/ActivityResultCallback;Landroidx/activity/result/contract/ActivityResultContract;)V +SPLandroidx/activity/result/ActivityResultRegistry$$ExternalSyntheticLambda0;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/activity/result/ActivityResultRegistry$$ExternalSyntheticLambda1; +SPLandroidx/activity/result/ActivityResultRegistry$$ExternalSyntheticLambda1;->()V +SPLandroidx/activity/result/ActivityResultRegistry$$ExternalSyntheticLambda1;->invoke()Ljava/lang/Object; +Landroidx/activity/result/ActivityResultRegistry$CallbackAndContract; +SPLandroidx/activity/result/ActivityResultRegistry$CallbackAndContract;->(Landroidx/activity/result/ActivityResultCallback;Landroidx/activity/result/contract/ActivityResultContract;)V +Landroidx/activity/result/ActivityResultRegistry$Companion; +SPLandroidx/activity/result/ActivityResultRegistry$Companion;->()V +SPLandroidx/activity/result/ActivityResultRegistry$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/activity/result/ActivityResultRegistry$LifecycleContainer; +SPLandroidx/activity/result/ActivityResultRegistry$LifecycleContainer;->(Landroidx/lifecycle/Lifecycle;)V +SPLandroidx/activity/result/ActivityResultRegistry$LifecycleContainer;->addObserver(Landroidx/lifecycle/LifecycleEventObserver;)V +Landroidx/activity/result/ActivityResultRegistry$register$2; +SPLandroidx/activity/result/ActivityResultRegistry$register$2;->(Landroidx/activity/result/ActivityResultRegistry;Ljava/lang/String;Landroidx/activity/result/contract/ActivityResultContract;)V +Landroidx/activity/result/ActivityResultRegistry$register$3; +SPLandroidx/activity/result/ActivityResultRegistry$register$3;->(Landroidx/activity/result/ActivityResultRegistry;Ljava/lang/String;Landroidx/activity/result/contract/ActivityResultContract;)V +Landroidx/activity/result/ActivityResultRegistryOwner; +Landroidx/activity/result/contract/ActivityResultContract; +SPLandroidx/activity/result/contract/ActivityResultContract;->()V +Landroidx/activity/result/contract/ActivityResultContracts$RequestMultiplePermissions; +SPLandroidx/activity/result/contract/ActivityResultContracts$RequestMultiplePermissions;->()V +SPLandroidx/activity/result/contract/ActivityResultContracts$RequestMultiplePermissions;->()V +Landroidx/activity/result/contract/ActivityResultContracts$RequestMultiplePermissions$Companion; +SPLandroidx/activity/result/contract/ActivityResultContracts$RequestMultiplePermissions$Companion;->()V +SPLandroidx/activity/result/contract/ActivityResultContracts$RequestMultiplePermissions$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/activity/result/contract/ActivityResultContracts$StartActivityForResult; +SPLandroidx/activity/result/contract/ActivityResultContracts$StartActivityForResult;->()V +SPLandroidx/activity/result/contract/ActivityResultContracts$StartActivityForResult;->()V +Landroidx/activity/result/contract/ActivityResultContracts$StartActivityForResult$Companion; +SPLandroidx/activity/result/contract/ActivityResultContracts$StartActivityForResult$Companion;->()V +SPLandroidx/activity/result/contract/ActivityResultContracts$StartActivityForResult$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/appcompat/R$attr; +Landroidx/appcompat/R$drawable; +Landroidx/appcompat/R$id; +Landroidx/appcompat/R$layout; +Landroidx/appcompat/R$string; +Landroidx/appcompat/R$style; +Landroidx/appcompat/R$styleable; +SPLandroidx/appcompat/R$styleable;->()V +Landroidx/appcompat/app/ActionBar; +SPLandroidx/appcompat/app/ActionBar;->()V +Landroidx/appcompat/app/ActionBar$LayoutParams; +SPLandroidx/appcompat/app/ActionBar$LayoutParams;->(II)V +SPLandroidx/appcompat/app/ActionBar$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +Landroidx/appcompat/app/ActionBarDrawerToggle; +SPLandroidx/appcompat/app/ActionBarDrawerToggle;->(Landroid/app/Activity;Landroidx/appcompat/widget/Toolbar;Landroidx/drawerlayout/widget/DrawerLayout;Landroidx/appcompat/graphics/drawable/DrawerArrowDrawable;II)V +SPLandroidx/appcompat/app/ActionBarDrawerToggle;->(Landroid/app/Activity;Landroidx/drawerlayout/widget/DrawerLayout;II)V +SPLandroidx/appcompat/app/ActionBarDrawerToggle;->getThemeUpIndicator()Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/app/ActionBarDrawerToggle;->setActionBarUpIndicator(Landroid/graphics/drawable/Drawable;I)V +SPLandroidx/appcompat/app/ActionBarDrawerToggle;->setDrawerSlideAnimationEnabled(Z)V +SPLandroidx/appcompat/app/ActionBarDrawerToggle;->setPosition(F)V +SPLandroidx/appcompat/app/ActionBarDrawerToggle;->syncState()V +Landroidx/appcompat/app/ActionBarDrawerToggle$Delegate; +Landroidx/appcompat/app/ActionBarDrawerToggle$DelegateProvider; +Landroidx/appcompat/app/AppCompatActivity; +SPLandroidx/appcompat/app/AppCompatActivity;->(I)V +SPLandroidx/appcompat/app/AppCompatActivity;->attachBaseContext(Landroid/content/Context;)V +SPLandroidx/appcompat/app/AppCompatActivity;->findViewById(I)Landroid/view/View; +SPLandroidx/appcompat/app/AppCompatActivity;->getDelegate()Landroidx/appcompat/app/AppCompatDelegate; +SPLandroidx/appcompat/app/AppCompatActivity;->getDrawerToggleDelegate()Landroidx/appcompat/app/ActionBarDrawerToggle$Delegate; +SPLandroidx/appcompat/app/AppCompatActivity;->getMenuInflater()Landroid/view/MenuInflater; +SPLandroidx/appcompat/app/AppCompatActivity;->getResources()Landroid/content/res/Resources; +SPLandroidx/appcompat/app/AppCompatActivity;->getSupportActionBar()Landroidx/appcompat/app/ActionBar; +SPLandroidx/appcompat/app/AppCompatActivity;->initDelegate()V +SPLandroidx/appcompat/app/AppCompatActivity;->invalidateOptionsMenu()V +SPLandroidx/appcompat/app/AppCompatActivity;->onContentChanged()V +SPLandroidx/appcompat/app/AppCompatActivity;->onPostCreate(Landroid/os/Bundle;)V +SPLandroidx/appcompat/app/AppCompatActivity;->onPostResume()V +SPLandroidx/appcompat/app/AppCompatActivity;->onStart()V +SPLandroidx/appcompat/app/AppCompatActivity;->onSupportContentChanged()V +SPLandroidx/appcompat/app/AppCompatActivity;->onTitleChanged(Ljava/lang/CharSequence;I)V +SPLandroidx/appcompat/app/AppCompatActivity;->setContentView(Landroid/view/View;)V +SPLandroidx/appcompat/app/AppCompatActivity;->setSupportActionBar(Landroidx/appcompat/widget/Toolbar;)V +SPLandroidx/appcompat/app/AppCompatActivity;->setTheme(I)V +Landroidx/appcompat/app/AppCompatActivity$1; +SPLandroidx/appcompat/app/AppCompatActivity$1;->(Landroidx/appcompat/app/AppCompatActivity;)V +Landroidx/appcompat/app/AppCompatActivity$2; +SPLandroidx/appcompat/app/AppCompatActivity$2;->(Landroidx/appcompat/app/AppCompatActivity;)V +SPLandroidx/appcompat/app/AppCompatActivity$2;->onContextAvailable(Landroid/content/Context;)V +Landroidx/appcompat/app/AppCompatCallback; +Landroidx/appcompat/app/AppCompatDelegate; +SPLandroidx/appcompat/app/AppCompatDelegate;->()V +SPLandroidx/appcompat/app/AppCompatDelegate;->()V +SPLandroidx/appcompat/app/AppCompatDelegate;->addActiveDelegate(Landroidx/appcompat/app/AppCompatDelegate;)V +SPLandroidx/appcompat/app/AppCompatDelegate;->applyDayNightToActiveDelegates()V +SPLandroidx/appcompat/app/AppCompatDelegate;->attachBaseContext(Landroid/content/Context;)V +SPLandroidx/appcompat/app/AppCompatDelegate;->attachBaseContext2(Landroid/content/Context;)Landroid/content/Context; +SPLandroidx/appcompat/app/AppCompatDelegate;->create(Landroid/app/Activity;Landroidx/appcompat/app/AppCompatCallback;)Landroidx/appcompat/app/AppCompatDelegate; +SPLandroidx/appcompat/app/AppCompatDelegate;->getApplicationLocales()Landroidx/core/os/LocaleListCompat; +SPLandroidx/appcompat/app/AppCompatDelegate;->getDefaultNightMode()I +SPLandroidx/appcompat/app/AppCompatDelegate;->getLocaleManagerForApplication()Ljava/lang/Object; +SPLandroidx/appcompat/app/AppCompatDelegate;->isAutoStorageOptedIn(Landroid/content/Context;)Z +SPLandroidx/appcompat/app/AppCompatDelegate;->lambda$syncRequestedAndStoredLocales$1(Landroid/content/Context;)V +SPLandroidx/appcompat/app/AppCompatDelegate;->removeDelegateFromActives(Landroidx/appcompat/app/AppCompatDelegate;)V +SPLandroidx/appcompat/app/AppCompatDelegate;->setDefaultNightMode(I)V +SPLandroidx/appcompat/app/AppCompatDelegate;->setOnBackInvokedDispatcher(Landroid/window/OnBackInvokedDispatcher;)V +SPLandroidx/appcompat/app/AppCompatDelegate;->syncLocalesToFramework(Landroid/content/Context;)V +SPLandroidx/appcompat/app/AppCompatDelegate;->syncRequestedAndStoredLocales(Landroid/content/Context;)V +Landroidx/appcompat/app/AppCompatDelegate$$ExternalSyntheticLambda0; +SPLandroidx/appcompat/app/AppCompatDelegate$$ExternalSyntheticLambda0;->(Landroid/content/Context;)V +SPLandroidx/appcompat/app/AppCompatDelegate$$ExternalSyntheticLambda0;->run()V +Landroidx/appcompat/app/AppCompatDelegate$Api33Impl; +SPLandroidx/appcompat/app/AppCompatDelegate$Api33Impl;->localeManagerGetApplicationLocales(Ljava/lang/Object;)Landroid/os/LocaleList; +Landroidx/appcompat/app/AppCompatDelegate$SerialExecutor; +SPLandroidx/appcompat/app/AppCompatDelegate$SerialExecutor;->(Ljava/util/concurrent/Executor;)V +SPLandroidx/appcompat/app/AppCompatDelegate$SerialExecutor;->execute(Ljava/lang/Runnable;)V +SPLandroidx/appcompat/app/AppCompatDelegate$SerialExecutor;->lambda$execute$0$androidx-appcompat-app-AppCompatDelegate$SerialExecutor(Ljava/lang/Runnable;)V +SPLandroidx/appcompat/app/AppCompatDelegate$SerialExecutor;->scheduleNext()V +Landroidx/appcompat/app/AppCompatDelegate$SerialExecutor$$ExternalSyntheticLambda0; +SPLandroidx/appcompat/app/AppCompatDelegate$SerialExecutor$$ExternalSyntheticLambda0;->(Landroidx/appcompat/app/AppCompatDelegate$SerialExecutor;Ljava/lang/Runnable;)V +SPLandroidx/appcompat/app/AppCompatDelegate$SerialExecutor$$ExternalSyntheticLambda0;->run()V +Landroidx/appcompat/app/AppCompatDelegate$ThreadPerTaskExecutor; +SPLandroidx/appcompat/app/AppCompatDelegate$ThreadPerTaskExecutor;->()V +SPLandroidx/appcompat/app/AppCompatDelegate$ThreadPerTaskExecutor;->execute(Ljava/lang/Runnable;)V +Landroidx/appcompat/app/AppCompatDelegateImpl; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->(Landroid/app/Activity;Landroidx/appcompat/app/AppCompatCallback;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->(Landroid/content/Context;Landroid/view/Window;Landroidx/appcompat/app/AppCompatCallback;Ljava/lang/Object;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->applyApplicationSpecificConfig(Z)Z +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->applyApplicationSpecificConfig(ZZ)Z +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->applyFixedSizeWindow()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->attachBaseContext2(Landroid/content/Context;)Landroid/content/Context; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->attachToWindow(Landroid/view/Window;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->calculateApplicationLocales(Landroid/content/Context;)Landroidx/core/os/LocaleListCompat; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->calculateNightMode()I +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->createOverrideAppConfiguration(Landroid/content/Context;ILandroidx/core/os/LocaleListCompat;Landroid/content/res/Configuration;Z)Landroid/content/res/Configuration; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->createSubDecor()Landroid/view/ViewGroup; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->createView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->doInvalidatePanelMenu(I)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->ensureSubDecor()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->ensureWindow()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->findViewById(I)Landroid/view/View; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getActionBarThemedContext()Landroid/content/Context; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getActivityHandlesConfigChangesFlags(Landroid/content/Context;)I +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getConfigurationLocales(Landroid/content/res/Configuration;)Landroidx/core/os/LocaleListCompat; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getContextForDelegate()Landroid/content/Context; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getDrawerToggleDelegate()Landroidx/appcompat/app/ActionBarDrawerToggle$Delegate; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getMenuInflater()Landroid/view/MenuInflater; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getPanelState(IZ)Landroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getSupportActionBar()Landroidx/appcompat/app/ActionBar; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->getTitle()Ljava/lang/CharSequence; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->initWindowDecorActionBar()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->installViewFactory()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->invalidateOptionsMenu()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->invalidatePanelMenu(I)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->mapNightMode(Landroid/content/Context;I)I +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->onCreate(Landroid/os/Bundle;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->onPostCreate(Landroid/os/Bundle;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->onPostResume()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->onStart()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->onSubDecorInstalled(Landroid/view/ViewGroup;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->peekSupportActionBar()Landroidx/appcompat/app/ActionBar; +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->requestWindowFeature(I)Z +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->sanitizeWindowFeatureId(I)I +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->setContentView(Landroid/view/View;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->setOnBackInvokedDispatcher(Landroid/window/OnBackInvokedDispatcher;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->setSupportActionBar(Landroidx/appcompat/widget/Toolbar;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->setTheme(I)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->setTitle(Ljava/lang/CharSequence;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->shouldRegisterBackInvokedCallback()Z +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->throwFeatureRequestIfSubDecorInstalled()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->updateActionModeInsets(Landroidx/core/view/WindowInsetsCompat;Landroid/graphics/Rect;)I +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->updateAppConfiguration(ILandroidx/core/os/LocaleListCompat;Z)Z +SPLandroidx/appcompat/app/AppCompatDelegateImpl;->updateBackInvokedCallbackState()V +Landroidx/appcompat/app/AppCompatDelegateImpl$1; +SPLandroidx/appcompat/app/AppCompatDelegateImpl$1;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl$1;->run()V +Landroidx/appcompat/app/AppCompatDelegateImpl$2; +SPLandroidx/appcompat/app/AppCompatDelegateImpl$2;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl$2;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +Landroidx/appcompat/app/AppCompatDelegateImpl$3; +SPLandroidx/appcompat/app/AppCompatDelegateImpl$3;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl$3;->onAttachedFromWindow()V +Landroidx/appcompat/app/AppCompatDelegateImpl$ActionBarDrawableToggleImpl; +SPLandroidx/appcompat/app/AppCompatDelegateImpl$ActionBarDrawableToggleImpl;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl$ActionBarDrawableToggleImpl;->getActionBarThemedContext()Landroid/content/Context; +SPLandroidx/appcompat/app/AppCompatDelegateImpl$ActionBarDrawableToggleImpl;->getThemeUpIndicator()Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/app/AppCompatDelegateImpl$ActionBarDrawableToggleImpl;->isNavigationVisible()Z +SPLandroidx/appcompat/app/AppCompatDelegateImpl$ActionBarDrawableToggleImpl;->setActionBarUpIndicator(Landroid/graphics/drawable/Drawable;I)V +Landroidx/appcompat/app/AppCompatDelegateImpl$ActionBarMenuCallback; +Landroidx/appcompat/app/AppCompatDelegateImpl$Api24Impl; +SPLandroidx/appcompat/app/AppCompatDelegateImpl$Api24Impl;->getLocales(Landroid/content/res/Configuration;)Landroidx/core/os/LocaleListCompat; +Landroidx/appcompat/app/AppCompatDelegateImpl$Api33Impl; +SPLandroidx/appcompat/app/AppCompatDelegateImpl$Api33Impl;->getOnBackInvokedDispatcher(Landroid/app/Activity;)Landroid/window/OnBackInvokedDispatcher; +Landroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback; +SPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->(Landroidx/appcompat/app/AppCompatDelegateImpl;Landroid/view/Window$Callback;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->bypassOnContentChanged(Landroid/view/Window$Callback;)V +SPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onContentChanged()V +SPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onCreatePanelMenu(ILandroid/view/Menu;)Z +SPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onPreparePanel(ILandroid/view/View;Landroid/view/Menu;)Z +SPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->setActionBarCallback(Landroidx/appcompat/app/AppCompatDelegateImpl$ActionBarMenuCallback;)V +Landroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState; +SPLandroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState;->(I)V +Landroidx/appcompat/app/AppCompatViewInflater; +SPLandroidx/appcompat/app/AppCompatViewInflater;->()V +SPLandroidx/appcompat/app/AppCompatViewInflater;->()V +SPLandroidx/appcompat/app/AppCompatViewInflater;->backportAccessibilityAttributes(Landroid/content/Context;Landroid/view/View;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/app/AppCompatViewInflater;->checkOnClickListener(Landroid/view/View;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/app/AppCompatViewInflater;->createCheckedTextView(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatCheckedTextView; +SPLandroidx/appcompat/app/AppCompatViewInflater;->createImageButton(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatImageButton; +SPLandroidx/appcompat/app/AppCompatViewInflater;->createImageView(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatImageView; +SPLandroidx/appcompat/app/AppCompatViewInflater;->createSpinner(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatSpinner; +SPLandroidx/appcompat/app/AppCompatViewInflater;->createView(Landroid/content/Context;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View; +SPLandroidx/appcompat/app/AppCompatViewInflater;->createView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;ZZZZ)Landroid/view/View; +SPLandroidx/appcompat/app/AppCompatViewInflater;->themifyContext(Landroid/content/Context;Landroid/util/AttributeSet;ZZ)Landroid/content/Context; +SPLandroidx/appcompat/app/AppCompatViewInflater;->verifyNotNull(Landroid/view/View;Ljava/lang/String;)V +Landroidx/appcompat/app/AppLocalesMetadataHolderService; +SPLandroidx/appcompat/app/AppLocalesMetadataHolderService;->getServiceInfo(Landroid/content/Context;)Landroid/content/pm/ServiceInfo; +Landroidx/appcompat/app/AppLocalesMetadataHolderService$Api24Impl; +SPLandroidx/appcompat/app/AppLocalesMetadataHolderService$Api24Impl;->getDisabledComponentFlag()I +Landroidx/appcompat/app/ToolbarActionBar; +SPLandroidx/appcompat/app/ToolbarActionBar;->(Landroidx/appcompat/widget/Toolbar;Ljava/lang/CharSequence;Landroid/view/Window$Callback;)V +SPLandroidx/appcompat/app/ToolbarActionBar;->getDisplayOptions()I +SPLandroidx/appcompat/app/ToolbarActionBar;->getMenu()Landroid/view/Menu; +SPLandroidx/appcompat/app/ToolbarActionBar;->getThemedContext()Landroid/content/Context; +SPLandroidx/appcompat/app/ToolbarActionBar;->invalidateOptionsMenu()Z +SPLandroidx/appcompat/app/ToolbarActionBar;->onDestroy()V +SPLandroidx/appcompat/app/ToolbarActionBar;->populateOptionsMenu()V +SPLandroidx/appcompat/app/ToolbarActionBar;->setDisplayHomeAsUpEnabled(Z)V +SPLandroidx/appcompat/app/ToolbarActionBar;->setDisplayOptions(II)V +SPLandroidx/appcompat/app/ToolbarActionBar;->setHomeActionContentDescription(I)V +SPLandroidx/appcompat/app/ToolbarActionBar;->setHomeAsUpIndicator(Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/app/ToolbarActionBar;->setHomeButtonEnabled(Z)V +SPLandroidx/appcompat/app/ToolbarActionBar;->setShowHideAnimationEnabled(Z)V +SPLandroidx/appcompat/app/ToolbarActionBar;->setSubtitle(Ljava/lang/CharSequence;)V +SPLandroidx/appcompat/app/ToolbarActionBar;->setTitle(Ljava/lang/CharSequence;)V +SPLandroidx/appcompat/app/ToolbarActionBar;->setWindowTitle(Ljava/lang/CharSequence;)V +Landroidx/appcompat/app/ToolbarActionBar$1; +SPLandroidx/appcompat/app/ToolbarActionBar$1;->(Landroidx/appcompat/app/ToolbarActionBar;)V +SPLandroidx/appcompat/app/ToolbarActionBar$1;->run()V +Landroidx/appcompat/app/ToolbarActionBar$2; +SPLandroidx/appcompat/app/ToolbarActionBar$2;->(Landroidx/appcompat/app/ToolbarActionBar;)V +Landroidx/appcompat/app/ToolbarActionBar$ActionMenuPresenterCallback; +SPLandroidx/appcompat/app/ToolbarActionBar$ActionMenuPresenterCallback;->(Landroidx/appcompat/app/ToolbarActionBar;)V +Landroidx/appcompat/app/ToolbarActionBar$MenuBuilderCallback; +SPLandroidx/appcompat/app/ToolbarActionBar$MenuBuilderCallback;->(Landroidx/appcompat/app/ToolbarActionBar;)V +Landroidx/appcompat/app/ToolbarActionBar$ToolbarMenuCallback; +SPLandroidx/appcompat/app/ToolbarActionBar$ToolbarMenuCallback;->(Landroidx/appcompat/app/ToolbarActionBar;)V +SPLandroidx/appcompat/app/ToolbarActionBar$ToolbarMenuCallback;->onPreparePanel(I)Z +Landroidx/appcompat/app/WindowDecorActionBar; +Landroidx/appcompat/content/res/AppCompatResources; +SPLandroidx/appcompat/content/res/AppCompatResources;->getColorStateList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; +SPLandroidx/appcompat/content/res/AppCompatResources;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; +Landroidx/appcompat/graphics/drawable/DrawerArrowDrawable; +SPLandroidx/appcompat/graphics/drawable/DrawerArrowDrawable;->()V +SPLandroidx/appcompat/graphics/drawable/DrawerArrowDrawable;->(Landroid/content/Context;)V +SPLandroidx/appcompat/graphics/drawable/DrawerArrowDrawable;->draw(Landroid/graphics/Canvas;)V +SPLandroidx/appcompat/graphics/drawable/DrawerArrowDrawable;->getIntrinsicHeight()I +SPLandroidx/appcompat/graphics/drawable/DrawerArrowDrawable;->getIntrinsicWidth()I +SPLandroidx/appcompat/graphics/drawable/DrawerArrowDrawable;->getOpacity()I +SPLandroidx/appcompat/graphics/drawable/DrawerArrowDrawable;->lerp(FFF)F +SPLandroidx/appcompat/graphics/drawable/DrawerArrowDrawable;->setBarThickness(F)V +SPLandroidx/appcompat/graphics/drawable/DrawerArrowDrawable;->setColor(I)V +SPLandroidx/appcompat/graphics/drawable/DrawerArrowDrawable;->setGapSize(F)V +SPLandroidx/appcompat/graphics/drawable/DrawerArrowDrawable;->setProgress(F)V +SPLandroidx/appcompat/graphics/drawable/DrawerArrowDrawable;->setSpinEnabled(Z)V +SPLandroidx/appcompat/graphics/drawable/DrawerArrowDrawable;->setVerticalMirror(Z)V +Landroidx/appcompat/resources/R$drawable; +Landroidx/appcompat/view/ActionBarPolicy; +SPLandroidx/appcompat/view/ActionBarPolicy;->(Landroid/content/Context;)V +SPLandroidx/appcompat/view/ActionBarPolicy;->get(Landroid/content/Context;)Landroidx/appcompat/view/ActionBarPolicy; +SPLandroidx/appcompat/view/ActionBarPolicy;->getEmbeddedMenuWidthLimit()I +SPLandroidx/appcompat/view/ActionBarPolicy;->getMaxActionButtons()I +Landroidx/appcompat/view/CollapsibleActionView; +Landroidx/appcompat/view/ContextThemeWrapper; +SPLandroidx/appcompat/view/ContextThemeWrapper;->(Landroid/content/Context;I)V +SPLandroidx/appcompat/view/ContextThemeWrapper;->applyOverrideConfiguration(Landroid/content/res/Configuration;)V +SPLandroidx/appcompat/view/ContextThemeWrapper;->getResources()Landroid/content/res/Resources; +SPLandroidx/appcompat/view/ContextThemeWrapper;->getResourcesInternal()Landroid/content/res/Resources; +SPLandroidx/appcompat/view/ContextThemeWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; +SPLandroidx/appcompat/view/ContextThemeWrapper;->getTheme()Landroid/content/res/Resources$Theme; +SPLandroidx/appcompat/view/ContextThemeWrapper;->getThemeResId()I +SPLandroidx/appcompat/view/ContextThemeWrapper;->initializeTheme()V +SPLandroidx/appcompat/view/ContextThemeWrapper;->isEmptyConfiguration(Landroid/content/res/Configuration;)Z +SPLandroidx/appcompat/view/ContextThemeWrapper;->onApplyThemeResource(Landroid/content/res/Resources$Theme;IZ)V +Landroidx/appcompat/view/SupportMenuInflater; +SPLandroidx/appcompat/view/SupportMenuInflater;->()V +SPLandroidx/appcompat/view/SupportMenuInflater;->(Landroid/content/Context;)V +SPLandroidx/appcompat/view/SupportMenuInflater;->inflate(ILandroid/view/Menu;)V +SPLandroidx/appcompat/view/SupportMenuInflater;->parseMenu(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/view/Menu;)V +Landroidx/appcompat/view/SupportMenuInflater$MenuState; +SPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->(Landroidx/appcompat/view/SupportMenuInflater;Landroid/view/Menu;)V +SPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->addItem()V +SPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->addSubMenuItem()Landroid/view/SubMenu; +SPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->getShortcut(Ljava/lang/String;)C +SPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->hasAddedItem()Z +SPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->newInstance(Ljava/lang/String;[Ljava/lang/Class;[Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->readGroup(Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->readItem(Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->resetGroup()V +SPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->setItem(Landroid/view/MenuItem;)V +Landroidx/appcompat/view/WindowCallbackWrapper; +SPLandroidx/appcompat/view/WindowCallbackWrapper;->(Landroid/view/Window$Callback;)V +SPLandroidx/appcompat/view/WindowCallbackWrapper;->dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z +SPLandroidx/appcompat/view/WindowCallbackWrapper;->getWrapped()Landroid/view/Window$Callback; +SPLandroidx/appcompat/view/WindowCallbackWrapper;->onAttachedToWindow()V +SPLandroidx/appcompat/view/WindowCallbackWrapper;->onCreatePanelMenu(ILandroid/view/Menu;)Z +SPLandroidx/appcompat/view/WindowCallbackWrapper;->onPreparePanel(ILandroid/view/View;Landroid/view/Menu;)Z +SPLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V +SPLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowFocusChanged(Z)V +Landroidx/appcompat/view/menu/ActionMenuItem; +SPLandroidx/appcompat/view/menu/ActionMenuItem;->(Landroid/content/Context;IIIILjava/lang/CharSequence;)V +Landroidx/appcompat/view/menu/BaseMenuPresenter; +SPLandroidx/appcompat/view/menu/BaseMenuPresenter;->(Landroid/content/Context;II)V +SPLandroidx/appcompat/view/menu/BaseMenuPresenter;->addItemView(Landroid/view/View;I)V +SPLandroidx/appcompat/view/menu/BaseMenuPresenter;->filterLeftoverView(Landroid/view/ViewGroup;I)Z +SPLandroidx/appcompat/view/menu/BaseMenuPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V +SPLandroidx/appcompat/view/menu/BaseMenuPresenter;->setCallback(Landroidx/appcompat/view/menu/MenuPresenter$Callback;)V +SPLandroidx/appcompat/view/menu/BaseMenuPresenter;->updateMenuView(Z)V +Landroidx/appcompat/view/menu/MenuBuilder; +SPLandroidx/appcompat/view/menu/MenuBuilder;->()V +SPLandroidx/appcompat/view/menu/MenuBuilder;->(Landroid/content/Context;)V +SPLandroidx/appcompat/view/menu/MenuBuilder;->add(IIILjava/lang/CharSequence;)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuBuilder;->addInternal(IIILjava/lang/CharSequence;)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuBuilder;->addMenuPresenter(Landroidx/appcompat/view/menu/MenuPresenter;)V +SPLandroidx/appcompat/view/menu/MenuBuilder;->addMenuPresenter(Landroidx/appcompat/view/menu/MenuPresenter;Landroid/content/Context;)V +SPLandroidx/appcompat/view/menu/MenuBuilder;->addSubMenu(IIILjava/lang/CharSequence;)Landroid/view/SubMenu; +SPLandroidx/appcompat/view/menu/MenuBuilder;->clear()V +SPLandroidx/appcompat/view/menu/MenuBuilder;->createNewMenuItem(IIIILjava/lang/CharSequence;I)Landroidx/appcompat/view/menu/MenuItemImpl; +SPLandroidx/appcompat/view/menu/MenuBuilder;->dispatchPresenterUpdate(Z)V +SPLandroidx/appcompat/view/menu/MenuBuilder;->findInsertIndex(Ljava/util/ArrayList;I)I +SPLandroidx/appcompat/view/menu/MenuBuilder;->findItem(I)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuBuilder;->flagActionItems()V +SPLandroidx/appcompat/view/menu/MenuBuilder;->getActionItems()Ljava/util/ArrayList; +SPLandroidx/appcompat/view/menu/MenuBuilder;->getContext()Landroid/content/Context; +SPLandroidx/appcompat/view/menu/MenuBuilder;->getItem(I)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuBuilder;->getNonActionItems()Ljava/util/ArrayList; +SPLandroidx/appcompat/view/menu/MenuBuilder;->getOrdering(I)I +SPLandroidx/appcompat/view/menu/MenuBuilder;->getResources()Landroid/content/res/Resources; +SPLandroidx/appcompat/view/menu/MenuBuilder;->getVisibleItems()Ljava/util/ArrayList; +SPLandroidx/appcompat/view/menu/MenuBuilder;->hasVisibleItems()Z +SPLandroidx/appcompat/view/menu/MenuBuilder;->isDispatchingItemsChanged()Z +SPLandroidx/appcompat/view/menu/MenuBuilder;->onItemActionRequestChanged(Landroidx/appcompat/view/menu/MenuItemImpl;)V +SPLandroidx/appcompat/view/menu/MenuBuilder;->onItemVisibleChanged(Landroidx/appcompat/view/menu/MenuItemImpl;)V +SPLandroidx/appcompat/view/menu/MenuBuilder;->onItemsChanged(Z)V +SPLandroidx/appcompat/view/menu/MenuBuilder;->setCallback(Landroidx/appcompat/view/menu/MenuBuilder$Callback;)V +SPLandroidx/appcompat/view/menu/MenuBuilder;->setHeaderInternal(ILjava/lang/CharSequence;ILandroid/graphics/drawable/Drawable;Landroid/view/View;)V +SPLandroidx/appcompat/view/menu/MenuBuilder;->setHeaderTitleInt(Ljava/lang/CharSequence;)Landroidx/appcompat/view/menu/MenuBuilder; +SPLandroidx/appcompat/view/menu/MenuBuilder;->setOverrideVisibleItems(Z)V +SPLandroidx/appcompat/view/menu/MenuBuilder;->setShortcutsVisibleInner(Z)V +SPLandroidx/appcompat/view/menu/MenuBuilder;->size()I +SPLandroidx/appcompat/view/menu/MenuBuilder;->startDispatchingItemsChanged()V +SPLandroidx/appcompat/view/menu/MenuBuilder;->stopDispatchingItemsChanged()V +Landroidx/appcompat/view/menu/MenuBuilder$Callback; +Landroidx/appcompat/view/menu/MenuBuilder$ItemInvoker; +Landroidx/appcompat/view/menu/MenuItemImpl; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->(Landroidx/appcompat/view/menu/MenuBuilder;IIIILjava/lang/CharSequence;I)V +SPLandroidx/appcompat/view/menu/MenuItemImpl;->applyIconTintIfNecessary(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->getActionView()Landroid/view/View; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->getContentDescription()Ljava/lang/CharSequence; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->getGroupId()I +SPLandroidx/appcompat/view/menu/MenuItemImpl;->getIcon()Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->getItemId()I +SPLandroidx/appcompat/view/menu/MenuItemImpl;->getOrdering()I +SPLandroidx/appcompat/view/menu/MenuItemImpl;->getSubMenu()Landroid/view/SubMenu; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->getSupportActionProvider()Landroidx/core/view/ActionProvider; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitle()Ljava/lang/CharSequence; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->getTooltipText()Ljava/lang/CharSequence; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->hasCollapsibleActionView()Z +SPLandroidx/appcompat/view/menu/MenuItemImpl;->hasSubMenu()Z +SPLandroidx/appcompat/view/menu/MenuItemImpl;->isActionButton()Z +SPLandroidx/appcompat/view/menu/MenuItemImpl;->isActionViewExpanded()Z +SPLandroidx/appcompat/view/menu/MenuItemImpl;->isCheckable()Z +SPLandroidx/appcompat/view/menu/MenuItemImpl;->isChecked()Z +SPLandroidx/appcompat/view/menu/MenuItemImpl;->isEnabled()Z +SPLandroidx/appcompat/view/menu/MenuItemImpl;->isVisible()Z +SPLandroidx/appcompat/view/menu/MenuItemImpl;->requestsActionButton()Z +SPLandroidx/appcompat/view/menu/MenuItemImpl;->requiresActionButton()Z +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setActionView(Landroid/view/View;)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setActionView(Landroid/view/View;)Landroidx/core/internal/view/SupportMenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setAlphabeticShortcut(CI)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setCheckable(Z)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setChecked(Z)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setCheckedInt(Z)V +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setContentDescription(Ljava/lang/CharSequence;)Landroidx/core/internal/view/SupportMenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setEnabled(Z)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setExclusiveCheckable(Z)V +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setIcon(I)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setIsActionButton(Z)V +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setNumericShortcut(CI)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setOnActionExpandListener(Landroid/view/MenuItem$OnActionExpandListener;)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setShowAsAction(I)V +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setSubMenu(Landroidx/appcompat/view/menu/SubMenuBuilder;)V +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setSupportActionProvider(Landroidx/core/view/ActionProvider;)Landroidx/core/internal/view/SupportMenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setTitle(Ljava/lang/CharSequence;)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setTitleCondensed(Ljava/lang/CharSequence;)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setTooltipText(Ljava/lang/CharSequence;)Landroidx/core/internal/view/SupportMenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setVisible(Z)Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/MenuItemImpl;->setVisibleInt(Z)Z +Landroidx/appcompat/view/menu/MenuItemImpl$1; +SPLandroidx/appcompat/view/menu/MenuItemImpl$1;->(Landroidx/appcompat/view/menu/MenuItemImpl;)V +Landroidx/appcompat/view/menu/MenuPresenter; +Landroidx/appcompat/view/menu/MenuPresenter$Callback; +Landroidx/appcompat/view/menu/MenuView; +Landroidx/appcompat/view/menu/MenuView$ItemView; +Landroidx/appcompat/view/menu/ShowableListMenu; +Landroidx/appcompat/view/menu/SubMenuBuilder; +SPLandroidx/appcompat/view/menu/SubMenuBuilder;->(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;Landroidx/appcompat/view/menu/MenuItemImpl;)V +SPLandroidx/appcompat/view/menu/SubMenuBuilder;->getItem()Landroid/view/MenuItem; +SPLandroidx/appcompat/view/menu/SubMenuBuilder;->setHeaderTitle(Ljava/lang/CharSequence;)Landroid/view/SubMenu; +Landroidx/appcompat/widget/ActionBarOverlayLayout$ActionBarVisibilityCallback; +Landroidx/appcompat/widget/ActionMenuPresenter; +SPLandroidx/appcompat/widget/ActionMenuPresenter;->(Landroid/content/Context;)V +SPLandroidx/appcompat/widget/ActionMenuPresenter;->filterLeftoverView(Landroid/view/ViewGroup;I)Z +SPLandroidx/appcompat/widget/ActionMenuPresenter;->flagActionItems()Z +SPLandroidx/appcompat/widget/ActionMenuPresenter;->getItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View; +SPLandroidx/appcompat/widget/ActionMenuPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V +SPLandroidx/appcompat/widget/ActionMenuPresenter;->setExpandedActionViewsExclusive(Z)V +SPLandroidx/appcompat/widget/ActionMenuPresenter;->setMenuView(Landroidx/appcompat/widget/ActionMenuView;)V +SPLandroidx/appcompat/widget/ActionMenuPresenter;->setReserveOverflow(Z)V +SPLandroidx/appcompat/widget/ActionMenuPresenter;->shouldIncludeItem(ILandroidx/appcompat/view/menu/MenuItemImpl;)Z +SPLandroidx/appcompat/widget/ActionMenuPresenter;->updateMenuView(Z)V +Landroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton; +SPLandroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton;->(Landroidx/appcompat/widget/ActionMenuPresenter;Landroid/content/Context;)V +SPLandroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton;->setFrame(IIII)Z +Landroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton$1; +SPLandroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton$1;->(Landroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton;Landroid/view/View;Landroidx/appcompat/widget/ActionMenuPresenter;)V +Landroidx/appcompat/widget/ActionMenuPresenter$PopupPresenterCallback; +SPLandroidx/appcompat/widget/ActionMenuPresenter$PopupPresenterCallback;->(Landroidx/appcompat/widget/ActionMenuPresenter;)V +Landroidx/appcompat/widget/ActionMenuView; +SPLandroidx/appcompat/widget/ActionMenuView;->(Landroid/content/Context;)V +SPLandroidx/appcompat/widget/ActionMenuView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/widget/ActionMenuView;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z +SPLandroidx/appcompat/widget/ActionMenuView;->generateDefaultLayoutParams()Landroidx/appcompat/widget/ActionMenuView$LayoutParams; +SPLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroidx/appcompat/widget/ActionMenuView$LayoutParams; +SPLandroidx/appcompat/widget/ActionMenuView;->generateOverflowButtonLayoutParams()Landroidx/appcompat/widget/ActionMenuView$LayoutParams; +SPLandroidx/appcompat/widget/ActionMenuView;->getMenu()Landroid/view/Menu; +SPLandroidx/appcompat/widget/ActionMenuView;->initialize(Landroidx/appcompat/view/menu/MenuBuilder;)V +SPLandroidx/appcompat/widget/ActionMenuView;->onLayout(ZIIII)V +SPLandroidx/appcompat/widget/ActionMenuView;->onMeasure(II)V +SPLandroidx/appcompat/widget/ActionMenuView;->peekMenu()Landroidx/appcompat/view/menu/MenuBuilder; +SPLandroidx/appcompat/widget/ActionMenuView;->setExpandedActionViewsExclusive(Z)V +SPLandroidx/appcompat/widget/ActionMenuView;->setMenuCallbacks(Landroidx/appcompat/view/menu/MenuPresenter$Callback;Landroidx/appcompat/view/menu/MenuBuilder$Callback;)V +SPLandroidx/appcompat/widget/ActionMenuView;->setOnMenuItemClickListener(Landroidx/appcompat/widget/ActionMenuView$OnMenuItemClickListener;)V +SPLandroidx/appcompat/widget/ActionMenuView;->setOverflowReserved(Z)V +SPLandroidx/appcompat/widget/ActionMenuView;->setPopupTheme(I)V +Landroidx/appcompat/widget/ActionMenuView$ActionMenuChildView; +Landroidx/appcompat/widget/ActionMenuView$LayoutParams; +SPLandroidx/appcompat/widget/ActionMenuView$LayoutParams;->(II)V +Landroidx/appcompat/widget/ActionMenuView$MenuBuilderCallback; +SPLandroidx/appcompat/widget/ActionMenuView$MenuBuilderCallback;->(Landroidx/appcompat/widget/ActionMenuView;)V +Landroidx/appcompat/widget/ActionMenuView$OnMenuItemClickListener; +Landroidx/appcompat/widget/AppCompatAutoCompleteTextView; +SPLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->()V +SPLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->initEmojiKeyListener(Landroidx/appcompat/widget/AppCompatEmojiEditTextHelper;)V +SPLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V +Landroidx/appcompat/widget/AppCompatBackgroundHelper; +SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->(Landroid/view/View;)V +SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->applySupportBackgroundTint()V +SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->onSetBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setInternalBackgroundTint(Landroid/content/res/ColorStateList;)V +SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V +SPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->shouldApplyFrameworkTintUsingColorFilter()Z +Landroidx/appcompat/widget/AppCompatButton; +SPLandroidx/appcompat/widget/AppCompatButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatButton;->access$001(Landroidx/appcompat/widget/AppCompatButton;Landroid/graphics/Typeface;)V +SPLandroidx/appcompat/widget/AppCompatButton;->drawableStateChanged()V +SPLandroidx/appcompat/widget/AppCompatButton;->getEmojiTextViewHelper()Landroidx/appcompat/widget/AppCompatEmojiTextHelper; +SPLandroidx/appcompat/widget/AppCompatButton;->getFontVariationSettingsManager()Landroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager; +SPLandroidx/appcompat/widget/AppCompatButton;->lambda$getFontVariationSettingsManager$0$androidx-appcompat-widget-AppCompatButton(Landroid/graphics/Typeface;)V +SPLandroidx/appcompat/widget/AppCompatButton;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V +SPLandroidx/appcompat/widget/AppCompatButton;->onLayout(ZIIII)V +SPLandroidx/appcompat/widget/AppCompatButton;->onTextChanged(Ljava/lang/CharSequence;III)V +SPLandroidx/appcompat/widget/AppCompatButton;->setAllCaps(Z)V +SPLandroidx/appcompat/widget/AppCompatButton;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/AppCompatButton;->setFilters([Landroid/text/InputFilter;)V +SPLandroidx/appcompat/widget/AppCompatButton;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V +SPLandroidx/appcompat/widget/AppCompatButton;->setTypeface(Landroid/graphics/Typeface;)V +Landroidx/appcompat/widget/AppCompatButton$$ExternalSyntheticLambda0; +SPLandroidx/appcompat/widget/AppCompatButton$$ExternalSyntheticLambda0;->(Landroidx/appcompat/widget/AppCompatButton;)V +SPLandroidx/appcompat/widget/AppCompatButton$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V +Landroidx/appcompat/widget/AppCompatCheckedTextView; +SPLandroidx/appcompat/widget/AppCompatCheckedTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/widget/AppCompatCheckedTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatCheckedTextView;->drawableStateChanged()V +SPLandroidx/appcompat/widget/AppCompatCheckedTextView;->getEmojiTextViewHelper()Landroidx/appcompat/widget/AppCompatEmojiTextHelper; +SPLandroidx/appcompat/widget/AppCompatCheckedTextView;->setAllCaps(Z)V +SPLandroidx/appcompat/widget/AppCompatCheckedTextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/AppCompatCheckedTextView;->setCompoundDrawablesRelative(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/AppCompatCheckedTextView;->setTextAppearance(Landroid/content/Context;I)V +Landroidx/appcompat/widget/AppCompatCheckedTextViewHelper; +SPLandroidx/appcompat/widget/AppCompatCheckedTextViewHelper;->(Landroid/widget/CheckedTextView;)V +SPLandroidx/appcompat/widget/AppCompatCheckedTextViewHelper;->applyCheckMarkTint()V +SPLandroidx/appcompat/widget/AppCompatCheckedTextViewHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V +Landroidx/appcompat/widget/AppCompatDrawableManager; +SPLandroidx/appcompat/widget/AppCompatDrawableManager;->-$$Nest$sfgetDEFAULT_MODE()Landroid/graphics/PorterDuff$Mode; +SPLandroidx/appcompat/widget/AppCompatDrawableManager;->()V +SPLandroidx/appcompat/widget/AppCompatDrawableManager;->()V +SPLandroidx/appcompat/widget/AppCompatDrawableManager;->get()Landroidx/appcompat/widget/AppCompatDrawableManager; +SPLandroidx/appcompat/widget/AppCompatDrawableManager;->getDrawable(Landroid/content/Context;IZ)Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/widget/AppCompatDrawableManager;->getTintList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; +SPLandroidx/appcompat/widget/AppCompatDrawableManager;->preload()V +SPLandroidx/appcompat/widget/AppCompatDrawableManager;->tintDrawable(Landroid/graphics/drawable/Drawable;Landroidx/appcompat/widget/TintInfo;[I)V +Landroidx/appcompat/widget/AppCompatDrawableManager$1; +SPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->()V +SPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->arrayContains([II)Z +SPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->createDrawableFor(Landroidx/appcompat/widget/ResourceManagerInternal;Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->getTintListForDrawableRes(Landroid/content/Context;I)Landroid/content/res/ColorStateList; +SPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->tintDrawable(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z +SPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->tintDrawableUsingColorFilter(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z +Landroidx/appcompat/widget/AppCompatEditText; +Landroidx/appcompat/widget/AppCompatEmojiEditTextHelper; +SPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->(Landroid/widget/EditText;)V +SPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->getKeyListener(Landroid/text/method/KeyListener;)Landroid/text/method/KeyListener; +SPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->isEmojiCapableKeyListener(Landroid/text/method/KeyListener;)Z +SPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->setEnabled(Z)V +Landroidx/appcompat/widget/AppCompatEmojiTextHelper; +SPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->(Landroid/widget/TextView;)V +SPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->getFilters([Landroid/text/InputFilter;)[Landroid/text/InputFilter; +SPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->setAllCaps(Z)V +SPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->setEnabled(Z)V +Landroidx/appcompat/widget/AppCompatImageButton; +SPLandroidx/appcompat/widget/AppCompatImageButton;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/widget/AppCompatImageButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatImageButton;->drawableStateChanged()V +SPLandroidx/appcompat/widget/AppCompatImageButton;->hasOverlappingRendering()Z +SPLandroidx/appcompat/widget/AppCompatImageButton;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/AppCompatImageButton;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V +Landroidx/appcompat/widget/AppCompatImageHelper; +SPLandroidx/appcompat/widget/AppCompatImageHelper;->(Landroid/widget/ImageView;)V +SPLandroidx/appcompat/widget/AppCompatImageHelper;->applyImageLevel()V +SPLandroidx/appcompat/widget/AppCompatImageHelper;->applySupportImageTint()V +SPLandroidx/appcompat/widget/AppCompatImageHelper;->hasOverlappingRendering()Z +SPLandroidx/appcompat/widget/AppCompatImageHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatImageHelper;->obtainLevelFromDrawable(Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/AppCompatImageHelper;->shouldApplyFrameworkTintUsingColorFilter()Z +Landroidx/appcompat/widget/AppCompatImageView; +SPLandroidx/appcompat/widget/AppCompatImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/widget/AppCompatImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatImageView;->drawableStateChanged()V +SPLandroidx/appcompat/widget/AppCompatImageView;->hasOverlappingRendering()Z +SPLandroidx/appcompat/widget/AppCompatImageView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/AppCompatImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V +Landroidx/appcompat/widget/AppCompatPopupWindow; +SPLandroidx/appcompat/widget/AppCompatPopupWindow;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V +SPLandroidx/appcompat/widget/AppCompatPopupWindow;->init(Landroid/content/Context;Landroid/util/AttributeSet;II)V +Landroidx/appcompat/widget/AppCompatSpinner; +SPLandroidx/appcompat/widget/AppCompatSpinner;->()V +SPLandroidx/appcompat/widget/AppCompatSpinner;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/widget/AppCompatSpinner;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatSpinner;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V +SPLandroidx/appcompat/widget/AppCompatSpinner;->(Landroid/content/Context;Landroid/util/AttributeSet;IILandroid/content/res/Resources$Theme;)V +SPLandroidx/appcompat/widget/AppCompatSpinner;->drawableStateChanged()V +SPLandroidx/appcompat/widget/AppCompatSpinner;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V +Landroidx/appcompat/widget/AppCompatSpinner$1; +SPLandroidx/appcompat/widget/AppCompatSpinner$1;->(Landroidx/appcompat/widget/AppCompatSpinner;Landroid/view/View;Landroidx/appcompat/widget/AppCompatSpinner$DropdownPopup;)V +Landroidx/appcompat/widget/AppCompatSpinner$DropdownPopup; +SPLandroidx/appcompat/widget/AppCompatSpinner$DropdownPopup;->(Landroidx/appcompat/widget/AppCompatSpinner;Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatSpinner$DropdownPopup;->setPromptText(Ljava/lang/CharSequence;)V +Landroidx/appcompat/widget/AppCompatSpinner$DropdownPopup$1; +SPLandroidx/appcompat/widget/AppCompatSpinner$DropdownPopup$1;->(Landroidx/appcompat/widget/AppCompatSpinner$DropdownPopup;Landroidx/appcompat/widget/AppCompatSpinner;)V +Landroidx/appcompat/widget/AppCompatSpinner$SpinnerPopup; +Landroidx/appcompat/widget/AppCompatTextClassifierHelper; +SPLandroidx/appcompat/widget/AppCompatTextClassifierHelper;->(Landroid/widget/TextView;)V +Landroidx/appcompat/widget/AppCompatTextHelper; +SPLandroidx/appcompat/widget/AppCompatTextHelper;->(Landroid/widget/TextView;)V +SPLandroidx/appcompat/widget/AppCompatTextHelper;->applyCompoundDrawablesTints()V +SPLandroidx/appcompat/widget/AppCompatTextHelper;->applyFontAndVariationSettings(Z)V +SPLandroidx/appcompat/widget/AppCompatTextHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatTextHelper;->makeFontCallback(II)Landroidx/core/content/res/ResourcesCompat$FontCallback; +SPLandroidx/appcompat/widget/AppCompatTextHelper;->onLayout(ZIIII)V +SPLandroidx/appcompat/widget/AppCompatTextHelper;->onSetCompoundDrawables()V +SPLandroidx/appcompat/widget/AppCompatTextHelper;->onSetTextAppearance(Landroid/content/Context;I)V +SPLandroidx/appcompat/widget/AppCompatTextHelper;->setAllCaps(Z)V +SPLandroidx/appcompat/widget/AppCompatTextHelper;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/AppCompatTextHelper;->updateTypefaceAndStyle(Landroid/content/Context;Landroidx/appcompat/widget/TintTypedArray;)Z +Landroidx/appcompat/widget/AppCompatTextHelper$1; +SPLandroidx/appcompat/widget/AppCompatTextHelper$1;->(Landroidx/appcompat/widget/AppCompatTextHelper;IILjava/lang/ref/WeakReference;)V +SPLandroidx/appcompat/widget/AppCompatTextHelper$1;->onFontRetrievalFailed(I)V +Landroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager; +SPLandroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager;->(Landroid/widget/TextView;Landroidx/core/util/Consumer;)V +SPLandroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager;->getTypeface()Landroid/graphics/Typeface; +SPLandroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager;->setTypeface(Landroid/graphics/Typeface;)V +SPLandroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager;->setTypefaceInternal(Landroid/graphics/Typeface;)V +Landroidx/appcompat/widget/AppCompatTextView; +SPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;)V +SPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatTextView;->access$1301(Landroidx/appcompat/widget/AppCompatTextView;Landroid/graphics/Typeface;)V +SPLandroidx/appcompat/widget/AppCompatTextView;->consumeTextFutureAndSetBlocking()V +SPLandroidx/appcompat/widget/AppCompatTextView;->drawableStateChanged()V +SPLandroidx/appcompat/widget/AppCompatTextView;->getEmojiTextViewHelper()Landroidx/appcompat/widget/AppCompatEmojiTextHelper; +SPLandroidx/appcompat/widget/AppCompatTextView;->getFontVariationSettingsManager()Landroidx/appcompat/widget/AppCompatTextHelper$FontVariationSettingsManager; +SPLandroidx/appcompat/widget/AppCompatTextView;->getText()Ljava/lang/CharSequence; +SPLandroidx/appcompat/widget/AppCompatTextView;->getTypeface()Landroid/graphics/Typeface; +SPLandroidx/appcompat/widget/AppCompatTextView;->lambda$getFontVariationSettingsManager$0$androidx-appcompat-widget-AppCompatTextView(Landroid/graphics/Typeface;)V +SPLandroidx/appcompat/widget/AppCompatTextView;->onLayout(ZIIII)V +SPLandroidx/appcompat/widget/AppCompatTextView;->onMeasure(II)V +SPLandroidx/appcompat/widget/AppCompatTextView;->onTextChanged(Ljava/lang/CharSequence;III)V +SPLandroidx/appcompat/widget/AppCompatTextView;->setAllCaps(Z)V +SPLandroidx/appcompat/widget/AppCompatTextView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/AppCompatTextView;->setFilters([Landroid/text/InputFilter;)V +SPLandroidx/appcompat/widget/AppCompatTextView;->setLineHeight(I)V +SPLandroidx/appcompat/widget/AppCompatTextView;->setTextAppearance(Landroid/content/Context;I)V +SPLandroidx/appcompat/widget/AppCompatTextView;->setTextSize(IF)V +SPLandroidx/appcompat/widget/AppCompatTextView;->setTypeface(Landroid/graphics/Typeface;)V +SPLandroidx/appcompat/widget/AppCompatTextView;->setTypeface(Landroid/graphics/Typeface;I)V +Landroidx/appcompat/widget/AppCompatTextView$$ExternalSyntheticLambda0; +SPLandroidx/appcompat/widget/AppCompatTextView$$ExternalSyntheticLambda0;->(Landroidx/appcompat/widget/AppCompatTextView;)V +SPLandroidx/appcompat/widget/AppCompatTextView$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V +Landroidx/appcompat/widget/AppCompatTextView$SuperCaller; +Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper; +SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->()V +SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->(Landroid/widget/TextView;)V +SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->getAutoSizeTextType()I +SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->supportsAutoSizeText()Z +Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl; +SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl;->()V +Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl29; +SPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl29;->()V +Landroidx/appcompat/widget/ContentFrameLayout; +SPLandroidx/appcompat/widget/ContentFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/widget/ContentFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/ContentFrameLayout;->getMinWidthMajor()Landroid/util/TypedValue; +SPLandroidx/appcompat/widget/ContentFrameLayout;->getMinWidthMinor()Landroid/util/TypedValue; +SPLandroidx/appcompat/widget/ContentFrameLayout;->onAttachedToWindow()V +SPLandroidx/appcompat/widget/ContentFrameLayout;->onMeasure(II)V +SPLandroidx/appcompat/widget/ContentFrameLayout;->setAttachListener(Landroidx/appcompat/widget/ContentFrameLayout$OnAttachListener;)V +SPLandroidx/appcompat/widget/ContentFrameLayout;->setDecorPadding(IIII)V +Landroidx/appcompat/widget/ContentFrameLayout$OnAttachListener; +Landroidx/appcompat/widget/DecorToolbar; +Landroidx/appcompat/widget/DrawableUtils; +SPLandroidx/appcompat/widget/DrawableUtils;->()V +SPLandroidx/appcompat/widget/DrawableUtils;->fixDrawable(Landroid/graphics/drawable/Drawable;)V +Landroidx/appcompat/widget/EmojiCompatConfigurationView; +Landroidx/appcompat/widget/FitWindowsFrameLayout; +SPLandroidx/appcompat/widget/FitWindowsFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/widget/FitWindowsFrameLayout;->fitSystemWindows(Landroid/graphics/Rect;)Z +Landroidx/appcompat/widget/FitWindowsViewGroup; +Landroidx/appcompat/widget/ForwardingListener; +SPLandroidx/appcompat/widget/ForwardingListener;->(Landroid/view/View;)V +SPLandroidx/appcompat/widget/ForwardingListener;->onViewAttachedToWindow(Landroid/view/View;)V +Landroidx/appcompat/widget/LinearLayoutCompat; +SPLandroidx/appcompat/widget/LinearLayoutCompat;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/widget/LinearLayoutCompat;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/LinearLayoutCompat;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z +SPLandroidx/appcompat/widget/LinearLayoutCompat;->forceUniformHeight(II)V +SPLandroidx/appcompat/widget/LinearLayoutCompat;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; +SPLandroidx/appcompat/widget/LinearLayoutCompat;->generateLayoutParams(Landroid/util/AttributeSet;)Landroidx/appcompat/widget/LinearLayoutCompat$LayoutParams; +SPLandroidx/appcompat/widget/LinearLayoutCompat;->getChildrenSkipCount(Landroid/view/View;I)I +SPLandroidx/appcompat/widget/LinearLayoutCompat;->getLocationOffset(Landroid/view/View;)I +SPLandroidx/appcompat/widget/LinearLayoutCompat;->getNextLocationOffset(Landroid/view/View;)I +SPLandroidx/appcompat/widget/LinearLayoutCompat;->getVirtualChildAt(I)Landroid/view/View; +SPLandroidx/appcompat/widget/LinearLayoutCompat;->getVirtualChildCount()I +SPLandroidx/appcompat/widget/LinearLayoutCompat;->hasDividerBeforeChildAt(I)Z +SPLandroidx/appcompat/widget/LinearLayoutCompat;->layoutHorizontal(IIII)V +SPLandroidx/appcompat/widget/LinearLayoutCompat;->measureChildBeforeLayout(Landroid/view/View;IIIII)V +SPLandroidx/appcompat/widget/LinearLayoutCompat;->measureHorizontal(II)V +SPLandroidx/appcompat/widget/LinearLayoutCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V +SPLandroidx/appcompat/widget/LinearLayoutCompat;->onLayout(ZIIII)V +SPLandroidx/appcompat/widget/LinearLayoutCompat;->onMeasure(II)V +SPLandroidx/appcompat/widget/LinearLayoutCompat;->setBaselineAligned(Z)V +SPLandroidx/appcompat/widget/LinearLayoutCompat;->setChildFrame(Landroid/view/View;IIII)V +SPLandroidx/appcompat/widget/LinearLayoutCompat;->setDividerDrawable(Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/LinearLayoutCompat;->setOrientation(I)V +Landroidx/appcompat/widget/LinearLayoutCompat$LayoutParams; +SPLandroidx/appcompat/widget/LinearLayoutCompat$LayoutParams;->(II)V +SPLandroidx/appcompat/widget/LinearLayoutCompat$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +Landroidx/appcompat/widget/ListPopupWindow; +SPLandroidx/appcompat/widget/ListPopupWindow;->()V +SPLandroidx/appcompat/widget/ListPopupWindow;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/ListPopupWindow;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V +SPLandroidx/appcompat/widget/ListPopupWindow;->setAnchorView(Landroid/view/View;)V +SPLandroidx/appcompat/widget/ListPopupWindow;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/ListPopupWindow;->setModal(Z)V +SPLandroidx/appcompat/widget/ListPopupWindow;->setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V +SPLandroidx/appcompat/widget/ListPopupWindow;->setPromptPosition(I)V +Landroidx/appcompat/widget/ListPopupWindow$ListSelectorHider; +SPLandroidx/appcompat/widget/ListPopupWindow$ListSelectorHider;->(Landroidx/appcompat/widget/ListPopupWindow;)V +Landroidx/appcompat/widget/ListPopupWindow$PopupScrollListener; +SPLandroidx/appcompat/widget/ListPopupWindow$PopupScrollListener;->(Landroidx/appcompat/widget/ListPopupWindow;)V +Landroidx/appcompat/widget/ListPopupWindow$PopupTouchInterceptor; +SPLandroidx/appcompat/widget/ListPopupWindow$PopupTouchInterceptor;->(Landroidx/appcompat/widget/ListPopupWindow;)V +Landroidx/appcompat/widget/ListPopupWindow$ResizePopupRunnable; +SPLandroidx/appcompat/widget/ListPopupWindow$ResizePopupRunnable;->(Landroidx/appcompat/widget/ListPopupWindow;)V +Landroidx/appcompat/widget/ResourceManagerInternal; +SPLandroidx/appcompat/widget/ResourceManagerInternal;->()V +SPLandroidx/appcompat/widget/ResourceManagerInternal;->()V +SPLandroidx/appcompat/widget/ResourceManagerInternal;->checkVectorDrawableSetup(Landroid/content/Context;)V +SPLandroidx/appcompat/widget/ResourceManagerInternal;->createCacheKey(Landroid/util/TypedValue;)J +SPLandroidx/appcompat/widget/ResourceManagerInternal;->createDrawableIfNeeded(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/widget/ResourceManagerInternal;->createTintFilter(Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;[I)Landroid/graphics/PorterDuffColorFilter; +SPLandroidx/appcompat/widget/ResourceManagerInternal;->get()Landroidx/appcompat/widget/ResourceManagerInternal; +SPLandroidx/appcompat/widget/ResourceManagerInternal;->getCachedDrawable(Landroid/content/Context;J)Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/widget/ResourceManagerInternal;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/widget/ResourceManagerInternal;->getDrawable(Landroid/content/Context;IZ)Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/widget/ResourceManagerInternal;->getPorterDuffColorFilter(ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuffColorFilter; +SPLandroidx/appcompat/widget/ResourceManagerInternal;->getTintList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; +SPLandroidx/appcompat/widget/ResourceManagerInternal;->getTintListFromCache(Landroid/content/Context;I)Landroid/content/res/ColorStateList; +SPLandroidx/appcompat/widget/ResourceManagerInternal;->installDefaultInflateDelegates(Landroidx/appcompat/widget/ResourceManagerInternal;)V +SPLandroidx/appcompat/widget/ResourceManagerInternal;->isVectorDrawable(Landroid/graphics/drawable/Drawable;)Z +SPLandroidx/appcompat/widget/ResourceManagerInternal;->loadDrawableFromDelegates(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/widget/ResourceManagerInternal;->setHooks(Landroidx/appcompat/widget/ResourceManagerInternal$ResourceManagerHooks;)V +SPLandroidx/appcompat/widget/ResourceManagerInternal;->tintDrawable(Landroid/content/Context;IZLandroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/widget/ResourceManagerInternal;->tintDrawable(Landroid/graphics/drawable/Drawable;Landroidx/appcompat/widget/TintInfo;[I)V +SPLandroidx/appcompat/widget/ResourceManagerInternal;->tintDrawableUsingColorFilter(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z +Landroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache; +SPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->(I)V +SPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->generateCacheKey(ILandroid/graphics/PorterDuff$Mode;)I +SPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->get(ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuffColorFilter; +SPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->put(ILandroid/graphics/PorterDuff$Mode;Landroid/graphics/PorterDuffColorFilter;)Landroid/graphics/PorterDuffColorFilter; +Landroidx/appcompat/widget/ResourceManagerInternal$ResourceManagerHooks; +Landroidx/appcompat/widget/RtlSpacingHelper; +SPLandroidx/appcompat/widget/RtlSpacingHelper;->()V +SPLandroidx/appcompat/widget/RtlSpacingHelper;->getEnd()I +SPLandroidx/appcompat/widget/RtlSpacingHelper;->getStart()I +SPLandroidx/appcompat/widget/RtlSpacingHelper;->setAbsolute(II)V +SPLandroidx/appcompat/widget/RtlSpacingHelper;->setDirection(Z)V +SPLandroidx/appcompat/widget/RtlSpacingHelper;->setRelative(II)V +Landroidx/appcompat/widget/SearchView; +SPLandroidx/appcompat/widget/SearchView;->()V +SPLandroidx/appcompat/widget/SearchView;->(Landroid/content/Context;)V +SPLandroidx/appcompat/widget/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/widget/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/SearchView;->getDecoratedHint(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +SPLandroidx/appcompat/widget/SearchView;->getQueryHint()Ljava/lang/CharSequence; +SPLandroidx/appcompat/widget/SearchView;->isSubmitAreaEnabled()Z +SPLandroidx/appcompat/widget/SearchView;->setIconifiedByDefault(Z)V +SPLandroidx/appcompat/widget/SearchView;->setMaxWidth(I)V +SPLandroidx/appcompat/widget/SearchView;->setOnQueryTextListener(Landroidx/appcompat/widget/SearchView$OnQueryTextListener;)V +SPLandroidx/appcompat/widget/SearchView;->setQueryHint(Ljava/lang/CharSequence;)V +SPLandroidx/appcompat/widget/SearchView;->updateCloseButton()V +SPLandroidx/appcompat/widget/SearchView;->updateQueryHint()V +SPLandroidx/appcompat/widget/SearchView;->updateSubmitArea()V +SPLandroidx/appcompat/widget/SearchView;->updateSubmitButton(Z)V +SPLandroidx/appcompat/widget/SearchView;->updateViewsVisibility(Z)V +SPLandroidx/appcompat/widget/SearchView;->updateVoiceButton(Z)V +Landroidx/appcompat/widget/SearchView$1; +SPLandroidx/appcompat/widget/SearchView$1;->(Landroidx/appcompat/widget/SearchView;)V +Landroidx/appcompat/widget/SearchView$10; +SPLandroidx/appcompat/widget/SearchView$10;->(Landroidx/appcompat/widget/SearchView;)V +Landroidx/appcompat/widget/SearchView$2; +SPLandroidx/appcompat/widget/SearchView$2;->(Landroidx/appcompat/widget/SearchView;)V +Landroidx/appcompat/widget/SearchView$3; +SPLandroidx/appcompat/widget/SearchView$3;->(Landroidx/appcompat/widget/SearchView;)V +Landroidx/appcompat/widget/SearchView$4; +SPLandroidx/appcompat/widget/SearchView$4;->(Landroidx/appcompat/widget/SearchView;)V +Landroidx/appcompat/widget/SearchView$5; +SPLandroidx/appcompat/widget/SearchView$5;->(Landroidx/appcompat/widget/SearchView;)V +Landroidx/appcompat/widget/SearchView$6; +SPLandroidx/appcompat/widget/SearchView$6;->(Landroidx/appcompat/widget/SearchView;)V +Landroidx/appcompat/widget/SearchView$7; +SPLandroidx/appcompat/widget/SearchView$7;->(Landroidx/appcompat/widget/SearchView;)V +Landroidx/appcompat/widget/SearchView$8; +SPLandroidx/appcompat/widget/SearchView$8;->(Landroidx/appcompat/widget/SearchView;)V +Landroidx/appcompat/widget/SearchView$9; +SPLandroidx/appcompat/widget/SearchView$9;->(Landroidx/appcompat/widget/SearchView;)V +Landroidx/appcompat/widget/SearchView$OnQueryTextListener; +Landroidx/appcompat/widget/SearchView$PreQAutoCompleteTextViewReflector; +Landroidx/appcompat/widget/SearchView$SearchAutoComplete; +SPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->enoughToFilter()Z +SPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->getSearchViewTextMinWidthDp()I +SPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->onFinishInflate()V +SPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->setSearchView(Landroidx/appcompat/widget/SearchView;)V +Landroidx/appcompat/widget/SearchView$SearchAutoComplete$1; +SPLandroidx/appcompat/widget/SearchView$SearchAutoComplete$1;->(Landroidx/appcompat/widget/SearchView$SearchAutoComplete;)V +Landroidx/appcompat/widget/ThemeUtils; +SPLandroidx/appcompat/widget/ThemeUtils;->()V +SPLandroidx/appcompat/widget/ThemeUtils;->checkAppCompatTheme(Landroid/view/View;Landroid/content/Context;)V +SPLandroidx/appcompat/widget/ThemeUtils;->getThemeAttrColor(Landroid/content/Context;I)I +Landroidx/appcompat/widget/TintInfo; +SPLandroidx/appcompat/widget/TintInfo;->()V +Landroidx/appcompat/widget/TintTypedArray; +SPLandroidx/appcompat/widget/TintTypedArray;->(Landroid/content/Context;Landroid/content/res/TypedArray;)V +SPLandroidx/appcompat/widget/TintTypedArray;->getBoolean(IZ)Z +SPLandroidx/appcompat/widget/TintTypedArray;->getColor(II)I +SPLandroidx/appcompat/widget/TintTypedArray;->getColorStateList(I)Landroid/content/res/ColorStateList; +SPLandroidx/appcompat/widget/TintTypedArray;->getDimensionPixelOffset(II)I +SPLandroidx/appcompat/widget/TintTypedArray;->getDimensionPixelSize(II)I +SPLandroidx/appcompat/widget/TintTypedArray;->getDrawable(I)Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/widget/TintTypedArray;->getDrawableIfKnown(I)Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/widget/TintTypedArray;->getFloat(IF)F +SPLandroidx/appcompat/widget/TintTypedArray;->getFont(IILandroidx/core/content/res/ResourcesCompat$FontCallback;)Landroid/graphics/Typeface; +SPLandroidx/appcompat/widget/TintTypedArray;->getInt(II)I +SPLandroidx/appcompat/widget/TintTypedArray;->getInteger(II)I +SPLandroidx/appcompat/widget/TintTypedArray;->getLayoutDimension(II)I +SPLandroidx/appcompat/widget/TintTypedArray;->getResourceId(II)I +SPLandroidx/appcompat/widget/TintTypedArray;->getString(I)Ljava/lang/String; +SPLandroidx/appcompat/widget/TintTypedArray;->getText(I)Ljava/lang/CharSequence; +SPLandroidx/appcompat/widget/TintTypedArray;->getTextArray(I)[Ljava/lang/CharSequence; +SPLandroidx/appcompat/widget/TintTypedArray;->getWrappedTypeArray()Landroid/content/res/TypedArray; +SPLandroidx/appcompat/widget/TintTypedArray;->hasValue(I)Z +SPLandroidx/appcompat/widget/TintTypedArray;->obtainStyledAttributes(Landroid/content/Context;I[I)Landroidx/appcompat/widget/TintTypedArray; +SPLandroidx/appcompat/widget/TintTypedArray;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[I)Landroidx/appcompat/widget/TintTypedArray; +SPLandroidx/appcompat/widget/TintTypedArray;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III)Landroidx/appcompat/widget/TintTypedArray; +SPLandroidx/appcompat/widget/TintTypedArray;->recycle()V +Landroidx/appcompat/widget/Toolbar; +SPLandroidx/appcompat/widget/Toolbar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/widget/Toolbar;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/Toolbar;->addCustomViewsWithGravity(Ljava/util/List;I)V +SPLandroidx/appcompat/widget/Toolbar;->addSystemView(Landroid/view/View;Z)V +SPLandroidx/appcompat/widget/Toolbar;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z +SPLandroidx/appcompat/widget/Toolbar;->ensureContentInsets()V +SPLandroidx/appcompat/widget/Toolbar;->ensureMenu()V +SPLandroidx/appcompat/widget/Toolbar;->ensureMenuView()V +SPLandroidx/appcompat/widget/Toolbar;->ensureNavButtonView()V +SPLandroidx/appcompat/widget/Toolbar;->generateDefaultLayoutParams()Landroidx/appcompat/widget/Toolbar$LayoutParams; +SPLandroidx/appcompat/widget/Toolbar;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; +SPLandroidx/appcompat/widget/Toolbar;->generateLayoutParams(Landroid/util/AttributeSet;)Landroidx/appcompat/widget/Toolbar$LayoutParams; +SPLandroidx/appcompat/widget/Toolbar;->getChildTop(Landroid/view/View;I)I +SPLandroidx/appcompat/widget/Toolbar;->getChildVerticalGravity(I)I +SPLandroidx/appcompat/widget/Toolbar;->getContentInsetEnd()I +SPLandroidx/appcompat/widget/Toolbar;->getContentInsetStart()I +SPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetEnd()I +SPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetLeft()I +SPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetRight()I +SPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetStart()I +SPLandroidx/appcompat/widget/Toolbar;->getHorizontalMargins(Landroid/view/View;)I +SPLandroidx/appcompat/widget/Toolbar;->getMenu()Landroid/view/Menu; +SPLandroidx/appcompat/widget/Toolbar;->getNavigationContentDescription()Ljava/lang/CharSequence; +SPLandroidx/appcompat/widget/Toolbar;->getNavigationIcon()Landroid/graphics/drawable/Drawable; +SPLandroidx/appcompat/widget/Toolbar;->getSubtitle()Ljava/lang/CharSequence; +SPLandroidx/appcompat/widget/Toolbar;->getTitle()Ljava/lang/CharSequence; +SPLandroidx/appcompat/widget/Toolbar;->getVerticalMargins(Landroid/view/View;)I +SPLandroidx/appcompat/widget/Toolbar;->getViewListMeasuredWidth(Ljava/util/List;[I)I +SPLandroidx/appcompat/widget/Toolbar;->hasExpandedActionView()Z +SPLandroidx/appcompat/widget/Toolbar;->isChildOrHidden(Landroid/view/View;)Z +SPLandroidx/appcompat/widget/Toolbar;->layoutChildLeft(Landroid/view/View;I[II)I +SPLandroidx/appcompat/widget/Toolbar;->layoutChildRight(Landroid/view/View;I[II)I +SPLandroidx/appcompat/widget/Toolbar;->measureChildCollapseMargins(Landroid/view/View;IIII[I)I +SPLandroidx/appcompat/widget/Toolbar;->measureChildConstrained(Landroid/view/View;IIIII)V +SPLandroidx/appcompat/widget/Toolbar;->onAttachedToWindow()V +SPLandroidx/appcompat/widget/Toolbar;->onLayout(ZIIII)V +SPLandroidx/appcompat/widget/Toolbar;->onMeasure(II)V +SPLandroidx/appcompat/widget/Toolbar;->onRtlPropertiesChanged(I)V +SPLandroidx/appcompat/widget/Toolbar;->setBackInvokedCallbackEnabled(Z)V +SPLandroidx/appcompat/widget/Toolbar;->setMenuCallbacks(Landroidx/appcompat/view/menu/MenuPresenter$Callback;Landroidx/appcompat/view/menu/MenuBuilder$Callback;)V +SPLandroidx/appcompat/widget/Toolbar;->setNavigationContentDescription(Ljava/lang/CharSequence;)V +SPLandroidx/appcompat/widget/Toolbar;->setNavigationIcon(Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/Toolbar;->setNavigationOnClickListener(Landroid/view/View$OnClickListener;)V +SPLandroidx/appcompat/widget/Toolbar;->setOnMenuItemClickListener(Landroidx/appcompat/widget/Toolbar$OnMenuItemClickListener;)V +SPLandroidx/appcompat/widget/Toolbar;->setPopupTheme(I)V +SPLandroidx/appcompat/widget/Toolbar;->setSubtitle(Ljava/lang/CharSequence;)V +SPLandroidx/appcompat/widget/Toolbar;->setTitle(Ljava/lang/CharSequence;)V +SPLandroidx/appcompat/widget/Toolbar;->shouldCollapse()Z +SPLandroidx/appcompat/widget/Toolbar;->shouldLayout(Landroid/view/View;)Z +SPLandroidx/appcompat/widget/Toolbar;->updateBackInvokedCallbackState()V +Landroidx/appcompat/widget/Toolbar$$ExternalSyntheticLambda1; +SPLandroidx/appcompat/widget/Toolbar$$ExternalSyntheticLambda1;->(Landroidx/appcompat/widget/Toolbar;)V +Landroidx/appcompat/widget/Toolbar$1; +SPLandroidx/appcompat/widget/Toolbar$1;->(Landroidx/appcompat/widget/Toolbar;)V +Landroidx/appcompat/widget/Toolbar$2; +SPLandroidx/appcompat/widget/Toolbar$2;->(Landroidx/appcompat/widget/Toolbar;)V +Landroidx/appcompat/widget/Toolbar$3; +SPLandroidx/appcompat/widget/Toolbar$3;->(Landroidx/appcompat/widget/Toolbar;)V +Landroidx/appcompat/widget/Toolbar$Api33Impl; +SPLandroidx/appcompat/widget/Toolbar$Api33Impl;->findOnBackInvokedDispatcher(Landroid/view/View;)Landroid/window/OnBackInvokedDispatcher; +Landroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter; +SPLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;->(Landroidx/appcompat/widget/Toolbar;)V +SPLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;->flagActionItems()Z +SPLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V +SPLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;->updateMenuView(Z)V +Landroidx/appcompat/widget/Toolbar$LayoutParams; +SPLandroidx/appcompat/widget/Toolbar$LayoutParams;->(II)V +SPLandroidx/appcompat/widget/Toolbar$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +Landroidx/appcompat/widget/Toolbar$OnMenuItemClickListener; +Landroidx/appcompat/widget/ToolbarWidgetWrapper; +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->(Landroidx/appcompat/widget/Toolbar;Z)V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->(Landroidx/appcompat/widget/Toolbar;ZII)V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->detectDisplayOptions()I +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->getContext()Landroid/content/Context; +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->getDisplayOptions()I +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->getMenu()Landroid/view/Menu; +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->getViewGroup()Landroid/view/ViewGroup; +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->setDefaultNavigationContentDescription(I)V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->setDisplayOptions(I)V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->setMenuCallbacks(Landroidx/appcompat/view/menu/MenuPresenter$Callback;Landroidx/appcompat/view/menu/MenuBuilder$Callback;)V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->setMenuPrepared()V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->setNavigationContentDescription(I)V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->setNavigationContentDescription(Ljava/lang/CharSequence;)V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->setNavigationIcon(Landroid/graphics/drawable/Drawable;)V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->setSubtitle(Ljava/lang/CharSequence;)V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->setTitle(Ljava/lang/CharSequence;)V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->setTitleInt(Ljava/lang/CharSequence;)V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->setWindowCallback(Landroid/view/Window$Callback;)V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->setWindowTitle(Ljava/lang/CharSequence;)V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->updateHomeAccessibility()V +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper;->updateNavigationIcon()V +Landroidx/appcompat/widget/ToolbarWidgetWrapper$1; +SPLandroidx/appcompat/widget/ToolbarWidgetWrapper$1;->(Landroidx/appcompat/widget/ToolbarWidgetWrapper;)V +Landroidx/appcompat/widget/TooltipCompat; +SPLandroidx/appcompat/widget/TooltipCompat;->setTooltipText(Landroid/view/View;Ljava/lang/CharSequence;)V +Landroidx/appcompat/widget/TooltipCompat$Api26Impl; +SPLandroidx/appcompat/widget/TooltipCompat$Api26Impl;->setTooltipText(Landroid/view/View;Ljava/lang/CharSequence;)V +Landroidx/appcompat/widget/ViewStubCompat; +SPLandroidx/appcompat/widget/ViewStubCompat;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/appcompat/widget/ViewStubCompat;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/appcompat/widget/ViewStubCompat;->setVisibility(I)V +Landroidx/appcompat/widget/ViewUtils; +SPLandroidx/appcompat/widget/ViewUtils;->()V +SPLandroidx/appcompat/widget/ViewUtils;->isLayoutRtl(Landroid/view/View;)Z +SPLandroidx/appcompat/widget/ViewUtils;->makeOptionalFitsSystemWindows(Landroid/view/View;)V +Landroidx/arch/core/executor/ArchTaskExecutor; +SPLandroidx/arch/core/executor/ArchTaskExecutor;->()V +SPLandroidx/arch/core/executor/ArchTaskExecutor;->()V +SPLandroidx/arch/core/executor/ArchTaskExecutor;->getInstance()Landroidx/arch/core/executor/ArchTaskExecutor; +SPLandroidx/arch/core/executor/ArchTaskExecutor;->isMainThread()Z +SPLandroidx/arch/core/executor/ArchTaskExecutor;->postToMainThread(Ljava/lang/Runnable;)V +Landroidx/arch/core/executor/ArchTaskExecutor$$ExternalSyntheticLambda0; +SPLandroidx/arch/core/executor/ArchTaskExecutor$$ExternalSyntheticLambda0;->()V +Landroidx/arch/core/executor/ArchTaskExecutor$$ExternalSyntheticLambda1; +SPLandroidx/arch/core/executor/ArchTaskExecutor$$ExternalSyntheticLambda1;->()V +Landroidx/arch/core/executor/DefaultTaskExecutor; +SPLandroidx/arch/core/executor/DefaultTaskExecutor;->()V +SPLandroidx/arch/core/executor/DefaultTaskExecutor;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; +SPLandroidx/arch/core/executor/DefaultTaskExecutor;->isMainThread()Z +SPLandroidx/arch/core/executor/DefaultTaskExecutor;->postToMainThread(Ljava/lang/Runnable;)V +Landroidx/arch/core/executor/DefaultTaskExecutor$1; +SPLandroidx/arch/core/executor/DefaultTaskExecutor$1;->(Landroidx/arch/core/executor/DefaultTaskExecutor;)V +Landroidx/arch/core/executor/DefaultTaskExecutor$Api28Impl; +SPLandroidx/arch/core/executor/DefaultTaskExecutor$Api28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; +Landroidx/arch/core/executor/TaskExecutor; +SPLandroidx/arch/core/executor/TaskExecutor;->()V +Landroidx/arch/core/internal/SafeIterableMap; +SPLandroidx/arch/core/internal/SafeIterableMap;->()V +SPLandroidx/arch/core/internal/SafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; +SPLandroidx/arch/core/internal/SafeIterableMap;->iteratorWithAdditions()Landroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions; +SPLandroidx/arch/core/internal/SafeIterableMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; +SPLandroidx/arch/core/internal/SafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/arch/core/internal/SafeIterableMap$Entry; +SPLandroidx/arch/core/internal/SafeIterableMap$Entry;->(Ljava/lang/Object;Ljava/lang/Object;)V +Landroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions; +SPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->(Landroidx/arch/core/internal/SafeIterableMap;)V +SPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->hasNext()Z +Landroidx/arch/core/internal/SafeIterableMap$SupportRemove; +SPLandroidx/arch/core/internal/SafeIterableMap$SupportRemove;->()V +Landroidx/browser/customtabs/CustomTabsCallback; +Landroidx/browser/customtabs/CustomTabsClient; +SPLandroidx/browser/customtabs/CustomTabsClient;->(Landroid/support/customtabs/ICustomTabsService;Landroid/content/ComponentName;Landroid/content/Context;)V +SPLandroidx/browser/customtabs/CustomTabsClient;->bindCustomTabsService(Landroid/content/Context;Ljava/lang/String;Landroidx/browser/customtabs/CustomTabsServiceConnection;)Z +SPLandroidx/browser/customtabs/CustomTabsClient;->createCallbackWrapper(Landroidx/browser/customtabs/CustomTabsCallback;)Landroid/support/customtabs/ICustomTabsCallback$Stub; +SPLandroidx/browser/customtabs/CustomTabsClient;->newSession(Landroidx/browser/customtabs/CustomTabsCallback;)Landroidx/browser/customtabs/CustomTabsSession; +SPLandroidx/browser/customtabs/CustomTabsClient;->newSessionInternal(Landroidx/browser/customtabs/CustomTabsCallback;Landroid/app/PendingIntent;)Landroidx/browser/customtabs/CustomTabsSession; +SPLandroidx/browser/customtabs/CustomTabsClient;->warmup(J)Z +Landroidx/browser/customtabs/CustomTabsClient$3; +SPLandroidx/browser/customtabs/CustomTabsClient$3;->(Landroidx/browser/customtabs/CustomTabsClient;Landroidx/browser/customtabs/CustomTabsCallback;)V +Landroidx/browser/customtabs/CustomTabsServiceConnection; +SPLandroidx/browser/customtabs/CustomTabsServiceConnection;->()V +SPLandroidx/browser/customtabs/CustomTabsServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V +SPLandroidx/browser/customtabs/CustomTabsServiceConnection;->setApplicationContext(Landroid/content/Context;)V +Landroidx/browser/customtabs/CustomTabsServiceConnection$1; +SPLandroidx/browser/customtabs/CustomTabsServiceConnection$1;->(Landroidx/browser/customtabs/CustomTabsServiceConnection;Landroid/support/customtabs/ICustomTabsService;Landroid/content/ComponentName;Landroid/content/Context;)V +Landroidx/browser/customtabs/CustomTabsSession; +SPLandroidx/browser/customtabs/CustomTabsSession;->(Landroid/support/customtabs/ICustomTabsService;Landroid/support/customtabs/ICustomTabsCallback;Landroid/content/ComponentName;Landroid/app/PendingIntent;)V +Landroidx/collection/ArrayMap; +SPLandroidx/collection/ArrayMap;->()V +SPLandroidx/collection/ArrayMap;->keySet()Ljava/util/Set; +Landroidx/collection/ArrayMap$KeySet; +SPLandroidx/collection/ArrayMap$KeySet;->(Landroidx/collection/ArrayMap;)V +SPLandroidx/collection/ArrayMap$KeySet;->isEmpty()Z +Landroidx/collection/ArraySet; +SPLandroidx/collection/ArraySet;->()V +SPLandroidx/collection/ArraySet;->(I)V +SPLandroidx/collection/ArraySet;->(IILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/collection/ArraySet;->add(Ljava/lang/Object;)Z +SPLandroidx/collection/ArraySet;->clear()V +SPLandroidx/collection/ArraySet;->getArray$collection()[Ljava/lang/Object; +SPLandroidx/collection/ArraySet;->getHashes$collection()[I +SPLandroidx/collection/ArraySet;->get_size$collection()I +SPLandroidx/collection/ArraySet;->iterator()Ljava/util/Iterator; +SPLandroidx/collection/ArraySet;->setArray$collection([Ljava/lang/Object;)V +SPLandroidx/collection/ArraySet;->setHashes$collection([I)V +SPLandroidx/collection/ArraySet;->set_size$collection(I)V +SPLandroidx/collection/ArraySet;->toArray()[Ljava/lang/Object; +SPLandroidx/collection/ArraySet;->valueAt(I)Ljava/lang/Object; +Landroidx/collection/ArraySet$ElementIterator; +SPLandroidx/collection/ArraySet$ElementIterator;->(Landroidx/collection/ArraySet;)V +SPLandroidx/collection/ArraySet$ElementIterator;->elementAt(I)Ljava/lang/Object; +Landroidx/collection/ArraySetKt; +SPLandroidx/collection/ArraySetKt;->allocArrays(Landroidx/collection/ArraySet;I)V +SPLandroidx/collection/ArraySetKt;->binarySearchInternal(Landroidx/collection/ArraySet;I)I +SPLandroidx/collection/ArraySetKt;->indexOf(Landroidx/collection/ArraySet;Ljava/lang/Object;I)I +Landroidx/collection/IndexBasedArrayIterator; +SPLandroidx/collection/IndexBasedArrayIterator;->(I)V +SPLandroidx/collection/IndexBasedArrayIterator;->hasNext()Z +SPLandroidx/collection/IndexBasedArrayIterator;->next()Ljava/lang/Object; +Landroidx/collection/LongSparseArray; +SPLandroidx/collection/LongSparseArray;->()V +SPLandroidx/collection/LongSparseArray;->(I)V +SPLandroidx/collection/LongSparseArray;->(IILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/collection/LongSparseArray;->clear()V +SPLandroidx/collection/LongSparseArray;->get(J)Ljava/lang/Object; +Landroidx/collection/LruCache; +SPLandroidx/collection/LruCache;->(I)V +SPLandroidx/collection/LruCache;->create(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/collection/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/collection/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/collection/LruCache;->safeSizeOf(Ljava/lang/Object;Ljava/lang/Object;)I +SPLandroidx/collection/LruCache;->sizeOf(Ljava/lang/Object;Ljava/lang/Object;)I +SPLandroidx/collection/LruCache;->trimToSize(I)V +Landroidx/collection/MutableScatterMap; +SPLandroidx/collection/MutableScatterMap;->(I)V +SPLandroidx/collection/MutableScatterMap;->(IILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/collection/MutableScatterMap;->adjustStorage$collection()V +SPLandroidx/collection/MutableScatterMap;->findFirstAvailableSlot(I)I +SPLandroidx/collection/MutableScatterMap;->findInsertIndex(Ljava/lang/Object;)I +SPLandroidx/collection/MutableScatterMap;->initializeGrowth()V +SPLandroidx/collection/MutableScatterMap;->initializeMetadata(I)V +SPLandroidx/collection/MutableScatterMap;->initializeStorage(I)V +SPLandroidx/collection/MutableScatterMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/collection/MutableScatterMap;->removeValueAt(I)Ljava/lang/Object; +SPLandroidx/collection/MutableScatterMap;->resizeStorage$collection(I)V +SPLandroidx/collection/MutableScatterMap;->set(Ljava/lang/Object;Ljava/lang/Object;)V +Landroidx/collection/ScatterMap; +SPLandroidx/collection/ScatterMap;->()V +SPLandroidx/collection/ScatterMap;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/collection/ScatterMap;->containsKey(Ljava/lang/Object;)Z +SPLandroidx/collection/ScatterMap;->get(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/collection/ScatterMap;->getCapacity()I +SPLandroidx/collection/ScatterMap;->getSize()I +Landroidx/collection/ScatterMapKt; +SPLandroidx/collection/ScatterMapKt;->()V +SPLandroidx/collection/ScatterMapKt;->loadedCapacity(I)I +SPLandroidx/collection/ScatterMapKt;->nextCapacity(I)I +SPLandroidx/collection/ScatterMapKt;->normalizeCapacity(I)I +SPLandroidx/collection/ScatterMapKt;->unloadedCapacity(I)I +Landroidx/collection/SimpleArrayMap; +SPLandroidx/collection/SimpleArrayMap;->()V +SPLandroidx/collection/SimpleArrayMap;->(I)V +SPLandroidx/collection/SimpleArrayMap;->(IILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/collection/SimpleArrayMap;->clear()V +SPLandroidx/collection/SimpleArrayMap;->containsKey(Ljava/lang/Object;)Z +SPLandroidx/collection/SimpleArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/collection/SimpleArrayMap;->indexOf(Ljava/lang/Object;I)I +SPLandroidx/collection/SimpleArrayMap;->indexOfKey(Ljava/lang/Object;)I +SPLandroidx/collection/SimpleArrayMap;->isEmpty()Z +SPLandroidx/collection/SimpleArrayMap;->keyAt(I)Ljava/lang/Object; +SPLandroidx/collection/SimpleArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/collection/SimpleArrayMap;->removeAt(I)Ljava/lang/Object; +SPLandroidx/collection/SimpleArrayMap;->size()I +SPLandroidx/collection/SimpleArrayMap;->valueAt(I)Ljava/lang/Object; +Landroidx/collection/internal/ContainerHelpersKt; +SPLandroidx/collection/internal/ContainerHelpersKt;->()V +SPLandroidx/collection/internal/ContainerHelpersKt;->binarySearch([III)I +SPLandroidx/collection/internal/ContainerHelpersKt;->binarySearch([JIJ)I +SPLandroidx/collection/internal/ContainerHelpersKt;->idealByteArraySize(I)I +SPLandroidx/collection/internal/ContainerHelpersKt;->idealLongArraySize(I)I +Landroidx/collection/internal/Lock; +SPLandroidx/collection/internal/Lock;->()V +Landroidx/collection/internal/LruHashMap; +SPLandroidx/collection/internal/LruHashMap;->(IF)V +SPLandroidx/collection/internal/LruHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/collection/internal/LruHashMap;->isEmpty()Z +SPLandroidx/collection/internal/LruHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/core/MutatorMutex$$ExternalSyntheticBackportWithForwarding0; +SPLandroidx/compose/animation/core/MutatorMutex$$ExternalSyntheticBackportWithForwarding0;->m(Ljava/util/concurrent/atomic/AtomicReference;Ljava/lang/Object;Ljava/lang/Object;)Z +Landroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0; +SPLandroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Outline;Landroid/graphics/Path;)V +Landroidx/concurrent/futures/AbstractResolvableFuture; +SPLandroidx/concurrent/futures/AbstractResolvableFuture;->()V +SPLandroidx/concurrent/futures/AbstractResolvableFuture;->()V +SPLandroidx/concurrent/futures/AbstractResolvableFuture;->afterDone()V +SPLandroidx/concurrent/futures/AbstractResolvableFuture;->clearListeners(Landroidx/concurrent/futures/AbstractResolvableFuture$Listener;)Landroidx/concurrent/futures/AbstractResolvableFuture$Listener; +SPLandroidx/concurrent/futures/AbstractResolvableFuture;->complete(Landroidx/concurrent/futures/AbstractResolvableFuture;)V +SPLandroidx/concurrent/futures/AbstractResolvableFuture;->releaseWaiters()V +SPLandroidx/concurrent/futures/AbstractResolvableFuture;->set(Ljava/lang/Object;)Z +Landroidx/concurrent/futures/AbstractResolvableFuture$AtomicHelper; +SPLandroidx/concurrent/futures/AbstractResolvableFuture$AtomicHelper;->()V +SPLandroidx/concurrent/futures/AbstractResolvableFuture$AtomicHelper;->(Landroidx/concurrent/futures/AbstractResolvableFuture$1;)V +Landroidx/concurrent/futures/AbstractResolvableFuture$Listener; +SPLandroidx/concurrent/futures/AbstractResolvableFuture$Listener;->()V +SPLandroidx/concurrent/futures/AbstractResolvableFuture$Listener;->(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)V +Landroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper; +SPLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->(Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;)V +SPLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casListeners(Landroidx/concurrent/futures/AbstractResolvableFuture;Landroidx/concurrent/futures/AbstractResolvableFuture$Listener;Landroidx/concurrent/futures/AbstractResolvableFuture$Listener;)Z +SPLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casValue(Landroidx/concurrent/futures/AbstractResolvableFuture;Ljava/lang/Object;Ljava/lang/Object;)Z +SPLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casWaiters(Landroidx/concurrent/futures/AbstractResolvableFuture;Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;)Z +Landroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper$$ExternalSyntheticBackportWithForwarding0; +SPLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper$$ExternalSyntheticBackportWithForwarding0;->m(Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z +Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter; +SPLandroidx/concurrent/futures/AbstractResolvableFuture$Waiter;->()V +SPLandroidx/concurrent/futures/AbstractResolvableFuture$Waiter;->(Z)V +Landroidx/concurrent/futures/CallbackToFutureAdapter; +SPLandroidx/concurrent/futures/CallbackToFutureAdapter;->getFuture(Landroidx/concurrent/futures/CallbackToFutureAdapter$Resolver;)Lcom/google/common/util/concurrent/ListenableFuture; +Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer; +SPLandroidx/concurrent/futures/CallbackToFutureAdapter$Completer;->()V +PLandroidx/concurrent/futures/CallbackToFutureAdapter$Completer;->finalize()V +SPLandroidx/concurrent/futures/CallbackToFutureAdapter$Completer;->set(Ljava/lang/Object;)Z +SPLandroidx/concurrent/futures/CallbackToFutureAdapter$Completer;->setCompletedNormally()V +Landroidx/concurrent/futures/CallbackToFutureAdapter$Resolver; +Landroidx/concurrent/futures/CallbackToFutureAdapter$SafeFuture; +SPLandroidx/concurrent/futures/CallbackToFutureAdapter$SafeFuture;->(Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer;)V +SPLandroidx/concurrent/futures/CallbackToFutureAdapter$SafeFuture;->set(Ljava/lang/Object;)Z +Landroidx/concurrent/futures/CallbackToFutureAdapter$SafeFuture$1; +SPLandroidx/concurrent/futures/CallbackToFutureAdapter$SafeFuture$1;->(Landroidx/concurrent/futures/CallbackToFutureAdapter$SafeFuture;)V +Landroidx/concurrent/futures/ResolvableFuture; +SPLandroidx/concurrent/futures/ResolvableFuture;->()V +SPLandroidx/concurrent/futures/ResolvableFuture;->create()Landroidx/concurrent/futures/ResolvableFuture; +PLandroidx/concurrent/futures/ResolvableFuture;->set(Ljava/lang/Object;)Z +Landroidx/coordinatorlayout/R$attr; +Landroidx/coordinatorlayout/R$styleable; +SPLandroidx/coordinatorlayout/R$styleable;->()V +Landroidx/coordinatorlayout/widget/CoordinatorLayout; +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->()V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->acquireTempRect()Landroid/graphics/Rect; +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->drawableStateChanged()V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->ensurePreDrawListener()V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams; +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getResolvedLayoutParams(Landroid/view/View;)Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams; +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getSuggestedMinimumHeight()I +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getSuggestedMinimumWidth()I +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->hasDependencies(Landroid/view/View;)Z +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->layoutChild(Landroid/view/View;I)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onAttachedToWindow()V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onLayout(ZIIII)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onLayoutChild(Landroid/view/View;I)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onMeasure(II)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onMeasureChild(Landroid/view/View;IIII)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->parseBehavior(Landroid/content/Context;Landroid/util/AttributeSet;Ljava/lang/String;)Landroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior; +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->prepareChildren()V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->releaseTempRect(Landroid/graphics/Rect;)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->resetTouchBehaviors(Z)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->resolveGravity(I)I +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->setupForInsets()V +Landroidx/coordinatorlayout/widget/CoordinatorLayout$AttachedBehavior; +Landroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior; +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->layoutDependsOn(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onAttachedToLayoutParams(Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z +Landroidx/coordinatorlayout/widget/CoordinatorLayout$DefaultBehavior; +Landroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener; +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener;->onChildViewAdded(Landroid/view/View;Landroid/view/View;)V +Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams; +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->checkAnchorChanged()Z +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->dependsOn(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->findAnchorView(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)Landroid/view/View; +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->getBehavior()Landroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior; +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->resetTouchBehaviorTracking()V +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->shouldDodge(Landroid/view/View;I)Z +Landroidx/coordinatorlayout/widget/CoordinatorLayout$ViewElevationComparator; +SPLandroidx/coordinatorlayout/widget/CoordinatorLayout$ViewElevationComparator;->()V +Landroidx/coordinatorlayout/widget/DirectedAcyclicGraph; +SPLandroidx/coordinatorlayout/widget/DirectedAcyclicGraph;->()V +SPLandroidx/coordinatorlayout/widget/DirectedAcyclicGraph;->addNode(Ljava/lang/Object;)V +SPLandroidx/coordinatorlayout/widget/DirectedAcyclicGraph;->clear()V +SPLandroidx/coordinatorlayout/widget/DirectedAcyclicGraph;->dfs(Ljava/lang/Object;Ljava/util/ArrayList;Ljava/util/HashSet;)V +SPLandroidx/coordinatorlayout/widget/DirectedAcyclicGraph;->getSortedList()Ljava/util/ArrayList; +SPLandroidx/coordinatorlayout/widget/DirectedAcyclicGraph;->hasOutgoingEdges(Ljava/lang/Object;)Z +Landroidx/core/R$attr; +Landroidx/core/R$id; +Landroidx/core/R$styleable; +SPLandroidx/core/R$styleable;->()V +Landroidx/core/app/ActivityCompat$OnRequestPermissionsResultCallback; +Landroidx/core/app/ActivityCompat$RequestPermissionsRequestCodeValidator; +Landroidx/core/app/ComponentActivity; +SPLandroidx/core/app/ComponentActivity;->()V +SPLandroidx/core/app/ComponentActivity;->getLifecycle()Landroidx/lifecycle/Lifecycle; +SPLandroidx/core/app/ComponentActivity;->onCreate(Landroid/os/Bundle;)V +Landroidx/core/app/CoreComponentFactory; +SPLandroidx/core/app/CoreComponentFactory;->()V +SPLandroidx/core/app/CoreComponentFactory;->checkCompatWrapper(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/core/app/CoreComponentFactory;->instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity; +SPLandroidx/core/app/CoreComponentFactory;->instantiateApplication(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/app/Application; +SPLandroidx/core/app/CoreComponentFactory;->instantiateProvider(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/content/ContentProvider; +SPLandroidx/core/app/CoreComponentFactory;->instantiateReceiver(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/content/BroadcastReceiver; +Landroidx/core/app/CoreComponentFactory$CompatWrapped; +Landroidx/core/app/NavUtils; +SPLandroidx/core/app/NavUtils;->getParentActivityName(Landroid/app/Activity;)Ljava/lang/String; +SPLandroidx/core/app/NavUtils;->getParentActivityName(Landroid/content/Context;Landroid/content/ComponentName;)Ljava/lang/String; +Landroidx/core/app/NotificationChannelCompat; +SPLandroidx/core/app/NotificationChannelCompat;->(Ljava/lang/String;I)V +SPLandroidx/core/app/NotificationChannelCompat;->getNotificationChannel()Landroid/app/NotificationChannel; +Landroidx/core/app/NotificationChannelCompat$Api26Impl; +SPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->createNotificationChannel(Ljava/lang/String;Ljava/lang/CharSequence;I)Landroid/app/NotificationChannel; +SPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->enableLights(Landroid/app/NotificationChannel;Z)V +SPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->enableVibration(Landroid/app/NotificationChannel;Z)V +SPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setDescription(Landroid/app/NotificationChannel;Ljava/lang/String;)V +SPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setGroup(Landroid/app/NotificationChannel;Ljava/lang/String;)V +SPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setLightColor(Landroid/app/NotificationChannel;I)V +SPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setShowBadge(Landroid/app/NotificationChannel;Z)V +SPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setSound(Landroid/app/NotificationChannel;Landroid/net/Uri;Landroid/media/AudioAttributes;)V +SPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setVibrationPattern(Landroid/app/NotificationChannel;[J)V +Landroidx/core/app/NotificationChannelCompat$Builder; +SPLandroidx/core/app/NotificationChannelCompat$Builder;->(Ljava/lang/String;I)V +SPLandroidx/core/app/NotificationChannelCompat$Builder;->build()Landroidx/core/app/NotificationChannelCompat; +SPLandroidx/core/app/NotificationChannelCompat$Builder;->setName(Ljava/lang/CharSequence;)Landroidx/core/app/NotificationChannelCompat$Builder; +SPLandroidx/core/app/NotificationChannelCompat$Builder;->setShowBadge(Z)Landroidx/core/app/NotificationChannelCompat$Builder; +SPLandroidx/core/app/NotificationChannelCompat$Builder;->setVibrationEnabled(Z)Landroidx/core/app/NotificationChannelCompat$Builder; +SPLandroidx/core/app/NotificationChannelCompat$Builder;->setVibrationPattern([J)Landroidx/core/app/NotificationChannelCompat$Builder; +Landroidx/core/app/NotificationManagerCompat; +SPLandroidx/core/app/NotificationManagerCompat;->()V +SPLandroidx/core/app/NotificationManagerCompat;->(Landroid/content/Context;)V +SPLandroidx/core/app/NotificationManagerCompat;->createNotificationChannel(Landroid/app/NotificationChannel;)V +SPLandroidx/core/app/NotificationManagerCompat;->createNotificationChannel(Landroidx/core/app/NotificationChannelCompat;)V +SPLandroidx/core/app/NotificationManagerCompat;->from(Landroid/content/Context;)Landroidx/core/app/NotificationManagerCompat; +Landroidx/core/app/NotificationManagerCompat$Api26Impl; +SPLandroidx/core/app/NotificationManagerCompat$Api26Impl;->createNotificationChannel(Landroid/app/NotificationManager;Landroid/app/NotificationChannel;)V +Landroidx/core/app/OnMultiWindowModeChangedProvider; +Landroidx/core/app/OnNewIntentProvider; +Landroidx/core/app/OnPictureInPictureModeChangedProvider; +Landroidx/core/app/OnUserLeaveHintProvider; +Landroidx/core/app/PendingIntentCompat; +SPLandroidx/core/app/PendingIntentCompat;->addMutabilityFlags(ZI)I +SPLandroidx/core/app/PendingIntentCompat;->getActivity(Landroid/content/Context;ILandroid/content/Intent;IZ)Landroid/app/PendingIntent; +SPLandroidx/core/app/PendingIntentCompat;->getBroadcast(Landroid/content/Context;ILandroid/content/Intent;IZ)Landroid/app/PendingIntent; +Landroidx/core/app/TaskStackBuilder$SupportParentable; +Landroidx/core/content/ContextCompat; +SPLandroidx/core/content/ContextCompat;->checkSelfPermission(Landroid/content/Context;Ljava/lang/String;)I +SPLandroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I +SPLandroidx/core/content/ContextCompat;->getColorStateList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; +SPLandroidx/core/content/ContextCompat;->getDataDir(Landroid/content/Context;)Ljava/io/File; +SPLandroidx/core/content/ContextCompat;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; +SPLandroidx/core/content/ContextCompat;->getSystemService(Landroid/content/Context;Ljava/lang/Class;)Ljava/lang/Object; +SPLandroidx/core/content/ContextCompat;->registerReceiver(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;I)Landroid/content/Intent; +SPLandroidx/core/content/ContextCompat;->registerReceiver(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent; +Landroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/content/pm/ShortcutInfo$Builder;Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m$3()V +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/Context;Ljava/lang/String;)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;)Landroid/content/pm/ShortcutInfo; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;I)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;Landroid/graphics/drawable/Icon;)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;Z)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;[Landroid/content/Intent;)Landroid/content/pm/ShortcutInfo$Builder; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowManager;)Landroid/view/WindowMetrics; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowMetrics;)Landroid/graphics/Rect; +SPLandroidx/core/content/ContextCompat$$ExternalSyntheticApiModelOutline0;->m(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V +Landroidx/core/content/ContextCompat$Api24Impl; +SPLandroidx/core/content/ContextCompat$Api24Impl;->getDataDir(Landroid/content/Context;)Ljava/io/File; +Landroidx/core/content/ContextCompat$Api33Impl; +SPLandroidx/core/content/ContextCompat$Api33Impl;->registerReceiver(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent; +Landroidx/core/content/FileProvider; +SPLandroidx/core/content/FileProvider;->()V +SPLandroidx/core/content/FileProvider;->()V +SPLandroidx/core/content/FileProvider;->(I)V +SPLandroidx/core/content/FileProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V +SPLandroidx/core/content/FileProvider;->onCreate()Z +Landroidx/core/content/OnConfigurationChangedProvider; +Landroidx/core/content/OnTrimMemoryProvider; +Landroidx/core/content/pm/PackageInfoCompat; +SPLandroidx/core/content/pm/PackageInfoCompat;->getLongVersionCode(Landroid/content/pm/PackageInfo;)J +Landroidx/core/content/pm/PackageInfoCompat$Api28Impl; +SPLandroidx/core/content/pm/PackageInfoCompat$Api28Impl;->getLongVersionCode(Landroid/content/pm/PackageInfo;)J +Landroidx/core/content/pm/ShortcutInfoCompat; +SPLandroidx/core/content/pm/ShortcutInfoCompat;->()V +SPLandroidx/core/content/pm/ShortcutInfoCompat;->toShortcutInfo()Landroid/content/pm/ShortcutInfo; +Landroidx/core/content/pm/ShortcutInfoCompat$Api33Impl; +SPLandroidx/core/content/pm/ShortcutInfoCompat$Api33Impl;->setExcludedFromSurfaces(Landroid/content/pm/ShortcutInfo$Builder;I)V +Landroidx/core/content/pm/ShortcutInfoCompat$Builder; +SPLandroidx/core/content/pm/ShortcutInfoCompat$Builder;->(Landroid/content/Context;Ljava/lang/String;)V +SPLandroidx/core/content/pm/ShortcutInfoCompat$Builder;->build()Landroidx/core/content/pm/ShortcutInfoCompat; +SPLandroidx/core/content/pm/ShortcutInfoCompat$Builder;->setIcon(Landroidx/core/graphics/drawable/IconCompat;)Landroidx/core/content/pm/ShortcutInfoCompat$Builder; +SPLandroidx/core/content/pm/ShortcutInfoCompat$Builder;->setIntent(Landroid/content/Intent;)Landroidx/core/content/pm/ShortcutInfoCompat$Builder; +SPLandroidx/core/content/pm/ShortcutInfoCompat$Builder;->setIntents([Landroid/content/Intent;)Landroidx/core/content/pm/ShortcutInfoCompat$Builder; +SPLandroidx/core/content/pm/ShortcutInfoCompat$Builder;->setLongLabel(Ljava/lang/CharSequence;)Landroidx/core/content/pm/ShortcutInfoCompat$Builder; +SPLandroidx/core/content/pm/ShortcutInfoCompat$Builder;->setShortLabel(Ljava/lang/CharSequence;)Landroidx/core/content/pm/ShortcutInfoCompat$Builder; +Landroidx/core/content/pm/ShortcutInfoCompatSaver; +SPLandroidx/core/content/pm/ShortcutInfoCompatSaver;->()V +Landroidx/core/content/pm/ShortcutInfoCompatSaver$NoopImpl; +SPLandroidx/core/content/pm/ShortcutInfoCompatSaver$NoopImpl;->()V +SPLandroidx/core/content/pm/ShortcutInfoCompatSaver$NoopImpl;->addShortcuts(Ljava/util/List;)Ljava/lang/Object; +SPLandroidx/core/content/pm/ShortcutInfoCompatSaver$NoopImpl;->addShortcuts(Ljava/util/List;)Ljava/lang/Void; +Landroidx/core/content/pm/ShortcutManagerCompat; +SPLandroidx/core/content/pm/ShortcutManagerCompat;->()V +SPLandroidx/core/content/pm/ShortcutManagerCompat;->addDynamicShortcuts(Landroid/content/Context;Ljava/util/List;)Z +SPLandroidx/core/content/pm/ShortcutManagerCompat;->getShortcutInfoListeners(Landroid/content/Context;)Ljava/util/List; +SPLandroidx/core/content/pm/ShortcutManagerCompat;->getShortcutInfoSaverInstance(Landroid/content/Context;)Landroidx/core/content/pm/ShortcutInfoCompatSaver; +SPLandroidx/core/content/pm/ShortcutManagerCompat;->removeShortcutsExcludedFromSurface(Ljava/util/List;I)Ljava/util/List; +Landroidx/core/content/res/ColorStateListInflaterCompat; +SPLandroidx/core/content/res/ColorStateListInflaterCompat;->()V +SPLandroidx/core/content/res/ColorStateListInflaterCompat;->createFromXml(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList; +SPLandroidx/core/content/res/ColorStateListInflaterCompat;->createFromXmlInner(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList; +SPLandroidx/core/content/res/ColorStateListInflaterCompat;->getTypedValue()Landroid/util/TypedValue; +SPLandroidx/core/content/res/ColorStateListInflaterCompat;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList; +SPLandroidx/core/content/res/ColorStateListInflaterCompat;->isColorInt(Landroid/content/res/Resources;I)Z +SPLandroidx/core/content/res/ColorStateListInflaterCompat;->modulateColorAlpha(IFF)I +SPLandroidx/core/content/res/ColorStateListInflaterCompat;->obtainAttributes(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray; +Landroidx/core/content/res/GrowingArrayUtils; +SPLandroidx/core/content/res/GrowingArrayUtils;->append([III)[I +SPLandroidx/core/content/res/GrowingArrayUtils;->append([Ljava/lang/Object;ILjava/lang/Object;)[Ljava/lang/Object; +Landroidx/core/content/res/ResourcesCompat; +SPLandroidx/core/content/res/ResourcesCompat;->()V +SPLandroidx/core/content/res/ResourcesCompat;->addColorStateListToCache(Landroidx/core/content/res/ResourcesCompat$ColorStateListCacheKey;ILandroid/content/res/ColorStateList;Landroid/content/res/Resources$Theme;)V +SPLandroidx/core/content/res/ResourcesCompat;->getCachedColorStateList(Landroidx/core/content/res/ResourcesCompat$ColorStateListCacheKey;I)Landroid/content/res/ColorStateList; +SPLandroidx/core/content/res/ResourcesCompat;->getColorStateList(Landroid/content/res/Resources;ILandroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList; +SPLandroidx/core/content/res/ResourcesCompat;->getFont(Landroid/content/Context;ILandroid/util/TypedValue;ILandroidx/core/content/res/ResourcesCompat$FontCallback;)Landroid/graphics/Typeface; +SPLandroidx/core/content/res/ResourcesCompat;->getTypedValue()Landroid/util/TypedValue; +SPLandroidx/core/content/res/ResourcesCompat;->inflateColorStateList(Landroid/content/res/Resources;ILandroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList; +SPLandroidx/core/content/res/ResourcesCompat;->isColorInt(Landroid/content/res/Resources;I)Z +SPLandroidx/core/content/res/ResourcesCompat;->loadFont(Landroid/content/Context;ILandroid/util/TypedValue;ILandroidx/core/content/res/ResourcesCompat$FontCallback;Landroid/os/Handler;ZZ)Landroid/graphics/Typeface; +SPLandroidx/core/content/res/ResourcesCompat;->loadFont(Landroid/content/Context;Landroid/content/res/Resources;Landroid/util/TypedValue;IILandroidx/core/content/res/ResourcesCompat$FontCallback;Landroid/os/Handler;ZZ)Landroid/graphics/Typeface; +Landroidx/core/content/res/ResourcesCompat$ColorStateListCacheEntry; +SPLandroidx/core/content/res/ResourcesCompat$ColorStateListCacheEntry;->(Landroid/content/res/ColorStateList;Landroid/content/res/Configuration;Landroid/content/res/Resources$Theme;)V +Landroidx/core/content/res/ResourcesCompat$ColorStateListCacheKey; +SPLandroidx/core/content/res/ResourcesCompat$ColorStateListCacheKey;->(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;)V +SPLandroidx/core/content/res/ResourcesCompat$ColorStateListCacheKey;->equals(Ljava/lang/Object;)Z +SPLandroidx/core/content/res/ResourcesCompat$ColorStateListCacheKey;->hashCode()I +Landroidx/core/content/res/ResourcesCompat$FontCallback; +SPLandroidx/core/content/res/ResourcesCompat$FontCallback;->()V +SPLandroidx/core/content/res/ResourcesCompat$FontCallback;->callbackFailAsync(ILandroid/os/Handler;)V +SPLandroidx/core/content/res/ResourcesCompat$FontCallback;->getHandler(Landroid/os/Handler;)Landroid/os/Handler; +SPLandroidx/core/content/res/ResourcesCompat$FontCallback;->lambda$callbackFailAsync$1$androidx-core-content-res-ResourcesCompat$FontCallback(I)V +Landroidx/core/content/res/ResourcesCompat$FontCallback$$ExternalSyntheticLambda1; +SPLandroidx/core/content/res/ResourcesCompat$FontCallback$$ExternalSyntheticLambda1;->(Landroidx/core/content/res/ResourcesCompat$FontCallback;I)V +SPLandroidx/core/content/res/ResourcesCompat$FontCallback$$ExternalSyntheticLambda1;->run()V +Landroidx/core/content/res/TypedArrayKt; +SPLandroidx/core/content/res/TypedArrayKt;->checkAttribute(Landroid/content/res/TypedArray;I)V +SPLandroidx/core/content/res/TypedArrayKt;->getDrawableOrThrow(Landroid/content/res/TypedArray;I)Landroid/graphics/drawable/Drawable; +Landroidx/core/graphics/ColorUtils; +SPLandroidx/core/graphics/ColorUtils;->()V +SPLandroidx/core/graphics/ColorUtils;->compositeAlpha(II)I +SPLandroidx/core/graphics/ColorUtils;->compositeColors(II)I +SPLandroidx/core/graphics/ColorUtils;->compositeComponent(IIIII)I +SPLandroidx/core/graphics/ColorUtils;->setAlphaComponent(II)I +Landroidx/core/graphics/Insets; +SPLandroidx/core/graphics/Insets;->()V +SPLandroidx/core/graphics/Insets;->(IIII)V +SPLandroidx/core/graphics/Insets;->equals(Ljava/lang/Object;)Z +SPLandroidx/core/graphics/Insets;->max(Landroidx/core/graphics/Insets;Landroidx/core/graphics/Insets;)Landroidx/core/graphics/Insets; +SPLandroidx/core/graphics/Insets;->min(Landroidx/core/graphics/Insets;Landroidx/core/graphics/Insets;)Landroidx/core/graphics/Insets; +SPLandroidx/core/graphics/Insets;->of(IIII)Landroidx/core/graphics/Insets; +SPLandroidx/core/graphics/Insets;->toCompatInsets(Landroid/graphics/Insets;)Landroidx/core/graphics/Insets; +Landroidx/core/graphics/TypefaceCompat; +SPLandroidx/core/graphics/TypefaceCompat;->()V +SPLandroidx/core/graphics/TypefaceCompat;->create(Landroid/content/Context;Landroid/graphics/Typeface;I)Landroid/graphics/Typeface; +SPLandroidx/core/graphics/TypefaceCompat;->createFromFontInfo(Landroid/content/Context;Landroid/os/CancellationSignal;[Landroidx/core/provider/FontsContractCompat$FontInfo;I)Landroid/graphics/Typeface; +SPLandroidx/core/graphics/TypefaceCompat;->getSystemFontFamily(Ljava/lang/String;)Landroid/graphics/Typeface; +Landroidx/core/graphics/TypefaceCompatApi29Impl; +SPLandroidx/core/graphics/TypefaceCompatApi29Impl;->()V +SPLandroidx/core/graphics/TypefaceCompatApi29Impl;->createFromFontInfo(Landroid/content/Context;Landroid/os/CancellationSignal;[Landroidx/core/provider/FontsContractCompat$FontInfo;I)Landroid/graphics/Typeface; +SPLandroidx/core/graphics/TypefaceCompatApi29Impl;->findBaseFont(Landroid/graphics/fonts/FontFamily;I)Landroid/graphics/fonts/Font; +SPLandroidx/core/graphics/TypefaceCompatApi29Impl;->getFont(Landroid/os/CancellationSignal;Landroidx/core/provider/FontsContractCompat$FontInfo;Landroid/content/ContentResolver;)Landroid/graphics/fonts/Font; +SPLandroidx/core/graphics/TypefaceCompatApi29Impl;->getFontFamily(Landroid/os/CancellationSignal;[Landroidx/core/provider/FontsContractCompat$FontInfo;Landroid/content/ContentResolver;)Landroid/graphics/fonts/FontFamily; +SPLandroidx/core/graphics/TypefaceCompatApi29Impl;->getFontFromProvider(Landroid/os/CancellationSignal;Landroidx/core/provider/FontsContractCompat$FontInfo;Landroid/content/ContentResolver;)Landroid/graphics/fonts/Font; +SPLandroidx/core/graphics/TypefaceCompatApi29Impl;->getMatchScore(Landroid/graphics/fonts/FontStyle;Landroid/graphics/fonts/FontStyle;)I +Landroidx/core/graphics/TypefaceCompatApi31Impl; +SPLandroidx/core/graphics/TypefaceCompatApi31Impl;->()V +Landroidx/core/graphics/TypefaceCompatBaseImpl; +SPLandroidx/core/graphics/TypefaceCompatBaseImpl;->()V +Landroidx/core/graphics/TypefaceCompatUtil; +SPLandroidx/core/graphics/TypefaceCompatUtil;->mmap(Landroid/content/Context;Landroid/os/CancellationSignal;Landroid/net/Uri;)Ljava/nio/ByteBuffer; +Landroidx/core/graphics/drawable/DrawableCompat; +SPLandroidx/core/graphics/drawable/DrawableCompat;->getLayoutDirection(Landroid/graphics/drawable/Drawable;)I +SPLandroidx/core/graphics/drawable/DrawableCompat;->setHotspotBounds(Landroid/graphics/drawable/Drawable;IIII)V +SPLandroidx/core/graphics/drawable/DrawableCompat;->wrap(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; +Landroidx/core/graphics/drawable/IconCompat; +SPLandroidx/core/graphics/drawable/IconCompat;->()V +SPLandroidx/core/graphics/drawable/IconCompat;->(I)V +SPLandroidx/core/graphics/drawable/IconCompat;->createWithResource(Landroid/content/Context;I)Landroidx/core/graphics/drawable/IconCompat; +SPLandroidx/core/graphics/drawable/IconCompat;->createWithResource(Landroid/content/res/Resources;Ljava/lang/String;I)Landroidx/core/graphics/drawable/IconCompat; +SPLandroidx/core/graphics/drawable/IconCompat;->getResPackage()Ljava/lang/String; +SPLandroidx/core/graphics/drawable/IconCompat;->toIcon(Landroid/content/Context;)Landroid/graphics/drawable/Icon; +Landroidx/core/graphics/drawable/IconCompat$Api23Impl; +SPLandroidx/core/graphics/drawable/IconCompat$Api23Impl;->toIcon(Landroidx/core/graphics/drawable/IconCompat;Landroid/content/Context;)Landroid/graphics/drawable/Icon; +Landroidx/core/graphics/drawable/TintAwareDrawable; +Landroidx/core/internal/view/SupportMenu; +Landroidx/core/internal/view/SupportMenuItem; +Landroidx/core/math/MathUtils; +SPLandroidx/core/math/MathUtils;->clamp(III)I +Landroidx/core/os/BuildCompat; +SPLandroidx/core/os/BuildCompat;->()V +SPLandroidx/core/os/BuildCompat;->()V +SPLandroidx/core/os/BuildCompat;->isAtLeastB_1()Z +Landroidx/core/os/BuildCompat$Api30Impl; +SPLandroidx/core/os/BuildCompat$Api30Impl;->()V +SPLandroidx/core/os/BuildCompat$Api30Impl;->()V +SPLandroidx/core/os/BuildCompat$Api30Impl;->getExtensionVersion(I)I +Landroidx/core/os/BundleCompat; +SPLandroidx/core/os/BundleCompat;->getParcelable(Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; +Landroidx/core/os/BundleCompat$Api33Impl; +SPLandroidx/core/os/BundleCompat$Api33Impl;->getParcelable(Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; +Landroidx/core/os/BundleKt; +SPLandroidx/core/os/BundleKt;->bundleOf([Lkotlin/Pair;)Landroid/os/Bundle; +Landroidx/core/os/ConfigurationCompat; +SPLandroidx/core/os/ConfigurationCompat;->getLocales(Landroid/content/res/Configuration;)Landroidx/core/os/LocaleListCompat; +Landroidx/core/os/ConfigurationCompat$Api24Impl; +SPLandroidx/core/os/ConfigurationCompat$Api24Impl;->getLocales(Landroid/content/res/Configuration;)Landroid/os/LocaleList; +Landroidx/core/os/HandlerCompat; +SPLandroidx/core/os/HandlerCompat;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; +Landroidx/core/os/HandlerCompat$Api28Impl; +SPLandroidx/core/os/HandlerCompat$Api28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; +Landroidx/core/os/LocaleListCompat; +SPLandroidx/core/os/LocaleListCompat;->()V +SPLandroidx/core/os/LocaleListCompat;->(Landroidx/core/os/LocaleListInterface;)V +SPLandroidx/core/os/LocaleListCompat;->create([Ljava/util/Locale;)Landroidx/core/os/LocaleListCompat; +SPLandroidx/core/os/LocaleListCompat;->forLanguageTags(Ljava/lang/String;)Landroidx/core/os/LocaleListCompat; +SPLandroidx/core/os/LocaleListCompat;->get(I)Ljava/util/Locale; +SPLandroidx/core/os/LocaleListCompat;->getEmptyLocaleList()Landroidx/core/os/LocaleListCompat; +SPLandroidx/core/os/LocaleListCompat;->toLanguageTags()Ljava/lang/String; +SPLandroidx/core/os/LocaleListCompat;->wrap(Landroid/os/LocaleList;)Landroidx/core/os/LocaleListCompat; +Landroidx/core/os/LocaleListCompat$Api24Impl; +SPLandroidx/core/os/LocaleListCompat$Api24Impl;->createLocaleList([Ljava/util/Locale;)Landroid/os/LocaleList; +Landroidx/core/os/LocaleListInterface; +Landroidx/core/os/LocaleListPlatformWrapper; +SPLandroidx/core/os/LocaleListPlatformWrapper;->(Ljava/lang/Object;)V +SPLandroidx/core/os/LocaleListPlatformWrapper;->get(I)Ljava/util/Locale; +SPLandroidx/core/os/LocaleListPlatformWrapper;->toLanguageTags()Ljava/lang/String; +Landroidx/core/os/Profiling$$ExternalSyntheticApiModelOutline0; +SPLandroidx/core/os/Profiling$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/content/pm/ShortcutManager;Ljava/util/List;)Z +SPLandroidx/core/os/Profiling$$ExternalSyntheticApiModelOutline0;->m()Ljava/lang/Class; +SPLandroidx/core/os/Profiling$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/content/pm/ShortcutManager; +Landroidx/core/os/TraceCompat; +SPLandroidx/core/os/TraceCompat;->()V +SPLandroidx/core/os/TraceCompat;->beginSection(Ljava/lang/String;)V +SPLandroidx/core/os/TraceCompat;->endSection()V +SPLandroidx/core/os/TraceCompat;->isEnabled()Z +Landroidx/core/os/TraceCompat$Api29Impl; +SPLandroidx/core/os/TraceCompat$Api29Impl;->isEnabled()Z +Landroidx/core/os/UserManagerCompat; +SPLandroidx/core/os/UserManagerCompat;->isUserUnlocked(Landroid/content/Context;)Z +Landroidx/core/os/UserManagerCompat$Api24Impl; +SPLandroidx/core/os/UserManagerCompat$Api24Impl;->isUserUnlocked(Landroid/content/Context;)Z +Landroidx/core/provider/FontProvider; +SPLandroidx/core/provider/FontProvider;->()V +SPLandroidx/core/provider/FontProvider;->convertToByteArrayList([Landroid/content/pm/Signature;)Ljava/util/List; +SPLandroidx/core/provider/FontProvider;->equalsByteArrayList(Ljava/util/List;Ljava/util/List;)Z +SPLandroidx/core/provider/FontProvider;->getCertificates(Landroidx/core/provider/FontRequest;Landroid/content/res/Resources;)Ljava/util/List; +SPLandroidx/core/provider/FontProvider;->getFontFamilyResult(Landroid/content/Context;Ljava/util/List;Landroid/os/CancellationSignal;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult; +SPLandroidx/core/provider/FontProvider;->getProvider(Landroid/content/pm/PackageManager;Landroidx/core/provider/FontRequest;Landroid/content/res/Resources;)Landroid/content/pm/ProviderInfo; +SPLandroidx/core/provider/FontProvider;->getSelectionArgs(Landroidx/core/provider/FontRequest;)[Ljava/lang/String; +SPLandroidx/core/provider/FontProvider;->query(Landroid/content/Context;Landroidx/core/provider/FontRequest;Ljava/lang/String;Landroid/os/CancellationSignal;)[Landroidx/core/provider/FontsContractCompat$FontInfo; +Landroidx/core/provider/FontProvider$$ExternalSyntheticLambda0; +SPLandroidx/core/provider/FontProvider$$ExternalSyntheticLambda0;->()V +Landroidx/core/provider/FontProvider$ContentQueryWrapper; +SPLandroidx/core/provider/FontProvider$ContentQueryWrapper;->make(Landroid/content/Context;Landroid/net/Uri;)Landroidx/core/provider/FontProvider$ContentQueryWrapper; +Landroidx/core/provider/FontProvider$ContentQueryWrapperApi24Impl; +SPLandroidx/core/provider/FontProvider$ContentQueryWrapperApi24Impl;->(Landroid/content/Context;Landroid/net/Uri;)V +SPLandroidx/core/provider/FontProvider$ContentQueryWrapperApi24Impl;->close()V +SPLandroidx/core/provider/FontProvider$ContentQueryWrapperApi24Impl;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor; +Landroidx/core/provider/FontProvider$ProviderCacheKey; +SPLandroidx/core/provider/FontProvider$ProviderCacheKey;->(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V +SPLandroidx/core/provider/FontProvider$ProviderCacheKey;->hashCode()I +Landroidx/core/provider/FontRequest; +SPLandroidx/core/provider/FontRequest;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V +SPLandroidx/core/provider/FontRequest;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)V +SPLandroidx/core/provider/FontRequest;->createIdentifier(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +SPLandroidx/core/provider/FontRequest;->getCertificates()Ljava/util/List; +SPLandroidx/core/provider/FontRequest;->getProviderAuthority()Ljava/lang/String; +SPLandroidx/core/provider/FontRequest;->getProviderPackage()Ljava/lang/String; +SPLandroidx/core/provider/FontRequest;->getQuery()Ljava/lang/String; +SPLandroidx/core/provider/FontRequest;->getSystemFont()Ljava/lang/String; +SPLandroidx/core/provider/FontRequest;->getVariationSettings()Ljava/lang/String; +Landroidx/core/provider/FontsContractCompat; +SPLandroidx/core/provider/FontsContractCompat;->buildTypeface(Landroid/content/Context;Landroid/os/CancellationSignal;[Landroidx/core/provider/FontsContractCompat$FontInfo;)Landroid/graphics/Typeface; +SPLandroidx/core/provider/FontsContractCompat;->fetchFonts(Landroid/content/Context;Landroid/os/CancellationSignal;Landroidx/core/provider/FontRequest;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult; +Landroidx/core/provider/FontsContractCompat$FontFamilyResult; +SPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->(ILjava/util/List;)V +SPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->create(ILjava/util/List;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult; +SPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->getFonts()[Landroidx/core/provider/FontsContractCompat$FontInfo; +SPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->getStatusCode()I +Landroidx/core/provider/FontsContractCompat$FontInfo; +SPLandroidx/core/provider/FontsContractCompat$FontInfo;->(Landroid/net/Uri;IIZLjava/lang/String;I)V +SPLandroidx/core/provider/FontsContractCompat$FontInfo;->getResultCode()I +SPLandroidx/core/provider/FontsContractCompat$FontInfo;->getTtcIndex()I +SPLandroidx/core/provider/FontsContractCompat$FontInfo;->getUri()Landroid/net/Uri; +SPLandroidx/core/provider/FontsContractCompat$FontInfo;->getVariationSettings()Ljava/lang/String; +SPLandroidx/core/provider/FontsContractCompat$FontInfo;->getWeight()I +SPLandroidx/core/provider/FontsContractCompat$FontInfo;->isItalic()Z +SPLandroidx/core/provider/FontsContractCompat$FontInfo;->isSystemFont()Z +Landroidx/core/util/Consumer; +Landroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0; +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m$1()I +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/WindowInsets;I)Landroid/graphics/Insets; +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m$2()I +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/view/WindowInsets;)Landroid/graphics/Insets; +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m$3()I +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m()I +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/WindowInsets$Builder; +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/WindowInsets; +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/view/WindowInsetsAnimation$Callback;)V +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets$Builder;)Landroid/view/WindowInsets; +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; +SPLandroidx/core/util/HalfKt$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;I)Landroid/graphics/Insets; +Landroidx/core/util/ObjectsCompat; +SPLandroidx/core/util/ObjectsCompat;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z +SPLandroidx/core/util/ObjectsCompat;->hash([Ljava/lang/Object;)I +SPLandroidx/core/util/ObjectsCompat;->requireNonNull(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/core/util/ObjectsCompat;->requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object; +Landroidx/core/util/Pools$Pool; +Landroidx/core/util/Pools$SimplePool; +SPLandroidx/core/util/Pools$SimplePool;->(I)V +SPLandroidx/core/util/Pools$SimplePool;->acquire()Ljava/lang/Object; +SPLandroidx/core/util/Pools$SimplePool;->isInPool(Ljava/lang/Object;)Z +SPLandroidx/core/util/Pools$SimplePool;->release(Ljava/lang/Object;)Z +Landroidx/core/util/Pools$SynchronizedPool; +SPLandroidx/core/util/Pools$SynchronizedPool;->(I)V +SPLandroidx/core/util/Pools$SynchronizedPool;->acquire()Ljava/lang/Object; +SPLandroidx/core/util/Pools$SynchronizedPool;->release(Ljava/lang/Object;)Z +Landroidx/core/util/Preconditions; +SPLandroidx/core/util/Preconditions;->checkArgument(ZLjava/lang/Object;)V +SPLandroidx/core/util/Preconditions;->checkArgumentNonnegative(I)I +SPLandroidx/core/util/Preconditions;->checkArgumentNonnegative(ILjava/lang/String;)I +SPLandroidx/core/util/Preconditions;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/core/util/Preconditions;->checkNotNull(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/core/util/Preconditions;->checkState(ZLjava/lang/String;)V +Landroidx/core/util/Predicate; +Landroidx/core/view/AccessibilityDelegateCompat; +SPLandroidx/core/view/AccessibilityDelegateCompat;->()V +SPLandroidx/core/view/AccessibilityDelegateCompat;->()V +SPLandroidx/core/view/AccessibilityDelegateCompat;->(Landroid/view/View$AccessibilityDelegate;)V +SPLandroidx/core/view/AccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; +SPLandroidx/core/view/AccessibilityDelegateCompat;->getActionList(Landroid/view/View;)Ljava/util/List; +SPLandroidx/core/view/AccessibilityDelegateCompat;->getBridge()Landroid/view/View$AccessibilityDelegate; +SPLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +SPLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/core/view/AccessibilityDelegateCompat;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z +SPLandroidx/core/view/AccessibilityDelegateCompat;->sendAccessibilityEvent(Landroid/view/View;I)V +SPLandroidx/core/view/AccessibilityDelegateCompat;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +Landroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter; +SPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->(Landroidx/core/view/AccessibilityDelegateCompat;)V +SPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider; +SPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +SPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;)V +SPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z +SPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +Landroidx/core/view/ActionProvider; +SPLandroidx/core/view/ActionProvider;->(Landroid/content/Context;)V +SPLandroidx/core/view/ActionProvider;->getContext()Landroid/content/Context; +SPLandroidx/core/view/ActionProvider;->hasSubMenu()Z +SPLandroidx/core/view/ActionProvider;->overridesItemVisibility()Z +SPLandroidx/core/view/ActionProvider;->setSubUiVisibilityListener(Landroidx/core/view/ActionProvider$SubUiVisibilityListener;)V +SPLandroidx/core/view/ActionProvider;->setVisibilityListener(Landroidx/core/view/ActionProvider$VisibilityListener;)V +Landroidx/core/view/ActionProvider$SubUiVisibilityListener; +Landroidx/core/view/ActionProvider$VisibilityListener; +Landroidx/core/view/DifferentialMotionFlingController; +SPLandroidx/core/view/DifferentialMotionFlingController;->(Landroid/content/Context;Landroidx/core/view/DifferentialMotionFlingTarget;)V +SPLandroidx/core/view/DifferentialMotionFlingController;->(Landroid/content/Context;Landroidx/core/view/DifferentialMotionFlingTarget;Landroidx/core/view/DifferentialMotionFlingController$FlingVelocityThresholdCalculator;Landroidx/core/view/DifferentialMotionFlingController$DifferentialVelocityProvider;)V +Landroidx/core/view/DifferentialMotionFlingController$$ExternalSyntheticLambda0; +SPLandroidx/core/view/DifferentialMotionFlingController$$ExternalSyntheticLambda0;->()V +Landroidx/core/view/DifferentialMotionFlingController$$ExternalSyntheticLambda1; +SPLandroidx/core/view/DifferentialMotionFlingController$$ExternalSyntheticLambda1;->()V +Landroidx/core/view/DifferentialMotionFlingController$DifferentialVelocityProvider; +Landroidx/core/view/DifferentialMotionFlingController$FlingVelocityThresholdCalculator; +Landroidx/core/view/DifferentialMotionFlingTarget; +Landroidx/core/view/DisplayShapeCompat; +Landroidx/core/view/GravityCompat; +SPLandroidx/core/view/GravityCompat;->apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;I)V +SPLandroidx/core/view/GravityCompat;->getAbsoluteGravity(II)I +Landroidx/core/view/KeyEventDispatcher$Component; +Landroidx/core/view/LayoutInflaterCompat; +SPLandroidx/core/view/LayoutInflaterCompat;->setFactory2(Landroid/view/LayoutInflater;Landroid/view/LayoutInflater$Factory2;)V +Landroidx/core/view/MenuHost; +Landroidx/core/view/MenuHostHelper; +SPLandroidx/core/view/MenuHostHelper;->(Ljava/lang/Runnable;)V +SPLandroidx/core/view/MenuHostHelper;->addMenuProvider(Landroidx/core/view/MenuProvider;)V +SPLandroidx/core/view/MenuHostHelper;->onCreateMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)V +SPLandroidx/core/view/MenuHostHelper;->onPrepareMenu(Landroid/view/Menu;)V +Landroidx/core/view/MenuItemCompat; +SPLandroidx/core/view/MenuItemCompat;->getActionProvider(Landroid/view/MenuItem;)Landroidx/core/view/ActionProvider; +SPLandroidx/core/view/MenuItemCompat;->setActionProvider(Landroid/view/MenuItem;Landroidx/core/view/ActionProvider;)Landroid/view/MenuItem; +SPLandroidx/core/view/MenuItemCompat;->setAlphabeticShortcut(Landroid/view/MenuItem;CI)V +SPLandroidx/core/view/MenuItemCompat;->setContentDescription(Landroid/view/MenuItem;Ljava/lang/CharSequence;)V +SPLandroidx/core/view/MenuItemCompat;->setNumericShortcut(Landroid/view/MenuItem;CI)V +SPLandroidx/core/view/MenuItemCompat;->setTooltipText(Landroid/view/MenuItem;Ljava/lang/CharSequence;)V +Landroidx/core/view/MenuProvider; +Landroidx/core/view/NestedScrollingChild; +Landroidx/core/view/NestedScrollingChild2; +Landroidx/core/view/NestedScrollingChild3; +Landroidx/core/view/NestedScrollingChildHelper; +SPLandroidx/core/view/NestedScrollingChildHelper;->(Landroid/view/View;)V +SPLandroidx/core/view/NestedScrollingChildHelper;->setNestedScrollingEnabled(Z)V +Landroidx/core/view/NestedScrollingParent; +Landroidx/core/view/NestedScrollingParent2; +Landroidx/core/view/NestedScrollingParent3; +Landroidx/core/view/NestedScrollingParentHelper; +SPLandroidx/core/view/NestedScrollingParentHelper;->(Landroid/view/ViewGroup;)V +Landroidx/core/view/OnApplyWindowInsetsListener; +Landroidx/core/view/OnReceiveContentListener; +Landroidx/core/view/OnReceiveContentViewBehavior; +Landroidx/core/view/ScrollingView; +Landroidx/core/view/SoftwareKeyboardControllerCompat; +SPLandroidx/core/view/SoftwareKeyboardControllerCompat;->(Landroid/view/View;)V +Landroidx/core/view/SoftwareKeyboardControllerCompat$Impl; +SPLandroidx/core/view/SoftwareKeyboardControllerCompat$Impl;->()V +Landroidx/core/view/SoftwareKeyboardControllerCompat$Impl20; +SPLandroidx/core/view/SoftwareKeyboardControllerCompat$Impl20;->(Landroid/view/View;)V +Landroidx/core/view/SoftwareKeyboardControllerCompat$Impl30; +SPLandroidx/core/view/SoftwareKeyboardControllerCompat$Impl30;->(Landroid/view/View;)V +Landroidx/core/view/TintableBackgroundView; +Landroidx/core/view/ViewCompat; +SPLandroidx/core/view/ViewCompat;->()V +SPLandroidx/core/view/ViewCompat;->accessibilityHeadingProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; +SPLandroidx/core/view/ViewCompat;->getAccessibilityDelegate(Landroid/view/View;)Landroidx/core/view/AccessibilityDelegateCompat; +SPLandroidx/core/view/ViewCompat;->getAccessibilityDelegateInternal(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate; +SPLandroidx/core/view/ViewCompat;->getAccessibilityPaneTitle(Landroid/view/View;)Ljava/lang/CharSequence; +SPLandroidx/core/view/ViewCompat;->getDisplay(Landroid/view/View;)Landroid/view/Display; +SPLandroidx/core/view/ViewCompat;->getElevation(Landroid/view/View;)F +SPLandroidx/core/view/ViewCompat;->getFitsSystemWindows(Landroid/view/View;)Z +SPLandroidx/core/view/ViewCompat;->getImportantForAccessibility(Landroid/view/View;)I +SPLandroidx/core/view/ViewCompat;->getImportantForAutofill(Landroid/view/View;)I +SPLandroidx/core/view/ViewCompat;->getLayoutDirection(Landroid/view/View;)I +SPLandroidx/core/view/ViewCompat;->getMinimumHeight(Landroid/view/View;)I +SPLandroidx/core/view/ViewCompat;->getMinimumWidth(Landroid/view/View;)I +SPLandroidx/core/view/ViewCompat;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/ViewCompat;->getStateDescription(Landroid/view/View;)Ljava/lang/CharSequence; +SPLandroidx/core/view/ViewCompat;->isAccessibilityHeading(Landroid/view/View;)Z +SPLandroidx/core/view/ViewCompat;->isScreenReaderFocusable(Landroid/view/View;)Z +SPLandroidx/core/view/ViewCompat;->offsetTopAndBottom(Landroid/view/View;I)V +SPLandroidx/core/view/ViewCompat;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/ViewCompat;->paneTitleProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; +SPLandroidx/core/view/ViewCompat;->postOnAnimation(Landroid/view/View;Ljava/lang/Runnable;)V +SPLandroidx/core/view/ViewCompat;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V +SPLandroidx/core/view/ViewCompat;->screenReaderFocusableProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; +SPLandroidx/core/view/ViewCompat;->setAccessibilityDelegate(Landroid/view/View;Landroidx/core/view/AccessibilityDelegateCompat;)V +SPLandroidx/core/view/ViewCompat;->setAccessibilityPaneTitle(Landroid/view/View;Ljava/lang/CharSequence;)V +SPLandroidx/core/view/ViewCompat;->setBackground(Landroid/view/View;Landroid/graphics/drawable/Drawable;)V +SPLandroidx/core/view/ViewCompat;->setBackgroundTintList(Landroid/view/View;Landroid/content/res/ColorStateList;)V +SPLandroidx/core/view/ViewCompat;->setElevation(Landroid/view/View;F)V +SPLandroidx/core/view/ViewCompat;->setImportantForAccessibility(Landroid/view/View;I)V +SPLandroidx/core/view/ViewCompat;->setImportantForAccessibilityIfNeeded(Landroid/view/View;)V +SPLandroidx/core/view/ViewCompat;->setImportantForAutofill(Landroid/view/View;I)V +SPLandroidx/core/view/ViewCompat;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V +SPLandroidx/core/view/ViewCompat;->setOnReceiveContentListener(Landroid/view/View;[Ljava/lang/String;Landroidx/core/view/OnReceiveContentListener;)V +SPLandroidx/core/view/ViewCompat;->setWindowInsetsAnimationCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V +SPLandroidx/core/view/ViewCompat;->stateDescriptionProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; +Landroidx/core/view/ViewCompat$$ExternalSyntheticLambda0; +SPLandroidx/core/view/ViewCompat$$ExternalSyntheticLambda0;->()V +Landroidx/core/view/ViewCompat$1; +SPLandroidx/core/view/ViewCompat$1;->(ILjava/lang/Class;I)V +SPLandroidx/core/view/ViewCompat$1;->frameworkGet(Landroid/view/View;)Ljava/lang/Boolean; +SPLandroidx/core/view/ViewCompat$1;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; +Landroidx/core/view/ViewCompat$2; +SPLandroidx/core/view/ViewCompat$2;->(ILjava/lang/Class;II)V +SPLandroidx/core/view/ViewCompat$2;->frameworkGet(Landroid/view/View;)Ljava/lang/CharSequence; +SPLandroidx/core/view/ViewCompat$2;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; +SPLandroidx/core/view/ViewCompat$2;->frameworkSet(Landroid/view/View;Ljava/lang/CharSequence;)V +SPLandroidx/core/view/ViewCompat$2;->frameworkSet(Landroid/view/View;Ljava/lang/Object;)V +Landroidx/core/view/ViewCompat$3; +SPLandroidx/core/view/ViewCompat$3;->(ILjava/lang/Class;II)V +SPLandroidx/core/view/ViewCompat$3;->frameworkGet(Landroid/view/View;)Ljava/lang/CharSequence; +SPLandroidx/core/view/ViewCompat$3;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; +Landroidx/core/view/ViewCompat$4; +SPLandroidx/core/view/ViewCompat$4;->(ILjava/lang/Class;I)V +SPLandroidx/core/view/ViewCompat$4;->frameworkGet(Landroid/view/View;)Ljava/lang/Boolean; +SPLandroidx/core/view/ViewCompat$4;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; +Landroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager; +SPLandroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager;->()V +SPLandroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager;->addAccessibilityPane(Landroid/view/View;)V +SPLandroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager;->onGlobalLayout()V +SPLandroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager;->onViewAttachedToWindow(Landroid/view/View;)V +SPLandroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager;->registerForLayoutCallback(Landroid/view/View;)V +Landroidx/core/view/ViewCompat$AccessibilityViewProperty; +SPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->(ILjava/lang/Class;I)V +SPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->(ILjava/lang/Class;II)V +SPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->frameworkAvailable()Z +SPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->get(Landroid/view/View;)Ljava/lang/Object; +SPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->set(Landroid/view/View;Ljava/lang/Object;)V +Landroidx/core/view/ViewCompat$Api21Impl; +SPLandroidx/core/view/ViewCompat$Api21Impl;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V +Landroidx/core/view/ViewCompat$Api21Impl$1; +SPLandroidx/core/view/ViewCompat$Api21Impl$1;->(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V +SPLandroidx/core/view/ViewCompat$Api21Impl$1;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; +Landroidx/core/view/ViewCompat$Api23Impl; +SPLandroidx/core/view/ViewCompat$Api23Impl;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; +Landroidx/core/view/ViewCompat$Api26Impl; +SPLandroidx/core/view/ViewCompat$Api26Impl;->getImportantForAutofill(Landroid/view/View;)I +SPLandroidx/core/view/ViewCompat$Api26Impl;->setImportantForAutofill(Landroid/view/View;I)V +Landroidx/core/view/ViewCompat$Api28Impl; +SPLandroidx/core/view/ViewCompat$Api28Impl;->getAccessibilityPaneTitle(Landroid/view/View;)Ljava/lang/CharSequence; +SPLandroidx/core/view/ViewCompat$Api28Impl;->isAccessibilityHeading(Landroid/view/View;)Z +SPLandroidx/core/view/ViewCompat$Api28Impl;->isScreenReaderFocusable(Landroid/view/View;)Z +SPLandroidx/core/view/ViewCompat$Api28Impl;->setAccessibilityPaneTitle(Landroid/view/View;Ljava/lang/CharSequence;)V +Landroidx/core/view/ViewCompat$Api29Impl; +SPLandroidx/core/view/ViewCompat$Api29Impl;->getAccessibilityDelegate(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate; +SPLandroidx/core/view/ViewCompat$Api29Impl;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V +Landroidx/core/view/ViewCompat$Api30Impl; +SPLandroidx/core/view/ViewCompat$Api30Impl;->getStateDescription(Landroid/view/View;)Ljava/lang/CharSequence; +Landroidx/core/view/ViewCompat$Api31Impl; +SPLandroidx/core/view/ViewCompat$Api31Impl;->setOnReceiveContentListener(Landroid/view/View;[Ljava/lang/String;Landroidx/core/view/OnReceiveContentListener;)V +Landroidx/core/view/ViewCompat$OnReceiveContentListenerAdapter; +SPLandroidx/core/view/ViewCompat$OnReceiveContentListenerAdapter;->(Landroidx/core/view/OnReceiveContentListener;)V +Landroidx/core/view/ViewConfigurationCompat; +SPLandroidx/core/view/ViewConfigurationCompat;->()V +SPLandroidx/core/view/ViewConfigurationCompat;->getScaledHorizontalScrollFactor(Landroid/view/ViewConfiguration;Landroid/content/Context;)F +SPLandroidx/core/view/ViewConfigurationCompat;->getScaledVerticalScrollFactor(Landroid/view/ViewConfiguration;Landroid/content/Context;)F +SPLandroidx/core/view/ViewConfigurationCompat;->shouldShowMenuShortcutsWhenKeyboardPresent(Landroid/view/ViewConfiguration;Landroid/content/Context;)Z +Landroidx/core/view/ViewConfigurationCompat$Api26Impl; +SPLandroidx/core/view/ViewConfigurationCompat$Api26Impl;->getScaledHorizontalScrollFactor(Landroid/view/ViewConfiguration;)F +SPLandroidx/core/view/ViewConfigurationCompat$Api26Impl;->getScaledVerticalScrollFactor(Landroid/view/ViewConfiguration;)F +Landroidx/core/view/ViewConfigurationCompat$Api28Impl; +SPLandroidx/core/view/ViewConfigurationCompat$Api28Impl;->shouldShowMenuShortcutsWhenKeyboardPresent(Landroid/view/ViewConfiguration;)Z +Landroidx/core/view/ViewPropertyAnimatorCompat; +Landroidx/core/view/WindowCompat; +SPLandroidx/core/view/WindowCompat;->setDecorFitsSystemWindows(Landroid/view/Window;Z)V +Landroidx/core/view/WindowCompat$Api35Impl; +SPLandroidx/core/view/WindowCompat$Api35Impl;->setDecorFitsSystemWindows(Landroid/view/Window;Z)V +Landroidx/core/view/WindowInsetsAnimationCompat; +SPLandroidx/core/view/WindowInsetsAnimationCompat;->setCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V +Landroidx/core/view/WindowInsetsAnimationCompat$Callback; +SPLandroidx/core/view/WindowInsetsAnimationCompat$Callback;->(I)V +SPLandroidx/core/view/WindowInsetsAnimationCompat$Callback;->getDispatchMode()I +Landroidx/core/view/WindowInsetsAnimationCompat$Impl; +Landroidx/core/view/WindowInsetsAnimationCompat$Impl30; +SPLandroidx/core/view/WindowInsetsAnimationCompat$Impl30;->setCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V +Landroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback; +SPLandroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback;->(Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V +Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/WindowInsetsCompat;->()V +SPLandroidx/core/view/WindowInsetsCompat;->(Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat;->(Landroidx/core/view/WindowInsetsCompat;)V +SPLandroidx/core/view/WindowInsetsCompat;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/WindowInsetsCompat;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/WindowInsetsCompat;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/WindowInsetsCompat;->getInsets(I)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/WindowInsetsCompat;->getInsetsIgnoringVisibility(I)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/WindowInsetsCompat;->getSystemGestureInsets()Landroidx/core/graphics/Insets; +SPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetBottom()I +SPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetLeft()I +SPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetRight()I +SPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetTop()I +SPLandroidx/core/view/WindowInsetsCompat;->init(Landroid/view/View;)V +SPLandroidx/core/view/WindowInsetsCompat;->isConsumed()Z +SPLandroidx/core/view/WindowInsetsCompat;->setDisplayShape(Landroidx/core/view/DisplayShapeCompat;)V +SPLandroidx/core/view/WindowInsetsCompat;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V +SPLandroidx/core/view/WindowInsetsCompat;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V +SPLandroidx/core/view/WindowInsetsCompat;->setSystemUiVisibility(I)V +SPLandroidx/core/view/WindowInsetsCompat;->setTypeBoundingRectsMap([[Landroid/graphics/Rect;)V +SPLandroidx/core/view/WindowInsetsCompat;->setTypeMaxBoundingRectsMap([[Landroid/graphics/Rect;)V +SPLandroidx/core/view/WindowInsetsCompat;->toWindowInsets()Landroid/view/WindowInsets; +SPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;)Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; +Landroidx/core/view/WindowInsetsCompat$Builder; +SPLandroidx/core/view/WindowInsetsCompat$Builder;->()V +SPLandroidx/core/view/WindowInsetsCompat$Builder;->build()Landroidx/core/view/WindowInsetsCompat; +Landroidx/core/view/WindowInsetsCompat$BuilderImpl; +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->()V +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->(Landroidx/core/view/WindowInsetsCompat;)V +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->applyInsetTypes()V +Landroidx/core/view/WindowInsetsCompat$BuilderImpl29; +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->()V +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->build()Landroidx/core/view/WindowInsetsCompat; +Landroidx/core/view/WindowInsetsCompat$BuilderImpl30; +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl30;->()V +Landroidx/core/view/WindowInsetsCompat$BuilderImpl31; +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl31;->()V +Landroidx/core/view/WindowInsetsCompat$BuilderImpl34; +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl34;->()V +Landroidx/core/view/WindowInsetsCompat$BuilderImpl35; +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl35;->()V +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl35;->initTypeBoundingRects(Landroidx/core/view/WindowInsetsCompat;)V +Landroidx/core/view/WindowInsetsCompat$Impl; +SPLandroidx/core/view/WindowInsetsCompat$Impl;->()V +SPLandroidx/core/view/WindowInsetsCompat$Impl;->(Landroidx/core/view/WindowInsetsCompat;)V +Landroidx/core/view/WindowInsetsCompat$Impl20; +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->()V +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->getSystemWindowInsets()Landroidx/core/graphics/Insets; +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setDisplayShape(Landroidx/core/view/DisplayShapeCompat;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setSystemUiVisibility(I)V +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setTypeBoundingRectsMap([[Landroid/graphics/Rect;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setTypeMaxBoundingRectsMap([[Landroid/graphics/Rect;)V +Landroidx/core/view/WindowInsetsCompat$Impl21; +SPLandroidx/core/view/WindowInsetsCompat$Impl21;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/WindowInsetsCompat$Impl21;->isConsumed()Z +Landroidx/core/view/WindowInsetsCompat$Impl28; +SPLandroidx/core/view/WindowInsetsCompat$Impl28;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl28;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; +Landroidx/core/view/WindowInsetsCompat$Impl29; +SPLandroidx/core/view/WindowInsetsCompat$Impl29;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl29;->getSystemGestureInsets()Landroidx/core/graphics/Insets; +Landroidx/core/view/WindowInsetsCompat$Impl30; +SPLandroidx/core/view/WindowInsetsCompat$Impl30;->()V +SPLandroidx/core/view/WindowInsetsCompat$Impl30;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl30;->copyRootViewBounds(Landroid/view/View;)V +Landroidx/core/view/WindowInsetsCompat$Impl31; +SPLandroidx/core/view/WindowInsetsCompat$Impl31;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +Landroidx/core/view/WindowInsetsCompat$Impl34; +SPLandroidx/core/view/WindowInsetsCompat$Impl34;->()V +SPLandroidx/core/view/WindowInsetsCompat$Impl34;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl34;->getInsets(I)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/WindowInsetsCompat$Impl34;->getInsetsIgnoringVisibility(I)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/WindowInsetsCompat$Impl34;->initDisplayShape(Landroid/view/View;)V +Landroidx/core/view/WindowInsetsCompat$Impl35; +SPLandroidx/core/view/WindowInsetsCompat$Impl35;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl35;->initTypeBoundingRectsMaps()V +Landroidx/core/view/WindowInsetsCompat$Type; +SPLandroidx/core/view/WindowInsetsCompat$Type;->displayCutout()I +SPLandroidx/core/view/WindowInsetsCompat$Type;->ime()I +SPLandroidx/core/view/WindowInsetsCompat$Type;->navigationBars()I +SPLandroidx/core/view/WindowInsetsCompat$Type;->systemBars()I +SPLandroidx/core/view/WindowInsetsCompat$Type;->tappableElement()I +Landroidx/core/view/WindowInsetsCompat$TypeImpl34; +SPLandroidx/core/view/WindowInsetsCompat$TypeImpl34;->toPlatformType(I)I +Landroidx/core/view/WindowInsetsControllerCompat; +SPLandroidx/core/view/WindowInsetsControllerCompat;->(Landroid/view/Window;Landroid/view/View;)V +SPLandroidx/core/view/WindowInsetsControllerCompat;->setAppearanceLightNavigationBars(Z)V +SPLandroidx/core/view/WindowInsetsControllerCompat;->setAppearanceLightStatusBars(Z)V +Landroidx/core/view/WindowInsetsControllerCompat$Impl; +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl;->()V +Landroidx/core/view/WindowInsetsControllerCompat$Impl30; +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->(Landroid/view/Window;Landroidx/core/view/WindowInsetsControllerCompat;Landroidx/core/view/SoftwareKeyboardControllerCompat;)V +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->(Landroid/view/WindowInsetsController;Landroidx/core/view/WindowInsetsControllerCompat;Landroidx/core/view/SoftwareKeyboardControllerCompat;)V +Landroidx/core/view/WindowInsetsControllerCompat$Impl31; +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl31;->(Landroid/view/Window;Landroidx/core/view/WindowInsetsControllerCompat;Landroidx/core/view/SoftwareKeyboardControllerCompat;)V +Landroidx/core/view/WindowInsetsControllerCompat$Impl35; +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl35;->(Landroid/view/Window;Landroidx/core/view/WindowInsetsControllerCompat;Landroidx/core/view/SoftwareKeyboardControllerCompat;)V +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl35;->setAppearanceLightNavigationBars(Z)V +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl35;->setAppearanceLightStatusBars(Z)V +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->()V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addSpansToExtras(Ljava/lang/CharSequence;Landroid/view/View;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->removeAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)Z +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClassName(Ljava/lang/CharSequence;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionInfo(Ljava/lang/Object;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionItemInfo(Ljava/lang/Object;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setFocusable(Z)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setFocused(Z)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setHeading(Z)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPaneTitle(Ljava/lang/CharSequence;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setScreenReaderFocusable(Z)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setStateDescription(Ljava/lang/CharSequence;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->unwrap()Landroid/view/accessibility/AccessibilityNodeInfo; +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->wrap(Landroid/view/accessibility/AccessibilityNodeInfo;)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat; +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->()V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(ILjava/lang/CharSequence;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(ILjava/lang/CharSequence;Ljava/lang/Class;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(Ljava/lang/Object;ILjava/lang/CharSequence;Landroidx/core/view/accessibility/AccessibilityViewCommand;Ljava/lang/Class;)V +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl; +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl;->setStateDescription(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api34Impl; +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api34Impl;->getActionScrollInDirection()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat; +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->(Ljava/lang/Object;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->obtain(IIZI)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat; +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;->(Ljava/lang/Object;)V +SPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;->obtain(IIIIZZ)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat; +Landroidx/core/view/accessibility/AccessibilityViewCommand; +Landroidx/core/view/accessibility/AccessibilityViewCommand$CommandArguments; +Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveAtGranularityArguments; +Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveHtmlArguments; +Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveWindowArguments; +Landroidx/core/view/accessibility/AccessibilityViewCommand$ScrollToPositionArguments; +Landroidx/core/view/accessibility/AccessibilityViewCommand$SetProgressArguments; +Landroidx/core/view/accessibility/AccessibilityViewCommand$SetSelectionArguments; +Landroidx/core/view/accessibility/AccessibilityViewCommand$SetTextArguments; +Landroidx/core/view/insets/ColorProtection; +SPLandroidx/core/view/insets/ColorProtection;->(I)V +SPLandroidx/core/view/insets/ColorProtection;->(II)V +SPLandroidx/core/view/insets/ColorProtection;->dispatchColorHint(I)V +SPLandroidx/core/view/insets/ColorProtection;->occupiesCorners()Z +SPLandroidx/core/view/insets/ColorProtection;->setColor(I)V +SPLandroidx/core/view/insets/ColorProtection;->setColorInner(I)V +Landroidx/core/view/insets/Protection; +SPLandroidx/core/view/insets/Protection;->()V +SPLandroidx/core/view/insets/Protection;->(I)V +SPLandroidx/core/view/insets/Protection;->dispatchInsets(Landroidx/core/graphics/Insets;Landroidx/core/graphics/Insets;Landroidx/core/graphics/Insets;)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/insets/Protection;->getAttributes()Landroidx/core/view/insets/Protection$Attributes; +SPLandroidx/core/view/insets/Protection;->getController()Ljava/lang/Object; +SPLandroidx/core/view/insets/Protection;->getSide()I +SPLandroidx/core/view/insets/Protection;->getThickness(I)I +SPLandroidx/core/view/insets/Protection;->setController(Ljava/lang/Object;)V +SPLandroidx/core/view/insets/Protection;->setSystemAlpha(F)V +SPLandroidx/core/view/insets/Protection;->setSystemInsetAmount(F)V +SPLandroidx/core/view/insets/Protection;->setSystemVisible(Z)V +SPLandroidx/core/view/insets/Protection;->updateAlpha()V +SPLandroidx/core/view/insets/Protection;->updateInsetAmount()V +SPLandroidx/core/view/insets/Protection;->updateLayout()Landroidx/core/graphics/Insets; +Landroidx/core/view/insets/Protection$Attributes; +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$fgetmHeight(Landroidx/core/view/insets/Protection$Attributes;)I +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$fgetmWidth(Landroidx/core/view/insets/Protection$Attributes;)I +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetAlpha(Landroidx/core/view/insets/Protection$Attributes;F)V +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetHeight(Landroidx/core/view/insets/Protection$Attributes;I)V +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetMargin(Landroidx/core/view/insets/Protection$Attributes;Landroidx/core/graphics/Insets;)V +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetTranslationX(Landroidx/core/view/insets/Protection$Attributes;F)V +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetTranslationY(Landroidx/core/view/insets/Protection$Attributes;F)V +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetVisible(Landroidx/core/view/insets/Protection$Attributes;Z)V +SPLandroidx/core/view/insets/Protection$Attributes;->-$$Nest$msetWidth(Landroidx/core/view/insets/Protection$Attributes;I)V +SPLandroidx/core/view/insets/Protection$Attributes;->()V +SPLandroidx/core/view/insets/Protection$Attributes;->getAlpha()F +SPLandroidx/core/view/insets/Protection$Attributes;->getDrawable()Landroid/graphics/drawable/Drawable; +SPLandroidx/core/view/insets/Protection$Attributes;->getHeight()I +SPLandroidx/core/view/insets/Protection$Attributes;->getMargin()Landroidx/core/graphics/Insets; +SPLandroidx/core/view/insets/Protection$Attributes;->getTranslationX()F +SPLandroidx/core/view/insets/Protection$Attributes;->getTranslationY()F +SPLandroidx/core/view/insets/Protection$Attributes;->getWidth()I +SPLandroidx/core/view/insets/Protection$Attributes;->isVisible()Z +SPLandroidx/core/view/insets/Protection$Attributes;->setAlpha(F)V +SPLandroidx/core/view/insets/Protection$Attributes;->setCallback(Landroidx/core/view/insets/Protection$Attributes$Callback;)V +SPLandroidx/core/view/insets/Protection$Attributes;->setHeight(I)V +SPLandroidx/core/view/insets/Protection$Attributes;->setMargin(Landroidx/core/graphics/Insets;)V +SPLandroidx/core/view/insets/Protection$Attributes;->setTranslationX(F)V +SPLandroidx/core/view/insets/Protection$Attributes;->setTranslationY(F)V +SPLandroidx/core/view/insets/Protection$Attributes;->setVisible(Z)V +SPLandroidx/core/view/insets/Protection$Attributes;->setWidth(I)V +Landroidx/core/view/insets/Protection$Attributes$Callback; +Landroidx/core/view/insets/ProtectionGroup; +SPLandroidx/core/view/insets/ProtectionGroup;->(Landroidx/core/view/insets/SystemBarStateMonitor;Ljava/util/List;)V +SPLandroidx/core/view/insets/ProtectionGroup;->addProtections(Ljava/util/List;Z)V +SPLandroidx/core/view/insets/ProtectionGroup;->getProtection(I)Landroidx/core/view/insets/Protection; +SPLandroidx/core/view/insets/ProtectionGroup;->onColorHintChanged(I)V +SPLandroidx/core/view/insets/ProtectionGroup;->onInsetsChanged(Landroidx/core/graphics/Insets;Landroidx/core/graphics/Insets;)V +SPLandroidx/core/view/insets/ProtectionGroup;->size()I +SPLandroidx/core/view/insets/ProtectionGroup;->updateInsets()V +Landroidx/core/view/insets/ProtectionLayout; +SPLandroidx/core/view/insets/ProtectionLayout;->()V +SPLandroidx/core/view/insets/ProtectionLayout;->(Landroid/content/Context;Ljava/util/List;)V +SPLandroidx/core/view/insets/ProtectionLayout;->addProtectionView(Landroid/content/Context;ILandroidx/core/view/insets/Protection;)V +SPLandroidx/core/view/insets/ProtectionLayout;->addProtectionViews()V +SPLandroidx/core/view/insets/ProtectionLayout;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V +SPLandroidx/core/view/insets/ProtectionLayout;->getOrInstallSystemBarStateMonitor()Landroidx/core/view/insets/SystemBarStateMonitor; +SPLandroidx/core/view/insets/ProtectionLayout;->onAttachedToWindow()V +SPLandroidx/core/view/insets/ProtectionLayout;->removeProtectionViews()V +SPLandroidx/core/view/insets/ProtectionLayout;->setProtections(Ljava/util/List;)V +Landroidx/core/view/insets/ProtectionLayout$1; +SPLandroidx/core/view/insets/ProtectionLayout$1;->(Landroidx/core/view/insets/ProtectionLayout;Landroid/widget/FrameLayout$LayoutParams;Landroid/view/View;)V +SPLandroidx/core/view/insets/ProtectionLayout$1;->onAlphaChanged(F)V +SPLandroidx/core/view/insets/ProtectionLayout$1;->onHeightChanged(I)V +SPLandroidx/core/view/insets/ProtectionLayout$1;->onVisibilityChanged(Z)V +Landroidx/core/view/insets/SystemBarStateMonitor; +SPLandroidx/core/view/insets/SystemBarStateMonitor;->(Landroid/view/ViewGroup;)V +SPLandroidx/core/view/insets/SystemBarStateMonitor;->addCallback(Landroidx/core/view/insets/SystemBarStateMonitor$Callback;)V +SPLandroidx/core/view/insets/SystemBarStateMonitor;->addViewWhenReady(Landroid/view/ViewGroup;Landroid/view/View;I)V +SPLandroidx/core/view/insets/SystemBarStateMonitor;->getInsets(Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/insets/SystemBarStateMonitor;->getInsetsIgnoringVisibility(Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/insets/SystemBarStateMonitor;->lambda$new$0$androidx-core-view-insets-SystemBarStateMonitor(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +Landroidx/core/view/insets/SystemBarStateMonitor$$ExternalSyntheticLambda0; +SPLandroidx/core/view/insets/SystemBarStateMonitor$$ExternalSyntheticLambda0;->(Landroidx/core/view/insets/SystemBarStateMonitor;)V +SPLandroidx/core/view/insets/SystemBarStateMonitor$$ExternalSyntheticLambda0;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +Landroidx/core/view/insets/SystemBarStateMonitor$1; +SPLandroidx/core/view/insets/SystemBarStateMonitor$1;->(Landroidx/core/view/insets/SystemBarStateMonitor;Landroid/content/Context;Landroid/view/ViewGroup;)V +Landroidx/core/view/insets/SystemBarStateMonitor$2; +SPLandroidx/core/view/insets/SystemBarStateMonitor$2;->(Landroidx/core/view/insets/SystemBarStateMonitor;I)V +Landroidx/core/view/insets/SystemBarStateMonitor$Callback; +Landroidx/core/widget/AutoSizeableTextView; +Landroidx/core/widget/CheckedTextViewCompat; +SPLandroidx/core/widget/CheckedTextViewCompat;->getCheckMarkDrawable(Landroid/widget/CheckedTextView;)Landroid/graphics/drawable/Drawable; +Landroidx/core/widget/TextViewCompat; +SPLandroidx/core/widget/TextViewCompat;->setLineHeight(Landroid/widget/TextView;I)V +SPLandroidx/core/widget/TextViewCompat;->setTextAppearance(Landroid/widget/TextView;I)V +Landroidx/core/widget/TintableCheckedTextView; +Landroidx/core/widget/TintableCompoundDrawablesView; +Landroidx/core/widget/TintableImageSourceView; +Landroidx/customview/poolingcontainer/PoolingContainer; +SPLandroidx/customview/poolingcontainer/PoolingContainer;->()V +SPLandroidx/customview/poolingcontainer/PoolingContainer;->setPoolingContainer(Landroid/view/View;Z)V +Landroidx/customview/poolingcontainer/R$id; +Landroidx/customview/widget/Openable; +Landroidx/customview/widget/ViewDragHelper; +SPLandroidx/customview/widget/ViewDragHelper;->()V +SPLandroidx/customview/widget/ViewDragHelper;->(Landroid/content/Context;Landroid/view/ViewGroup;Landroidx/customview/widget/ViewDragHelper$Callback;)V +SPLandroidx/customview/widget/ViewDragHelper;->continueSettling(Z)Z +SPLandroidx/customview/widget/ViewDragHelper;->create(Landroid/view/ViewGroup;FLandroidx/customview/widget/ViewDragHelper$Callback;)Landroidx/customview/widget/ViewDragHelper; +SPLandroidx/customview/widget/ViewDragHelper;->create(Landroid/view/ViewGroup;Landroidx/customview/widget/ViewDragHelper$Callback;)Landroidx/customview/widget/ViewDragHelper; +SPLandroidx/customview/widget/ViewDragHelper;->getDefaultEdgeSize()I +SPLandroidx/customview/widget/ViewDragHelper;->requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object; +SPLandroidx/customview/widget/ViewDragHelper;->setEdgeSize(I)V +SPLandroidx/customview/widget/ViewDragHelper;->setEdgeTrackingEnabled(I)V +SPLandroidx/customview/widget/ViewDragHelper;->setMinVelocity(F)V +Landroidx/customview/widget/ViewDragHelper$1; +SPLandroidx/customview/widget/ViewDragHelper$1;->()V +Landroidx/customview/widget/ViewDragHelper$2; +SPLandroidx/customview/widget/ViewDragHelper$2;->(Landroidx/customview/widget/ViewDragHelper;)V +Landroidx/customview/widget/ViewDragHelper$3; +SPLandroidx/customview/widget/ViewDragHelper$3;->(Landroidx/customview/widget/ViewDragHelper;)V +Landroidx/customview/widget/ViewDragHelper$Callback; +SPLandroidx/customview/widget/ViewDragHelper$Callback;->()V +Landroidx/draganddrop/DropAffordanceHighlighter; +SPLandroidx/draganddrop/DropAffordanceHighlighter;->(Landroid/view/View;Landroidx/core/util/Predicate;ZII)V +SPLandroidx/draganddrop/DropAffordanceHighlighter;->colorWithOpacity(IF)I +SPLandroidx/draganddrop/DropAffordanceHighlighter;->dpToPx(Landroid/content/Context;I)I +SPLandroidx/draganddrop/DropAffordanceHighlighter;->forView(Landroid/view/View;Landroidx/core/util/Predicate;)Landroidx/draganddrop/DropAffordanceHighlighter$Builder; +SPLandroidx/draganddrop/DropAffordanceHighlighter;->makeDrawable(Landroid/content/Context;III)Landroid/graphics/drawable/GradientDrawable; +Landroidx/draganddrop/DropAffordanceHighlighter$Builder; +SPLandroidx/draganddrop/DropAffordanceHighlighter$Builder;->(Landroid/view/View;Landroidx/core/util/Predicate;)V +SPLandroidx/draganddrop/DropAffordanceHighlighter$Builder;->build()Landroidx/draganddrop/DropAffordanceHighlighter; +SPLandroidx/draganddrop/DropAffordanceHighlighter$Builder;->getHighlightColor()I +SPLandroidx/draganddrop/DropAffordanceHighlighter$Builder;->setHighlightColor(I)Landroidx/draganddrop/DropAffordanceHighlighter$Builder; +SPLandroidx/draganddrop/DropAffordanceHighlighter$Builder;->setHighlightCornerRadiusPx(I)Landroidx/draganddrop/DropAffordanceHighlighter$Builder; +SPLandroidx/draganddrop/DropAffordanceHighlighter$Builder;->shouldAcceptDragsWithLocalState(Z)Landroidx/draganddrop/DropAffordanceHighlighter$Builder; +Landroidx/draganddrop/DropHelper; +SPLandroidx/draganddrop/DropHelper;->configureView(Landroid/app/Activity;Landroid/view/View;[Ljava/lang/String;Landroidx/draganddrop/DropHelper$Options;Landroidx/core/view/OnReceiveContentListener;)V +SPLandroidx/draganddrop/DropHelper;->setHighlightingAndHandling(Landroid/view/View;[Ljava/lang/String;Landroidx/draganddrop/DropAffordanceHighlighter;Landroidx/core/view/OnReceiveContentListener;Landroid/app/Activity;)V +Landroidx/draganddrop/DropHelper$$ExternalSyntheticLambda0; +SPLandroidx/draganddrop/DropHelper$$ExternalSyntheticLambda0;->([Ljava/lang/String;)V +Landroidx/draganddrop/DropHelper$$ExternalSyntheticLambda2; +SPLandroidx/draganddrop/DropHelper$$ExternalSyntheticLambda2;->(Landroidx/draganddrop/DropAffordanceHighlighter;)V +Landroidx/draganddrop/DropHelper$CouldNotObtainPermissionsException; +Landroidx/draganddrop/DropHelper$Options; +SPLandroidx/draganddrop/DropHelper$Options;->(IZIZZLjava/util/List;)V +SPLandroidx/draganddrop/DropHelper$Options;->getHighlightColor()I +SPLandroidx/draganddrop/DropHelper$Options;->getHighlightCornerRadiusPx()I +SPLandroidx/draganddrop/DropHelper$Options;->getInnerEditTexts()Ljava/util/List; +SPLandroidx/draganddrop/DropHelper$Options;->hasHighlightColor()Z +SPLandroidx/draganddrop/DropHelper$Options;->hasHighlightCornerRadiusPx()Z +SPLandroidx/draganddrop/DropHelper$Options;->shouldAcceptDragsWithLocalState()Z +Landroidx/draganddrop/DropHelper$Options$Builder; +SPLandroidx/draganddrop/DropHelper$Options$Builder;->()V +SPLandroidx/draganddrop/DropHelper$Options$Builder;->build()Landroidx/draganddrop/DropHelper$Options; +SPLandroidx/draganddrop/DropHelper$Options$Builder;->setHighlightColor(I)Landroidx/draganddrop/DropHelper$Options$Builder; +SPLandroidx/draganddrop/DropHelper$Options$Builder;->setHighlightCornerRadiusPx(I)Landroidx/draganddrop/DropHelper$Options$Builder; +Landroidx/drawerlayout/R$attr; +Landroidx/drawerlayout/R$styleable; +SPLandroidx/drawerlayout/R$styleable;->()V +Landroidx/drawerlayout/widget/ClosableDrawerLayout; +SPLandroidx/drawerlayout/widget/ClosableDrawerLayout;->()V +SPLandroidx/drawerlayout/widget/ClosableDrawerLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/drawerlayout/widget/ClosableDrawerLayout;->setAnimationEnabled(Z)V +Landroidx/drawerlayout/widget/DrawerLayout; +SPLandroidx/drawerlayout/widget/DrawerLayout;->()V +SPLandroidx/drawerlayout/widget/DrawerLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/drawerlayout/widget/DrawerLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/drawerlayout/widget/DrawerLayout;->addDrawerListener(Landroidx/drawerlayout/widget/DrawerLayout$DrawerListener;)V +SPLandroidx/drawerlayout/widget/DrawerLayout;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V +SPLandroidx/drawerlayout/widget/DrawerLayout;->checkDrawerViewAbsoluteGravity(Landroid/view/View;I)Z +SPLandroidx/drawerlayout/widget/DrawerLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z +SPLandroidx/drawerlayout/widget/DrawerLayout;->computeScroll()V +SPLandroidx/drawerlayout/widget/DrawerLayout;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z +SPLandroidx/drawerlayout/widget/DrawerLayout;->findDrawerWithGravity(I)Landroid/view/View; +SPLandroidx/drawerlayout/widget/DrawerLayout;->findOpenDrawer()Landroid/view/View; +SPLandroidx/drawerlayout/widget/DrawerLayout;->generateDefaultLayoutParams()Landroid/view/ViewGroup$LayoutParams; +SPLandroidx/drawerlayout/widget/DrawerLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; +SPLandroidx/drawerlayout/widget/DrawerLayout;->getDrawerViewAbsoluteGravity(Landroid/view/View;)I +SPLandroidx/drawerlayout/widget/DrawerLayout;->isContentView(Landroid/view/View;)Z +SPLandroidx/drawerlayout/widget/DrawerLayout;->isDrawerOpen(I)Z +SPLandroidx/drawerlayout/widget/DrawerLayout;->isDrawerOpen(Landroid/view/View;)Z +SPLandroidx/drawerlayout/widget/DrawerLayout;->isDrawerView(Landroid/view/View;)Z +SPLandroidx/drawerlayout/widget/DrawerLayout;->onAttachedToWindow()V +SPLandroidx/drawerlayout/widget/DrawerLayout;->onLayout(ZIIII)V +SPLandroidx/drawerlayout/widget/DrawerLayout;->onMeasure(II)V +SPLandroidx/drawerlayout/widget/DrawerLayout;->onRtlPropertiesChanged(I)V +SPLandroidx/drawerlayout/widget/DrawerLayout;->removeDrawerListener(Landroidx/drawerlayout/widget/DrawerLayout$DrawerListener;)V +SPLandroidx/drawerlayout/widget/DrawerLayout;->requestLayout()V +SPLandroidx/drawerlayout/widget/DrawerLayout;->resolveShadowDrawables()V +SPLandroidx/drawerlayout/widget/DrawerLayout;->setStatusBarBackgroundColor(I)V +Landroidx/drawerlayout/widget/DrawerLayout$1; +SPLandroidx/drawerlayout/widget/DrawerLayout$1;->(Landroidx/drawerlayout/widget/DrawerLayout;)V +Landroidx/drawerlayout/widget/DrawerLayout$AccessibilityDelegate; +SPLandroidx/drawerlayout/widget/DrawerLayout$AccessibilityDelegate;->(Landroidx/drawerlayout/widget/DrawerLayout;)V +SPLandroidx/drawerlayout/widget/DrawerLayout$AccessibilityDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/drawerlayout/widget/DrawerLayout$AccessibilityDelegate;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z +Landroidx/drawerlayout/widget/DrawerLayout$ChildAccessibilityDelegate; +SPLandroidx/drawerlayout/widget/DrawerLayout$ChildAccessibilityDelegate;->()V +Landroidx/drawerlayout/widget/DrawerLayout$DrawerListener; +Landroidx/drawerlayout/widget/DrawerLayout$LayoutParams; +SPLandroidx/drawerlayout/widget/DrawerLayout$LayoutParams;->(II)V +SPLandroidx/drawerlayout/widget/DrawerLayout$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +Landroidx/drawerlayout/widget/DrawerLayout$SimpleDrawerListener; +SPLandroidx/drawerlayout/widget/DrawerLayout$SimpleDrawerListener;->()V +Landroidx/drawerlayout/widget/DrawerLayout$ViewDragCallback; +SPLandroidx/drawerlayout/widget/DrawerLayout$ViewDragCallback;->(Landroidx/drawerlayout/widget/DrawerLayout;I)V +SPLandroidx/drawerlayout/widget/DrawerLayout$ViewDragCallback;->setDragger(Landroidx/customview/widget/ViewDragHelper;)V +Landroidx/drawerlayout/widget/DrawerLayout$ViewDragCallback$1; +SPLandroidx/drawerlayout/widget/DrawerLayout$ViewDragCallback$1;->(Landroidx/drawerlayout/widget/DrawerLayout$ViewDragCallback;)V +Landroidx/dynamicanimation/animation/AnimationHandler; +SPLandroidx/dynamicanimation/animation/AnimationHandler;->()V +SPLandroidx/dynamicanimation/animation/AnimationHandler;->(Landroidx/dynamicanimation/animation/FrameCallbackScheduler;)V +SPLandroidx/dynamicanimation/animation/AnimationHandler;->getInstance()Landroidx/dynamicanimation/animation/AnimationHandler; +SPLandroidx/dynamicanimation/animation/AnimationHandler;->isCurrentThread()Z +Landroidx/dynamicanimation/animation/AnimationHandler$$ExternalSyntheticLambda1; +SPLandroidx/dynamicanimation/animation/AnimationHandler$$ExternalSyntheticLambda1;->(Landroidx/dynamicanimation/animation/AnimationHandler;)V +Landroidx/dynamicanimation/animation/AnimationHandler$AnimationCallbackDispatcher; +SPLandroidx/dynamicanimation/animation/AnimationHandler$AnimationCallbackDispatcher;->(Landroidx/dynamicanimation/animation/AnimationHandler;)V +SPLandroidx/dynamicanimation/animation/AnimationHandler$AnimationCallbackDispatcher;->(Landroidx/dynamicanimation/animation/AnimationHandler;Landroidx/dynamicanimation/animation/AnimationHandler$1;)V +Landroidx/dynamicanimation/animation/AnimationHandler$AnimationFrameCallback; +Landroidx/dynamicanimation/animation/AnimationHandler$FrameCallbackScheduler16; +SPLandroidx/dynamicanimation/animation/AnimationHandler$FrameCallbackScheduler16;->()V +SPLandroidx/dynamicanimation/animation/AnimationHandler$FrameCallbackScheduler16;->isCurrentThread()Z +Landroidx/dynamicanimation/animation/DynamicAnimation; +SPLandroidx/dynamicanimation/animation/DynamicAnimation;->()V +SPLandroidx/dynamicanimation/animation/DynamicAnimation;->(Ljava/lang/Object;Landroidx/dynamicanimation/animation/FloatPropertyCompat;)V +SPLandroidx/dynamicanimation/animation/DynamicAnimation;->getAnimationHandler()Landroidx/dynamicanimation/animation/AnimationHandler; +Landroidx/dynamicanimation/animation/DynamicAnimation$1; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$1;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$10; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$10;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$11; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$11;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$12; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$12;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$13; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$13;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$14; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$14;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$2; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$2;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$3; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$3;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$4; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$4;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$5; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$5;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$6; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$6;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$7; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$7;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$8; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$8;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$9; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$9;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/DynamicAnimation$MassState; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$MassState;->()V +Landroidx/dynamicanimation/animation/DynamicAnimation$OnAnimationEndListener; +Landroidx/dynamicanimation/animation/DynamicAnimation$ViewProperty; +SPLandroidx/dynamicanimation/animation/DynamicAnimation$ViewProperty;->(Ljava/lang/String;)V +SPLandroidx/dynamicanimation/animation/DynamicAnimation$ViewProperty;->(Ljava/lang/String;Landroidx/dynamicanimation/animation/DynamicAnimation$1;)V +Landroidx/dynamicanimation/animation/FloatPropertyCompat; +SPLandroidx/dynamicanimation/animation/FloatPropertyCompat;->(Ljava/lang/String;)V +Landroidx/dynamicanimation/animation/Force; +Landroidx/dynamicanimation/animation/FrameCallbackScheduler; +Landroidx/dynamicanimation/animation/SpringAnimation; +SPLandroidx/dynamicanimation/animation/SpringAnimation;->(Ljava/lang/Object;Landroidx/dynamicanimation/animation/FloatPropertyCompat;)V +SPLandroidx/dynamicanimation/animation/SpringAnimation;->canSkipToEnd()Z +SPLandroidx/dynamicanimation/animation/SpringAnimation;->getSpring()Landroidx/dynamicanimation/animation/SpringForce; +SPLandroidx/dynamicanimation/animation/SpringAnimation;->setSpring(Landroidx/dynamicanimation/animation/SpringForce;)Landroidx/dynamicanimation/animation/SpringAnimation; +SPLandroidx/dynamicanimation/animation/SpringAnimation;->skipToEnd()V +Landroidx/dynamicanimation/animation/SpringForce; +SPLandroidx/dynamicanimation/animation/SpringForce;->()V +SPLandroidx/dynamicanimation/animation/SpringForce;->setDampingRatio(F)Landroidx/dynamicanimation/animation/SpringForce; +SPLandroidx/dynamicanimation/animation/SpringForce;->setStiffness(F)Landroidx/dynamicanimation/animation/SpringForce; +Landroidx/emoji2/text/ConcurrencyHelpers; +SPLandroidx/emoji2/text/ConcurrencyHelpers;->createBackgroundPriorityExecutor(Ljava/lang/String;)Ljava/util/concurrent/ThreadPoolExecutor; +SPLandroidx/emoji2/text/ConcurrencyHelpers;->lambda$createBackgroundPriorityExecutor$0(Ljava/lang/String;Ljava/lang/Runnable;)Ljava/lang/Thread; +SPLandroidx/emoji2/text/ConcurrencyHelpers;->mainHandlerAsync()Landroid/os/Handler; +Landroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0; +SPLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;->(Ljava/lang/String;)V +SPLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; +Landroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl; +SPLandroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; +Landroidx/emoji2/text/DefaultEmojiCompatConfig; +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig;->create(Landroid/content/Context;)Landroidx/emoji2/text/FontRequestEmojiCompatConfig; +Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory; +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->(Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper;)V +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->configOrNull(Landroid/content/Context;Landroidx/core/provider/FontRequest;)Landroidx/emoji2/text/EmojiCompat$Config; +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->convertToByteArray([Landroid/content/pm/Signature;)Ljava/util/List; +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->create(Landroid/content/Context;)Landroidx/emoji2/text/EmojiCompat$Config; +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->generateFontRequestFrom(Landroid/content/pm/ProviderInfo;Landroid/content/pm/PackageManager;)Landroidx/core/provider/FontRequest; +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->getHelperForApi()Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper; +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->hasFlagSystem(Landroid/content/pm/ProviderInfo;)Z +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->queryDefaultInstalledContentProvider(Landroid/content/pm/PackageManager;)Landroid/content/pm/ProviderInfo; +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->queryForDefaultFontRequest(Landroid/content/Context;)Landroidx/core/provider/FontRequest; +Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper; +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper;->()V +Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API19; +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API19;->()V +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API19;->getProviderInfo(Landroid/content/pm/ResolveInfo;)Landroid/content/pm/ProviderInfo; +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API19;->queryIntentContentProviders(Landroid/content/pm/PackageManager;Landroid/content/Intent;I)Ljava/util/List; +Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API28; +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API28;->()V +SPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API28;->getSigningSignatures(Landroid/content/pm/PackageManager;Ljava/lang/String;)[Landroid/content/pm/Signature; +Landroidx/emoji2/text/DefaultGlyphChecker; +SPLandroidx/emoji2/text/DefaultGlyphChecker;->()V +SPLandroidx/emoji2/text/DefaultGlyphChecker;->()V +Landroidx/emoji2/text/EmojiCompat; +SPLandroidx/emoji2/text/EmojiCompat;->()V +SPLandroidx/emoji2/text/EmojiCompat;->(Landroidx/emoji2/text/EmojiCompat$Config;)V +SPLandroidx/emoji2/text/EmojiCompat;->access$000(Landroidx/emoji2/text/EmojiCompat;)Landroidx/emoji2/text/EmojiCompat$SpanFactory; +SPLandroidx/emoji2/text/EmojiCompat;->access$100(Landroidx/emoji2/text/EmojiCompat;)Landroidx/emoji2/text/EmojiCompat$GlyphChecker; +SPLandroidx/emoji2/text/EmojiCompat;->get()Landroidx/emoji2/text/EmojiCompat; +SPLandroidx/emoji2/text/EmojiCompat;->getLoadState()I +SPLandroidx/emoji2/text/EmojiCompat;->init(Landroidx/emoji2/text/EmojiCompat$Config;)Landroidx/emoji2/text/EmojiCompat; +SPLandroidx/emoji2/text/EmojiCompat;->isConfigured()Z +SPLandroidx/emoji2/text/EmojiCompat;->isInitialized()Z +SPLandroidx/emoji2/text/EmojiCompat;->load()V +SPLandroidx/emoji2/text/EmojiCompat;->loadMetadata()V +SPLandroidx/emoji2/text/EmojiCompat;->onMetadataLoadSuccess()V +SPLandroidx/emoji2/text/EmojiCompat;->process(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +SPLandroidx/emoji2/text/EmojiCompat;->process(Ljava/lang/CharSequence;II)Ljava/lang/CharSequence; +SPLandroidx/emoji2/text/EmojiCompat;->process(Ljava/lang/CharSequence;III)Ljava/lang/CharSequence; +SPLandroidx/emoji2/text/EmojiCompat;->process(Ljava/lang/CharSequence;IIII)Ljava/lang/CharSequence; +SPLandroidx/emoji2/text/EmojiCompat;->registerInitCallback(Landroidx/emoji2/text/EmojiCompat$InitCallback;)V +Landroidx/emoji2/text/EmojiCompat$CompatInternal; +SPLandroidx/emoji2/text/EmojiCompat$CompatInternal;->(Landroidx/emoji2/text/EmojiCompat;)V +Landroidx/emoji2/text/EmojiCompat$CompatInternal19; +SPLandroidx/emoji2/text/EmojiCompat$CompatInternal19;->(Landroidx/emoji2/text/EmojiCompat;)V +SPLandroidx/emoji2/text/EmojiCompat$CompatInternal19;->loadMetadata()V +SPLandroidx/emoji2/text/EmojiCompat$CompatInternal19;->onMetadataLoadSuccess(Landroidx/emoji2/text/MetadataRepo;)V +SPLandroidx/emoji2/text/EmojiCompat$CompatInternal19;->process(Ljava/lang/CharSequence;IIIZ)Ljava/lang/CharSequence; +Landroidx/emoji2/text/EmojiCompat$CompatInternal19$1; +SPLandroidx/emoji2/text/EmojiCompat$CompatInternal19$1;->(Landroidx/emoji2/text/EmojiCompat$CompatInternal19;)V +SPLandroidx/emoji2/text/EmojiCompat$CompatInternal19$1;->onLoaded(Landroidx/emoji2/text/MetadataRepo;)V +Landroidx/emoji2/text/EmojiCompat$Config; +SPLandroidx/emoji2/text/EmojiCompat$Config;->(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoader;)V +SPLandroidx/emoji2/text/EmojiCompat$Config;->getMetadataRepoLoader()Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoader; +SPLandroidx/emoji2/text/EmojiCompat$Config;->setMetadataLoadStrategy(I)Landroidx/emoji2/text/EmojiCompat$Config; +Landroidx/emoji2/text/EmojiCompat$DefaultSpanFactory; +SPLandroidx/emoji2/text/EmojiCompat$DefaultSpanFactory;->()V +Landroidx/emoji2/text/EmojiCompat$GlyphChecker; +Landroidx/emoji2/text/EmojiCompat$InitCallback; +SPLandroidx/emoji2/text/EmojiCompat$InitCallback;->()V +SPLandroidx/emoji2/text/EmojiCompat$InitCallback;->onInitialized()V +Landroidx/emoji2/text/EmojiCompat$ListenerDispatcher; +SPLandroidx/emoji2/text/EmojiCompat$ListenerDispatcher;->(Ljava/util/Collection;I)V +SPLandroidx/emoji2/text/EmojiCompat$ListenerDispatcher;->(Ljava/util/Collection;ILjava/lang/Throwable;)V +SPLandroidx/emoji2/text/EmojiCompat$ListenerDispatcher;->run()V +Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoader; +Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback; +SPLandroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;->()V +Landroidx/emoji2/text/EmojiCompat$SpanFactory; +Landroidx/emoji2/text/EmojiCompatInitializer; +SPLandroidx/emoji2/text/EmojiCompatInitializer;->()V +SPLandroidx/emoji2/text/EmojiCompatInitializer;->create(Landroid/content/Context;)Ljava/lang/Boolean; +SPLandroidx/emoji2/text/EmojiCompatInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; +SPLandroidx/emoji2/text/EmojiCompatInitializer;->delayUntilFirstResume(Landroid/content/Context;)V +SPLandroidx/emoji2/text/EmojiCompatInitializer;->dependencies()Ljava/util/List; +SPLandroidx/emoji2/text/EmojiCompatInitializer;->loadEmojiCompatAfterDelay()V +Landroidx/emoji2/text/EmojiCompatInitializer$1; +SPLandroidx/emoji2/text/EmojiCompatInitializer$1;->(Landroidx/emoji2/text/EmojiCompatInitializer;Landroidx/lifecycle/Lifecycle;)V +SPLandroidx/emoji2/text/EmojiCompatInitializer$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultConfig; +SPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultConfig;->(Landroid/content/Context;)V +Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader; +SPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;->(Landroid/content/Context;)V +SPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;->doLoad(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;Ljava/util/concurrent/ThreadPoolExecutor;)V +SPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;->lambda$load$0$androidx-emoji2-text-EmojiCompatInitializer$BackgroundDefaultLoader(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;Ljava/util/concurrent/ThreadPoolExecutor;)V +SPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;->load(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;)V +Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0; +SPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;->(Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;Ljava/util/concurrent/ThreadPoolExecutor;)V +SPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;->run()V +Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$1; +SPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$1;->(Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;Ljava/util/concurrent/ThreadPoolExecutor;)V +SPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$1;->onLoaded(Landroidx/emoji2/text/MetadataRepo;)V +Landroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable; +SPLandroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable;->()V +SPLandroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable;->run()V +Landroidx/emoji2/text/EmojiExclusions; +SPLandroidx/emoji2/text/EmojiExclusions;->getEmojiExclusions()Ljava/util/Set; +Landroidx/emoji2/text/EmojiExclusions$EmojiExclusions_Api34; +SPLandroidx/emoji2/text/EmojiExclusions$EmojiExclusions_Api34;->getExclusions()Ljava/util/Set; +Landroidx/emoji2/text/EmojiExclusions$EmojiExclusions_Reflections; +SPLandroidx/emoji2/text/EmojiExclusions$EmojiExclusions_Reflections;->getExclusions()Ljava/util/Set; +Landroidx/emoji2/text/EmojiProcessor; +SPLandroidx/emoji2/text/EmojiProcessor;->(Landroidx/emoji2/text/MetadataRepo;Landroidx/emoji2/text/EmojiCompat$SpanFactory;Landroidx/emoji2/text/EmojiCompat$GlyphChecker;Z[ILjava/util/Set;)V +SPLandroidx/emoji2/text/EmojiProcessor;->initExclusions(Ljava/util/Set;)V +SPLandroidx/emoji2/text/EmojiProcessor;->process(Ljava/lang/CharSequence;IIIZ)Ljava/lang/CharSequence; +SPLandroidx/emoji2/text/EmojiProcessor;->process(Ljava/lang/CharSequence;IIIZLandroidx/emoji2/text/EmojiProcessor$EmojiProcessCallback;)Ljava/lang/Object; +Landroidx/emoji2/text/EmojiProcessor$EmojiProcessAddSpanCallback; +SPLandroidx/emoji2/text/EmojiProcessor$EmojiProcessAddSpanCallback;->(Landroidx/emoji2/text/UnprecomputeTextOnModificationSpannable;Landroidx/emoji2/text/EmojiCompat$SpanFactory;)V +SPLandroidx/emoji2/text/EmojiProcessor$EmojiProcessAddSpanCallback;->getResult()Landroidx/emoji2/text/UnprecomputeTextOnModificationSpannable; +SPLandroidx/emoji2/text/EmojiProcessor$EmojiProcessAddSpanCallback;->getResult()Ljava/lang/Object; +Landroidx/emoji2/text/EmojiProcessor$EmojiProcessCallback; +Landroidx/emoji2/text/EmojiProcessor$ProcessorSm; +SPLandroidx/emoji2/text/EmojiProcessor$ProcessorSm;->(Landroidx/emoji2/text/MetadataRepo$Node;Z[I)V +SPLandroidx/emoji2/text/EmojiProcessor$ProcessorSm;->check(I)I +SPLandroidx/emoji2/text/EmojiProcessor$ProcessorSm;->isEmojiStyle(I)Z +SPLandroidx/emoji2/text/EmojiProcessor$ProcessorSm;->isInFlushableState()Z +SPLandroidx/emoji2/text/EmojiProcessor$ProcessorSm;->isTextStyle(I)Z +SPLandroidx/emoji2/text/EmojiProcessor$ProcessorSm;->reset()I +SPLandroidx/emoji2/text/EmojiProcessor$ProcessorSm;->shouldUseEmojiPresentationStyleForSingleCodepoint()Z +Landroidx/emoji2/text/FontRequestEmojiCompatConfig; +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig;->()V +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig;->(Landroid/content/Context;Landroidx/core/provider/FontRequest;)V +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig;->setLoadingExecutor(Ljava/util/concurrent/Executor;)Landroidx/emoji2/text/FontRequestEmojiCompatConfig; +Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontProviderHelper; +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontProviderHelper;->()V +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontProviderHelper;->buildTypeface(Landroid/content/Context;Landroidx/core/provider/FontsContractCompat$FontInfo;)Landroid/graphics/Typeface; +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontProviderHelper;->fetchFonts(Landroid/content/Context;Landroidx/core/provider/FontRequest;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult; +Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader; +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->(Landroid/content/Context;Landroidx/core/provider/FontRequest;Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontProviderHelper;)V +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->cleanUp()V +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->createMetadata()V +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->load(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;)V +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->loadInternal()V +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->retrieveFontInfo()Landroidx/core/provider/FontsContractCompat$FontInfo; +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->setExecutor(Ljava/util/concurrent/Executor;)V +Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$$ExternalSyntheticLambda0; +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$$ExternalSyntheticLambda0;->(Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;)V +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$$ExternalSyntheticLambda0;->run()V +Landroidx/emoji2/text/MetadataListReader; +SPLandroidx/emoji2/text/MetadataListReader;->findOffsetInfo(Landroidx/emoji2/text/MetadataListReader$OpenTypeReader;)Landroidx/emoji2/text/MetadataListReader$OffsetInfo; +SPLandroidx/emoji2/text/MetadataListReader;->read(Ljava/nio/ByteBuffer;)Landroidx/emoji2/text/flatbuffer/MetadataList; +SPLandroidx/emoji2/text/MetadataListReader;->toUnsignedInt(I)J +SPLandroidx/emoji2/text/MetadataListReader;->toUnsignedShort(S)I +Landroidx/emoji2/text/MetadataListReader$ByteBufferReader; +SPLandroidx/emoji2/text/MetadataListReader$ByteBufferReader;->(Ljava/nio/ByteBuffer;)V +SPLandroidx/emoji2/text/MetadataListReader$ByteBufferReader;->getPosition()J +SPLandroidx/emoji2/text/MetadataListReader$ByteBufferReader;->readTag()I +SPLandroidx/emoji2/text/MetadataListReader$ByteBufferReader;->readUnsignedInt()J +SPLandroidx/emoji2/text/MetadataListReader$ByteBufferReader;->readUnsignedShort()I +SPLandroidx/emoji2/text/MetadataListReader$ByteBufferReader;->skip(I)V +Landroidx/emoji2/text/MetadataListReader$OffsetInfo; +SPLandroidx/emoji2/text/MetadataListReader$OffsetInfo;->(JJ)V +SPLandroidx/emoji2/text/MetadataListReader$OffsetInfo;->getStartOffset()J +Landroidx/emoji2/text/MetadataListReader$OpenTypeReader; +Landroidx/emoji2/text/MetadataRepo; +SPLandroidx/emoji2/text/MetadataRepo;->(Landroid/graphics/Typeface;Landroidx/emoji2/text/flatbuffer/MetadataList;)V +SPLandroidx/emoji2/text/MetadataRepo;->constructIndex(Landroidx/emoji2/text/flatbuffer/MetadataList;)V +SPLandroidx/emoji2/text/MetadataRepo;->create(Landroid/graphics/Typeface;Ljava/nio/ByteBuffer;)Landroidx/emoji2/text/MetadataRepo; +SPLandroidx/emoji2/text/MetadataRepo;->getMetadataList()Landroidx/emoji2/text/flatbuffer/MetadataList; +SPLandroidx/emoji2/text/MetadataRepo;->getRootNode()Landroidx/emoji2/text/MetadataRepo$Node; +SPLandroidx/emoji2/text/MetadataRepo;->put(Landroidx/emoji2/text/TypefaceEmojiRasterizer;)V +Landroidx/emoji2/text/MetadataRepo$Node; +SPLandroidx/emoji2/text/MetadataRepo$Node;->()V +SPLandroidx/emoji2/text/MetadataRepo$Node;->(I)V +SPLandroidx/emoji2/text/MetadataRepo$Node;->get(I)Landroidx/emoji2/text/MetadataRepo$Node; +SPLandroidx/emoji2/text/MetadataRepo$Node;->getData()Landroidx/emoji2/text/TypefaceEmojiRasterizer; +SPLandroidx/emoji2/text/MetadataRepo$Node;->put(Landroidx/emoji2/text/TypefaceEmojiRasterizer;II)V +Landroidx/emoji2/text/SpannableBuilder; +SPLandroidx/emoji2/text/SpannableBuilder;->(Ljava/lang/Class;Ljava/lang/CharSequence;)V +SPLandroidx/emoji2/text/SpannableBuilder;->create(Ljava/lang/Class;Ljava/lang/CharSequence;)Landroidx/emoji2/text/SpannableBuilder; +SPLandroidx/emoji2/text/SpannableBuilder;->getSpanFlags(Ljava/lang/Object;)I +SPLandroidx/emoji2/text/SpannableBuilder;->getSpanStart(Ljava/lang/Object;)I +SPLandroidx/emoji2/text/SpannableBuilder;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object; +SPLandroidx/emoji2/text/SpannableBuilder;->isWatcher(Ljava/lang/Class;)Z +SPLandroidx/emoji2/text/SpannableBuilder;->isWatcher(Ljava/lang/Object;)Z +SPLandroidx/emoji2/text/SpannableBuilder;->removeSpan(Ljava/lang/Object;)V +SPLandroidx/emoji2/text/SpannableBuilder;->setSpan(Ljava/lang/Object;III)V +Landroidx/emoji2/text/TypefaceEmojiRasterizer; +SPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->()V +HSPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->(Landroidx/emoji2/text/MetadataRepo;I)V +SPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getCodepointAt(I)I +SPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getCodepointsLength()I +SPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getId()I +HSPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getMetadataItem()Landroidx/emoji2/text/flatbuffer/MetadataItem; +SPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->isDefaultEmoji()Z +Landroidx/emoji2/text/UnprecomputeTextOnModificationSpannable; +Landroidx/emoji2/text/flatbuffer/MetadataItem; +SPLandroidx/emoji2/text/flatbuffer/MetadataItem;->()V +HSPLandroidx/emoji2/text/flatbuffer/MetadataItem;->__assign(ILjava/nio/ByteBuffer;)Landroidx/emoji2/text/flatbuffer/MetadataItem; +HSPLandroidx/emoji2/text/flatbuffer/MetadataItem;->__init(ILjava/nio/ByteBuffer;)V +SPLandroidx/emoji2/text/flatbuffer/MetadataItem;->codepoints(I)I +SPLandroidx/emoji2/text/flatbuffer/MetadataItem;->codepointsLength()I +SPLandroidx/emoji2/text/flatbuffer/MetadataItem;->emojiStyle()Z +SPLandroidx/emoji2/text/flatbuffer/MetadataItem;->id()I +Landroidx/emoji2/text/flatbuffer/MetadataList; +SPLandroidx/emoji2/text/flatbuffer/MetadataList;->()V +SPLandroidx/emoji2/text/flatbuffer/MetadataList;->__assign(ILjava/nio/ByteBuffer;)Landroidx/emoji2/text/flatbuffer/MetadataList; +SPLandroidx/emoji2/text/flatbuffer/MetadataList;->__init(ILjava/nio/ByteBuffer;)V +SPLandroidx/emoji2/text/flatbuffer/MetadataList;->getRootAsMetadataList(Ljava/nio/ByteBuffer;)Landroidx/emoji2/text/flatbuffer/MetadataList; +SPLandroidx/emoji2/text/flatbuffer/MetadataList;->getRootAsMetadataList(Ljava/nio/ByteBuffer;Landroidx/emoji2/text/flatbuffer/MetadataList;)Landroidx/emoji2/text/flatbuffer/MetadataList; +SPLandroidx/emoji2/text/flatbuffer/MetadataList;->list(Landroidx/emoji2/text/flatbuffer/MetadataItem;I)Landroidx/emoji2/text/flatbuffer/MetadataItem; +SPLandroidx/emoji2/text/flatbuffer/MetadataList;->listLength()I +Landroidx/emoji2/text/flatbuffer/Table; +SPLandroidx/emoji2/text/flatbuffer/Table;->()V +HSPLandroidx/emoji2/text/flatbuffer/Table;->__indirect(I)I +HSPLandroidx/emoji2/text/flatbuffer/Table;->__offset(I)I +SPLandroidx/emoji2/text/flatbuffer/Table;->__reset(ILjava/nio/ByteBuffer;)V +HSPLandroidx/emoji2/text/flatbuffer/Table;->__vector(I)I +SPLandroidx/emoji2/text/flatbuffer/Table;->__vector_len(I)I +Landroidx/emoji2/text/flatbuffer/Utf8; +SPLandroidx/emoji2/text/flatbuffer/Utf8;->()V +SPLandroidx/emoji2/text/flatbuffer/Utf8;->getDefault()Landroidx/emoji2/text/flatbuffer/Utf8; +Landroidx/emoji2/text/flatbuffer/Utf8Safe; +SPLandroidx/emoji2/text/flatbuffer/Utf8Safe;->()V +Landroidx/emoji2/viewsintegration/EmojiEditTextHelper; +SPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;->(Landroid/widget/EditText;Z)V +SPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;->getKeyListener(Landroid/text/method/KeyListener;)Landroid/text/method/KeyListener; +SPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;->setEnabled(Z)V +Landroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal; +SPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal;->()V +Landroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19; +SPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;->(Landroid/widget/EditText;Z)V +SPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;->getKeyListener(Landroid/text/method/KeyListener;)Landroid/text/method/KeyListener; +SPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;->setEnabled(Z)V +Landroidx/emoji2/viewsintegration/EmojiEditableFactory; +SPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;->()V +SPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;->()V +SPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;->getInstance()Landroid/text/Editable$Factory; +SPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;->newEditable(Ljava/lang/CharSequence;)Landroid/text/Editable; +Landroidx/emoji2/viewsintegration/EmojiInputFilter; +SPLandroidx/emoji2/viewsintegration/EmojiInputFilter;->(Landroid/widget/TextView;)V +SPLandroidx/emoji2/viewsintegration/EmojiInputFilter;->filter(Ljava/lang/CharSequence;IILandroid/text/Spanned;II)Ljava/lang/CharSequence; +SPLandroidx/emoji2/viewsintegration/EmojiInputFilter;->getInitCallback()Landroidx/emoji2/text/EmojiCompat$InitCallback; +Landroidx/emoji2/viewsintegration/EmojiInputFilter$InitCallbackImpl; +SPLandroidx/emoji2/viewsintegration/EmojiInputFilter$InitCallbackImpl;->(Landroid/widget/TextView;Landroidx/emoji2/viewsintegration/EmojiInputFilter;)V +SPLandroidx/emoji2/viewsintegration/EmojiInputFilter$InitCallbackImpl;->isInputFilterCurrentlyRegisteredOnTextView(Landroid/widget/TextView;Landroid/text/InputFilter;)Z +SPLandroidx/emoji2/viewsintegration/EmojiInputFilter$InitCallbackImpl;->onInitialized()V +SPLandroidx/emoji2/viewsintegration/EmojiInputFilter$InitCallbackImpl;->run()V +Landroidx/emoji2/viewsintegration/EmojiKeyListener; +SPLandroidx/emoji2/viewsintegration/EmojiKeyListener;->(Landroid/text/method/KeyListener;)V +SPLandroidx/emoji2/viewsintegration/EmojiKeyListener;->(Landroid/text/method/KeyListener;Landroidx/emoji2/viewsintegration/EmojiKeyListener$EmojiCompatHandleKeyDownHelper;)V +SPLandroidx/emoji2/viewsintegration/EmojiKeyListener;->getInputType()I +Landroidx/emoji2/viewsintegration/EmojiKeyListener$EmojiCompatHandleKeyDownHelper; +SPLandroidx/emoji2/viewsintegration/EmojiKeyListener$EmojiCompatHandleKeyDownHelper;->()V +Landroidx/emoji2/viewsintegration/EmojiTextViewHelper; +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper;->(Landroid/widget/TextView;Z)V +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper;->getFilters([Landroid/text/InputFilter;)[Landroid/text/InputFilter; +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper;->setAllCaps(Z)V +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper;->setEnabled(Z)V +Landroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal; +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal;->()V +Landroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal19; +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal19;->(Landroid/widget/TextView;)V +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal19;->addEmojiInputFilterIfMissing([Landroid/text/InputFilter;)[Landroid/text/InputFilter; +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal19;->getFilters([Landroid/text/InputFilter;)[Landroid/text/InputFilter; +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal19;->setAllCaps(Z)V +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal19;->setEnabled(Z)V +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal19;->updateFilters()V +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal19;->updateTransformationMethod()V +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal19;->wrapForEnabled(Landroid/text/method/TransformationMethod;)Landroid/text/method/TransformationMethod; +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal19;->wrapTransformationMethod(Landroid/text/method/TransformationMethod;)Landroid/text/method/TransformationMethod; +Landroidx/emoji2/viewsintegration/EmojiTextViewHelper$SkippingHelper19; +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$SkippingHelper19;->(Landroid/widget/TextView;)V +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$SkippingHelper19;->getFilters([Landroid/text/InputFilter;)[Landroid/text/InputFilter; +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$SkippingHelper19;->setAllCaps(Z)V +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$SkippingHelper19;->setEnabled(Z)V +SPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$SkippingHelper19;->skipBecauseEmojiCompatNotInitialized()Z +Landroidx/emoji2/viewsintegration/EmojiTextWatcher; +SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->(Landroid/widget/EditText;Z)V +SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->afterTextChanged(Landroid/text/Editable;)V +SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->beforeTextChanged(Ljava/lang/CharSequence;III)V +SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->getInitCallback()Landroidx/emoji2/text/EmojiCompat$InitCallback; +SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->onTextChanged(Ljava/lang/CharSequence;III)V +SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->setEnabled(Z)V +SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->shouldSkipForDisabledOrNotConfigured()Z +Landroidx/emoji2/viewsintegration/EmojiTextWatcher$InitCallbackImpl; +SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher$InitCallbackImpl;->(Landroid/widget/EditText;)V +SPLandroidx/emoji2/viewsintegration/EmojiTextWatcher$InitCallbackImpl;->onInitialized()V +Landroidx/emoji2/viewsintegration/EmojiTransformationMethod; +SPLandroidx/emoji2/viewsintegration/EmojiTransformationMethod;->(Landroid/text/method/TransformationMethod;)V +SPLandroidx/emoji2/viewsintegration/EmojiTransformationMethod;->getTransformation(Ljava/lang/CharSequence;Landroid/view/View;)Ljava/lang/CharSequence; +Landroidx/fragment/R$styleable; +SPLandroidx/fragment/R$styleable;->()V +Landroidx/fragment/app/BackStackRecord; +Landroidx/fragment/app/DialogFragment; +Landroidx/fragment/app/Fragment; +SPLandroidx/fragment/app/Fragment;->()V +Landroidx/fragment/app/FragmentActivity; +SPLandroidx/fragment/app/FragmentActivity;->(I)V +SPLandroidx/fragment/app/FragmentActivity;->dispatchFragmentsOnCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; +SPLandroidx/fragment/app/FragmentActivity;->getSupportFragmentManager()Landroidx/fragment/app/FragmentManager; +SPLandroidx/fragment/app/FragmentActivity;->init()V +SPLandroidx/fragment/app/FragmentActivity;->lambda$init$3$androidx-fragment-app-FragmentActivity(Landroid/content/Context;)V +SPLandroidx/fragment/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V +SPLandroidx/fragment/app/FragmentActivity;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; +SPLandroidx/fragment/app/FragmentActivity;->onCreateView(Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; +SPLandroidx/fragment/app/FragmentActivity;->onPostResume()V +SPLandroidx/fragment/app/FragmentActivity;->onResume()V +SPLandroidx/fragment/app/FragmentActivity;->onResumeFragments()V +SPLandroidx/fragment/app/FragmentActivity;->onStart()V +SPLandroidx/fragment/app/FragmentActivity;->onStateNotSaved()V +Landroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda0; +SPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda0;->(Landroidx/fragment/app/FragmentActivity;)V +Landroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda1; +SPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda1;->(Landroidx/fragment/app/FragmentActivity;)V +Landroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda2; +SPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda2;->(Landroidx/fragment/app/FragmentActivity;)V +Landroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda3; +SPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda3;->(Landroidx/fragment/app/FragmentActivity;)V +SPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda3;->onContextAvailable(Landroid/content/Context;)V +Landroidx/fragment/app/FragmentActivity$HostCallbacks; +SPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->(Landroidx/fragment/app/FragmentActivity;)V +SPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->addMenuProvider(Landroidx/core/view/MenuProvider;)V +SPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->addOnConfigurationChangedListener(Landroidx/core/util/Consumer;)V +SPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->addOnMultiWindowModeChangedListener(Landroidx/core/util/Consumer;)V +SPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->addOnPictureInPictureModeChangedListener(Landroidx/core/util/Consumer;)V +SPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->addOnTrimMemoryListener(Landroidx/core/util/Consumer;)V +SPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getActivityResultRegistry()Landroidx/activity/result/ActivityResultRegistry; +SPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getLifecycle()Landroidx/lifecycle/Lifecycle; +SPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getOnBackPressedDispatcher()Landroidx/activity/OnBackPressedDispatcher; +SPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; +SPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; +Landroidx/fragment/app/FragmentContainer; +SPLandroidx/fragment/app/FragmentContainer;->()V +Landroidx/fragment/app/FragmentContainerView; +SPLandroidx/fragment/app/FragmentContainerView;->(Landroid/content/Context;Landroid/util/AttributeSet;Landroidx/fragment/app/FragmentManager;)V +SPLandroidx/fragment/app/FragmentContainerView;->dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; +SPLandroidx/fragment/app/FragmentContainerView;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; +Landroidx/fragment/app/FragmentController; +SPLandroidx/fragment/app/FragmentController;->(Landroidx/fragment/app/FragmentHostCallback;)V +SPLandroidx/fragment/app/FragmentController;->attachHost(Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/FragmentController;->createController(Landroidx/fragment/app/FragmentHostCallback;)Landroidx/fragment/app/FragmentController; +SPLandroidx/fragment/app/FragmentController;->dispatchActivityCreated()V +SPLandroidx/fragment/app/FragmentController;->dispatchCreate()V +SPLandroidx/fragment/app/FragmentController;->dispatchResume()V +SPLandroidx/fragment/app/FragmentController;->dispatchStart()V +SPLandroidx/fragment/app/FragmentController;->execPendingActions()Z +SPLandroidx/fragment/app/FragmentController;->getSupportFragmentManager()Landroidx/fragment/app/FragmentManager; +SPLandroidx/fragment/app/FragmentController;->noteStateNotSaved()V +SPLandroidx/fragment/app/FragmentController;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; +Landroidx/fragment/app/FragmentFactory; +SPLandroidx/fragment/app/FragmentFactory;->()V +SPLandroidx/fragment/app/FragmentFactory;->()V +Landroidx/fragment/app/FragmentHostCallback; +SPLandroidx/fragment/app/FragmentHostCallback;->(Landroid/app/Activity;Landroid/content/Context;Landroid/os/Handler;I)V +SPLandroidx/fragment/app/FragmentHostCallback;->(Landroidx/fragment/app/FragmentActivity;)V +SPLandroidx/fragment/app/FragmentHostCallback;->getFragmentManager()Landroidx/fragment/app/FragmentManager; +SPLandroidx/fragment/app/FragmentHostCallback;->getHandler()Landroid/os/Handler; +Landroidx/fragment/app/FragmentLayoutInflaterFactory; +SPLandroidx/fragment/app/FragmentLayoutInflaterFactory;->(Landroidx/fragment/app/FragmentManager;)V +SPLandroidx/fragment/app/FragmentLayoutInflaterFactory;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; +Landroidx/fragment/app/FragmentLifecycleCallbacksDispatcher; +SPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->(Landroidx/fragment/app/FragmentManager;)V +SPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->registerFragmentLifecycleCallbacks(Landroidx/fragment/app/FragmentManager$FragmentLifecycleCallbacks;Z)V +Landroidx/fragment/app/FragmentLifecycleCallbacksDispatcher$FragmentLifecycleCallbacksHolder; +SPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher$FragmentLifecycleCallbacksHolder;->(Landroidx/fragment/app/FragmentManager$FragmentLifecycleCallbacks;Z)V +Landroidx/fragment/app/FragmentManager; +SPLandroidx/fragment/app/FragmentManager;->-$$Nest$fgetmResults(Landroidx/fragment/app/FragmentManager;)Ljava/util/Map; +SPLandroidx/fragment/app/FragmentManager;->()V +SPLandroidx/fragment/app/FragmentManager;->()V +SPLandroidx/fragment/app/FragmentManager;->addFragmentOnAttachListener(Landroidx/fragment/app/FragmentOnAttachListener;)V +SPLandroidx/fragment/app/FragmentManager;->attachController(Landroidx/fragment/app/FragmentHostCallback;Landroidx/fragment/app/FragmentContainer;Landroidx/fragment/app/Fragment;)V +SPLandroidx/fragment/app/FragmentManager;->collectAllSpecialEffectsController()Ljava/util/Set; +SPLandroidx/fragment/app/FragmentManager;->dispatchActivityCreated()V +SPLandroidx/fragment/app/FragmentManager;->dispatchCreate()V +SPLandroidx/fragment/app/FragmentManager;->dispatchCreateOptionsMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)Z +SPLandroidx/fragment/app/FragmentManager;->dispatchPrepareOptionsMenu(Landroid/view/Menu;)Z +SPLandroidx/fragment/app/FragmentManager;->dispatchResume()V +SPLandroidx/fragment/app/FragmentManager;->dispatchStart()V +SPLandroidx/fragment/app/FragmentManager;->dispatchStateChange(I)V +SPLandroidx/fragment/app/FragmentManager;->doPendingDeferredStart()V +SPLandroidx/fragment/app/FragmentManager;->ensureExecReady(Z)V +SPLandroidx/fragment/app/FragmentManager;->execPendingActions(Z)Z +SPLandroidx/fragment/app/FragmentManager;->findFragmentById(I)Landroidx/fragment/app/Fragment; +SPLandroidx/fragment/app/FragmentManager;->findFragmentByTag(Ljava/lang/String;)Landroidx/fragment/app/Fragment; +SPLandroidx/fragment/app/FragmentManager;->generateOpsForPendingActions(Ljava/util/ArrayList;Ljava/util/ArrayList;)Z +SPLandroidx/fragment/app/FragmentManager;->getBackStackEntryCount()I +SPLandroidx/fragment/app/FragmentManager;->getLayoutInflaterFactory()Landroid/view/LayoutInflater$Factory2; +SPLandroidx/fragment/app/FragmentManager;->isLoggingEnabled(I)Z +SPLandroidx/fragment/app/FragmentManager;->isStateSaved()Z +SPLandroidx/fragment/app/FragmentManager;->moveToState(IZ)V +SPLandroidx/fragment/app/FragmentManager;->noteStateNotSaved()V +SPLandroidx/fragment/app/FragmentManager;->onContainerAvailable(Landroidx/fragment/app/FragmentContainerView;)V +SPLandroidx/fragment/app/FragmentManager;->registerFragmentLifecycleCallbacks(Landroidx/fragment/app/FragmentManager$FragmentLifecycleCallbacks;Z)V +SPLandroidx/fragment/app/FragmentManager;->setFragmentResultListener(Ljava/lang/String;Landroidx/lifecycle/LifecycleOwner;Landroidx/fragment/app/FragmentResultListener;)V +SPLandroidx/fragment/app/FragmentManager;->startPendingDeferredFragments()V +SPLandroidx/fragment/app/FragmentManager;->updateOnBackPressedCallbackEnabled()V +Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda0; +SPLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda0;->(Landroidx/fragment/app/FragmentManager;)V +Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda1; +SPLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda1;->(Landroidx/fragment/app/FragmentManager;)V +Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda2; +SPLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda2;->(Landroidx/fragment/app/FragmentManager;)V +Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda3; +SPLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda3;->(Landroidx/fragment/app/FragmentManager;)V +Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda4; +SPLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda4;->(Landroidx/fragment/app/FragmentManager;)V +Landroidx/fragment/app/FragmentManager$1; +SPLandroidx/fragment/app/FragmentManager$1;->(Landroidx/fragment/app/FragmentManager;Z)V +Landroidx/fragment/app/FragmentManager$10; +SPLandroidx/fragment/app/FragmentManager$10;->(Landroidx/fragment/app/FragmentManager;)V +Landroidx/fragment/app/FragmentManager$2; +SPLandroidx/fragment/app/FragmentManager$2;->(Landroidx/fragment/app/FragmentManager;)V +SPLandroidx/fragment/app/FragmentManager$2;->onCreateMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)V +SPLandroidx/fragment/app/FragmentManager$2;->onPrepareMenu(Landroid/view/Menu;)V +Landroidx/fragment/app/FragmentManager$3; +SPLandroidx/fragment/app/FragmentManager$3;->(Landroidx/fragment/app/FragmentManager;)V +Landroidx/fragment/app/FragmentManager$4; +SPLandroidx/fragment/app/FragmentManager$4;->(Landroidx/fragment/app/FragmentManager;)V +Landroidx/fragment/app/FragmentManager$5; +SPLandroidx/fragment/app/FragmentManager$5;->(Landroidx/fragment/app/FragmentManager;)V +Landroidx/fragment/app/FragmentManager$6; +SPLandroidx/fragment/app/FragmentManager$6;->(Landroidx/fragment/app/FragmentManager;Ljava/lang/String;Landroidx/fragment/app/FragmentResultListener;Landroidx/lifecycle/Lifecycle;)V +SPLandroidx/fragment/app/FragmentManager$6;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/fragment/app/FragmentManager$8; +SPLandroidx/fragment/app/FragmentManager$8;->(Landroidx/fragment/app/FragmentManager;)V +Landroidx/fragment/app/FragmentManager$9; +SPLandroidx/fragment/app/FragmentManager$9;->(Landroidx/fragment/app/FragmentManager;)V +Landroidx/fragment/app/FragmentManager$BackStackEntry; +Landroidx/fragment/app/FragmentManager$FragmentIntentSenderContract; +SPLandroidx/fragment/app/FragmentManager$FragmentIntentSenderContract;->()V +Landroidx/fragment/app/FragmentManager$FragmentLifecycleCallbacks; +SPLandroidx/fragment/app/FragmentManager$FragmentLifecycleCallbacks;->()V +Landroidx/fragment/app/FragmentManager$LifecycleAwareResultListener; +SPLandroidx/fragment/app/FragmentManager$LifecycleAwareResultListener;->(Landroidx/lifecycle/Lifecycle;Landroidx/fragment/app/FragmentResultListener;Landroidx/lifecycle/LifecycleEventObserver;)V +Landroidx/fragment/app/FragmentManager$OpGenerator; +Landroidx/fragment/app/FragmentManagerImpl; +SPLandroidx/fragment/app/FragmentManagerImpl;->()V +Landroidx/fragment/app/FragmentManagerViewModel; +SPLandroidx/fragment/app/FragmentManagerViewModel;->()V +SPLandroidx/fragment/app/FragmentManagerViewModel;->(Z)V +SPLandroidx/fragment/app/FragmentManagerViewModel;->getInstance(Landroidx/lifecycle/ViewModelStore;)Landroidx/fragment/app/FragmentManagerViewModel; +SPLandroidx/fragment/app/FragmentManagerViewModel;->setIsStateSaved(Z)V +Landroidx/fragment/app/FragmentManagerViewModel$1; +SPLandroidx/fragment/app/FragmentManagerViewModel$1;->()V +SPLandroidx/fragment/app/FragmentManagerViewModel$1;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; +Landroidx/fragment/app/FragmentOnAttachListener; +Landroidx/fragment/app/FragmentResultListener; +Landroidx/fragment/app/FragmentResultOwner; +Landroidx/fragment/app/FragmentStore; +SPLandroidx/fragment/app/FragmentStore;->()V +SPLandroidx/fragment/app/FragmentStore;->burpActive()V +SPLandroidx/fragment/app/FragmentStore;->dispatchStateChange(I)V +SPLandroidx/fragment/app/FragmentStore;->findFragmentById(I)Landroidx/fragment/app/Fragment; +SPLandroidx/fragment/app/FragmentStore;->findFragmentByTag(Ljava/lang/String;)Landroidx/fragment/app/Fragment; +SPLandroidx/fragment/app/FragmentStore;->getActiveFragmentStateManagers()Ljava/util/List; +SPLandroidx/fragment/app/FragmentStore;->getFragments()Ljava/util/List; +SPLandroidx/fragment/app/FragmentStore;->moveToExpectedState()V +SPLandroidx/fragment/app/FragmentStore;->setNonConfig(Landroidx/fragment/app/FragmentManagerViewModel;)V +Landroidx/fragment/app/FragmentTransaction; +Landroidx/fragment/app/SpecialEffectsControllerFactory; +Landroidx/interpolator/view/animation/FastOutLinearInInterpolator; +SPLandroidx/interpolator/view/animation/FastOutLinearInInterpolator;->()V +SPLandroidx/interpolator/view/animation/FastOutLinearInInterpolator;->()V +Landroidx/interpolator/view/animation/FastOutSlowInInterpolator; +SPLandroidx/interpolator/view/animation/FastOutSlowInInterpolator;->()V +SPLandroidx/interpolator/view/animation/FastOutSlowInInterpolator;->()V +SPLandroidx/interpolator/view/animation/FastOutSlowInInterpolator;->getInterpolation(F)F +Landroidx/interpolator/view/animation/LinearOutSlowInInterpolator; +SPLandroidx/interpolator/view/animation/LinearOutSlowInInterpolator;->()V +SPLandroidx/interpolator/view/animation/LinearOutSlowInInterpolator;->()V +Landroidx/interpolator/view/animation/LookupTableInterpolator; +SPLandroidx/interpolator/view/animation/LookupTableInterpolator;->([F)V +SPLandroidx/interpolator/view/animation/LookupTableInterpolator;->getInterpolation(F)F +Landroidx/lifecycle/AndroidViewModel; +Landroidx/lifecycle/AtomicReference; +SPLandroidx/lifecycle/AtomicReference;->(Ljava/lang/Object;)V +SPLandroidx/lifecycle/AtomicReference;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z +SPLandroidx/lifecycle/AtomicReference;->get()Ljava/lang/Object; +Landroidx/lifecycle/DefaultLifecycleObserver; +SPLandroidx/lifecycle/DefaultLifecycleObserver;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +SPLandroidx/lifecycle/DefaultLifecycleObserver;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +SPLandroidx/lifecycle/DefaultLifecycleObserver;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +Landroidx/lifecycle/DefaultLifecycleObserverAdapter; +SPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;->(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleEventObserver;)V +SPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/lifecycle/DefaultLifecycleObserverAdapter$WhenMappings; +SPLandroidx/lifecycle/DefaultLifecycleObserverAdapter$WhenMappings;->()V +Landroidx/lifecycle/EmptyActivityLifecycleCallbacks; +SPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->()V +SPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V +SPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V +SPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V +Landroidx/lifecycle/FastSafeIterableMap; +SPLandroidx/lifecycle/FastSafeIterableMap;->()V +SPLandroidx/lifecycle/FastSafeIterableMap;->ceil(Ljava/lang/Object;)Ljava/util/Map$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap;->contains(Ljava/lang/Object;)Z +SPLandroidx/lifecycle/FastSafeIterableMap;->first()Ljava/util/Map$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap;->forEachWithAdditions(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/lifecycle/FastSafeIterableMap;->last()Ljava/util/Map$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap;->lastOrNull()Ljava/util/Map$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/lifecycle/FastSafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/lifecycle/FastSafeIterableMap;->size()I +Landroidx/lifecycle/FastSafeIterableMap$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->(Ljava/lang/Object;Ljava/lang/Object;)V +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->getKey()Ljava/lang/Object; +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->getNext()Landroidx/lifecycle/FastSafeIterableMap$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->getPrev()Landroidx/lifecycle/FastSafeIterableMap$Entry; +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->getValue()Ljava/lang/Object; +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->isRemoved()Z +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->markRemoved()V +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->setNext(Landroidx/lifecycle/FastSafeIterableMap$Entry;)V +SPLandroidx/lifecycle/FastSafeIterableMap$Entry;->setPrev(Landroidx/lifecycle/FastSafeIterableMap$Entry;)V +Landroidx/lifecycle/FlowExtKt; +SPLandroidx/lifecycle/FlowExtKt;->flowWithLifecycle$default(Lkotlinx/coroutines/flow/Flow;Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; +SPLandroidx/lifecycle/FlowExtKt;->flowWithLifecycle(Lkotlinx/coroutines/flow/Flow;Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;)Lkotlinx/coroutines/flow/Flow; +Landroidx/lifecycle/FlowExtKt$flowWithLifecycle$1; +SPLandroidx/lifecycle/FlowExtKt$flowWithLifecycle$1;->(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V +SPLandroidx/lifecycle/FlowExtKt$flowWithLifecycle$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/lifecycle/FlowExtKt$flowWithLifecycle$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/lifecycle/FlowExtKt$flowWithLifecycle$1;->invoke(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/lifecycle/FlowExtKt$flowWithLifecycle$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/lifecycle/FlowExtKt$flowWithLifecycle$1$1; +SPLandroidx/lifecycle/FlowExtKt$flowWithLifecycle$1$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)V +SPLandroidx/lifecycle/FlowExtKt$flowWithLifecycle$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/lifecycle/FlowExtKt$flowWithLifecycle$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/lifecycle/FlowExtKt$flowWithLifecycle$1$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/lifecycle/FlowExtKt$flowWithLifecycle$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/lifecycle/FlowExtKt$flowWithLifecycle$1$1$1; +SPLandroidx/lifecycle/FlowExtKt$flowWithLifecycle$1$1$1;->(Lkotlinx/coroutines/channels/ProducerScope;)V +SPLandroidx/lifecycle/FlowExtKt$flowWithLifecycle$1$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/lifecycle/HasDefaultViewModelProviderFactory; +Landroidx/lifecycle/Lifecycle; +SPLandroidx/lifecycle/Lifecycle;->()V +SPLandroidx/lifecycle/Lifecycle;->getInternalScopeRef()Landroidx/lifecycle/AtomicReference; +Landroidx/lifecycle/Lifecycle$Event; +SPLandroidx/lifecycle/Lifecycle$Event;->$values()[Landroidx/lifecycle/Lifecycle$Event; +SPLandroidx/lifecycle/Lifecycle$Event;->()V +SPLandroidx/lifecycle/Lifecycle$Event;->(Ljava/lang/String;I)V +SPLandroidx/lifecycle/Lifecycle$Event;->getTargetState()Landroidx/lifecycle/Lifecycle$State; +SPLandroidx/lifecycle/Lifecycle$Event;->values()[Landroidx/lifecycle/Lifecycle$Event; +Landroidx/lifecycle/Lifecycle$Event$Companion; +SPLandroidx/lifecycle/Lifecycle$Event$Companion;->()V +SPLandroidx/lifecycle/Lifecycle$Event$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/lifecycle/Lifecycle$Event$Companion;->downFrom(Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$Event; +SPLandroidx/lifecycle/Lifecycle$Event$Companion;->upFrom(Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$Event; +SPLandroidx/lifecycle/Lifecycle$Event$Companion;->upTo(Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$Event; +Landroidx/lifecycle/Lifecycle$Event$Companion$WhenMappings; +SPLandroidx/lifecycle/Lifecycle$Event$Companion$WhenMappings;->()V +Landroidx/lifecycle/Lifecycle$Event$WhenMappings; +SPLandroidx/lifecycle/Lifecycle$Event$WhenMappings;->()V +Landroidx/lifecycle/Lifecycle$State; +SPLandroidx/lifecycle/Lifecycle$State;->$values()[Landroidx/lifecycle/Lifecycle$State; +SPLandroidx/lifecycle/Lifecycle$State;->()V +SPLandroidx/lifecycle/Lifecycle$State;->(Ljava/lang/String;I)V +SPLandroidx/lifecycle/Lifecycle$State;->isAtLeast(Landroidx/lifecycle/Lifecycle$State;)Z +SPLandroidx/lifecycle/Lifecycle$State;->values()[Landroidx/lifecycle/Lifecycle$State; +Landroidx/lifecycle/LifecycleCoroutineScope; +SPLandroidx/lifecycle/LifecycleCoroutineScope;->()V +Landroidx/lifecycle/LifecycleCoroutineScopeImpl; +SPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->(Landroidx/lifecycle/Lifecycle;Lkotlin/coroutines/CoroutineContext;)V +SPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; +SPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->getLifecycle$lifecycle_common()Landroidx/lifecycle/Lifecycle; +SPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->register()V +Landroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1; +SPLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->(Landroidx/lifecycle/LifecycleCoroutineScopeImpl;Lkotlin/coroutines/Continuation;)V +SPLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/lifecycle/LifecycleDispatcher; +SPLandroidx/lifecycle/LifecycleDispatcher;->()V +SPLandroidx/lifecycle/LifecycleDispatcher;->()V +SPLandroidx/lifecycle/LifecycleDispatcher;->init(Landroid/content/Context;)V +Landroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback; +SPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->()V +SPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +Landroidx/lifecycle/LifecycleEventObserver; +Landroidx/lifecycle/LifecycleKt; +SPLandroidx/lifecycle/LifecycleKt;->getCoroutineScope(Landroidx/lifecycle/Lifecycle;)Landroidx/lifecycle/LifecycleCoroutineScope; +Landroidx/lifecycle/LifecycleObserver; +Landroidx/lifecycle/LifecycleOwner; +Landroidx/lifecycle/LifecycleOwnerKt; +SPLandroidx/lifecycle/LifecycleOwnerKt;->getLifecycleScope(Landroidx/lifecycle/LifecycleOwner;)Landroidx/lifecycle/LifecycleCoroutineScope; +Landroidx/lifecycle/LifecycleRegistry; +SPLandroidx/lifecycle/LifecycleRegistry;->()V +SPLandroidx/lifecycle/LifecycleRegistry;->(Landroidx/lifecycle/LifecycleOwner;)V +SPLandroidx/lifecycle/LifecycleRegistry;->(Landroidx/lifecycle/LifecycleOwner;Z)V +SPLandroidx/lifecycle/LifecycleRegistry;->addObserver(Landroidx/lifecycle/LifecycleObserver;)V +SPLandroidx/lifecycle/LifecycleRegistry;->calculateTargetState(Landroidx/lifecycle/LifecycleObserver;)Landroidx/lifecycle/Lifecycle$State; +SPLandroidx/lifecycle/LifecycleRegistry;->enforceMainThreadIfNeeded(Ljava/lang/String;)V +SPLandroidx/lifecycle/LifecycleRegistry;->forwardPass$lambda$0(Landroidx/lifecycle/LifecycleRegistry;Landroidx/lifecycle/LifecycleOwner;Ljava/util/Map$Entry;)Lkotlin/Unit; +SPLandroidx/lifecycle/LifecycleRegistry;->forwardPass(Landroidx/lifecycle/LifecycleOwner;)V +SPLandroidx/lifecycle/LifecycleRegistry;->getCurrentState()Landroidx/lifecycle/Lifecycle$State; +SPLandroidx/lifecycle/LifecycleRegistry;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/lifecycle/LifecycleRegistry;->isSynced()Z +SPLandroidx/lifecycle/LifecycleRegistry;->moveToState(Landroidx/lifecycle/Lifecycle$State;)V +SPLandroidx/lifecycle/LifecycleRegistry;->removeObserver(Landroidx/lifecycle/LifecycleObserver;)V +SPLandroidx/lifecycle/LifecycleRegistry;->sync()V +Landroidx/lifecycle/LifecycleRegistry$$ExternalSyntheticLambda1; +SPLandroidx/lifecycle/LifecycleRegistry$$ExternalSyntheticLambda1;->(Landroidx/lifecycle/LifecycleRegistry;Landroidx/lifecycle/LifecycleOwner;)V +SPLandroidx/lifecycle/LifecycleRegistry$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/lifecycle/LifecycleRegistry$Companion; +SPLandroidx/lifecycle/LifecycleRegistry$Companion;->()V +SPLandroidx/lifecycle/LifecycleRegistry$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/lifecycle/LifecycleRegistry$ObserverWithState; +SPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->(Landroidx/lifecycle/LifecycleObserver;Landroidx/lifecycle/Lifecycle$State;)V +SPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->dispatchEvent(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->getState()Landroidx/lifecycle/Lifecycle$State; +Landroidx/lifecycle/LifecycleRegistryKt; +SPLandroidx/lifecycle/LifecycleRegistryKt;->access$checkLifecycleStateTransition(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$State;Landroidx/lifecycle/Lifecycle$State;)V +SPLandroidx/lifecycle/LifecycleRegistryKt;->access$min(Landroidx/lifecycle/Lifecycle$State;Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$State; +SPLandroidx/lifecycle/LifecycleRegistryKt;->checkLifecycleStateTransition(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$State;Landroidx/lifecycle/Lifecycle$State;)V +SPLandroidx/lifecycle/LifecycleRegistryKt;->min(Landroidx/lifecycle/Lifecycle$State;Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$State; +Landroidx/lifecycle/LifecycleRegistryOwner; +Landroidx/lifecycle/LifecycleRegistry_androidKt; +SPLandroidx/lifecycle/LifecycleRegistry_androidKt;->isMainThread()Z +Landroidx/lifecycle/Lifecycling; +SPLandroidx/lifecycle/Lifecycling;->()V +SPLandroidx/lifecycle/Lifecycling;->()V +SPLandroidx/lifecycle/Lifecycling;->lifecycleEventObserver(Ljava/lang/Object;)Landroidx/lifecycle/LifecycleEventObserver; +Landroidx/lifecycle/LiveData; +SPLandroidx/lifecycle/LiveData;->()V +SPLandroidx/lifecycle/LiveData;->()V +SPLandroidx/lifecycle/LiveData;->(Ljava/lang/Object;)V +SPLandroidx/lifecycle/LiveData;->assertMainThread(Ljava/lang/String;)V +SPLandroidx/lifecycle/LiveData;->changeActiveCounter(I)V +SPLandroidx/lifecycle/LiveData;->considerNotify(Landroidx/lifecycle/LiveData$ObserverWrapper;)V +SPLandroidx/lifecycle/LiveData;->dispatchingValue(Landroidx/lifecycle/LiveData$ObserverWrapper;)V +SPLandroidx/lifecycle/LiveData;->observeForever(Landroidx/lifecycle/Observer;)V +SPLandroidx/lifecycle/LiveData;->onActive()V +SPLandroidx/lifecycle/LiveData;->postValue(Ljava/lang/Object;)V +SPLandroidx/lifecycle/LiveData;->setValue(Ljava/lang/Object;)V +Landroidx/lifecycle/LiveData$1; +SPLandroidx/lifecycle/LiveData$1;->(Landroidx/lifecycle/LiveData;)V +SPLandroidx/lifecycle/LiveData$1;->run()V +Landroidx/lifecycle/LiveData$AlwaysActiveObserver; +SPLandroidx/lifecycle/LiveData$AlwaysActiveObserver;->(Landroidx/lifecycle/LiveData;Landroidx/lifecycle/Observer;)V +SPLandroidx/lifecycle/LiveData$AlwaysActiveObserver;->shouldBeActive()Z +Landroidx/lifecycle/LiveData$LifecycleBoundObserver; +Landroidx/lifecycle/LiveData$ObserverWrapper; +SPLandroidx/lifecycle/LiveData$ObserverWrapper;->(Landroidx/lifecycle/LiveData;Landroidx/lifecycle/Observer;)V +SPLandroidx/lifecycle/LiveData$ObserverWrapper;->activeStateChanged(Z)V +Landroidx/lifecycle/MutableLiveData; +SPLandroidx/lifecycle/MutableLiveData;->()V +SPLandroidx/lifecycle/MutableLiveData;->(Ljava/lang/Object;)V +SPLandroidx/lifecycle/MutableLiveData;->postValue(Ljava/lang/Object;)V +SPLandroidx/lifecycle/MutableLiveData;->setValue(Ljava/lang/Object;)V +Landroidx/lifecycle/Observer; +Landroidx/lifecycle/ProcessLifecycleInitializer; +SPLandroidx/lifecycle/ProcessLifecycleInitializer;->()V +SPLandroidx/lifecycle/ProcessLifecycleInitializer;->create(Landroid/content/Context;)Landroidx/lifecycle/LifecycleOwner; +SPLandroidx/lifecycle/ProcessLifecycleInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; +SPLandroidx/lifecycle/ProcessLifecycleInitializer;->dependencies()Ljava/util/List; +Landroidx/lifecycle/ProcessLifecycleOwner; +SPLandroidx/lifecycle/ProcessLifecycleOwner;->()V +SPLandroidx/lifecycle/ProcessLifecycleOwner;->()V +SPLandroidx/lifecycle/ProcessLifecycleOwner;->access$getNewInstance$cp()Landroidx/lifecycle/ProcessLifecycleOwner; +SPLandroidx/lifecycle/ProcessLifecycleOwner;->activityResumed$lifecycle_process()V +SPLandroidx/lifecycle/ProcessLifecycleOwner;->activityStarted$lifecycle_process()V +SPLandroidx/lifecycle/ProcessLifecycleOwner;->attach$lifecycle_process(Landroid/content/Context;)V +SPLandroidx/lifecycle/ProcessLifecycleOwner;->getLifecycle()Landroidx/lifecycle/Lifecycle; +Landroidx/lifecycle/ProcessLifecycleOwner$$ExternalSyntheticLambda0; +SPLandroidx/lifecycle/ProcessLifecycleOwner$$ExternalSyntheticLambda0;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V +Landroidx/lifecycle/ProcessLifecycleOwner$Api29Impl; +SPLandroidx/lifecycle/ProcessLifecycleOwner$Api29Impl;->()V +SPLandroidx/lifecycle/ProcessLifecycleOwner$Api29Impl;->()V +SPLandroidx/lifecycle/ProcessLifecycleOwner$Api29Impl;->registerActivityLifecycleCallbacks(Landroid/app/Activity;Landroid/app/Application$ActivityLifecycleCallbacks;)V +Landroidx/lifecycle/ProcessLifecycleOwner$Companion; +SPLandroidx/lifecycle/ProcessLifecycleOwner$Companion;->()V +SPLandroidx/lifecycle/ProcessLifecycleOwner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/lifecycle/ProcessLifecycleOwner$Companion;->get()Landroidx/lifecycle/LifecycleOwner; +SPLandroidx/lifecycle/ProcessLifecycleOwner$Companion;->init$lifecycle_process(Landroid/content/Context;)V +Landroidx/lifecycle/ProcessLifecycleOwner$attach$1; +SPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V +SPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->onActivityPreCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +Landroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1; +SPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V +SPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1;->onActivityPostResumed(Landroid/app/Activity;)V +SPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1;->onActivityPostStarted(Landroid/app/Activity;)V +Landroidx/lifecycle/ProcessLifecycleOwner$initializationListener$1; +SPLandroidx/lifecycle/ProcessLifecycleOwner$initializationListener$1;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V +Landroidx/lifecycle/RepeatOnLifecycleKt; +SPLandroidx/lifecycle/RepeatOnLifecycleKt;->repeatOnLifecycle(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/lifecycle/RepeatOnLifecycleKt;->repeatOnLifecycle(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3;->(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1;->(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1;->(Landroidx/lifecycle/Lifecycle$Event;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/CoroutineScope;Landroidx/lifecycle/Lifecycle$Event;Lkotlinx/coroutines/CancellableContinuation;Lkotlinx/coroutines/sync/Mutex;Lkotlin/jvm/functions/Function2;)V +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1;->(Lkotlinx/coroutines/sync/Mutex;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/lifecycle/ReportFragment; +SPLandroidx/lifecycle/ReportFragment;->()V +SPLandroidx/lifecycle/ReportFragment;->()V +SPLandroidx/lifecycle/ReportFragment;->dispatch(Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/lifecycle/ReportFragment;->dispatchCreate(Landroidx/lifecycle/ReportFragment$ActivityInitializationListener;)V +SPLandroidx/lifecycle/ReportFragment;->dispatchResume(Landroidx/lifecycle/ReportFragment$ActivityInitializationListener;)V +SPLandroidx/lifecycle/ReportFragment;->dispatchStart(Landroidx/lifecycle/ReportFragment$ActivityInitializationListener;)V +SPLandroidx/lifecycle/ReportFragment;->onActivityCreated(Landroid/os/Bundle;)V +SPLandroidx/lifecycle/ReportFragment;->onDestroy()V +SPLandroidx/lifecycle/ReportFragment;->onResume()V +SPLandroidx/lifecycle/ReportFragment;->onStart()V +Landroidx/lifecycle/ReportFragment$ActivityInitializationListener; +Landroidx/lifecycle/ReportFragment$Companion; +SPLandroidx/lifecycle/ReportFragment$Companion;->()V +SPLandroidx/lifecycle/ReportFragment$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/lifecycle/ReportFragment$Companion;->dispatch$lifecycle_runtime(Landroid/app/Activity;Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/lifecycle/ReportFragment$Companion;->injectIfNeededIn(Landroid/app/Activity;)V +Landroidx/lifecycle/ReportFragment$LifecycleCallbacks; +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->()V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->()V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostResumed(Landroid/app/Activity;)V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostStarted(Landroid/app/Activity;)V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPreDestroyed(Landroid/app/Activity;)V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V +Landroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion; +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion;->()V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion;->registerIn(Landroid/app/Activity;)V +Landroidx/lifecycle/SavedStateHandle; +SPLandroidx/lifecycle/SavedStateHandle;->()V +SPLandroidx/lifecycle/SavedStateHandle;->(Ljava/util/Map;)V +SPLandroidx/lifecycle/SavedStateHandle;->getMutableStateFlow(Ljava/lang/String;Ljava/lang/Object;)Lkotlinx/coroutines/flow/MutableStateFlow; +Landroidx/lifecycle/SavedStateHandle$Companion; +SPLandroidx/lifecycle/SavedStateHandle$Companion;->()V +SPLandroidx/lifecycle/SavedStateHandle$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/lifecycle/SavedStateHandle$Companion;->createHandle(Landroid/os/Bundle;Landroid/os/Bundle;)Landroidx/lifecycle/SavedStateHandle; +Landroidx/lifecycle/SavedStateHandleAttacher; +SPLandroidx/lifecycle/SavedStateHandleAttacher;->(Landroidx/lifecycle/SavedStateHandlesProvider;)V +SPLandroidx/lifecycle/SavedStateHandleAttacher;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/lifecycle/SavedStateHandleSupport; +SPLandroidx/lifecycle/SavedStateHandleSupport;->()V +SPLandroidx/lifecycle/SavedStateHandleSupport;->createSavedStateHandle(Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/SavedStateHandle; +SPLandroidx/lifecycle/SavedStateHandleSupport;->createSavedStateHandle(Landroidx/savedstate/SavedStateRegistryOwner;Landroidx/lifecycle/ViewModelStoreOwner;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/lifecycle/SavedStateHandle; +SPLandroidx/lifecycle/SavedStateHandleSupport;->enableSavedStateHandles(Landroidx/savedstate/SavedStateRegistryOwner;)V +SPLandroidx/lifecycle/SavedStateHandleSupport;->getSavedStateHandlesProvider(Landroidx/savedstate/SavedStateRegistryOwner;)Landroidx/lifecycle/SavedStateHandlesProvider; +SPLandroidx/lifecycle/SavedStateHandleSupport;->getSavedStateHandlesVM(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/SavedStateHandlesVM; +Landroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1; +SPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1;->()V +SPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1;->create(Lkotlin/reflect/KClass;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$1; +SPLandroidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$1;->()V +Landroidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$2; +SPLandroidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$2;->()V +Landroidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$3; +SPLandroidx/lifecycle/SavedStateHandleSupport$special$$inlined$Key$3;->()V +Landroidx/lifecycle/SavedStateHandlesProvider; +SPLandroidx/lifecycle/SavedStateHandlesProvider;->(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/ViewModelStoreOwner;)V +SPLandroidx/lifecycle/SavedStateHandlesProvider;->consumeRestoredStateForKey(Ljava/lang/String;)Landroid/os/Bundle; +SPLandroidx/lifecycle/SavedStateHandlesProvider;->getViewModel()Landroidx/lifecycle/SavedStateHandlesVM; +SPLandroidx/lifecycle/SavedStateHandlesProvider;->performRestore()V +SPLandroidx/lifecycle/SavedStateHandlesProvider;->viewModel_delegate$lambda$0(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/SavedStateHandlesVM; +Landroidx/lifecycle/SavedStateHandlesProvider$$ExternalSyntheticLambda0; +SPLandroidx/lifecycle/SavedStateHandlesProvider$$ExternalSyntheticLambda0;->(Landroidx/lifecycle/ViewModelStoreOwner;)V +SPLandroidx/lifecycle/SavedStateHandlesProvider$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/lifecycle/SavedStateHandlesVM; +SPLandroidx/lifecycle/SavedStateHandlesVM;->()V +SPLandroidx/lifecycle/SavedStateHandlesVM;->getHandles()Ljava/util/Map; +Landroidx/lifecycle/SavedStateViewModelFactory; +SPLandroidx/lifecycle/SavedStateViewModelFactory;->(Landroid/app/Application;Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;)V +SPLandroidx/lifecycle/SavedStateViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/SavedStateViewModelFactory;->create(Lkotlin/reflect/KClass;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/SavedStateViewModelFactory_androidKt; +SPLandroidx/lifecycle/SavedStateViewModelFactory_androidKt;->()V +SPLandroidx/lifecycle/SavedStateViewModelFactory_androidKt;->access$getVIEWMODEL_SIGNATURE$p()Ljava/util/List; +SPLandroidx/lifecycle/SavedStateViewModelFactory_androidKt;->findMatchingConstructor(Ljava/lang/Class;Ljava/util/List;)Ljava/lang/reflect/Constructor; +Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/ViewModel;->()V +SPLandroidx/lifecycle/ViewModel;->addCloseable(Ljava/lang/String;Ljava/lang/AutoCloseable;)V +SPLandroidx/lifecycle/ViewModel;->getCloseable(Ljava/lang/String;)Ljava/lang/AutoCloseable; +Landroidx/lifecycle/ViewModelKt; +SPLandroidx/lifecycle/ViewModelKt;->()V +SPLandroidx/lifecycle/ViewModelKt;->getViewModelScope(Landroidx/lifecycle/ViewModel;)Lkotlinx/coroutines/CoroutineScope; +Landroidx/lifecycle/ViewModelLazy; +SPLandroidx/lifecycle/ViewModelLazy;->(Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V +SPLandroidx/lifecycle/ViewModelLazy;->getValue()Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/ViewModelLazy;->getValue()Ljava/lang/Object; +Landroidx/lifecycle/ViewModelProvider; +SPLandroidx/lifecycle/ViewModelProvider;->()V +SPLandroidx/lifecycle/ViewModelProvider;->(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;)V +SPLandroidx/lifecycle/ViewModelProvider;->(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;Landroidx/lifecycle/viewmodel/CreationExtras;)V +SPLandroidx/lifecycle/ViewModelProvider;->(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;Landroidx/lifecycle/viewmodel/CreationExtras;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/lifecycle/ViewModelProvider;->(Landroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl;)V +SPLandroidx/lifecycle/ViewModelProvider;->get(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/ViewModelProvider;->get(Ljava/lang/String;Lkotlin/reflect/KClass;)Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/ViewModelProvider;->get(Lkotlin/reflect/KClass;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory; +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->()V +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->(Landroid/app/Application;)V +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->(Landroid/app/Application;I)V +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->access$get_instance$cp()Landroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory; +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->access$set_instance$cp(Landroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;)V +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->create(Ljava/lang/Class;Landroid/app/Application;)Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory$Companion; +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory$Companion;->()V +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory$Companion;->getInstance(Landroid/app/Application;)Landroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory; +Landroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory$special$$inlined$Key$1; +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory$special$$inlined$Key$1;->()V +Landroidx/lifecycle/ViewModelProvider$Companion; +SPLandroidx/lifecycle/ViewModelProvider$Companion;->()V +SPLandroidx/lifecycle/ViewModelProvider$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/lifecycle/ViewModelProvider$Companion;->create$default(Landroidx/lifecycle/ViewModelProvider$Companion;Landroidx/lifecycle/ViewModelStoreOwner;Landroidx/lifecycle/ViewModelProvider$Factory;Landroidx/lifecycle/viewmodel/CreationExtras;ILjava/lang/Object;)Landroidx/lifecycle/ViewModelProvider; +SPLandroidx/lifecycle/ViewModelProvider$Companion;->create(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModelProvider; +SPLandroidx/lifecycle/ViewModelProvider$Companion;->create(Landroidx/lifecycle/ViewModelStoreOwner;Landroidx/lifecycle/ViewModelProvider$Factory;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModelProvider; +Landroidx/lifecycle/ViewModelProvider$Factory; +SPLandroidx/lifecycle/ViewModelProvider$Factory;->()V +SPLandroidx/lifecycle/ViewModelProvider$Factory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/ViewModelProvider$Factory;->create(Lkotlin/reflect/KClass;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/ViewModelProvider$Factory$Companion; +SPLandroidx/lifecycle/ViewModelProvider$Factory$Companion;->()V +SPLandroidx/lifecycle/ViewModelProvider$Factory$Companion;->()V +Landroidx/lifecycle/ViewModelProvider$NewInstanceFactory; +SPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->()V +SPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->()V +SPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/ViewModelProvider$NewInstanceFactory$Companion; +SPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory$Companion;->()V +SPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/lifecycle/ViewModelProvider$OnRequeryFactory; +SPLandroidx/lifecycle/ViewModelProvider$OnRequeryFactory;->()V +Landroidx/lifecycle/ViewModelProvider$special$$inlined$Key$1; +SPLandroidx/lifecycle/ViewModelProvider$special$$inlined$Key$1;->()V +Landroidx/lifecycle/ViewModelStore; +SPLandroidx/lifecycle/ViewModelStore;->()V +SPLandroidx/lifecycle/ViewModelStore;->get(Ljava/lang/Object;)Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/ViewModelStore;->put(Ljava/lang/Object;Landroidx/lifecycle/ViewModel;)V +Landroidx/lifecycle/ViewModelStoreOwner; +Landroidx/lifecycle/ViewModelStoreOwnerDefaults; +SPLandroidx/lifecycle/ViewModelStoreOwnerDefaults;->getViewModelCreationExtras(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/viewmodel/CreationExtras; +Landroidx/lifecycle/ViewTreeLifecycleOwner; +SPLandroidx/lifecycle/ViewTreeLifecycleOwner;->set(Landroid/view/View;Landroidx/lifecycle/LifecycleOwner;)V +Landroidx/lifecycle/ViewTreeViewModelStoreOwner; +SPLandroidx/lifecycle/ViewTreeViewModelStoreOwner;->set(Landroid/view/View;Landroidx/lifecycle/ViewModelStoreOwner;)V +Landroidx/lifecycle/WeakReference; +SPLandroidx/lifecycle/WeakReference;->(Ljava/lang/Object;)V +SPLandroidx/lifecycle/WeakReference;->get()Ljava/lang/Object; +Landroidx/lifecycle/internal/SavedStateHandleImpl; +SPLandroidx/lifecycle/internal/SavedStateHandleImpl;->(Ljava/util/Map;)V +SPLandroidx/lifecycle/internal/SavedStateHandleImpl;->getMutableStateFlow(Ljava/lang/String;Ljava/lang/Object;)Lkotlinx/coroutines/flow/MutableStateFlow; +Landroidx/lifecycle/internal/SavedStateHandleImpl$$ExternalSyntheticLambda0; +SPLandroidx/lifecycle/internal/SavedStateHandleImpl$$ExternalSyntheticLambda0;->(Landroidx/lifecycle/internal/SavedStateHandleImpl;)V +Landroidx/lifecycle/runtime/R$id; +Landroidx/lifecycle/viewmodel/CreationExtras; +SPLandroidx/lifecycle/viewmodel/CreationExtras;->()V +SPLandroidx/lifecycle/viewmodel/CreationExtras;->()V +SPLandroidx/lifecycle/viewmodel/CreationExtras;->getExtras$lifecycle_viewmodel()Ljava/util/Map; +Landroidx/lifecycle/viewmodel/CreationExtras$Companion; +SPLandroidx/lifecycle/viewmodel/CreationExtras$Companion;->()V +SPLandroidx/lifecycle/viewmodel/CreationExtras$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/lifecycle/viewmodel/CreationExtras$Empty; +SPLandroidx/lifecycle/viewmodel/CreationExtras$Empty;->()V +SPLandroidx/lifecycle/viewmodel/CreationExtras$Empty;->()V +Landroidx/lifecycle/viewmodel/CreationExtras$Key; +Landroidx/lifecycle/viewmodel/InitializerViewModelFactory; +SPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;->([Landroidx/lifecycle/viewmodel/ViewModelInitializer;)V +SPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/viewmodel/InitializerViewModelFactoryBuilder; +SPLandroidx/lifecycle/viewmodel/InitializerViewModelFactoryBuilder;->()V +SPLandroidx/lifecycle/viewmodel/InitializerViewModelFactoryBuilder;->addInitializer(Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/lifecycle/viewmodel/InitializerViewModelFactoryBuilder;->build()Landroidx/lifecycle/ViewModelProvider$Factory; +Landroidx/lifecycle/viewmodel/MutableCreationExtras; +SPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->(Landroidx/lifecycle/viewmodel/CreationExtras;)V +SPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->(Landroidx/lifecycle/viewmodel/CreationExtras;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->(Ljava/util/Map;)V +SPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->get(Landroidx/lifecycle/viewmodel/CreationExtras$Key;)Ljava/lang/Object; +SPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->set(Landroidx/lifecycle/viewmodel/CreationExtras$Key;Ljava/lang/Object;)V +Landroidx/lifecycle/viewmodel/R$id; +Landroidx/lifecycle/viewmodel/ViewModelInitializer; +SPLandroidx/lifecycle/viewmodel/ViewModelInitializer;->(Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/lifecycle/viewmodel/ViewModelInitializer;->getClazz$lifecycle_viewmodel()Lkotlin/reflect/KClass; +SPLandroidx/lifecycle/viewmodel/ViewModelInitializer;->getInitializer$lifecycle_viewmodel()Lkotlin/jvm/functions/Function1; +Landroidx/lifecycle/viewmodel/internal/CanonicalName_jvmKt; +SPLandroidx/lifecycle/viewmodel/internal/CanonicalName_jvmKt;->getCanonicalName(Lkotlin/reflect/KClass;)Ljava/lang/String; +Landroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope; +SPLandroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope;->(Lkotlin/coroutines/CoroutineContext;)V +SPLandroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; +Landroidx/lifecycle/viewmodel/internal/CloseableCoroutineScopeKt; +SPLandroidx/lifecycle/viewmodel/internal/CloseableCoroutineScopeKt;->createViewModelScope()Landroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope; +Landroidx/lifecycle/viewmodel/internal/JvmViewModelProviders; +SPLandroidx/lifecycle/viewmodel/internal/JvmViewModelProviders;->()V +SPLandroidx/lifecycle/viewmodel/internal/JvmViewModelProviders;->()V +SPLandroidx/lifecycle/viewmodel/internal/JvmViewModelProviders;->createViewModel(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/viewmodel/internal/SynchronizedObject; +SPLandroidx/lifecycle/viewmodel/internal/SynchronizedObject;->()V +Landroidx/lifecycle/viewmodel/internal/ViewModelImpl; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->()V +SPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->access$getKeyToCloseables$p(Landroidx/lifecycle/viewmodel/internal/ViewModelImpl;)Ljava/util/Map; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->addCloseable(Ljava/lang/String;Ljava/lang/AutoCloseable;)V +SPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->closeWithRuntimeException(Ljava/lang/AutoCloseable;)V +SPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->getCloseable(Ljava/lang/String;)Ljava/lang/AutoCloseable; +Landroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl;->(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;Landroidx/lifecycle/viewmodel/CreationExtras;)V +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl;->access$getDefaultExtras$p(Landroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl;)Landroidx/lifecycle/viewmodel/CreationExtras; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl;->access$getFactory$p(Landroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl;)Landroidx/lifecycle/ViewModelProvider$Factory; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl;->access$getStore$p(Landroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl;)Landroidx/lifecycle/ViewModelStore; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl;->getViewModel$lifecycle_viewmodel$default(Landroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl;Lkotlin/reflect/KClass;Ljava/lang/String;ILjava/lang/Object;)Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl;->getViewModel$lifecycle_viewmodel(Lkotlin/reflect/KClass;Ljava/lang/String;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl_androidKt; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviderImpl_androidKt;->createViewModel(Landroidx/lifecycle/ViewModelProvider$Factory;Lkotlin/reflect/KClass;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/viewmodel/internal/ViewModelProviders; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviders;->()V +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviders;->()V +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviders;->createInitializerFactory$lifecycle_viewmodel(Ljava/util/Collection;)Landroidx/lifecycle/ViewModelProvider$Factory; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviders;->createViewModelFromInitializers$lifecycle_viewmodel(Lkotlin/reflect/KClass;Landroidx/lifecycle/viewmodel/CreationExtras;[Landroidx/lifecycle/viewmodel/ViewModelInitializer;)Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelProviders;->getDefaultKey$lifecycle_viewmodel(Lkotlin/reflect/KClass;)Ljava/lang/String; +Landroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$1()I +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$10()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$11()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$12()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$2()I +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$2()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$3()I +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$3()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$4()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$5()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$6()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$7()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$8()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m$9()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;Landroid/app/Application$ActivityLifecycleCallbacks;)V +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/Looper;)Landroid/os/Handler; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;)Landroid/view/WindowInsetsController; +SPLandroidx/media3/common/AudioAttributes$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsetsController;II)V +PLandroidx/media3/exoplayer/dash/offline/DashDownloader$$ExternalSyntheticLambda1;->()V +Landroidx/navigationevent/NavigationEventDispatcher; +SPLandroidx/navigationevent/NavigationEventDispatcher;->()V +SPLandroidx/navigationevent/NavigationEventDispatcher;->(Landroidx/navigationevent/NavigationEventDispatcher;Landroidx/navigationevent/OnBackCompletedFallback;)V +SPLandroidx/navigationevent/NavigationEventDispatcher;->(Landroidx/navigationevent/OnBackCompletedFallback;)V +SPLandroidx/navigationevent/NavigationEventDispatcher;->addHandler$default(Landroidx/navigationevent/NavigationEventDispatcher;Landroidx/navigationevent/NavigationEventHandler;IILjava/lang/Object;)V +SPLandroidx/navigationevent/NavigationEventDispatcher;->addHandler(Landroidx/navigationevent/NavigationEventHandler;I)V +SPLandroidx/navigationevent/NavigationEventDispatcher;->addInput(Landroidx/navigationevent/NavigationEventInput;)V +SPLandroidx/navigationevent/NavigationEventDispatcher;->addInput(Landroidx/navigationevent/NavigationEventInput;I)V +SPLandroidx/navigationevent/NavigationEventDispatcher;->checkInvariants()V +SPLandroidx/navigationevent/NavigationEventDispatcher;->getSharedProcessor$navigationevent()Landroidx/navigationevent/NavigationEventProcessor; +SPLandroidx/navigationevent/NavigationEventDispatcher;->isDisposed()Z +SPLandroidx/navigationevent/NavigationEventDispatcher;->isEnabled()Z +Landroidx/navigationevent/NavigationEventDispatcher$Companion; +SPLandroidx/navigationevent/NavigationEventDispatcher$Companion;->()V +SPLandroidx/navigationevent/NavigationEventDispatcher$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/navigationevent/NavigationEventDispatcherOwner; +Landroidx/navigationevent/NavigationEventHandler; +SPLandroidx/navigationevent/NavigationEventHandler;->(Landroidx/navigationevent/NavigationEventInfo;Z)V +SPLandroidx/navigationevent/NavigationEventHandler;->(Landroidx/navigationevent/NavigationEventInfo;ZZ)V +SPLandroidx/navigationevent/NavigationEventHandler;->getBackInfo()Ljava/util/List; +SPLandroidx/navigationevent/NavigationEventHandler;->getCurrentInfo()Landroidx/navigationevent/NavigationEventInfo; +SPLandroidx/navigationevent/NavigationEventHandler;->getDispatcher$navigationevent()Landroidx/navigationevent/NavigationEventDispatcher; +SPLandroidx/navigationevent/NavigationEventHandler;->getForwardInfo()Ljava/util/List; +SPLandroidx/navigationevent/NavigationEventHandler;->isBackEnabled()Z +SPLandroidx/navigationevent/NavigationEventHandler;->isForwardEnabled()Z +SPLandroidx/navigationevent/NavigationEventHandler;->setBackEnabled(Z)V +SPLandroidx/navigationevent/NavigationEventHandler;->setDispatcher$navigationevent(Landroidx/navigationevent/NavigationEventDispatcher;)V +Landroidx/navigationevent/NavigationEventHistory; +SPLandroidx/navigationevent/NavigationEventHistory;->()V +SPLandroidx/navigationevent/NavigationEventHistory;->(Landroidx/navigationevent/NavigationEventInfo;Ljava/util/List;Ljava/util/List;)V +SPLandroidx/navigationevent/NavigationEventHistory;->(Ljava/util/List;I)V +SPLandroidx/navigationevent/NavigationEventHistory;->equals(Ljava/lang/Object;)Z +Landroidx/navigationevent/NavigationEventInfo; +SPLandroidx/navigationevent/NavigationEventInfo;->()V +Landroidx/navigationevent/NavigationEventInput; +SPLandroidx/navigationevent/NavigationEventInput;->()V +SPLandroidx/navigationevent/NavigationEventInput;->doOnAdded$navigationevent(Landroidx/navigationevent/NavigationEventDispatcher;)V +SPLandroidx/navigationevent/NavigationEventInput;->doOnHasEnabledHandlersChanged$navigationevent(Z)V +SPLandroidx/navigationevent/NavigationEventInput;->doOnHistoryChanged$navigationevent(Landroidx/navigationevent/NavigationEventHistory;)V +SPLandroidx/navigationevent/NavigationEventInput;->getDispatcher$navigationevent()Landroidx/navigationevent/NavigationEventDispatcher; +SPLandroidx/navigationevent/NavigationEventInput;->onAdded(Landroidx/navigationevent/NavigationEventDispatcher;)V +SPLandroidx/navigationevent/NavigationEventInput;->onHistoryChanged(Landroidx/navigationevent/NavigationEventHistory;)V +SPLandroidx/navigationevent/NavigationEventInput;->setDispatcher$navigationevent(Landroidx/navigationevent/NavigationEventDispatcher;)V +Landroidx/navigationevent/NavigationEventProcessor; +SPLandroidx/navigationevent/NavigationEventProcessor;->()V +SPLandroidx/navigationevent/NavigationEventProcessor;->addHandler(Landroidx/navigationevent/NavigationEventDispatcher;Landroidx/navigationevent/NavigationEventHandler;I)V +SPLandroidx/navigationevent/NavigationEventProcessor;->addInput(Landroidx/navigationevent/NavigationEventDispatcher;Landroidx/navigationevent/NavigationEventInput;I)V +SPLandroidx/navigationevent/NavigationEventProcessor;->refreshEnabledHandlers()V +SPLandroidx/navigationevent/NavigationEventProcessor;->resolveCombinedBackInfo()Ljava/util/List; +SPLandroidx/navigationevent/NavigationEventProcessor;->resolveEnabledHandler$default(Landroidx/navigationevent/NavigationEventProcessor;IILjava/lang/Object;)Landroidx/navigationevent/NavigationEventHandler; +SPLandroidx/navigationevent/NavigationEventProcessor;->resolveEnabledHandler(I)Landroidx/navigationevent/NavigationEventHandler; +SPLandroidx/navigationevent/NavigationEventProcessor;->updateEnabledHandlerInfo$navigationevent(Landroidx/navigationevent/NavigationEventHandler;)V +Landroidx/navigationevent/NavigationEventTransitionState; +SPLandroidx/navigationevent/NavigationEventTransitionState;->()V +SPLandroidx/navigationevent/NavigationEventTransitionState;->()V +SPLandroidx/navigationevent/NavigationEventTransitionState;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/navigationevent/NavigationEventTransitionState$Companion; +SPLandroidx/navigationevent/NavigationEventTransitionState$Companion;->()V +SPLandroidx/navigationevent/NavigationEventTransitionState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/navigationevent/NavigationEventTransitionState$Idle; +SPLandroidx/navigationevent/NavigationEventTransitionState$Idle;->()V +SPLandroidx/navigationevent/NavigationEventTransitionState$Idle;->()V +Landroidx/navigationevent/OnBackCompletedFallback; +Landroidx/navigationevent/OnBackInvokedDefaultInput; +SPLandroidx/navigationevent/OnBackInvokedDefaultInput;->(Landroid/window/OnBackInvokedDispatcher;)V +Landroidx/navigationevent/OnBackInvokedInput; +SPLandroidx/navigationevent/OnBackInvokedInput;->(Landroid/window/OnBackInvokedDispatcher;I)V +SPLandroidx/navigationevent/OnBackInvokedInput;->(Landroid/window/OnBackInvokedDispatcher;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/navigationevent/OnBackInvokedInput;->createOnBackAnimationCallback()Landroid/window/OnBackInvokedCallback; +SPLandroidx/navigationevent/OnBackInvokedInput;->onHasEnabledHandlersChanged(Z)V +SPLandroidx/navigationevent/OnBackInvokedInput;->updateBackInvokedCallbackState(Z)V +Landroidx/navigationevent/OnBackInvokedInput$createOnBackAnimationCallback$1; +SPLandroidx/navigationevent/OnBackInvokedInput$createOnBackAnimationCallback$1;->(Landroidx/navigationevent/OnBackInvokedInput;)V +Landroidx/navigationevent/OnBackInvokedOverlayInput; +SPLandroidx/navigationevent/OnBackInvokedOverlayInput;->(Landroid/window/OnBackInvokedDispatcher;)V +Landroidx/navigationevent/R$id; +Landroidx/navigationevent/ViewTreeNavigationEventDispatcherOwner; +SPLandroidx/navigationevent/ViewTreeNavigationEventDispatcherOwner;->set(Landroid/view/View;Landroidx/navigationevent/NavigationEventDispatcherOwner;)V +Landroidx/preference/PreferenceManager; +SPLandroidx/preference/PreferenceManager;->getDefaultSharedPreferences(Landroid/content/Context;)Landroid/content/SharedPreferences; +SPLandroidx/preference/PreferenceManager;->getDefaultSharedPreferencesMode()I +SPLandroidx/preference/PreferenceManager;->getDefaultSharedPreferencesName(Landroid/content/Context;)Ljava/lang/String; +PLandroidx/profileinstaller/ProfileInstallReceiver;->()V +PLandroidx/profileinstaller/ProfileInstallReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V +PLandroidx/profileinstaller/ProfileInstallReceiver;->saveProfile(ILandroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;)V +PLandroidx/profileinstaller/ProfileInstallReceiver;->saveProfile(Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;)V +PLandroidx/profileinstaller/ProfileInstallReceiver$ResultDiagnostics;->(Landroidx/profileinstaller/ProfileInstallReceiver;)V +PLandroidx/profileinstaller/ProfileInstallReceiver$ResultDiagnostics;->onResultReceived(ILjava/lang/Object;)V +PLandroidx/profileinstaller/ProfileInstaller;->()V +PLandroidx/profileinstaller/ProfileInstaller;->hasAlreadyWrittenProfileForThisInstall(Landroid/content/pm/PackageInfo;Ljava/io/File;Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;)Z +PLandroidx/profileinstaller/ProfileInstaller;->writeProfile(Landroid/content/Context;)V +PLandroidx/profileinstaller/ProfileInstaller;->writeProfile(Landroid/content/Context;Ljava/util/concurrent/Executor;Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;)V +PLandroidx/profileinstaller/ProfileInstaller;->writeProfile(Landroid/content/Context;Ljava/util/concurrent/Executor;Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;Z)V +PLandroidx/profileinstaller/ProfileInstaller$1;->()V +PLandroidx/profileinstaller/ProfileInstaller$1;->onResultReceived(ILjava/lang/Object;)V +PLandroidx/profileinstaller/ProfileInstaller$2;->()V +PLandroidx/profileinstaller/ProfileInstaller$2;->onResultReceived(ILjava/lang/Object;)V +Landroidx/profileinstaller/ProfileInstallerInitializer; +SPLandroidx/profileinstaller/ProfileInstallerInitializer;->()V +SPLandroidx/profileinstaller/ProfileInstallerInitializer;->create(Landroid/content/Context;)Landroidx/profileinstaller/ProfileInstallerInitializer$Result; +SPLandroidx/profileinstaller/ProfileInstallerInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; +SPLandroidx/profileinstaller/ProfileInstallerInitializer;->dependencies()Ljava/util/List; +SPLandroidx/profileinstaller/ProfileInstallerInitializer;->installAfterDelay(Landroid/content/Context;)V +SPLandroidx/profileinstaller/ProfileInstallerInitializer;->lambda$create$0$androidx-profileinstaller-ProfileInstallerInitializer(Landroid/content/Context;J)V +PLandroidx/profileinstaller/ProfileInstallerInitializer;->lambda$installAfterDelay$1(Landroid/content/Context;)V +PLandroidx/profileinstaller/ProfileInstallerInitializer;->lambda$writeInBackground$2(Landroid/content/Context;)V +PLandroidx/profileinstaller/ProfileInstallerInitializer;->writeInBackground(Landroid/content/Context;)V +Landroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0; +SPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->(Landroidx/profileinstaller/ProfileInstallerInitializer;Landroid/content/Context;)V +SPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->doFrame(J)V +Landroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1; +SPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1;->(Landroid/content/Context;)V +PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1;->run()V +PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda2;->(Landroid/content/Context;)V +PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda2;->run()V +Landroidx/profileinstaller/ProfileInstallerInitializer$Handler28Impl; +SPLandroidx/profileinstaller/ProfileInstallerInitializer$Handler28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; +Landroidx/profileinstaller/ProfileInstallerInitializer$Result; +SPLandroidx/profileinstaller/ProfileInstallerInitializer$Result;->()V +PLandroidx/profileinstaller/ProfileVerifier;->()V +PLandroidx/profileinstaller/ProfileVerifier;->getPackageLastUpdateTime(Landroid/content/Context;)J +PLandroidx/profileinstaller/ProfileVerifier;->setCompilationStatus(IZZZ)Landroidx/profileinstaller/ProfileVerifier$CompilationStatus; +PLandroidx/profileinstaller/ProfileVerifier;->writeProfileVerification(Landroid/content/Context;Z)Landroidx/profileinstaller/ProfileVerifier$CompilationStatus; +PLandroidx/profileinstaller/ProfileVerifier$Api33Impl;->getPackageInfo(Landroid/content/pm/PackageManager;Landroid/content/Context;)Landroid/content/pm/PackageInfo; +PLandroidx/profileinstaller/ProfileVerifier$Cache;->(IIJJ)V +PLandroidx/profileinstaller/ProfileVerifier$Cache;->equals(Ljava/lang/Object;)Z +PLandroidx/profileinstaller/ProfileVerifier$Cache;->readFromFile(Ljava/io/File;)Landroidx/profileinstaller/ProfileVerifier$Cache; +PLandroidx/profileinstaller/ProfileVerifier$Cache;->writeOnFile(Ljava/io/File;)V +PLandroidx/profileinstaller/ProfileVerifier$CompilationStatus;->(IZZZ)V +Landroidx/recyclerview/R$attr; +Landroidx/recyclerview/R$styleable; +SPLandroidx/recyclerview/R$styleable;->()V +Landroidx/recyclerview/widget/AdapterHelper; +SPLandroidx/recyclerview/widget/AdapterHelper;->(Landroidx/recyclerview/widget/AdapterHelper$Callback;)V +SPLandroidx/recyclerview/widget/AdapterHelper;->(Landroidx/recyclerview/widget/AdapterHelper$Callback;Z)V +SPLandroidx/recyclerview/widget/AdapterHelper;->applyAdd(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V +SPLandroidx/recyclerview/widget/AdapterHelper;->consumePostponedUpdates()V +SPLandroidx/recyclerview/widget/AdapterHelper;->consumeUpdatesInOnePass()V +SPLandroidx/recyclerview/widget/AdapterHelper;->findPositionOffset(I)I +SPLandroidx/recyclerview/widget/AdapterHelper;->findPositionOffset(II)I +SPLandroidx/recyclerview/widget/AdapterHelper;->hasPendingUpdates()Z +SPLandroidx/recyclerview/widget/AdapterHelper;->obtainUpdateOp(IIILjava/lang/Object;)Landroidx/recyclerview/widget/AdapterHelper$UpdateOp; +SPLandroidx/recyclerview/widget/AdapterHelper;->onItemRangeChanged(IILjava/lang/Object;)Z +SPLandroidx/recyclerview/widget/AdapterHelper;->onItemRangeInserted(II)Z +SPLandroidx/recyclerview/widget/AdapterHelper;->postponeAndUpdateViewHolders(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V +SPLandroidx/recyclerview/widget/AdapterHelper;->preProcess()V +SPLandroidx/recyclerview/widget/AdapterHelper;->recycleUpdateOp(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V +SPLandroidx/recyclerview/widget/AdapterHelper;->recycleUpdateOpsAndClearList(Ljava/util/List;)V +SPLandroidx/recyclerview/widget/AdapterHelper;->reset()V +Landroidx/recyclerview/widget/AdapterHelper$Callback; +Landroidx/recyclerview/widget/AdapterHelper$UpdateOp; +SPLandroidx/recyclerview/widget/AdapterHelper$UpdateOp;->(IIILjava/lang/Object;)V +Landroidx/recyclerview/widget/AdapterListUpdateCallback; +SPLandroidx/recyclerview/widget/AdapterListUpdateCallback;->(Landroidx/recyclerview/widget/RecyclerView$Adapter;)V +SPLandroidx/recyclerview/widget/AdapterListUpdateCallback;->onInserted(II)V +Landroidx/recyclerview/widget/AsyncDifferConfig; +SPLandroidx/recyclerview/widget/AsyncDifferConfig;->(Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;Landroidx/recyclerview/widget/DiffUtil$ItemCallback;)V +SPLandroidx/recyclerview/widget/AsyncDifferConfig;->getBackgroundThreadExecutor()Ljava/util/concurrent/Executor; +SPLandroidx/recyclerview/widget/AsyncDifferConfig;->getMainThreadExecutor()Ljava/util/concurrent/Executor; +Landroidx/recyclerview/widget/AsyncDifferConfig$Builder; +SPLandroidx/recyclerview/widget/AsyncDifferConfig$Builder;->()V +SPLandroidx/recyclerview/widget/AsyncDifferConfig$Builder;->(Landroidx/recyclerview/widget/DiffUtil$ItemCallback;)V +SPLandroidx/recyclerview/widget/AsyncDifferConfig$Builder;->build()Landroidx/recyclerview/widget/AsyncDifferConfig; +Landroidx/recyclerview/widget/AsyncListDiffer; +SPLandroidx/recyclerview/widget/AsyncListDiffer;->()V +SPLandroidx/recyclerview/widget/AsyncListDiffer;->(Landroidx/recyclerview/widget/ListUpdateCallback;Landroidx/recyclerview/widget/AsyncDifferConfig;)V +SPLandroidx/recyclerview/widget/AsyncListDiffer;->addListListener(Landroidx/recyclerview/widget/AsyncListDiffer$ListListener;)V +SPLandroidx/recyclerview/widget/AsyncListDiffer;->getCurrentList()Ljava/util/List; +SPLandroidx/recyclerview/widget/AsyncListDiffer;->latchList(Ljava/util/List;Landroidx/recyclerview/widget/DiffUtil$DiffResult;Ljava/lang/Runnable;)V +SPLandroidx/recyclerview/widget/AsyncListDiffer;->onCurrentListChanged(Ljava/util/List;Ljava/lang/Runnable;)V +SPLandroidx/recyclerview/widget/AsyncListDiffer;->submitList(Ljava/util/List;)V +SPLandroidx/recyclerview/widget/AsyncListDiffer;->submitList(Ljava/util/List;Ljava/lang/Runnable;)V +Landroidx/recyclerview/widget/AsyncListDiffer$1; +SPLandroidx/recyclerview/widget/AsyncListDiffer$1;->(Landroidx/recyclerview/widget/AsyncListDiffer;Ljava/util/List;Ljava/util/List;ILjava/lang/Runnable;)V +SPLandroidx/recyclerview/widget/AsyncListDiffer$1;->run()V +Landroidx/recyclerview/widget/AsyncListDiffer$1$1; +SPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->(Landroidx/recyclerview/widget/AsyncListDiffer$1;)V +SPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->getNewListSize()I +SPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->getOldListSize()I +Landroidx/recyclerview/widget/AsyncListDiffer$1$2; +SPLandroidx/recyclerview/widget/AsyncListDiffer$1$2;->(Landroidx/recyclerview/widget/AsyncListDiffer$1;Landroidx/recyclerview/widget/DiffUtil$DiffResult;)V +SPLandroidx/recyclerview/widget/AsyncListDiffer$1$2;->run()V +Landroidx/recyclerview/widget/AsyncListDiffer$ListListener; +Landroidx/recyclerview/widget/AsyncListDiffer$MainThreadExecutor; +SPLandroidx/recyclerview/widget/AsyncListDiffer$MainThreadExecutor;->()V +SPLandroidx/recyclerview/widget/AsyncListDiffer$MainThreadExecutor;->execute(Ljava/lang/Runnable;)V +Landroidx/recyclerview/widget/BatchingListUpdateCallback; +SPLandroidx/recyclerview/widget/BatchingListUpdateCallback;->(Landroidx/recyclerview/widget/ListUpdateCallback;)V +SPLandroidx/recyclerview/widget/BatchingListUpdateCallback;->dispatchLastEvent()V +SPLandroidx/recyclerview/widget/BatchingListUpdateCallback;->onInserted(II)V +Landroidx/recyclerview/widget/ChildHelper; +SPLandroidx/recyclerview/widget/ChildHelper;->(Landroidx/recyclerview/widget/ChildHelper$Callback;)V +SPLandroidx/recyclerview/widget/ChildHelper;->addView(Landroid/view/View;IZ)V +SPLandroidx/recyclerview/widget/ChildHelper;->attachViewToParent(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;Z)V +SPLandroidx/recyclerview/widget/ChildHelper;->detachViewFromParent(I)V +SPLandroidx/recyclerview/widget/ChildHelper;->findHiddenNonRemovedView(I)Landroid/view/View; +SPLandroidx/recyclerview/widget/ChildHelper;->getChildAt(I)Landroid/view/View; +SPLandroidx/recyclerview/widget/ChildHelper;->getChildCount()I +SPLandroidx/recyclerview/widget/ChildHelper;->getOffset(I)I +SPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildAt(I)Landroid/view/View; +SPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildCount()I +SPLandroidx/recyclerview/widget/ChildHelper;->isHidden(Landroid/view/View;)Z +SPLandroidx/recyclerview/widget/ChildHelper;->removeAllViewsUnfiltered()V +SPLandroidx/recyclerview/widget/ChildHelper;->removeViewIfHidden(Landroid/view/View;)Z +Landroidx/recyclerview/widget/ChildHelper$Bucket; +SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->()V +SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->clear(I)V +SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->countOnesBefore(I)I +SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->get(I)Z +SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->insert(IZ)V +SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->remove(I)Z +SPLandroidx/recyclerview/widget/ChildHelper$Bucket;->reset()V +Landroidx/recyclerview/widget/ChildHelper$Callback; +Landroidx/recyclerview/widget/DefaultItemAnimator; +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->()V +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->animateAdd(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->animateAddImpl(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->dispatchFinishedWhenDone()V +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->endAnimation(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->endAnimations()V +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->endChangeAnimation(Ljava/util/List;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->isRunning()Z +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->resetAnimation(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/DefaultItemAnimator;->runPendingAnimations()V +Landroidx/recyclerview/widget/DefaultItemAnimator$3; +SPLandroidx/recyclerview/widget/DefaultItemAnimator$3;->(Landroidx/recyclerview/widget/DefaultItemAnimator;Ljava/util/ArrayList;)V +SPLandroidx/recyclerview/widget/DefaultItemAnimator$3;->run()V +Landroidx/recyclerview/widget/DefaultItemAnimator$5; +SPLandroidx/recyclerview/widget/DefaultItemAnimator$5;->(Landroidx/recyclerview/widget/DefaultItemAnimator;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroid/view/View;Landroid/view/ViewPropertyAnimator;)V +SPLandroidx/recyclerview/widget/DefaultItemAnimator$5;->onAnimationEnd(Landroid/animation/Animator;)V +SPLandroidx/recyclerview/widget/DefaultItemAnimator$5;->onAnimationStart(Landroid/animation/Animator;)V +Landroidx/recyclerview/widget/DiffUtil; +SPLandroidx/recyclerview/widget/DiffUtil;->()V +SPLandroidx/recyclerview/widget/DiffUtil;->calculateDiff(Landroidx/recyclerview/widget/DiffUtil$Callback;)Landroidx/recyclerview/widget/DiffUtil$DiffResult; +SPLandroidx/recyclerview/widget/DiffUtil;->calculateDiff(Landroidx/recyclerview/widget/DiffUtil$Callback;Z)Landroidx/recyclerview/widget/DiffUtil$DiffResult; +SPLandroidx/recyclerview/widget/DiffUtil;->midPoint(Landroidx/recyclerview/widget/DiffUtil$Range;Landroidx/recyclerview/widget/DiffUtil$Callback;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;)Landroidx/recyclerview/widget/DiffUtil$Snake; +Landroidx/recyclerview/widget/DiffUtil$1; +SPLandroidx/recyclerview/widget/DiffUtil$1;->()V +Landroidx/recyclerview/widget/DiffUtil$Callback; +SPLandroidx/recyclerview/widget/DiffUtil$Callback;->()V +Landroidx/recyclerview/widget/DiffUtil$CenteredArray; +SPLandroidx/recyclerview/widget/DiffUtil$CenteredArray;->(I)V +SPLandroidx/recyclerview/widget/DiffUtil$CenteredArray;->backingData()[I +Landroidx/recyclerview/widget/DiffUtil$Diagonal; +SPLandroidx/recyclerview/widget/DiffUtil$Diagonal;->(III)V +SPLandroidx/recyclerview/widget/DiffUtil$Diagonal;->endX()I +SPLandroidx/recyclerview/widget/DiffUtil$Diagonal;->endY()I +Landroidx/recyclerview/widget/DiffUtil$DiffResult; +SPLandroidx/recyclerview/widget/DiffUtil$DiffResult;->(Landroidx/recyclerview/widget/DiffUtil$Callback;Ljava/util/List;[I[IZ)V +SPLandroidx/recyclerview/widget/DiffUtil$DiffResult;->addEdgeDiagonals()V +SPLandroidx/recyclerview/widget/DiffUtil$DiffResult;->dispatchUpdatesTo(Landroidx/recyclerview/widget/ListUpdateCallback;)V +SPLandroidx/recyclerview/widget/DiffUtil$DiffResult;->findMatchingItems()V +SPLandroidx/recyclerview/widget/DiffUtil$DiffResult;->findMoveMatches()V +Landroidx/recyclerview/widget/DiffUtil$ItemCallback; +SPLandroidx/recyclerview/widget/DiffUtil$ItemCallback;->()V +Landroidx/recyclerview/widget/DiffUtil$Range; +SPLandroidx/recyclerview/widget/DiffUtil$Range;->(IIII)V +SPLandroidx/recyclerview/widget/DiffUtil$Range;->oldSize()I +Landroidx/recyclerview/widget/GapWorker; +SPLandroidx/recyclerview/widget/GapWorker;->()V +SPLandroidx/recyclerview/widget/GapWorker;->()V +SPLandroidx/recyclerview/widget/GapWorker;->add(Landroidx/recyclerview/widget/RecyclerView;)V +Landroidx/recyclerview/widget/GapWorker$1; +SPLandroidx/recyclerview/widget/GapWorker$1;->()V +Landroidx/recyclerview/widget/GapWorker$LayoutPrefetchRegistryImpl; +SPLandroidx/recyclerview/widget/GapWorker$LayoutPrefetchRegistryImpl;->()V +SPLandroidx/recyclerview/widget/GapWorker$LayoutPrefetchRegistryImpl;->clearPrefetchPositions()V +Landroidx/recyclerview/widget/ItemTouchHelper$ViewDropHandler; +Landroidx/recyclerview/widget/LinearLayoutManager; +SPLandroidx/recyclerview/widget/LinearLayoutManager;->(Landroid/content/Context;)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->(Landroid/content/Context;IZ)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->assertNotInLayoutOrScroll(Ljava/lang/String;)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->calculateExtraLayoutSpace(Landroidx/recyclerview/widget/RecyclerView$State;[I)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->canScrollHorizontally()Z +SPLandroidx/recyclerview/widget/LinearLayoutManager;->canScrollVertically()Z +SPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->computeVerticalScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->computeVerticalScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->computeVerticalScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->createLayoutState()Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState; +SPLandroidx/recyclerview/widget/LinearLayoutManager;->ensureLayoutState()V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->fill(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;Landroidx/recyclerview/widget/RecyclerView$State;Z)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstCompletelyVisibleItemPosition()I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstVisibleChildClosestToEnd(ZZ)Landroid/view/View; +SPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstVisibleChildClosestToStart(ZZ)Landroid/view/View; +SPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstVisibleItemPosition()I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->findLastVisibleItemPosition()I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->findOneVisibleChild(IIZZ)Landroid/view/View; +SPLandroidx/recyclerview/widget/LinearLayoutManager;->findReferenceChild(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;ZZ)Landroid/view/View; +SPLandroidx/recyclerview/widget/LinearLayoutManager;->fixLayoutEndGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->fixLayoutStartGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->getChildClosestToEnd()Landroid/view/View; +SPLandroidx/recyclerview/widget/LinearLayoutManager;->getChildClosestToStart()Landroid/view/View; +SPLandroidx/recyclerview/widget/LinearLayoutManager;->getExtraLayoutSpace(Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->isAutoMeasureEnabled()Z +SPLandroidx/recyclerview/widget/LinearLayoutManager;->isLayoutRTL()Z +SPLandroidx/recyclerview/widget/LinearLayoutManager;->layoutChunk(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult;)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->layoutForPredictiveAnimations(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;II)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->onAnchorReady(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;I)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->recycleByLayoutState(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->recycleChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;II)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->recycleViewsFromEnd(Landroidx/recyclerview/widget/RecyclerView$Recycler;II)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->recycleViewsFromStart(Landroidx/recyclerview/widget/RecyclerView$Recycler;II)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->resolveIsInfinite()Z +SPLandroidx/recyclerview/widget/LinearLayoutManager;->resolveShouldLayoutReverse()V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->scrollBy(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/LinearLayoutManager;->scrollToPositionWithOffset(II)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->setOrientation(I)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->setReverseLayout(Z)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->supportsPredictiveItemAnimations()Z +SPLandroidx/recyclerview/widget/LinearLayoutManager;->updateAnchorFromChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;)Z +SPLandroidx/recyclerview/widget/LinearLayoutManager;->updateAnchorFromPendingData(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;)Z +SPLandroidx/recyclerview/widget/LinearLayoutManager;->updateAnchorInfoForLayout(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutState(IIZLandroidx/recyclerview/widget/RecyclerView$State;)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutStateToFillEnd(II)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutStateToFillEnd(Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutStateToFillStart(II)V +SPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutStateToFillStart(Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;)V +Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo; +SPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->()V +SPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->assignCoordinateFromPadding()V +SPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->assignFromView(Landroid/view/View;I)V +SPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->reset()V +Landroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult; +SPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult;->()V +SPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult;->resetInternal()V +Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState; +SPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->()V +SPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->hasMore(Landroidx/recyclerview/widget/RecyclerView$State;)Z +SPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->next(Landroidx/recyclerview/widget/RecyclerView$Recycler;)Landroid/view/View; +Landroidx/recyclerview/widget/LinearLayoutManager$SavedState; +Landroidx/recyclerview/widget/ListAdapter; +SPLandroidx/recyclerview/widget/ListAdapter;->(Landroidx/recyclerview/widget/DiffUtil$ItemCallback;)V +SPLandroidx/recyclerview/widget/ListAdapter;->getItem(I)Ljava/lang/Object; +SPLandroidx/recyclerview/widget/ListAdapter;->getItemCount()I +SPLandroidx/recyclerview/widget/ListAdapter;->onCurrentListChanged(Ljava/util/List;Ljava/util/List;)V +SPLandroidx/recyclerview/widget/ListAdapter;->submitList(Ljava/util/List;)V +Landroidx/recyclerview/widget/ListAdapter$1; +SPLandroidx/recyclerview/widget/ListAdapter$1;->(Landroidx/recyclerview/widget/ListAdapter;)V +SPLandroidx/recyclerview/widget/ListAdapter$1;->onCurrentListChanged(Ljava/util/List;Ljava/util/List;)V +Landroidx/recyclerview/widget/ListUpdateCallback; +Landroidx/recyclerview/widget/OpReorderer; +SPLandroidx/recyclerview/widget/OpReorderer;->(Landroidx/recyclerview/widget/OpReorderer$Callback;)V +SPLandroidx/recyclerview/widget/OpReorderer;->getLastMoveOutOfOrder(Ljava/util/List;)I +SPLandroidx/recyclerview/widget/OpReorderer;->reorderOps(Ljava/util/List;)V +Landroidx/recyclerview/widget/OpReorderer$Callback; +Landroidx/recyclerview/widget/OrientationHelper; +SPLandroidx/recyclerview/widget/OrientationHelper;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V +SPLandroidx/recyclerview/widget/OrientationHelper;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;Landroidx/recyclerview/widget/OrientationHelper$1;)V +SPLandroidx/recyclerview/widget/OrientationHelper;->createOrientationHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;I)Landroidx/recyclerview/widget/OrientationHelper; +SPLandroidx/recyclerview/widget/OrientationHelper;->createVerticalHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)Landroidx/recyclerview/widget/OrientationHelper; +SPLandroidx/recyclerview/widget/OrientationHelper;->onLayoutComplete()V +Landroidx/recyclerview/widget/OrientationHelper$2; +SPLandroidx/recyclerview/widget/OrientationHelper$2;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V +SPLandroidx/recyclerview/widget/OrientationHelper$2;->getDecoratedEnd(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/OrientationHelper$2;->getDecoratedMeasurement(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/OrientationHelper$2;->getDecoratedMeasurementInOther(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/OrientationHelper$2;->getDecoratedStart(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/OrientationHelper$2;->getEnd()I +SPLandroidx/recyclerview/widget/OrientationHelper$2;->getEndAfterPadding()I +SPLandroidx/recyclerview/widget/OrientationHelper$2;->getEndPadding()I +SPLandroidx/recyclerview/widget/OrientationHelper$2;->getMode()I +SPLandroidx/recyclerview/widget/OrientationHelper$2;->getStartAfterPadding()I +SPLandroidx/recyclerview/widget/OrientationHelper$2;->getTotalSpace()I +SPLandroidx/recyclerview/widget/OrientationHelper$2;->offsetChildren(I)V +Landroidx/recyclerview/widget/RecyclerView; +SPLandroidx/recyclerview/widget/RecyclerView;->()V +SPLandroidx/recyclerview/widget/RecyclerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/recyclerview/widget/RecyclerView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLandroidx/recyclerview/widget/RecyclerView;->access$000(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V +SPLandroidx/recyclerview/widget/RecyclerView;->access$100(Landroidx/recyclerview/widget/RecyclerView;I)V +SPLandroidx/recyclerview/widget/RecyclerView;->addOnScrollListener(Landroidx/recyclerview/widget/RecyclerView$OnScrollListener;)V +SPLandroidx/recyclerview/widget/RecyclerView;->animateAppearance(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)V +SPLandroidx/recyclerview/widget/RecyclerView;->assertNotInLayoutOrScroll(Ljava/lang/String;)V +SPLandroidx/recyclerview/widget/RecyclerView;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z +SPLandroidx/recyclerview/widget/RecyclerView;->clearOldPositions()V +SPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollExtent()I +SPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollOffset()I +SPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollRange()I +SPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollExtent()I +SPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollOffset()I +SPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollRange()I +SPLandroidx/recyclerview/widget/RecyclerView;->createLayoutManager(Landroid/content/Context;Ljava/lang/String;Landroid/util/AttributeSet;II)V +SPLandroidx/recyclerview/widget/RecyclerView;->defaultOnMeasure(II)V +SPLandroidx/recyclerview/widget/RecyclerView;->didChildRangeChange(II)Z +SPLandroidx/recyclerview/widget/RecyclerView;->dispatchChildAttached(Landroid/view/View;)V +SPLandroidx/recyclerview/widget/RecyclerView;->dispatchContentChangedIfNecessary()V +SPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayout()V +SPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayoutStep1()V +SPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayoutStep2()V +SPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayoutStep3()V +SPLandroidx/recyclerview/widget/RecyclerView;->dispatchOnScrolled(II)V +SPLandroidx/recyclerview/widget/RecyclerView;->dispatchPendingImportantForAccessibilityChanges()V +SPLandroidx/recyclerview/widget/RecyclerView;->draw(Landroid/graphics/Canvas;)V +SPLandroidx/recyclerview/widget/RecyclerView;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z +SPLandroidx/recyclerview/widget/RecyclerView;->fillRemainingScrollValues(Landroidx/recyclerview/widget/RecyclerView$State;)V +SPLandroidx/recyclerview/widget/RecyclerView;->findMinMaxChildLayoutPositions([I)V +SPLandroidx/recyclerview/widget/RecyclerView;->findNestedRecyclerView(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView; +SPLandroidx/recyclerview/widget/RecyclerView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; +SPLandroidx/recyclerview/widget/RecyclerView;->getAccessibilityClassName()Ljava/lang/CharSequence; +SPLandroidx/recyclerview/widget/RecyclerView;->getChangedHolderKey(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)J +SPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolderInt(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLandroidx/recyclerview/widget/RecyclerView;->getItemDecorInsetsForChild(Landroid/view/View;)Landroid/graphics/Rect; +SPLandroidx/recyclerview/widget/RecyclerView;->getLayoutManager()Landroidx/recyclerview/widget/RecyclerView$LayoutManager; +SPLandroidx/recyclerview/widget/RecyclerView;->getNanoTime()J +SPLandroidx/recyclerview/widget/RecyclerView;->getScrollState()I +SPLandroidx/recyclerview/widget/RecyclerView;->getScrollingChildHelper()Landroidx/core/view/NestedScrollingChildHelper; +SPLandroidx/recyclerview/widget/RecyclerView;->hasPendingAdapterUpdates()Z +SPLandroidx/recyclerview/widget/RecyclerView;->initAdapterManager()V +SPLandroidx/recyclerview/widget/RecyclerView;->initAutofill()V +SPLandroidx/recyclerview/widget/RecyclerView;->initChildrenHelper()V +SPLandroidx/recyclerview/widget/RecyclerView;->invalidateGlows()V +SPLandroidx/recyclerview/widget/RecyclerView;->isAccessibilityEnabled()Z +SPLandroidx/recyclerview/widget/RecyclerView;->isAttachedToWindow()Z +SPLandroidx/recyclerview/widget/RecyclerView;->isComputingLayout()Z +SPLandroidx/recyclerview/widget/RecyclerView;->markItemDecorInsetsDirty()V +SPLandroidx/recyclerview/widget/RecyclerView;->markKnownViewsInvalid()V +SPLandroidx/recyclerview/widget/RecyclerView;->offsetChildrenVertical(I)V +SPLandroidx/recyclerview/widget/RecyclerView;->offsetPositionRecordsForInsert(II)V +SPLandroidx/recyclerview/widget/RecyclerView;->onAttachedToWindow()V +SPLandroidx/recyclerview/widget/RecyclerView;->onChildAttachedToWindow(Landroid/view/View;)V +SPLandroidx/recyclerview/widget/RecyclerView;->onDraw(Landroid/graphics/Canvas;)V +SPLandroidx/recyclerview/widget/RecyclerView;->onEnterLayoutOrScroll()V +SPLandroidx/recyclerview/widget/RecyclerView;->onExitLayoutOrScroll()V +SPLandroidx/recyclerview/widget/RecyclerView;->onExitLayoutOrScroll(Z)V +SPLandroidx/recyclerview/widget/RecyclerView;->onLayout(ZIIII)V +SPLandroidx/recyclerview/widget/RecyclerView;->onMeasure(II)V +SPLandroidx/recyclerview/widget/RecyclerView;->onScrolled(II)V +SPLandroidx/recyclerview/widget/RecyclerView;->onSizeChanged(IIII)V +SPLandroidx/recyclerview/widget/RecyclerView;->postAnimationRunner()V +SPLandroidx/recyclerview/widget/RecyclerView;->predictiveItemAnimationsEnabled()Z +SPLandroidx/recyclerview/widget/RecyclerView;->processAdapterUpdatesAndSetAnimationFlags()V +SPLandroidx/recyclerview/widget/RecyclerView;->processDataSetCompletelyChanged(Z)V +SPLandroidx/recyclerview/widget/RecyclerView;->recoverFocusFromState()V +SPLandroidx/recyclerview/widget/RecyclerView;->removeAndRecycleViews()V +SPLandroidx/recyclerview/widget/RecyclerView;->removeAnimatingView(Landroid/view/View;)Z +SPLandroidx/recyclerview/widget/RecyclerView;->requestLayout()V +SPLandroidx/recyclerview/widget/RecyclerView;->resetFocusInfo()V +SPLandroidx/recyclerview/widget/RecyclerView;->saveFocusInfo()V +SPLandroidx/recyclerview/widget/RecyclerView;->saveOldPositions()V +SPLandroidx/recyclerview/widget/RecyclerView;->sendAccessibilityEventUnchecked(Landroid/view/accessibility/AccessibilityEvent;)V +SPLandroidx/recyclerview/widget/RecyclerView;->setAccessibilityDelegateCompat(Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;)V +SPLandroidx/recyclerview/widget/RecyclerView;->setAdapter(Landroidx/recyclerview/widget/RecyclerView$Adapter;)V +SPLandroidx/recyclerview/widget/RecyclerView;->setAdapterInternal(Landroidx/recyclerview/widget/RecyclerView$Adapter;ZZ)V +SPLandroidx/recyclerview/widget/RecyclerView;->setClipToPadding(Z)V +SPLandroidx/recyclerview/widget/RecyclerView;->setLayoutFrozen(Z)V +SPLandroidx/recyclerview/widget/RecyclerView;->setLayoutManager(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V +SPLandroidx/recyclerview/widget/RecyclerView;->setNestedScrollingEnabled(Z)V +SPLandroidx/recyclerview/widget/RecyclerView;->setScrollState(I)V +SPLandroidx/recyclerview/widget/RecyclerView;->shouldDeferAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z +SPLandroidx/recyclerview/widget/RecyclerView;->startInterceptRequestLayout()V +SPLandroidx/recyclerview/widget/RecyclerView;->stopInterceptRequestLayout(Z)V +SPLandroidx/recyclerview/widget/RecyclerView;->stopScroll()V +SPLandroidx/recyclerview/widget/RecyclerView;->stopScrollersInternal()V +SPLandroidx/recyclerview/widget/RecyclerView;->suppressLayout(Z)V +Landroidx/recyclerview/widget/RecyclerView$1; +SPLandroidx/recyclerview/widget/RecyclerView$1;->(Landroidx/recyclerview/widget/RecyclerView;)V +Landroidx/recyclerview/widget/RecyclerView$2; +SPLandroidx/recyclerview/widget/RecyclerView$2;->(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$2;->run()V +Landroidx/recyclerview/widget/RecyclerView$3; +SPLandroidx/recyclerview/widget/RecyclerView$3;->()V +Landroidx/recyclerview/widget/RecyclerView$4; +SPLandroidx/recyclerview/widget/RecyclerView$4;->(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$4;->processAppeared(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)V +Landroidx/recyclerview/widget/RecyclerView$5; +SPLandroidx/recyclerview/widget/RecyclerView$5;->(Landroidx/recyclerview/widget/RecyclerView;)V +Landroidx/recyclerview/widget/RecyclerView$6; +SPLandroidx/recyclerview/widget/RecyclerView$6;->(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$6;->addView(Landroid/view/View;I)V +SPLandroidx/recyclerview/widget/RecyclerView$6;->attachViewToParent(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V +SPLandroidx/recyclerview/widget/RecyclerView$6;->detachViewFromParent(I)V +SPLandroidx/recyclerview/widget/RecyclerView$6;->getChildAt(I)Landroid/view/View; +SPLandroidx/recyclerview/widget/RecyclerView$6;->getChildCount()I +SPLandroidx/recyclerview/widget/RecyclerView$6;->indexOfChild(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/RecyclerView$6;->removeAllViews()V +Landroidx/recyclerview/widget/RecyclerView$7; +SPLandroidx/recyclerview/widget/RecyclerView$7;->(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$7;->dispatchUpdate(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V +SPLandroidx/recyclerview/widget/RecyclerView$7;->offsetPositionsForAdd(II)V +SPLandroidx/recyclerview/widget/RecyclerView$7;->onDispatchSecondPass(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V +Landroidx/recyclerview/widget/RecyclerView$Adapter; +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->()V +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->bindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->createViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->getItemViewType(I)I +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->hasObservers()Z +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->hasStableIds()Z +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyDataSetChanged()V +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyItemChanged(I)V +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyItemRangeChanged(II)V +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyItemRangeInserted(II)V +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;ILjava/util/List;)V +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->onViewAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->registerAdapterDataObserver(Landroidx/recyclerview/widget/RecyclerView$AdapterDataObserver;)V +SPLandroidx/recyclerview/widget/RecyclerView$Adapter;->setHasStableIds(Z)V +Landroidx/recyclerview/widget/RecyclerView$Adapter$StateRestorationPolicy; +SPLandroidx/recyclerview/widget/RecyclerView$Adapter$StateRestorationPolicy;->$values()[Landroidx/recyclerview/widget/RecyclerView$Adapter$StateRestorationPolicy; +SPLandroidx/recyclerview/widget/RecyclerView$Adapter$StateRestorationPolicy;->()V +SPLandroidx/recyclerview/widget/RecyclerView$Adapter$StateRestorationPolicy;->(Ljava/lang/String;I)V +Landroidx/recyclerview/widget/RecyclerView$AdapterDataObservable; +SPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->()V +SPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->hasObservers()Z +SPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyChanged()V +SPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyItemRangeChanged(II)V +SPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyItemRangeChanged(IILjava/lang/Object;)V +SPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyItemRangeInserted(II)V +Landroidx/recyclerview/widget/RecyclerView$AdapterDataObserver; +SPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObserver;->()V +Landroidx/recyclerview/widget/RecyclerView$EdgeEffectFactory; +SPLandroidx/recyclerview/widget/RecyclerView$EdgeEffectFactory;->()V +Landroidx/recyclerview/widget/RecyclerView$ItemAnimator; +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->()V +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->dispatchAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->dispatchAnimationsFinished()V +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->getAddDuration()J +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->obtainHolderInfo()Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->onAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->recordPostLayoutInformation(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->setListener(Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemAnimatorListener;)V +Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemAnimatorListener; +Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;->()V +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;->setFrom(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;->setFrom(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; +Landroidx/recyclerview/widget/RecyclerView$ItemAnimatorRestoreListener; +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimatorRestoreListener;->(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$ItemAnimatorRestoreListener;->onAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +Landroidx/recyclerview/widget/RecyclerView$LayoutManager; +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->()V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->addView(Landroid/view/View;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->addView(Landroid/view/View;I)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->addViewInt(Landroid/view/View;IZ)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->assertNotInLayoutOrScroll(Ljava/lang/String;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->checkLayoutParams(Landroidx/recyclerview/widget/RecyclerView$LayoutParams;)Z +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->chooseSize(III)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachAndScrapAttachedViews(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachViewAt(I)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachViewInternal(ILandroid/view/View;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->dispatchAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->generateLayoutParams(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/recyclerview/widget/RecyclerView$LayoutParams; +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getBottomDecorationHeight(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildAt(I)Landroid/view/View; +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildCount()I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildMeasureSpec(IIIIZ)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getColumnCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedBottom(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredHeight(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredWidth(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedTop(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getFocusedChild()Landroid/view/View; +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getHeight()I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getHeightMode()I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLayoutDirection()I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingBottom()I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingLeft()I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingRight()I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingTop()I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPosition(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRowCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getSelectionModeForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getTopDecorationHeight(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getWidth()I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getWidthMode()I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isLayoutHierarchical(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)Z +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isMeasurementUpToDate(III)Z +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->layoutDecoratedWithMargins(Landroid/view/View;IIII)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->measureChildWithMargins(Landroid/view/View;II)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->offsetChildrenVertical(I)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAdapterChanged(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$Adapter;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityEvent(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroid/view/accessibility/AccessibilityEvent;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsAdded(Landroidx/recyclerview/widget/RecyclerView;II)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsChanged(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onMeasure(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;II)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleAllViews(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleScrapInt(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->requestLayout()V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->scrapOrRecycleView(Landroidx/recyclerview/widget/RecyclerView$Recycler;ILandroid/view/View;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setExactMeasureSpecsFrom(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasureSpecs(II)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->shouldMeasureChild(Landroid/view/View;IILandroidx/recyclerview/widget/RecyclerView$LayoutParams;)Z +Landroidx/recyclerview/widget/RecyclerView$LayoutManager$1; +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V +Landroidx/recyclerview/widget/RecyclerView$LayoutManager$2; +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getChildAt(I)Landroid/view/View; +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getChildEnd(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getChildStart(Landroid/view/View;)I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getParentEnd()I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getParentStart()I +Landroidx/recyclerview/widget/RecyclerView$LayoutManager$LayoutPrefetchRegistry; +Landroidx/recyclerview/widget/RecyclerView$LayoutParams; +SPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->getViewLayoutPosition()I +SPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->isItemChanged()Z +SPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->isItemRemoved()Z +Landroidx/recyclerview/widget/RecyclerView$OnScrollListener; +SPLandroidx/recyclerview/widget/RecyclerView$OnScrollListener;->()V +Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool; +SPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->()V +SPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->attach()V +SPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->attachForPoolingContainer(Landroidx/recyclerview/widget/RecyclerView$Adapter;)V +SPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->clear()V +SPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->factorInBindTime(IJ)V +SPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->factorInCreateTime(IJ)V +SPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->getRecycledView(I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->getScrapDataForType(I)Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool$ScrapData; +SPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->onAdapterChanged(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$Adapter;Z)V +SPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->runningAverage(JJ)J +Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool$ScrapData; +SPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool$ScrapData;->()V +Landroidx/recyclerview/widget/RecyclerView$Recycler; +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->attachAccessibilityDelegateOnBind(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->clear()V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->clearOldPositions()V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->clearScrap()V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getRecycledViewPool()Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool; +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getScrapCount()I +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getScrapList()Ljava/util/List; +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getScrapOrCachedViewForId(JIZ)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getScrapOrHiddenOrCachedHolderForPosition(IZ)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getViewForPosition(I)Landroid/view/View; +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getViewForPosition(IZ)Landroid/view/View; +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->markItemDecorInsetsDirty()V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->markKnownViewsInvalid()V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->maybeSendPoolingContainerAttach()V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->offsetPositionRecordsForInsert(II)V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->onAdapterChanged(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$Adapter;Z)V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->onAttachedToWindow()V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->poolingContainerDetach(Landroidx/recyclerview/widget/RecyclerView$Adapter;Z)V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleAndClearCachedViews()V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->scrapView(Landroid/view/View;)V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->tryBindViewHolderByDeadline(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;IIJ)Z +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->tryGetViewHolderForPositionByDeadline(IZJ)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->unscrapView(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->updateViewCacheSize()V +SPLandroidx/recyclerview/widget/RecyclerView$Recycler;->validateViewHolderForOffsetPosition(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z +Landroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver; +SPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onChanged()V +SPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onItemRangeChanged(IILjava/lang/Object;)V +SPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onItemRangeInserted(II)V +SPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->triggerUpdateProcessor()V +Landroidx/recyclerview/widget/RecyclerView$SmoothScroller$ScrollVectorProvider; +Landroidx/recyclerview/widget/RecyclerView$State; +SPLandroidx/recyclerview/widget/RecyclerView$State;->()V +SPLandroidx/recyclerview/widget/RecyclerView$State;->assertLayoutStep(I)V +SPLandroidx/recyclerview/widget/RecyclerView$State;->getItemCount()I +SPLandroidx/recyclerview/widget/RecyclerView$State;->hasTargetScrollPosition()Z +SPLandroidx/recyclerview/widget/RecyclerView$State;->isPreLayout()Z +SPLandroidx/recyclerview/widget/RecyclerView$State;->willRunPredictiveAnimations()Z +Landroidx/recyclerview/widget/RecyclerView$StretchEdgeEffectFactory; +SPLandroidx/recyclerview/widget/RecyclerView$StretchEdgeEffectFactory;->()V +Landroidx/recyclerview/widget/RecyclerView$ViewFlinger; +SPLandroidx/recyclerview/widget/RecyclerView$ViewFlinger;->(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerView$ViewFlinger;->stop()V +Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->()V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->(Landroid/view/View;)V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->addFlags(I)V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearOldPosition()V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearPayload()V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearReturnedFromScrapFlag()V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearTmpDetachFlag()V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getItemViewType()I +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getLayoutPosition()I +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getUnmodifiedPayloads()Ljava/util/List; +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->hasAnyOfTheFlags(I)Z +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isBound()Z +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isInvalid()Z +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isRemoved()Z +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isScrap()Z +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isTmpDetached()Z +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isUpdated()Z +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->needsUpdate()Z +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->setFlags(II)V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->setIsRecyclable(Z)V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->setScrapContainer(Landroidx/recyclerview/widget/RecyclerView$Recycler;Z)V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->shouldBeKeptAsChild()Z +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->shouldIgnore()Z +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->unScrap()V +SPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->wasReturnedFromScrap()Z +Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate; +SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->(Landroidx/recyclerview/widget/RecyclerView;)V +SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->getItemDelegate()Landroidx/core/view/AccessibilityDelegateCompat; +SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->shouldIgnore()Z +Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate; +SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->(Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;)V +SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; +SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->saveOriginalDelegate(Landroid/view/View;)V +Landroidx/recyclerview/widget/ScrollbarHelper; +SPLandroidx/recyclerview/widget/ScrollbarHelper;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;Z)I +SPLandroidx/recyclerview/widget/ScrollbarHelper;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;ZZ)I +SPLandroidx/recyclerview/widget/ScrollbarHelper;->computeScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;Z)I +Landroidx/recyclerview/widget/SimpleItemAnimator; +SPLandroidx/recyclerview/widget/SimpleItemAnimator;->()V +SPLandroidx/recyclerview/widget/SimpleItemAnimator;->animateAppearance(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z +SPLandroidx/recyclerview/widget/SimpleItemAnimator;->dispatchAddFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/SimpleItemAnimator;->dispatchAddStarting(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/SimpleItemAnimator;->onAddFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/SimpleItemAnimator;->onAddStarting(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +Landroidx/recyclerview/widget/ViewBoundsCheck; +SPLandroidx/recyclerview/widget/ViewBoundsCheck;->(Landroidx/recyclerview/widget/ViewBoundsCheck$Callback;)V +SPLandroidx/recyclerview/widget/ViewBoundsCheck;->findOneViewWithinBoundFlags(IIII)Landroid/view/View; +Landroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags; +SPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->()V +SPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->addFlags(I)V +SPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->boundsMatch()Z +SPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->compare(II)I +SPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->resetFlags()V +SPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->setBounds(IIII)V +Landroidx/recyclerview/widget/ViewBoundsCheck$Callback; +Landroidx/recyclerview/widget/ViewInfoStore; +SPLandroidx/recyclerview/widget/ViewInfoStore;->()V +SPLandroidx/recyclerview/widget/ViewInfoStore;->addToPostLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)V +SPLandroidx/recyclerview/widget/ViewInfoStore;->clear()V +SPLandroidx/recyclerview/widget/ViewInfoStore;->getFromOldChangeHolders(J)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLandroidx/recyclerview/widget/ViewInfoStore;->onViewDetached(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +SPLandroidx/recyclerview/widget/ViewInfoStore;->process(Landroidx/recyclerview/widget/ViewInfoStore$ProcessCallback;)V +SPLandroidx/recyclerview/widget/ViewInfoStore;->removeFromDisappearedInLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord; +SPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->()V +SPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->()V +SPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->obtain()Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord; +SPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->recycle(Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord;)V +Landroidx/recyclerview/widget/ViewInfoStore$ProcessCallback; +Landroidx/room/BaseRoomConnectionManager; +SPLandroidx/room/BaseRoomConnectionManager;->()V +SPLandroidx/room/BaseRoomConnectionManager;->()V +SPLandroidx/room/BaseRoomConnectionManager;->checkIdentity(Landroidx/sqlite/SQLiteConnection;)V +SPLandroidx/room/BaseRoomConnectionManager;->hasRoomMasterTable(Landroidx/sqlite/SQLiteConnection;)Z +SPLandroidx/room/BaseRoomConnectionManager;->invokeOpenCallback(Landroidx/sqlite/SQLiteConnection;)V +SPLandroidx/room/BaseRoomConnectionManager;->onOpen(Landroidx/sqlite/SQLiteConnection;)V +Landroidx/room/BaseRoomConnectionManager$Companion; +SPLandroidx/room/BaseRoomConnectionManager$Companion;->()V +SPLandroidx/room/BaseRoomConnectionManager$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/room/DatabaseConfiguration; +SPLandroidx/room/DatabaseConfiguration;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;Landroidx/room/RoomDatabase$MigrationContainer;Ljava/util/List;ZLandroidx/room/RoomDatabase$JournalMode;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;Landroid/content/Intent;ZZLjava/util/Set;Ljava/lang/String;Ljava/io/File;Ljava/util/concurrent/Callable;Landroidx/room/RoomDatabase$PrepackagedDatabaseCallback;Ljava/util/List;Ljava/util/List;ZLandroidx/sqlite/SQLiteDriver;Lkotlin/coroutines/CoroutineContext;)V +SPLandroidx/room/DatabaseConfiguration;->getUseTempTrackingTable$room_runtime_release()Z +SPLandroidx/room/DatabaseConfiguration;->setUseTempTrackingTable$room_runtime_release(Z)V +Landroidx/room/DelegatingOpenHelper; +Landroidx/room/EntityDeleteOrUpdateAdapter; +SPLandroidx/room/EntityDeleteOrUpdateAdapter;->()V +Landroidx/room/EntityInsertAdapter; +SPLandroidx/room/EntityInsertAdapter;->()V +SPLandroidx/room/EntityInsertAdapter;->insert(Landroidx/sqlite/SQLiteConnection;Ljava/lang/Object;)V +Landroidx/room/InvalidationLiveDataContainer; +SPLandroidx/room/InvalidationLiveDataContainer;->(Landroidx/room/RoomDatabase;)V +Landroidx/room/InvalidationTracker; +SPLandroidx/room/InvalidationTracker;->()V +SPLandroidx/room/InvalidationTracker;->(Landroidx/room/RoomDatabase;Ljava/util/Map;Ljava/util/Map;[Ljava/lang/String;)V +SPLandroidx/room/InvalidationTracker;->_init_$lambda$2(Landroidx/room/InvalidationTracker;)Z +SPLandroidx/room/InvalidationTracker;->createFlow([Ljava/lang/String;Z)Lkotlinx/coroutines/flow/Flow; +SPLandroidx/room/InvalidationTracker;->internalInit$room_runtime_release(Landroidx/sqlite/SQLiteConnection;)V +SPLandroidx/room/InvalidationTracker;->onRefreshCompleted$lambda$1(Landroidx/room/InvalidationTracker;)Lkotlin/Unit; +SPLandroidx/room/InvalidationTracker;->onRefreshScheduled$lambda$0(Landroidx/room/InvalidationTracker;)Lkotlin/Unit; +SPLandroidx/room/InvalidationTracker;->refreshAsync()V +SPLandroidx/room/InvalidationTracker;->refreshVersionsAsync()V +SPLandroidx/room/InvalidationTracker;->sync$room_runtime_release(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/InvalidationTracker;->syncBlocking$room_runtime_release()V +Landroidx/room/InvalidationTracker$$ExternalSyntheticLambda0; +SPLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda0;->(Landroidx/room/InvalidationTracker;)V +SPLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/room/InvalidationTracker$$ExternalSyntheticLambda1; +SPLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda1;->(Landroidx/room/InvalidationTracker;)V +SPLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda1;->invoke()Ljava/lang/Object; +Landroidx/room/InvalidationTracker$$ExternalSyntheticLambda2; +SPLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda2;->(Landroidx/room/InvalidationTracker;)V +SPLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda2;->invoke()Ljava/lang/Object; +Landroidx/room/InvalidationTracker$Companion; +SPLandroidx/room/InvalidationTracker$Companion;->()V +SPLandroidx/room/InvalidationTracker$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/room/InvalidationTracker$implementation$1; +SPLandroidx/room/InvalidationTracker$implementation$1;->(Ljava/lang/Object;)V +Landroidx/room/InvalidationTracker$syncBlocking$1; +SPLandroidx/room/InvalidationTracker$syncBlocking$1;->(Landroidx/room/InvalidationTracker;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/InvalidationTracker$syncBlocking$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/InvalidationTracker$syncBlocking$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/InvalidationTracker$syncBlocking$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/InvalidationTracker$syncBlocking$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/ObservedTableStates; +SPLandroidx/room/ObservedTableStates;->(I)V +SPLandroidx/room/ObservedTableStates;->forceNeedSync$room_runtime_release()V +SPLandroidx/room/ObservedTableStates;->getTablesToSync$room_runtime_release()[Landroidx/room/ObservedTableStates$ObserveOp; +SPLandroidx/room/ObservedTableStates;->onObserverAdded$room_runtime_release([I)Z +SPLandroidx/room/ObservedTableStates;->onObserverRemoved$room_runtime_release([I)Z +Landroidx/room/ObservedTableStates$ObserveOp; +SPLandroidx/room/ObservedTableStates$ObserveOp;->$values()[Landroidx/room/ObservedTableStates$ObserveOp; +SPLandroidx/room/ObservedTableStates$ObserveOp;->()V +SPLandroidx/room/ObservedTableStates$ObserveOp;->(Ljava/lang/String;I)V +SPLandroidx/room/ObservedTableStates$ObserveOp;->values()[Landroidx/room/ObservedTableStates$ObserveOp; +Landroidx/room/ObservedTableVersions; +SPLandroidx/room/ObservedTableVersions;->(I)V +SPLandroidx/room/ObservedTableVersions;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/ObservedTableVersions$collect$1; +SPLandroidx/room/ObservedTableVersions$collect$1;->(Landroidx/room/ObservedTableVersions;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/ObservedTableVersions$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/PooledConnection; +Landroidx/room/Room; +SPLandroidx/room/Room;->()V +SPLandroidx/room/Room;->()V +SPLandroidx/room/Room;->databaseBuilder(Landroid/content/Context;Ljava/lang/Class;Ljava/lang/String;)Landroidx/room/RoomDatabase$Builder; +Landroidx/room/RoomConnectionManager; +SPLandroidx/room/RoomConnectionManager;->(Landroidx/room/DatabaseConfiguration;Landroidx/room/RoomOpenDelegate;)V +SPLandroidx/room/RoomConnectionManager;->access$setSupportDatabase$p(Landroidx/room/RoomConnectionManager;Landroidx/sqlite/db/SupportSQLiteDatabase;)V +SPLandroidx/room/RoomConnectionManager;->getCallbacks()Ljava/util/List; +SPLandroidx/room/RoomConnectionManager;->getConfiguration()Landroidx/room/DatabaseConfiguration; +SPLandroidx/room/RoomConnectionManager;->getOpenDelegate()Landroidx/room/RoomOpenDelegate; +SPLandroidx/room/RoomConnectionManager;->getSupportOpenHelper$room_runtime_release()Landroidx/sqlite/db/SupportSQLiteOpenHelper; +SPLandroidx/room/RoomConnectionManager;->init()V +SPLandroidx/room/RoomConnectionManager;->isSupportDatabaseOpen()Z +SPLandroidx/room/RoomConnectionManager;->useConnection(ZLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/RoomConnectionManager$SupportOpenHelperCallback; +SPLandroidx/room/RoomConnectionManager$SupportOpenHelperCallback;->(Landroidx/room/RoomConnectionManager;I)V +SPLandroidx/room/RoomConnectionManager$SupportOpenHelperCallback;->onOpen(Landroidx/sqlite/db/SupportSQLiteDatabase;)V +Landroidx/room/RoomDatabase; +SPLandroidx/room/RoomDatabase;->()V +SPLandroidx/room/RoomDatabase;->()V +SPLandroidx/room/RoomDatabase;->assertNotMainThread()V +SPLandroidx/room/RoomDatabase;->assertNotSuspendingTransaction()V +SPLandroidx/room/RoomDatabase;->beginTransaction()V +SPLandroidx/room/RoomDatabase;->createConnectionManager$room_runtime_release(Landroidx/room/DatabaseConfiguration;)Landroidx/room/RoomConnectionManager; +SPLandroidx/room/RoomDatabase;->endTransaction()V +SPLandroidx/room/RoomDatabase;->getCloseBarrier$room_runtime_release()Landroidx/room/concurrent/CloseBarrier; +SPLandroidx/room/RoomDatabase;->getCoroutineScope()Lkotlinx/coroutines/CoroutineScope; +SPLandroidx/room/RoomDatabase;->getInvalidationTracker()Landroidx/room/InvalidationTracker; +SPLandroidx/room/RoomDatabase;->getOpenHelper()Landroidx/sqlite/db/SupportSQLiteOpenHelper; +SPLandroidx/room/RoomDatabase;->getQueryContext()Lkotlin/coroutines/CoroutineContext; +SPLandroidx/room/RoomDatabase;->getRequiredTypeConverterClassesMap$room_runtime_release()Ljava/util/Map; +SPLandroidx/room/RoomDatabase;->getTransactionContext$room_runtime_release()Lkotlin/coroutines/CoroutineContext; +SPLandroidx/room/RoomDatabase;->getUseTempTrackingTable$room_runtime_release()Z +SPLandroidx/room/RoomDatabase;->inCompatibilityMode$room_runtime_release()Z +SPLandroidx/room/RoomDatabase;->inTransaction()Z +SPLandroidx/room/RoomDatabase;->init(Landroidx/room/DatabaseConfiguration;)V +SPLandroidx/room/RoomDatabase;->internalBeginTransaction()V +SPLandroidx/room/RoomDatabase;->internalEndTransaction()V +SPLandroidx/room/RoomDatabase;->internalInitInvalidationTracker(Landroidx/sqlite/SQLiteConnection;)V +SPLandroidx/room/RoomDatabase;->isMainThread$room_runtime_release()Z +SPLandroidx/room/RoomDatabase;->isOpenInternal()Z +SPLandroidx/room/RoomDatabase;->runInTransaction(Ljava/lang/Runnable;)V +SPLandroidx/room/RoomDatabase;->setTransactionSuccessful()V +SPLandroidx/room/RoomDatabase;->useConnection$room_runtime_release(ZLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/RoomDatabase$Builder; +SPLandroidx/room/RoomDatabase$Builder;->(Landroid/content/Context;Ljava/lang/Class;Ljava/lang/String;)V +SPLandroidx/room/RoomDatabase$Builder;->addCallback(Landroidx/room/RoomDatabase$Callback;)Landroidx/room/RoomDatabase$Builder; +SPLandroidx/room/RoomDatabase$Builder;->addMigrations([Landroidx/room/migration/Migration;)Landroidx/room/RoomDatabase$Builder; +SPLandroidx/room/RoomDatabase$Builder;->build()Landroidx/room/RoomDatabase; +SPLandroidx/room/RoomDatabase$Builder;->fallbackToDestructiveMigration(Z)Landroidx/room/RoomDatabase$Builder; +SPLandroidx/room/RoomDatabase$Builder;->openHelperFactory(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;)Landroidx/room/RoomDatabase$Builder; +SPLandroidx/room/RoomDatabase$Builder;->setQueryExecutor(Ljava/util/concurrent/Executor;)Landroidx/room/RoomDatabase$Builder; +Landroidx/room/RoomDatabase$Callback; +SPLandroidx/room/RoomDatabase$Callback;->()V +SPLandroidx/room/RoomDatabase$Callback;->onOpen(Landroidx/sqlite/SQLiteConnection;)V +SPLandroidx/room/RoomDatabase$Callback;->onOpen(Landroidx/sqlite/db/SupportSQLiteDatabase;)V +Landroidx/room/RoomDatabase$Companion; +SPLandroidx/room/RoomDatabase$Companion;->()V +SPLandroidx/room/RoomDatabase$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/room/RoomDatabase$JournalMode; +SPLandroidx/room/RoomDatabase$JournalMode;->$values()[Landroidx/room/RoomDatabase$JournalMode; +SPLandroidx/room/RoomDatabase$JournalMode;->()V +SPLandroidx/room/RoomDatabase$JournalMode;->(Ljava/lang/String;I)V +SPLandroidx/room/RoomDatabase$JournalMode;->resolve$room_runtime_release(Landroid/content/Context;)Landroidx/room/RoomDatabase$JournalMode; +Landroidx/room/RoomDatabase$MigrationContainer; +SPLandroidx/room/RoomDatabase$MigrationContainer;->()V +SPLandroidx/room/RoomDatabase$MigrationContainer;->addMigration(Landroidx/room/migration/Migration;)V +SPLandroidx/room/RoomDatabase$MigrationContainer;->addMigrations([Landroidx/room/migration/Migration;)V +SPLandroidx/room/RoomDatabase$MigrationContainer;->contains(II)Z +SPLandroidx/room/RoomDatabase$MigrationContainer;->getMigrations()Ljava/util/Map; +Landroidx/room/RoomDatabase$PrepackagedDatabaseCallback; +Landroidx/room/RoomDatabase$closeBarrier$1; +SPLandroidx/room/RoomDatabase$closeBarrier$1;->(Ljava/lang/Object;)V +Landroidx/room/RoomDatabaseKt; +SPLandroidx/room/RoomDatabaseKt;->validateAutoMigrations(Landroidx/room/RoomDatabase;Landroidx/room/DatabaseConfiguration;)V +SPLandroidx/room/RoomDatabaseKt;->validateMigrationsNotRequired(Ljava/util/Set;Ljava/util/Set;)V +SPLandroidx/room/RoomDatabaseKt;->validateTypeConverters(Landroidx/room/RoomDatabase;Landroidx/room/DatabaseConfiguration;)V +Landroidx/room/RoomDatabaseKt__RoomDatabaseKt; +SPLandroidx/room/RoomDatabaseKt__RoomDatabaseKt;->validateAutoMigrations(Landroidx/room/RoomDatabase;Landroidx/room/DatabaseConfiguration;)V +SPLandroidx/room/RoomDatabaseKt__RoomDatabaseKt;->validateMigrationsNotRequired(Ljava/util/Set;Ljava/util/Set;)V +SPLandroidx/room/RoomDatabaseKt__RoomDatabaseKt;->validateTypeConverters(Landroidx/room/RoomDatabase;Landroidx/room/DatabaseConfiguration;)V +Landroidx/room/RoomOpenDelegate; +SPLandroidx/room/RoomOpenDelegate;->(ILjava/lang/String;Ljava/lang/String;)V +SPLandroidx/room/RoomOpenDelegate;->getIdentityHash()Ljava/lang/String; +SPLandroidx/room/RoomOpenDelegate;->getVersion()I +Landroidx/room/RoomOpenDelegateMarker; +Landroidx/room/TransactionElement; +SPLandroidx/room/TransactionElement;->()V +Landroidx/room/TransactionElement$Key; +SPLandroidx/room/TransactionElement$Key;->()V +SPLandroidx/room/TransactionElement$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/room/TransactionExecutor; +SPLandroidx/room/TransactionExecutor;->(Ljava/util/concurrent/Executor;)V +SPLandroidx/room/TransactionExecutor;->execute$lambda$1$lambda$0(Ljava/lang/Runnable;Landroidx/room/TransactionExecutor;)V +SPLandroidx/room/TransactionExecutor;->execute(Ljava/lang/Runnable;)V +SPLandroidx/room/TransactionExecutor;->scheduleNext()V +Landroidx/room/TransactionExecutor$$ExternalSyntheticLambda0; +SPLandroidx/room/TransactionExecutor$$ExternalSyntheticLambda0;->(Ljava/lang/Runnable;Landroidx/room/TransactionExecutor;)V +SPLandroidx/room/TransactionExecutor$$ExternalSyntheticLambda0;->run()V +Landroidx/room/TransactionScope; +Landroidx/room/Transactor; +Landroidx/room/Transactor$SQLiteTransactionType; +SPLandroidx/room/Transactor$SQLiteTransactionType;->$values()[Landroidx/room/Transactor$SQLiteTransactionType; +SPLandroidx/room/Transactor$SQLiteTransactionType;->()V +SPLandroidx/room/Transactor$SQLiteTransactionType;->(Ljava/lang/String;I)V +SPLandroidx/room/Transactor$SQLiteTransactionType;->values()[Landroidx/room/Transactor$SQLiteTransactionType; +Landroidx/room/TransactorKt; +SPLandroidx/room/TransactorKt;->execSQL$lambda$0(Landroidx/sqlite/SQLiteStatement;)Z +SPLandroidx/room/TransactorKt;->execSQL(Landroidx/room/PooledConnection;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/TransactorKt$$ExternalSyntheticLambda0; +SPLandroidx/room/TransactorKt$$ExternalSyntheticLambda0;->()V +SPLandroidx/room/TransactorKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/TriggerBasedInvalidationTracker; +SPLandroidx/room/TriggerBasedInvalidationTracker;->()V +SPLandroidx/room/TriggerBasedInvalidationTracker;->(Landroidx/room/RoomDatabase;Ljava/util/Map;Ljava/util/Map;[Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)V +SPLandroidx/room/TriggerBasedInvalidationTracker;->access$checkInvalidatedTables(Landroidx/room/TriggerBasedInvalidationTracker;Landroidx/room/PooledConnection;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker;->access$getDatabase$p(Landroidx/room/TriggerBasedInvalidationTracker;)Landroidx/room/RoomDatabase; +SPLandroidx/room/TriggerBasedInvalidationTracker;->access$getObservedTableStates$p(Landroidx/room/TriggerBasedInvalidationTracker;)Landroidx/room/ObservedTableStates; +SPLandroidx/room/TriggerBasedInvalidationTracker;->access$getObservedTableVersions$p(Landroidx/room/TriggerBasedInvalidationTracker;)Landroidx/room/ObservedTableVersions; +SPLandroidx/room/TriggerBasedInvalidationTracker;->access$notifyInvalidation(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker;->access$startTrackingTable(Landroidx/room/TriggerBasedInvalidationTracker;Landroidx/room/PooledConnection;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker;->checkInvalidatedTables$lambda$14(Landroidx/sqlite/SQLiteStatement;)Ljava/util/Set; +SPLandroidx/room/TriggerBasedInvalidationTracker;->checkInvalidatedTables(Landroidx/room/PooledConnection;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker;->configureConnection(Landroidx/sqlite/SQLiteConnection;)V +SPLandroidx/room/TriggerBasedInvalidationTracker;->createFlow$room_runtime_release([Ljava/lang/String;[IZ)Lkotlinx/coroutines/flow/Flow; +SPLandroidx/room/TriggerBasedInvalidationTracker;->notifyInvalidation(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker;->refreshInvalidationAsync$room_runtime_release(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V +SPLandroidx/room/TriggerBasedInvalidationTracker;->resolveViews([Ljava/lang/String;)[Ljava/lang/String; +SPLandroidx/room/TriggerBasedInvalidationTracker;->setOnAllowRefresh$room_runtime_release(Lkotlin/jvm/functions/Function0;)V +SPLandroidx/room/TriggerBasedInvalidationTracker;->startTrackingTable(Landroidx/room/PooledConnection;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker;->syncTriggers$room_runtime_release(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker;->validateTableNames$room_runtime_release([Ljava/lang/String;)Lkotlin/Pair; +Landroidx/room/TriggerBasedInvalidationTracker$$ExternalSyntheticLambda2; +SPLandroidx/room/TriggerBasedInvalidationTracker$$ExternalSyntheticLambda2;->()V +SPLandroidx/room/TriggerBasedInvalidationTracker$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/TriggerBasedInvalidationTracker$$ExternalSyntheticLambda5; +SPLandroidx/room/TriggerBasedInvalidationTracker$$ExternalSyntheticLambda5;->()V +Landroidx/room/TriggerBasedInvalidationTracker$Companion; +SPLandroidx/room/TriggerBasedInvalidationTracker$Companion;->()V +SPLandroidx/room/TriggerBasedInvalidationTracker$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/room/TriggerBasedInvalidationTracker$Companion;->access$getTriggerName(Landroidx/room/TriggerBasedInvalidationTracker$Companion;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +SPLandroidx/room/TriggerBasedInvalidationTracker$Companion;->getTriggerName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +Landroidx/room/TriggerBasedInvalidationTracker$checkInvalidatedTables$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$checkInvalidatedTables$1;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/Continuation;)V +Landroidx/room/TriggerBasedInvalidationTracker$createFlow$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1;->(Landroidx/room/TriggerBasedInvalidationTracker;[IZ[Ljava/lang/String;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1;->invoke(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/TriggerBasedInvalidationTracker$createFlow$1$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1$1;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2;->(Lkotlin/jvm/internal/Ref$ObjectRef;ZLkotlinx/coroutines/flow/FlowCollector;[Ljava/lang/String;[I)V +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2;->emit([ILkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2$emit$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2$emit$1;->(Landroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2;Lkotlin/coroutines/Continuation;)V +Landroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$1;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/Continuation;)V +Landroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1;->invoke(Landroidx/room/Transactor;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1$1;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1$1;->invoke(Landroidx/room/TransactionScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/TriggerBasedInvalidationTracker$refreshInvalidationAsync$3; +SPLandroidx/room/TriggerBasedInvalidationTracker$refreshInvalidationAsync$3;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/TriggerBasedInvalidationTracker$refreshInvalidationAsync$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/TriggerBasedInvalidationTracker$refreshInvalidationAsync$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/TriggerBasedInvalidationTracker$startTrackingTable$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$startTrackingTable$1;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/Continuation;)V +Landroidx/room/TriggerBasedInvalidationTracker$syncTriggers$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$1;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/Continuation;)V +Landroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1;->invoke(Landroidx/room/Transactor;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1$1;->([Landroidx/room/ObservedTableStates$ObserveOp;Landroidx/room/TriggerBasedInvalidationTracker;Landroidx/room/Transactor;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1$1;->invoke(Landroidx/room/TransactionScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1$1$WhenMappings; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1$1$WhenMappings;->()V +Landroidx/room/concurrent/CloseBarrier; +SPLandroidx/room/concurrent/CloseBarrier;->(Lkotlin/jvm/functions/Function0;)V +SPLandroidx/room/concurrent/CloseBarrier;->block$room_runtime_release()Z +SPLandroidx/room/concurrent/CloseBarrier;->isClosed()Z +SPLandroidx/room/concurrent/CloseBarrier;->unblock$room_runtime_release()V +Landroidx/room/coroutines/ConnectionPool; +Landroidx/room/coroutines/ConnectionPool$RollbackException; +Landroidx/room/coroutines/FlowUtil; +SPLandroidx/room/coroutines/FlowUtil;->createFlow(Landroidx/room/RoomDatabase;Z[Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/flow/Flow; +Landroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1; +SPLandroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1;->(Lkotlinx/coroutines/flow/Flow;Landroidx/room/RoomDatabase;ZLkotlin/jvm/functions/Function1;)V +SPLandroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2; +SPLandroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Landroidx/room/RoomDatabase;ZLkotlin/jvm/functions/Function1;)V +SPLandroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2$1; +SPLandroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2$1;->(Landroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/coroutines/RawConnectionAccessor; +Landroidx/room/coroutines/RunBlockingUninterruptible_androidKt; +SPLandroidx/room/coroutines/RunBlockingUninterruptible_androidKt;->runBlockingUninterruptible(Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +Landroidx/room/coroutines/RunBlockingUninterruptible_androidKt$runBlockingUninterruptible$1; +SPLandroidx/room/coroutines/RunBlockingUninterruptible_androidKt$runBlockingUninterruptible$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/coroutines/RunBlockingUninterruptible_androidKt$runBlockingUninterruptible$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/coroutines/RunBlockingUninterruptible_androidKt$runBlockingUninterruptible$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/coroutines/RunBlockingUninterruptible_androidKt$runBlockingUninterruptible$1$1; +SPLandroidx/room/coroutines/RunBlockingUninterruptible_androidKt$runBlockingUninterruptible$1$1;->(Lkotlinx/coroutines/CompletableDeferred;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/coroutines/RunBlockingUninterruptible_androidKt$runBlockingUninterruptible$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/coroutines/RunBlockingUninterruptible_androidKt$runBlockingUninterruptible$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/coroutines/RunBlockingUninterruptible_androidKt$runBlockingUninterruptible$1$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/coroutines/RunBlockingUninterruptible_androidKt$runBlockingUninterruptible$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/driver/SupportSQLiteConnection; +SPLandroidx/room/driver/SupportSQLiteConnection;->(Landroidx/sqlite/db/SupportSQLiteDatabase;)V +SPLandroidx/room/driver/SupportSQLiteConnection;->getDb()Landroidx/sqlite/db/SupportSQLiteDatabase; +SPLandroidx/room/driver/SupportSQLiteConnection;->prepare(Ljava/lang/String;)Landroidx/room/driver/SupportSQLiteStatement; +SPLandroidx/room/driver/SupportSQLiteConnection;->prepare(Ljava/lang/String;)Landroidx/sqlite/SQLiteStatement; +Landroidx/room/driver/SupportSQLiteConnectionPool; +SPLandroidx/room/driver/SupportSQLiteConnectionPool;->(Landroidx/room/driver/SupportSQLiteDriver;)V +SPLandroidx/room/driver/SupportSQLiteConnectionPool;->getSupportConnection()Landroidx/room/driver/SupportSQLitePooledConnection; +SPLandroidx/room/driver/SupportSQLiteConnectionPool;->getSupportDriver$room_runtime_release()Landroidx/room/driver/SupportSQLiteDriver; +SPLandroidx/room/driver/SupportSQLiteConnectionPool;->useConnection(ZLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/driver/SupportSQLiteDriver; +SPLandroidx/room/driver/SupportSQLiteDriver;->(Landroidx/sqlite/db/SupportSQLiteOpenHelper;)V +SPLandroidx/room/driver/SupportSQLiteDriver;->getOpenHelper()Landroidx/sqlite/db/SupportSQLiteOpenHelper; +SPLandroidx/room/driver/SupportSQLiteDriver;->open(Ljava/lang/String;)Landroidx/room/driver/SupportSQLiteConnection; +Landroidx/room/driver/SupportSQLitePooledConnection; +SPLandroidx/room/driver/SupportSQLitePooledConnection;->(Landroidx/room/driver/SupportSQLiteConnection;)V +SPLandroidx/room/driver/SupportSQLitePooledConnection;->getRawConnection()Landroidx/sqlite/SQLiteConnection; +SPLandroidx/room/driver/SupportSQLitePooledConnection;->inTransaction(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/driver/SupportSQLitePooledConnection;->transaction(Landroidx/room/Transactor$SQLiteTransactionType;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/driver/SupportSQLitePooledConnection;->usePrepared(Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/driver/SupportSQLitePooledConnection;->withTransaction(Landroidx/room/Transactor$SQLiteTransactionType;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/driver/SupportSQLitePooledConnection$SupportSQLiteTransactor; +SPLandroidx/room/driver/SupportSQLitePooledConnection$SupportSQLiteTransactor;->(Landroidx/room/driver/SupportSQLitePooledConnection;)V +SPLandroidx/room/driver/SupportSQLitePooledConnection$SupportSQLiteTransactor;->getRawConnection()Landroidx/sqlite/SQLiteConnection; +SPLandroidx/room/driver/SupportSQLitePooledConnection$SupportSQLiteTransactor;->usePrepared(Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/driver/SupportSQLitePooledConnection$WhenMappings; +SPLandroidx/room/driver/SupportSQLitePooledConnection$WhenMappings;->()V +Landroidx/room/driver/SupportSQLitePooledConnection$transaction$1; +SPLandroidx/room/driver/SupportSQLitePooledConnection$transaction$1;->(Landroidx/room/driver/SupportSQLitePooledConnection;Lkotlin/coroutines/Continuation;)V +Landroidx/room/driver/SupportSQLiteStatement; +SPLandroidx/room/driver/SupportSQLiteStatement;->()V +SPLandroidx/room/driver/SupportSQLiteStatement;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)V +SPLandroidx/room/driver/SupportSQLiteStatement;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/room/driver/SupportSQLiteStatement;->getDb()Landroidx/sqlite/db/SupportSQLiteDatabase; +SPLandroidx/room/driver/SupportSQLiteStatement;->getSql()Ljava/lang/String; +SPLandroidx/room/driver/SupportSQLiteStatement;->isClosed()Z +SPLandroidx/room/driver/SupportSQLiteStatement;->setClosed(Z)V +SPLandroidx/room/driver/SupportSQLiteStatement;->throwIfClosed()V +Landroidx/room/driver/SupportSQLiteStatement$Companion; +SPLandroidx/room/driver/SupportSQLiteStatement$Companion;->()V +SPLandroidx/room/driver/SupportSQLiteStatement$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/room/driver/SupportSQLiteStatement$Companion;->create(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)Landroidx/room/driver/SupportSQLiteStatement; +SPLandroidx/room/driver/SupportSQLiteStatement$Companion;->isRowStatement(Ljava/lang/String;)Z +Landroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement; +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->()V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->access$getBindingTypes$p(Landroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;)[I +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->access$getLongBindings$p(Landroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;)[J +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->access$getStringBindings$p(Landroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;)[Ljava/lang/String; +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->bindLong(IJ)V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->bindText(ILjava/lang/String;)V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->clearBindings()V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->close()V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->ensureCapacity(II)V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->ensureCursor()V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->getColumnCount()I +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->getColumnName(I)Ljava/lang/String; +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->getLong(I)J +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->getText(I)Ljava/lang/String; +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->isNull(I)Z +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->reset()V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->step()Z +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->throwIfInvalidColumn(Landroid/database/Cursor;I)V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;->throwIfNoRow()Landroid/database/Cursor; +Landroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement$Companion; +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement$Companion;->()V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement$ensureCursor$1; +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement$ensureCursor$1;->(Landroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement;)V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement$ensureCursor$1;->bindTo(Landroidx/sqlite/db/SupportSQLiteProgram;)V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportAndroidSQLiteStatement$ensureCursor$1;->getSql()Ljava/lang/String; +Landroidx/room/driver/SupportSQLiteStatement$SupportOtherAndroidSQLiteStatement; +SPLandroidx/room/driver/SupportSQLiteStatement$SupportOtherAndroidSQLiteStatement;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportOtherAndroidSQLiteStatement;->bindLong(IJ)V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportOtherAndroidSQLiteStatement;->bindText(ILjava/lang/String;)V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportOtherAndroidSQLiteStatement;->close()V +SPLandroidx/room/driver/SupportSQLiteStatement$SupportOtherAndroidSQLiteStatement;->step()Z +Landroidx/room/migration/AutoMigrationSpec; +Landroidx/room/migration/Migration; +SPLandroidx/room/migration/Migration;->(II)V +Landroidx/room/support/AutoClosingRoomOpenHelper; +Landroidx/room/support/PrePackagedCopyOpenHelper; +Landroidx/room/util/DBUtil; +SPLandroidx/room/util/DBUtil;->getCoroutineContext(Landroidx/room/RoomDatabase;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil;->performBlocking(Landroidx/room/RoomDatabase;ZZLkotlin/jvm/functions/Function1;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil;->performSuspending(Landroidx/room/RoomDatabase;ZZLkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/util/DBUtil__DBUtil_androidKt; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt;->getCoroutineContext(Landroidx/room/RoomDatabase;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt;->performBlocking(Landroidx/room/RoomDatabase;ZZLkotlin/jvm/functions/Function1;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt;->performSuspending(Landroidx/room/RoomDatabase;ZZLkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1;->(Landroidx/room/RoomDatabase;ZZLkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1$invokeSuspend$$inlined$internalPerform$1; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1$invokeSuspend$$inlined$internalPerform$1;->(ZZLandroidx/room/RoomDatabase;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1$invokeSuspend$$inlined$internalPerform$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1$invokeSuspend$$inlined$internalPerform$1;->invoke(Landroidx/room/Transactor;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1$invokeSuspend$$inlined$internalPerform$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1$invokeSuspend$$inlined$internalPerform$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1$invokeSuspend$$inlined$internalPerform$1$1; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1$invokeSuspend$$inlined$internalPerform$1$1;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1$invokeSuspend$$inlined$internalPerform$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1$invokeSuspend$$inlined$internalPerform$1$1;->invoke(Landroidx/room/TransactionScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1$invokeSuspend$$inlined$internalPerform$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performBlocking$1$invokeSuspend$$inlined$internalPerform$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$$inlined$compatCoroutineExecute$DBUtil__DBUtil_androidKt$1; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$$inlined$compatCoroutineExecute$DBUtil__DBUtil_androidKt$1;->(Lkotlin/coroutines/Continuation;Landroidx/room/RoomDatabase;ZZLkotlin/jvm/functions/Function1;)V +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$$inlined$compatCoroutineExecute$DBUtil__DBUtil_androidKt$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$$inlined$compatCoroutineExecute$DBUtil__DBUtil_androidKt$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$$inlined$compatCoroutineExecute$DBUtil__DBUtil_androidKt$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$$inlined$compatCoroutineExecute$DBUtil__DBUtil_androidKt$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$1; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$1;->(Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1;->(ZZLandroidx/room/RoomDatabase;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1;->invoke(Landroidx/room/Transactor;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1$1; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1$1;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1$1;->invoke(Landroidx/room/TransactionScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/util/KClassUtil; +SPLandroidx/room/util/KClassUtil;->findAndInstantiateDatabaseImpl$default(Ljava/lang/Class;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/util/KClassUtil;->findAndInstantiateDatabaseImpl(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object; +Landroidx/room/util/MappedColumnsSQLiteStatementWrapper; +Landroidx/room/util/MigrationUtil; +SPLandroidx/room/util/MigrationUtil;->contains(Landroidx/room/RoomDatabase$MigrationContainer;II)Z +Landroidx/room/util/SQLiteConnectionUtil; +SPLandroidx/room/util/SQLiteConnectionUtil;->getTotalChangedRows(Landroidx/sqlite/SQLiteConnection;)I +Landroidx/room/util/SQLiteStatementUtil; +SPLandroidx/room/util/SQLiteStatementUtil;->columnIndexOf(Landroidx/sqlite/SQLiteStatement;Ljava/lang/String;)I +SPLandroidx/room/util/SQLiteStatementUtil;->columnIndexOfCommon(Landroidx/sqlite/SQLiteStatement;Ljava/lang/String;)I +SPLandroidx/room/util/SQLiteStatementUtil;->getColumnIndexOrThrow(Landroidx/sqlite/SQLiteStatement;Ljava/lang/String;)I +Landroidx/room/util/SQLiteStatementUtil__StatementUtilKt; +SPLandroidx/room/util/SQLiteStatementUtil__StatementUtilKt;->columnIndexOfCommon(Landroidx/sqlite/SQLiteStatement;Ljava/lang/String;)I +SPLandroidx/room/util/SQLiteStatementUtil__StatementUtilKt;->getColumnIndexOrThrow(Landroidx/sqlite/SQLiteStatement;Ljava/lang/String;)I +Landroidx/room/util/SQLiteStatementUtil__StatementUtil_androidKt; +SPLandroidx/room/util/SQLiteStatementUtil__StatementUtil_androidKt;->columnIndexOf(Landroidx/sqlite/SQLiteStatement;Ljava/lang/String;)I +Landroidx/savedstate/R$id; +Landroidx/savedstate/Recreator; +SPLandroidx/savedstate/Recreator;->()V +SPLandroidx/savedstate/Recreator;->(Landroidx/savedstate/SavedStateRegistryOwner;)V +SPLandroidx/savedstate/Recreator;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/savedstate/Recreator$Companion; +SPLandroidx/savedstate/Recreator$Companion;->()V +SPLandroidx/savedstate/Recreator$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/savedstate/SavedStateReader; +SPLandroidx/savedstate/SavedStateReader;->constructor-impl(Landroid/os/Bundle;)Landroid/os/Bundle; +SPLandroidx/savedstate/SavedStateReader;->contains-impl(Landroid/os/Bundle;Ljava/lang/String;)Z +SPLandroidx/savedstate/SavedStateReader;->toMap-impl(Landroid/os/Bundle;)Ljava/util/Map; +Landroidx/savedstate/SavedStateRegistry; +SPLandroidx/savedstate/SavedStateRegistry;->(Landroidx/savedstate/internal/SavedStateRegistryImpl;)V +SPLandroidx/savedstate/SavedStateRegistry;->consumeRestoredStateForKey(Ljava/lang/String;)Landroid/os/Bundle; +SPLandroidx/savedstate/SavedStateRegistry;->getSavedStateProvider(Ljava/lang/String;)Landroidx/savedstate/SavedStateRegistry$SavedStateProvider; +SPLandroidx/savedstate/SavedStateRegistry;->registerSavedStateProvider(Ljava/lang/String;Landroidx/savedstate/SavedStateRegistry$SavedStateProvider;)V +Landroidx/savedstate/SavedStateRegistry$SavedStateProvider; +Landroidx/savedstate/SavedStateRegistryController; +SPLandroidx/savedstate/SavedStateRegistryController;->()V +SPLandroidx/savedstate/SavedStateRegistryController;->(Landroidx/savedstate/internal/SavedStateRegistryImpl;)V +SPLandroidx/savedstate/SavedStateRegistryController;->(Landroidx/savedstate/internal/SavedStateRegistryImpl;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/savedstate/SavedStateRegistryController;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; +SPLandroidx/savedstate/SavedStateRegistryController;->performAttach()V +SPLandroidx/savedstate/SavedStateRegistryController;->performRestore(Landroid/os/Bundle;)V +Landroidx/savedstate/SavedStateRegistryController$Companion; +SPLandroidx/savedstate/SavedStateRegistryController$Companion;->()V +SPLandroidx/savedstate/SavedStateRegistryController$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/savedstate/SavedStateRegistryController$Companion;->create$lambda$0(Landroidx/savedstate/SavedStateRegistryOwner;)Lkotlin/Unit; +SPLandroidx/savedstate/SavedStateRegistryController$Companion;->create(Landroidx/savedstate/SavedStateRegistryOwner;)Landroidx/savedstate/SavedStateRegistryController; +Landroidx/savedstate/SavedStateRegistryController$Companion$$ExternalSyntheticLambda0; +SPLandroidx/savedstate/SavedStateRegistryController$Companion$$ExternalSyntheticLambda0;->(Landroidx/savedstate/SavedStateRegistryOwner;)V +SPLandroidx/savedstate/SavedStateRegistryController$Companion$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/savedstate/SavedStateRegistryOwner; +Landroidx/savedstate/SavedStateWriter; +SPLandroidx/savedstate/SavedStateWriter;->constructor-impl(Landroid/os/Bundle;)Landroid/os/Bundle; +Landroidx/savedstate/ViewTreeSavedStateRegistryOwner; +SPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner;->set(Landroid/view/View;Landroidx/savedstate/SavedStateRegistryOwner;)V +Landroidx/savedstate/internal/SavedStateRegistryImpl; +SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->()V +SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->(Landroidx/savedstate/SavedStateRegistryOwner;Lkotlin/jvm/functions/Function0;)V +SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->access$getKeyToProviders$p(Landroidx/savedstate/internal/SavedStateRegistryImpl;)Ljava/util/Map; +SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->consumeRestoredStateForKey(Ljava/lang/String;)Landroid/os/Bundle; +SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->getSavedStateProvider(Ljava/lang/String;)Landroidx/savedstate/SavedStateRegistry$SavedStateProvider; +SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->performAttach$lambda$12(Landroidx/savedstate/internal/SavedStateRegistryImpl;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->performAttach()V +SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->performRestore$savedstate(Landroid/os/Bundle;)V +SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->registerSavedStateProvider(Ljava/lang/String;Landroidx/savedstate/SavedStateRegistry$SavedStateProvider;)V +Landroidx/savedstate/internal/SavedStateRegistryImpl$$ExternalSyntheticLambda0; +SPLandroidx/savedstate/internal/SavedStateRegistryImpl$$ExternalSyntheticLambda0;->(Landroidx/savedstate/internal/SavedStateRegistryImpl;)V +SPLandroidx/savedstate/internal/SavedStateRegistryImpl$$ExternalSyntheticLambda0;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/savedstate/internal/SavedStateRegistryImpl$Companion; +SPLandroidx/savedstate/internal/SavedStateRegistryImpl$Companion;->()V +SPLandroidx/savedstate/internal/SavedStateRegistryImpl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/savedstate/internal/SynchronizedObject; +SPLandroidx/savedstate/internal/SynchronizedObject;->()V +Landroidx/sqlite/SQLite; +SPLandroidx/sqlite/SQLite;->execSQL(Landroidx/sqlite/SQLiteConnection;Ljava/lang/String;)V +Landroidx/sqlite/SQLiteConnection; +Landroidx/sqlite/SQLiteDriver; +Landroidx/sqlite/SQLiteStatement; +SPLandroidx/sqlite/SQLiteStatement;->getBoolean(I)Z +Landroidx/sqlite/SQLite__SQLite_nonWebKt; +SPLandroidx/sqlite/SQLite__SQLite_nonWebKt;->execSQL(Landroidx/sqlite/SQLiteConnection;Ljava/lang/String;)V +Landroidx/sqlite/db/SupportSQLiteDatabase; +Landroidx/sqlite/db/SupportSQLiteOpenHelper; +Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback; +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;->()V +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;->(I)V +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;->onConfigure(Landroidx/sqlite/db/SupportSQLiteDatabase;)V +Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback$Companion; +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback$Companion;->()V +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration; +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;->()V +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;ZZ)V +Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder; +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->(Landroid/content/Context;)V +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->allowDataLossOnRecovery(Z)Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder; +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->build()Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration; +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->callback(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;)Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder; +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->name(Ljava/lang/String;)Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder; +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->noBackupDirectory(Z)Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder; +Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Companion; +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Companion;->()V +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Companion;->builder(Landroid/content/Context;)Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder; +Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory; +Landroidx/sqlite/db/SupportSQLiteProgram; +Landroidx/sqlite/db/SupportSQLiteQuery; +Landroidx/sqlite/db/SupportSQLiteStatement; +Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->(Landroid/database/sqlite/SQLiteDatabase;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->access$getBeginTransactionMethod$delegate$cp()Lkotlin/Lazy; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->access$getGetThreadSessionMethod$delegate$cp()Lkotlin/Lazy; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransaction()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransactionMethod_delegate$lambda$0()Ljava/lang/reflect/Method; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransactionNonExclusive()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransactionReadOnly()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->compileStatement(Ljava/lang/String;)Landroidx/sqlite/db/SupportSQLiteStatement; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->endTransaction()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->execSQL(Ljava/lang/String;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->getThreadSessionMethod_delegate$lambda$0()Ljava/lang/reflect/Method; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->inTransaction()Z +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->internalBeginTransactionWithListenerReadOnly(Landroid/database/sqlite/SQLiteTransactionListener;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isDelegate$sqlite_framework(Landroid/database/sqlite/SQLiteDatabase;)Z +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isOpen()Z +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isWriteAheadLoggingEnabled()Z +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->query$lambda$0(Landroidx/sqlite/db/SupportSQLiteQuery;Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)Landroid/database/sqlite/SQLiteCursor; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->query$lambda$1(Lkotlin/jvm/functions/Function4;Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)Landroid/database/Cursor; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;)Landroid/database/Cursor; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->setTransactionSuccessful()V +Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda1; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda1;->(Landroidx/sqlite/db/SupportSQLiteQuery;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda2; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda2;->(Lkotlin/jvm/functions/Function4;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda2;->newCursor(Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)Landroid/database/Cursor; +Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda3; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda3;->()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda3;->invoke()Ljava/lang/Object; +Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda4; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda4;->()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda4;->invoke()Ljava/lang/Object; +Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion;->()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion;->access$getBeginTransactionMethod(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion;)Ljava/lang/reflect/Method; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion;->access$getGetThreadSessionMethod(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion;)Ljava/lang/reflect/Method; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion;->getBeginTransactionMethod()Ljava/lang/reflect/Method; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion;->getGetThreadSessionMethod()Ljava/lang/reflect/Method; +Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;ZZ)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->getDatabaseName()Ljava/lang/String; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->getDelegate()Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->getWritableDatabase()Landroidx/sqlite/db/SupportSQLiteDatabase; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->lazyDelegate$lambda$0(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->setWriteAheadLoggingEnabled(Z)V +Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$$ExternalSyntheticLambda0; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$$ExternalSyntheticLambda0;->(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$Companion; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$Companion;->()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;->(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;->getDb()Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;->setDb(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;)V +Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;Z)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getSupportDatabase(Z)Landroidx/sqlite/db/SupportSQLiteDatabase; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getWrappedDb(Landroid/database/sqlite/SQLiteDatabase;)Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getWritableOrReadableDatabase(Z)Landroid/database/sqlite/SQLiteDatabase; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->innerGetDatabase(Z)Landroid/database/sqlite/SQLiteDatabase; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onConfigure(Landroid/database/sqlite/SQLiteDatabase;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V +Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$$ExternalSyntheticLambda0; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$$ExternalSyntheticLambda0;->(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;)V +Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$CallbackException; +Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$Companion; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$Companion;->()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$Companion;->getWrappedDb(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;Landroid/database/sqlite/SQLiteDatabase;)Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; +Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelperFactory; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelperFactory;->()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelperFactory;->create(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; +Landroidx/sqlite/db/framework/FrameworkSQLiteProgram; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->(Landroid/database/sqlite/SQLiteProgram;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindLong(IJ)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindString(ILjava/lang/String;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->close()V +Landroidx/sqlite/db/framework/FrameworkSQLiteStatement; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteStatement;->(Landroid/database/sqlite/SQLiteStatement;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteStatement;->execute()V +Landroidx/sqlite/util/ProcessLock; +SPLandroidx/sqlite/util/ProcessLock;->()V +SPLandroidx/sqlite/util/ProcessLock;->(Ljava/lang/String;Ljava/io/File;Z)V +SPLandroidx/sqlite/util/ProcessLock;->access$getThreadLocksMap$cp()Ljava/util/Map; +SPLandroidx/sqlite/util/ProcessLock;->lock(Z)V +SPLandroidx/sqlite/util/ProcessLock;->unlock()V +Landroidx/sqlite/util/ProcessLock$Companion; +SPLandroidx/sqlite/util/ProcessLock$Companion;->()V +SPLandroidx/sqlite/util/ProcessLock$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/sqlite/util/ProcessLock$Companion;->access$getThreadLock(Landroidx/sqlite/util/ProcessLock$Companion;Ljava/lang/String;)Ljava/util/concurrent/locks/Lock; +SPLandroidx/sqlite/util/ProcessLock$Companion;->getThreadLock(Ljava/lang/String;)Ljava/util/concurrent/locks/Lock; +Landroidx/startup/AppInitializer; +SPLandroidx/startup/AppInitializer;->()V +SPLandroidx/startup/AppInitializer;->(Landroid/content/Context;)V +SPLandroidx/startup/AppInitializer;->discoverAndInitialize(Landroid/os/Bundle;)V +SPLandroidx/startup/AppInitializer;->discoverAndInitialize(Ljava/lang/Class;)V +SPLandroidx/startup/AppInitializer;->doInitialize(Ljava/lang/Class;)Ljava/lang/Object; +SPLandroidx/startup/AppInitializer;->doInitialize(Ljava/lang/Class;Ljava/util/Set;)Ljava/lang/Object; +SPLandroidx/startup/AppInitializer;->getInstance(Landroid/content/Context;)Landroidx/startup/AppInitializer; +SPLandroidx/startup/AppInitializer;->initializeComponent(Ljava/lang/Class;)Ljava/lang/Object; +SPLandroidx/startup/AppInitializer;->isEagerlyInitialized(Ljava/lang/Class;)Z +Landroidx/startup/InitializationProvider; +SPLandroidx/startup/InitializationProvider;->()V +SPLandroidx/startup/InitializationProvider;->onCreate()Z +Landroidx/startup/Initializer; +Landroidx/startup/R$string; +Landroidx/swiperefreshlayout/R$styleable; +SPLandroidx/swiperefreshlayout/R$styleable;->()V +Landroidx/swiperefreshlayout/widget/CircleImageView; +SPLandroidx/swiperefreshlayout/widget/CircleImageView;->(Landroid/content/Context;)V +SPLandroidx/swiperefreshlayout/widget/CircleImageView;->elevationSupported()Z +SPLandroidx/swiperefreshlayout/widget/CircleImageView;->onMeasure(II)V +Landroidx/swiperefreshlayout/widget/CircularProgressDrawable; +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->()V +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->(Landroid/content/Context;)V +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->getOpacity()I +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setSizeParameters(FFFF)V +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setStrokeWidth(F)V +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setStyle(I)V +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setupAnimators()V +Landroidx/swiperefreshlayout/widget/CircularProgressDrawable$1; +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$1;->(Landroidx/swiperefreshlayout/widget/CircularProgressDrawable;Landroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;)V +Landroidx/swiperefreshlayout/widget/CircularProgressDrawable$2; +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$2;->(Landroidx/swiperefreshlayout/widget/CircularProgressDrawable;Landroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;)V +Landroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring; +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->()V +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setArrowDimensions(FF)V +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setCenterRadius(F)V +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setColorIndex(I)V +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setColors([I)V +SPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setStrokeWidth(F)V +Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout; +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->()V +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->createProgressView()V +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->ensureTarget()V +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->getChildDrawingOrder(II)I +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->moveToStart(F)V +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onLayout(ZIIII)V +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onMeasure(II)V +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setDistanceToTriggerSync(I)V +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setEnabled(Z)V +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setNestedScrollingEnabled(Z)V +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setOnRefreshListener(Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout$OnRefreshListener;)V +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setTargetOffsetTopAndBottom(I)V +Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout$1; +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout$1;->(Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout;)V +Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout$6; +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout$6;->(Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout;)V +Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout$7; +SPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout$7;->(Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout;)V +Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout$OnRefreshListener; +Landroidx/tracing/PerfettoTracer$$ExternalSyntheticApiModelOutline0; +SPLandroidx/tracing/PerfettoTracer$$ExternalSyntheticApiModelOutline0;->m()Landroid/content/pm/PackageInfo; +Landroidx/tracing/Trace; +SPLandroidx/tracing/Trace;->()V +SPLandroidx/tracing/Trace;->()V +SPLandroidx/tracing/Trace;->beginSection(Ljava/lang/String;)V +SPLandroidx/tracing/Trace;->endSection()V +SPLandroidx/tracing/Trace;->isEnabled()Z +SPLandroidx/tracing/Trace;->truncatedTraceSectionLabel(Ljava/lang/String;)Ljava/lang/String; +Landroidx/tracing/TraceApi29Impl; +SPLandroidx/tracing/TraceApi29Impl;->()V +SPLandroidx/tracing/TraceApi29Impl;->()V +SPLandroidx/tracing/TraceApi29Impl;->isEnabled()Z +Landroidx/transition/AutoTransition; +SPLandroidx/transition/AutoTransition;->()V +SPLandroidx/transition/AutoTransition;->init()V +Landroidx/transition/ChangeBounds; +SPLandroidx/transition/ChangeBounds;->()V +SPLandroidx/transition/ChangeBounds;->()V +Landroidx/transition/ChangeBounds$1; +SPLandroidx/transition/ChangeBounds$1;->(Ljava/lang/Class;Ljava/lang/String;)V +Landroidx/transition/ChangeBounds$2; +SPLandroidx/transition/ChangeBounds$2;->(Ljava/lang/Class;Ljava/lang/String;)V +Landroidx/transition/ChangeBounds$3; +SPLandroidx/transition/ChangeBounds$3;->(Ljava/lang/Class;Ljava/lang/String;)V +Landroidx/transition/ChangeBounds$4; +SPLandroidx/transition/ChangeBounds$4;->(Ljava/lang/Class;Ljava/lang/String;)V +Landroidx/transition/ChangeBounds$5; +SPLandroidx/transition/ChangeBounds$5;->(Ljava/lang/Class;Ljava/lang/String;)V +Landroidx/transition/Fade; +SPLandroidx/transition/Fade;->(I)V +Landroidx/transition/PathMotion; +SPLandroidx/transition/PathMotion;->()V +Landroidx/transition/RectEvaluator; +SPLandroidx/transition/RectEvaluator;->()V +Landroidx/transition/Transition; +SPLandroidx/transition/Transition;->()V +SPLandroidx/transition/Transition;->()V +SPLandroidx/transition/Transition;->excludeTarget(Ljava/lang/Class;Z)Landroidx/transition/Transition; +SPLandroidx/transition/Transition;->excludeType(Ljava/util/ArrayList;Ljava/lang/Class;Z)Ljava/util/ArrayList; +SPLandroidx/transition/Transition;->getInterpolator()Landroid/animation/TimeInterpolator; +SPLandroidx/transition/Transition;->setDuration(J)Landroidx/transition/Transition; +SPLandroidx/transition/Transition;->setInterpolator(Landroid/animation/TimeInterpolator;)Landroidx/transition/Transition; +Landroidx/transition/Transition$1; +SPLandroidx/transition/Transition$1;->()V +Landroidx/transition/Transition$ArrayListManager; +SPLandroidx/transition/Transition$ArrayListManager;->add(Ljava/util/ArrayList;Ljava/lang/Object;)Ljava/util/ArrayList; +Landroidx/transition/TransitionManager; +SPLandroidx/transition/TransitionManager;->()V +SPLandroidx/transition/TransitionManager;->beginDelayedTransition(Landroid/view/ViewGroup;Landroidx/transition/Transition;)V +Landroidx/transition/TransitionSet; +SPLandroidx/transition/TransitionSet;->()V +SPLandroidx/transition/TransitionSet;->addTransition(Landroidx/transition/Transition;)Landroidx/transition/TransitionSet; +SPLandroidx/transition/TransitionSet;->addTransitionInternal(Landroidx/transition/Transition;)V +SPLandroidx/transition/TransitionSet;->excludeTarget(Ljava/lang/Class;Z)Landroidx/transition/Transition; +SPLandroidx/transition/TransitionSet;->setDuration(J)Landroidx/transition/TransitionSet; +SPLandroidx/transition/TransitionSet;->setInterpolator(Landroid/animation/TimeInterpolator;)Landroidx/transition/TransitionSet; +SPLandroidx/transition/TransitionSet;->setOrdering(I)Landroidx/transition/TransitionSet; +Landroidx/transition/TransitionValuesMaps; +SPLandroidx/transition/TransitionValuesMaps;->()V +Landroidx/transition/Visibility; +SPLandroidx/transition/Visibility;->()V +SPLandroidx/transition/Visibility;->()V +SPLandroidx/transition/Visibility;->setMode(I)V +Landroidx/vectordrawable/graphics/drawable/Animatable2Compat; +Landroidx/vectordrawable/graphics/drawable/Animatable2Compat$AnimationCallback; +SPLandroidx/vectordrawable/graphics/drawable/Animatable2Compat$AnimationCallback;->()V +Landroidx/vectordrawable/graphics/drawable/AnimationUtilsCompat; +SPLandroidx/vectordrawable/graphics/drawable/AnimationUtilsCompat;->loadInterpolator(Landroid/content/Context;I)Landroid/view/animation/Interpolator; +Landroidx/vectordrawable/graphics/drawable/VectorDrawableCommon; +Landroidx/vectordrawable/graphics/drawable/VectorDrawableCompat; +Landroidx/versionedparcelable/CustomVersionedParcelable; +SPLandroidx/versionedparcelable/CustomVersionedParcelable;->()V +Landroidx/versionedparcelable/VersionedParcelable; +Landroidx/viewbinding/ViewBinding; +Landroidx/viewbinding/ViewBindings; +SPLandroidx/viewbinding/ViewBindings;->findChildViewById(Landroid/view/View;I)Landroid/view/View; +Landroidx/webkit/ProcessGlobalConfig; +SPLandroidx/webkit/ProcessGlobalConfig;->()V +Landroidx/webkit/WebViewCompat; +SPLandroidx/webkit/WebViewCompat;->()V +SPLandroidx/webkit/WebViewCompat;->getCurrentLoadedWebViewPackage()Landroid/content/pm/PackageInfo; +SPLandroidx/webkit/WebViewCompat;->getCurrentWebViewPackage(Landroid/content/Context;)Landroid/content/pm/PackageInfo; +Landroidx/webkit/internal/ApiHelperForO; +SPLandroidx/webkit/internal/ApiHelperForO;->getCurrentWebViewPackage()Landroid/content/pm/PackageInfo; +Landroidx/work/Clock; +Landroidx/work/Configuration; +SPLandroidx/work/Configuration;->()V +SPLandroidx/work/Configuration;->(Landroidx/work/Configuration$Builder;)V +SPLandroidx/work/Configuration;->getClock()Landroidx/work/Clock; +SPLandroidx/work/Configuration;->getDefaultProcessName()Ljava/lang/String; +SPLandroidx/work/Configuration;->getMaxSchedulerLimit()I +SPLandroidx/work/Configuration;->getMinimumLoggingLevel()I +SPLandroidx/work/Configuration;->getRunnableScheduler()Landroidx/work/RunnableScheduler; +SPLandroidx/work/Configuration;->getTaskExecutor()Ljava/util/concurrent/Executor; +SPLandroidx/work/Configuration;->getTracer()Landroidx/work/Tracer; +SPLandroidx/work/Configuration;->isGreedySchedulerEnabled()Z +SPLandroidx/work/Configuration;->isMarkingJobsAsImportantWhileForeground()Z +SPLandroidx/work/Configuration;->isRepresentativeJobsEnabled()Z +Landroidx/work/Configuration$Builder; +SPLandroidx/work/Configuration$Builder;->()V +SPLandroidx/work/Configuration$Builder;->build()Landroidx/work/Configuration; +SPLandroidx/work/Configuration$Builder;->getClock$work_runtime()Landroidx/work/Clock; +SPLandroidx/work/Configuration$Builder;->getContentUriTriggerWorkersLimit$work_runtime()I +SPLandroidx/work/Configuration$Builder;->getDefaultProcessName$work_runtime()Ljava/lang/String; +SPLandroidx/work/Configuration$Builder;->getEnableGreedyScheduler$work_runtime()Z +SPLandroidx/work/Configuration$Builder;->getEnableRepresentativeJobs$work_runtime()Z +SPLandroidx/work/Configuration$Builder;->getExecutionEventListener$work_runtime()Landroidx/work/ExecutionEventListener; +SPLandroidx/work/Configuration$Builder;->getExecutor$work_runtime()Ljava/util/concurrent/Executor; +SPLandroidx/work/Configuration$Builder;->getInitializationExceptionHandler$work_runtime()Landroidx/core/util/Consumer; +SPLandroidx/work/Configuration$Builder;->getInputMergerFactory$work_runtime()Landroidx/work/InputMergerFactory; +SPLandroidx/work/Configuration$Builder;->getLoggingLevel$work_runtime()I +SPLandroidx/work/Configuration$Builder;->getMarkJobsAsImportantWhileForeground$work_runtime()Z +SPLandroidx/work/Configuration$Builder;->getMaxJobSchedulerId$work_runtime()I +SPLandroidx/work/Configuration$Builder;->getMaxSchedulerLimit$work_runtime()I +SPLandroidx/work/Configuration$Builder;->getMinJobSchedulerId$work_runtime()I +SPLandroidx/work/Configuration$Builder;->getRemoteCancellationPropagationFixEnabled$work_runtime()Z +SPLandroidx/work/Configuration$Builder;->getRemoteSessionTimeoutMillis$work_runtime()J +SPLandroidx/work/Configuration$Builder;->getRunnableScheduler$work_runtime()Landroidx/work/RunnableScheduler; +SPLandroidx/work/Configuration$Builder;->getScheduleEventListener$work_runtime()Landroidx/work/ScheduleEventListener; +SPLandroidx/work/Configuration$Builder;->getSchedulingExceptionHandler$work_runtime()Landroidx/core/util/Consumer; +SPLandroidx/work/Configuration$Builder;->getTaskExecutor$work_runtime()Ljava/util/concurrent/Executor; +SPLandroidx/work/Configuration$Builder;->getTracer$work_runtime()Landroidx/work/Tracer; +SPLandroidx/work/Configuration$Builder;->getWorkerContext$work_runtime()Lkotlin/coroutines/CoroutineContext; +SPLandroidx/work/Configuration$Builder;->getWorkerExecutionExceptionHandler$work_runtime()Landroidx/core/util/Consumer; +SPLandroidx/work/Configuration$Builder;->getWorkerFactory$work_runtime()Landroidx/work/WorkerFactory; +SPLandroidx/work/Configuration$Builder;->getWorkerInitializationExceptionHandler$work_runtime()Landroidx/core/util/Consumer; +Landroidx/work/Configuration$Companion; +SPLandroidx/work/Configuration$Companion;->()V +SPLandroidx/work/Configuration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/work/Configuration$Companion;->calculateExecutorParallelismLimit()I +Landroidx/work/ConfigurationKt; +SPLandroidx/work/ConfigurationKt;->access$createDefaultTracer()Landroidx/work/Tracer; +SPLandroidx/work/ConfigurationKt;->createDefaultTracer()Landroidx/work/Tracer; +Landroidx/work/ConfigurationKt$createDefaultTracer$tracer$1; +SPLandroidx/work/ConfigurationKt$createDefaultTracer$tracer$1;->()V +SPLandroidx/work/ConfigurationKt$createDefaultTracer$tracer$1;->isEnabled()Z +Landroidx/work/CoroutineWorker; +Landroidx/work/Data; +Landroidx/work/Data$Builder; +Landroidx/work/DefaultWorkerFactory; +SPLandroidx/work/DefaultWorkerFactory;->()V +SPLandroidx/work/DefaultWorkerFactory;->()V +Landroidx/work/ExecutionEventListener; +Landroidx/work/InputMergerFactory; +SPLandroidx/work/InputMergerFactory;->()V +Landroidx/work/ListenableWorker; +Landroidx/work/Logger; +SPLandroidx/work/Logger;->()V +SPLandroidx/work/Logger;->(I)V +SPLandroidx/work/Logger;->get()Landroidx/work/Logger; +SPLandroidx/work/Logger;->setLogger(Landroidx/work/Logger;)V +SPLandroidx/work/Logger;->tagWithPrefix(Ljava/lang/String;)Ljava/lang/String; +Landroidx/work/Logger$LogcatLogger; +SPLandroidx/work/Logger$LogcatLogger;->(I)V +SPLandroidx/work/Logger$LogcatLogger;->debug(Ljava/lang/String;Ljava/lang/String;)V +Landroidx/work/NetworkType; +SPLandroidx/work/NetworkType;->$values()[Landroidx/work/NetworkType; +SPLandroidx/work/NetworkType;->()V +SPLandroidx/work/NetworkType;->(Ljava/lang/String;I)V +Landroidx/work/NoOpInputMergerFactory; +SPLandroidx/work/NoOpInputMergerFactory;->()V +SPLandroidx/work/NoOpInputMergerFactory;->()V +Landroidx/work/Operation; +SPLandroidx/work/Operation;->()V +Landroidx/work/Operation$State; +SPLandroidx/work/Operation$State;->()V +Landroidx/work/Operation$State$IN_PROGRESS; +SPLandroidx/work/Operation$State$IN_PROGRESS;->()V +SPLandroidx/work/Operation$State$IN_PROGRESS;->(Landroidx/work/Operation-IA;)V +Landroidx/work/Operation$State$SUCCESS; +SPLandroidx/work/Operation$State$SUCCESS;->()V +SPLandroidx/work/Operation$State$SUCCESS;->(Landroidx/work/Operation-IA;)V +Landroidx/work/OperationImpl; +SPLandroidx/work/OperationImpl;->(Landroidx/lifecycle/LiveData;Lcom/google/common/util/concurrent/ListenableFuture;)V +Landroidx/work/OperationKt; +SPLandroidx/work/OperationKt;->$r8$lambda$HpXEiU5zZrnWi4iuCKdgd7dMYGk(Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/MutableLiveData;Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer;)V +SPLandroidx/work/OperationKt;->launchOperation$lambda$0$0(Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/MutableLiveData;Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer;)V +SPLandroidx/work/OperationKt;->launchOperation$lambda$0(Ljava/util/concurrent/Executor;Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/MutableLiveData;Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer;)Lkotlin/Unit; +SPLandroidx/work/OperationKt;->launchOperation(Landroidx/work/Tracer;Ljava/lang/String;Ljava/util/concurrent/Executor;Lkotlin/jvm/functions/Function0;)Landroidx/work/Operation; +Landroidx/work/OperationKt$$ExternalSyntheticLambda0; +SPLandroidx/work/OperationKt$$ExternalSyntheticLambda0;->(Ljava/util/concurrent/Executor;Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/MutableLiveData;)V +SPLandroidx/work/OperationKt$$ExternalSyntheticLambda0;->attachCompleter(Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer;)Ljava/lang/Object; +Landroidx/work/OperationKt$$ExternalSyntheticLambda1; +SPLandroidx/work/OperationKt$$ExternalSyntheticLambda1;->(Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/MutableLiveData;Landroidx/concurrent/futures/CallbackToFutureAdapter$Completer;)V +SPLandroidx/work/OperationKt$$ExternalSyntheticLambda1;->run()V +Landroidx/work/R$bool; +Landroidx/work/RunnableScheduler; +Landroidx/work/ScheduleEventListener; +Landroidx/work/SystemClock; +SPLandroidx/work/SystemClock;->()V +SPLandroidx/work/SystemClock;->currentTimeMillis()J +Landroidx/work/Tracer; +Landroidx/work/TracerKt; +SPLandroidx/work/TracerKt;->traced(Landroidx/work/Tracer;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; +Landroidx/work/WorkInfo; +Landroidx/work/WorkInfo$State; +SPLandroidx/work/WorkInfo$State;->$values()[Landroidx/work/WorkInfo$State; +SPLandroidx/work/WorkInfo$State;->()V +SPLandroidx/work/WorkInfo$State;->(Ljava/lang/String;I)V +Landroidx/work/WorkManager; +SPLandroidx/work/WorkManager;->()V +SPLandroidx/work/WorkManager;->()V +SPLandroidx/work/WorkManager;->getInstance(Landroid/content/Context;)Landroidx/work/WorkManager; +SPLandroidx/work/WorkManager;->initialize(Landroid/content/Context;Landroidx/work/Configuration;)V +Landroidx/work/WorkManager$Companion; +SPLandroidx/work/WorkManager$Companion;->()V +SPLandroidx/work/WorkManager$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/work/WorkManager$Companion;->getInstance(Landroid/content/Context;)Landroidx/work/WorkManager; +SPLandroidx/work/WorkManager$Companion;->initialize(Landroid/content/Context;Landroidx/work/Configuration;)V +SPLandroidx/work/WorkManager$Companion;->isInitialized()Z +Landroidx/work/WorkManagerInitializer; +SPLandroidx/work/WorkManagerInitializer;->()V +SPLandroidx/work/WorkManagerInitializer;->()V +SPLandroidx/work/WorkManagerInitializer;->create(Landroid/content/Context;)Landroidx/work/WorkManager; +SPLandroidx/work/WorkManagerInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; +SPLandroidx/work/WorkManagerInitializer;->dependencies()Ljava/util/List; +Landroidx/work/WorkerFactory; +SPLandroidx/work/WorkerFactory;->()V +Landroidx/work/impl/AutoMigration_14_15; +SPLandroidx/work/impl/AutoMigration_14_15;->()V +Landroidx/work/impl/AutoMigration_19_20; +SPLandroidx/work/impl/AutoMigration_19_20;->()V +Landroidx/work/impl/CleanupCallback; +SPLandroidx/work/impl/CleanupCallback;->(Landroidx/work/Clock;)V +SPLandroidx/work/impl/CleanupCallback;->getPruneDate()J +SPLandroidx/work/impl/CleanupCallback;->getPruneSQL()Ljava/lang/String; +SPLandroidx/work/impl/CleanupCallback;->onOpen(Landroidx/sqlite/db/SupportSQLiteDatabase;)V +Landroidx/work/impl/DefaultRunnableScheduler; +SPLandroidx/work/impl/DefaultRunnableScheduler;->()V +Landroidx/work/impl/ExecutionListener; +Landroidx/work/impl/Migration_11_12; +SPLandroidx/work/impl/Migration_11_12;->()V +SPLandroidx/work/impl/Migration_11_12;->()V +Landroidx/work/impl/Migration_12_13; +SPLandroidx/work/impl/Migration_12_13;->()V +SPLandroidx/work/impl/Migration_12_13;->()V +Landroidx/work/impl/Migration_15_16; +SPLandroidx/work/impl/Migration_15_16;->()V +SPLandroidx/work/impl/Migration_15_16;->()V +Landroidx/work/impl/Migration_16_17; +SPLandroidx/work/impl/Migration_16_17;->()V +SPLandroidx/work/impl/Migration_16_17;->()V +Landroidx/work/impl/Migration_1_2; +SPLandroidx/work/impl/Migration_1_2;->()V +SPLandroidx/work/impl/Migration_1_2;->()V +Landroidx/work/impl/Migration_3_4; +SPLandroidx/work/impl/Migration_3_4;->()V +SPLandroidx/work/impl/Migration_3_4;->()V +Landroidx/work/impl/Migration_4_5; +SPLandroidx/work/impl/Migration_4_5;->()V +SPLandroidx/work/impl/Migration_4_5;->()V +Landroidx/work/impl/Migration_6_7; +SPLandroidx/work/impl/Migration_6_7;->()V +SPLandroidx/work/impl/Migration_6_7;->()V +Landroidx/work/impl/Migration_7_8; +SPLandroidx/work/impl/Migration_7_8;->()V +SPLandroidx/work/impl/Migration_7_8;->()V +Landroidx/work/impl/Migration_8_9; +SPLandroidx/work/impl/Migration_8_9;->()V +SPLandroidx/work/impl/Migration_8_9;->()V +Landroidx/work/impl/Processor; +SPLandroidx/work/impl/Processor;->()V +SPLandroidx/work/impl/Processor;->(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;Landroidx/work/impl/WorkDatabase;)V +SPLandroidx/work/impl/Processor;->addExecutionListener(Landroidx/work/impl/ExecutionListener;)V +Landroidx/work/impl/RescheduleMigration; +SPLandroidx/work/impl/RescheduleMigration;->(Landroid/content/Context;II)V +Landroidx/work/impl/Scheduler; +Landroidx/work/impl/Schedulers; +SPLandroidx/work/impl/Schedulers;->()V +SPLandroidx/work/impl/Schedulers;->createBestAvailableBackgroundScheduler(Landroid/content/Context;Landroidx/work/impl/WorkDatabase;Landroidx/work/Configuration;)Landroidx/work/impl/Scheduler; +SPLandroidx/work/impl/Schedulers;->markScheduled(Landroidx/work/impl/model/WorkSpecDao;Landroidx/work/Clock;Ljava/util/List;)V +SPLandroidx/work/impl/Schedulers;->registerRescheduling(Ljava/util/List;Landroidx/work/impl/Processor;Ljava/util/concurrent/Executor;Landroidx/work/impl/WorkDatabase;Landroidx/work/Configuration;)V +SPLandroidx/work/impl/Schedulers;->schedule(Landroidx/work/Configuration;Landroidx/work/impl/WorkDatabase;Ljava/util/List;)V +SPLandroidx/work/impl/Schedulers;->scheduleWorkSpecs(Ljava/util/List;Ljava/util/List;Z)V +Landroidx/work/impl/Schedulers$$ExternalSyntheticLambda1; +SPLandroidx/work/impl/Schedulers$$ExternalSyntheticLambda1;->(Ljava/util/concurrent/Executor;Landroidx/work/impl/WorkDatabase;Ljava/util/List;Landroidx/work/Configuration;)V +Landroidx/work/impl/StartStopTokens; +SPLandroidx/work/impl/StartStopTokens;->()V +SPLandroidx/work/impl/StartStopTokens;->create()Landroidx/work/impl/StartStopTokens; +Landroidx/work/impl/StartStopTokens$Companion; +SPLandroidx/work/impl/StartStopTokens$Companion;->()V +SPLandroidx/work/impl/StartStopTokens$Companion;->()V +SPLandroidx/work/impl/StartStopTokens$Companion;->create$default(Landroidx/work/impl/StartStopTokens$Companion;ZILjava/lang/Object;)Landroidx/work/impl/StartStopTokens; +SPLandroidx/work/impl/StartStopTokens$Companion;->create()Landroidx/work/impl/StartStopTokens; +SPLandroidx/work/impl/StartStopTokens$Companion;->create(Z)Landroidx/work/impl/StartStopTokens; +Landroidx/work/impl/StartStopTokensImpl; +SPLandroidx/work/impl/StartStopTokensImpl;->()V +Landroidx/work/impl/SynchronizedStartStopTokensImpl; +SPLandroidx/work/impl/SynchronizedStartStopTokensImpl;->(Landroidx/work/impl/StartStopTokens;)V +Landroidx/work/impl/UnfinishedWorkListenerKt; +SPLandroidx/work/impl/UnfinishedWorkListenerKt;->()V +SPLandroidx/work/impl/UnfinishedWorkListenerKt;->maybeLaunchUnfinishedWorkListener(Lkotlinx/coroutines/CoroutineScope;Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/WorkDatabase;)V +Landroidx/work/impl/UnfinishedWorkListenerKt$maybeLaunchUnfinishedWorkListener$1; +SPLandroidx/work/impl/UnfinishedWorkListenerKt$maybeLaunchUnfinishedWorkListener$1;->(Lkotlin/coroutines/Continuation;)V +Landroidx/work/impl/UnfinishedWorkListenerKt$maybeLaunchUnfinishedWorkListener$2; +SPLandroidx/work/impl/UnfinishedWorkListenerKt$maybeLaunchUnfinishedWorkListener$2;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V +SPLandroidx/work/impl/UnfinishedWorkListenerKt$maybeLaunchUnfinishedWorkListener$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/work/impl/UnfinishedWorkListenerKt$maybeLaunchUnfinishedWorkListener$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/work/impl/UnfinishedWorkListenerKt$maybeLaunchUnfinishedWorkListener$2;->invoke(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/work/impl/UnfinishedWorkListenerKt$maybeLaunchUnfinishedWorkListener$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/WorkDatabase; +SPLandroidx/work/impl/WorkDatabase;->()V +SPLandroidx/work/impl/WorkDatabase;->()V +Landroidx/work/impl/WorkDatabase$Companion; +SPLandroidx/work/impl/WorkDatabase$Companion;->()V +SPLandroidx/work/impl/WorkDatabase$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/work/impl/WorkDatabase$Companion;->create$lambda$0(Landroid/content/Context;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; +SPLandroidx/work/impl/WorkDatabase$Companion;->create(Landroid/content/Context;Ljava/util/concurrent/Executor;Landroidx/work/Clock;Z)Landroidx/work/impl/WorkDatabase; +Landroidx/work/impl/WorkDatabase$Companion$$ExternalSyntheticLambda0; +SPLandroidx/work/impl/WorkDatabase$Companion$$ExternalSyntheticLambda0;->(Landroid/content/Context;)V +SPLandroidx/work/impl/WorkDatabase$Companion$$ExternalSyntheticLambda0;->create(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; +Landroidx/work/impl/WorkDatabaseKt; +SPLandroidx/work/impl/WorkDatabaseKt;->()V +Landroidx/work/impl/WorkDatabasePathHelper; +SPLandroidx/work/impl/WorkDatabasePathHelper;->()V +SPLandroidx/work/impl/WorkDatabasePathHelper;->()V +SPLandroidx/work/impl/WorkDatabasePathHelper;->getDefaultDatabasePath(Landroid/content/Context;)Ljava/io/File; +SPLandroidx/work/impl/WorkDatabasePathHelper;->migrateDatabase(Landroid/content/Context;)V +Landroidx/work/impl/WorkDatabase_AutoMigration_13_14_Impl; +SPLandroidx/work/impl/WorkDatabase_AutoMigration_13_14_Impl;->()V +Landroidx/work/impl/WorkDatabase_AutoMigration_14_15_Impl; +SPLandroidx/work/impl/WorkDatabase_AutoMigration_14_15_Impl;->()V +Landroidx/work/impl/WorkDatabase_AutoMigration_16_17_Impl; +SPLandroidx/work/impl/WorkDatabase_AutoMigration_16_17_Impl;->()V +Landroidx/work/impl/WorkDatabase_AutoMigration_17_18_Impl; +SPLandroidx/work/impl/WorkDatabase_AutoMigration_17_18_Impl;->()V +Landroidx/work/impl/WorkDatabase_AutoMigration_18_19_Impl; +SPLandroidx/work/impl/WorkDatabase_AutoMigration_18_19_Impl;->()V +Landroidx/work/impl/WorkDatabase_AutoMigration_19_20_Impl; +SPLandroidx/work/impl/WorkDatabase_AutoMigration_19_20_Impl;->()V +Landroidx/work/impl/WorkDatabase_AutoMigration_20_21_Impl; +SPLandroidx/work/impl/WorkDatabase_AutoMigration_20_21_Impl;->()V +Landroidx/work/impl/WorkDatabase_AutoMigration_22_23_Impl; +SPLandroidx/work/impl/WorkDatabase_AutoMigration_22_23_Impl;->()V +Landroidx/work/impl/WorkDatabase_AutoMigration_23_24_Impl; +SPLandroidx/work/impl/WorkDatabase_AutoMigration_23_24_Impl;->()V +Landroidx/work/impl/WorkDatabase_Impl; +SPLandroidx/work/impl/WorkDatabase_Impl;->()V +SPLandroidx/work/impl/WorkDatabase_Impl;->_preferenceDao$lambda$0(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/PreferenceDao_Impl; +SPLandroidx/work/impl/WorkDatabase_Impl;->_systemIdInfoDao$lambda$0(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/SystemIdInfoDao_Impl; +SPLandroidx/work/impl/WorkDatabase_Impl;->_workProgressDao$lambda$0(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/WorkProgressDao_Impl; +SPLandroidx/work/impl/WorkDatabase_Impl;->_workSpecDao$lambda$0(Landroidx/work/impl/WorkDatabase_Impl;)Landroidx/work/impl/model/WorkSpecDao_Impl; +SPLandroidx/work/impl/WorkDatabase_Impl;->access$internalInitInvalidationTracker(Landroidx/work/impl/WorkDatabase_Impl;Landroidx/sqlite/SQLiteConnection;)V +SPLandroidx/work/impl/WorkDatabase_Impl;->createAutoMigrations(Ljava/util/Map;)Ljava/util/List; +SPLandroidx/work/impl/WorkDatabase_Impl;->createInvalidationTracker()Landroidx/room/InvalidationTracker; +SPLandroidx/work/impl/WorkDatabase_Impl;->createOpenDelegate()Landroidx/room/RoomOpenDelegate; +SPLandroidx/work/impl/WorkDatabase_Impl;->createOpenDelegate()Landroidx/room/RoomOpenDelegateMarker; +SPLandroidx/work/impl/WorkDatabase_Impl;->getRequiredAutoMigrationSpecClasses()Ljava/util/Set; +SPLandroidx/work/impl/WorkDatabase_Impl;->getRequiredTypeConverterClasses()Ljava/util/Map; +SPLandroidx/work/impl/WorkDatabase_Impl;->preferenceDao()Landroidx/work/impl/model/PreferenceDao; +SPLandroidx/work/impl/WorkDatabase_Impl;->systemIdInfoDao()Landroidx/work/impl/model/SystemIdInfoDao; +SPLandroidx/work/impl/WorkDatabase_Impl;->workProgressDao()Landroidx/work/impl/model/WorkProgressDao; +SPLandroidx/work/impl/WorkDatabase_Impl;->workSpecDao()Landroidx/work/impl/model/WorkSpecDao; +Landroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda0; +SPLandroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda0;->(Landroidx/work/impl/WorkDatabase_Impl;)V +SPLandroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda1; +SPLandroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda1;->(Landroidx/work/impl/WorkDatabase_Impl;)V +Landroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda2; +SPLandroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda2;->(Landroidx/work/impl/WorkDatabase_Impl;)V +Landroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda3; +SPLandroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda3;->(Landroidx/work/impl/WorkDatabase_Impl;)V +SPLandroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda3;->invoke()Ljava/lang/Object; +Landroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda4; +SPLandroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda4;->(Landroidx/work/impl/WorkDatabase_Impl;)V +Landroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda5; +SPLandroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda5;->(Landroidx/work/impl/WorkDatabase_Impl;)V +SPLandroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda5;->invoke()Ljava/lang/Object; +Landroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda6; +SPLandroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda6;->(Landroidx/work/impl/WorkDatabase_Impl;)V +SPLandroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda6;->invoke()Ljava/lang/Object; +Landroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda7; +SPLandroidx/work/impl/WorkDatabase_Impl$$ExternalSyntheticLambda7;->(Landroidx/work/impl/WorkDatabase_Impl;)V +Landroidx/work/impl/WorkDatabase_Impl$createOpenDelegate$_openDelegate$1; +SPLandroidx/work/impl/WorkDatabase_Impl$createOpenDelegate$_openDelegate$1;->(Landroidx/work/impl/WorkDatabase_Impl;)V +SPLandroidx/work/impl/WorkDatabase_Impl$createOpenDelegate$_openDelegate$1;->onOpen(Landroidx/sqlite/SQLiteConnection;)V +Landroidx/work/impl/WorkLauncher; +Landroidx/work/impl/WorkLauncherImpl; +SPLandroidx/work/impl/WorkLauncherImpl;->(Landroidx/work/impl/Processor;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;)V +Landroidx/work/impl/WorkManagerImpl; +SPLandroidx/work/impl/WorkManagerImpl;->()V +SPLandroidx/work/impl/WorkManagerImpl;->(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;Landroidx/work/impl/WorkDatabase;Ljava/util/List;Landroidx/work/impl/Processor;Landroidx/work/impl/constraints/trackers/Trackers;)V +SPLandroidx/work/impl/WorkManagerImpl;->cancelUniqueWork(Ljava/lang/String;)Landroidx/work/Operation; +SPLandroidx/work/impl/WorkManagerImpl;->getApplicationContext()Landroid/content/Context; +SPLandroidx/work/impl/WorkManagerImpl;->getConfiguration()Landroidx/work/Configuration; +SPLandroidx/work/impl/WorkManagerImpl;->getInstance()Landroidx/work/impl/WorkManagerImpl; +SPLandroidx/work/impl/WorkManagerImpl;->getInstance(Landroid/content/Context;)Landroidx/work/impl/WorkManagerImpl; +SPLandroidx/work/impl/WorkManagerImpl;->getPreferenceUtils()Landroidx/work/impl/utils/PreferenceUtils; +SPLandroidx/work/impl/WorkManagerImpl;->getSchedulers()Ljava/util/List; +SPLandroidx/work/impl/WorkManagerImpl;->getWorkDatabase()Landroidx/work/impl/WorkDatabase; +SPLandroidx/work/impl/WorkManagerImpl;->getWorkInfosForUniqueWorkFlow(Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow; +SPLandroidx/work/impl/WorkManagerImpl;->getWorkTaskExecutor()Landroidx/work/impl/utils/taskexecutor/TaskExecutor; +SPLandroidx/work/impl/WorkManagerImpl;->initialize(Landroid/content/Context;Landroidx/work/Configuration;)V +SPLandroidx/work/impl/WorkManagerImpl;->isInitialized()Z +SPLandroidx/work/impl/WorkManagerImpl;->lambda$rescheduleEligibleWork$0$androidx-work-impl-WorkManagerImpl()Lkotlin/Unit; +SPLandroidx/work/impl/WorkManagerImpl;->onForceStopRunnableCompleted()V +SPLandroidx/work/impl/WorkManagerImpl;->rescheduleEligibleWork()V +Landroidx/work/impl/WorkManagerImpl$$ExternalSyntheticLambda1; +SPLandroidx/work/impl/WorkManagerImpl$$ExternalSyntheticLambda1;->(Landroidx/work/impl/WorkManagerImpl;)V +SPLandroidx/work/impl/WorkManagerImpl$$ExternalSyntheticLambda1;->invoke()Ljava/lang/Object; +Landroidx/work/impl/WorkManagerImpl$Api24Impl; +SPLandroidx/work/impl/WorkManagerImpl$Api24Impl;->isDeviceProtectedStorage(Landroid/content/Context;)Z +Landroidx/work/impl/WorkManagerImplExtKt; +SPLandroidx/work/impl/WorkManagerImplExtKt;->access$createSchedulers(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;Landroidx/work/impl/WorkDatabase;Landroidx/work/impl/constraints/trackers/Trackers;Landroidx/work/impl/Processor;)Ljava/util/List; +SPLandroidx/work/impl/WorkManagerImplExtKt;->createSchedulers(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;Landroidx/work/impl/WorkDatabase;Landroidx/work/impl/constraints/trackers/Trackers;Landroidx/work/impl/Processor;)Ljava/util/List; +SPLandroidx/work/impl/WorkManagerImplExtKt;->createWorkManager$default(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;Landroidx/work/impl/WorkDatabase;Landroidx/work/impl/constraints/trackers/Trackers;Landroidx/work/impl/Processor;Lkotlin/jvm/functions/Function6;ILjava/lang/Object;)Landroidx/work/impl/WorkManagerImpl; +SPLandroidx/work/impl/WorkManagerImplExtKt;->createWorkManager(Landroid/content/Context;Landroidx/work/Configuration;)Landroidx/work/impl/WorkManagerImpl; +SPLandroidx/work/impl/WorkManagerImplExtKt;->createWorkManager(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;Landroidx/work/impl/WorkDatabase;Landroidx/work/impl/constraints/trackers/Trackers;Landroidx/work/impl/Processor;Lkotlin/jvm/functions/Function6;)Landroidx/work/impl/WorkManagerImpl; +Landroidx/work/impl/WorkManagerImplExtKt$WorkManagerImpl$1; +SPLandroidx/work/impl/WorkManagerImplExtKt$WorkManagerImpl$1;->()V +SPLandroidx/work/impl/WorkManagerImplExtKt$WorkManagerImpl$1;->()V +SPLandroidx/work/impl/WorkManagerImplExtKt$WorkManagerImpl$1;->invoke(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;Landroidx/work/impl/WorkDatabase;Landroidx/work/impl/constraints/trackers/Trackers;Landroidx/work/impl/Processor;)Ljava/util/List; +SPLandroidx/work/impl/WorkManagerImplExtKt$WorkManagerImpl$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/WorkMigration9To10; +SPLandroidx/work/impl/WorkMigration9To10;->(Landroid/content/Context;)V +Landroidx/work/impl/background/greedy/DelayedWorkTracker; +SPLandroidx/work/impl/background/greedy/DelayedWorkTracker;->()V +SPLandroidx/work/impl/background/greedy/DelayedWorkTracker;->(Landroidx/work/impl/Scheduler;Landroidx/work/RunnableScheduler;Landroidx/work/Clock;)V +Landroidx/work/impl/background/greedy/GreedyScheduler; +SPLandroidx/work/impl/background/greedy/GreedyScheduler;->()V +SPLandroidx/work/impl/background/greedy/GreedyScheduler;->(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/constraints/trackers/Trackers;Landroidx/work/impl/Processor;Landroidx/work/impl/WorkLauncher;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;)V +Landroidx/work/impl/background/greedy/TimeLimiter; +SPLandroidx/work/impl/background/greedy/TimeLimiter;->(Landroidx/work/RunnableScheduler;Landroidx/work/impl/WorkLauncher;)V +SPLandroidx/work/impl/background/greedy/TimeLimiter;->(Landroidx/work/RunnableScheduler;Landroidx/work/impl/WorkLauncher;J)V +SPLandroidx/work/impl/background/greedy/TimeLimiter;->(Landroidx/work/RunnableScheduler;Landroidx/work/impl/WorkLauncher;JILkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/work/impl/background/systemalarm/RescheduleReceiver; +Landroidx/work/impl/background/systemjob/JobScheduler21; +SPLandroidx/work/impl/background/systemjob/JobScheduler21;->()V +SPLandroidx/work/impl/background/systemjob/JobScheduler21;->()V +SPLandroidx/work/impl/background/systemjob/JobScheduler21;->getAllPendingJobs(Landroid/app/job/JobScheduler;)Ljava/util/List; +Landroidx/work/impl/background/systemjob/JobScheduler34; +SPLandroidx/work/impl/background/systemjob/JobScheduler34;->()V +SPLandroidx/work/impl/background/systemjob/JobScheduler34;->()V +SPLandroidx/work/impl/background/systemjob/JobScheduler34;->forNamespace(Landroid/app/job/JobScheduler;)Landroid/app/job/JobScheduler; +Landroidx/work/impl/background/systemjob/JobSchedulerExtKt; +SPLandroidx/work/impl/background/systemjob/JobSchedulerExtKt;->()V +SPLandroidx/work/impl/background/systemjob/JobSchedulerExtKt;->getSafePendingJobs(Landroid/app/job/JobScheduler;)Ljava/util/List; +SPLandroidx/work/impl/background/systemjob/JobSchedulerExtKt;->getWmJobScheduler(Landroid/content/Context;)Landroid/app/job/JobScheduler; +Landroidx/work/impl/background/systemjob/SystemJobInfoConverter; +SPLandroidx/work/impl/background/systemjob/SystemJobInfoConverter;->()V +SPLandroidx/work/impl/background/systemjob/SystemJobInfoConverter;->(Landroid/content/Context;Landroidx/work/Clock;Z)V +Landroidx/work/impl/background/systemjob/SystemJobScheduler; +SPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->()V +SPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->(Landroid/content/Context;Landroidx/work/impl/WorkDatabase;Landroidx/work/Configuration;)V +SPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->(Landroid/content/Context;Landroidx/work/impl/WorkDatabase;Landroidx/work/Configuration;Landroid/app/job/JobScheduler;Landroidx/work/impl/background/systemjob/SystemJobInfoConverter;)V +SPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->cancelAllInAllNamespaces(Landroid/content/Context;)V +SPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->getPendingJobs(Landroid/content/Context;Landroid/app/job/JobScheduler;)Ljava/util/List; +SPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->reconcileJobs(Landroid/content/Context;Landroidx/work/impl/WorkDatabase;)Z +Landroidx/work/impl/background/systemjob/SystemJobService; +Landroidx/work/impl/constraints/NetworkRequestConstraintController; +SPLandroidx/work/impl/constraints/NetworkRequestConstraintController;->(Landroid/net/ConnectivityManager;J)V +SPLandroidx/work/impl/constraints/NetworkRequestConstraintController;->(Landroid/net/ConnectivityManager;JILkotlin/jvm/internal/DefaultConstructorMarker;)V +Landroidx/work/impl/constraints/OnConstraintsStateChangedListener; +Landroidx/work/impl/constraints/WorkConstraintsTracker; +SPLandroidx/work/impl/constraints/WorkConstraintsTracker;->(Landroidx/work/impl/constraints/trackers/Trackers;)V +SPLandroidx/work/impl/constraints/WorkConstraintsTracker;->(Ljava/util/List;)V +Landroidx/work/impl/constraints/WorkConstraintsTrackerKt; +SPLandroidx/work/impl/constraints/WorkConstraintsTrackerKt;->()V +SPLandroidx/work/impl/constraints/WorkConstraintsTrackerKt;->NetworkRequestConstraintController(Landroid/content/Context;)Landroidx/work/impl/constraints/NetworkRequestConstraintController; +SPLandroidx/work/impl/constraints/WorkConstraintsTrackerKt;->access$createControllers(Landroidx/work/impl/constraints/trackers/Trackers;)Ljava/util/List; +SPLandroidx/work/impl/constraints/WorkConstraintsTrackerKt;->createControllers(Landroidx/work/impl/constraints/trackers/Trackers;)Ljava/util/List; +Landroidx/work/impl/constraints/controllers/BaseConstraintController; +SPLandroidx/work/impl/constraints/controllers/BaseConstraintController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V +Landroidx/work/impl/constraints/controllers/BatteryChargingController; +SPLandroidx/work/impl/constraints/controllers/BatteryChargingController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V +Landroidx/work/impl/constraints/controllers/BatteryNotLowController; +SPLandroidx/work/impl/constraints/controllers/BatteryNotLowController;->(Landroidx/work/impl/constraints/trackers/BatteryNotLowTracker;)V +Landroidx/work/impl/constraints/controllers/ConstraintController; +Landroidx/work/impl/constraints/controllers/StorageNotLowController; +SPLandroidx/work/impl/constraints/controllers/StorageNotLowController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V +Landroidx/work/impl/constraints/trackers/BatteryChargingTracker; +SPLandroidx/work/impl/constraints/trackers/BatteryChargingTracker;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;)V +Landroidx/work/impl/constraints/trackers/BatteryNotLowTracker; +SPLandroidx/work/impl/constraints/trackers/BatteryNotLowTracker;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;)V +Landroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker; +SPLandroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;)V +Landroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker$broadcastReceiver$1; +SPLandroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker$broadcastReceiver$1;->(Landroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker;)V +Landroidx/work/impl/constraints/trackers/ConstraintTracker; +SPLandroidx/work/impl/constraints/trackers/ConstraintTracker;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;)V +Landroidx/work/impl/constraints/trackers/StorageNotLowTracker; +SPLandroidx/work/impl/constraints/trackers/StorageNotLowTracker;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;)V +Landroidx/work/impl/constraints/trackers/Trackers; +SPLandroidx/work/impl/constraints/trackers/Trackers;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;Landroidx/work/impl/constraints/trackers/ConstraintTracker;Landroidx/work/impl/constraints/trackers/BatteryNotLowTracker;Landroidx/work/impl/constraints/trackers/ConstraintTracker;Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V +SPLandroidx/work/impl/constraints/trackers/Trackers;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/TaskExecutor;Landroidx/work/impl/constraints/trackers/ConstraintTracker;Landroidx/work/impl/constraints/trackers/BatteryNotLowTracker;Landroidx/work/impl/constraints/trackers/ConstraintTracker;Landroidx/work/impl/constraints/trackers/ConstraintTracker;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/work/impl/constraints/trackers/Trackers;->getBatteryChargingTracker()Landroidx/work/impl/constraints/trackers/ConstraintTracker; +SPLandroidx/work/impl/constraints/trackers/Trackers;->getBatteryNotLowTracker()Landroidx/work/impl/constraints/trackers/BatteryNotLowTracker; +SPLandroidx/work/impl/constraints/trackers/Trackers;->getContext()Landroid/content/Context; +SPLandroidx/work/impl/constraints/trackers/Trackers;->getStorageNotLowTracker()Landroidx/work/impl/constraints/trackers/ConstraintTracker; +Landroidx/work/impl/foreground/ForegroundProcessor; +Landroidx/work/impl/model/DependencyDao; +Landroidx/work/impl/model/DependencyDao_Impl; +SPLandroidx/work/impl/model/DependencyDao_Impl;->()V +Landroidx/work/impl/model/DependencyDao_Impl$Companion; +SPLandroidx/work/impl/model/DependencyDao_Impl$Companion;->()V +SPLandroidx/work/impl/model/DependencyDao_Impl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/work/impl/model/DependencyDao_Impl$Companion;->getRequiredConverters()Ljava/util/List; +Landroidx/work/impl/model/Preference; +SPLandroidx/work/impl/model/Preference;->(Ljava/lang/String;Ljava/lang/Long;)V +SPLandroidx/work/impl/model/Preference;->getKey()Ljava/lang/String; +SPLandroidx/work/impl/model/Preference;->getValue()Ljava/lang/Long; +Landroidx/work/impl/model/PreferenceDao; +Landroidx/work/impl/model/PreferenceDao_Impl; +SPLandroidx/work/impl/model/PreferenceDao_Impl;->()V +SPLandroidx/work/impl/model/PreferenceDao_Impl;->(Landroidx/room/RoomDatabase;)V +SPLandroidx/work/impl/model/PreferenceDao_Impl;->getLongValue$lambda$0(Ljava/lang/String;Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/lang/Long; +SPLandroidx/work/impl/model/PreferenceDao_Impl;->getLongValue(Ljava/lang/String;)Ljava/lang/Long; +SPLandroidx/work/impl/model/PreferenceDao_Impl;->insertPreference$lambda$0(Landroidx/work/impl/model/PreferenceDao_Impl;Landroidx/work/impl/model/Preference;Landroidx/sqlite/SQLiteConnection;)Lkotlin/Unit; +SPLandroidx/work/impl/model/PreferenceDao_Impl;->insertPreference(Landroidx/work/impl/model/Preference;)V +Landroidx/work/impl/model/PreferenceDao_Impl$$ExternalSyntheticLambda0; +SPLandroidx/work/impl/model/PreferenceDao_Impl$$ExternalSyntheticLambda0;->(Landroidx/work/impl/model/PreferenceDao_Impl;Landroidx/work/impl/model/Preference;)V +SPLandroidx/work/impl/model/PreferenceDao_Impl$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/PreferenceDao_Impl$$ExternalSyntheticLambda2; +SPLandroidx/work/impl/model/PreferenceDao_Impl$$ExternalSyntheticLambda2;->(Ljava/lang/String;Ljava/lang/String;)V +SPLandroidx/work/impl/model/PreferenceDao_Impl$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/PreferenceDao_Impl$1; +SPLandroidx/work/impl/model/PreferenceDao_Impl$1;->()V +SPLandroidx/work/impl/model/PreferenceDao_Impl$1;->bind(Landroidx/sqlite/SQLiteStatement;Landroidx/work/impl/model/Preference;)V +SPLandroidx/work/impl/model/PreferenceDao_Impl$1;->bind(Landroidx/sqlite/SQLiteStatement;Ljava/lang/Object;)V +SPLandroidx/work/impl/model/PreferenceDao_Impl$1;->createQuery()Ljava/lang/String; +Landroidx/work/impl/model/PreferenceDao_Impl$Companion; +SPLandroidx/work/impl/model/PreferenceDao_Impl$Companion;->()V +SPLandroidx/work/impl/model/PreferenceDao_Impl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/work/impl/model/PreferenceDao_Impl$Companion;->getRequiredConverters()Ljava/util/List; +Landroidx/work/impl/model/RawWorkInfoDao; +Landroidx/work/impl/model/RawWorkInfoDao_Impl; +SPLandroidx/work/impl/model/RawWorkInfoDao_Impl;->()V +Landroidx/work/impl/model/RawWorkInfoDao_Impl$Companion; +SPLandroidx/work/impl/model/RawWorkInfoDao_Impl$Companion;->()V +SPLandroidx/work/impl/model/RawWorkInfoDao_Impl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/work/impl/model/RawWorkInfoDao_Impl$Companion;->getRequiredConverters()Ljava/util/List; +Landroidx/work/impl/model/SystemIdInfoDao; +Landroidx/work/impl/model/SystemIdInfoDao_Impl; +SPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->()V +SPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->(Landroidx/room/RoomDatabase;)V +SPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->getWorkSpecIds$lambda$0(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->getWorkSpecIds()Ljava/util/List; +Landroidx/work/impl/model/SystemIdInfoDao_Impl$$ExternalSyntheticLambda1; +SPLandroidx/work/impl/model/SystemIdInfoDao_Impl$$ExternalSyntheticLambda1;->(Ljava/lang/String;)V +SPLandroidx/work/impl/model/SystemIdInfoDao_Impl$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/SystemIdInfoDao_Impl$1; +SPLandroidx/work/impl/model/SystemIdInfoDao_Impl$1;->()V +Landroidx/work/impl/model/SystemIdInfoDao_Impl$Companion; +SPLandroidx/work/impl/model/SystemIdInfoDao_Impl$Companion;->()V +SPLandroidx/work/impl/model/SystemIdInfoDao_Impl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/work/impl/model/SystemIdInfoDao_Impl$Companion;->getRequiredConverters()Ljava/util/List; +Landroidx/work/impl/model/WorkNameDao; +Landroidx/work/impl/model/WorkNameDao_Impl; +SPLandroidx/work/impl/model/WorkNameDao_Impl;->()V +Landroidx/work/impl/model/WorkNameDao_Impl$Companion; +SPLandroidx/work/impl/model/WorkNameDao_Impl$Companion;->()V +SPLandroidx/work/impl/model/WorkNameDao_Impl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/work/impl/model/WorkNameDao_Impl$Companion;->getRequiredConverters()Ljava/util/List; +Landroidx/work/impl/model/WorkProgressDao; +Landroidx/work/impl/model/WorkProgressDao_Impl; +SPLandroidx/work/impl/model/WorkProgressDao_Impl;->()V +SPLandroidx/work/impl/model/WorkProgressDao_Impl;->(Landroidx/room/RoomDatabase;)V +SPLandroidx/work/impl/model/WorkProgressDao_Impl;->deleteAll$lambda$0(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Lkotlin/Unit; +SPLandroidx/work/impl/model/WorkProgressDao_Impl;->deleteAll()V +Landroidx/work/impl/model/WorkProgressDao_Impl$$ExternalSyntheticLambda1; +SPLandroidx/work/impl/model/WorkProgressDao_Impl$$ExternalSyntheticLambda1;->(Ljava/lang/String;)V +SPLandroidx/work/impl/model/WorkProgressDao_Impl$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkProgressDao_Impl$1; +SPLandroidx/work/impl/model/WorkProgressDao_Impl$1;->()V +Landroidx/work/impl/model/WorkProgressDao_Impl$Companion; +SPLandroidx/work/impl/model/WorkProgressDao_Impl$Companion;->()V +SPLandroidx/work/impl/model/WorkProgressDao_Impl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/work/impl/model/WorkProgressDao_Impl$Companion;->getRequiredConverters()Ljava/util/List; +Landroidx/work/impl/model/WorkSpecDao; +Landroidx/work/impl/model/WorkSpecDaoKt; +SPLandroidx/work/impl/model/WorkSpecDaoKt;->dedup(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineDispatcher;)Lkotlinx/coroutines/flow/Flow; +SPLandroidx/work/impl/model/WorkSpecDaoKt;->getWorkStatusPojoFlowForName(Landroidx/work/impl/model/WorkSpecDao;Lkotlinx/coroutines/CoroutineDispatcher;Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow; +Landroidx/work/impl/model/WorkSpecDaoKt$dedup$$inlined$map$1; +SPLandroidx/work/impl/model/WorkSpecDaoKt$dedup$$inlined$map$1;->(Lkotlinx/coroutines/flow/Flow;)V +SPLandroidx/work/impl/model/WorkSpecDaoKt$dedup$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDaoKt$dedup$$inlined$map$1$2; +SPLandroidx/work/impl/model/WorkSpecDaoKt$dedup$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V +SPLandroidx/work/impl/model/WorkSpecDaoKt$dedup$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDaoKt$dedup$$inlined$map$1$2$1; +SPLandroidx/work/impl/model/WorkSpecDaoKt$dedup$$inlined$map$1$2$1;->(Landroidx/work/impl/model/WorkSpecDaoKt$dedup$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V +Landroidx/work/impl/model/WorkSpecDao_Impl; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->()V +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->(Landroidx/room/RoomDatabase;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->__fetchRelationshipWorkProgressAsandroidxWorkData(Landroidx/sqlite/SQLiteConnection;Landroidx/collection/ArrayMap;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->__fetchRelationshipWorkTagAsjavaLangString(Landroidx/sqlite/SQLiteConnection;Landroidx/collection/ArrayMap;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getAllEligibleWorkSpecsForScheduling$lambda$0(Ljava/lang/String;ILandroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getAllEligibleWorkSpecsForScheduling(I)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getEligibleWorkForScheduling$lambda$0(Ljava/lang/String;ILandroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getEligibleWorkForScheduling(I)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getEligibleWorkForSchedulingWithContentUris$lambda$0(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getEligibleWorkForSchedulingWithContentUris()Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getRunningWork$lambda$0(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getRunningWork()Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getUnfinishedWorkWithName$lambda$0(Ljava/lang/String;Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getUnfinishedWorkWithName(Ljava/lang/String;)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getWorkStatusPojoFlowForName$lambda$0(Ljava/lang/String;Ljava/lang/String;Landroidx/work/impl/model/WorkSpecDao_Impl;Landroidx/sqlite/SQLiteConnection;)Ljava/util/List; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->getWorkStatusPojoFlowForName(Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->hasUnfinishedWorkFlow$lambda$0(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)Z +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->hasUnfinishedWorkFlow()Lkotlinx/coroutines/flow/Flow; +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->resetScheduledState$lambda$0(Ljava/lang/String;Landroidx/sqlite/SQLiteConnection;)I +SPLandroidx/work/impl/model/WorkSpecDao_Impl;->resetScheduledState()I +Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda13; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda13;->(Ljava/lang/String;Ljava/lang/String;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda13;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda23; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda23;->(Ljava/lang/String;I)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda23;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda37; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda37;->(Ljava/lang/String;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda37;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda40; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda40;->(Ljava/lang/String;Ljava/lang/String;Landroidx/work/impl/model/WorkSpecDao_Impl;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda40;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda48; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda48;->(Ljava/lang/String;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda48;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda7; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda7;->(Ljava/lang/String;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda7;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda8; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda8;->(Ljava/lang/String;I)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda8;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda9; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda9;->(Ljava/lang/String;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$$ExternalSyntheticLambda9;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/model/WorkSpecDao_Impl$1; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$1;->()V +Landroidx/work/impl/model/WorkSpecDao_Impl$2; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$2;->()V +Landroidx/work/impl/model/WorkSpecDao_Impl$Companion; +SPLandroidx/work/impl/model/WorkSpecDao_Impl$Companion;->()V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/work/impl/model/WorkSpecDao_Impl$Companion;->getRequiredConverters()Ljava/util/List; +Landroidx/work/impl/model/WorkTagDao; +Landroidx/work/impl/model/WorkTagDao_Impl; +SPLandroidx/work/impl/model/WorkTagDao_Impl;->()V +Landroidx/work/impl/model/WorkTagDao_Impl$Companion; +SPLandroidx/work/impl/model/WorkTagDao_Impl$Companion;->()V +SPLandroidx/work/impl/model/WorkTagDao_Impl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLandroidx/work/impl/model/WorkTagDao_Impl$Companion;->getRequiredConverters()Ljava/util/List; +Landroidx/work/impl/utils/Api28Impl; +SPLandroidx/work/impl/utils/Api28Impl;->()V +SPLandroidx/work/impl/utils/Api28Impl;->()V +SPLandroidx/work/impl/utils/Api28Impl;->getProcessName()Ljava/lang/String; +Landroidx/work/impl/utils/CancelWorkRunnable; +SPLandroidx/work/impl/utils/CancelWorkRunnable;->forName$lambda$0(Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)Lkotlin/Unit; +SPLandroidx/work/impl/utils/CancelWorkRunnable;->forName(Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)Landroidx/work/Operation; +SPLandroidx/work/impl/utils/CancelWorkRunnable;->forNameInline$lambda$0(Landroidx/work/impl/WorkDatabase;Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)V +SPLandroidx/work/impl/utils/CancelWorkRunnable;->forNameInline(Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)V +SPLandroidx/work/impl/utils/CancelWorkRunnable;->reschedulePendingWorkers(Landroidx/work/impl/WorkManagerImpl;)V +Landroidx/work/impl/utils/CancelWorkRunnable$$ExternalSyntheticLambda0; +SPLandroidx/work/impl/utils/CancelWorkRunnable$$ExternalSyntheticLambda0;->(Landroidx/work/impl/WorkDatabase;Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)V +SPLandroidx/work/impl/utils/CancelWorkRunnable$$ExternalSyntheticLambda0;->run()V +Landroidx/work/impl/utils/CancelWorkRunnable$$ExternalSyntheticLambda3; +SPLandroidx/work/impl/utils/CancelWorkRunnable$$ExternalSyntheticLambda3;->(Ljava/lang/String;Landroidx/work/impl/WorkManagerImpl;)V +SPLandroidx/work/impl/utils/CancelWorkRunnable$$ExternalSyntheticLambda3;->invoke()Ljava/lang/Object; +Landroidx/work/impl/utils/ForceStopRunnable; +SPLandroidx/work/impl/utils/ForceStopRunnable;->()V +SPLandroidx/work/impl/utils/ForceStopRunnable;->(Landroid/content/Context;Landroidx/work/impl/WorkManagerImpl;)V +SPLandroidx/work/impl/utils/ForceStopRunnable;->cleanUp()Z +SPLandroidx/work/impl/utils/ForceStopRunnable;->forceStopRunnable()V +SPLandroidx/work/impl/utils/ForceStopRunnable;->getIntent(Landroid/content/Context;)Landroid/content/Intent; +SPLandroidx/work/impl/utils/ForceStopRunnable;->getPendingIntent(Landroid/content/Context;I)Landroid/app/PendingIntent; +SPLandroidx/work/impl/utils/ForceStopRunnable;->isForceStopped()Z +SPLandroidx/work/impl/utils/ForceStopRunnable;->multiProcessChecks()Z +SPLandroidx/work/impl/utils/ForceStopRunnable;->run()V +SPLandroidx/work/impl/utils/ForceStopRunnable;->shouldRescheduleWorkers()Z +Landroidx/work/impl/utils/ForceStopRunnable$BroadcastReceiver; +Landroidx/work/impl/utils/PackageManagerHelper; +SPLandroidx/work/impl/utils/PackageManagerHelper;->()V +SPLandroidx/work/impl/utils/PackageManagerHelper;->access$isReceiverEnabled(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;)Z +SPLandroidx/work/impl/utils/PackageManagerHelper;->access$isServiceEnabled(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;)Z +SPLandroidx/work/impl/utils/PackageManagerHelper;->isReceiverEnabled(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;)Z +SPLandroidx/work/impl/utils/PackageManagerHelper;->isServiceEnabled(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;)Z +SPLandroidx/work/impl/utils/PackageManagerHelper;->setComponentEnabled(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;ZLkotlin/jvm/functions/Function2;)V +SPLandroidx/work/impl/utils/PackageManagerHelper;->setReceiverEnabled(Landroid/content/Context;Ljava/lang/Class;Z)V +SPLandroidx/work/impl/utils/PackageManagerHelper;->setServiceEnabled(Landroid/content/Context;Ljava/lang/Class;Z)V +Landroidx/work/impl/utils/PackageManagerHelper$setReceiverEnabled$1; +SPLandroidx/work/impl/utils/PackageManagerHelper$setReceiverEnabled$1;->()V +SPLandroidx/work/impl/utils/PackageManagerHelper$setReceiverEnabled$1;->()V +SPLandroidx/work/impl/utils/PackageManagerHelper$setReceiverEnabled$1;->invoke(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;)Ljava/lang/Boolean; +SPLandroidx/work/impl/utils/PackageManagerHelper$setReceiverEnabled$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/utils/PackageManagerHelper$setServiceEnabled$1; +SPLandroidx/work/impl/utils/PackageManagerHelper$setServiceEnabled$1;->()V +SPLandroidx/work/impl/utils/PackageManagerHelper$setServiceEnabled$1;->()V +SPLandroidx/work/impl/utils/PackageManagerHelper$setServiceEnabled$1;->invoke(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;)Ljava/lang/Boolean; +SPLandroidx/work/impl/utils/PackageManagerHelper$setServiceEnabled$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/work/impl/utils/PreferenceUtils; +SPLandroidx/work/impl/utils/PreferenceUtils;->(Landroidx/work/impl/WorkDatabase;)V +SPLandroidx/work/impl/utils/PreferenceUtils;->getLastForceStopEventMillis()J +SPLandroidx/work/impl/utils/PreferenceUtils;->getNeedsReschedule()Z +SPLandroidx/work/impl/utils/PreferenceUtils;->setLastForceStopEventMillis(J)V +Landroidx/work/impl/utils/ProcessUtils; +SPLandroidx/work/impl/utils/ProcessUtils;->()V +SPLandroidx/work/impl/utils/ProcessUtils;->getProcessName(Landroid/content/Context;)Ljava/lang/String; +SPLandroidx/work/impl/utils/ProcessUtils;->isDefaultProcess(Landroid/content/Context;Landroidx/work/Configuration;)Z +Landroidx/work/impl/utils/SerialExecutorImpl; +SPLandroidx/work/impl/utils/SerialExecutorImpl;->()V +SPLandroidx/work/impl/utils/SerialExecutorImpl;->(Ljava/util/concurrent/Executor;)V +SPLandroidx/work/impl/utils/SerialExecutorImpl;->execute(Ljava/lang/Runnable;)V +SPLandroidx/work/impl/utils/SerialExecutorImpl;->scheduleNext()V +Landroidx/work/impl/utils/SerialExecutorImpl$Task; +SPLandroidx/work/impl/utils/SerialExecutorImpl$Task;->(Landroidx/work/impl/utils/SerialExecutorImpl;Ljava/lang/Runnable;)V +SPLandroidx/work/impl/utils/SerialExecutorImpl$Task;->run()V +Landroidx/work/impl/utils/taskexecutor/SerialExecutor; +Landroidx/work/impl/utils/taskexecutor/TaskExecutor; +SPLandroidx/work/impl/utils/taskexecutor/TaskExecutor;->executeOnTaskThread(Ljava/lang/Runnable;)V +Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor; +SPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->(Ljava/util/concurrent/Executor;)V +SPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->getCoroutineScope()Lkotlinx/coroutines/CoroutineScope; +SPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->getSerialTaskExecutor()Landroidx/work/impl/utils/SerialExecutorImpl; +SPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->getSerialTaskExecutor()Landroidx/work/impl/utils/taskexecutor/SerialExecutor; +SPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->getTaskCoroutineDispatcher()Lkotlinx/coroutines/CoroutineDispatcher; +Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor$1; +SPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor$1;->(Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;)V +Lanki/ankidroid/DbResponse; +SPLanki/ankidroid/DbResponse;->()V +SPLanki/ankidroid/DbResponse;->()V +SPLanki/ankidroid/DbResponse;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/ankidroid/DbResponse;->getResult()Lanki/ankidroid/DbResult; +SPLanki/ankidroid/DbResponse;->getRowCount()I +SPLanki/ankidroid/DbResponse;->getSequenceNumber()I +SPLanki/ankidroid/DbResponse;->getStartIndex()J +SPLanki/ankidroid/DbResponse;->parseFrom([B)Lanki/ankidroid/DbResponse; +Lanki/ankidroid/DbResponse$1; +SPLanki/ankidroid/DbResponse$1;->()V +Lanki/ankidroid/DbResponseOrBuilder; +Lanki/ankidroid/DbResult; +SPLanki/ankidroid/DbResult;->()V +SPLanki/ankidroid/DbResult;->()V +SPLanki/ankidroid/DbResult;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/ankidroid/DbResult;->getRows(I)Lanki/ankidroid/Row; +SPLanki/ankidroid/DbResult;->getRowsCount()I +Lanki/ankidroid/DbResult$1; +SPLanki/ankidroid/DbResult$1;->()V +Lanki/ankidroid/DbResultOrBuilder; +Lanki/ankidroid/Row; +SPLanki/ankidroid/Row;->()V +SPLanki/ankidroid/Row;->()V +SPLanki/ankidroid/Row;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/ankidroid/Row;->getFields(I)Lanki/ankidroid/SqlValue; +Lanki/ankidroid/Row$1; +SPLanki/ankidroid/Row$1;->()V +Lanki/ankidroid/RowOrBuilder; +Lanki/ankidroid/SqlValue; +SPLanki/ankidroid/SqlValue;->()V +SPLanki/ankidroid/SqlValue;->()V +SPLanki/ankidroid/SqlValue;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/ankidroid/SqlValue;->getDataCase()Lanki/ankidroid/SqlValue$DataCase; +SPLanki/ankidroid/SqlValue;->getLongValue()J +Lanki/ankidroid/SqlValue$1; +SPLanki/ankidroid/SqlValue$1;->()V +Lanki/ankidroid/SqlValue$DataCase; +SPLanki/ankidroid/SqlValue$DataCase;->$values()[Lanki/ankidroid/SqlValue$DataCase; +SPLanki/ankidroid/SqlValue$DataCase;->()V +SPLanki/ankidroid/SqlValue$DataCase;->(Ljava/lang/String;II)V +SPLanki/ankidroid/SqlValue$DataCase;->forNumber(I)Lanki/ankidroid/SqlValue$DataCase; +SPLanki/ankidroid/SqlValue$DataCase;->values()[Lanki/ankidroid/SqlValue$DataCase; +Lanki/ankidroid/SqlValueOrBuilder; +Lanki/backend/BackendError; +SPLanki/backend/BackendError;->()V +SPLanki/backend/BackendError;->()V +SPLanki/backend/BackendError;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/backend/BackendError;->getKind()Lanki/backend/BackendError$Kind; +SPLanki/backend/BackendError;->getMessage()Ljava/lang/String; +SPLanki/backend/BackendError;->parseFrom([B)Lanki/backend/BackendError; +Lanki/backend/BackendError$1; +SPLanki/backend/BackendError$1;->()V +Lanki/backend/BackendError$Kind; +SPLanki/backend/BackendError$Kind;->$values()[Lanki/backend/BackendError$Kind; +SPLanki/backend/BackendError$Kind;->()V +SPLanki/backend/BackendError$Kind;->(Ljava/lang/String;II)V +SPLanki/backend/BackendError$Kind;->forNumber(I)Lanki/backend/BackendError$Kind; +SPLanki/backend/BackendError$Kind;->values()[Lanki/backend/BackendError$Kind; +Lanki/backend/BackendError$Kind$1; +SPLanki/backend/BackendError$Kind$1;->()V +Lanki/backend/BackendErrorOrBuilder; +Lanki/backend/BackendInit; +SPLanki/backend/BackendInit;->-$$Nest$maddAllPreferredLangs(Lanki/backend/BackendInit;Ljava/lang/Iterable;)V +SPLanki/backend/BackendInit;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/backend/BackendInit; +SPLanki/backend/BackendInit;->()V +SPLanki/backend/BackendInit;->()V +SPLanki/backend/BackendInit;->addAllPreferredLangs(Ljava/lang/Iterable;)V +SPLanki/backend/BackendInit;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/backend/BackendInit;->ensurePreferredLangsIsMutable()V +SPLanki/backend/BackendInit;->newBuilder()Lanki/backend/BackendInit$Builder; +Lanki/backend/BackendInit$1; +SPLanki/backend/BackendInit$1;->()V +Lanki/backend/BackendInit$Builder; +SPLanki/backend/BackendInit$Builder;->()V +SPLanki/backend/BackendInit$Builder;->(Lanki/backend/BackendInit-IA;)V +SPLanki/backend/BackendInit$Builder;->addAllPreferredLangs(Ljava/lang/Iterable;)Lanki/backend/BackendInit$Builder; +Lanki/backend/BackendInitOrBuilder; +Lanki/backend/GeneratedBackend; +SPLanki/backend/GeneratedBackend;->()V +SPLanki/backend/GeneratedBackend;->awaitBackupCompletion()V +SPLanki/backend/GeneratedBackend;->awaitBackupCompletionRaw([B)[B +SPLanki/backend/GeneratedBackend;->createBackup(Ljava/lang/String;ZZ)Z +SPLanki/backend/GeneratedBackend;->createBackupRaw([B)[B +SPLanki/backend/GeneratedBackend;->deckTree(J)Lanki/decks/DeckTreeNode; +SPLanki/backend/GeneratedBackend;->deckTreeRaw([B)[B +SPLanki/backend/GeneratedBackend;->flushQuery(I)V +SPLanki/backend/GeneratedBackend;->flushQueryRaw([B)[B +SPLanki/backend/GeneratedBackend;->getConfigBool(Lanki/config/ConfigKey$Bool;)Z +SPLanki/backend/GeneratedBackend;->getConfigBoolRaw([B)[B +SPLanki/backend/GeneratedBackend;->getConfigJson(Ljava/lang/String;)Lcom/google/protobuf/ByteString; +SPLanki/backend/GeneratedBackend;->getConfigJsonRaw([B)[B +SPLanki/backend/GeneratedBackend;->getCurrentDeck()Lanki/decks/Deck; +SPLanki/backend/GeneratedBackend;->getCurrentDeckRaw([B)[B +SPLanki/backend/GeneratedBackend;->getDeckLegacy(J)Lcom/google/protobuf/ByteString; +SPLanki/backend/GeneratedBackend;->getDeckLegacyRaw([B)[B +SPLanki/backend/GeneratedBackend;->getDeckNames(ZZ)Ljava/util/List; +SPLanki/backend/GeneratedBackend;->getDeckNamesRaw([B)[B +SPLanki/backend/GeneratedBackend;->getUndoStatus()Lanki/collection/UndoStatus; +SPLanki/backend/GeneratedBackend;->getUndoStatusRaw([B)[B +SPLanki/backend/GeneratedBackend;->i18nResources(Ljava/lang/Iterable;)Lcom/google/protobuf/ByteString; +SPLanki/backend/GeneratedBackend;->i18nResourcesRaw([B)[B +SPLanki/backend/GeneratedBackend;->openCollection(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V +SPLanki/backend/GeneratedBackend;->openCollectionRaw([B)[B +SPLanki/backend/GeneratedBackend;->runDbCommandProto(Lcom/google/protobuf/ByteString;)Lanki/ankidroid/DbResponse; +SPLanki/backend/GeneratedBackend;->runDbCommandProtoRaw([B)[B +SPLanki/backend/GeneratedBackend;->schedTimingToday()Lanki/scheduler/SchedTimingTodayResponse; +SPLanki/backend/GeneratedBackend;->schedTimingTodayRaw([B)[B +SPLanki/backend/GeneratedBackend;->studiedToday()Ljava/lang/String; +SPLanki/backend/GeneratedBackend;->studiedTodayRaw([B)[B +SPLanki/backend/GeneratedBackend;->translateStringRaw([B)[B +Lanki/collection/CreateBackupRequest; +SPLanki/collection/CreateBackupRequest;->-$$Nest$msetBackupFolder(Lanki/collection/CreateBackupRequest;Ljava/lang/String;)V +SPLanki/collection/CreateBackupRequest;->-$$Nest$msetForce(Lanki/collection/CreateBackupRequest;Z)V +SPLanki/collection/CreateBackupRequest;->-$$Nest$msetWaitForCompletion(Lanki/collection/CreateBackupRequest;Z)V +SPLanki/collection/CreateBackupRequest;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/collection/CreateBackupRequest; +SPLanki/collection/CreateBackupRequest;->()V +SPLanki/collection/CreateBackupRequest;->()V +SPLanki/collection/CreateBackupRequest;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/collection/CreateBackupRequest;->newBuilder()Lanki/collection/CreateBackupRequest$Builder; +SPLanki/collection/CreateBackupRequest;->setBackupFolder(Ljava/lang/String;)V +SPLanki/collection/CreateBackupRequest;->setForce(Z)V +SPLanki/collection/CreateBackupRequest;->setWaitForCompletion(Z)V +Lanki/collection/CreateBackupRequest$1; +SPLanki/collection/CreateBackupRequest$1;->()V +Lanki/collection/CreateBackupRequest$Builder; +SPLanki/collection/CreateBackupRequest$Builder;->()V +SPLanki/collection/CreateBackupRequest$Builder;->(Lanki/collection/CreateBackupRequest-IA;)V +SPLanki/collection/CreateBackupRequest$Builder;->setBackupFolder(Ljava/lang/String;)Lanki/collection/CreateBackupRequest$Builder; +SPLanki/collection/CreateBackupRequest$Builder;->setForce(Z)Lanki/collection/CreateBackupRequest$Builder; +SPLanki/collection/CreateBackupRequest$Builder;->setWaitForCompletion(Z)Lanki/collection/CreateBackupRequest$Builder; +Lanki/collection/CreateBackupRequestOrBuilder; +Lanki/collection/OpChanges; +SPLanki/collection/OpChanges;->-$$Nest$msetBrowserSidebar(Lanki/collection/OpChanges;Z)V +SPLanki/collection/OpChanges;->-$$Nest$msetBrowserTable(Lanki/collection/OpChanges;Z)V +SPLanki/collection/OpChanges;->-$$Nest$msetCard(Lanki/collection/OpChanges;Z)V +SPLanki/collection/OpChanges;->-$$Nest$msetConfig(Lanki/collection/OpChanges;Z)V +SPLanki/collection/OpChanges;->-$$Nest$msetDeck(Lanki/collection/OpChanges;Z)V +SPLanki/collection/OpChanges;->-$$Nest$msetDeckConfig(Lanki/collection/OpChanges;Z)V +SPLanki/collection/OpChanges;->-$$Nest$msetMtime(Lanki/collection/OpChanges;Z)V +SPLanki/collection/OpChanges;->-$$Nest$msetNote(Lanki/collection/OpChanges;Z)V +SPLanki/collection/OpChanges;->-$$Nest$msetNoteText(Lanki/collection/OpChanges;Z)V +SPLanki/collection/OpChanges;->-$$Nest$msetNotetype(Lanki/collection/OpChanges;Z)V +SPLanki/collection/OpChanges;->-$$Nest$msetStudyQueues(Lanki/collection/OpChanges;Z)V +SPLanki/collection/OpChanges;->-$$Nest$msetTag(Lanki/collection/OpChanges;Z)V +SPLanki/collection/OpChanges;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/collection/OpChanges; +SPLanki/collection/OpChanges;->()V +SPLanki/collection/OpChanges;->()V +SPLanki/collection/OpChanges;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/collection/OpChanges;->newBuilder()Lanki/collection/OpChanges$Builder; +SPLanki/collection/OpChanges;->setBrowserSidebar(Z)V +SPLanki/collection/OpChanges;->setBrowserTable(Z)V +SPLanki/collection/OpChanges;->setCard(Z)V +SPLanki/collection/OpChanges;->setConfig(Z)V +SPLanki/collection/OpChanges;->setDeck(Z)V +SPLanki/collection/OpChanges;->setDeckConfig(Z)V +SPLanki/collection/OpChanges;->setMtime(Z)V +SPLanki/collection/OpChanges;->setNote(Z)V +SPLanki/collection/OpChanges;->setNoteText(Z)V +SPLanki/collection/OpChanges;->setNotetype(Z)V +SPLanki/collection/OpChanges;->setStudyQueues(Z)V +SPLanki/collection/OpChanges;->setTag(Z)V +Lanki/collection/OpChanges$1; +SPLanki/collection/OpChanges$1;->()V +Lanki/collection/OpChanges$Builder; +SPLanki/collection/OpChanges$Builder;->()V +SPLanki/collection/OpChanges$Builder;->(Lanki/collection/OpChanges-IA;)V +SPLanki/collection/OpChanges$Builder;->setBrowserSidebar(Z)Lanki/collection/OpChanges$Builder; +SPLanki/collection/OpChanges$Builder;->setBrowserTable(Z)Lanki/collection/OpChanges$Builder; +SPLanki/collection/OpChanges$Builder;->setCard(Z)Lanki/collection/OpChanges$Builder; +SPLanki/collection/OpChanges$Builder;->setConfig(Z)Lanki/collection/OpChanges$Builder; +SPLanki/collection/OpChanges$Builder;->setDeck(Z)Lanki/collection/OpChanges$Builder; +SPLanki/collection/OpChanges$Builder;->setDeckConfig(Z)Lanki/collection/OpChanges$Builder; +SPLanki/collection/OpChanges$Builder;->setMtime(Z)Lanki/collection/OpChanges$Builder; +SPLanki/collection/OpChanges$Builder;->setNote(Z)Lanki/collection/OpChanges$Builder; +SPLanki/collection/OpChanges$Builder;->setNoteText(Z)Lanki/collection/OpChanges$Builder; +SPLanki/collection/OpChanges$Builder;->setNotetype(Z)Lanki/collection/OpChanges$Builder; +SPLanki/collection/OpChanges$Builder;->setStudyQueues(Z)Lanki/collection/OpChanges$Builder; +SPLanki/collection/OpChanges$Builder;->setTag(Z)Lanki/collection/OpChanges$Builder; +Lanki/collection/OpChangesKt$Dsl; +SPLanki/collection/OpChangesKt$Dsl;->()V +SPLanki/collection/OpChangesKt$Dsl;->(Lanki/collection/OpChanges$Builder;)V +SPLanki/collection/OpChangesKt$Dsl;->(Lanki/collection/OpChanges$Builder;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLanki/collection/OpChangesKt$Dsl;->_build()Lanki/collection/OpChanges; +SPLanki/collection/OpChangesKt$Dsl;->setBrowserSidebar(Z)V +SPLanki/collection/OpChangesKt$Dsl;->setBrowserTable(Z)V +SPLanki/collection/OpChangesKt$Dsl;->setCard(Z)V +SPLanki/collection/OpChangesKt$Dsl;->setConfig(Z)V +SPLanki/collection/OpChangesKt$Dsl;->setDeck(Z)V +SPLanki/collection/OpChangesKt$Dsl;->setDeckConfig(Z)V +SPLanki/collection/OpChangesKt$Dsl;->setMtime(Z)V +SPLanki/collection/OpChangesKt$Dsl;->setNote(Z)V +SPLanki/collection/OpChangesKt$Dsl;->setNoteText(Z)V +SPLanki/collection/OpChangesKt$Dsl;->setNotetype(Z)V +SPLanki/collection/OpChangesKt$Dsl;->setStudyQueues(Z)V +SPLanki/collection/OpChangesKt$Dsl;->setTag(Z)V +Lanki/collection/OpChangesKt$Dsl$Companion; +SPLanki/collection/OpChangesKt$Dsl$Companion;->()V +SPLanki/collection/OpChangesKt$Dsl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLanki/collection/OpChangesKt$Dsl$Companion;->_create(Lanki/collection/OpChanges$Builder;)Lanki/collection/OpChangesKt$Dsl; +Lanki/collection/OpChangesOrBuilder; +Lanki/collection/OpenCollectionRequest; +SPLanki/collection/OpenCollectionRequest;->-$$Nest$msetCollectionPath(Lanki/collection/OpenCollectionRequest;Ljava/lang/String;)V +SPLanki/collection/OpenCollectionRequest;->-$$Nest$msetMediaDbPath(Lanki/collection/OpenCollectionRequest;Ljava/lang/String;)V +SPLanki/collection/OpenCollectionRequest;->-$$Nest$msetMediaFolderPath(Lanki/collection/OpenCollectionRequest;Ljava/lang/String;)V +SPLanki/collection/OpenCollectionRequest;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/collection/OpenCollectionRequest; +SPLanki/collection/OpenCollectionRequest;->()V +SPLanki/collection/OpenCollectionRequest;->()V +SPLanki/collection/OpenCollectionRequest;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/collection/OpenCollectionRequest;->newBuilder()Lanki/collection/OpenCollectionRequest$Builder; +SPLanki/collection/OpenCollectionRequest;->setCollectionPath(Ljava/lang/String;)V +SPLanki/collection/OpenCollectionRequest;->setMediaDbPath(Ljava/lang/String;)V +SPLanki/collection/OpenCollectionRequest;->setMediaFolderPath(Ljava/lang/String;)V +Lanki/collection/OpenCollectionRequest$1; +SPLanki/collection/OpenCollectionRequest$1;->()V +Lanki/collection/OpenCollectionRequest$Builder; +SPLanki/collection/OpenCollectionRequest$Builder;->()V +SPLanki/collection/OpenCollectionRequest$Builder;->(Lanki/collection/OpenCollectionRequest-IA;)V +SPLanki/collection/OpenCollectionRequest$Builder;->setCollectionPath(Ljava/lang/String;)Lanki/collection/OpenCollectionRequest$Builder; +SPLanki/collection/OpenCollectionRequest$Builder;->setMediaDbPath(Ljava/lang/String;)Lanki/collection/OpenCollectionRequest$Builder; +SPLanki/collection/OpenCollectionRequest$Builder;->setMediaFolderPath(Ljava/lang/String;)Lanki/collection/OpenCollectionRequest$Builder; +Lanki/collection/OpenCollectionRequestOrBuilder; +Lanki/collection/UndoStatus; +SPLanki/collection/UndoStatus;->()V +SPLanki/collection/UndoStatus;->()V +SPLanki/collection/UndoStatus;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/collection/UndoStatus;->getLastStep()I +SPLanki/collection/UndoStatus;->getRedo()Ljava/lang/String; +SPLanki/collection/UndoStatus;->getUndo()Ljava/lang/String; +SPLanki/collection/UndoStatus;->parseFrom([B)Lanki/collection/UndoStatus; +Lanki/collection/UndoStatus$1; +SPLanki/collection/UndoStatus$1;->()V +Lanki/collection/UndoStatusOrBuilder; +Lanki/config/ConfigKey$Bool; +SPLanki/config/ConfigKey$Bool;->$values()[Lanki/config/ConfigKey$Bool; +SPLanki/config/ConfigKey$Bool;->()V +SPLanki/config/ConfigKey$Bool;->(Ljava/lang/String;II)V +SPLanki/config/ConfigKey$Bool;->getNumber()I +Lanki/config/ConfigKey$Bool$1; +SPLanki/config/ConfigKey$Bool$1;->()V +Lanki/config/ConfigKey$String; +SPLanki/config/ConfigKey$String;->$values()[Lanki/config/ConfigKey$String; +SPLanki/config/ConfigKey$String;->()V +SPLanki/config/ConfigKey$String;->(Ljava/lang/String;II)V +Lanki/config/ConfigKey$String$1; +SPLanki/config/ConfigKey$String$1;->()V +Lanki/config/GetConfigBoolRequest; +SPLanki/config/GetConfigBoolRequest;->-$$Nest$msetKey(Lanki/config/GetConfigBoolRequest;Lanki/config/ConfigKey$Bool;)V +SPLanki/config/GetConfigBoolRequest;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/config/GetConfigBoolRequest; +SPLanki/config/GetConfigBoolRequest;->()V +SPLanki/config/GetConfigBoolRequest;->()V +SPLanki/config/GetConfigBoolRequest;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/config/GetConfigBoolRequest;->newBuilder()Lanki/config/GetConfigBoolRequest$Builder; +SPLanki/config/GetConfigBoolRequest;->setKey(Lanki/config/ConfigKey$Bool;)V +Lanki/config/GetConfigBoolRequest$1; +SPLanki/config/GetConfigBoolRequest$1;->()V +Lanki/config/GetConfigBoolRequest$Builder; +SPLanki/config/GetConfigBoolRequest$Builder;->()V +SPLanki/config/GetConfigBoolRequest$Builder;->(Lanki/config/GetConfigBoolRequest-IA;)V +SPLanki/config/GetConfigBoolRequest$Builder;->setKey(Lanki/config/ConfigKey$Bool;)Lanki/config/GetConfigBoolRequest$Builder; +Lanki/config/GetConfigBoolRequestOrBuilder; +Lanki/decks/Deck; +SPLanki/decks/Deck;->()V +SPLanki/decks/Deck;->()V +SPLanki/decks/Deck;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/decks/Deck;->getId()J +SPLanki/decks/Deck;->parseFrom([B)Lanki/decks/Deck; +Lanki/decks/Deck$1; +SPLanki/decks/Deck$1;->()V +Lanki/decks/Deck$Common; +SPLanki/decks/Deck$Common;->()V +SPLanki/decks/Deck$Common;->()V +SPLanki/decks/Deck$Common;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lanki/decks/Deck$CommonOrBuilder; +Lanki/decks/Deck$Filtered; +Lanki/decks/Deck$FilteredOrBuilder; +Lanki/decks/Deck$Normal; +SPLanki/decks/Deck$Normal;->()V +SPLanki/decks/Deck$Normal;->()V +SPLanki/decks/Deck$Normal;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lanki/decks/Deck$Normal$DayLimit; +Lanki/decks/Deck$Normal$DayLimitOrBuilder; +Lanki/decks/Deck$NormalOrBuilder; +Lanki/decks/DeckId; +SPLanki/decks/DeckId;->-$$Nest$msetDid(Lanki/decks/DeckId;J)V +SPLanki/decks/DeckId;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/decks/DeckId; +SPLanki/decks/DeckId;->()V +SPLanki/decks/DeckId;->()V +SPLanki/decks/DeckId;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/decks/DeckId;->newBuilder()Lanki/decks/DeckId$Builder; +SPLanki/decks/DeckId;->setDid(J)V +Lanki/decks/DeckId$1; +SPLanki/decks/DeckId$1;->()V +Lanki/decks/DeckId$Builder; +SPLanki/decks/DeckId$Builder;->()V +SPLanki/decks/DeckId$Builder;->(Lanki/decks/DeckId-IA;)V +SPLanki/decks/DeckId$Builder;->setDid(J)Lanki/decks/DeckId$Builder; +Lanki/decks/DeckIdOrBuilder; +Lanki/decks/DeckNameId; +SPLanki/decks/DeckNameId;->()V +SPLanki/decks/DeckNameId;->()V +SPLanki/decks/DeckNameId;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/decks/DeckNameId;->getId()J +SPLanki/decks/DeckNameId;->getName()Ljava/lang/String; +Lanki/decks/DeckNameId$1; +SPLanki/decks/DeckNameId$1;->()V +Lanki/decks/DeckNameIdOrBuilder; +Lanki/decks/DeckNames; +SPLanki/decks/DeckNames;->()V +SPLanki/decks/DeckNames;->()V +SPLanki/decks/DeckNames;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/decks/DeckNames;->getEntriesList()Ljava/util/List; +SPLanki/decks/DeckNames;->parseFrom([B)Lanki/decks/DeckNames; +Lanki/decks/DeckNames$1; +SPLanki/decks/DeckNames$1;->()V +Lanki/decks/DeckNamesOrBuilder; +Lanki/decks/DeckOrBuilder; +Lanki/decks/DeckTreeNode; +SPLanki/decks/DeckTreeNode;->()V +SPLanki/decks/DeckTreeNode;->()V +SPLanki/decks/DeckTreeNode;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/decks/DeckTreeNode;->getChildrenList()Ljava/util/List; +SPLanki/decks/DeckTreeNode;->getCollapsed()Z +SPLanki/decks/DeckTreeNode;->getDeckId()J +SPLanki/decks/DeckTreeNode;->getFiltered()Z +SPLanki/decks/DeckTreeNode;->getLearnCount()I +SPLanki/decks/DeckTreeNode;->getLevel()I +SPLanki/decks/DeckTreeNode;->getName()Ljava/lang/String; +SPLanki/decks/DeckTreeNode;->getNewCount()I +SPLanki/decks/DeckTreeNode;->getReviewCount()I +SPLanki/decks/DeckTreeNode;->parseFrom([B)Lanki/decks/DeckTreeNode; +Lanki/decks/DeckTreeNode$1; +SPLanki/decks/DeckTreeNode$1;->()V +Lanki/decks/DeckTreeNodeOrBuilder; +Lanki/decks/DeckTreeRequest; +SPLanki/decks/DeckTreeRequest;->-$$Nest$msetNow(Lanki/decks/DeckTreeRequest;J)V +SPLanki/decks/DeckTreeRequest;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/decks/DeckTreeRequest; +SPLanki/decks/DeckTreeRequest;->()V +SPLanki/decks/DeckTreeRequest;->()V +SPLanki/decks/DeckTreeRequest;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/decks/DeckTreeRequest;->newBuilder()Lanki/decks/DeckTreeRequest$Builder; +SPLanki/decks/DeckTreeRequest;->setNow(J)V +Lanki/decks/DeckTreeRequest$1; +SPLanki/decks/DeckTreeRequest$1;->()V +Lanki/decks/DeckTreeRequest$Builder; +SPLanki/decks/DeckTreeRequest$Builder;->()V +SPLanki/decks/DeckTreeRequest$Builder;->(Lanki/decks/DeckTreeRequest-IA;)V +SPLanki/decks/DeckTreeRequest$Builder;->setNow(J)Lanki/decks/DeckTreeRequest$Builder; +Lanki/decks/DeckTreeRequestOrBuilder; +Lanki/decks/GetDeckNamesRequest; +SPLanki/decks/GetDeckNamesRequest;->-$$Nest$msetIncludeFiltered(Lanki/decks/GetDeckNamesRequest;Z)V +SPLanki/decks/GetDeckNamesRequest;->-$$Nest$msetSkipEmptyDefault(Lanki/decks/GetDeckNamesRequest;Z)V +SPLanki/decks/GetDeckNamesRequest;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/decks/GetDeckNamesRequest; +SPLanki/decks/GetDeckNamesRequest;->()V +SPLanki/decks/GetDeckNamesRequest;->()V +SPLanki/decks/GetDeckNamesRequest;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/decks/GetDeckNamesRequest;->newBuilder()Lanki/decks/GetDeckNamesRequest$Builder; +SPLanki/decks/GetDeckNamesRequest;->setIncludeFiltered(Z)V +SPLanki/decks/GetDeckNamesRequest;->setSkipEmptyDefault(Z)V +Lanki/decks/GetDeckNamesRequest$1; +SPLanki/decks/GetDeckNamesRequest$1;->()V +Lanki/decks/GetDeckNamesRequest$Builder; +SPLanki/decks/GetDeckNamesRequest$Builder;->()V +SPLanki/decks/GetDeckNamesRequest$Builder;->(Lanki/decks/GetDeckNamesRequest-IA;)V +SPLanki/decks/GetDeckNamesRequest$Builder;->setIncludeFiltered(Z)Lanki/decks/GetDeckNamesRequest$Builder; +SPLanki/decks/GetDeckNamesRequest$Builder;->setSkipEmptyDefault(Z)Lanki/decks/GetDeckNamesRequest$Builder; +Lanki/decks/GetDeckNamesRequestOrBuilder; +Lanki/generic/Bool; +SPLanki/generic/Bool;->()V +SPLanki/generic/Bool;->()V +SPLanki/generic/Bool;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/generic/Bool;->getVal()Z +SPLanki/generic/Bool;->parseFrom([B)Lanki/generic/Bool; +Lanki/generic/Bool$1; +SPLanki/generic/Bool$1;->()V +Lanki/generic/BoolOrBuilder; +Lanki/generic/Empty; +SPLanki/generic/Empty;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/generic/Empty; +SPLanki/generic/Empty;->()V +SPLanki/generic/Empty;->()V +SPLanki/generic/Empty;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/generic/Empty;->newBuilder()Lanki/generic/Empty$Builder; +SPLanki/generic/Empty;->parseFrom([B)Lanki/generic/Empty; +Lanki/generic/Empty$1; +SPLanki/generic/Empty$1;->()V +Lanki/generic/Empty$Builder; +SPLanki/generic/Empty$Builder;->()V +SPLanki/generic/Empty$Builder;->(Lanki/generic/Empty-IA;)V +Lanki/generic/EmptyOrBuilder; +Lanki/generic/Int32; +SPLanki/generic/Int32;->-$$Nest$msetVal(Lanki/generic/Int32;I)V +SPLanki/generic/Int32;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/generic/Int32; +SPLanki/generic/Int32;->()V +SPLanki/generic/Int32;->()V +SPLanki/generic/Int32;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/generic/Int32;->newBuilder()Lanki/generic/Int32$Builder; +SPLanki/generic/Int32;->setVal(I)V +Lanki/generic/Int32$1; +SPLanki/generic/Int32$1;->()V +Lanki/generic/Int32$Builder; +SPLanki/generic/Int32$Builder;->()V +SPLanki/generic/Int32$Builder;->(Lanki/generic/Int32-IA;)V +SPLanki/generic/Int32$Builder;->setVal(I)Lanki/generic/Int32$Builder; +Lanki/generic/Int32OrBuilder; +Lanki/generic/Int64; +SPLanki/generic/Int64;->()V +SPLanki/generic/Int64;->()V +SPLanki/generic/Int64;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/generic/Int64;->getVal()J +SPLanki/generic/Int64;->parseFrom([B)Lanki/generic/Int64; +Lanki/generic/Int64$1; +SPLanki/generic/Int64$1;->()V +Lanki/generic/Int64OrBuilder; +Lanki/generic/Json; +SPLanki/generic/Json;->-$$Nest$msetJson(Lanki/generic/Json;Lcom/google/protobuf/ByteString;)V +SPLanki/generic/Json;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/generic/Json; +SPLanki/generic/Json;->()V +SPLanki/generic/Json;->()V +SPLanki/generic/Json;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/generic/Json;->getJson()Lcom/google/protobuf/ByteString; +SPLanki/generic/Json;->newBuilder()Lanki/generic/Json$Builder; +SPLanki/generic/Json;->parseFrom([B)Lanki/generic/Json; +SPLanki/generic/Json;->setJson(Lcom/google/protobuf/ByteString;)V +Lanki/generic/Json$1; +SPLanki/generic/Json$1;->()V +Lanki/generic/Json$Builder; +SPLanki/generic/Json$Builder;->()V +SPLanki/generic/Json$Builder;->(Lanki/generic/Json-IA;)V +SPLanki/generic/Json$Builder;->setJson(Lcom/google/protobuf/ByteString;)Lanki/generic/Json$Builder; +Lanki/generic/JsonOrBuilder; +Lanki/generic/String; +SPLanki/generic/String;->-$$Nest$msetVal(Lanki/generic/String;Ljava/lang/String;)V +SPLanki/generic/String;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/generic/String; +SPLanki/generic/String;->()V +SPLanki/generic/String;->()V +SPLanki/generic/String;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/generic/String;->getVal()Ljava/lang/String; +SPLanki/generic/String;->newBuilder()Lanki/generic/String$Builder; +SPLanki/generic/String;->parseFrom([B)Lanki/generic/String; +SPLanki/generic/String;->setVal(Ljava/lang/String;)V +Lanki/generic/String$1; +SPLanki/generic/String$1;->()V +Lanki/generic/String$Builder; +SPLanki/generic/String$Builder;->()V +SPLanki/generic/String$Builder;->(Lanki/generic/String-IA;)V +SPLanki/generic/String$Builder;->setVal(Ljava/lang/String;)Lanki/generic/String$Builder; +Lanki/generic/StringOrBuilder; +Lanki/i18n/GeneratedTranslations; +SPLanki/i18n/GeneratedTranslations;->actionsDecks()Ljava/lang/String; +SPLanki/i18n/GeneratedTranslations;->actionsEmptyCards()Ljava/lang/String; +SPLanki/i18n/GeneratedTranslations;->actionsExport()Ljava/lang/String; +SPLanki/i18n/GeneratedTranslations;->actionsImport()Ljava/lang/String; +SPLanki/i18n/GeneratedTranslations;->databaseCheckTitle()Ljava/lang/String; +SPLanki/i18n/GeneratedTranslations;->decksCreateDeck()Ljava/lang/String; +SPLanki/i18n/GeneratedTranslations;->mediaCheckCheckMediaAction()Ljava/lang/String; +SPLanki/i18n/GeneratedTranslations;->statisticsTitle()Ljava/lang/String; +Lanki/i18n/I18nResourcesRequest; +SPLanki/i18n/I18nResourcesRequest;->-$$Nest$maddAllModules(Lanki/i18n/I18nResourcesRequest;Ljava/lang/Iterable;)V +SPLanki/i18n/I18nResourcesRequest;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/i18n/I18nResourcesRequest; +SPLanki/i18n/I18nResourcesRequest;->()V +SPLanki/i18n/I18nResourcesRequest;->()V +SPLanki/i18n/I18nResourcesRequest;->addAllModules(Ljava/lang/Iterable;)V +SPLanki/i18n/I18nResourcesRequest;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/i18n/I18nResourcesRequest;->ensureModulesIsMutable()V +SPLanki/i18n/I18nResourcesRequest;->newBuilder()Lanki/i18n/I18nResourcesRequest$Builder; +Lanki/i18n/I18nResourcesRequest$1; +SPLanki/i18n/I18nResourcesRequest$1;->()V +Lanki/i18n/I18nResourcesRequest$Builder; +SPLanki/i18n/I18nResourcesRequest$Builder;->()V +SPLanki/i18n/I18nResourcesRequest$Builder;->(Lanki/i18n/I18nResourcesRequest-IA;)V +SPLanki/i18n/I18nResourcesRequest$Builder;->addAllModules(Ljava/lang/Iterable;)Lanki/i18n/I18nResourcesRequest$Builder; +Lanki/i18n/I18nResourcesRequestOrBuilder; +Lanki/i18n/TranslateArgValue; +SPLanki/i18n/TranslateArgValue;->()V +SPLanki/i18n/TranslateArgValue;->()V +SPLanki/i18n/TranslateArgValue;->getDefaultInstance()Lanki/i18n/TranslateArgValue; +Lanki/i18n/TranslateArgValueOrBuilder; +Lanki/i18n/TranslateStringRequest; +SPLanki/i18n/TranslateStringRequest;->-$$Nest$mgetMutableArgsMap(Lanki/i18n/TranslateStringRequest;)Ljava/util/Map; +SPLanki/i18n/TranslateStringRequest;->-$$Nest$msetMessageIndex(Lanki/i18n/TranslateStringRequest;I)V +SPLanki/i18n/TranslateStringRequest;->-$$Nest$msetModuleIndex(Lanki/i18n/TranslateStringRequest;I)V +SPLanki/i18n/TranslateStringRequest;->-$$Nest$sfgetDEFAULT_INSTANCE()Lanki/i18n/TranslateStringRequest; +SPLanki/i18n/TranslateStringRequest;->()V +SPLanki/i18n/TranslateStringRequest;->()V +SPLanki/i18n/TranslateStringRequest;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/i18n/TranslateStringRequest;->getMutableArgsMap()Ljava/util/Map; +SPLanki/i18n/TranslateStringRequest;->internalGetMutableArgs()Lcom/google/protobuf/MapFieldLite; +SPLanki/i18n/TranslateStringRequest;->newBuilder()Lanki/i18n/TranslateStringRequest$Builder; +SPLanki/i18n/TranslateStringRequest;->setMessageIndex(I)V +SPLanki/i18n/TranslateStringRequest;->setModuleIndex(I)V +Lanki/i18n/TranslateStringRequest$1; +SPLanki/i18n/TranslateStringRequest$1;->()V +Lanki/i18n/TranslateStringRequest$ArgsDefaultEntryHolder; +SPLanki/i18n/TranslateStringRequest$ArgsDefaultEntryHolder;->()V +Lanki/i18n/TranslateStringRequest$Builder; +SPLanki/i18n/TranslateStringRequest$Builder;->()V +SPLanki/i18n/TranslateStringRequest$Builder;->(Lanki/i18n/TranslateStringRequest-IA;)V +SPLanki/i18n/TranslateStringRequest$Builder;->putAllArgs(Ljava/util/Map;)Lanki/i18n/TranslateStringRequest$Builder; +SPLanki/i18n/TranslateStringRequest$Builder;->setMessageIndex(I)Lanki/i18n/TranslateStringRequest$Builder; +SPLanki/i18n/TranslateStringRequest$Builder;->setModuleIndex(I)Lanki/i18n/TranslateStringRequest$Builder; +Lanki/i18n/TranslateStringRequestOrBuilder; +Lanki/scheduler/SchedTimingTodayResponse; +SPLanki/scheduler/SchedTimingTodayResponse;->()V +SPLanki/scheduler/SchedTimingTodayResponse;->()V +SPLanki/scheduler/SchedTimingTodayResponse;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLanki/scheduler/SchedTimingTodayResponse;->getNextDayAt()J +SPLanki/scheduler/SchedTimingTodayResponse;->parseFrom([B)Lanki/scheduler/SchedTimingTodayResponse; +Lanki/scheduler/SchedTimingTodayResponse$1; +SPLanki/scheduler/SchedTimingTodayResponse$1;->()V +Lanki/scheduler/SchedTimingTodayResponseOrBuilder; +Lanki/sync/SyncStatusResponse$Required; +SPLanki/sync/SyncStatusResponse$Required;->$values()[Lanki/sync/SyncStatusResponse$Required; +SPLanki/sync/SyncStatusResponse$Required;->()V +SPLanki/sync/SyncStatusResponse$Required;->(Ljava/lang/String;II)V +SPLanki/sync/SyncStatusResponse$Required;->values()[Lanki/sync/SyncStatusResponse$Required; +Lanki/sync/SyncStatusResponse$Required$1; +SPLanki/sync/SyncStatusResponse$Required$1;->()V +Lcom/canhub/cropper/CropFileProvider; +SPLcom/canhub/cropper/CropFileProvider;->()V +Lcom/canhub/cropper/R$xml; +Lcom/criticalay/GoogleAnalytics; +SPLcom/criticalay/GoogleAnalytics;->()V +Lcom/criticalay/GoogleAnalytics$Companion; +SPLcom/criticalay/GoogleAnalytics$Companion;->()V +SPLcom/criticalay/GoogleAnalytics$Companion;->()V +SPLcom/criticalay/GoogleAnalytics$Companion;->builder(Lkotlin/jvm/functions/Function1;)Lcom/criticalay/GoogleAnalytics; +Lcom/criticalay/GoogleAnalyticsBuilder; +SPLcom/criticalay/GoogleAnalyticsBuilder;->()V +SPLcom/criticalay/GoogleAnalyticsBuilder;->build()Lcom/criticalay/GoogleAnalytics; +SPLcom/criticalay/GoogleAnalyticsBuilder;->setApiSecret(Ljava/lang/String;)V +SPLcom/criticalay/GoogleAnalyticsBuilder;->setAppName(Ljava/lang/String;)V +SPLcom/criticalay/GoogleAnalyticsBuilder;->setAppVersion(Ljava/lang/String;)V +SPLcom/criticalay/GoogleAnalyticsBuilder;->setDebug(Z)V +SPLcom/criticalay/GoogleAnalyticsBuilder;->setEnabled(Z)V +SPLcom/criticalay/GoogleAnalyticsBuilder;->setMeasurementId(Ljava/lang/String;)V +SPLcom/criticalay/GoogleAnalyticsBuilder;->setSamplePercentage(I)V +Lcom/criticalay/GoogleAnalyticsConfig; +SPLcom/criticalay/GoogleAnalyticsConfig;->()V +SPLcom/criticalay/GoogleAnalyticsConfig;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZIZILjava/lang/String;Ljava/lang/String;IJJ)V +SPLcom/criticalay/GoogleAnalyticsConfig;->getConnectTimeoutMs()J +SPLcom/criticalay/GoogleAnalyticsConfig;->getProxyHost()Ljava/lang/String; +SPLcom/criticalay/GoogleAnalyticsConfig;->getReadTimeoutMs()J +SPLcom/criticalay/GoogleAnalyticsConfig;->getSamplePercentage()I +Lcom/criticalay/GoogleAnalyticsConfig$Companion; +SPLcom/criticalay/GoogleAnalyticsConfig$Companion;->()V +SPLcom/criticalay/GoogleAnalyticsConfig$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/criticalay/httpclient/OkHttpClientImpl; +SPLcom/criticalay/httpclient/OkHttpClientImpl;->(Lcom/criticalay/GoogleAnalyticsConfig;)V +SPLcom/criticalay/httpclient/OkHttpClientImpl;->buildClient()Lokhttp3/OkHttpClient; +SPLcom/criticalay/httpclient/OkHttpClientImpl;->json$lambda$0(Lkotlinx/serialization/json/JsonBuilder;)Lkotlin/Unit; +Lcom/criticalay/httpclient/OkHttpClientImpl$$ExternalSyntheticLambda1; +SPLcom/criticalay/httpclient/OkHttpClientImpl$$ExternalSyntheticLambda1;->()V +SPLcom/criticalay/httpclient/OkHttpClientImpl$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/criticalay/internal/GaImpl; +SPLcom/criticalay/internal/GaImpl;->(Lcom/criticalay/GoogleAnalyticsConfig;Lcom/criticalay/httpclient/OkHttpClientImpl;)V +SPLcom/criticalay/internal/GaImpl;->getConfig()Lcom/criticalay/GoogleAnalyticsConfig; +SPLcom/criticalay/internal/GaImpl;->getInSample()Z +SPLcom/criticalay/internal/GaImpl;->performSamplingElection$lambda$0(ILcom/criticalay/internal/GaImpl;)Ljava/lang/Object; +SPLcom/criticalay/internal/GaImpl;->performSamplingElection$lambda$1(ILcom/criticalay/internal/GaImpl;)Ljava/lang/Object; +SPLcom/criticalay/internal/GaImpl;->performSamplingElection()Z +Lcom/criticalay/internal/GaImpl$$ExternalSyntheticLambda4; +SPLcom/criticalay/internal/GaImpl$$ExternalSyntheticLambda4;->(ILcom/criticalay/internal/GaImpl;)V +SPLcom/criticalay/internal/GaImpl$$ExternalSyntheticLambda4;->invoke()Ljava/lang/Object; +Lcom/criticalay/internal/GaImpl$$ExternalSyntheticLambda5; +SPLcom/criticalay/internal/GaImpl$$ExternalSyntheticLambda5;->(ILcom/criticalay/internal/GaImpl;)V +SPLcom/criticalay/internal/GaImpl$$ExternalSyntheticLambda5;->invoke()Ljava/lang/Object; +Lcom/criticalay/internal/GaImplKt; +SPLcom/criticalay/internal/GaImplKt;->()V +SPLcom/criticalay/internal/GaImplKt;->access$getLogger$p()Lio/github/oshai/kotlinlogging/KLogger; +Lcom/criticalay/internal/GaImplKt$$ExternalSyntheticLambda0; +SPLcom/criticalay/internal/GaImplKt$$ExternalSyntheticLambda0;->()V +Lcom/google/android/material/R$anim; +Lcom/google/android/material/R$attr; +Lcom/google/android/material/R$dimen; +Lcom/google/android/material/R$drawable; +Lcom/google/android/material/R$id; +Lcom/google/android/material/R$integer; +Lcom/google/android/material/R$layout; +Lcom/google/android/material/R$style; +Lcom/google/android/material/R$styleable; +SPLcom/google/android/material/R$styleable;->()V +Lcom/google/android/material/animation/AnimationUtils; +SPLcom/google/android/material/animation/AnimationUtils;->()V +SPLcom/google/android/material/animation/AnimationUtils;->lerp(FFF)F +SPLcom/google/android/material/animation/AnimationUtils;->lerp(FFFFF)F +Lcom/google/android/material/animation/MotionSpec; +SPLcom/google/android/material/animation/MotionSpec;->()V +SPLcom/google/android/material/animation/MotionSpec;->addInfoFromAnimator(Lcom/google/android/material/animation/MotionSpec;Landroid/animation/Animator;)V +SPLcom/google/android/material/animation/MotionSpec;->createFromAttribute(Landroid/content/Context;Landroid/content/res/TypedArray;I)Lcom/google/android/material/animation/MotionSpec; +SPLcom/google/android/material/animation/MotionSpec;->createFromResource(Landroid/content/Context;I)Lcom/google/android/material/animation/MotionSpec; +SPLcom/google/android/material/animation/MotionSpec;->createSpecFromAnimators(Ljava/util/List;)Lcom/google/android/material/animation/MotionSpec; +SPLcom/google/android/material/animation/MotionSpec;->setPropertyValues(Ljava/lang/String;[Landroid/animation/PropertyValuesHolder;)V +SPLcom/google/android/material/animation/MotionSpec;->setTiming(Ljava/lang/String;Lcom/google/android/material/animation/MotionTiming;)V +Lcom/google/android/material/animation/MotionTiming; +SPLcom/google/android/material/animation/MotionTiming;->(JJLandroid/animation/TimeInterpolator;)V +SPLcom/google/android/material/animation/MotionTiming;->createFromAnimator(Landroid/animation/ValueAnimator;)Lcom/google/android/material/animation/MotionTiming; +Lcom/google/android/material/badge/BadgeDrawable; +Lcom/google/android/material/behavior/HideViewOnScrollBehavior; +SPLcom/google/android/material/behavior/HideViewOnScrollBehavior;->()V +SPLcom/google/android/material/behavior/HideViewOnScrollBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +Lcom/google/android/material/bottomnavigation/BottomNavigationItemView; +SPLcom/google/android/material/bottomnavigation/BottomNavigationItemView;->(Landroid/content/Context;)V +SPLcom/google/android/material/bottomnavigation/BottomNavigationItemView;->getItemDefaultMarginResId()I +SPLcom/google/android/material/bottomnavigation/BottomNavigationItemView;->getItemLayoutResId()I +Lcom/google/android/material/bottomnavigation/BottomNavigationMenuView; +SPLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;->(Landroid/content/Context;)V +SPLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;->createNavigationBarItemView(Landroid/content/Context;)Lcom/google/android/material/navigation/NavigationBarItemView; +SPLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;->isItemHorizontalTranslationEnabled()Z +Lcom/google/android/material/bottomnavigation/BottomNavigationView; +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->applyWindowInsets()V +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->createNavigationBarMenuView(Landroid/content/Context;)Lcom/google/android/material/navigation/NavigationBarMenuView; +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->getMaxItemCount()I +SPLcom/google/android/material/bottomnavigation/BottomNavigationView;->setItemHorizontalTranslationEnabled(Z)V +Lcom/google/android/material/bottomnavigation/BottomNavigationView$1; +SPLcom/google/android/material/bottomnavigation/BottomNavigationView$1;->(Lcom/google/android/material/bottomnavigation/BottomNavigationView;)V +SPLcom/google/android/material/bottomnavigation/BottomNavigationView$1;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)Landroidx/core/view/WindowInsetsCompat; +Lcom/google/android/material/button/MaterialButton; +SPLcom/google/android/material/button/MaterialButton;->()V +SPLcom/google/android/material/button/MaterialButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/button/MaterialButton;->canUpdateWithoutTextAlignment(I)Z +SPLcom/google/android/material/button/MaterialButton;->getA11yClassName()Ljava/lang/String; +SPLcom/google/android/material/button/MaterialButton;->getActualTextAlignment()Landroid/text/Layout$Alignment; +SPLcom/google/android/material/button/MaterialButton;->getGravityTextAlignment()Landroid/text/Layout$Alignment; +SPLcom/google/android/material/button/MaterialButton;->getIcon()Landroid/graphics/drawable/Drawable; +SPLcom/google/android/material/button/MaterialButton;->getIconPadding()I +SPLcom/google/android/material/button/MaterialButton;->getIconSize()I +SPLcom/google/android/material/button/MaterialButton;->getTextLayoutWidth()I +SPLcom/google/android/material/button/MaterialButton;->getUpdatedIconFor(I)Landroid/graphics/drawable/Drawable; +SPLcom/google/android/material/button/MaterialButton;->isCheckable()Z +SPLcom/google/android/material/button/MaterialButton;->isChecked()Z +SPLcom/google/android/material/button/MaterialButton;->isIconEnd()Z +SPLcom/google/android/material/button/MaterialButton;->isIconStart()Z +SPLcom/google/android/material/button/MaterialButton;->isIconTop()Z +SPLcom/google/android/material/button/MaterialButton;->isInHorizontalButtonGroup()Z +SPLcom/google/android/material/button/MaterialButton;->isUsingOriginalBackground()Z +SPLcom/google/android/material/button/MaterialButton;->onAttachedToWindow()V +SPLcom/google/android/material/button/MaterialButton;->onCreateDrawableState(I)[I +SPLcom/google/android/material/button/MaterialButton;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V +SPLcom/google/android/material/button/MaterialButton;->onLayout(ZIIII)V +SPLcom/google/android/material/button/MaterialButton;->onTextChanged(Ljava/lang/CharSequence;III)V +SPLcom/google/android/material/button/MaterialButton;->refreshDrawableState()V +SPLcom/google/android/material/button/MaterialButton;->setBackgroundTintList(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/button/MaterialButton;->setCheckedInternal(Z)V +SPLcom/google/android/material/button/MaterialButton;->setCompoundDrawablePadding(I)V +SPLcom/google/android/material/button/MaterialButton;->setElevation(F)V +SPLcom/google/android/material/button/MaterialButton;->setInternalBackground(Landroid/graphics/drawable/Drawable;)V +SPLcom/google/android/material/button/MaterialButton;->setOpticalCenterEnabled(Z)V +SPLcom/google/android/material/button/MaterialButton;->setShapeAppearanceModel(Lcom/google/android/material/shape/ShapeAppearanceModel;)V +SPLcom/google/android/material/button/MaterialButton;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/button/MaterialButton;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V +SPLcom/google/android/material/button/MaterialButton;->updateIcon(Z)V +SPLcom/google/android/material/button/MaterialButton;->updateIconPosition(II)V +SPLcom/google/android/material/button/MaterialButton;->updateSecondaryIcon(Z)V +SPLcom/google/android/material/button/MaterialButton;->updateSecondaryIconPosition(II)V +SPLcom/google/android/material/button/MaterialButton;->validateIconGravity()V +SPLcom/google/android/material/button/MaterialButton;->validateSecondaryIconGravity()V +Lcom/google/android/material/button/MaterialButton$1; +SPLcom/google/android/material/button/MaterialButton$1;->(Ljava/lang/String;)V +Lcom/google/android/material/button/MaterialButton$WidthChangeDirection; +SPLcom/google/android/material/button/MaterialButton$WidthChangeDirection;->$values()[Lcom/google/android/material/button/MaterialButton$WidthChangeDirection; +SPLcom/google/android/material/button/MaterialButton$WidthChangeDirection;->()V +SPLcom/google/android/material/button/MaterialButton$WidthChangeDirection;->(Ljava/lang/String;I)V +Lcom/google/android/material/button/MaterialButtonGroup; +Lcom/google/android/material/button/MaterialButtonHelper; +SPLcom/google/android/material/button/MaterialButtonHelper;->(Lcom/google/android/material/button/MaterialButton;Lcom/google/android/material/shape/ShapeAppearance;)V +SPLcom/google/android/material/button/MaterialButtonHelper;->createBackground()Landroid/graphics/drawable/Drawable; +SPLcom/google/android/material/button/MaterialButtonHelper;->getMaskDrawable()Lcom/google/android/material/shape/Shapeable; +SPLcom/google/android/material/button/MaterialButtonHelper;->getMaterialShapeDrawable()Lcom/google/android/material/shape/MaterialShapeDrawable; +SPLcom/google/android/material/button/MaterialButtonHelper;->getMaterialShapeDrawable(Z)Lcom/google/android/material/shape/MaterialShapeDrawable; +SPLcom/google/android/material/button/MaterialButtonHelper;->getSurfaceColorStrokeDrawable()Lcom/google/android/material/shape/MaterialShapeDrawable; +SPLcom/google/android/material/button/MaterialButtonHelper;->isBackgroundOverwritten()Z +SPLcom/google/android/material/button/MaterialButtonHelper;->isCheckable()Z +SPLcom/google/android/material/button/MaterialButtonHelper;->loadFromAttributes(Landroid/content/res/TypedArray;)V +SPLcom/google/android/material/button/MaterialButtonHelper;->setShapeAppearance(Lcom/google/android/material/shape/ShapeAppearance;)V +SPLcom/google/android/material/button/MaterialButtonHelper;->updateBackground()V +SPLcom/google/android/material/button/MaterialButtonHelper;->updateButtonShape()V +SPLcom/google/android/material/button/MaterialButtonHelper;->wrapDrawableWithInset(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/InsetDrawable; +Lcom/google/android/material/color/MaterialColors; +SPLcom/google/android/material/color/MaterialColors;->getColor(Landroid/content/Context;II)I +SPLcom/google/android/material/color/MaterialColors;->getColor(Landroid/view/View;I)I +SPLcom/google/android/material/color/MaterialColors;->getColorOrNull(Landroid/content/Context;I)Ljava/lang/Integer; +SPLcom/google/android/material/color/MaterialColors;->layer(II)I +SPLcom/google/android/material/color/MaterialColors;->layer(IIF)I +SPLcom/google/android/material/color/MaterialColors;->resolveColor(Landroid/content/Context;Landroid/util/TypedValue;)I +Lcom/google/android/material/drawable/DrawableUtils; +SPLcom/google/android/material/drawable/DrawableUtils;->getColorStateListOrNull(Landroid/graphics/drawable/Drawable;)Landroid/content/res/ColorStateList; +Lcom/google/android/material/elevation/ElevationOverlayProvider; +SPLcom/google/android/material/elevation/ElevationOverlayProvider;->()V +SPLcom/google/android/material/elevation/ElevationOverlayProvider;->(Landroid/content/Context;)V +SPLcom/google/android/material/elevation/ElevationOverlayProvider;->(ZIIIF)V +SPLcom/google/android/material/elevation/ElevationOverlayProvider;->calculateOverlayAlphaFraction(F)F +SPLcom/google/android/material/elevation/ElevationOverlayProvider;->compositeOverlay(IF)I +SPLcom/google/android/material/elevation/ElevationOverlayProvider;->compositeOverlayIfNeeded(IF)I +SPLcom/google/android/material/elevation/ElevationOverlayProvider;->isThemeElevationOverlayEnabled()Z +SPLcom/google/android/material/elevation/ElevationOverlayProvider;->isThemeSurfaceColor(I)Z +Lcom/google/android/material/floatingactionbutton/AnimatorTracker; +SPLcom/google/android/material/floatingactionbutton/AnimatorTracker;->()V +Lcom/google/android/material/floatingactionbutton/BaseMotionStrategy; +SPLcom/google/android/material/floatingactionbutton/BaseMotionStrategy;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/AnimatorTracker;)V +SPLcom/google/android/material/floatingactionbutton/BaseMotionStrategy;->setMotionSpec(Lcom/google/android/material/animation/MotionSpec;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->()V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->access$202(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;I)I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->access$302(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;I)I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->access$500(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;)Z +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->access$502(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Z)Z +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->access$600(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->getAccessibilityClassName()Ljava/lang/CharSequence; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->getCollapsedPadding()I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->getCollapsedSize()I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->getSizeFromExtendStrategyType(I)Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$Size; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->onAttachedToWindow()V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->saveOriginalTextCsl()V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->setClickable(Z)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->setContentDescription(Ljava/lang/CharSequence;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->setExtended(Z)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->setPaddingRelative(IIII)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->setTextColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->silentlyUpdateTextColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;->updateTooltip()V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1;->getHeight()I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1;->getLayoutParams()Landroid/view/ViewGroup$LayoutParams; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1;->getPaddingEnd()I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1;->getPaddingStart()I +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$1;->getWidth()I +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$2; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$2;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$3; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$3;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$Size;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$4; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$4;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$Size;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$Size;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$6; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$6;->(Ljava/lang/Class;Ljava/lang/String;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$7; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$7;->(Ljava/lang/Class;Ljava/lang/String;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$8; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$8;->(Ljava/lang/Class;Ljava/lang/String;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$9; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$9;->(Ljava/lang/Class;Ljava/lang/String;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ChangeSizeStrategy; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ChangeSizeStrategy;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/AnimatorTracker;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$Size;Z)V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ChangeSizeStrategy;->performNow()V +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ChangeSizeStrategy;->shouldCancel()Z +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ExtendedFloatingActionButtonBehavior; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ExtendedFloatingActionButtonBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$HideStrategy; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$HideStrategy;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/AnimatorTracker;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ShowStrategy; +SPLcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$ShowStrategy;->(Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/AnimatorTracker;)V +Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton$Size; +Lcom/google/android/material/floatingactionbutton/MotionStrategy; +Lcom/google/android/material/focus/FocusRingDrawable; +SPLcom/google/android/material/focus/FocusRingDrawable;->()V +SPLcom/google/android/material/focus/FocusRingDrawable;->find(Landroid/graphics/drawable/Drawable;)Lcom/google/android/material/focus/FocusRingDrawable; +SPLcom/google/android/material/focus/FocusRingDrawable;->layer(Landroid/content/Context;Landroid/graphics/drawable/LayerDrawable;)Lcom/google/android/material/focus/FocusRingDrawable; +SPLcom/google/android/material/focus/FocusRingDrawable;->layer(Landroid/content/Context;Landroid/graphics/drawable/LayerDrawable;Lcom/google/android/material/shape/MaterialShapeDrawable;)Lcom/google/android/material/focus/FocusRingDrawable; +SPLcom/google/android/material/focus/FocusRingDrawable;->shouldUseFocusRing(Landroid/content/Context;)Z +Lcom/google/android/material/focus/FocusRingDrawable$1; +SPLcom/google/android/material/focus/FocusRingDrawable$1;->(Ljava/lang/String;)V +Lcom/google/android/material/internal/BaselineLayout; +SPLcom/google/android/material/internal/BaselineLayout;->(Landroid/content/Context;)V +SPLcom/google/android/material/internal/BaselineLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/google/android/material/internal/BaselineLayout;->setMeasurePaddingFromBaseline(Z)V +Lcom/google/android/material/internal/ContextUtils; +SPLcom/google/android/material/internal/ContextUtils;->getActivity(Landroid/content/Context;)Landroid/app/Activity; +Lcom/google/android/material/internal/EdgeToEdgeUtils; +SPLcom/google/android/material/internal/EdgeToEdgeUtils;->getNavigationBarColor(Landroid/view/Window;)I +Lcom/google/android/material/internal/ForegroundLinearLayout; +SPLcom/google/android/material/internal/ForegroundLinearLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/internal/ForegroundLinearLayout;->drawableStateChanged()V +SPLcom/google/android/material/internal/ForegroundLinearLayout;->jumpDrawablesToCurrentState()V +SPLcom/google/android/material/internal/ForegroundLinearLayout;->onLayout(ZIIII)V +SPLcom/google/android/material/internal/ForegroundLinearLayout;->onSizeChanged(IIII)V +SPLcom/google/android/material/internal/ForegroundLinearLayout;->setForeground(Landroid/graphics/drawable/Drawable;)V +SPLcom/google/android/material/internal/ForegroundLinearLayout;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z +Lcom/google/android/material/internal/NavigationMenu; +SPLcom/google/android/material/internal/NavigationMenu;->(Landroid/content/Context;)V +Lcom/google/android/material/internal/NavigationMenuItemView; +SPLcom/google/android/material/internal/NavigationMenuItemView;->()V +SPLcom/google/android/material/internal/NavigationMenuItemView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->adjustAppearance()V +SPLcom/google/android/material/internal/NavigationMenuItemView;->initialize(Landroidx/appcompat/view/menu/MenuItemImpl;I)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->initialize(Landroidx/appcompat/view/menu/MenuItemImpl;Z)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->onCreateDrawableState(I)[I +SPLcom/google/android/material/internal/NavigationMenuItemView;->setActionView(Landroid/view/View;)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->setCheckable(Z)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->setChecked(Z)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->setIcon(Landroid/graphics/drawable/Drawable;)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->setIconPadding(I)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->setIconSize(I)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->setIconTintList(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->setMaxLines(I)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->setNeedsEmptyIcon(Z)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->setTextAppearance(I)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->setTextColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->setTitle(Ljava/lang/CharSequence;)V +SPLcom/google/android/material/internal/NavigationMenuItemView;->shouldExpandActionArea()Z +Lcom/google/android/material/internal/NavigationMenuItemView$1; +SPLcom/google/android/material/internal/NavigationMenuItemView$1;->(Lcom/google/android/material/internal/NavigationMenuItemView;)V +Lcom/google/android/material/internal/NavigationMenuPresenter; +SPLcom/google/android/material/internal/NavigationMenuPresenter;->()V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->access$300(Lcom/google/android/material/internal/NavigationMenuPresenter;)I +SPLcom/google/android/material/internal/NavigationMenuPresenter;->addHeaderView(Landroid/view/View;)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->getDividerInsetStart()I +SPLcom/google/android/material/internal/NavigationMenuPresenter;->getItemHorizontalPadding()I +SPLcom/google/android/material/internal/NavigationMenuPresenter;->getMenuView(Landroid/view/ViewGroup;)Landroidx/appcompat/view/menu/MenuView; +SPLcom/google/android/material/internal/NavigationMenuPresenter;->inflateHeaderView(I)Landroid/view/View; +SPLcom/google/android/material/internal/NavigationMenuPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setBehindStatusBar(Z)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setDividerInsetEnd(I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setDividerInsetStart(I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setId(I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setItemBackground(Landroid/graphics/drawable/Drawable;)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setItemHorizontalPadding(I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setItemIconPadding(I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setItemIconSize(I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setItemIconTintList(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setItemMaxLines(I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setItemTextAppearance(I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setItemTextAppearanceActiveBoldEnabled(Z)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setItemTextColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setItemVerticalPadding(I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setOverScrollMode(I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setSubheaderColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setSubheaderInsetEnd(I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setSubheaderInsetStart(I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setSubheaderTextAppearance(I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->setUpdateSuspended(Z)V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->updateAllDividerMenuItems()V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->updateAllSubHeaderMenuItems()V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->updateAllTextMenuItems()V +SPLcom/google/android/material/internal/NavigationMenuPresenter;->updateMenuView(Z)V +Lcom/google/android/material/internal/NavigationMenuPresenter$1; +SPLcom/google/android/material/internal/NavigationMenuPresenter$1;->(Lcom/google/android/material/internal/NavigationMenuPresenter;)V +Lcom/google/android/material/internal/NavigationMenuPresenter$HeaderViewHolder; +SPLcom/google/android/material/internal/NavigationMenuPresenter$HeaderViewHolder;->(Landroid/view/View;)V +Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter; +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->(Lcom/google/android/material/internal/NavigationMenuPresenter;)V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->access$000(Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;)V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->access$200(Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;)V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->getItemCount()I +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->getItemId(I)J +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->getItemViewType(I)I +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->onBindViewHolder(Lcom/google/android/material/internal/NavigationMenuPresenter$ViewHolder;I)V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Lcom/google/android/material/internal/NavigationMenuPresenter$ViewHolder; +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->prepareMenuItems()V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->setAccessibilityDelegate(Landroid/view/View;IZ)V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->setCheckedItem(Landroidx/appcompat/view/menu/MenuItemImpl;)V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->setUpdateSuspended(Z)V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->update()V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->updateAllDividerMenuItems()V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;->updateAllTextMenuItems()V +Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter$1; +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter$1;->(Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuAdapter;IZ)V +Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuHeaderItem; +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuHeaderItem;->()V +Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuItem; +Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuSeparatorItem; +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuSeparatorItem;->(II)V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuSeparatorItem;->getPaddingBottom()I +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuSeparatorItem;->getPaddingTop()I +Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuTextItem; +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuTextItem;->(Landroidx/appcompat/view/menu/MenuItemImpl;)V +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuTextItem;->getMenuItem()Landroidx/appcompat/view/menu/MenuItemImpl; +Lcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuViewAccessibilityDelegate; +SPLcom/google/android/material/internal/NavigationMenuPresenter$NavigationMenuViewAccessibilityDelegate;->(Lcom/google/android/material/internal/NavigationMenuPresenter;Landroidx/recyclerview/widget/RecyclerView;)V +Lcom/google/android/material/internal/NavigationMenuPresenter$NormalViewHolder; +SPLcom/google/android/material/internal/NavigationMenuPresenter$NormalViewHolder;->(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/view/View$OnClickListener;)V +Lcom/google/android/material/internal/NavigationMenuPresenter$SeparatorViewHolder; +SPLcom/google/android/material/internal/NavigationMenuPresenter$SeparatorViewHolder;->(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;)V +Lcom/google/android/material/internal/NavigationMenuPresenter$ViewHolder; +SPLcom/google/android/material/internal/NavigationMenuPresenter$ViewHolder;->(Landroid/view/View;)V +Lcom/google/android/material/internal/NavigationMenuView; +SPLcom/google/android/material/internal/NavigationMenuView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/google/android/material/internal/NavigationMenuView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +Lcom/google/android/material/internal/ScrimInsetsFrameLayout; +SPLcom/google/android/material/internal/ScrimInsetsFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/internal/ScrimInsetsFrameLayout;->onAttachedToWindow()V +SPLcom/google/android/material/internal/ScrimInsetsFrameLayout;->setDrawBottomInsetForeground(Z)V +SPLcom/google/android/material/internal/ScrimInsetsFrameLayout;->setDrawLeftInsetForeground(Z)V +SPLcom/google/android/material/internal/ScrimInsetsFrameLayout;->setDrawRightInsetForeground(Z)V +SPLcom/google/android/material/internal/ScrimInsetsFrameLayout;->setDrawTopInsetForeground(Z)V +Lcom/google/android/material/internal/ScrimInsetsFrameLayout$1; +SPLcom/google/android/material/internal/ScrimInsetsFrameLayout$1;->(Lcom/google/android/material/internal/ScrimInsetsFrameLayout;)V +Lcom/google/android/material/internal/TextDrawableHelper$TextDrawableDelegate; +Lcom/google/android/material/internal/TextScale; +SPLcom/google/android/material/internal/TextScale;->()V +Lcom/google/android/material/internal/ThemeEnforcement; +SPLcom/google/android/material/internal/ThemeEnforcement;->()V +SPLcom/google/android/material/internal/ThemeEnforcement;->checkAppCompatTheme(Landroid/content/Context;)V +SPLcom/google/android/material/internal/ThemeEnforcement;->checkCompatibleTheme(Landroid/content/Context;Landroid/util/AttributeSet;II)V +SPLcom/google/android/material/internal/ThemeEnforcement;->checkTextAppearance(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)V +SPLcom/google/android/material/internal/ThemeEnforcement;->checkTheme(Landroid/content/Context;[ILjava/lang/String;)V +SPLcom/google/android/material/internal/ThemeEnforcement;->isCustomTextAppearanceValid(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)Z +SPLcom/google/android/material/internal/ThemeEnforcement;->isTheme(Landroid/content/Context;[I)Z +SPLcom/google/android/material/internal/ThemeEnforcement;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)Landroid/content/res/TypedArray; +SPLcom/google/android/material/internal/ThemeEnforcement;->obtainTintedStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)Landroidx/appcompat/widget/TintTypedArray; +Lcom/google/android/material/internal/ViewUtils; +SPLcom/google/android/material/internal/ViewUtils;->doOnApplyWindowInsets(Landroid/view/View;Lcom/google/android/material/internal/ViewUtils$OnApplyWindowInsetsListener;)V +SPLcom/google/android/material/internal/ViewUtils;->getParentAbsoluteElevation(Landroid/view/View;)F +SPLcom/google/android/material/internal/ViewUtils;->parseTintMode(ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuff$Mode; +SPLcom/google/android/material/internal/ViewUtils;->requestApplyInsetsWhenAttached(Landroid/view/View;)V +Lcom/google/android/material/internal/ViewUtils$2; +SPLcom/google/android/material/internal/ViewUtils$2;->(Lcom/google/android/material/internal/ViewUtils$OnApplyWindowInsetsListener;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)V +SPLcom/google/android/material/internal/ViewUtils$2;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +Lcom/google/android/material/internal/ViewUtils$3; +SPLcom/google/android/material/internal/ViewUtils$3;->()V +SPLcom/google/android/material/internal/ViewUtils$3;->onViewAttachedToWindow(Landroid/view/View;)V +Lcom/google/android/material/internal/ViewUtils$OnApplyWindowInsetsListener; +Lcom/google/android/material/internal/ViewUtils$RelativePadding; +SPLcom/google/android/material/internal/ViewUtils$RelativePadding;->(IIII)V +SPLcom/google/android/material/internal/ViewUtils$RelativePadding;->(Lcom/google/android/material/internal/ViewUtils$RelativePadding;)V +SPLcom/google/android/material/internal/ViewUtils$RelativePadding;->applyToView(Landroid/view/View;)V +Lcom/google/android/material/internal/WindowUtils; +SPLcom/google/android/material/internal/WindowUtils;->getCurrentWindowBounds(Landroid/content/Context;)Landroid/graphics/Rect; +Lcom/google/android/material/internal/WindowUtils$Api30Impl; +SPLcom/google/android/material/internal/WindowUtils$Api30Impl;->getCurrentWindowBounds(Landroid/view/WindowManager;)Landroid/graphics/Rect; +Lcom/google/android/material/motion/MaterialBackAnimationHelper; +SPLcom/google/android/material/motion/MaterialBackAnimationHelper;->(Landroid/view/View;)V +Lcom/google/android/material/motion/MaterialBackHandler; +Lcom/google/android/material/motion/MaterialBackOrchestrator; +SPLcom/google/android/material/motion/MaterialBackOrchestrator;->(Landroid/view/View;)V +SPLcom/google/android/material/motion/MaterialBackOrchestrator;->(Lcom/google/android/material/motion/MaterialBackHandler;Landroid/view/View;)V +SPLcom/google/android/material/motion/MaterialBackOrchestrator;->createBackCallbackDelegate()Lcom/google/android/material/motion/MaterialBackOrchestrator$BackCallbackDelegate; +SPLcom/google/android/material/motion/MaterialBackOrchestrator;->shouldListenForBackCallbacks()Z +Lcom/google/android/material/motion/MaterialBackOrchestrator$Api33BackCallbackDelegate; +SPLcom/google/android/material/motion/MaterialBackOrchestrator$Api33BackCallbackDelegate;->()V +SPLcom/google/android/material/motion/MaterialBackOrchestrator$Api33BackCallbackDelegate;->(Lcom/google/android/material/motion/MaterialBackOrchestrator$1;)V +Lcom/google/android/material/motion/MaterialBackOrchestrator$Api34BackCallbackDelegate; +SPLcom/google/android/material/motion/MaterialBackOrchestrator$Api34BackCallbackDelegate;->()V +SPLcom/google/android/material/motion/MaterialBackOrchestrator$Api34BackCallbackDelegate;->(Lcom/google/android/material/motion/MaterialBackOrchestrator$1;)V +Lcom/google/android/material/motion/MaterialBackOrchestrator$BackCallbackDelegate; +Lcom/google/android/material/motion/MaterialSideContainerBackHelper; +SPLcom/google/android/material/motion/MaterialSideContainerBackHelper;->(Landroid/view/View;)V +Lcom/google/android/material/motion/MotionUtils; +SPLcom/google/android/material/motion/MotionUtils;->getLegacyControlPoint([Ljava/lang/String;I)F +SPLcom/google/android/material/motion/MotionUtils;->getLegacyEasingContent(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +SPLcom/google/android/material/motion/MotionUtils;->getLegacyThemeInterpolator(Ljava/lang/String;)Landroid/animation/TimeInterpolator; +SPLcom/google/android/material/motion/MotionUtils;->isLegacyEasingAttribute(Ljava/lang/String;)Z +SPLcom/google/android/material/motion/MotionUtils;->isLegacyEasingType(Ljava/lang/String;Ljava/lang/String;)Z +SPLcom/google/android/material/motion/MotionUtils;->resolveThemeDuration(Landroid/content/Context;II)I +SPLcom/google/android/material/motion/MotionUtils;->resolveThemeInterpolator(Landroid/content/Context;ILandroid/animation/TimeInterpolator;)Landroid/animation/TimeInterpolator; +Lcom/google/android/material/navigation/DividerMenuItem; +Lcom/google/android/material/navigation/NavigationBarItemView; +SPLcom/google/android/material/navigation/NavigationBarItemView;->()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->(Landroid/content/Context;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->calculateTextScaleFactors()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->getActiveIndicatorDrawable()Landroid/graphics/drawable/Drawable; +SPLcom/google/android/material/navigation/NavigationBarItemView;->getItemBackgroundResId()I +SPLcom/google/android/material/navigation/NavigationBarItemView;->getItemData()Landroidx/appcompat/view/menu/MenuItemImpl; +SPLcom/google/android/material/navigation/NavigationBarItemView;->initialize(Landroidx/appcompat/view/menu/MenuItemImpl;I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->initializeDefaultExpandedLabelGroupViews()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->isActiveIndicatorResizeableAndUnlabeled()Z +SPLcom/google/android/material/navigation/NavigationBarItemView;->maybeAnimateActiveIndicatorToProgress(F)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->onCreateDrawableState(I)[I +SPLcom/google/android/material/navigation/NavigationBarItemView;->refreshChecked()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->refreshItemBackground()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorDrawable(Landroid/graphics/drawable/Drawable;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorExpandedHeight(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorExpandedMarginHorizontal(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorExpandedPadding(Landroid/graphics/Rect;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorExpandedWidth(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorHeight(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorLabelPadding(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorMarginHorizontal(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorProgress(FF)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorResizeable(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorWidth(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setCheckable(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setChecked(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setExpanded(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setExpandedLabelGroupMargins()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setHorizontalTextAppearanceActive(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setHorizontalTextAppearanceInactive(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setIcon(Landroid/graphics/drawable/Drawable;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setIconLabelHorizontalSpacing(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setIconSize(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setIconTintList(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemBackground(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemBackground(Landroid/graphics/drawable/Drawable;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemGravity(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemIconGravity(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemPaddingBottom(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemPaddingTop(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemPosition(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setItemRippleColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setLabelFontScalingEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setLabelMaxLines(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setLabelPivots(Landroid/widget/TextView;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setLabelVisibilityMode(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setLayoutConfigurationIconAndLabel(Landroid/view/View;Landroid/view/View;FF)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setMeasureBottomPaddingFromLabelBaseline(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setOnlyShowWhenExpanded(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setShifting(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceActive(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceActiveBoldEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceForLabel(Landroid/widget/TextView;I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceInactive(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceWithoutFontScaling(Landroid/widget/TextView;I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTextColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setTitle(Ljava/lang/CharSequence;)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setViewMarginAndGravity(Landroid/view/View;III)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->setViewScaleValues(Landroid/view/View;FFI)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateActiveIndicatorLayoutParams(I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateActiveIndicatorTransform()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateActiveLabelBoldness()V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateActiveLabelTextAppearance(Landroid/widget/TextView;I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateInactiveLabelTextAppearance(Landroid/widget/TextView;I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateViewPaddingBottom(Landroid/view/View;I)V +SPLcom/google/android/material/navigation/NavigationBarItemView;->updateVisibility()V +Lcom/google/android/material/navigation/NavigationBarItemView$$ExternalSyntheticLambda1; +SPLcom/google/android/material/navigation/NavigationBarItemView$$ExternalSyntheticLambda1;->(Lcom/google/android/material/navigation/NavigationBarItemView;)V +Lcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform; +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform;->()V +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform;->(Lcom/google/android/material/navigation/NavigationBarItemView$1;)V +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform;->calculateAlpha(FF)F +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform;->calculateScaleX(F)F +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform;->calculateScaleY(F)F +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorTransform;->updateForProgress(FFLandroid/view/View;)V +Lcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorUnlabeledTransform; +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorUnlabeledTransform;->()V +SPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorUnlabeledTransform;->(Lcom/google/android/material/navigation/NavigationBarItemView$1;)V +Lcom/google/android/material/navigation/NavigationBarMenu; +SPLcom/google/android/material/navigation/NavigationBarMenu;->(Landroid/content/Context;Ljava/lang/Class;IZ)V +SPLcom/google/android/material/navigation/NavigationBarMenu;->addInternal(IIILjava/lang/CharSequence;)Landroid/view/MenuItem; +Lcom/google/android/material/navigation/NavigationBarMenuBuilder; +SPLcom/google/android/material/navigation/NavigationBarMenuBuilder;->(Landroidx/appcompat/view/menu/MenuBuilder;)V +SPLcom/google/android/material/navigation/NavigationBarMenuBuilder;->getContentItemCount()I +SPLcom/google/android/material/navigation/NavigationBarMenuBuilder;->getItemAt(I)Landroid/view/MenuItem; +SPLcom/google/android/material/navigation/NavigationBarMenuBuilder;->getVisibleMainContentItemCount()I +SPLcom/google/android/material/navigation/NavigationBarMenuBuilder;->refreshItems()V +SPLcom/google/android/material/navigation/NavigationBarMenuBuilder;->size()I +Lcom/google/android/material/navigation/NavigationBarMenuItemView; +Lcom/google/android/material/navigation/NavigationBarMenuView; +SPLcom/google/android/material/navigation/NavigationBarMenuView;->()V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->(Landroid/content/Context;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->buildMenuView()V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->createDefaultColorStateList(I)Landroid/content/res/ColorStateList; +SPLcom/google/android/material/navigation/NavigationBarMenuView;->createItemActiveIndicatorDrawable()Landroid/graphics/drawable/Drawable; +SPLcom/google/android/material/navigation/NavigationBarMenuView;->createMenuItem(ILandroidx/appcompat/view/menu/MenuItemImpl;ZZ)Lcom/google/android/material/navigation/NavigationBarItemView; +SPLcom/google/android/material/navigation/NavigationBarMenuView;->getCollapsedVisibleItemCount()I +SPLcom/google/android/material/navigation/NavigationBarMenuView;->getCurrentVisibleContentItemCount()I +SPLcom/google/android/material/navigation/NavigationBarMenuView;->getItemGravity()I +SPLcom/google/android/material/navigation/NavigationBarMenuView;->getItemIconGravity()I +SPLcom/google/android/material/navigation/NavigationBarMenuView;->getLabelVisibilityMode()I +SPLcom/google/android/material/navigation/NavigationBarMenuView;->getNewItem()Lcom/google/android/material/navigation/NavigationBarItemView; +SPLcom/google/android/material/navigation/NavigationBarMenuView;->initialize(Landroidx/appcompat/view/menu/MenuBuilder;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->isMenuStructureSame()Z +SPLcom/google/android/material/navigation/NavigationBarMenuView;->isShifting(II)Z +SPLcom/google/android/material/navigation/NavigationBarMenuView;->isValidId(I)Z +SPLcom/google/android/material/navigation/NavigationBarMenuView;->releaseItemPool()V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->removeUnusedBadges()V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setActiveIndicatorLabelPadding(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setBadgeIfNeeded(Lcom/google/android/material/navigation/NavigationBarItemView;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setCheckedItem(Landroid/view/MenuItem;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setCollapsedMaxItemCount(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setIconLabelHorizontalSpacing(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setIconTintList(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorExpandedHeight(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorExpandedMarginHorizontal(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorExpandedPadding(IIII)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorExpandedWidth(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorHeight(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorMarginHorizontal(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorShapeAppearance(Lcom/google/android/material/shape/ShapeAppearanceModel;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemActiveIndicatorWidth(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemIconSize(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemPaddingBottom(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemPaddingTop(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemRippleColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextAppearanceActive(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextAppearanceActiveBoldEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextAppearanceInactive(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setLabelFontScalingEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setLabelMaxLines(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setLabelVisibilityMode(I)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setMeasurePaddingFromLabelBaseline(Z)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->setPresenter(Lcom/google/android/material/navigation/NavigationBarPresenter;)V +SPLcom/google/android/material/navigation/NavigationBarMenuView;->updateMenuView()V +Lcom/google/android/material/navigation/NavigationBarMenuView$1; +SPLcom/google/android/material/navigation/NavigationBarMenuView$1;->(Lcom/google/android/material/navigation/NavigationBarMenuView;)V +Lcom/google/android/material/navigation/NavigationBarPresenter; +SPLcom/google/android/material/navigation/NavigationBarPresenter;->()V +SPLcom/google/android/material/navigation/NavigationBarPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V +SPLcom/google/android/material/navigation/NavigationBarPresenter;->setId(I)V +SPLcom/google/android/material/navigation/NavigationBarPresenter;->setMenuView(Lcom/google/android/material/navigation/NavigationBarMenuView;)V +SPLcom/google/android/material/navigation/NavigationBarPresenter;->setUpdateSuspended(Z)V +SPLcom/google/android/material/navigation/NavigationBarPresenter;->updateMenuView(Z)V +Lcom/google/android/material/navigation/NavigationBarView; +SPLcom/google/android/material/navigation/NavigationBarView;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V +SPLcom/google/android/material/navigation/NavigationBarView;->getCollapsedMaxItemCount()I +SPLcom/google/android/material/navigation/NavigationBarView;->getMenuInflater()Landroid/view/MenuInflater; +SPLcom/google/android/material/navigation/NavigationBarView;->getMenuView()Landroidx/appcompat/view/menu/MenuView; +SPLcom/google/android/material/navigation/NavigationBarView;->inflateMenu(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->isSubMenuSupported()Z +SPLcom/google/android/material/navigation/NavigationBarView;->onAttachedToWindow()V +SPLcom/google/android/material/navigation/NavigationBarView;->setActiveIndicatorLabelPadding(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setElevation(F)V +SPLcom/google/android/material/navigation/NavigationBarView;->setIconLabelHorizontalSpacing(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorExpandedHeight(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorExpandedMarginHorizontal(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorExpandedPadding(IIII)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorExpandedWidth(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorHeight(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorMarginHorizontal(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorShapeAppearance(Lcom/google/android/material/shape/ShapeAppearanceModel;)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemActiveIndicatorWidth(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemGravity(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemIconGravity(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemIconSize(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemPaddingBottom(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemPaddingTop(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemRippleColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemTextAppearanceActive(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemTextAppearanceActiveBoldEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemTextAppearanceInactive(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setItemTextColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/navigation/NavigationBarView;->setLabelFontScalingEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationBarView;->setLabelMaxLines(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setLabelVisibilityMode(I)V +SPLcom/google/android/material/navigation/NavigationBarView;->setMeasureBottomPaddingFromLabelBaseline(Z)V +SPLcom/google/android/material/navigation/NavigationBarView;->shouldAddMenuView()Z +Lcom/google/android/material/navigation/NavigationBarView$1; +SPLcom/google/android/material/navigation/NavigationBarView$1;->(Lcom/google/android/material/navigation/NavigationBarView;)V +Lcom/google/android/material/navigation/NavigationView; +SPLcom/google/android/material/navigation/NavigationView;->()V +SPLcom/google/android/material/navigation/NavigationView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/google/android/material/navigation/NavigationView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/navigation/NavigationView;->access$300(Lcom/google/android/material/navigation/NavigationView;)[I +SPLcom/google/android/material/navigation/NavigationView;->access$400(Lcom/google/android/material/navigation/NavigationView;)Lcom/google/android/material/internal/NavigationMenuPresenter; +SPLcom/google/android/material/navigation/NavigationView;->getDividerInsetStart()I +SPLcom/google/android/material/navigation/NavigationView;->getItemHorizontalPadding()I +SPLcom/google/android/material/navigation/NavigationView;->getMenu()Landroid/view/Menu; +SPLcom/google/android/material/navigation/NavigationView;->getMenuInflater()Landroid/view/MenuInflater; +SPLcom/google/android/material/navigation/NavigationView;->inflateHeaderView(I)Landroid/view/View; +SPLcom/google/android/material/navigation/NavigationView;->inflateMenu(I)V +SPLcom/google/android/material/navigation/NavigationView;->isStartInsetScrimEnabled()Z +SPLcom/google/android/material/navigation/NavigationView;->isTopInsetScrimEnabled()Z +SPLcom/google/android/material/navigation/NavigationView;->maybeUpdateCornerSizeForDrawerLayout(II)V +SPLcom/google/android/material/navigation/NavigationView;->onAttachedToWindow()V +SPLcom/google/android/material/navigation/NavigationView;->onMeasure(II)V +SPLcom/google/android/material/navigation/NavigationView;->onSizeChanged(IIII)V +SPLcom/google/android/material/navigation/NavigationView;->setBottomInsetScrimEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationView;->setDividerInsetEnd(I)V +SPLcom/google/android/material/navigation/NavigationView;->setDividerInsetStart(I)V +SPLcom/google/android/material/navigation/NavigationView;->setElevation(F)V +SPLcom/google/android/material/navigation/NavigationView;->setEndInsetScrimEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationView;->setItemHorizontalPadding(I)V +SPLcom/google/android/material/navigation/NavigationView;->setItemIconSize(I)V +SPLcom/google/android/material/navigation/NavigationView;->setItemMaxLines(I)V +SPLcom/google/android/material/navigation/NavigationView;->setItemVerticalPadding(I)V +SPLcom/google/android/material/navigation/NavigationView;->setNavigationItemSelectedListener(Lcom/google/android/material/navigation/NavigationView$OnNavigationItemSelectedListener;)V +SPLcom/google/android/material/navigation/NavigationView;->setOverScrollMode(I)V +SPLcom/google/android/material/navigation/NavigationView;->setStartInsetScrimEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationView;->setSubheaderInsetEnd(I)V +SPLcom/google/android/material/navigation/NavigationView;->setSubheaderInsetStart(I)V +SPLcom/google/android/material/navigation/NavigationView;->setTopInsetScrimEnabled(Z)V +SPLcom/google/android/material/navigation/NavigationView;->setupInsetScrimsListener()V +Lcom/google/android/material/navigation/NavigationView$1; +SPLcom/google/android/material/navigation/NavigationView$1;->(Lcom/google/android/material/navigation/NavigationView;)V +Lcom/google/android/material/navigation/NavigationView$2; +SPLcom/google/android/material/navigation/NavigationView$2;->(Lcom/google/android/material/navigation/NavigationView;)V +Lcom/google/android/material/navigation/NavigationView$3; +SPLcom/google/android/material/navigation/NavigationView$3;->(Lcom/google/android/material/navigation/NavigationView;)V +SPLcom/google/android/material/navigation/NavigationView$3;->onGlobalLayout()V +Lcom/google/android/material/navigation/NavigationView$FocusDrawerListener; +SPLcom/google/android/material/navigation/NavigationView$FocusDrawerListener;->(Lcom/google/android/material/navigation/NavigationView;)V +SPLcom/google/android/material/navigation/NavigationView$FocusDrawerListener;->(Lcom/google/android/material/navigation/NavigationView;Lcom/google/android/material/navigation/NavigationView$1;)V +SPLcom/google/android/material/navigation/NavigationView$FocusDrawerListener;->clearLastFocusedView()V +Lcom/google/android/material/navigation/NavigationView$OnNavigationItemSelectedListener; +Lcom/google/android/material/progressindicator/AnimatorDurationScaleProvider; +SPLcom/google/android/material/progressindicator/AnimatorDurationScaleProvider;->()V +SPLcom/google/android/material/progressindicator/AnimatorDurationScaleProvider;->getSystemAnimatorDurationScale(Landroid/content/ContentResolver;)F +Lcom/google/android/material/progressindicator/BaseProgressIndicator; +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->()V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->applyNewVisibility(Z)V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->getCurrentDrawable()Landroid/graphics/drawable/Drawable; +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->getIndeterminateDrawable()Lcom/google/android/material/progressindicator/IndeterminateDrawable; +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->getProgressDrawable()Lcom/google/android/material/progressindicator/DeterminateDrawable; +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->isEffectivelyVisible()Z +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->onAttachedToWindow()V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->onDetachedFromWindow()V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->onVisibilityChanged(Landroid/view/View;I)V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->onWindowVisibilityChanged(I)V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->registerAnimationCallbacks()V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->registerSwitchIndeterminateModeCallback()V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->setIndeterminate(Z)V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->setIndeterminateDrawable(Landroid/graphics/drawable/Drawable;)V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->setProgress(I)V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->setProgressCompat(IZ)V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->setProgressDrawable(Landroid/graphics/drawable/Drawable;)V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->unregisterAnimationCallbacks()V +SPLcom/google/android/material/progressindicator/BaseProgressIndicator;->visibleToUser()Z +Lcom/google/android/material/progressindicator/BaseProgressIndicator$$ExternalSyntheticLambda0; +SPLcom/google/android/material/progressindicator/BaseProgressIndicator$$ExternalSyntheticLambda0;->(Lcom/google/android/material/progressindicator/BaseProgressIndicator;)V +Lcom/google/android/material/progressindicator/BaseProgressIndicator$1; +SPLcom/google/android/material/progressindicator/BaseProgressIndicator$1;->(Lcom/google/android/material/progressindicator/BaseProgressIndicator;)V +Lcom/google/android/material/progressindicator/BaseProgressIndicator$2; +SPLcom/google/android/material/progressindicator/BaseProgressIndicator$2;->(Lcom/google/android/material/progressindicator/BaseProgressIndicator;)V +Lcom/google/android/material/progressindicator/BaseProgressIndicator$3; +SPLcom/google/android/material/progressindicator/BaseProgressIndicator$3;->(Lcom/google/android/material/progressindicator/BaseProgressIndicator;)V +Lcom/google/android/material/progressindicator/BaseProgressIndicator$4; +SPLcom/google/android/material/progressindicator/BaseProgressIndicator$4;->(Lcom/google/android/material/progressindicator/BaseProgressIndicator;)V +Lcom/google/android/material/progressindicator/BaseProgressIndicatorSpec; +SPLcom/google/android/material/progressindicator/BaseProgressIndicatorSpec;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V +SPLcom/google/android/material/progressindicator/BaseProgressIndicatorSpec;->hasWavyEffect(Z)Z +SPLcom/google/android/material/progressindicator/BaseProgressIndicatorSpec;->loadIndicatorColors(Landroid/content/Context;Landroid/content/res/TypedArray;)V +SPLcom/google/android/material/progressindicator/BaseProgressIndicatorSpec;->loadTrackColor(Landroid/content/Context;Landroid/content/res/TypedArray;)V +SPLcom/google/android/material/progressindicator/BaseProgressIndicatorSpec;->validateSpec()V +Lcom/google/android/material/progressindicator/DeterminateDrawable; +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->()V +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->(Landroid/content/Context;Lcom/google/android/material/progressindicator/BaseProgressIndicatorSpec;Lcom/google/android/material/progressindicator/DrawingDelegate;)V +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->createLinearDrawable(Landroid/content/Context;Lcom/google/android/material/progressindicator/LinearProgressIndicatorSpec;Lcom/google/android/material/progressindicator/LinearDrawingDelegate;)Lcom/google/android/material/progressindicator/DeterminateDrawable; +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->getIntrinsicHeight()I +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->hideNow()Z +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->jumpToCurrentState()V +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->registerAnimationCallback(Landroidx/vectordrawable/graphics/drawable/Animatable2Compat$AnimationCallback;)V +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->setAlpha(I)V +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->setDrawingDelegate(Lcom/google/android/material/progressindicator/DrawingDelegate;)V +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->setIndicatorFraction(F)V +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->setLevelByFraction(F)V +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->setVisible(ZZZ)Z +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->setVisibleInternal(ZZZ)Z +SPLcom/google/android/material/progressindicator/DeterminateDrawable;->unregisterAnimationCallback(Landroidx/vectordrawable/graphics/drawable/Animatable2Compat$AnimationCallback;)Z +Lcom/google/android/material/progressindicator/DeterminateDrawable$$ExternalSyntheticLambda1; +SPLcom/google/android/material/progressindicator/DeterminateDrawable$$ExternalSyntheticLambda1;->(Lcom/google/android/material/progressindicator/DeterminateDrawable;Lcom/google/android/material/progressindicator/BaseProgressIndicatorSpec;)V +Lcom/google/android/material/progressindicator/DeterminateDrawable$1; +SPLcom/google/android/material/progressindicator/DeterminateDrawable$1;->(Ljava/lang/String;)V +Lcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange; +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->()V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->(Landroid/content/Context;Lcom/google/android/material/progressindicator/BaseProgressIndicatorSpec;)V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->access$101(Lcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;ZZ)Z +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->access$200(Lcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;)V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->dispatchAnimationEnd()V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->endAnimatorsWithoutCallbacks([Landroid/animation/ValueAnimator;)V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->hideNow()Z +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->isHiding()Z +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->isRunning()Z +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->isShowing()Z +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->maybeInitializeAnimators()V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->registerAnimationCallback(Landroidx/vectordrawable/graphics/drawable/Animatable2Compat$AnimationCallback;)V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->setAlpha(I)V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->setGrowFraction(F)V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->setHideAnimator(Landroid/animation/ValueAnimator;)V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->setShowAnimator(Landroid/animation/ValueAnimator;)V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->setVisible(ZZ)Z +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->setVisible(ZZZ)Z +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->setVisibleInternal(ZZZ)Z +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->stop()V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;->unregisterAnimationCallback(Landroidx/vectordrawable/graphics/drawable/Animatable2Compat$AnimationCallback;)Z +Lcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange$1; +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange$1;->(Lcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;)V +Lcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange$2; +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange$2;->(Lcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;)V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange$2;->onAnimationEnd(Landroid/animation/Animator;)V +Lcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange$3; +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange$3;->(Ljava/lang/Class;Ljava/lang/String;)V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange$3;->set(Lcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange;Ljava/lang/Float;)V +SPLcom/google/android/material/progressindicator/DrawableWithAnimatedVisibilityChange$3;->set(Ljava/lang/Object;Ljava/lang/Object;)V +Lcom/google/android/material/progressindicator/DrawingDelegate; +SPLcom/google/android/material/progressindicator/DrawingDelegate;->(Lcom/google/android/material/progressindicator/BaseProgressIndicatorSpec;)V +Lcom/google/android/material/progressindicator/DrawingDelegate$ActiveIndicator; +SPLcom/google/android/material/progressindicator/DrawingDelegate$ActiveIndicator;->()V +Lcom/google/android/material/progressindicator/DrawingDelegate$PathPoint; +SPLcom/google/android/material/progressindicator/DrawingDelegate$PathPoint;->(Lcom/google/android/material/progressindicator/DrawingDelegate;)V +Lcom/google/android/material/progressindicator/IndeterminateAnimatorDelegate; +SPLcom/google/android/material/progressindicator/IndeterminateAnimatorDelegate;->(I)V +SPLcom/google/android/material/progressindicator/IndeterminateAnimatorDelegate;->registerDrawable(Lcom/google/android/material/progressindicator/IndeterminateDrawable;)V +Lcom/google/android/material/progressindicator/IndeterminateDrawable; +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->(Landroid/content/Context;Lcom/google/android/material/progressindicator/BaseProgressIndicatorSpec;Lcom/google/android/material/progressindicator/DrawingDelegate;Lcom/google/android/material/progressindicator/IndeterminateAnimatorDelegate;)V +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->createLinearDrawable(Landroid/content/Context;Lcom/google/android/material/progressindicator/LinearProgressIndicatorSpec;Lcom/google/android/material/progressindicator/LinearDrawingDelegate;)Lcom/google/android/material/progressindicator/IndeterminateDrawable; +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->getAnimatorDelegate()Lcom/google/android/material/progressindicator/IndeterminateAnimatorDelegate; +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->hideNow()Z +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->isHiding()Z +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->isRunning()Z +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->isShowing()Z +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->isSystemAnimatorDisabled()Z +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->registerAnimationCallback(Landroidx/vectordrawable/graphics/drawable/Animatable2Compat$AnimationCallback;)V +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->setAlpha(I)V +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->setAnimatorDelegate(Lcom/google/android/material/progressindicator/IndeterminateAnimatorDelegate;)V +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->setDrawingDelegate(Lcom/google/android/material/progressindicator/DrawingDelegate;)V +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->setVisible(ZZ)Z +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->setVisible(ZZZ)Z +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->setVisibleInternal(ZZZ)Z +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->stop()V +SPLcom/google/android/material/progressindicator/IndeterminateDrawable;->unregisterAnimationCallback(Landroidx/vectordrawable/graphics/drawable/Animatable2Compat$AnimationCallback;)Z +Lcom/google/android/material/progressindicator/LinearDrawingDelegate; +SPLcom/google/android/material/progressindicator/LinearDrawingDelegate;->(Lcom/google/android/material/progressindicator/LinearProgressIndicatorSpec;)V +SPLcom/google/android/material/progressindicator/LinearDrawingDelegate;->getPreferredHeight()I +Lcom/google/android/material/progressindicator/LinearIndeterminateDisjointAnimatorDelegate; +SPLcom/google/android/material/progressindicator/LinearIndeterminateDisjointAnimatorDelegate;->()V +SPLcom/google/android/material/progressindicator/LinearIndeterminateDisjointAnimatorDelegate;->(Landroid/content/Context;Lcom/google/android/material/progressindicator/LinearProgressIndicatorSpec;)V +SPLcom/google/android/material/progressindicator/LinearIndeterminateDisjointAnimatorDelegate;->cancelAnimatorImmediately()V +SPLcom/google/android/material/progressindicator/LinearIndeterminateDisjointAnimatorDelegate;->registerAnimatorsCompleteCallback(Landroidx/vectordrawable/graphics/drawable/Animatable2Compat$AnimationCallback;)V +SPLcom/google/android/material/progressindicator/LinearIndeterminateDisjointAnimatorDelegate;->unregisterAnimatorsCompleteCallback()V +Lcom/google/android/material/progressindicator/LinearIndeterminateDisjointAnimatorDelegate$3; +SPLcom/google/android/material/progressindicator/LinearIndeterminateDisjointAnimatorDelegate$3;->(Ljava/lang/Class;Ljava/lang/String;)V +Lcom/google/android/material/progressindicator/LinearProgressIndicator; +SPLcom/google/android/material/progressindicator/LinearProgressIndicator;->()V +SPLcom/google/android/material/progressindicator/LinearProgressIndicator;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/google/android/material/progressindicator/LinearProgressIndicator;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/progressindicator/LinearProgressIndicator;->createSpec(Landroid/content/Context;Landroid/util/AttributeSet;)Lcom/google/android/material/progressindicator/BaseProgressIndicatorSpec; +SPLcom/google/android/material/progressindicator/LinearProgressIndicator;->createSpec(Landroid/content/Context;Landroid/util/AttributeSet;)Lcom/google/android/material/progressindicator/LinearProgressIndicatorSpec; +SPLcom/google/android/material/progressindicator/LinearProgressIndicator;->initializeDrawables()V +SPLcom/google/android/material/progressindicator/LinearProgressIndicator;->setProgressCompat(IZ)V +Lcom/google/android/material/progressindicator/LinearProgressIndicatorSpec; +SPLcom/google/android/material/progressindicator/LinearProgressIndicatorSpec;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/google/android/material/progressindicator/LinearProgressIndicatorSpec;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/progressindicator/LinearProgressIndicatorSpec;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V +SPLcom/google/android/material/progressindicator/LinearProgressIndicatorSpec;->validateSpec()V +Lcom/google/android/material/resources/MaterialAttributes; +SPLcom/google/android/material/resources/MaterialAttributes;->resolve(Landroid/content/Context;I)Landroid/util/TypedValue; +SPLcom/google/android/material/resources/MaterialAttributes;->resolve(Landroid/content/res/Resources$Theme;I)Landroid/util/TypedValue; +SPLcom/google/android/material/resources/MaterialAttributes;->resolveBoolean(Landroid/content/Context;IZ)Z +SPLcom/google/android/material/resources/MaterialAttributes;->resolveBoolean(Landroid/content/res/Resources$Theme;IZ)Z +SPLcom/google/android/material/resources/MaterialAttributes;->resolveInteger(Landroid/content/Context;II)I +SPLcom/google/android/material/resources/MaterialAttributes;->resolveInteger(Landroid/content/res/Resources$Theme;II)I +SPLcom/google/android/material/resources/MaterialAttributes;->resolveTypedValueOrThrow(Landroid/content/Context;ILjava/lang/String;)Landroid/util/TypedValue; +SPLcom/google/android/material/resources/MaterialAttributes;->resolveTypedValueOrThrow(Landroid/view/View;I)Landroid/util/TypedValue; +Lcom/google/android/material/resources/MaterialResources; +SPLcom/google/android/material/resources/MaterialResources;->getColorStateList(Landroid/content/Context;Landroid/content/res/TypedArray;I)Landroid/content/res/ColorStateList; +SPLcom/google/android/material/resources/MaterialResources;->getColorStateList(Landroid/content/Context;Landroidx/appcompat/widget/TintTypedArray;I)Landroid/content/res/ColorStateList; +SPLcom/google/android/material/resources/MaterialResources;->getComplexUnit(Landroid/util/TypedValue;)I +SPLcom/google/android/material/resources/MaterialResources;->getDimensionPixelSize(Landroid/content/Context;Landroid/content/res/TypedArray;II)I +SPLcom/google/android/material/resources/MaterialResources;->getDrawable(Landroid/content/Context;Landroid/content/res/TypedArray;I)Landroid/graphics/drawable/Drawable; +SPLcom/google/android/material/resources/MaterialResources;->getUnscaledLineHeight(Landroid/content/Context;II)I +SPLcom/google/android/material/resources/MaterialResources;->getUnscaledTextSize(Landroid/content/Context;II)I +Lcom/google/android/material/ripple/RippleUtils; +SPLcom/google/android/material/ripple/RippleUtils;->()V +SPLcom/google/android/material/ripple/RippleUtils;->sanitizeRippleDrawableColor(Landroid/content/res/ColorStateList;)Landroid/content/res/ColorStateList; +Lcom/google/android/material/shadow/ShadowRenderer; +SPLcom/google/android/material/shadow/ShadowRenderer;->()V +SPLcom/google/android/material/shadow/ShadowRenderer;->()V +SPLcom/google/android/material/shadow/ShadowRenderer;->(I)V +SPLcom/google/android/material/shadow/ShadowRenderer;->setShadowColor(I)V +Lcom/google/android/material/shape/AbsoluteCornerSize; +SPLcom/google/android/material/shape/AbsoluteCornerSize;->(F)V +SPLcom/google/android/material/shape/AbsoluteCornerSize;->getCornerSize(Landroid/graphics/RectF;)F +Lcom/google/android/material/shape/CornerSize; +Lcom/google/android/material/shape/CornerTreatment; +SPLcom/google/android/material/shape/CornerTreatment;->()V +SPLcom/google/android/material/shape/CornerTreatment;->getCornerPath(Lcom/google/android/material/shape/ShapePath;FFLandroid/graphics/RectF;Lcom/google/android/material/shape/CornerSize;)V +Lcom/google/android/material/shape/EdgeTreatment; +SPLcom/google/android/material/shape/EdgeTreatment;->()V +SPLcom/google/android/material/shape/EdgeTreatment;->forceIntersection()Z +SPLcom/google/android/material/shape/EdgeTreatment;->getEdgePath(FFFLcom/google/android/material/shape/ShapePath;)V +Lcom/google/android/material/shape/MaterialShapeDrawable; +SPLcom/google/android/material/shape/MaterialShapeDrawable;->()V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->(Lcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->(Lcom/google/android/material/shape/ShapeAppearance;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->(Lcom/google/android/material/shape/ShapeAppearanceModel;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->access$602(Lcom/google/android/material/shape/MaterialShapeDrawable;Z)Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->access$702(Lcom/google/android/material/shape/MaterialShapeDrawable;Z)Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->calculatePaintColorTintFilter(Landroid/graphics/Paint;Z)Landroid/graphics/PorterDuffColorFilter; +SPLcom/google/android/material/shape/MaterialShapeDrawable;->calculateRoundRectCornerSize(Landroid/graphics/RectF;Lcom/google/android/material/shape/ShapeAppearanceModel;[F)F +SPLcom/google/android/material/shape/MaterialShapeDrawable;->calculateTintColorTintFilter(Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;Z)Landroid/graphics/PorterDuffColorFilter; +SPLcom/google/android/material/shape/MaterialShapeDrawable;->calculateTintFilter(Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;Landroid/graphics/Paint;Z)Landroid/graphics/PorterDuffColorFilter; +SPLcom/google/android/material/shape/MaterialShapeDrawable;->compositeElevationOverlayIfNeeded(I)I +SPLcom/google/android/material/shape/MaterialShapeDrawable;->draw(Landroid/graphics/Canvas;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->drawFillShape(Landroid/graphics/Canvas;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->drawShape(Landroid/graphics/Canvas;Landroid/graphics/Paint;Landroid/graphics/Path;Lcom/google/android/material/shape/ShapeAppearanceModel;[FLandroid/graphics/RectF;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->getBoundsAsRectF()Landroid/graphics/RectF; +SPLcom/google/android/material/shape/MaterialShapeDrawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState; +SPLcom/google/android/material/shape/MaterialShapeDrawable;->getElevation()F +SPLcom/google/android/material/shape/MaterialShapeDrawable;->getOpacity()I +SPLcom/google/android/material/shape/MaterialShapeDrawable;->getOutline(Landroid/graphics/Outline;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->getPadding(Landroid/graphics/Rect;)Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->getParentAbsoluteElevation()F +SPLcom/google/android/material/shape/MaterialShapeDrawable;->getShapeAppearanceModel()Lcom/google/android/material/shape/ShapeAppearanceModel; +SPLcom/google/android/material/shape/MaterialShapeDrawable;->getTranslationZ()F +SPLcom/google/android/material/shape/MaterialShapeDrawable;->getZ()F +SPLcom/google/android/material/shape/MaterialShapeDrawable;->hasCompatShadow()Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->hasFill()Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->hasStroke()Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->initializeElevationOverlay(Landroid/content/Context;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->invalidateSelf()V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->invalidateSelfIgnoreShape()V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->isElevationOverlayEnabled()Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->isRoundRect()Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->isStateful()Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->maybeDrawCompatShadow(Landroid/graphics/Canvas;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->modulateAlpha(II)I +SPLcom/google/android/material/shape/MaterialShapeDrawable;->mutate()Landroid/graphics/drawable/Drawable; +SPLcom/google/android/material/shape/MaterialShapeDrawable;->onBoundsChange(Landroid/graphics/Rect;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->onStateChange([I)Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->requiresCompatShadow()Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setElevation(F)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setFillColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setParentAbsoluteElevation(F)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setShapeAppearance(Lcom/google/android/material/shape/ShapeAppearance;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setShapeAppearanceModel(Lcom/google/android/material/shape/ShapeAppearanceModel;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setStroke(FI)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setStroke(FLandroid/content/res/ColorStateList;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setStrokeColor(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setStrokeWidth(F)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setTint(I)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setTintList(Landroid/content/res/ColorStateList;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->setTintMode(Landroid/graphics/PorterDuff$Mode;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable;->shouldCalculatePath()Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->updateColorsForState([I)Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->updateTintFilter()Z +SPLcom/google/android/material/shape/MaterialShapeDrawable;->updateZ()V +Lcom/google/android/material/shape/MaterialShapeDrawable$1; +SPLcom/google/android/material/shape/MaterialShapeDrawable$1;->(Lcom/google/android/material/shape/MaterialShapeDrawable;)V +Lcom/google/android/material/shape/MaterialShapeDrawable$2; +SPLcom/google/android/material/shape/MaterialShapeDrawable$2;->(Lcom/google/android/material/shape/MaterialShapeDrawable;)V +Lcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState; +SPLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;->(Lcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;->(Lcom/google/android/material/shape/ShapeAppearance;Lcom/google/android/material/elevation/ElevationOverlayProvider;)V +SPLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;->newDrawable()Landroid/graphics/drawable/Drawable; +Lcom/google/android/material/shape/MaterialShapeDrawable$SpringAnimatedCornerSizeProperty; +SPLcom/google/android/material/shape/MaterialShapeDrawable$SpringAnimatedCornerSizeProperty;->(I)V +Lcom/google/android/material/shape/MaterialShapeUtils; +SPLcom/google/android/material/shape/MaterialShapeUtils;->createCornerTreatment(I)Lcom/google/android/material/shape/CornerTreatment; +SPLcom/google/android/material/shape/MaterialShapeUtils;->createDefaultCornerTreatment()Lcom/google/android/material/shape/CornerTreatment; +SPLcom/google/android/material/shape/MaterialShapeUtils;->createDefaultEdgeTreatment()Lcom/google/android/material/shape/EdgeTreatment; +SPLcom/google/android/material/shape/MaterialShapeUtils;->setElevation(Landroid/view/View;F)V +SPLcom/google/android/material/shape/MaterialShapeUtils;->setParentAbsoluteElevation(Landroid/view/View;)V +SPLcom/google/android/material/shape/MaterialShapeUtils;->setParentAbsoluteElevation(Landroid/view/View;Lcom/google/android/material/shape/MaterialShapeDrawable;)V +Lcom/google/android/material/shape/RelativeCornerSize; +SPLcom/google/android/material/shape/RelativeCornerSize;->(F)V +Lcom/google/android/material/shape/RoundedCornerTreatment; +SPLcom/google/android/material/shape/RoundedCornerTreatment;->()V +SPLcom/google/android/material/shape/RoundedCornerTreatment;->getCornerPath(Lcom/google/android/material/shape/ShapePath;FFF)V +Lcom/google/android/material/shape/ShapeAppearance; +Lcom/google/android/material/shape/ShapeAppearanceModel; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->()V +SPLcom/google/android/material/shape/ShapeAppearanceModel;->(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)V +SPLcom/google/android/material/shape/ShapeAppearanceModel;->(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;Lcom/google/android/material/shape/ShapeAppearanceModel$1;)V +SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder()Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;II)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;III)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;IILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;Landroid/util/AttributeSet;II)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;Landroid/util/AttributeSet;III)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;Landroid/util/AttributeSet;IILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/res/TypedArray;Lcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getBottomEdge()Lcom/google/android/material/shape/EdgeTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getBottomLeftCorner()Lcom/google/android/material/shape/CornerTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getBottomLeftCornerSize()Lcom/google/android/material/shape/CornerSize; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getBottomRightCorner()Lcom/google/android/material/shape/CornerTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getBottomRightCornerSize()Lcom/google/android/material/shape/CornerSize; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getCornerSize(Landroid/content/res/TypedArray;ILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/CornerSize; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getDefaultShape()Lcom/google/android/material/shape/ShapeAppearanceModel; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getLeftEdge()Lcom/google/android/material/shape/EdgeTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getRightEdge()Lcom/google/android/material/shape/EdgeTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getShapeForState([I)Lcom/google/android/material/shape/ShapeAppearanceModel; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getTopEdge()Lcom/google/android/material/shape/EdgeTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getTopLeftCorner()Lcom/google/android/material/shape/CornerTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getTopLeftCornerSize()Lcom/google/android/material/shape/CornerSize; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getTopRightCorner()Lcom/google/android/material/shape/CornerTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->getTopRightCornerSize()Lcom/google/android/material/shape/CornerSize; +SPLcom/google/android/material/shape/ShapeAppearanceModel;->hasRoundedCorners()Z +SPLcom/google/android/material/shape/ShapeAppearanceModel;->isRoundRect(Landroid/graphics/RectF;)Z +SPLcom/google/android/material/shape/ShapeAppearanceModel;->isStateful()Z +SPLcom/google/android/material/shape/ShapeAppearanceModel;->toBuilder()Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->()V +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->(Lcom/google/android/material/shape/ShapeAppearanceModel;)V +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->access$100(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)Lcom/google/android/material/shape/CornerTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->access$1000(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)Lcom/google/android/material/shape/EdgeTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->access$1100(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)Lcom/google/android/material/shape/EdgeTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->access$1200(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)Lcom/google/android/material/shape/EdgeTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->access$200(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)Lcom/google/android/material/shape/CornerTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->access$300(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)Lcom/google/android/material/shape/CornerTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->access$400(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)Lcom/google/android/material/shape/CornerTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->access$500(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)Lcom/google/android/material/shape/CornerSize; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->access$600(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)Lcom/google/android/material/shape/CornerSize; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->access$700(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)Lcom/google/android/material/shape/CornerSize; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->access$800(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)Lcom/google/android/material/shape/CornerSize; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->access$900(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;)Lcom/google/android/material/shape/EdgeTreatment; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->build()Lcom/google/android/material/shape/ShapeAppearanceModel; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->compatCornerTreatmentSize(Lcom/google/android/material/shape/CornerTreatment;)F +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setAllCornerSizes(F)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setAllCorners(IF)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setAllCorners(Lcom/google/android/material/shape/CornerTreatment;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setBottomLeftCorner(ILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setBottomLeftCorner(Lcom/google/android/material/shape/CornerTreatment;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setBottomLeftCornerSize(F)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setBottomLeftCornerSize(Lcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setBottomRightCorner(ILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setBottomRightCorner(Lcom/google/android/material/shape/CornerTreatment;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setBottomRightCornerSize(F)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setBottomRightCornerSize(Lcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setTopLeftCorner(ILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setTopLeftCorner(Lcom/google/android/material/shape/CornerTreatment;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setTopLeftCornerSize(F)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setTopLeftCornerSize(Lcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setTopRightCorner(ILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setTopRightCorner(Lcom/google/android/material/shape/CornerTreatment;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setTopRightCornerSize(F)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +SPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->setTopRightCornerSize(Lcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder; +Lcom/google/android/material/shape/ShapeAppearanceModel$CornerSizeUnaryOperator; +Lcom/google/android/material/shape/ShapeAppearancePathProvider; +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->()V +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->angleOfEdge(I)F +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->appendCornerPath(Lcom/google/android/material/shape/ShapeAppearancePathProvider$ShapeAppearancePathSpec;I)V +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->appendEdgePath(Lcom/google/android/material/shape/ShapeAppearancePathProvider$ShapeAppearancePathSpec;I)V +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->calculatePath(Lcom/google/android/material/shape/ShapeAppearanceModel;FLandroid/graphics/RectF;Landroid/graphics/Path;)V +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->calculatePath(Lcom/google/android/material/shape/ShapeAppearanceModel;FLandroid/graphics/RectF;Lcom/google/android/material/shape/ShapeAppearancePathProvider$PathListener;Landroid/graphics/Path;)V +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->calculatePath(Lcom/google/android/material/shape/ShapeAppearanceModel;[FFLandroid/graphics/RectF;Lcom/google/android/material/shape/ShapeAppearancePathProvider$PathListener;Landroid/graphics/Path;)V +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->getCoordinatesOfCorner(ILandroid/graphics/RectF;Landroid/graphics/PointF;)V +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->getCornerSizeForIndex(ILcom/google/android/material/shape/ShapeAppearanceModel;)Lcom/google/android/material/shape/CornerSize; +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->getCornerTreatmentForIndex(ILcom/google/android/material/shape/ShapeAppearanceModel;)Lcom/google/android/material/shape/CornerTreatment; +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->getEdgeCenterForIndex(Landroid/graphics/RectF;I)F +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->getEdgeTreatmentForIndex(ILcom/google/android/material/shape/ShapeAppearanceModel;)Lcom/google/android/material/shape/EdgeTreatment; +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->getInstance()Lcom/google/android/material/shape/ShapeAppearancePathProvider; +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->getInstanceOrCreate()Lcom/google/android/material/shape/ShapeAppearancePathProvider; +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->pathOverlapsCorner(Landroid/graphics/Path;I)Z +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->setCornerPathAndTransform(Lcom/google/android/material/shape/ShapeAppearancePathProvider$ShapeAppearancePathSpec;I[F)V +SPLcom/google/android/material/shape/ShapeAppearancePathProvider;->setEdgePathAndTransform(I)V +Lcom/google/android/material/shape/ShapeAppearancePathProvider$Lazy; +SPLcom/google/android/material/shape/ShapeAppearancePathProvider$Lazy;->()V +Lcom/google/android/material/shape/ShapeAppearancePathProvider$PathListener; +Lcom/google/android/material/shape/ShapeAppearancePathProvider$ShapeAppearancePathSpec; +SPLcom/google/android/material/shape/ShapeAppearancePathProvider$ShapeAppearancePathSpec;->(Lcom/google/android/material/shape/ShapeAppearanceModel;FLandroid/graphics/RectF;Lcom/google/android/material/shape/ShapeAppearancePathProvider$PathListener;Landroid/graphics/Path;)V +Lcom/google/android/material/shape/ShapePath; +SPLcom/google/android/material/shape/ShapePath;->()V +SPLcom/google/android/material/shape/ShapePath;->addArc(FFFFFF)V +SPLcom/google/android/material/shape/ShapePath;->addConnectingShadowIfNecessary(F)V +SPLcom/google/android/material/shape/ShapePath;->addShadowCompatOperation(Lcom/google/android/material/shape/ShapePath$ShadowCompatOperation;FF)V +SPLcom/google/android/material/shape/ShapePath;->applyToPath(Landroid/graphics/Matrix;Landroid/graphics/Path;)V +SPLcom/google/android/material/shape/ShapePath;->getCurrentShadowAngle()F +SPLcom/google/android/material/shape/ShapePath;->getEndX()F +SPLcom/google/android/material/shape/ShapePath;->getEndY()F +SPLcom/google/android/material/shape/ShapePath;->getStartX()F +SPLcom/google/android/material/shape/ShapePath;->getStartY()F +SPLcom/google/android/material/shape/ShapePath;->lineTo(FF)V +SPLcom/google/android/material/shape/ShapePath;->reset(FF)V +SPLcom/google/android/material/shape/ShapePath;->reset(FFFF)V +SPLcom/google/android/material/shape/ShapePath;->setCurrentShadowAngle(F)V +SPLcom/google/android/material/shape/ShapePath;->setEndShadowAngle(F)V +SPLcom/google/android/material/shape/ShapePath;->setEndX(F)V +SPLcom/google/android/material/shape/ShapePath;->setEndY(F)V +SPLcom/google/android/material/shape/ShapePath;->setStartX(F)V +SPLcom/google/android/material/shape/ShapePath;->setStartY(F)V +Lcom/google/android/material/shape/ShapePath$ArcShadowOperation; +SPLcom/google/android/material/shape/ShapePath$ArcShadowOperation;->(Lcom/google/android/material/shape/ShapePath$PathArcOperation;)V +Lcom/google/android/material/shape/ShapePath$LineShadowOperation; +SPLcom/google/android/material/shape/ShapePath$LineShadowOperation;->(Lcom/google/android/material/shape/ShapePath$PathLineOperation;FF)V +SPLcom/google/android/material/shape/ShapePath$LineShadowOperation;->getAngle()F +Lcom/google/android/material/shape/ShapePath$PathArcOperation; +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->()V +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->(FFFF)V +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->access$600(Lcom/google/android/material/shape/ShapePath$PathArcOperation;F)V +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->access$700(Lcom/google/android/material/shape/ShapePath$PathArcOperation;F)V +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->applyToPath(Landroid/graphics/Matrix;Landroid/graphics/Path;)V +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->getBottom()F +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->getLeft()F +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->getRight()F +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->getStartAngle()F +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->getSweepAngle()F +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->getTop()F +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->setBottom(F)V +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->setLeft(F)V +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->setRight(F)V +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->setStartAngle(F)V +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->setSweepAngle(F)V +SPLcom/google/android/material/shape/ShapePath$PathArcOperation;->setTop(F)V +Lcom/google/android/material/shape/ShapePath$PathLineOperation; +SPLcom/google/android/material/shape/ShapePath$PathLineOperation;->()V +SPLcom/google/android/material/shape/ShapePath$PathLineOperation;->access$000(Lcom/google/android/material/shape/ShapePath$PathLineOperation;)F +SPLcom/google/android/material/shape/ShapePath$PathLineOperation;->access$002(Lcom/google/android/material/shape/ShapePath$PathLineOperation;F)F +SPLcom/google/android/material/shape/ShapePath$PathLineOperation;->access$100(Lcom/google/android/material/shape/ShapePath$PathLineOperation;)F +SPLcom/google/android/material/shape/ShapePath$PathLineOperation;->access$102(Lcom/google/android/material/shape/ShapePath$PathLineOperation;F)F +SPLcom/google/android/material/shape/ShapePath$PathLineOperation;->applyToPath(Landroid/graphics/Matrix;Landroid/graphics/Path;)V +Lcom/google/android/material/shape/ShapePath$PathOperation; +SPLcom/google/android/material/shape/ShapePath$PathOperation;->()V +Lcom/google/android/material/shape/ShapePath$ShadowCompatOperation; +SPLcom/google/android/material/shape/ShapePath$ShadowCompatOperation;->()V +SPLcom/google/android/material/shape/ShapePath$ShadowCompatOperation;->()V +Lcom/google/android/material/shape/Shapeable; +Lcom/google/android/material/shape/ShapeableDelegate; +SPLcom/google/android/material/shape/ShapeableDelegate;->()V +SPLcom/google/android/material/shape/ShapeableDelegate;->create(Landroid/view/View;)Lcom/google/android/material/shape/ShapeableDelegate; +SPLcom/google/android/material/shape/ShapeableDelegate;->isMaskBoundsValid()Z +SPLcom/google/android/material/shape/ShapeableDelegate;->onMaskChanged(Landroid/view/View;Landroid/graphics/RectF;)V +SPLcom/google/android/material/shape/ShapeableDelegate;->onShapeAppearanceChanged(Landroid/view/View;Lcom/google/android/material/shape/ShapeAppearanceModel;)V +SPLcom/google/android/material/shape/ShapeableDelegate;->setOffsetZeroCornerEdgeBoundsEnabled(Landroid/view/View;Z)V +SPLcom/google/android/material/shape/ShapeableDelegate;->updateShapePath()V +Lcom/google/android/material/shape/ShapeableDelegateV33; +SPLcom/google/android/material/shape/ShapeableDelegateV33;->(Landroid/view/View;)V +SPLcom/google/android/material/shape/ShapeableDelegateV33;->initMaskOutlineProvider(Landroid/view/View;)V +SPLcom/google/android/material/shape/ShapeableDelegateV33;->invalidateClippingMethod(Landroid/view/View;)V +SPLcom/google/android/material/shape/ShapeableDelegateV33;->shouldUseCompatClipping()Z +Lcom/google/android/material/shape/ShapeableDelegateV33$1; +SPLcom/google/android/material/shape/ShapeableDelegateV33$1;->(Lcom/google/android/material/shape/ShapeableDelegateV33;)V +SPLcom/google/android/material/shape/ShapeableDelegateV33$1;->getOutline(Landroid/view/View;Landroid/graphics/Outline;)V +Lcom/google/android/material/shape/StateListShapeAppearanceModel; +SPLcom/google/android/material/shape/StateListShapeAppearanceModel;->create(Landroid/content/Context;Landroid/content/res/TypedArray;I)Lcom/google/android/material/shape/StateListShapeAppearanceModel; +Lcom/google/android/material/snackbar/BaseTransientBottomBar$BaseCallback; +SPLcom/google/android/material/snackbar/BaseTransientBottomBar$BaseCallback;->()V +Lcom/google/android/material/textview/MaterialTextView; +SPLcom/google/android/material/textview/MaterialTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/google/android/material/textview/MaterialTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/google/android/material/textview/MaterialTextView;->applyLineHeightFromViewAppearance(Landroid/content/res/Resources$Theme;I)V +SPLcom/google/android/material/textview/MaterialTextView;->canApplyTextAppearanceLineHeight(Landroid/content/Context;)Z +SPLcom/google/android/material/textview/MaterialTextView;->findViewAppearanceResourceId(Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;II)I +SPLcom/google/android/material/textview/MaterialTextView;->initialize(Landroid/util/AttributeSet;II)V +SPLcom/google/android/material/textview/MaterialTextView;->readFirstAvailableDimension(Landroid/content/Context;Landroid/content/res/TypedArray;[I)I +SPLcom/google/android/material/textview/MaterialTextView;->setTextAppearance(Landroid/content/Context;I)V +SPLcom/google/android/material/textview/MaterialTextView;->viewAttrsHasLineHeight(Landroid/content/Context;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;II)Z +Lcom/google/android/material/theme/MaterialComponentsViewInflater; +SPLcom/google/android/material/theme/MaterialComponentsViewInflater;->()V +SPLcom/google/android/material/theme/MaterialComponentsViewInflater;->createTextView(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatTextView; +Lcom/google/android/material/theme/overlay/MaterialThemeOverlay; +SPLcom/google/android/material/theme/overlay/MaterialThemeOverlay;->()V +SPLcom/google/android/material/theme/overlay/MaterialThemeOverlay;->obtainAndroidThemeOverlayId(Landroid/content/Context;Landroid/util/AttributeSet;)I +SPLcom/google/android/material/theme/overlay/MaterialThemeOverlay;->obtainMaterialOverlayIds(Landroid/content/Context;Landroid/util/AttributeSet;[III)[I +SPLcom/google/android/material/theme/overlay/MaterialThemeOverlay;->obtainMaterialThemeOverlayId(Landroid/content/Context;Landroid/util/AttributeSet;II)I +SPLcom/google/android/material/theme/overlay/MaterialThemeOverlay;->wrap(Landroid/content/Context;Landroid/util/AttributeSet;II)Landroid/content/Context; +SPLcom/google/android/material/theme/overlay/MaterialThemeOverlay;->wrap(Landroid/content/Context;Landroid/util/AttributeSet;II[I)Landroid/content/Context; +Lcom/google/common/util/concurrent/ListenableFuture; +Lcom/google/common/util/concurrent/Striped$SmallLazyStriped$$ExternalSyntheticBackportWithForwarding0; +SPLcom/google/common/util/concurrent/Striped$SmallLazyStriped$$ExternalSyntheticBackportWithForwarding0;->m(Ljava/util/concurrent/atomic/AtomicReferenceArray;ILjava/lang/Object;Ljava/lang/Object;)Z +Lcom/google/protobuf/AbstractMessageLite; +SPLcom/google/protobuf/AbstractMessageLite;->()V +SPLcom/google/protobuf/AbstractMessageLite;->addAll(Ljava/lang/Iterable;Ljava/util/List;)V +SPLcom/google/protobuf/AbstractMessageLite;->toByteArray()[B +Lcom/google/protobuf/AbstractMessageLite$Builder; +SPLcom/google/protobuf/AbstractMessageLite$Builder;->()V +SPLcom/google/protobuf/AbstractMessageLite$Builder;->addAll(Ljava/lang/Iterable;Ljava/util/List;)V +SPLcom/google/protobuf/AbstractMessageLite$Builder;->addAllCheckingNulls(Ljava/lang/Iterable;Ljava/util/List;)V +Lcom/google/protobuf/AbstractProtobufList; +SPLcom/google/protobuf/AbstractProtobufList;->(Z)V +SPLcom/google/protobuf/AbstractProtobufList;->ensureIsMutable()V +SPLcom/google/protobuf/AbstractProtobufList;->isModifiable()Z +SPLcom/google/protobuf/AbstractProtobufList;->makeImmutable()V +Lcom/google/protobuf/Android; +SPLcom/google/protobuf/Android;->()V +SPLcom/google/protobuf/Android;->getClassForName(Ljava/lang/String;)Ljava/lang/Class; +SPLcom/google/protobuf/Android;->getMemoryClass()Ljava/lang/Class; +SPLcom/google/protobuf/Android;->isOnAndroidDevice()Z +Lcom/google/protobuf/ArrayDecoders; +SPLcom/google/protobuf/ArrayDecoders;->()V +SPLcom/google/protobuf/ArrayDecoders;->checkRecursionLimit(I)V +SPLcom/google/protobuf/ArrayDecoders;->decodeBytes([BILcom/google/protobuf/ArrayDecoders$Registers;)I +SPLcom/google/protobuf/ArrayDecoders;->decodeMessageField(Lcom/google/protobuf/Schema;[BIILcom/google/protobuf/ArrayDecoders$Registers;)I +SPLcom/google/protobuf/ArrayDecoders;->decodeMessageList(Lcom/google/protobuf/Schema;I[BIILcom/google/protobuf/Internal$ProtobufList;Lcom/google/protobuf/ArrayDecoders$Registers;)I +SPLcom/google/protobuf/ArrayDecoders;->decodeStringRequireUtf8([BILcom/google/protobuf/ArrayDecoders$Registers;)I +SPLcom/google/protobuf/ArrayDecoders;->decodeVarint32(I[BILcom/google/protobuf/ArrayDecoders$Registers;)I +SPLcom/google/protobuf/ArrayDecoders;->decodeVarint32([BILcom/google/protobuf/ArrayDecoders$Registers;)I +SPLcom/google/protobuf/ArrayDecoders;->decodeVarint64(J[BILcom/google/protobuf/ArrayDecoders$Registers;)I +SPLcom/google/protobuf/ArrayDecoders;->decodeVarint64([BILcom/google/protobuf/ArrayDecoders$Registers;)I +SPLcom/google/protobuf/ArrayDecoders;->mergeMessageField(Ljava/lang/Object;Lcom/google/protobuf/Schema;[BIILcom/google/protobuf/ArrayDecoders$Registers;)I +Lcom/google/protobuf/ArrayDecoders$Registers; +SPLcom/google/protobuf/ArrayDecoders$Registers;->(Lcom/google/protobuf/ExtensionRegistryLite;)V +Lcom/google/protobuf/ByteOutput; +SPLcom/google/protobuf/ByteOutput;->()V +Lcom/google/protobuf/ByteString; +SPLcom/google/protobuf/ByteString;->()V +SPLcom/google/protobuf/ByteString;->()V +SPLcom/google/protobuf/ByteString;->checkRange(III)I +SPLcom/google/protobuf/ByteString;->copyFrom([BII)Lcom/google/protobuf/ByteString; +SPLcom/google/protobuf/ByteString;->copyFrom([BIIZ)Lcom/google/protobuf/ByteString; +SPLcom/google/protobuf/ByteString;->copyFromUtf8(Ljava/lang/String;)Lcom/google/protobuf/ByteString; +SPLcom/google/protobuf/ByteString;->equals(Ljava/lang/Object;)Z +SPLcom/google/protobuf/ByteString;->isEmpty()Z +SPLcom/google/protobuf/ByteString;->toString(Ljava/nio/charset/Charset;)Ljava/lang/String; +SPLcom/google/protobuf/ByteString;->toStringUtf8()Ljava/lang/String; +Lcom/google/protobuf/ByteString$2; +SPLcom/google/protobuf/ByteString$2;->()V +Lcom/google/protobuf/ByteString$ByteArrayCopier; +Lcom/google/protobuf/ByteString$LeafByteString; +SPLcom/google/protobuf/ByteString$LeafByteString;->()V +SPLcom/google/protobuf/ByteString$LeafByteString;->(Lcom/google/protobuf/ByteString$1;)V +Lcom/google/protobuf/ByteString$LiteralByteString; +SPLcom/google/protobuf/ByteString$LiteralByteString;->([B)V +SPLcom/google/protobuf/ByteString$LiteralByteString;->size()I +SPLcom/google/protobuf/ByteString$LiteralByteString;->toStringInternal(Ljava/nio/charset/Charset;)Ljava/lang/String; +SPLcom/google/protobuf/ByteString$LiteralByteString;->writeTo(Lcom/google/protobuf/ByteOutput;)V +Lcom/google/protobuf/ByteString$SystemByteArrayCopier; +SPLcom/google/protobuf/ByteString$SystemByteArrayCopier;->()V +SPLcom/google/protobuf/ByteString$SystemByteArrayCopier;->(Lcom/google/protobuf/ByteString$1;)V +SPLcom/google/protobuf/ByteString$SystemByteArrayCopier;->copyFrom([BII)[B +Lcom/google/protobuf/CodedInputStream; +SPLcom/google/protobuf/CodedInputStream;->()V +SPLcom/google/protobuf/CodedInputStream;->()V +SPLcom/google/protobuf/CodedInputStream;->(Lcom/google/protobuf/CodedInputStream$1;)V +SPLcom/google/protobuf/CodedInputStream;->newInstance([B)Lcom/google/protobuf/CodedInputStream; +SPLcom/google/protobuf/CodedInputStream;->newInstance([BII)Lcom/google/protobuf/CodedInputStream; +SPLcom/google/protobuf/CodedInputStream;->newInstance([BIIZ)Lcom/google/protobuf/CodedInputStream; +Lcom/google/protobuf/CodedInputStream$ArrayDecoder; +SPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->([BIIZ)V +SPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->([BIIZLcom/google/protobuf/CodedInputStream$1;)V +SPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->pushLimit(I)I +SPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->setCurrentLimit(I)V +Lcom/google/protobuf/CodedInputStream$ArrayDecoderOldVarint; +SPLcom/google/protobuf/CodedInputStream$ArrayDecoderOldVarint;->([BIIZ)V +SPLcom/google/protobuf/CodedInputStream$ArrayDecoderOldVarint;->([BIIZLcom/google/protobuf/CodedInputStream$1;)V +Lcom/google/protobuf/CodedInputStream$VarintExperiment; +SPLcom/google/protobuf/CodedInputStream$VarintExperiment;->$values()[Lcom/google/protobuf/CodedInputStream$VarintExperiment; +SPLcom/google/protobuf/CodedInputStream$VarintExperiment;->()V +SPLcom/google/protobuf/CodedInputStream$VarintExperiment;->(Ljava/lang/String;I)V +Lcom/google/protobuf/CodedOutputStream; +SPLcom/google/protobuf/CodedOutputStream;->()V +SPLcom/google/protobuf/CodedOutputStream;->(Lcom/google/protobuf/CodedOutputStream$1;)V +SPLcom/google/protobuf/CodedOutputStream;->checkNoSpaceLeft()V +SPLcom/google/protobuf/CodedOutputStream;->computeBoolSize(IZ)I +SPLcom/google/protobuf/CodedOutputStream;->computeBoolSizeNoTag(Z)I +SPLcom/google/protobuf/CodedOutputStream;->computeBytesSize(ILcom/google/protobuf/ByteString;)I +SPLcom/google/protobuf/CodedOutputStream;->computeBytesSizeNoTag(Lcom/google/protobuf/ByteString;)I +SPLcom/google/protobuf/CodedOutputStream;->computeEnumSize(II)I +SPLcom/google/protobuf/CodedOutputStream;->computeEnumSizeNoTag(I)I +SPLcom/google/protobuf/CodedOutputStream;->computeInt32SizeNoTag(I)I +SPLcom/google/protobuf/CodedOutputStream;->computeInt64Size(IJ)I +SPLcom/google/protobuf/CodedOutputStream;->computeInt64SizeNoTag(J)I +SPLcom/google/protobuf/CodedOutputStream;->computeLengthDelimitedFieldSize(I)I +SPLcom/google/protobuf/CodedOutputStream;->computeSInt32Size(II)I +SPLcom/google/protobuf/CodedOutputStream;->computeSInt32SizeNoTag(I)I +SPLcom/google/protobuf/CodedOutputStream;->computeStringSize(ILjava/lang/String;)I +SPLcom/google/protobuf/CodedOutputStream;->computeStringSizeNoTag(Ljava/lang/String;)I +SPLcom/google/protobuf/CodedOutputStream;->computeTagSize(I)I +SPLcom/google/protobuf/CodedOutputStream;->computeUInt32Size(II)I +SPLcom/google/protobuf/CodedOutputStream;->computeUInt32SizeNoTag(I)I +SPLcom/google/protobuf/CodedOutputStream;->computeUInt64SizeNoTag(J)I +SPLcom/google/protobuf/CodedOutputStream;->encodeZigZag32(I)I +SPLcom/google/protobuf/CodedOutputStream;->isSerializationDeterministic()Z +SPLcom/google/protobuf/CodedOutputStream;->newInstance([B)Lcom/google/protobuf/CodedOutputStream; +SPLcom/google/protobuf/CodedOutputStream;->newInstance([BII)Lcom/google/protobuf/CodedOutputStream; +SPLcom/google/protobuf/CodedOutputStream;->writeEnum(II)V +SPLcom/google/protobuf/CodedOutputStream;->writeInt64(IJ)V +SPLcom/google/protobuf/CodedOutputStream;->writeSInt32(II)V +Lcom/google/protobuf/CodedOutputStream$ArrayEncoder; +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->([BII)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->([BIILcom/google/protobuf/CodedOutputStream$ByteBufferFlusher;)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->spaceLeft()I +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->write(B)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->write([BII)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeBool(IZ)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeBytes(ILcom/google/protobuf/ByteString;)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeBytesNoTag(Lcom/google/protobuf/ByteString;)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeInt32(II)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeInt32NoTag(I)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeLazy([BII)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeString(ILjava/lang/String;)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeStringNoTag(Ljava/lang/String;)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeTag(II)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeUInt32(II)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeUInt32NoTag(I)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeUInt64(IJ)V +SPLcom/google/protobuf/CodedOutputStream$ArrayEncoder;->writeUInt64NoTag(J)V +Lcom/google/protobuf/CodedOutputStream$ByteBufferFlusher; +Lcom/google/protobuf/CodedOutputStreamWriter; +SPLcom/google/protobuf/CodedOutputStreamWriter;->(Lcom/google/protobuf/CodedOutputStream;)V +SPLcom/google/protobuf/CodedOutputStreamWriter;->forCodedOutput(Lcom/google/protobuf/CodedOutputStream;)Lcom/google/protobuf/CodedOutputStreamWriter; +SPLcom/google/protobuf/CodedOutputStreamWriter;->writeBool(IZ)V +SPLcom/google/protobuf/CodedOutputStreamWriter;->writeBytes(ILcom/google/protobuf/ByteString;)V +SPLcom/google/protobuf/CodedOutputStreamWriter;->writeEnum(II)V +SPLcom/google/protobuf/CodedOutputStreamWriter;->writeInt64(IJ)V +SPLcom/google/protobuf/CodedOutputStreamWriter;->writeMap(ILcom/google/protobuf/MapEntryLite$Metadata;Ljava/util/Map;)V +SPLcom/google/protobuf/CodedOutputStreamWriter;->writeSInt32(II)V +SPLcom/google/protobuf/CodedOutputStreamWriter;->writeString(ILjava/lang/String;)V +SPLcom/google/protobuf/CodedOutputStreamWriter;->writeStringList(ILjava/util/List;)V +SPLcom/google/protobuf/CodedOutputStreamWriter;->writeUInt32(II)V +Lcom/google/protobuf/ExtensionRegistryFactory; +SPLcom/google/protobuf/ExtensionRegistryFactory;->()V +SPLcom/google/protobuf/ExtensionRegistryFactory;->createEmpty()Lcom/google/protobuf/ExtensionRegistryLite; +SPLcom/google/protobuf/ExtensionRegistryFactory;->invokeSubclassFactory(Ljava/lang/String;)Lcom/google/protobuf/ExtensionRegistryLite; +SPLcom/google/protobuf/ExtensionRegistryFactory;->reflectExtensionRegistry()Ljava/lang/Class; +Lcom/google/protobuf/ExtensionRegistryLite; +SPLcom/google/protobuf/ExtensionRegistryLite;->()V +SPLcom/google/protobuf/ExtensionRegistryLite;->(Z)V +SPLcom/google/protobuf/ExtensionRegistryLite;->getEmptyRegistry()Lcom/google/protobuf/ExtensionRegistryLite; +Lcom/google/protobuf/ExtensionRegistryLite$LazyExtensionMode; +SPLcom/google/protobuf/ExtensionRegistryLite$LazyExtensionMode;->$values()[Lcom/google/protobuf/ExtensionRegistryLite$LazyExtensionMode; +SPLcom/google/protobuf/ExtensionRegistryLite$LazyExtensionMode;->()V +SPLcom/google/protobuf/ExtensionRegistryLite$LazyExtensionMode;->(Ljava/lang/String;I)V +Lcom/google/protobuf/ExtensionSchema; +Lcom/google/protobuf/FieldType; +SPLcom/google/protobuf/FieldType;->$values()[Lcom/google/protobuf/FieldType; +SPLcom/google/protobuf/FieldType;->()V +SPLcom/google/protobuf/FieldType;->(Ljava/lang/String;IILcom/google/protobuf/FieldType$Collection;Lcom/google/protobuf/JavaType;)V +SPLcom/google/protobuf/FieldType;->id()I +SPLcom/google/protobuf/FieldType;->values()[Lcom/google/protobuf/FieldType; +Lcom/google/protobuf/FieldType$1; +SPLcom/google/protobuf/FieldType$1;->()V +Lcom/google/protobuf/FieldType$Collection; +SPLcom/google/protobuf/FieldType$Collection;->$values()[Lcom/google/protobuf/FieldType$Collection; +SPLcom/google/protobuf/FieldType$Collection;->()V +SPLcom/google/protobuf/FieldType$Collection;->(Ljava/lang/String;IZ)V +Lcom/google/protobuf/GeneratedMessageInfoFactory; +SPLcom/google/protobuf/GeneratedMessageInfoFactory;->()V +SPLcom/google/protobuf/GeneratedMessageInfoFactory;->()V +SPLcom/google/protobuf/GeneratedMessageInfoFactory;->getInstance()Lcom/google/protobuf/GeneratedMessageInfoFactory; +SPLcom/google/protobuf/GeneratedMessageInfoFactory;->messageInfoFor(Ljava/lang/Class;)Lcom/google/protobuf/MessageInfo; +Lcom/google/protobuf/GeneratedMessageLite; +SPLcom/google/protobuf/GeneratedMessageLite;->()V +SPLcom/google/protobuf/GeneratedMessageLite;->()V +SPLcom/google/protobuf/GeneratedMessageLite;->buildMessageInfo()Ljava/lang/Object; +SPLcom/google/protobuf/GeneratedMessageLite;->checkMessageInitialized(Lcom/google/protobuf/GeneratedMessageLite;)Lcom/google/protobuf/GeneratedMessageLite; +SPLcom/google/protobuf/GeneratedMessageLite;->clearMemoizedHashCode()V +SPLcom/google/protobuf/GeneratedMessageLite;->clearMemoizedSerializedSize()V +SPLcom/google/protobuf/GeneratedMessageLite;->computeSerializedSize(Lcom/google/protobuf/Schema;)I +SPLcom/google/protobuf/GeneratedMessageLite;->createBuilder()Lcom/google/protobuf/GeneratedMessageLite$Builder; +SPLcom/google/protobuf/GeneratedMessageLite;->emptyProtobufList()Lcom/google/protobuf/Internal$ProtobufList; +SPLcom/google/protobuf/GeneratedMessageLite;->getDefaultInstance(Ljava/lang/Class;)Lcom/google/protobuf/GeneratedMessageLite; +SPLcom/google/protobuf/GeneratedMessageLite;->getMemoizedSerializedSize()I +SPLcom/google/protobuf/GeneratedMessageLite;->getSerializedSize()I +SPLcom/google/protobuf/GeneratedMessageLite;->getSerializedSize(Lcom/google/protobuf/Schema;)I +SPLcom/google/protobuf/GeneratedMessageLite;->isInitialized()Z +SPLcom/google/protobuf/GeneratedMessageLite;->isInitialized(Lcom/google/protobuf/GeneratedMessageLite;Z)Z +SPLcom/google/protobuf/GeneratedMessageLite;->isMutable()Z +SPLcom/google/protobuf/GeneratedMessageLite;->makeImmutable()V +SPLcom/google/protobuf/GeneratedMessageLite;->markImmutable()V +SPLcom/google/protobuf/GeneratedMessageLite;->mutableCopy(Lcom/google/protobuf/Internal$ProtobufList;)Lcom/google/protobuf/Internal$ProtobufList; +SPLcom/google/protobuf/GeneratedMessageLite;->newMessageInfo(Lcom/google/protobuf/MessageLite;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/google/protobuf/GeneratedMessageLite;->newMutableInstance()Lcom/google/protobuf/GeneratedMessageLite; +SPLcom/google/protobuf/GeneratedMessageLite;->parseFrom(Lcom/google/protobuf/GeneratedMessageLite;[B)Lcom/google/protobuf/GeneratedMessageLite; +SPLcom/google/protobuf/GeneratedMessageLite;->parsePartialFrom(Lcom/google/protobuf/GeneratedMessageLite;[BIILcom/google/protobuf/ExtensionRegistryLite;)Lcom/google/protobuf/GeneratedMessageLite; +SPLcom/google/protobuf/GeneratedMessageLite;->registerDefaultInstance(Ljava/lang/Class;Lcom/google/protobuf/GeneratedMessageLite;)V +SPLcom/google/protobuf/GeneratedMessageLite;->setMemoizedSerializedSize(I)V +SPLcom/google/protobuf/GeneratedMessageLite;->writeTo(Lcom/google/protobuf/CodedOutputStream;)V +Lcom/google/protobuf/GeneratedMessageLite$Builder; +SPLcom/google/protobuf/GeneratedMessageLite$Builder;->(Lcom/google/protobuf/GeneratedMessageLite;)V +SPLcom/google/protobuf/GeneratedMessageLite$Builder;->build()Lcom/google/protobuf/GeneratedMessageLite; +SPLcom/google/protobuf/GeneratedMessageLite$Builder;->buildPartial()Lcom/google/protobuf/GeneratedMessageLite; +SPLcom/google/protobuf/GeneratedMessageLite$Builder;->copyOnWrite()V +SPLcom/google/protobuf/GeneratedMessageLite$Builder;->newMutableInstance()Lcom/google/protobuf/GeneratedMessageLite; +Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke; +SPLcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;->$values()[Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke; +SPLcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;->()V +SPLcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;->(Ljava/lang/String;I)V +SPLcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;->values()[Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke; +Lcom/google/protobuf/Internal; +SPLcom/google/protobuf/Internal;->()V +SPLcom/google/protobuf/Internal;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/google/protobuf/Internal;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object; +Lcom/google/protobuf/Internal$EnumLite; +Lcom/google/protobuf/Internal$EnumLiteMap; +Lcom/google/protobuf/Internal$EnumVerifier; +Lcom/google/protobuf/Internal$ProtobufList; +Lcom/google/protobuf/InvalidProtocolBufferException; +Lcom/google/protobuf/InvalidProtocolBufferException$InvalidWireTypeException; +Lcom/google/protobuf/JavaType; +SPLcom/google/protobuf/JavaType;->$values()[Lcom/google/protobuf/JavaType; +SPLcom/google/protobuf/JavaType;->()V +SPLcom/google/protobuf/JavaType;->(Ljava/lang/String;ILjava/lang/Class;Ljava/lang/Class;Ljava/lang/Object;)V +SPLcom/google/protobuf/JavaType;->getBoxedType()Ljava/lang/Class; +SPLcom/google/protobuf/JavaType;->values()[Lcom/google/protobuf/JavaType; +Lcom/google/protobuf/LazyStringList; +Lcom/google/protobuf/ListFieldSchema; +Lcom/google/protobuf/ListFieldSchemaLite; +SPLcom/google/protobuf/ListFieldSchemaLite;->()V +SPLcom/google/protobuf/ListFieldSchemaLite;->getProtobufList(Ljava/lang/Object;J)Lcom/google/protobuf/Internal$ProtobufList; +SPLcom/google/protobuf/ListFieldSchemaLite;->makeImmutableListAt(Ljava/lang/Object;J)V +Lcom/google/protobuf/ListFieldSchemas; +SPLcom/google/protobuf/ListFieldSchemas;->()V +SPLcom/google/protobuf/ListFieldSchemas;->lite()Lcom/google/protobuf/ListFieldSchema; +Lcom/google/protobuf/ManifestSchemaFactory; +SPLcom/google/protobuf/ManifestSchemaFactory;->()V +SPLcom/google/protobuf/ManifestSchemaFactory;->(Lcom/google/protobuf/MessageInfoFactory;)V +SPLcom/google/protobuf/ManifestSchemaFactory;->allowExtensions(Lcom/google/protobuf/MessageInfo;)Z +SPLcom/google/protobuf/ManifestSchemaFactory;->createSchema(Ljava/lang/Class;)Lcom/google/protobuf/Schema; +SPLcom/google/protobuf/ManifestSchemaFactory;->getDefaultMessageInfoFactory()Lcom/google/protobuf/MessageInfoFactory; +SPLcom/google/protobuf/ManifestSchemaFactory;->newSchema(Ljava/lang/Class;Lcom/google/protobuf/MessageInfo;)Lcom/google/protobuf/Schema; +SPLcom/google/protobuf/ManifestSchemaFactory;->useLiteRuntime(Ljava/lang/Class;)Z +Lcom/google/protobuf/ManifestSchemaFactory$1; +SPLcom/google/protobuf/ManifestSchemaFactory$1;->()V +Lcom/google/protobuf/MapEntryLite; +SPLcom/google/protobuf/MapEntryLite;->(Lcom/google/protobuf/WireFormat$FieldType;Ljava/lang/Object;Lcom/google/protobuf/WireFormat$FieldType;Ljava/lang/Object;)V +SPLcom/google/protobuf/MapEntryLite;->getMetadata()Lcom/google/protobuf/MapEntryLite$Metadata; +SPLcom/google/protobuf/MapEntryLite;->newDefaultInstance(Lcom/google/protobuf/WireFormat$FieldType;Ljava/lang/Object;Lcom/google/protobuf/WireFormat$FieldType;Ljava/lang/Object;)Lcom/google/protobuf/MapEntryLite; +Lcom/google/protobuf/MapEntryLite$Metadata; +SPLcom/google/protobuf/MapEntryLite$Metadata;->(Lcom/google/protobuf/WireFormat$FieldType;Ljava/lang/Object;Lcom/google/protobuf/WireFormat$FieldType;Ljava/lang/Object;)V +Lcom/google/protobuf/MapFieldLite; +SPLcom/google/protobuf/MapFieldLite;->()V +SPLcom/google/protobuf/MapFieldLite;->()V +SPLcom/google/protobuf/MapFieldLite;->checkForNullKeysAndValues(Ljava/util/Map;)V +SPLcom/google/protobuf/MapFieldLite;->emptyMapField()Lcom/google/protobuf/MapFieldLite; +SPLcom/google/protobuf/MapFieldLite;->ensureMutable()V +SPLcom/google/protobuf/MapFieldLite;->entrySet()Ljava/util/Set; +SPLcom/google/protobuf/MapFieldLite;->isMutable()Z +SPLcom/google/protobuf/MapFieldLite;->makeImmutable()V +SPLcom/google/protobuf/MapFieldLite;->mutableCopy()Lcom/google/protobuf/MapFieldLite; +SPLcom/google/protobuf/MapFieldLite;->putAll(Ljava/util/Map;)V +Lcom/google/protobuf/MapFieldSchema; +Lcom/google/protobuf/MapFieldSchemaLite; +SPLcom/google/protobuf/MapFieldSchemaLite;->()V +SPLcom/google/protobuf/MapFieldSchemaLite;->forMapData(Ljava/lang/Object;)Ljava/util/Map; +SPLcom/google/protobuf/MapFieldSchemaLite;->forMapMetadata(Ljava/lang/Object;)Lcom/google/protobuf/MapEntryLite$Metadata; +SPLcom/google/protobuf/MapFieldSchemaLite;->getSerializedSize(ILjava/lang/Object;Ljava/lang/Object;)I +SPLcom/google/protobuf/MapFieldSchemaLite;->getSerializedSizeLite(ILjava/lang/Object;Ljava/lang/Object;)I +SPLcom/google/protobuf/MapFieldSchemaLite;->toImmutable(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/google/protobuf/MapFieldSchemas; +SPLcom/google/protobuf/MapFieldSchemas;->()V +SPLcom/google/protobuf/MapFieldSchemas;->lite()Lcom/google/protobuf/MapFieldSchema; +Lcom/google/protobuf/MessageInfo; +Lcom/google/protobuf/MessageInfoFactory; +Lcom/google/protobuf/MessageLite; +Lcom/google/protobuf/MessageLite$Builder; +Lcom/google/protobuf/MessageLiteOrBuilder; +Lcom/google/protobuf/MessageSchema; +SPLcom/google/protobuf/MessageSchema;->()V +SPLcom/google/protobuf/MessageSchema;->([I[Ljava/lang/Object;IILcom/google/protobuf/MessageLite;Z[IIILcom/google/protobuf/NewInstanceSchema;Lcom/google/protobuf/ListFieldSchema;Lcom/google/protobuf/UnknownFieldSchema;Lcom/google/protobuf/ExtensionSchema;Lcom/google/protobuf/MapFieldSchema;)V +SPLcom/google/protobuf/MessageSchema;->booleanAt(Ljava/lang/Object;J)Z +SPLcom/google/protobuf/MessageSchema;->checkMutable(Ljava/lang/Object;)V +SPLcom/google/protobuf/MessageSchema;->getEnumFieldVerifier(I)Lcom/google/protobuf/Internal$EnumVerifier; +SPLcom/google/protobuf/MessageSchema;->getMapFieldDefaultEntry(I)Ljava/lang/Object; +SPLcom/google/protobuf/MessageSchema;->getMessageFieldSchema(I)Lcom/google/protobuf/Schema; +SPLcom/google/protobuf/MessageSchema;->getSerializedSize(Ljava/lang/Object;)I +SPLcom/google/protobuf/MessageSchema;->getUnknownFieldsSerializedSize(Lcom/google/protobuf/UnknownFieldSchema;Ljava/lang/Object;)I +SPLcom/google/protobuf/MessageSchema;->isEnforceUtf8(I)Z +SPLcom/google/protobuf/MessageSchema;->isFieldPresent(Ljava/lang/Object;I)Z +SPLcom/google/protobuf/MessageSchema;->isFieldPresent(Ljava/lang/Object;IIII)Z +SPLcom/google/protobuf/MessageSchema;->isLegacyEnumIsClosed(I)Z +SPLcom/google/protobuf/MessageSchema;->isMutable(Ljava/lang/Object;)Z +SPLcom/google/protobuf/MessageSchema;->isOneofPresent(Ljava/lang/Object;II)Z +SPLcom/google/protobuf/MessageSchema;->makeImmutable(Ljava/lang/Object;)V +SPLcom/google/protobuf/MessageSchema;->mergeFrom(Ljava/lang/Object;[BIILcom/google/protobuf/ArrayDecoders$Registers;)V +SPLcom/google/protobuf/MessageSchema;->mutableMessageFieldForMerge(Ljava/lang/Object;I)Ljava/lang/Object; +SPLcom/google/protobuf/MessageSchema;->mutableOneofMessageFieldForMerge(Ljava/lang/Object;II)Ljava/lang/Object; +SPLcom/google/protobuf/MessageSchema;->newInstance()Ljava/lang/Object; +SPLcom/google/protobuf/MessageSchema;->newSchema(Ljava/lang/Class;Lcom/google/protobuf/MessageInfo;Lcom/google/protobuf/NewInstanceSchema;Lcom/google/protobuf/ListFieldSchema;Lcom/google/protobuf/UnknownFieldSchema;Lcom/google/protobuf/ExtensionSchema;Lcom/google/protobuf/MapFieldSchema;)Lcom/google/protobuf/MessageSchema; +SPLcom/google/protobuf/MessageSchema;->newSchemaForRawMessageInfo(Lcom/google/protobuf/RawMessageInfo;Lcom/google/protobuf/NewInstanceSchema;Lcom/google/protobuf/ListFieldSchema;Lcom/google/protobuf/UnknownFieldSchema;Lcom/google/protobuf/ExtensionSchema;Lcom/google/protobuf/MapFieldSchema;)Lcom/google/protobuf/MessageSchema; +SPLcom/google/protobuf/MessageSchema;->numberAt(I)I +SPLcom/google/protobuf/MessageSchema;->offset(I)J +SPLcom/google/protobuf/MessageSchema;->parseMessage(Ljava/lang/Object;[BIIILcom/google/protobuf/ArrayDecoders$Registers;)I +SPLcom/google/protobuf/MessageSchema;->parseOneofField(Ljava/lang/Object;[BIIIIIIIJILcom/google/protobuf/ArrayDecoders$Registers;)I +SPLcom/google/protobuf/MessageSchema;->positionForFieldNumber(II)I +SPLcom/google/protobuf/MessageSchema;->presenceMaskAndOffsetAt(I)I +SPLcom/google/protobuf/MessageSchema;->reflectField(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field; +SPLcom/google/protobuf/MessageSchema;->setFieldPresent(Ljava/lang/Object;I)V +SPLcom/google/protobuf/MessageSchema;->setOneofPresent(Ljava/lang/Object;II)V +SPLcom/google/protobuf/MessageSchema;->slowPositionForFieldNumber(II)I +SPLcom/google/protobuf/MessageSchema;->storeMessageField(Ljava/lang/Object;ILjava/lang/Object;)V +SPLcom/google/protobuf/MessageSchema;->storeOneofMessageField(Ljava/lang/Object;IILjava/lang/Object;)V +SPLcom/google/protobuf/MessageSchema;->type(I)I +SPLcom/google/protobuf/MessageSchema;->typeAndOffsetAt(I)I +SPLcom/google/protobuf/MessageSchema;->writeMapHelper(Lcom/google/protobuf/CodedOutputStreamWriter;ILjava/lang/Object;I)V +SPLcom/google/protobuf/MessageSchema;->writeString(ILjava/lang/Object;Lcom/google/protobuf/CodedOutputStreamWriter;)V +SPLcom/google/protobuf/MessageSchema;->writeTo(Ljava/lang/Object;Lcom/google/protobuf/CodedOutputStreamWriter;)V +SPLcom/google/protobuf/MessageSchema;->writeUnknownInMessageTo(Lcom/google/protobuf/UnknownFieldSchema;Ljava/lang/Object;Lcom/google/protobuf/CodedOutputStreamWriter;)V +Lcom/google/protobuf/NewInstanceSchema; +Lcom/google/protobuf/NewInstanceSchemaLite; +SPLcom/google/protobuf/NewInstanceSchemaLite;->()V +SPLcom/google/protobuf/NewInstanceSchemaLite;->newInstance(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/google/protobuf/NewInstanceSchemas; +SPLcom/google/protobuf/NewInstanceSchemas;->()V +SPLcom/google/protobuf/NewInstanceSchemas;->lite()Lcom/google/protobuf/NewInstanceSchema; +Lcom/google/protobuf/PrimitiveNonBoxingCollection; +Lcom/google/protobuf/ProtoSyntax; +SPLcom/google/protobuf/ProtoSyntax;->$values()[Lcom/google/protobuf/ProtoSyntax; +SPLcom/google/protobuf/ProtoSyntax;->()V +SPLcom/google/protobuf/ProtoSyntax;->(Ljava/lang/String;I)V +SPLcom/google/protobuf/ProtoSyntax;->values()[Lcom/google/protobuf/ProtoSyntax; +Lcom/google/protobuf/Protobuf; +SPLcom/google/protobuf/Protobuf;->()V +SPLcom/google/protobuf/Protobuf;->()V +SPLcom/google/protobuf/Protobuf;->getInstance()Lcom/google/protobuf/Protobuf; +SPLcom/google/protobuf/Protobuf;->registerSchema(Ljava/lang/Class;)Lcom/google/protobuf/Schema; +SPLcom/google/protobuf/Protobuf;->schemaFor(Lcom/google/protobuf/GeneratedMessageLite;)Lcom/google/protobuf/Schema; +SPLcom/google/protobuf/Protobuf;->schemaFor(Ljava/lang/Class;)Lcom/google/protobuf/Schema; +Lcom/google/protobuf/ProtobufArrayList; +SPLcom/google/protobuf/ProtobufArrayList;->()V +SPLcom/google/protobuf/ProtobufArrayList;->([Ljava/lang/Object;IZ)V +SPLcom/google/protobuf/ProtobufArrayList;->add(Ljava/lang/Object;)Z +SPLcom/google/protobuf/ProtobufArrayList;->emptyList()Lcom/google/protobuf/ProtobufArrayList; +SPLcom/google/protobuf/ProtobufArrayList;->ensureCapacity(I)V +SPLcom/google/protobuf/ProtobufArrayList;->ensureIndexInRange(I)V +SPLcom/google/protobuf/ProtobufArrayList;->get(I)Ljava/lang/Object; +SPLcom/google/protobuf/ProtobufArrayList;->mutableCopyWithCapacity(I)Lcom/google/protobuf/Internal$ProtobufList; +SPLcom/google/protobuf/ProtobufArrayList;->mutableCopyWithCapacity(I)Lcom/google/protobuf/ProtobufArrayList; +SPLcom/google/protobuf/ProtobufArrayList;->size()I +Lcom/google/protobuf/ProtocolStringList; +Lcom/google/protobuf/RawMessageInfo; +SPLcom/google/protobuf/RawMessageInfo;->(Lcom/google/protobuf/MessageLite;Ljava/lang/String;[Ljava/lang/Object;)V +SPLcom/google/protobuf/RawMessageInfo;->getDefaultInstance()Lcom/google/protobuf/MessageLite; +SPLcom/google/protobuf/RawMessageInfo;->getObjects()[Ljava/lang/Object; +SPLcom/google/protobuf/RawMessageInfo;->getStringInfo()Ljava/lang/String; +SPLcom/google/protobuf/RawMessageInfo;->getSyntax()Lcom/google/protobuf/ProtoSyntax; +SPLcom/google/protobuf/RawMessageInfo;->isMessageSetWireFormat()Z +Lcom/google/protobuf/Schema; +Lcom/google/protobuf/SchemaUtil; +SPLcom/google/protobuf/SchemaUtil;->()V +SPLcom/google/protobuf/SchemaUtil;->computeSizeStringList(ILjava/util/List;)I +SPLcom/google/protobuf/SchemaUtil;->getGeneratedMessageClass()Ljava/lang/Class; +SPLcom/google/protobuf/SchemaUtil;->requireGeneratedMessage(Ljava/lang/Class;)V +SPLcom/google/protobuf/SchemaUtil;->unknownFieldSetLiteSchema()Lcom/google/protobuf/UnknownFieldSchema; +SPLcom/google/protobuf/SchemaUtil;->writeStringList(ILjava/util/List;Lcom/google/protobuf/CodedOutputStreamWriter;)V +Lcom/google/protobuf/UninitializedMessageException; +Lcom/google/protobuf/UnknownFieldSchema; +SPLcom/google/protobuf/UnknownFieldSchema;->()V +SPLcom/google/protobuf/UnknownFieldSchema;->()V +Lcom/google/protobuf/UnknownFieldSetLite; +SPLcom/google/protobuf/UnknownFieldSetLite;->()V +SPLcom/google/protobuf/UnknownFieldSetLite;->(I[I[Ljava/lang/Object;Z)V +SPLcom/google/protobuf/UnknownFieldSetLite;->getDefaultInstance()Lcom/google/protobuf/UnknownFieldSetLite; +SPLcom/google/protobuf/UnknownFieldSetLite;->getSerializedSize()I +SPLcom/google/protobuf/UnknownFieldSetLite;->makeImmutable()V +SPLcom/google/protobuf/UnknownFieldSetLite;->writeTo(Lcom/google/protobuf/CodedOutputStreamWriter;)V +Lcom/google/protobuf/UnknownFieldSetLiteSchema; +SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->()V +SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->getFromMessage(Ljava/lang/Object;)Lcom/google/protobuf/UnknownFieldSetLite; +SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->getFromMessage(Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->getSerializedSize(Lcom/google/protobuf/UnknownFieldSetLite;)I +SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->getSerializedSize(Ljava/lang/Object;)I +SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->makeImmutable(Ljava/lang/Object;)V +SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->writeTo(Lcom/google/protobuf/UnknownFieldSetLite;Lcom/google/protobuf/CodedOutputStreamWriter;)V +SPLcom/google/protobuf/UnknownFieldSetLiteSchema;->writeTo(Ljava/lang/Object;Lcom/google/protobuf/CodedOutputStreamWriter;)V +Lcom/google/protobuf/UnsafeUtil; +SPLcom/google/protobuf/UnsafeUtil;->()V +SPLcom/google/protobuf/UnsafeUtil;->access$700(Ljava/lang/Object;J)Z +SPLcom/google/protobuf/UnsafeUtil;->access$900(Ljava/lang/Object;JZ)V +SPLcom/google/protobuf/UnsafeUtil;->arrayBaseOffset(Ljava/lang/Class;)I +SPLcom/google/protobuf/UnsafeUtil;->arrayIndexScale(Ljava/lang/Class;)I +SPLcom/google/protobuf/UnsafeUtil;->bufferAddressField()Ljava/lang/reflect/Field; +SPLcom/google/protobuf/UnsafeUtil;->determineAndroidSupportByAddressSize(Ljava/lang/Class;)Z +SPLcom/google/protobuf/UnsafeUtil;->field(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field; +SPLcom/google/protobuf/UnsafeUtil;->fieldOffset(Ljava/lang/reflect/Field;)J +SPLcom/google/protobuf/UnsafeUtil;->getBoolean(Ljava/lang/Object;J)Z +SPLcom/google/protobuf/UnsafeUtil;->getBooleanLittleEndian(Ljava/lang/Object;J)Z +SPLcom/google/protobuf/UnsafeUtil;->getByteLittleEndian(Ljava/lang/Object;J)B +SPLcom/google/protobuf/UnsafeUtil;->getInt(Ljava/lang/Object;J)I +SPLcom/google/protobuf/UnsafeUtil;->getLong(Ljava/lang/Object;J)J +SPLcom/google/protobuf/UnsafeUtil;->getMemoryAccessor()Lcom/google/protobuf/UnsafeUtil$MemoryAccessor; +SPLcom/google/protobuf/UnsafeUtil;->getObject(Ljava/lang/Object;J)Ljava/lang/Object; +SPLcom/google/protobuf/UnsafeUtil;->getUnsafe()Lsun/misc/Unsafe; +SPLcom/google/protobuf/UnsafeUtil;->putBoolean(Ljava/lang/Object;JZ)V +SPLcom/google/protobuf/UnsafeUtil;->putBooleanLittleEndian(Ljava/lang/Object;JZ)V +SPLcom/google/protobuf/UnsafeUtil;->putByteLittleEndian(Ljava/lang/Object;JB)V +SPLcom/google/protobuf/UnsafeUtil;->putInt(Ljava/lang/Object;JI)V +SPLcom/google/protobuf/UnsafeUtil;->supportsUnsafeArrayOperations()Z +SPLcom/google/protobuf/UnsafeUtil;->supportsUnsafeByteBufferOperations()Z +Lcom/google/protobuf/UnsafeUtil$1; +SPLcom/google/protobuf/UnsafeUtil$1;->()V +SPLcom/google/protobuf/UnsafeUtil$1;->run()Ljava/lang/Object; +SPLcom/google/protobuf/UnsafeUtil$1;->run()Lsun/misc/Unsafe; +Lcom/google/protobuf/UnsafeUtil$Android64MemoryAccessor; +SPLcom/google/protobuf/UnsafeUtil$Android64MemoryAccessor;->(Lsun/misc/Unsafe;)V +SPLcom/google/protobuf/UnsafeUtil$Android64MemoryAccessor;->getBoolean(Ljava/lang/Object;J)Z +SPLcom/google/protobuf/UnsafeUtil$Android64MemoryAccessor;->putBoolean(Ljava/lang/Object;JZ)V +SPLcom/google/protobuf/UnsafeUtil$Android64MemoryAccessor;->supportsUnsafeByteBufferOperations()Z +Lcom/google/protobuf/UnsafeUtil$MemoryAccessor; +SPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->(Lsun/misc/Unsafe;)V +SPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->arrayBaseOffset(Ljava/lang/Class;)I +SPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->arrayIndexScale(Ljava/lang/Class;)I +SPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->getInt(Ljava/lang/Object;J)I +SPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->getLong(Ljava/lang/Object;J)J +SPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->getObject(Ljava/lang/Object;J)Ljava/lang/Object; +SPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->objectFieldOffset(Ljava/lang/reflect/Field;)J +SPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->putInt(Ljava/lang/Object;JI)V +SPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->supportsUnsafeArrayOperations()Z +Lcom/google/protobuf/Utf8; +SPLcom/google/protobuf/Utf8;->()V +SPLcom/google/protobuf/Utf8;->createProcessor()Lcom/google/protobuf/Utf8$Processor; +SPLcom/google/protobuf/Utf8;->decodeUtf8([BII)Ljava/lang/String; +SPLcom/google/protobuf/Utf8;->encode(Ljava/lang/String;[BII)I +SPLcom/google/protobuf/Utf8;->encodedLength(Ljava/lang/String;)I +Lcom/google/protobuf/Utf8$DecodeUtil; +SPLcom/google/protobuf/Utf8$DecodeUtil;->access$000(B)Z +SPLcom/google/protobuf/Utf8$DecodeUtil;->access$100(B[CI)V +SPLcom/google/protobuf/Utf8$DecodeUtil;->access$200(B)Z +SPLcom/google/protobuf/Utf8$DecodeUtil;->access$400(B)Z +SPLcom/google/protobuf/Utf8$DecodeUtil;->access$500(BBB[CI)V +SPLcom/google/protobuf/Utf8$DecodeUtil;->handleOneByte(B[CI)V +SPLcom/google/protobuf/Utf8$DecodeUtil;->handleThreeBytes(BBB[CI)V +SPLcom/google/protobuf/Utf8$DecodeUtil;->isNotTrailingByte(B)Z +SPLcom/google/protobuf/Utf8$DecodeUtil;->isOneByte(B)Z +SPLcom/google/protobuf/Utf8$DecodeUtil;->isThreeBytes(B)Z +SPLcom/google/protobuf/Utf8$DecodeUtil;->isTwoBytes(B)Z +SPLcom/google/protobuf/Utf8$DecodeUtil;->trailingByteValue(B)I +Lcom/google/protobuf/Utf8$MobileProcessor; +SPLcom/google/protobuf/Utf8$MobileProcessor;->()V +SPLcom/google/protobuf/Utf8$MobileProcessor;->decodeUtf8([BII)Ljava/lang/String; +SPLcom/google/protobuf/Utf8$MobileProcessor;->encodeUtf8(Ljava/lang/String;[BII)I +Lcom/google/protobuf/Utf8$Processor; +SPLcom/google/protobuf/Utf8$Processor;->()V +SPLcom/google/protobuf/Utf8$Processor;->encodedLength(Ljava/lang/String;)I +Lcom/google/protobuf/Utf8$UnpairedSurrogateException; +Lcom/google/protobuf/WireFormat; +SPLcom/google/protobuf/WireFormat;->()V +SPLcom/google/protobuf/WireFormat;->makeTag(II)I +Lcom/google/protobuf/WireFormat$FieldType; +SPLcom/google/protobuf/WireFormat$FieldType;->$values()[Lcom/google/protobuf/WireFormat$FieldType; +SPLcom/google/protobuf/WireFormat$FieldType;->()V +SPLcom/google/protobuf/WireFormat$FieldType;->(Ljava/lang/String;ILcom/google/protobuf/WireFormat$JavaType;I)V +SPLcom/google/protobuf/WireFormat$FieldType;->(Ljava/lang/String;ILcom/google/protobuf/WireFormat$JavaType;ILcom/google/protobuf/WireFormat$1;)V +Lcom/google/protobuf/WireFormat$FieldType$1; +SPLcom/google/protobuf/WireFormat$FieldType$1;->(Ljava/lang/String;ILcom/google/protobuf/WireFormat$JavaType;I)V +Lcom/google/protobuf/WireFormat$FieldType$2; +SPLcom/google/protobuf/WireFormat$FieldType$2;->(Ljava/lang/String;ILcom/google/protobuf/WireFormat$JavaType;I)V +Lcom/google/protobuf/WireFormat$FieldType$3; +SPLcom/google/protobuf/WireFormat$FieldType$3;->(Ljava/lang/String;ILcom/google/protobuf/WireFormat$JavaType;I)V +Lcom/google/protobuf/WireFormat$FieldType$4; +SPLcom/google/protobuf/WireFormat$FieldType$4;->(Ljava/lang/String;ILcom/google/protobuf/WireFormat$JavaType;I)V +Lcom/google/protobuf/WireFormat$JavaType; +SPLcom/google/protobuf/WireFormat$JavaType;->$values()[Lcom/google/protobuf/WireFormat$JavaType; +SPLcom/google/protobuf/WireFormat$JavaType;->()V +SPLcom/google/protobuf/WireFormat$JavaType;->(Ljava/lang/String;ILjava/lang/Object;)V +Lcom/ichi2/anki/AbstractFlashcardViewer; +SPLcom/ichi2/anki/AbstractFlashcardViewer;->()V +Lcom/ichi2/anki/AbstractFlashcardViewer$Companion; +SPLcom/ichi2/anki/AbstractFlashcardViewer$Companion;->()V +SPLcom/ichi2/anki/AbstractFlashcardViewer$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/AbstractIntentHandler; +SPLcom/ichi2/anki/AbstractIntentHandler;->()V +SPLcom/ichi2/anki/AbstractIntentHandler;->()V +SPLcom/ichi2/anki/AbstractIntentHandler;->onCreate(Landroid/os/Bundle;)V +SPLcom/ichi2/anki/AbstractIntentHandler;->showedActivityFailedScreen(Landroid/os/Bundle;)Z +Lcom/ichi2/anki/AbstractIntentHandler$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/AbstractIntentHandler$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/AbstractIntentHandler;)V +Lcom/ichi2/anki/AcraCrashReporter; +SPLcom/ichi2/anki/AcraCrashReporter;->()V +SPLcom/ichi2/anki/AcraCrashReporter;->()V +SPLcom/ichi2/anki/AcraCrashReporter;->createAcraCoreConfigBuilder()Lorg/acra/config/CoreConfigurationBuilder; +SPLcom/ichi2/anki/AcraCrashReporter;->fetchWebViewInformation()Ljava/util/HashMap; +SPLcom/ichi2/anki/AcraCrashReporter;->initialize(Landroid/app/Application;)V +SPLcom/ichi2/anki/AcraCrashReporter;->isEnabled(Landroid/content/Context;Z)Z +SPLcom/ichi2/anki/AcraCrashReporter;->isProperServiceProcess()Z +SPLcom/ichi2/anki/AcraCrashReporter;->setProductionACRAConfig(Landroid/content/SharedPreferences;)V +SPLcom/ichi2/anki/AcraCrashReporter;->setReportingMode(Ljava/lang/String;)V +Lcom/ichi2/anki/AcraCrashReporter$ToastType; +SPLcom/ichi2/anki/AcraCrashReporter$ToastType;->$values()[Lcom/ichi2/anki/AcraCrashReporter$ToastType; +SPLcom/ichi2/anki/AcraCrashReporter$ToastType;->()V +SPLcom/ichi2/anki/AcraCrashReporter$ToastType;->(Ljava/lang/String;II)V +SPLcom/ichi2/anki/AcraCrashReporter$ToastType;->getToastMessage(Landroid/content/Context;)Ljava/lang/String; +Lcom/ichi2/anki/AcraCrashReporterKt; +SPLcom/ichi2/anki/AcraCrashReporterKt;->initializeAcraCrashReporter(Landroid/app/Application;)V +SPLcom/ichi2/anki/AcraCrashReporterKt;->isAcraSenderProcess()Z +Lcom/ichi2/anki/ActionProviderCompat; +SPLcom/ichi2/anki/ActionProviderCompat;->()V +SPLcom/ichi2/anki/ActionProviderCompat;->(Landroid/content/Context;)V +Lcom/ichi2/anki/AndroidTtsVoice; +SPLcom/ichi2/anki/AndroidTtsVoice;->()V +SPLcom/ichi2/anki/AndroidTtsVoice;->(Landroid/speech/tts/Voice;Ljava/lang/String;)V +SPLcom/ichi2/anki/AndroidTtsVoice;->getEngine()Ljava/lang/String; +SPLcom/ichi2/anki/AndroidTtsVoice;->getVoice()Landroid/speech/tts/Voice; +Lcom/ichi2/anki/AnkiActivity; +SPLcom/ichi2/anki/AnkiActivity;->()V +SPLcom/ichi2/anki/AnkiActivity;->(Ljava/lang/Integer;)V +SPLcom/ichi2/anki/AnkiActivity;->enableToolbar()Landroidx/appcompat/app/ActionBar; +SPLcom/ichi2/anki/AnkiActivity;->exportReadyViewModel_delegate$lambda$0()Landroidx/lifecycle/ViewModelProvider$Factory; +SPLcom/ichi2/anki/AnkiActivity;->getAnalyticsScreenName()Ljava/lang/String; +SPLcom/ichi2/anki/AnkiActivity;->getBroadcastsActions()Ljava/util/Map; +SPLcom/ichi2/anki/AnkiActivity;->getDefaultViewModelCreationExtras()Landroidx/lifecycle/viewmodel/CreationExtras; +SPLcom/ichi2/anki/AnkiActivity;->getDialogHandler()Lcom/ichi2/anki/dialogs/DialogHandler; +SPLcom/ichi2/anki/AnkiActivity;->getExportReadyViewModel()Lcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel; +SPLcom/ichi2/anki/AnkiActivity;->hideProgressBar()V +SPLcom/ichi2/anki/AnkiActivity;->onCreate(Landroid/os/Bundle;)V +SPLcom/ichi2/anki/AnkiActivity;->onResume()V +SPLcom/ichi2/anki/AnkiActivity;->onStart()V +SPLcom/ichi2/anki/AnkiActivity;->registerReceiver()V +SPLcom/ichi2/anki/AnkiActivity;->setContentView(Landroid/view/View;)V +SPLcom/ichi2/anki/AnkiActivity;->showedActivityFailedScreen(Landroid/os/Bundle;)Z +Lcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/AnkiActivity;)V +Lcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/AnkiActivity;)V +Lcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda2;->(Lcom/ichi2/anki/AnkiActivity;)V +Lcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda3;->()V +SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda3;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda4;->(Lcom/ichi2/anki/AnkiActivity;)V +Lcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda5; +SPLcom/ichi2/anki/AnkiActivity$$ExternalSyntheticLambda5;->(Lcom/ichi2/anki/AnkiActivity;)V +Lcom/ichi2/anki/AnkiActivity$Companion; +SPLcom/ichi2/anki/AnkiActivity$Companion;->()V +SPLcom/ichi2/anki/AnkiActivity$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/AnkiActivity$onCreate$3; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3;->(Lcom/ichi2/anki/AnkiActivity;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/AnkiActivity$onCreate$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/AnkiActivity$onCreate$3$1; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3$1;->(Lcom/ichi2/anki/AnkiActivity;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/AnkiActivity$onCreate$3$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/AnkiActivity$onCreate$3$1$1; +SPLcom/ichi2/anki/AnkiActivity$onCreate$3$1$1;->(Lcom/ichi2/anki/AnkiActivity;)V +Lcom/ichi2/anki/AnkiActivity$registerReceiver$1; +SPLcom/ichi2/anki/AnkiActivity$registerReceiver$1;->(Lcom/ichi2/anki/AnkiActivity;)V +Lcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$2; +SPLcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$2;->(Landroidx/activity/ComponentActivity;)V +SPLcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$2;->invoke()Landroidx/lifecycle/ViewModelStore; +SPLcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$2;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$3; +SPLcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$3;->(Lkotlin/jvm/functions/Function0;Landroidx/activity/ComponentActivity;)V +SPLcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$3;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +SPLcom/ichi2/anki/AnkiActivity$special$$inlined$viewModels$default$3;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/AnkiActivityProvider; +Lcom/ichi2/anki/AnkiDroidApp; +SPLcom/ichi2/anki/AnkiDroidApp;->()V +SPLcom/ichi2/anki/AnkiDroidApp;->()V +SPLcom/ichi2/anki/AnkiDroidApp;->access$getFatalInitializationError$p(Lcom/ichi2/anki/AnkiDroidApp;)Lcom/ichi2/anki/FatalInitializationError; +SPLcom/ichi2/anki/AnkiDroidApp;->access$getInstance$cp()Lcom/ichi2/anki/AnkiDroidApp; +SPLcom/ichi2/anki/AnkiDroidApp;->access$getNotifications$p(Lcom/ichi2/anki/AnkiDroidApp;)Landroidx/lifecycle/MutableLiveData; +SPLcom/ichi2/anki/AnkiDroidApp;->access$getSharedPreferencesTestingOverride$cp()Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/AnkiDroidApp;->access$setAppLifecycleObserver$p(Lcom/ichi2/anki/AnkiDroidApp;Lcom/ichi2/anki/AppLifecycleObserver;)V +SPLcom/ichi2/anki/AnkiDroidApp;->access$setInstance$cp(Lcom/ichi2/anki/AnkiDroidApp;)V +SPLcom/ichi2/anki/AnkiDroidApp;->access$syncPlatform(Lcom/ichi2/anki/AnkiDroidApp;)Ljava/lang/String; +SPLcom/ichi2/anki/AnkiDroidApp;->attachBaseContext(Landroid/content/Context;)V +SPLcom/ichi2/anki/AnkiDroidApp;->checkWebViewAvailable()Z +SPLcom/ichi2/anki/AnkiDroidApp;->getCacheDir()Ljava/io/File; +SPLcom/ichi2/anki/AnkiDroidApp;->getDatabasePath(Ljava/lang/String;)Ljava/io/File; +SPLcom/ichi2/anki/AnkiDroidApp;->getDir(Ljava/lang/String;I)Ljava/io/File; +SPLcom/ichi2/anki/AnkiDroidApp;->getFilesDir()Ljava/io/File; +SPLcom/ichi2/anki/AnkiDroidApp;->getNoBackupFilesDir()Ljava/io/File; +SPLcom/ichi2/anki/AnkiDroidApp;->getProfileContext()Landroid/content/Context; +SPLcom/ichi2/anki/AnkiDroidApp;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/AnkiDroidApp;->initAnkiBackend(Z)V +SPLcom/ichi2/anki/AnkiDroidApp;->initializeAnkiDroidDirectory(Lcom/ichi2/anki/AnkiDroidApp$AnkiContext;)V +SPLcom/ichi2/anki/AnkiDroidApp;->launchCacheCleanup()Lkotlinx/coroutines/Job; +SPLcom/ichi2/anki/AnkiDroidApp;->onCreate$lambda$2(Landroid/content/Context;)Lcom/ichi2/anki/common/preferences/AnimationPreferences; +SPLcom/ichi2/anki/AnkiDroidApp;->onCreate()V +SPLcom/ichi2/anki/AnkiDroidApp;->setActivityAgnosticDialogs(Lcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs;)V +SPLcom/ichi2/anki/AnkiDroidApp;->setupAnkiBackend()V +SPLcom/ichi2/anki/AnkiDroidApp;->setupAnkiDroidApp()Z +SPLcom/ichi2/anki/AnkiDroidApp;->setupAppLifecycleObserver()V +SPLcom/ichi2/anki/AnkiDroidApp;->setupBackendChangeManager()V +SPLcom/ichi2/anki/AnkiDroidApp;->setupContextMenus()V +SPLcom/ichi2/anki/AnkiDroidApp;->setupCustomFieldFilters()V +SPLcom/ichi2/anki/AnkiDroidApp;->setupDayRollover(Lcom/ichi2/anki/AnkiDroidApp$AnkiContext;)V +SPLcom/ichi2/anki/AnkiDroidApp;->setupLifecycleLogging()V +SPLcom/ichi2/anki/AnkiDroidApp;->setupNotifications()Ljava/lang/Object; +SPLcom/ichi2/anki/AnkiDroidApp;->setupTextToSpeech()V +SPLcom/ichi2/anki/AnkiDroidApp;->syncPlatform()Ljava/lang/String; +Lcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/AnkiDroidApp;)V +Lcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda1;->()V +Lcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda2;->()V +SPLcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/AnkiDroidApp$$ExternalSyntheticLambda3;->(Lcom/ichi2/anki/AnkiDroidApp;)V +Lcom/ichi2/anki/AnkiDroidApp$AnkiContext; +SPLcom/ichi2/anki/AnkiDroidApp$AnkiContext;->()V +SPLcom/ichi2/anki/AnkiDroidApp$AnkiContext;->()V +Lcom/ichi2/anki/AnkiDroidApp$Companion; +SPLcom/ichi2/anki/AnkiDroidApp$Companion;->()V +SPLcom/ichi2/anki/AnkiDroidApp$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/AnkiDroidApp$Companion;->_get_sharedPreferencesProvider_$lambda$0()Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/AnkiDroidApp$Companion;->getAppResources()Landroid/content/res/Resources; +SPLcom/ichi2/anki/AnkiDroidApp$Companion;->getFatalError()Lcom/ichi2/anki/FatalInitializationError; +SPLcom/ichi2/anki/AnkiDroidApp$Companion;->getInstance()Lcom/ichi2/anki/AnkiDroidApp; +SPLcom/ichi2/anki/AnkiDroidApp$Companion;->getSharedPreferencesProvider()Lcom/ichi2/anki/preferences/SharedPreferencesProvider; +SPLcom/ichi2/anki/AnkiDroidApp$Companion;->getSharedPreferencesTestingOverride()Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/AnkiDroidApp$Companion;->isInitialized()Z +SPLcom/ichi2/anki/AnkiDroidApp$Companion;->makeBackendUsable(Landroid/content/Context;)V +SPLcom/ichi2/anki/AnkiDroidApp$Companion;->sharedPrefs()Landroid/content/SharedPreferences; +Lcom/ichi2/anki/AnkiDroidApp$Companion$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/AnkiDroidApp$Companion$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/AnkiDroidApp$Companion$$ExternalSyntheticLambda0;->sharedPrefs()Landroid/content/SharedPreferences; +Lcom/ichi2/anki/AnkiDroidApp$WhenMappings; +SPLcom/ichi2/anki/AnkiDroidApp$WhenMappings;->()V +Lcom/ichi2/anki/AnkiDroidApp$launchCacheCleanup$1; +SPLcom/ichi2/anki/AnkiDroidApp$launchCacheCleanup$1;->(Lcom/ichi2/anki/AnkiDroidApp;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/AnkiDroidApp$launchCacheCleanup$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/AnkiDroidApp$launchCacheCleanup$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/AnkiDroidApp$onCreate$5; +SPLcom/ichi2/anki/AnkiDroidApp$onCreate$5;->(Lcom/ichi2/anki/AnkiDroidApp;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/AnkiDroidApp$onCreate$5;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/AnkiDroidApp$onCreate$5;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/AnkiDroidApp$sam$androidx_lifecycle_Observer$0; +SPLcom/ichi2/anki/AnkiDroidApp$sam$androidx_lifecycle_Observer$0;->(Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1; +SPLcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1;->()V +SPLcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1;->onActivityDestroyed(Landroid/app/Activity;)V +SPLcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1;->onActivityResumed(Landroid/app/Activity;)V +SPLcom/ichi2/anki/AnkiDroidApp$setupLifecycleLogging$1$1;->onActivityStarted(Landroid/app/Activity;)V +Lcom/ichi2/anki/AnkiDroidApp$setupNotifications$1$2; +SPLcom/ichi2/anki/AnkiDroidApp$setupNotifications$1$2;->(Landroid/content/Context;)V +Lcom/ichi2/anki/AppLifecycleObserver; +SPLcom/ichi2/anki/AppLifecycleObserver;->()V +SPLcom/ichi2/anki/AppLifecycleObserver;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/AppLifecycleObserver;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/AppLifecycleObserver;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/AppLifecycleObserver;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +Lcom/ichi2/anki/BackendBackupsKt; +SPLcom/ichi2/anki/BackendBackupsKt;->()V +SPLcom/ichi2/anki/BackendBackupsKt;->access$createBackup(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/BackendBackupsKt;->access$createBackupHoldingLock(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/BackendBackupsKt;->createBackup(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/BackendBackupsKt;->createBackupHoldingLock$lambda$0(ZLcom/ichi2/anki/libanki/Collection;)Z +SPLcom/ichi2/anki/BackendBackupsKt;->createBackupHoldingLock(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/BackendBackupsKt;->performBackupInBackground$default(ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/BackendBackupsKt;->performBackupInBackground(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/BackendBackupsKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/BackendBackupsKt$$ExternalSyntheticLambda0;->(Z)V +SPLcom/ichi2/anki/BackendBackupsKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/BackendBackupsKt$createBackup$1; +SPLcom/ichi2/anki/BackendBackupsKt$createBackup$1;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/BackendBackupsKt$createBackup$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$1; +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$1;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$2; +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$2;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/BackendBackupsKt$createBackupHoldingLock$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/BackendBackupsKt$performBackupInBackground$1; +SPLcom/ichi2/anki/BackendBackupsKt$performBackupInBackground$1;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/BackendBackupsKt$performBackupInBackground$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/BackupManager; +SPLcom/ichi2/anki/BackupManager;->()V +Lcom/ichi2/anki/BackupManager$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/BackupManager$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/BackupManager$Companion; +SPLcom/ichi2/anki/BackupManager$Companion;->()V +SPLcom/ichi2/anki/BackupManager$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/BackupManager$Companion;->enoughDiscSpace(Ljava/io/File;)Z +SPLcom/ichi2/anki/BackupManager$Companion;->getBackupDirectory(Ljava/io/File;)Ljava/io/File; +SPLcom/ichi2/anki/BackupManager$Companion;->getBackupDirectoryFromCollection(Ljava/io/File;)Ljava/lang/String; +SPLcom/ichi2/anki/BackupManager$Companion;->getFreeDiscSpace(Ljava/io/File;)J +Lcom/ichi2/anki/BottomNavController$NavigationItem; +SPLcom/ichi2/anki/BottomNavController$NavigationItem;->$values()[Lcom/ichi2/anki/BottomNavController$NavigationItem; +SPLcom/ichi2/anki/BottomNavController$NavigationItem;->()V +SPLcom/ichi2/anki/BottomNavController$NavigationItem;->(Ljava/lang/String;IILjava/lang/String;ILjava/lang/String;)V +SPLcom/ichi2/anki/BottomNavController$NavigationItem;->getTag()Ljava/lang/String; +Lcom/ichi2/anki/BottomNavController$NavigationItem$Companion; +SPLcom/ichi2/anki/BottomNavController$NavigationItem$Companion;->()V +SPLcom/ichi2/anki/BottomNavController$NavigationItem$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/BuildConfig; +SPLcom/ichi2/anki/BuildConfig;->()V +Lcom/ichi2/anki/CardBrowser; +SPLcom/ichi2/anki/CardBrowser;->()V +Lcom/ichi2/anki/CardBrowser$Companion; +SPLcom/ichi2/anki/CardBrowser$Companion;->()V +SPLcom/ichi2/anki/CardBrowser$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/CardBrowser$Companion;->clearLastDeckId()V +Lcom/ichi2/anki/CollectionLeaseManager; +SPLcom/ichi2/anki/CollectionLeaseManager;->()V +SPLcom/ichi2/anki/CollectionLeaseManager;->()V +SPLcom/ichi2/anki/CollectionLeaseManager;->getFlowOfLease()Lkotlinx/coroutines/flow/StateFlow; +Lcom/ichi2/anki/CollectionManager; +SPLcom/ichi2/anki/CollectionManager;->$r8$lambda$CVrn_Kh6Msxahpe8OehADhoCTBs(Lcom/ichi2/anki/CollectionManager;)Lcom/ichi2/anki/libanki/Collection; +SPLcom/ichi2/anki/CollectionManager;->$r8$lambda$W1MuSlVHYw8laATlr7Q27r6qm7c(Lcom/ichi2/anki/CollectionManager;)Z +SPLcom/ichi2/anki/CollectionManager;->()V +SPLcom/ichi2/anki/CollectionManager;->()V +SPLcom/ichi2/anki/CollectionManager;->access$ensureBackendInner(Lcom/ichi2/anki/CollectionManager;)V +SPLcom/ichi2/anki/CollectionManager;->access$withQueue(Lcom/ichi2/anki/CollectionManager;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/CollectionManager;->backend()Lnet/ankiweb/rsdroid/Backend; +SPLcom/ichi2/anki/CollectionManager;->blockForQueue(Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; +SPLcom/ichi2/anki/CollectionManager;->collectionPathInValidFolder()Lcom/ichi2/anki/libanki/CollectionFiles; +SPLcom/ichi2/anki/CollectionManager;->ensureBackendInner()V +SPLcom/ichi2/anki/CollectionManager;->ensureOpenInner$lambda$1(Lnet/ankiweb/rsdroid/Backend;)Lcom/ichi2/anki/libanki/DB; +SPLcom/ichi2/anki/CollectionManager;->ensureOpenInner()V +SPLcom/ichi2/anki/CollectionManager;->getBackend()Lnet/ankiweb/rsdroid/Backend; +SPLcom/ichi2/anki/CollectionManager;->getColUnsafe$lambda$0$0(Lcom/ichi2/anki/CollectionManager;)Lcom/ichi2/anki/libanki/Collection; +SPLcom/ichi2/anki/CollectionManager;->getColUnsafe$lambda$0()Lcom/ichi2/anki/libanki/Collection; +SPLcom/ichi2/anki/CollectionManager;->getColUnsafe()Lcom/ichi2/anki/libanki/Collection; +SPLcom/ichi2/anki/CollectionManager;->getCollection()Lcom/ichi2/anki/libanki/Collection; +SPLcom/ichi2/anki/CollectionManager;->getCollectionDirectory()Ljava/io/File; +SPLcom/ichi2/anki/CollectionManager;->getTR()Lnet/ankiweb/rsdroid/Translations; +SPLcom/ichi2/anki/CollectionManager;->isOpenUnsafe$lambda$0$0(Lcom/ichi2/anki/CollectionManager;)Z +SPLcom/ichi2/anki/CollectionManager;->isOpenUnsafe$lambda$0()Z +SPLcom/ichi2/anki/CollectionManager;->isOpenUnsafe()Z +SPLcom/ichi2/anki/CollectionManager;->logUIHangs(Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; +SPLcom/ichi2/anki/CollectionManager;->setBackend(Lnet/ankiweb/rsdroid/Backend;)V +SPLcom/ichi2/anki/CollectionManager;->setCollection(Lcom/ichi2/anki/libanki/Collection;)V +SPLcom/ichi2/anki/CollectionManager;->updateCustomCertificate(Ljava/lang/String;)Z +SPLcom/ichi2/anki/CollectionManager;->withColInternal$lambda$0(Lkotlin/jvm/functions/Function1;Lcom/ichi2/anki/CollectionManager;)Ljava/lang/Object; +SPLcom/ichi2/anki/CollectionManager;->withColInternal(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/CollectionManager;->withOpenColOrNull$lambda$0(Lkotlin/jvm/functions/Function1;Lcom/ichi2/anki/CollectionManager;)Ljava/lang/Object; +SPLcom/ichi2/anki/CollectionManager;->withOpenColOrNull(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/CollectionManager;->withQueue(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda1;->()V +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda11; +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda11;->()V +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda11;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda2;->(Lkotlin/jvm/functions/Function1;)V +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda6; +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda6;->()V +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda6;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda7; +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda7;->()V +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda7;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda8; +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda8;->(Lkotlin/jvm/functions/Function1;)V +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda8;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda9; +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda9;->()V +SPLcom/ichi2/anki/CollectionManager$$ExternalSyntheticLambda9;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$blockForQueue$2; +SPLcom/ichi2/anki/CollectionManager$blockForQueue$2;->(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/CollectionManager$blockForQueue$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/CollectionManager$blockForQueue$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$getBackend$1; +SPLcom/ichi2/anki/CollectionManager$getBackend$1;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/CollectionManager$getBackend$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/CollectionManager$getBackend$1;->invokeSuspend$lambda$0(Lcom/ichi2/anki/CollectionManager;)Lkotlin/Unit; +SPLcom/ichi2/anki/CollectionManager$getBackend$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$getBackend$1$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/CollectionManager$getBackend$1$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/CollectionManager$getBackend$1$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CollectionManager$withQueue$3; +SPLcom/ichi2/anki/CollectionManager$withQueue$3;->(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/CollectionManager$withQueue$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/CollectionManager$withQueue$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CoroutineHelpersKt; +SPLcom/ichi2/anki/CoroutineHelpersKt;->()V +SPLcom/ichi2/anki/CoroutineHelpersKt;->access$dismissDialogIfShowing(Landroid/app/Dialog;)V +SPLcom/ichi2/anki/CoroutineHelpersKt;->dismissDialogIfShowing(Landroid/app/Dialog;)V +SPLcom/ichi2/anki/CoroutineHelpersKt;->launchCatchingIO(Landroidx/lifecycle/ViewModel;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; +SPLcom/ichi2/anki/CoroutineHelpersKt;->launchCatchingTask$default(Landroidx/fragment/app/FragmentActivity;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; +SPLcom/ichi2/anki/CoroutineHelpersKt;->launchCatchingTask(Landroidx/fragment/app/FragmentActivity;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; +SPLcom/ichi2/anki/CoroutineHelpersKt;->runCatching(Landroidx/fragment/app/FragmentActivity;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt;->withProgress$default(Landroid/app/Activity;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt;->withProgress(Landroid/app/Activity;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt;->withProgressDialog-WPi__2c$default(Landroid/app/Activity;Lkotlin/jvm/functions/Function0;JLjava/lang/Integer;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt;->withProgressDialog-WPi__2c(Landroid/app/Activity;Lkotlin/jvm/functions/Function0;JLjava/lang/Integer;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/CoroutineHelpersKt$launchCatchingIO$1; +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingIO$1;->(Landroidx/lifecycle/ViewModel;Lkotlin/coroutines/Continuation;)V +Lcom/ichi2/anki/CoroutineHelpersKt$launchCatchingIO$2; +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingIO$2;->(Lkotlin/jvm/functions/Function2;Landroidx/lifecycle/ViewModel;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingIO$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingIO$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingIO$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingIO$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CoroutineHelpersKt$launchCatchingTask$1; +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingTask$1;->(Landroidx/fragment/app/FragmentActivity;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingTask$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingTask$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CoroutineHelpersKt$launchCatchingTask$1$1; +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingTask$1$1;->(Lkotlin/jvm/functions/Function2;Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingTask$1$1;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingTask$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingTask$1$1;->invoke(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt$launchCatchingTask$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CoroutineHelpersKt$runCatching$1; +SPLcom/ichi2/anki/CoroutineHelpersKt$runCatching$1;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/CoroutineHelpersKt$runCatching$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CoroutineHelpersKt$withProgress$8; +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgress$8;->(Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgress$8;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgress$8;->invoke(Landroid/app/ProgressDialog;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgress$8;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgress$8;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2; +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2;->(Landroid/app/Activity;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Ljava/lang/Integer;JLkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2;->invokeSuspend$lambda$1(Landroid/app/Activity;)V +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2;->invokeSuspend$lambda$2(Landroid/app/Activity;)V +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$$ExternalSyntheticLambda2;->(Landroid/app/Activity;)V +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$$ExternalSyntheticLambda2;->run()V +Lcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$$ExternalSyntheticLambda3;->(Landroid/app/Activity;)V +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$$ExternalSyntheticLambda3;->run()V +Lcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$dialogJob$1; +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$dialogJob$1;->(JLkotlin/jvm/functions/Function0;Ljava/lang/Integer;Landroid/app/ProgressDialog;Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$dialogJob$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/CoroutineHelpersKt$withProgressDialog$2$dialogJob$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DayRolloverHandler; +SPLcom/ichi2/anki/DayRolloverHandler;->$r8$lambda$UUd88d_6FpFa_FHFUjhALzYt_Sw(Lcom/ichi2/anki/libanki/Collection;)J +SPLcom/ichi2/anki/DayRolloverHandler;->()V +SPLcom/ichi2/anki/DayRolloverHandler;->()V +SPLcom/ichi2/anki/DayRolloverHandler;->handleTimeChange$AnkiDroid(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DayRolloverHandler;->handleTimeChange$lambda$0$0(Lcom/ichi2/anki/libanki/Collection;)J +SPLcom/ichi2/anki/DayRolloverHandler;->listenForRolloverEvents$register(Landroid/content/Context;Landroid/content/IntentFilter;)Landroid/content/Intent; +SPLcom/ichi2/anki/DayRolloverHandler;->listenForRolloverEvents(Landroid/content/Context;)V +SPLcom/ichi2/anki/DayRolloverHandler;->onReceiveBroadcast(Landroid/content/Context;Landroid/content/Intent;)V +Lcom/ichi2/anki/DayRolloverHandler$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/DayRolloverHandler$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/DayRolloverHandler$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DayRolloverHandler$handleTimeChange$1; +SPLcom/ichi2/anki/DayRolloverHandler$handleTimeChange$1;->(Lcom/ichi2/anki/DayRolloverHandler;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DayRolloverHandler$handleTimeChange$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$1; +SPLcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$1;->(Lkotlin/coroutines/Continuation;)V +Lcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$2; +SPLcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$2;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DayRolloverHandler$onReceiveBroadcast$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker; +SPLcom/ichi2/anki/DeckPicker;->()V +SPLcom/ichi2/anki/DeckPicker;->()V +SPLcom/ichi2/anki/DeckPicker;->access$applyDeckPickerBackground(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker;->access$getDecksLayoutManager$p(Lcom/ichi2/anki/DeckPicker;)Landroidx/recyclerview/widget/LinearLayoutManager; +SPLcom/ichi2/anki/DeckPicker;->access$getPullToSyncWrapper$p(Lcom/ichi2/anki/DeckPicker;)Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout; +SPLcom/ichi2/anki/DeckPicker;->access$restoreSearchState(Lcom/ichi2/anki/DeckPicker;Landroid/view/Menu;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onCardsDueChanged(Lcom/ichi2/anki/DeckPicker;Ljava/lang/Integer;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onCollectionStatusChanged(Lcom/ichi2/anki/DeckPicker;Z)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onDeckListChanged(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onDecksReloaded(Lcom/ichi2/anki/DeckPicker;Lkotlin/Unit;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onFocusedDeckChanged(Lcom/ichi2/anki/DeckPicker;Ljava/lang/Long;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onOptionsMenuUpdated(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/OptionsMenuState;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onResizingDividerVisibilityChanged(Lcom/ichi2/anki/DeckPicker;Z)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onStartupResponse(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onStudiedTodayChanged(Lcom/ichi2/anki/DeckPicker;Ljava/lang/String;)V +SPLcom/ichi2/anki/DeckPicker;->access$setupFlows$onStudyOptionsVisibilityChanged(Lcom/ichi2/anki/DeckPicker;Z)V +SPLcom/ichi2/anki/DeckPicker;->access$updateDeckRelatedMenuItems(Lcom/ichi2/anki/DeckPicker;Landroid/view/Menu;)V +SPLcom/ichi2/anki/DeckPicker;->access$updateSearchVisibilityFromState(Lcom/ichi2/anki/DeckPicker;Landroid/view/Menu;)V +SPLcom/ichi2/anki/DeckPicker;->applyDeckPickerBackground(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker;->automaticSync$default(Lcom/ichi2/anki/DeckPicker;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker;->automaticSync(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker;->fitsSystemWindows()Z +SPLcom/ichi2/anki/DeckPicker;->getAnalyticsScreenName()Ljava/lang/String; +SPLcom/ichi2/anki/DeckPicker;->getBinding$AnkiDroid()Lcom/ichi2/anki/databinding/ActivityHomescreenBinding; +SPLcom/ichi2/anki/DeckPicker;->getBottomNavigationEnabled$AnkiDroid()Z +SPLcom/ichi2/anki/DeckPicker;->getBroadcastsActions()Ljava/util/Map; +SPLcom/ichi2/anki/DeckPicker;->getDeckPickerBinding$AnkiDroid()Lcom/ichi2/anki/databinding/IncludeDeckPickerBinding; +SPLcom/ichi2/anki/DeckPicker;->getFloatingActionButtonBinding()Lcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding; +SPLcom/ichi2/anki/DeckPicker;->getFragment()Lcom/ichi2/anki/StudyOptionsFragment; +SPLcom/ichi2/anki/DeckPicker;->getFragmented()Z +SPLcom/ichi2/anki/DeckPicker;->getImportViewModel()Lcom/ichi2/anki/dialogs/ImportViewModel; +SPLcom/ichi2/anki/DeckPicker;->getViewModel()Lcom/ichi2/anki/deckpicker/DeckPickerViewModel; +SPLcom/ichi2/anki/DeckPicker;->handleStartup()V +SPLcom/ichi2/anki/DeckPicker;->onAttachedToWindow()V +SPLcom/ichi2/anki/DeckPicker;->onCreate$lambda$0(Landroid/content/res/Resources;)Z +SPLcom/ichi2/anki/DeckPicker;->onCreate(Landroid/os/Bundle;)V +SPLcom/ichi2/anki/DeckPicker;->onCreateOptionsMenu(Landroid/view/Menu;)Z +SPLcom/ichi2/anki/DeckPicker;->onFinishedStartup()V +SPLcom/ichi2/anki/DeckPicker;->onResume()V +SPLcom/ichi2/anki/DeckPicker;->raiseFabAboveSummary(I)V +SPLcom/ichi2/anki/DeckPicker;->recreateActivityResultLauncher(Lcom/ichi2/anki/AnkiActivity;)Landroidx/activity/result/ActivityResultLauncher; +SPLcom/ichi2/anki/DeckPicker;->refreshState()V +SPLcom/ichi2/anki/DeckPicker;->restoreSearchState(Landroid/view/Menu;)V +SPLcom/ichi2/anki/DeckPicker;->setFloatingActionMenu(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +SPLcom/ichi2/anki/DeckPicker;->setupBackPressedCallbacks()V +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge$lambda$0(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge$lambda$1(Lcom/ichi2/anki/DeckPicker;Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge$lambda$2(Lcom/ichi2/anki/DeckPicker;)Lkotlin/Unit; +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge$lambda$3(Lcom/ichi2/anki/DeckPicker;Landroid/view/View;IIIIIIII)V +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge$listAnchor(Lcom/ichi2/anki/DeckPicker;)Landroid/view/View; +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge$setRecyclerViewBottomPaddingAbove(Lcom/ichi2/anki/DeckPicker;Landroid/view/View;)V +SPLcom/ichi2/anki/DeckPicker;->setupEdgeToEdge()V +SPLcom/ichi2/anki/DeckPicker;->setupFlows$onCardsDueChanged(Lcom/ichi2/anki/DeckPicker;Ljava/lang/Integer;)V +SPLcom/ichi2/anki/DeckPicker;->setupFlows$onCollectionStatusChanged(Lcom/ichi2/anki/DeckPicker;Z)V +SPLcom/ichi2/anki/DeckPicker;->setupFlows$onDeckListChanged(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;)V +SPLcom/ichi2/anki/DeckPicker;->setupFlows$onDecksReloaded(Lcom/ichi2/anki/DeckPicker;Lkotlin/Unit;)V +SPLcom/ichi2/anki/DeckPicker;->setupFlows$onFocusedDeckChanged$lambda$4(Lcom/ichi2/anki/DeckPicker;I)V +SPLcom/ichi2/anki/DeckPicker;->setupFlows$onFocusedDeckChanged(Lcom/ichi2/anki/DeckPicker;Ljava/lang/Long;)V +SPLcom/ichi2/anki/DeckPicker;->setupFlows$onOptionsMenuUpdated(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/OptionsMenuState;)V +SPLcom/ichi2/anki/DeckPicker;->setupFlows$onResizingDividerVisibilityChanged(Lcom/ichi2/anki/DeckPicker;Z)V +SPLcom/ichi2/anki/DeckPicker;->setupFlows$onStartupResponse(Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;)V +SPLcom/ichi2/anki/DeckPicker;->setupFlows$onStudiedTodayChanged(Lcom/ichi2/anki/DeckPicker;Ljava/lang/String;)V +SPLcom/ichi2/anki/DeckPicker;->setupFlows$onStudyOptionsVisibilityChanged(Lcom/ichi2/anki/DeckPicker;Z)V +SPLcom/ichi2/anki/DeckPicker;->setupFlows()V +SPLcom/ichi2/anki/DeckPicker;->setupMediaSyncMenuItem(Landroid/view/Menu;)V +SPLcom/ichi2/anki/DeckPicker;->setupPullToSync()V +SPLcom/ichi2/anki/DeckPicker;->setupSearchIcon(Landroid/view/MenuItem;)V +SPLcom/ichi2/anki/DeckPicker;->showStartupScreensAndDialogs(Landroid/content/SharedPreferences;I)V +SPLcom/ichi2/anki/DeckPicker;->tryShowStudyOptionsPanel()Z +SPLcom/ichi2/anki/DeckPicker;->updateDeckList()V +SPLcom/ichi2/anki/DeckPicker;->updateDeckRelatedMenuItems(Landroid/view/Menu;)V +SPLcom/ichi2/anki/DeckPicker;->updateMenuFromState(Landroid/view/Menu;)V +SPLcom/ichi2/anki/DeckPicker;->updateSearchVisibilityFromState(Landroid/view/Menu;)V +SPLcom/ichi2/anki/DeckPicker;->updateSyncIconFromState(Landroid/view/MenuItem;Lcom/ichi2/anki/deckpicker/OptionsMenuState;)V +SPLcom/ichi2/anki/DeckPicker;->updateUndoLabelFromState(Landroid/view/MenuItem;Ljava/lang/String;Z)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/content/pm/PackageManager;Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Landroid/content/pm/ResolveInfo; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/Bitmap$CompressFormat; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/BlendMode; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(J)Landroid/content/pm/PackageManager$PackageInfoFlags; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(J)Landroid/content/pm/PackageManager$ResolveInfoFlags; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;)I +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ActivityManager;Ljava/lang/String;II)Ljava/util/List; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ApplicationExitInfo;)I +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageManager;Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Landroid/content/pm/ResolveInfo; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageManager;Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Ljava/util/List; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageManager;Ljava/lang/String;Landroid/content/pm/PackageManager$PackageInfoFlags;)Landroid/content/pm/PackageInfo; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Paint;Landroid/graphics/BlendMode;)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;Z)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/app/ApplicationExitInfo; +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda10; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda10;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda12; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda12;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda13; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda13;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda19; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda19;->()V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda19;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda2;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda20; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda20;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda20;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda21; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda21;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda21;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda23; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda23;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda23;->onLayoutChange(Landroid/view/View;IIIIIIII)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda26; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda26;->(Lcom/ichi2/anki/DeckPicker;I)V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda26;->run()V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda28; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda28;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda29; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda29;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda3;->()V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda30; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda30;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda31; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda31;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda32; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda32;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda34; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda34;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda35; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda35;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda36; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda36;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda37; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda37;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda39; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda39;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda4;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda42; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda42;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda5; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda5;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda50; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda50;->()V +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda50;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda51; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda51;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda52; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda52;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda6; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda6;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda7; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda7;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda8; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda8;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda9; +SPLcom/ichi2/anki/DeckPicker$$ExternalSyntheticLambda9;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$Companion; +SPLcom/ichi2/anki/DeckPicker$Companion;->()V +SPLcom/ichi2/anki/DeckPicker$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/DeckPicker$DeckPickerActivityResultCallback; +SPLcom/ichi2/anki/DeckPicker$DeckPickerActivityResultCallback;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/anki/DeckPicker$DeckSelectionType; +SPLcom/ichi2/anki/DeckPicker$DeckSelectionType;->$values()[Lcom/ichi2/anki/DeckPicker$DeckSelectionType; +SPLcom/ichi2/anki/DeckPicker$DeckSelectionType;->()V +SPLcom/ichi2/anki/DeckPicker$DeckSelectionType;->(Ljava/lang/String;I)V +SPLcom/ichi2/anki/DeckPicker$DeckSelectionType;->values()[Lcom/ichi2/anki/DeckPicker$DeckSelectionType; +Lcom/ichi2/anki/DeckPicker$WhenMappings; +SPLcom/ichi2/anki/DeckPicker$WhenMappings;->()V +Lcom/ichi2/anki/DeckPicker$activeSnackbarCallback$1; +SPLcom/ichi2/anki/DeckPicker$activeSnackbarCallback$1;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$applyDeckPickerBackground$1; +SPLcom/ichi2/anki/DeckPicker$applyDeckPickerBackground$1;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V +Lcom/ichi2/anki/DeckPicker$automaticSync$1; +SPLcom/ichi2/anki/DeckPicker$automaticSync$1;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V +Lcom/ichi2/anki/DeckPicker$closeFloatingActionBarBackPressCallback$1; +SPLcom/ichi2/anki/DeckPicker$closeFloatingActionBarBackPressCallback$1;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$exitAndSyncBackCallback$1; +SPLcom/ichi2/anki/DeckPicker$exitAndSyncBackCallback$1;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$handleStartup$environment$1; +SPLcom/ichi2/anki/DeckPicker$handleStartup$environment$1;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/DeckPicker$handleStartup$environment$1;->decideStorageIfUndecided()V +SPLcom/ichi2/anki/DeckPicker$handleStartup$environment$1;->getPreferences()Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/DeckPicker$handleStartup$environment$1;->hasRequiredPermissions()Z +Lcom/ichi2/anki/DeckPicker$onCreate$8; +SPLcom/ichi2/anki/DeckPicker$onCreate$8;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DeckPicker$onCreate$8;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/DeckPicker$onCreate$8;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$onCreate$8$1; +SPLcom/ichi2/anki/DeckPicker$onCreate$8$1;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DeckPicker$onCreate$8$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/DeckPicker$onCreate$8$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$onCreate$8$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$onCreate$8$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$onCreateOptionsMenu$2; +SPLcom/ichi2/anki/DeckPicker$onCreateOptionsMenu$2;->(Lcom/ichi2/anki/DeckPicker;Landroid/view/Menu;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DeckPicker$onCreateOptionsMenu$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/DeckPicker$onCreateOptionsMenu$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$onCreateOptionsMenu$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$onCreateOptionsMenu$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$onFinishedStartup$1; +SPLcom/ichi2/anki/DeckPicker$onFinishedStartup$1;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DeckPicker$onFinishedStartup$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/DeckPicker$onFinishedStartup$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$onFinishedStartup$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$onFinishedStartup$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$1; +SPLcom/ichi2/anki/DeckPicker$setupFlows$1;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$10; +SPLcom/ichi2/anki/DeckPicker$setupFlows$10;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$11; +SPLcom/ichi2/anki/DeckPicker$setupFlows$11;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$12; +SPLcom/ichi2/anki/DeckPicker$setupFlows$12;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$13; +SPLcom/ichi2/anki/DeckPicker$setupFlows$13;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$14; +SPLcom/ichi2/anki/DeckPicker$setupFlows$14;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$14;->invoke(Lcom/ichi2/anki/deckpicker/OptionsMenuState;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$14;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$15; +SPLcom/ichi2/anki/DeckPicker$setupFlows$15;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$15;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$15;->invoke(Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$16; +SPLcom/ichi2/anki/DeckPicker$setupFlows$16;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$16;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$16;->invoke(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$17; +SPLcom/ichi2/anki/DeckPicker$setupFlows$17;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$17;->invoke(Ljava/lang/Integer;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$17;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$18; +SPLcom/ichi2/anki/DeckPicker$setupFlows$18;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$18;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$18;->invoke(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$19; +SPLcom/ichi2/anki/DeckPicker$setupFlows$19;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$19;->invoke(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$19;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$2; +SPLcom/ichi2/anki/DeckPicker$setupFlows$2;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$20; +SPLcom/ichi2/anki/DeckPicker$setupFlows$20;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$20;->invoke(Ljava/lang/Long;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$20;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$21; +SPLcom/ichi2/anki/DeckPicker$setupFlows$21;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$21;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$21;->invoke(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$22; +SPLcom/ichi2/anki/DeckPicker$setupFlows$22;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$22;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$22;->invoke(Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$23; +SPLcom/ichi2/anki/DeckPicker$setupFlows$23;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupFlows$23;->invoke(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupFlows$23;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupFlows$24; +SPLcom/ichi2/anki/DeckPicker$setupFlows$24;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$25; +SPLcom/ichi2/anki/DeckPicker$setupFlows$25;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$26; +SPLcom/ichi2/anki/DeckPicker$setupFlows$26;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$27; +SPLcom/ichi2/anki/DeckPicker$setupFlows$27;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$3; +SPLcom/ichi2/anki/DeckPicker$setupFlows$3;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$4; +SPLcom/ichi2/anki/DeckPicker$setupFlows$4;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$5; +SPLcom/ichi2/anki/DeckPicker$setupFlows$5;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$6; +SPLcom/ichi2/anki/DeckPicker$setupFlows$6;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$7; +SPLcom/ichi2/anki/DeckPicker$setupFlows$7;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$8; +SPLcom/ichi2/anki/DeckPicker$setupFlows$8;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V +Lcom/ichi2/anki/DeckPicker$setupFlows$9; +SPLcom/ichi2/anki/DeckPicker$setupFlows$9;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1; +SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1;->(Lkotlinx/coroutines/flow/Flow;Lcom/ichi2/anki/DeckPicker;Lcom/google/android/material/progressindicator/LinearProgressIndicator;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1$1; +SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1$1;->(Lcom/google/android/material/progressindicator/LinearProgressIndicator;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1$1;->invoke(Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$setupMediaSyncMenuItem$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$setupPullToSync$$inlined$doOnScrolled$1; +SPLcom/ichi2/anki/DeckPicker$setupPullToSync$$inlined$doOnScrolled$1;->(Lcom/ichi2/anki/DeckPicker;)V +SPLcom/ichi2/anki/DeckPicker$setupPullToSync$$inlined$doOnScrolled$1;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V +Lcom/ichi2/anki/DeckPicker$setupSearchIcon$1; +SPLcom/ichi2/anki/DeckPicker$setupSearchIcon$1;->(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/DeckPicker$setupSearchIcon$2$1; +SPLcom/ichi2/anki/DeckPicker$setupSearchIcon$2$1;->(Lcom/ichi2/ui/AccessibleSearchView;Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/ui/AccessibleSearchView;Landroid/view/MenuItem;)V +Lcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$1; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$1;->(Landroidx/activity/ComponentActivity;)V +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$1;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$1;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$2; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$2;->(Landroidx/activity/ComponentActivity;)V +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$2;->invoke()Landroidx/lifecycle/ViewModelStore; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$2;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$3; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$3;->(Lkotlin/jvm/functions/Function0;Landroidx/activity/ComponentActivity;)V +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$3;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$3;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$4; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$4;->(Landroidx/activity/ComponentActivity;)V +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$4;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$4;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$5; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$5;->(Landroidx/activity/ComponentActivity;)V +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$5;->invoke()Landroidx/lifecycle/ViewModelStore; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$5;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$6; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$6;->(Lkotlin/jvm/functions/Function0;Landroidx/activity/ComponentActivity;)V +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$6;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +SPLcom/ichi2/anki/DeckPicker$special$$inlined$viewModels$default$6;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$updateDeckList$1; +SPLcom/ichi2/anki/DeckPicker$updateDeckList$1;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DeckPicker$updateDeckList$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/DeckPicker$updateDeckList$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$updateDeckList$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$updateDeckList$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPicker$updateDeckList$1$1; +SPLcom/ichi2/anki/DeckPicker$updateDeckList$1$1;->(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/DeckPicker$updateDeckList$1$1;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/DeckPicker$updateDeckList$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$updateDeckList$1$1;->invoke(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/DeckPicker$updateDeckList$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/DeckPickerFloatingActionMenu; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->()V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->(Landroid/content/Context;Lcom/ichi2/anki/databinding/ActivityHomescreenBinding;Lcom/ichi2/anki/DeckPicker;Lcom/ichi2/anki/DeckPickerFloatingActionMenu$FloatingActionBarToggleListener;Z)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->access$resetMenuAfterAdding(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->createActivationKeyListener(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Landroid/view/View$OnKeyListener; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->resetMenuAfterAdding()V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu;->setCreateDeckButtonLabel()V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda1;->(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda10; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda10;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda2;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda3;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda4;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda5; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda5;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda6; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda6;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda7; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda7;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda8; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda8;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda9; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$$ExternalSyntheticLambda9;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$1; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$1;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$1;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$1;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$2; +SPLcom/ichi2/anki/DeckPickerFloatingActionMenu$2;->(Lcom/ichi2/anki/DeckPickerFloatingActionMenu;Landroid/content/Context;)V +Lcom/ichi2/anki/DeckPickerFloatingActionMenu$FloatingActionBarToggleListener; +Lcom/ichi2/anki/DeckPickerKt; +SPLcom/ichi2/anki/DeckPickerKt;->getStudyoptionsFrame(Lcom/ichi2/anki/databinding/ActivityHomescreenBinding;)Landroidx/fragment/app/FragmentContainerView; +Lcom/ichi2/anki/DispatchKeyEventListener; +Lcom/ichi2/anki/Flag; +SPLcom/ichi2/anki/Flag;->$values()[Lcom/ichi2/anki/Flag; +SPLcom/ichi2/anki/Flag;->()V +SPLcom/ichi2/anki/Flag;->(Ljava/lang/String;IIIILjava/lang/Integer;)V +SPLcom/ichi2/anki/Flag;->getEntries()Lkotlin/enums/EnumEntries; +SPLcom/ichi2/anki/Flag;->getId()I +Lcom/ichi2/anki/Flag$Companion; +SPLcom/ichi2/anki/Flag$Companion;->()V +SPLcom/ichi2/anki/Flag$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/FlashCardsContract; +SPLcom/ichi2/anki/FlashCardsContract;->()V +SPLcom/ichi2/anki/FlashCardsContract;->()V +SPLcom/ichi2/anki/FlashCardsContract;->getAuthority$default(Lcom/ichi2/anki/FlashCardsContract;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; +SPLcom/ichi2/anki/FlashCardsContract;->getAuthority(Ljava/lang/String;)Ljava/lang/String; +SPLcom/ichi2/anki/FlashCardsContract;->getAuthorityUri$default(Lcom/ichi2/anki/FlashCardsContract;Ljava/lang/String;ILjava/lang/Object;)Landroid/net/Uri; +SPLcom/ichi2/anki/FlashCardsContract;->getAuthorityUri(Ljava/lang/String;)Landroid/net/Uri; +SPLcom/ichi2/anki/FlashCardsContract;->getPermission(Ljava/lang/String;)Ljava/lang/String; +Lcom/ichi2/anki/FlashCardsContract$Note; +SPLcom/ichi2/anki/FlashCardsContract$Note;->()V +SPLcom/ichi2/anki/FlashCardsContract$Note;->()V +SPLcom/ichi2/anki/FlashCardsContract$Note;->getDefaultColumns()[Ljava/lang/String; +Lcom/ichi2/anki/HomeScreenNavigationKt; +SPLcom/ichi2/anki/HomeScreenNavigationKt;->selectedBottomNavItem(Lcom/ichi2/anki/DeckPicker;)Lcom/ichi2/anki/BottomNavController$NavigationItem; +SPLcom/ichi2/anki/HomeScreenNavigationKt;->setupBottomNavigation(Lcom/ichi2/anki/DeckPicker;)V +Lcom/ichi2/anki/ImportColpkgListener; +Lcom/ichi2/anki/InitialActivity; +SPLcom/ichi2/anki/InitialActivity;->()V +SPLcom/ichi2/anki/InitialActivity;->()V +SPLcom/ichi2/anki/InitialActivity;->decideStorageIfUndecided(Landroid/content/Context;)V +SPLcom/ichi2/anki/InitialActivity;->getStartupFailureType(Landroid/content/SharedPreferences;Lkotlin/jvm/functions/Function0;)Lcom/ichi2/anki/InitialActivity$StartupFailure; +SPLcom/ichi2/anki/InitialActivity;->isLatestVersion(Landroid/content/SharedPreferences;)Z +SPLcom/ichi2/anki/InitialActivity;->performSetupFromFreshInstallOrClearedPreferences(Landroid/content/SharedPreferences;)Z +SPLcom/ichi2/anki/InitialActivity;->wasFreshInstall(Landroid/content/SharedPreferences;)Z +Lcom/ichi2/anki/InitialActivity$StartupFailure; +Lcom/ichi2/anki/InitialActivityKt; +SPLcom/ichi2/anki/InitialActivityKt;->configureRenderingMode()V +SPLcom/ichi2/anki/InitialActivityKt;->selectStoragePermissions(Landroid/content/Context;)Lcom/ichi2/anki/StoragePermissionSet; +Lcom/ichi2/anki/IntentHandler; +SPLcom/ichi2/anki/IntentHandler;->()V +SPLcom/ichi2/anki/IntentHandler;->()V +SPLcom/ichi2/anki/IntentHandler;->launchDeckPickerIfNoOtherTasks(Landroid/content/Intent;)V +SPLcom/ichi2/anki/IntentHandler;->onCreate(Landroid/os/Bundle;)V +SPLcom/ichi2/anki/IntentHandler;->onDestroy()V +Lcom/ichi2/anki/IntentHandler$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/IntentHandler$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/IntentHandler;Landroid/content/Intent;Ljava/lang/String;)V +Lcom/ichi2/anki/IntentHandler$Companion; +SPLcom/ichi2/anki/IntentHandler$Companion;->()V +SPLcom/ichi2/anki/IntentHandler$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/IntentHandler$Companion;->getLaunchType(Landroid/content/Intent;)Lcom/ichi2/anki/IntentHandler$LaunchType; +SPLcom/ichi2/anki/IntentHandler$Companion;->isBrowserDeepLink(Landroid/content/Intent;)Z +SPLcom/ichi2/anki/IntentHandler$Companion;->requiresCollectionAccess(Lcom/ichi2/anki/IntentHandler$LaunchType;)Z +Lcom/ichi2/anki/IntentHandler$Companion$WhenMappings; +SPLcom/ichi2/anki/IntentHandler$Companion$WhenMappings;->()V +Lcom/ichi2/anki/IntentHandler$LaunchType; +SPLcom/ichi2/anki/IntentHandler$LaunchType;->$values()[Lcom/ichi2/anki/IntentHandler$LaunchType; +SPLcom/ichi2/anki/IntentHandler$LaunchType;->()V +SPLcom/ichi2/anki/IntentHandler$LaunchType;->(Ljava/lang/String;I)V +SPLcom/ichi2/anki/IntentHandler$LaunchType;->values()[Lcom/ichi2/anki/IntentHandler$LaunchType; +Lcom/ichi2/anki/IntentHandler$WhenMappings; +SPLcom/ichi2/anki/IntentHandler$WhenMappings;->()V +Lcom/ichi2/anki/IntentHandler2; +Lcom/ichi2/anki/IntroductionActivityKt; +SPLcom/ichi2/anki/IntroductionActivityKt;->hasShownAppIntro(Landroid/content/Context;)Z +Lcom/ichi2/anki/LaunchCatchingKt; +SPLcom/ichi2/anki/LaunchCatchingKt;->launchCatching(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; +Lcom/ichi2/anki/LaunchCatchingKt$launchCatching$1; +SPLcom/ichi2/anki/LaunchCatchingKt$launchCatching$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/LaunchCatchingKt$launchCatching$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/LaunchCatchingKt$launchCatching$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/LeakCanaryConfiguration; +SPLcom/ichi2/anki/LeakCanaryConfiguration;->()V +SPLcom/ichi2/anki/LeakCanaryConfiguration;->()V +SPLcom/ichi2/anki/LeakCanaryConfiguration;->disable()V +Lcom/ichi2/anki/MetaDbWidgetRepository; +SPLcom/ichi2/anki/MetaDbWidgetRepository;->()V +SPLcom/ichi2/anki/MetaDbWidgetRepository;->(Landroid/content/Context;)V +Lcom/ichi2/anki/MetaDbWidgetRepositoryKt; +SPLcom/ichi2/anki/MetaDbWidgetRepositoryKt;->initializeWidgetRepository(Landroid/app/Application;)V +Lcom/ichi2/anki/NavigationDrawerActivity; +SPLcom/ichi2/anki/NavigationDrawerActivity;->()V +SPLcom/ichi2/anki/NavigationDrawerActivity;->(Ljava/lang/Integer;)V +SPLcom/ichi2/anki/NavigationDrawerActivity;->(Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/NavigationDrawerActivity;->getDrawerLayout()Landroidx/drawerlayout/widget/DrawerLayout; +SPLcom/ichi2/anki/NavigationDrawerActivity;->getDrawerToggle()Landroidx/appcompat/app/ActionBarDrawerToggle; +SPLcom/ichi2/anki/NavigationDrawerActivity;->getNavigationDrawerLayout()I +SPLcom/ichi2/anki/NavigationDrawerActivity;->initNavigationDrawer$default(Lcom/ichi2/anki/NavigationDrawerActivity;Landroid/view/View;ILjava/lang/Object;)V +SPLcom/ichi2/anki/NavigationDrawerActivity;->initNavigationDrawer(Landroid/view/View;)V +SPLcom/ichi2/anki/NavigationDrawerActivity;->isDrawerOpen()Z +SPLcom/ichi2/anki/NavigationDrawerActivity;->navDrawerIsReady()Z +SPLcom/ichi2/anki/NavigationDrawerActivity;->onPostCreate(Landroid/os/Bundle;)V +SPLcom/ichi2/anki/NavigationDrawerActivity;->selectNavigationItem(I)V +SPLcom/ichi2/anki/NavigationDrawerActivity;->setDrawerLayout(Landroidx/drawerlayout/widget/DrawerLayout;)V +SPLcom/ichi2/anki/NavigationDrawerActivity;->setTitle(Ljava/lang/CharSequence;)V +SPLcom/ichi2/anki/NavigationDrawerActivity;->setViewBinding(Landroidx/viewbinding/ViewBinding;)V +SPLcom/ichi2/anki/NavigationDrawerActivity;->setupBackPressedCallbacks()V +SPLcom/ichi2/anki/NavigationDrawerActivity;->setupDrawerInsets$lambda$0(Lkotlin/jvm/internal/Ref$IntRef;Lcom/google/android/material/navigation/NavigationView;IIILandroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +SPLcom/ichi2/anki/NavigationDrawerActivity;->setupDrawerInsets(Lcom/google/android/material/navigation/NavigationView;)V +Lcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/NavigationDrawerActivity;)V +Lcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/NavigationDrawerActivity;)V +Lcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda2;->(Lkotlin/jvm/internal/Ref$IntRef;Lcom/google/android/material/navigation/NavigationView;III)V +SPLcom/ichi2/anki/NavigationDrawerActivity$$ExternalSyntheticLambda2;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +Lcom/ichi2/anki/NavigationDrawerActivity$Companion; +SPLcom/ichi2/anki/NavigationDrawerActivity$Companion;->()V +SPLcom/ichi2/anki/NavigationDrawerActivity$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/NavigationDrawerActivity$Companion;->enablePostShortcut(Landroid/content/Context;)V +Lcom/ichi2/anki/NavigationDrawerActivity$drawerBackCallback$1; +SPLcom/ichi2/anki/NavigationDrawerActivity$drawerBackCallback$1;->(Lcom/ichi2/anki/NavigationDrawerActivity;)V +Lcom/ichi2/anki/NavigationDrawerActivity$initNavigationDrawer$3; +SPLcom/ichi2/anki/NavigationDrawerActivity$initNavigationDrawer$3;->(Lcom/ichi2/anki/NavigationDrawerActivity;Landroidx/drawerlayout/widget/DrawerLayout;II)V +Lcom/ichi2/anki/NoteEditorActivity; +Lcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller; +SPLcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller;->$values()[Lcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller; +SPLcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller;->()V +SPLcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller;->(Ljava/lang/String;II)V +SPLcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller;->getValue()I +Lcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller$Companion; +SPLcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller$Companion;->()V +SPLcom/ichi2/anki/NoteEditorFragment$Companion$NoteEditorCaller$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/NotificationChannel; +SPLcom/ichi2/anki/NotificationChannel;->$values()[Lcom/ichi2/anki/NotificationChannel; +SPLcom/ichi2/anki/NotificationChannel;->()V +SPLcom/ichi2/anki/NotificationChannel;->(Ljava/lang/String;ILjava/lang/String;II)V +SPLcom/ichi2/anki/NotificationChannel;->getEntries()Lkotlin/enums/EnumEntries; +SPLcom/ichi2/anki/NotificationChannel;->getId()Ljava/lang/String; +SPLcom/ichi2/anki/NotificationChannel;->getImportance()I +SPLcom/ichi2/anki/NotificationChannel;->getName(Landroid/content/res/Resources;)Ljava/lang/String; +Lcom/ichi2/anki/NotificationChannelKt; +SPLcom/ichi2/anki/NotificationChannelKt;->()V +SPLcom/ichi2/anki/NotificationChannelKt;->setupNotificationChannels(Landroid/content/Context;)V +Lcom/ichi2/anki/OnErrorListener; +Lcom/ichi2/anki/OnPageFinishedCallback; +Lcom/ichi2/anki/PermissionSet; +SPLcom/ichi2/anki/PermissionSet;->hasRequiredPermissions(Landroid/content/Context;)Z +Lcom/ichi2/anki/R$color; +Lcom/ichi2/anki/R$dimen; +Lcom/ichi2/anki/R$drawable; +Lcom/ichi2/anki/R$id; +Lcom/ichi2/anki/R$integer; +Lcom/ichi2/anki/R$layout; +Lcom/ichi2/anki/R$menu; +Lcom/ichi2/anki/R$string; +Lcom/ichi2/anki/R$style; +Lcom/ichi2/anki/Reviewer; +SPLcom/ichi2/anki/Reviewer;->()V +Lcom/ichi2/anki/Reviewer$$ExternalSyntheticLambda17; +SPLcom/ichi2/anki/Reviewer$$ExternalSyntheticLambda17;->()V +Lcom/ichi2/anki/Reviewer$$ExternalSyntheticLambda18; +SPLcom/ichi2/anki/Reviewer$$ExternalSyntheticLambda18;->()V +Lcom/ichi2/anki/Reviewer$Companion; +SPLcom/ichi2/anki/Reviewer$Companion;->()V +SPLcom/ichi2/anki/Reviewer$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/Reviewer$Companion;->getIntent(Landroid/content/Context;)Landroid/content/Intent; +Lcom/ichi2/anki/StoragePermissionSet; +SPLcom/ichi2/anki/StoragePermissionSet;->$values()[Lcom/ichi2/anki/StoragePermissionSet; +SPLcom/ichi2/anki/StoragePermissionSet;->()V +SPLcom/ichi2/anki/StoragePermissionSet;->(Ljava/lang/String;ILjava/util/List;Ljava/lang/Class;)V +SPLcom/ichi2/anki/StoragePermissionSet;->getPermissions()Ljava/util/List; +SPLcom/ichi2/anki/StoragePermissionSet;->hasRequiredPermissions(Landroid/content/Context;)Z +Lcom/ichi2/anki/StoragePermissionSet$Creator; +SPLcom/ichi2/anki/StoragePermissionSet$Creator;->()V +Lcom/ichi2/anki/StudyOptionsFragment; +SPLcom/ichi2/anki/StudyOptionsFragment;->()V +Lcom/ichi2/anki/StudyOptionsFragment$Companion; +SPLcom/ichi2/anki/StudyOptionsFragment$Companion;->()V +SPLcom/ichi2/anki/StudyOptionsFragment$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/StudyOptionsFragment$Companion;->registerStudyOptionsAddEditReminderHandler(Landroidx/fragment/app/FragmentActivity;Lkotlin/jvm/functions/Function1;)V +SPLcom/ichi2/anki/StudyOptionsFragment$Companion;->registerStudyOptionsStudyHandler(Landroidx/fragment/app/FragmentActivity;Lkotlin/jvm/functions/Function0;)V +Lcom/ichi2/anki/StudyOptionsFragment$Companion$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/StudyOptionsFragment$Companion$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function0;)V +Lcom/ichi2/anki/StudyOptionsFragment$Companion$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/StudyOptionsFragment$Companion$$ExternalSyntheticLambda1;->(Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/anki/SyncActionProvider; +SPLcom/ichi2/anki/SyncActionProvider;->()V +SPLcom/ichi2/anki/SyncActionProvider;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/SyncActionProvider;->getIcon()Landroid/graphics/drawable/Drawable; +SPLcom/ichi2/anki/SyncActionProvider;->onCreateActionView(Landroid/view/MenuItem;)Landroid/view/View; +SPLcom/ichi2/anki/SyncActionProvider;->setIcon(Landroid/graphics/drawable/Drawable;)V +SPLcom/ichi2/anki/SyncActionProvider;->setTooltipText(Ljava/lang/CharSequence;)V +Lcom/ichi2/anki/SyncActionProvider$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/SyncActionProvider$$ExternalSyntheticLambda0;->(Landroid/view/MenuItem;Lcom/ichi2/anki/SyncActionProvider;)V +Lcom/ichi2/anki/SyncKt; +SPLcom/ichi2/anki/SyncKt;->()V +SPLcom/ichi2/anki/SyncKt;->getEndpoint()Ljava/lang/String; +SPLcom/ichi2/anki/SyncKt;->syncAuth()Lcom/ichi2/anki/sync/SyncAuth; +Lcom/ichi2/anki/TtsVoices; +SPLcom/ichi2/anki/TtsVoices;->()V +SPLcom/ichi2/anki/TtsVoices;->()V +SPLcom/ichi2/anki/TtsVoices;->access$getAvailableVoices$p()Ljava/util/List; +SPLcom/ichi2/anki/TtsVoices;->access$setAvailableVoices$p(Ljava/util/List;)V +SPLcom/ichi2/anki/TtsVoices;->access$setBuildLocalesJob$p(Lkotlinx/coroutines/Job;)V +SPLcom/ichi2/anki/TtsVoices;->access$setTtsEngine$p(Ljava/lang/String;)V +SPLcom/ichi2/anki/TtsVoices;->createTts(Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices;->launchBuildLocalesJob()V +SPLcom/ichi2/anki/TtsVoices;->loadVoices$AnkiDroid(Lkotlinx/coroutines/CompletableDeferred;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices;->loadVoicesFromEngines$AnkiDroid(Ljava/util/List;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices;->readLocales(Landroid/speech/tts/TextToSpeech;)Ljava/util/List; +Lcom/ichi2/anki/TtsVoices$EngineLocales; +SPLcom/ichi2/anki/TtsVoices$EngineLocales;->()V +SPLcom/ichi2/anki/TtsVoices$EngineLocales;->(Ljava/lang/String;Ljava/util/List;)V +Lcom/ichi2/anki/TtsVoices$createTts$2$1; +SPLcom/ichi2/anki/TtsVoices$createTts$2$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;)V +Lcom/ichi2/anki/TtsVoices$createTts$2$onInit$1; +SPLcom/ichi2/anki/TtsVoices$createTts$2$onInit$1;->(Ljava/lang/String;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/CancellableContinuation;)V +SPLcom/ichi2/anki/TtsVoices$createTts$2$onInit$1;->onInit(I)V +Lcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1; +SPLcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1;->(Lkotlinx/coroutines/CompletableDeferred;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1$1; +SPLcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1$1;->(Ljava/lang/Object;)V +SPLcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices$launchBuildLocalesJob$1$1;->invoke(Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/TtsVoices$loadVoices$1; +SPLcom/ichi2/anki/TtsVoices$loadVoices$1;->(Lcom/ichi2/anki/TtsVoices;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/TtsVoices$loadVoices$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/TtsVoices$loadVoices$2; +SPLcom/ichi2/anki/TtsVoices$loadVoices$2;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/TtsVoices$loadVoices$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/TtsVoices$loadVoices$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices$loadVoices$2;->invoke(Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/TtsVoices$loadVoices$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/TtsVoices$loadVoicesFromEngines$1; +SPLcom/ichi2/anki/TtsVoices$loadVoicesFromEngines$1;->(Lcom/ichi2/anki/TtsVoices;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/TtsVoices$loadVoicesFromEngines$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/TtsVoicesFieldFilter; +SPLcom/ichi2/anki/TtsVoicesFieldFilter;->()V +SPLcom/ichi2/anki/TtsVoicesFieldFilter;->()V +Lcom/ichi2/anki/TtsVoicesFieldFilter$Companion; +SPLcom/ichi2/anki/TtsVoicesFieldFilter$Companion;->()V +SPLcom/ichi2/anki/TtsVoicesFieldFilter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/TtsVoicesFieldFilter$Companion;->ensureApplied()V +Lcom/ichi2/anki/TtsVoicesKt; +SPLcom/ichi2/anki/TtsVoicesKt;->toTtsVoice(Landroid/speech/tts/Voice;Ljava/lang/String;)Lcom/ichi2/anki/AndroidTtsVoice; +Lcom/ichi2/anki/WhiteboardMultiTouchMethods; +Lcom/ichi2/anki/analytics/AnalyticsConstants; +SPLcom/ichi2/anki/analytics/AnalyticsConstants;->()V +SPLcom/ichi2/anki/analytics/AnalyticsConstants;->()V +SPLcom/ichi2/anki/analytics/AnalyticsConstants;->getReportablePrefKeys()Ljava/util/Set; +Lcom/ichi2/anki/analytics/AnalyticsExceptionHandler; +SPLcom/ichi2/anki/analytics/AnalyticsExceptionHandler;->()V +SPLcom/ichi2/anki/analytics/AnalyticsExceptionHandler;->(Ljava/lang/Thread$UncaughtExceptionHandler;Lkotlin/jvm/functions/Function2;)V +Lcom/ichi2/anki/analytics/AnalyticsExceptionHandler$Companion; +SPLcom/ichi2/anki/analytics/AnalyticsExceptionHandler$Companion;->()V +SPLcom/ichi2/anki/analytics/AnalyticsExceptionHandler$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/analytics/AnalyticsExceptionHandler$Companion;->install(Lkotlin/jvm/functions/Function2;)V +Lcom/ichi2/anki/analytics/AnalyticsSamplePercentage; +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage;->()V +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage;->access$getUninitialized$cp()I +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage;->constructor-impl(I)I +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage;->isInitialized-impl(I)Z +Lcom/ichi2/anki/analytics/AnalyticsSamplePercentage$Companion; +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage$Companion;->()V +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/analytics/AnalyticsSamplePercentage$Companion;->getUninitialized--UvX6DQ()I +Lcom/ichi2/anki/analytics/AnkiDroidCrashReportDialog; +Lcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->()V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->()V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->configure$lambda$0(Lcom/criticalay/GoogleAnalyticsBuilder;)Lkotlin/Unit; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->configure(Landroid/content/Context;)V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->getAnalyticsSamplePercentage(Landroid/content/Context;)I +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->handlePreferences(Landroid/content/Context;)V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->initialize(Landroid/content/Context;)V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->initializePrefKeys(Landroid/content/Context;)V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics;->sendAnalyticsScreenView(Ljava/lang/String;)V +Lcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda1;->()V +Lcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$$ExternalSyntheticLambda2;->()V +Lcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$initialize$1; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalytics$initialize$1;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/analytics/AnkiDroidUsageAnalyticsKt; +SPLcom/ichi2/anki/analytics/AnkiDroidUsageAnalyticsKt;->initializeAnalytics(Landroid/app/Application;)V +Lcom/ichi2/anki/analytics/PreviousAnrReporterKt; +SPLcom/ichi2/anki/analytics/PreviousAnrReporterKt;->launchPreviousAnrReporting(Lcom/ichi2/anki/AnkiDroidApp;)V +SPLcom/ichi2/anki/analytics/PreviousAnrReporterKt;->reportPreviousAnr(Lcom/ichi2/anki/AnkiDroidApp;)V +Lcom/ichi2/anki/analytics/PreviousAnrReporterKt$launchPreviousAnrReporting$1; +SPLcom/ichi2/anki/analytics/PreviousAnrReporterKt$launchPreviousAnrReporting$1;->(Lcom/ichi2/anki/AnkiDroidApp;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/analytics/PreviousAnrReporterKt$launchPreviousAnrReporting$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/analytics/PreviousAnrReporterKt$launchPreviousAnrReporting$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/analytics/SharedPreferencesAnrReportState; +SPLcom/ichi2/anki/analytics/SharedPreferencesAnrReportState;->()V +SPLcom/ichi2/anki/analytics/SharedPreferencesAnrReportState;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/analytics/SharedPreferencesAnrReportState;->getLastProcessedTimestamp()J +SPLcom/ichi2/anki/analytics/SharedPreferencesAnrReportState;->getPreferences()Landroid/content/SharedPreferences; +Lcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt; +SPLcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt;->exitViaDoubleTapBackCallback(Lcom/ichi2/anki/AnkiActivity;)Landroidx/activity/OnBackPressedCallback; +Lcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/AnkiActivity;Lcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt$exitViaDoubleTapBackCallback$1;)V +Lcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt$exitViaDoubleTapBackCallback$1; +SPLcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt$exitViaDoubleTapBackCallback$1;->(Lcom/ichi2/anki/AnkiActivity;Z)V +SPLcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt$exitViaDoubleTapBackCallback$1;->getStrongListenerReference()Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener; +SPLcom/ichi2/anki/android/back/ExitViaDoubleTapBackBackPressCallbackKt$exitViaDoubleTapBackCallback$1;->setStrongListenerReference(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V +Lcom/ichi2/anki/android/input/ShortcutGroupProvider; +Lcom/ichi2/anki/android/view/ViewLocation; +SPLcom/ichi2/anki/android/view/ViewLocation;->constructor-impl([I)[I +SPLcom/ichi2/anki/android/view/ViewLocation;->getY-impl([I)I +Lcom/ichi2/anki/android/view/ViewLocationKt; +SPLcom/ichi2/anki/android/view/ViewLocationKt;->locationInWindow$default(Landroid/view/View;[IILjava/lang/Object;)[I +SPLcom/ichi2/anki/android/view/ViewLocationKt;->locationInWindow(Landroid/view/View;[I)[I +SPLcom/ichi2/anki/android/view/ViewLocationKt;->locationOnScreen(Landroid/view/View;[I)[I +Lcom/ichi2/anki/ankicommon/R$string; +Lcom/ichi2/anki/backend/AnkiBackendLanguage; +SPLcom/ichi2/anki/backend/AnkiBackendLanguage;->()V +SPLcom/ichi2/anki/backend/AnkiBackendLanguage;->access$constructor-impl(Ljava/lang/String;)Ljava/lang/String; +SPLcom/ichi2/anki/backend/AnkiBackendLanguage;->access$getLANGUAGE_IDENTIFIER$cp()Lkotlin/text/Regex; +SPLcom/ichi2/anki/backend/AnkiBackendLanguage;->constructor-impl(Ljava/lang/String;)Ljava/lang/String; +Lcom/ichi2/anki/backend/AnkiBackendLanguage$Companion; +SPLcom/ichi2/anki/backend/AnkiBackendLanguage$Companion;->()V +SPLcom/ichi2/anki/backend/AnkiBackendLanguage$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/backend/AnkiBackendLanguage$Companion;->fromIdentifier-hHuSVNI(Ljava/lang/String;)Ljava/lang/String; +SPLcom/ichi2/anki/backend/AnkiBackendLanguage$Companion;->fromLanguageTag-hHuSVNI(Ljava/lang/String;)Ljava/lang/String; +Lcom/ichi2/anki/backend/BackendDatabaseKt; +SPLcom/ichi2/anki/backend/BackendDatabaseKt;->createDatabaseUsingRustBackend(Lnet/ankiweb/rsdroid/Backend;)Lcom/ichi2/anki/libanki/DB; +Lcom/ichi2/anki/backend/BackendLocales; +SPLcom/ichi2/anki/backend/BackendLocales;->()V +SPLcom/ichi2/anki/backend/BackendLocales;->(Ljava/util/List;)V +SPLcom/ichi2/anki/backend/BackendLocales;->getAll()Ljava/util/List; +Lcom/ichi2/anki/backend/BackendLocalesKt; +SPLcom/ichi2/anki/backend/BackendLocalesKt;->getLocales(Lnet/ankiweb/rsdroid/Backend;)Lcom/ichi2/anki/backend/BackendLocales; +Lcom/ichi2/anki/browser/BrowserDestinationKt; +SPLcom/ichi2/anki/browser/BrowserDestinationKt;->toIntent(Lcom/ichi2/anki/common/destinations/BrowserDestination;Landroid/content/Context;)Landroid/content/Intent; +Lcom/ichi2/anki/browser/LastDeckIdRepository; +Lcom/ichi2/anki/browser/SharedPreferencesLastDeckIdRepository; +SPLcom/ichi2/anki/browser/SharedPreferencesLastDeckIdRepository;->()V +SPLcom/ichi2/anki/browser/SharedPreferencesLastDeckIdRepository;->()V +Lcom/ichi2/anki/browser/SharedPreferencesLastDeckIdRepository$Companion; +SPLcom/ichi2/anki/browser/SharedPreferencesLastDeckIdRepository$Companion;->()V +SPLcom/ichi2/anki/browser/SharedPreferencesLastDeckIdRepository$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/browser/SharedPreferencesLastDeckIdRepository$Companion;->clearLastDeckId()V +Lcom/ichi2/anki/cardviewer/MediaErrorHandler; +SPLcom/ichi2/anki/cardviewer/MediaErrorHandler;->()V +SPLcom/ichi2/anki/cardviewer/MediaErrorHandler;->()V +Lcom/ichi2/anki/cardviewer/MediaErrorHandler$Companion; +SPLcom/ichi2/anki/cardviewer/MediaErrorHandler$Companion;->()V +SPLcom/ichi2/anki/cardviewer/MediaErrorHandler$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/cardviewer/MediaErrorListener; +Lcom/ichi2/anki/cardviewer/ViewerCommand$CommandProcessor; +Lcom/ichi2/anki/common/analytics/Analytics; +SPLcom/ichi2/anki/common/analytics/Analytics;->()V +SPLcom/ichi2/anki/common/analytics/Analytics;->()V +SPLcom/ichi2/anki/common/analytics/Analytics;->sendAnalyticsScreenView(Ljava/lang/String;)V +SPLcom/ichi2/anki/common/analytics/Analytics;->setAnalytics(Lcom/ichi2/anki/common/analytics/UsageAnalytics;)V +Lcom/ichi2/anki/common/analytics/Analytics$Unregistered; +SPLcom/ichi2/anki/common/analytics/Analytics$Unregistered;->()V +SPLcom/ichi2/anki/common/analytics/Analytics$Unregistered;->()V +Lcom/ichi2/anki/common/analytics/UsageAnalytics; +SPLcom/ichi2/anki/common/analytics/UsageAnalytics;->()V +Lcom/ichi2/anki/common/analytics/UsageAnalytics$Companion; +SPLcom/ichi2/anki/common/analytics/UsageAnalytics$Companion;->()V +SPLcom/ichi2/anki/common/analytics/UsageAnalytics$Companion;->()V +Lcom/ichi2/anki/common/android/AdaptionUtil; +SPLcom/ichi2/anki/common/android/AdaptionUtil;->()V +SPLcom/ichi2/anki/common/android/AdaptionUtil;->()V +SPLcom/ichi2/anki/common/android/AdaptionUtil;->isRunningUnderFirebaseTestLab()Z +SPLcom/ichi2/anki/common/android/AdaptionUtil;->isRunningUnderFirebaseTestLab(Landroid/content/ContentResolver;)Z +SPLcom/ichi2/anki/common/android/AdaptionUtil;->isUserATestClient()Z +Lcom/ichi2/anki/common/android/AdaptionUtil$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/common/android/AdaptionUtil$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/common/android/AdaptionUtil$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/common/android/AdaptionUtil$$ExternalSyntheticLambda1;->()V +Lcom/ichi2/anki/common/android/AlarmManagement; +SPLcom/ichi2/anki/common/android/AlarmManagement;->()V +SPLcom/ichi2/anki/common/android/AlarmManagement;->()V +SPLcom/ichi2/anki/common/android/AlarmManagement;->getWINDOW_LENGTH_MS()J +SPLcom/ichi2/anki/common/android/AlarmManagement;->useAlarmManager$default(Lcom/ichi2/anki/common/android/AlarmManagement;Landroid/content/Context;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +SPLcom/ichi2/anki/common/android/AlarmManagement;->useAlarmManager(Landroid/content/Context;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/anki/common/android/AlarmManagement$useAlarmManager$1; +SPLcom/ichi2/anki/common/android/AlarmManagement$useAlarmManager$1;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/common/android/Animations; +SPLcom/ichi2/anki/common/android/Animations;->()V +SPLcom/ichi2/anki/common/android/Animations;->()V +SPLcom/ichi2/anki/common/android/Animations;->areAnimationsEnabled(Landroid/content/Context;)Z +SPLcom/ichi2/anki/common/android/Animations;->areSystemAnimationsEnabled(Landroid/content/Context;)Z +SPLcom/ichi2/anki/common/android/Animations;->setPreferencesProvider(Landroid/app/Application;Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/anki/common/android/AnimationsKt; +SPLcom/ichi2/anki/common/android/AnimationsKt;->animationDisabled(Landroidx/fragment/app/FragmentActivity;)Z +SPLcom/ichi2/anki/common/android/AnimationsKt;->animationEnabled(Landroidx/fragment/app/FragmentActivity;)Z +Lcom/ichi2/anki/common/android/AnkiBroadcastReceiver; +SPLcom/ichi2/anki/common/android/AnkiBroadcastReceiver;->()V +SPLcom/ichi2/anki/common/android/AnkiBroadcastReceiver;->()V +SPLcom/ichi2/anki/common/android/AnkiBroadcastReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V +Lcom/ichi2/anki/common/android/AppLocaleKt; +SPLcom/ichi2/anki/common/android/AppLocaleKt;->getCurrentLocaleTag()Ljava/lang/String; +SPLcom/ichi2/anki/common/android/AppLocaleKt;->withAppLocale(Landroid/content/Context;)Landroid/content/Context; +Lcom/ichi2/anki/common/android/ApplicationContextInitializer; +SPLcom/ichi2/anki/common/android/ApplicationContextInitializer;->()V +SPLcom/ichi2/anki/common/android/ApplicationContextInitializer;->()V +SPLcom/ichi2/anki/common/android/ApplicationContextInitializer;->getInstanceOrNull()Landroid/content/Context; +SPLcom/ichi2/anki/common/android/ApplicationContextInitializer;->setInstance(Landroid/app/Application;)V +Lcom/ichi2/anki/common/android/ApplicationContextInitializerKt; +SPLcom/ichi2/anki/common/android/ApplicationContextInitializerKt;->access$getAppContext$p()Landroid/content/Context; +SPLcom/ichi2/anki/common/android/ApplicationContextInitializerKt;->access$setAppContext$p(Landroid/content/Context;)V +SPLcom/ichi2/anki/common/android/ApplicationContextInitializerKt;->getAppContext()Landroid/content/Context; +Lcom/ichi2/anki/common/android/R$attr; +Lcom/ichi2/anki/common/android/R$color; +Lcom/ichi2/anki/common/android/R$drawable; +Lcom/ichi2/anki/common/android/R$string; +Lcom/ichi2/anki/common/android/R$style; +Lcom/ichi2/anki/common/android/themes/XiaomiKt; +SPLcom/ichi2/anki/common/android/themes/XiaomiKt;->disableXiaomiForceDarkMode(Landroid/content/Context;)V +Lcom/ichi2/anki/common/coroutines/ApplicationScopeKt; +SPLcom/ichi2/anki/common/coroutines/ApplicationScopeKt;->()V +SPLcom/ichi2/anki/common/coroutines/ApplicationScopeKt;->applicationScope_delegate$lambda$0()Lkotlinx/coroutines/CoroutineScope; +SPLcom/ichi2/anki/common/coroutines/ApplicationScopeKt;->getApplicationScope()Lkotlinx/coroutines/CoroutineScope; +Lcom/ichi2/anki/common/coroutines/ApplicationScopeKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/common/coroutines/ApplicationScopeKt$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/common/coroutines/ApplicationScopeKt$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/common/crashreporting/CrashReportService; +SPLcom/ichi2/anki/common/crashreporting/CrashReportService;->()V +SPLcom/ichi2/anki/common/crashreporting/CrashReportService;->()V +SPLcom/ichi2/anki/common/crashreporting/CrashReportService;->isEnabled(Landroid/content/Context;Z)Z +SPLcom/ichi2/anki/common/crashreporting/CrashReportService;->setReporter(Lcom/ichi2/anki/common/crashreporting/CrashReporter;)V +Lcom/ichi2/anki/common/crashreporting/CrashReportServiceKt; +SPLcom/ichi2/anki/common/crashreporting/CrashReportServiceKt;->runCatchingWithReport(Ljava/lang/String;ZLkotlin/jvm/functions/Function0;)Ljava/lang/Object; +Lcom/ichi2/anki/common/crashreporting/CrashReporter; +Lcom/ichi2/anki/common/crashreporting/UninitializedCrashReporter; +SPLcom/ichi2/anki/common/crashreporting/UninitializedCrashReporter;->()V +SPLcom/ichi2/anki/common/crashreporting/UninitializedCrashReporter;->()V +Lcom/ichi2/anki/common/destinations/BrowserDestination; +SPLcom/ichi2/anki/common/destinations/BrowserDestination;->()V +SPLcom/ichi2/anki/common/destinations/BrowserDestination;->()V +SPLcom/ichi2/anki/common/destinations/BrowserDestination;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/common/destinations/BrowserDestination$Open; +SPLcom/ichi2/anki/common/destinations/BrowserDestination$Open;->()V +SPLcom/ichi2/anki/common/destinations/BrowserDestination$Open;->()V +Lcom/ichi2/anki/common/destinations/CardInfoDestination; +Lcom/ichi2/anki/common/destinations/DeferredNavigation; +SPLcom/ichi2/anki/common/destinations/DeferredNavigation;->()V +Lcom/ichi2/anki/common/destinations/DeferredNavigation$Companion; +SPLcom/ichi2/anki/common/destinations/DeferredNavigation$Companion;->()V +SPLcom/ichi2/anki/common/destinations/DeferredNavigation$Companion;->()V +Lcom/ichi2/anki/common/destinations/Destination; +SPLcom/ichi2/anki/common/destinations/Destination;->()V +SPLcom/ichi2/anki/common/destinations/Destination;->()V +SPLcom/ichi2/anki/common/destinations/Destination;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/common/destinations/Navigator; +SPLcom/ichi2/anki/common/destinations/Navigator;->()V +Lcom/ichi2/anki/common/destinations/Navigator$Companion; +SPLcom/ichi2/anki/common/destinations/Navigator$Companion;->()V +SPLcom/ichi2/anki/common/destinations/Navigator$Companion;->()V +SPLcom/ichi2/anki/common/destinations/Navigator$Companion;->register(Lcom/ichi2/anki/common/destinations/Navigator;)V +Lcom/ichi2/anki/common/destinations/NavigatorKt; +SPLcom/ichi2/anki/common/destinations/NavigatorKt;->access$setNavigatorInstance$p(Lcom/ichi2/anki/common/destinations/Navigator;)V +SPLcom/ichi2/anki/common/destinations/NavigatorKt;->toIntent(Lcom/ichi2/anki/common/destinations/DeferredNavigation;Lcom/ichi2/anki/common/destinations/Destination;)Landroid/content/Intent; +Lcom/ichi2/anki/common/destinations/NoteEditorDestination; +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination;->()V +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination;->()V +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/common/destinations/NoteEditorDestination$AddNote; +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination$AddNote;->()V +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination$AddNote;->(Ljava/lang/Long;)V +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination$AddNote;->(Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/common/destinations/NoteEditorDestination$AddNote;->getDeckId()Ljava/lang/Long; +Lcom/ichi2/anki/common/json/JSONContainerKt; +SPLcom/ichi2/anki/common/json/JSONContainerKt;->jsonArray(Lcom/ichi2/anki/common/json/JSONObjectHolder;Ljava/lang/String;)Lcom/ichi2/anki/common/json/JsonArrayDelegate; +SPLcom/ichi2/anki/common/json/JSONContainerKt;->jsonBoolean(Lcom/ichi2/anki/common/json/JSONObjectHolder;Ljava/lang/String;)Lcom/ichi2/anki/common/json/JsonBooleanDelegate; +SPLcom/ichi2/anki/common/json/JSONContainerKt;->jsonBoolean(Lcom/ichi2/anki/common/json/JSONObjectHolder;Ljava/lang/String;Z)Lcom/ichi2/anki/common/json/JsonBooleanDelegate; +SPLcom/ichi2/anki/common/json/JSONContainerKt;->jsonLong(Lcom/ichi2/anki/common/json/JSONObjectHolder;Ljava/lang/String;)Lcom/ichi2/anki/common/json/JsonLongDelegate; +SPLcom/ichi2/anki/common/json/JSONContainerKt;->jsonString(Lcom/ichi2/anki/common/json/JSONObjectHolder;Ljava/lang/String;)Lcom/ichi2/anki/common/json/JsonStringDelegate; +SPLcom/ichi2/anki/common/json/JSONContainerKt;->jsonString(Lcom/ichi2/anki/common/json/JSONObjectHolder;Ljava/lang/String;Ljava/lang/String;)Lcom/ichi2/anki/common/json/JsonStringDelegate; +Lcom/ichi2/anki/common/json/JSONObjectHolder; +Lcom/ichi2/anki/common/json/JsonArrayDelegate; +SPLcom/ichi2/anki/common/json/JsonArrayDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;)V +Lcom/ichi2/anki/common/json/JsonBooleanDelegate; +SPLcom/ichi2/anki/common/json/JsonBooleanDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;Ljava/lang/Boolean;)V +SPLcom/ichi2/anki/common/json/JsonBooleanDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/common/json/JsonLongDelegate; +SPLcom/ichi2/anki/common/json/JsonLongDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;Ljava/lang/Long;)V +SPLcom/ichi2/anki/common/json/JsonLongDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/common/json/JsonLongDelegate;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)J +Lcom/ichi2/anki/common/json/JsonStringDelegate; +SPLcom/ichi2/anki/common/json/JsonStringDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;Ljava/lang/String;)V +SPLcom/ichi2/anki/common/json/JsonStringDelegate;->(Lorg/json/JSONObject;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/common/permissions/PermissionsKt; +SPLcom/ichi2/anki/common/permissions/PermissionsKt;->hasAllPermissions(Landroid/content/Context;Ljava/util/Collection;)Z +SPLcom/ichi2/anki/common/permissions/PermissionsKt;->hasPermission(Landroid/content/Context;Ljava/lang/String;)Z +Lcom/ichi2/anki/common/permissions/StoragePermissionsKt; +SPLcom/ichi2/anki/common/permissions/StoragePermissionsKt;->hasLegacyStorageAccessPermission(Landroid/content/Context;)Z +SPLcom/ichi2/anki/common/permissions/StoragePermissionsKt;->hasStorageReadAccessPermission(Landroid/content/Context;)Z +Lcom/ichi2/anki/common/preferences/AnimationPreferences; +Lcom/ichi2/anki/common/preferences/NotificationPreferences; +Lcom/ichi2/anki/common/preferences/SharedPreferencesTestHook; +SPLcom/ichi2/anki/common/preferences/SharedPreferencesTestHook;->()V +SPLcom/ichi2/anki/common/preferences/SharedPreferencesTestHook;->()V +SPLcom/ichi2/anki/common/preferences/SharedPreferencesTestHook;->getOverride()Lkotlin/jvm/functions/Function1; +Lcom/ichi2/anki/common/preferences/SharedPrefsKt; +SPLcom/ichi2/anki/common/preferences/SharedPrefsKt;->sharedPrefs(Landroid/content/Context;)Landroid/content/SharedPreferences; +Lcom/ichi2/anki/common/storage/CollectionHelper; +SPLcom/ichi2/anki/common/storage/CollectionHelper;->()V +SPLcom/ichi2/anki/common/storage/CollectionHelper;->()V +SPLcom/ichi2/anki/common/storage/CollectionHelper;->getAppSpecificExternalDirectories(Landroid/content/Context;)Ljava/util/List; +SPLcom/ichi2/anki/common/storage/CollectionHelper;->getAppSpecificInternalAnkiDroidDirectory(Landroid/content/Context;)Ljava/lang/String; +SPLcom/ichi2/anki/common/storage/CollectionHelper;->getCurrentAnkiDroidDirectory(Landroid/content/Context;)Ljava/io/File; +SPLcom/ichi2/anki/common/storage/CollectionHelper;->getCurrentAnkiDroidDirectory(Landroid/content/SharedPreferences;)Ljava/io/File; +SPLcom/ichi2/anki/common/storage/CollectionHelper;->getStorageDecisionTestOverride()Lcom/ichi2/anki/common/storage/StorageDecision; +SPLcom/ichi2/anki/common/storage/CollectionHelper;->initializeAnkiDroidDirectory(Ljava/io/File;)V +SPLcom/ichi2/anki/common/storage/CollectionHelper;->storageDecision(Landroid/content/SharedPreferences;)Lcom/ichi2/anki/common/storage/StorageDecision; +Lcom/ichi2/anki/common/storage/LegacyStorageKt; +SPLcom/ichi2/anki/common/storage/LegacyStorageKt;->grantedStoragePermissions(Landroid/content/Context;)Z +SPLcom/ichi2/anki/common/storage/LegacyStorageKt;->grantedStoragePermissions(Landroid/content/Context;Z)Z +SPLcom/ichi2/anki/common/storage/LegacyStorageKt;->isLegacyStorage(Landroid/content/Context;)Z +SPLcom/ichi2/anki/common/storage/LegacyStorageKt;->isLegacyStorage(Landroid/content/Context;Z)Ljava/lang/Boolean; +SPLcom/ichi2/anki/common/storage/LegacyStorageKt;->isLegacyStorage(Ljava/io/File;Landroid/content/Context;)Z +Lcom/ichi2/anki/common/storage/StorageDecision; +Lcom/ichi2/anki/common/storage/StorageDecision$Decided; +SPLcom/ichi2/anki/common/storage/StorageDecision$Decided;->()V +SPLcom/ichi2/anki/common/storage/StorageDecision$Decided;->()V +SPLcom/ichi2/anki/common/storage/StorageDecision$Decided;->equals(Ljava/lang/Object;)Z +Lcom/ichi2/anki/common/time/SystemTime; +SPLcom/ichi2/anki/common/time/SystemTime;->()V +SPLcom/ichi2/anki/common/time/SystemTime;->intTimeMS()J +Lcom/ichi2/anki/common/time/Time; +SPLcom/ichi2/anki/common/time/Time;->()V +SPLcom/ichi2/anki/common/time/Time;->()V +SPLcom/ichi2/anki/common/time/Time;->intTime()J +Lcom/ichi2/anki/common/time/Time$Companion; +SPLcom/ichi2/anki/common/time/Time$Companion;->()V +SPLcom/ichi2/anki/common/time/Time$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/common/time/TimeManager; +SPLcom/ichi2/anki/common/time/TimeManager;->()V +SPLcom/ichi2/anki/common/time/TimeManager;->()V +SPLcom/ichi2/anki/common/time/TimeManager;->getTime()Lcom/ichi2/anki/common/time/Time; +Lcom/ichi2/anki/common/utils/ConfigProperty; +SPLcom/ichi2/anki/common/utils/ConfigProperty;->()V +SPLcom/ichi2/anki/common/utils/ConfigProperty;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V +SPLcom/ichi2/anki/common/utils/ConfigProperty;->getValue(Lcom/ichi2/anki/libanki/Config;Lkotlin/reflect/KProperty;)Ljava/lang/Object; +SPLcom/ichi2/anki/common/utils/ConfigProperty;->mapped$lambda$0(Lkotlin/jvm/functions/Function1;Lcom/ichi2/anki/common/utils/ConfigProperty;Lcom/ichi2/anki/libanki/Config;)Ljava/lang/Object; +SPLcom/ichi2/anki/common/utils/ConfigProperty;->mapped(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lcom/ichi2/anki/common/utils/ConfigProperty; +Lcom/ichi2/anki/common/utils/ConfigProperty$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/common/utils/ConfigProperty$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;Lcom/ichi2/anki/common/utils/ConfigProperty;)V +SPLcom/ichi2/anki/common/utils/ConfigProperty$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/common/utils/ConfigProperty$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/common/utils/ConfigProperty$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/common/utils/ConfigProperty;Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/anki/common/utils/ConfigPropertyKt; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt;->configProperty(Lanki/config/ConfigKey$Bool;)Lcom/ichi2/anki/common/utils/ConfigProperty; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt;->configProperty(Lanki/config/ConfigKey$String;)Lcom/ichi2/anki/common/utils/ConfigProperty; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt;->orDefault$lambda$0(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt;->orDefault(Lcom/ichi2/anki/common/utils/ConfigProperty;Ljava/lang/Object;)Lcom/ichi2/anki/common/utils/ConfigProperty; +Lcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda0;->(Ljava/lang/Object;)V +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda1;->()V +Lcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda2;->(Lanki/config/ConfigKey$String;)V +Lcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda3;->(Lanki/config/ConfigKey$String;)V +Lcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda4;->(Lanki/config/ConfigKey$Bool;)V +Lcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda5; +SPLcom/ichi2/anki/common/utils/ConfigPropertyKt$$ExternalSyntheticLambda5;->(Lanki/config/ConfigKey$Bool;)V +Lcom/ichi2/anki/common/utils/Dp; +SPLcom/ichi2/anki/common/utils/Dp;->constructor-impl(F)F +SPLcom/ichi2/anki/common/utils/Dp;->toPx-impl(FLandroid/content/Context;)I +Lcom/ichi2/anki/common/utils/DpKt; +SPLcom/ichi2/anki/common/utils/DpKt;->access$dpToPx(FLandroid/content/Context;)I +SPLcom/ichi2/anki/common/utils/DpKt;->dpToPx(FLandroid/content/Context;)I +SPLcom/ichi2/anki/common/utils/DpKt;->getDp(I)F +Lcom/ichi2/anki/common/utils/android/HandlerUtils; +SPLcom/ichi2/anki/common/utils/android/HandlerUtils;->()V +SPLcom/ichi2/anki/common/utils/android/HandlerUtils;->()V +SPLcom/ichi2/anki/common/utils/android/HandlerUtils;->getDefaultLooper()Landroid/os/Looper; +Lcom/ichi2/anki/common/utils/android/TestUtilsKt; +SPLcom/ichi2/anki/common/utils/android/TestUtilsKt;->()V +SPLcom/ichi2/anki/common/utils/android/TestUtilsKt;->isInstrumentationTest()Z +SPLcom/ichi2/anki/common/utils/android/TestUtilsKt;->isRobolectric()Z +Lcom/ichi2/anki/common/utils/android/ThemeUtilsKt; +SPLcom/ichi2/anki/common/utils/android/ThemeUtilsKt;->systemIsInNightMode(Landroid/content/Context;)Z +Lcom/ichi2/anki/common/utils/android/Threads; +SPLcom/ichi2/anki/common/utils/android/Threads;->()V +SPLcom/ichi2/anki/common/utils/android/Threads;->()V +SPLcom/ichi2/anki/common/utils/android/Threads;->isOnMainThread()Z +Lcom/ichi2/anki/common/utils/ext/ConfigKt; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt;->()V +SPLcom/ichi2/anki/common/utils/ext/ConfigKt;->getFsrsEnabled(Lcom/ichi2/anki/libanki/Config;)Ljava/lang/Boolean; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt;->getSchedulerVersion(Lcom/ichi2/anki/libanki/Config;)J +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda1;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda2;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda3;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda4;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda5; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda5;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda6; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda6;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda7; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$$ExternalSyntheticLambda7;->()V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$1; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$1;->(Ljava/lang/String;Ljava/lang/Object;)V +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$1;->invoke(Lcom/ichi2/anki/libanki/Config;)Ljava/lang/Object; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$2; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$2;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$1; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$1;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$10; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$10;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$11; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$11;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$12; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$12;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$13; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$13;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$14; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$14;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$15; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$15;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$16; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$16;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$17; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$17;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$18; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$18;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$19; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$19;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$2; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$2;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$20; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$20;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$3; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$3;->(Ljava/lang/String;Ljava/lang/Object;)V +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$3;->invoke(Lcom/ichi2/anki/libanki/Config;)Ljava/lang/Object; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$4; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$4;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$5; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$5;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$6; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$6;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$7; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$7;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$8; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$8;->(Ljava/lang/String;)V +Lcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$9; +SPLcom/ichi2/anki/common/utils/ext/ConfigKt$special$$inlined$jsonConfigProperty$default$9;->(Ljava/lang/String;Ljava/lang/Object;)V +Lcom/ichi2/anki/common/utils/ext/JSONArrayKt; +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt;->stringIterable(Lorg/json/JSONArray;)Ljava/lang/Iterable; +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt;->stringIterator(Lorg/json/JSONArray;)Ljava/util/Iterator; +Lcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterable$$inlined$Iterable$1; +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterable$$inlined$Iterable$1;->(Lorg/json/JSONArray;)V +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterable$$inlined$Iterable$1;->iterator()Ljava/util/Iterator; +Lcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterator$1; +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterator$1;->(Lorg/json/JSONArray;)V +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterator$1;->hasNext()Z +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterator$1;->next()Ljava/lang/Object; +SPLcom/ichi2/anki/common/utils/ext/JSONArrayKt$stringIterator$1;->next()Ljava/lang/String; +Lcom/ichi2/anki/compat/BaseCompat; +SPLcom/ichi2/anki/compat/BaseCompat;->()V +Lcom/ichi2/anki/compat/Compat; +Lcom/ichi2/anki/compat/CompatHelper; +SPLcom/ichi2/anki/compat/CompatHelper;->()V +SPLcom/ichi2/anki/compat/CompatHelper;->()V +SPLcom/ichi2/anki/compat/CompatHelper;->access$getCompatValue$p(Lcom/ichi2/anki/compat/CompatHelper;)Lcom/ichi2/anki/compat/Compat; +SPLcom/ichi2/anki/compat/CompatHelper;->access$getInstance$delegate$cp()Lkotlin/Lazy; +SPLcom/ichi2/anki/compat/CompatHelper;->instance_delegate$lambda$0()Lcom/ichi2/anki/compat/CompatHelper; +Lcom/ichi2/anki/compat/CompatHelper$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/compat/CompatHelper$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/compat/CompatHelper$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/compat/CompatHelper$Companion; +SPLcom/ichi2/anki/compat/CompatHelper$Companion;->()V +SPLcom/ichi2/anki/compat/CompatHelper$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/compat/CompatHelper$Companion;->getCompat()Lcom/ichi2/anki/compat/Compat; +SPLcom/ichi2/anki/compat/CompatHelper$Companion;->getInstance()Lcom/ichi2/anki/compat/CompatHelper; +SPLcom/ichi2/anki/compat/CompatHelper$Companion;->getPackageInfoCompat(Landroid/content/Context;Ljava/lang/String;Lcom/ichi2/anki/compat/PackageInfoFlagsCompat;)Landroid/content/pm/PackageInfo; +SPLcom/ichi2/anki/compat/CompatHelper$Companion;->getPackageInfoCompat(Landroid/content/pm/PackageManager;Ljava/lang/String;Lcom/ichi2/anki/compat/PackageInfoFlagsCompat;)Landroid/content/pm/PackageInfo; +SPLcom/ichi2/anki/compat/CompatHelper$Companion;->getSdkVersion()I +SPLcom/ichi2/anki/compat/CompatHelper$Companion;->queryIntentActivitiesCompat(Landroid/content/pm/PackageManager;Landroid/content/Intent;Lcom/ichi2/anki/compat/ResolveInfoFlagsCompat;)Ljava/util/List; +SPLcom/ichi2/anki/compat/CompatHelper$Companion;->registerReceiverCompat(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;I)Landroid/content/Intent; +SPLcom/ichi2/anki/compat/CompatHelper$Companion;->resolveActivityCompat(Landroid/content/pm/PackageManager;Landroid/content/Intent;Lcom/ichi2/anki/compat/ResolveInfoFlagsCompat;)Landroid/content/pm/ResolveInfo; +SPLcom/ichi2/anki/compat/CompatHelper$Companion;->resolveServiceCompat(Landroid/content/pm/PackageManager;Landroid/content/Intent;Lcom/ichi2/anki/compat/ResolveInfoFlagsCompat;)Landroid/content/pm/ResolveInfo; +Lcom/ichi2/anki/compat/CompatHelperKt; +SPLcom/ichi2/anki/compat/CompatHelperKt;->setDstOutBlendCompat(Landroid/graphics/Paint;)V +SPLcom/ichi2/anki/compat/CompatHelperKt;->setTooltipTextCompat(Landroid/view/View;Ljava/lang/CharSequence;)V +Lcom/ichi2/anki/compat/CompatV26; +SPLcom/ichi2/anki/compat/CompatV26;->()V +Lcom/ichi2/anki/compat/CompatV29; +SPLcom/ichi2/anki/compat/CompatV29;->()V +SPLcom/ichi2/anki/compat/CompatV29;->()V +SPLcom/ichi2/anki/compat/CompatV29;->setDstOutBlend(Landroid/graphics/Paint;)V +Lcom/ichi2/anki/compat/CompatV29$Companion; +SPLcom/ichi2/anki/compat/CompatV29$Companion;->()V +SPLcom/ichi2/anki/compat/CompatV29$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/compat/CompatV30; +SPLcom/ichi2/anki/compat/CompatV30;->()V +Lcom/ichi2/anki/compat/CompatV31; +SPLcom/ichi2/anki/compat/CompatV31;->()V +Lcom/ichi2/anki/compat/CompatV33; +SPLcom/ichi2/anki/compat/CompatV33;->()V +SPLcom/ichi2/anki/compat/CompatV33;->getPackageInfo(Landroid/content/pm/PackageManager;Ljava/lang/String;Lcom/ichi2/anki/compat/PackageInfoFlagsCompat;)Landroid/content/pm/PackageInfo; +SPLcom/ichi2/anki/compat/CompatV33;->queryIntentActivities(Landroid/content/pm/PackageManager;Landroid/content/Intent;Lcom/ichi2/anki/compat/ResolveInfoFlagsCompat;)Ljava/util/List; +SPLcom/ichi2/anki/compat/CompatV33;->resolveActivity(Landroid/content/pm/PackageManager;Landroid/content/Intent;Lcom/ichi2/anki/compat/ResolveInfoFlagsCompat;)Landroid/content/pm/ResolveInfo; +SPLcom/ichi2/anki/compat/CompatV33;->resolveService(Landroid/content/pm/PackageManager;Landroid/content/Intent;Lcom/ichi2/anki/compat/ResolveInfoFlagsCompat;)Landroid/content/pm/ResolveInfo; +Lcom/ichi2/anki/compat/CompatV34; +SPLcom/ichi2/anki/compat/CompatV34;->()V +Lcom/ichi2/anki/compat/Flags; +SPLcom/ichi2/anki/compat/Flags;->(J)V +SPLcom/ichi2/anki/compat/Flags;->getValue()J +Lcom/ichi2/anki/compat/PackageInfoFlagsCompat; +SPLcom/ichi2/anki/compat/PackageInfoFlagsCompat;->()V +SPLcom/ichi2/anki/compat/PackageInfoFlagsCompat;->(J)V +SPLcom/ichi2/anki/compat/PackageInfoFlagsCompat;->(JLkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/compat/PackageInfoFlagsCompat;->access$getEMPTY$cp()Lcom/ichi2/anki/compat/PackageInfoFlagsCompat; +Lcom/ichi2/anki/compat/PackageInfoFlagsCompat$Companion; +SPLcom/ichi2/anki/compat/PackageInfoFlagsCompat$Companion;->()V +SPLcom/ichi2/anki/compat/PackageInfoFlagsCompat$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/compat/PackageInfoFlagsCompat$Companion;->getEMPTY()Lcom/ichi2/anki/compat/PackageInfoFlagsCompat; +SPLcom/ichi2/anki/compat/PackageInfoFlagsCompat$Companion;->of(J)Lcom/ichi2/anki/compat/PackageInfoFlagsCompat; +Lcom/ichi2/anki/compat/ResolveInfoFlagsCompat; +SPLcom/ichi2/anki/compat/ResolveInfoFlagsCompat;->()V +SPLcom/ichi2/anki/compat/ResolveInfoFlagsCompat;->(J)V +SPLcom/ichi2/anki/compat/ResolveInfoFlagsCompat;->(JLkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/compat/ResolveInfoFlagsCompat$Companion; +SPLcom/ichi2/anki/compat/ResolveInfoFlagsCompat$Companion;->()V +SPLcom/ichi2/anki/compat/ResolveInfoFlagsCompat$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/compat/ResolveInfoFlagsCompat$Companion;->getEMPTY()Lcom/ichi2/anki/compat/ResolveInfoFlagsCompat; +Lcom/ichi2/anki/contextmenu/AnkiCardContextMenu; +SPLcom/ichi2/anki/contextmenu/AnkiCardContextMenu;->()V +SPLcom/ichi2/anki/contextmenu/AnkiCardContextMenu;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/contextmenu/AnkiCardContextMenu;->getActivityName()Ljava/lang/String; +Lcom/ichi2/anki/contextmenu/AnkiCardContextMenu$Companion; +SPLcom/ichi2/anki/contextmenu/AnkiCardContextMenu$Companion;->()V +SPLcom/ichi2/anki/contextmenu/AnkiCardContextMenu$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/contextmenu/AnkiCardContextMenu$Companion;->ensureConsistentStateWithPreferenceStatus(Landroid/content/Context;Z)V +Lcom/ichi2/anki/contextmenu/CardBrowserContextMenu; +SPLcom/ichi2/anki/contextmenu/CardBrowserContextMenu;->()V +SPLcom/ichi2/anki/contextmenu/CardBrowserContextMenu;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/contextmenu/CardBrowserContextMenu;->getActivityName()Ljava/lang/String; +Lcom/ichi2/anki/contextmenu/CardBrowserContextMenu$Companion; +SPLcom/ichi2/anki/contextmenu/CardBrowserContextMenu$Companion;->()V +SPLcom/ichi2/anki/contextmenu/CardBrowserContextMenu$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/contextmenu/CardBrowserContextMenu$Companion;->ensureConsistentStateWithPreferenceStatus(Landroid/content/Context;Z)V +Lcom/ichi2/anki/contextmenu/SystemContextMenu; +SPLcom/ichi2/anki/contextmenu/SystemContextMenu;->()V +SPLcom/ichi2/anki/contextmenu/SystemContextMenu;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/contextmenu/SystemContextMenu;->ensureConsistentStateWithPreferenceStatus(Z)V +SPLcom/ichi2/anki/contextmenu/SystemContextMenu;->getComponentName()Landroid/content/ComponentName; +SPLcom/ichi2/anki/contextmenu/SystemContextMenu;->getPackageManager()Landroid/content/pm/PackageManager; +SPLcom/ichi2/anki/contextmenu/SystemContextMenu;->getSystemMenuStatus()Ljava/lang/Boolean; +Lcom/ichi2/anki/databinding/ActivityHomescreenBinding; +SPLcom/ichi2/anki/databinding/ActivityHomescreenBinding;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroidx/fragment/app/FragmentContainerView;Lcom/google/android/material/bottomnavigation/BottomNavigationView;Landroid/widget/LinearLayout;Lcom/ichi2/anki/databinding/IncludeDeckPickerBinding;Lcom/ichi2/anki/ui/ResizablePaneLayout;Lcom/ichi2/anki/ui/ResizingDivider;Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroidx/fragment/app/FragmentContainerView;Landroid/widget/FrameLayout;)V +SPLcom/ichi2/anki/databinding/ActivityHomescreenBinding;->bind(Landroid/view/View;)Lcom/ichi2/anki/databinding/ActivityHomescreenBinding; +SPLcom/ichi2/anki/databinding/ActivityHomescreenBinding;->getRoot()Landroid/view/View; +SPLcom/ichi2/anki/databinding/ActivityHomescreenBinding;->getRoot()Landroidx/coordinatorlayout/widget/CoordinatorLayout; +SPLcom/ichi2/anki/databinding/ActivityHomescreenBinding;->inflate(Landroid/view/LayoutInflater;)Lcom/ichi2/anki/databinding/ActivityHomescreenBinding; +SPLcom/ichi2/anki/databinding/ActivityHomescreenBinding;->inflate(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Z)Lcom/ichi2/anki/databinding/ActivityHomescreenBinding; +Lcom/ichi2/anki/databinding/IncludeDeckPickerBinding; +SPLcom/ichi2/anki/databinding/IncludeDeckPickerBinding;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/widget/ImageView;Landroid/widget/RelativeLayout;Landroid/widget/LinearLayout;Landroidx/recyclerview/widget/RecyclerView;Lcom/ichi2/anki/ui/BottomFadeFrameLayout;Lcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding;Landroid/widget/LinearLayout;Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout;Lcom/ichi2/ui/FixedTextView;Landroidx/coordinatorlayout/widget/CoordinatorLayout;)V +SPLcom/ichi2/anki/databinding/IncludeDeckPickerBinding;->bind(Landroid/view/View;)Lcom/ichi2/anki/databinding/IncludeDeckPickerBinding; +SPLcom/ichi2/anki/databinding/IncludeDeckPickerBinding;->getRoot()Landroidx/coordinatorlayout/widget/CoordinatorLayout; +Lcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding; +SPLcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;Landroid/view/View;Landroid/widget/LinearLayout;Lcom/google/android/material/floatingactionbutton/ExtendedFloatingActionButton;)V +SPLcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding;->bind(Landroid/view/View;)Lcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding; +SPLcom/ichi2/anki/databinding/IncludeFloatingAddButtonBinding;->getRoot()Landroidx/coordinatorlayout/widget/CoordinatorLayout; +Lcom/ichi2/anki/databinding/ItemDeckBinding; +SPLcom/ichi2/anki/databinding/ItemDeckBinding;->(Landroid/widget/RelativeLayout;Landroid/widget/LinearLayout;Landroid/widget/ImageButton;Landroid/widget/RelativeLayout;Lcom/ichi2/ui/FixedTextView;Lcom/ichi2/ui/FixedTextView;Landroid/widget/LinearLayout;Lcom/ichi2/ui/FixedTextView;Lcom/ichi2/ui/FixedTextView;Landroid/widget/ImageButton;)V +SPLcom/ichi2/anki/databinding/ItemDeckBinding;->bind(Landroid/view/View;)Lcom/ichi2/anki/databinding/ItemDeckBinding; +SPLcom/ichi2/anki/databinding/ItemDeckBinding;->getRoot()Landroid/widget/RelativeLayout; +SPLcom/ichi2/anki/databinding/ItemDeckBinding;->inflate(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Z)Lcom/ichi2/anki/databinding/ItemDeckBinding; +Lcom/ichi2/anki/deckpicker/BackgroundImage; +SPLcom/ichi2/anki/deckpicker/BackgroundImage;->()V +SPLcom/ichi2/anki/deckpicker/BackgroundImage;->()V +SPLcom/ichi2/anki/deckpicker/BackgroundImage;->resolve(Landroid/content/Context;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/BackgroundImage$ResolveResult; +Lcom/ichi2/anki/deckpicker/BackgroundImage$ResolveResult$Failure; +Lcom/ichi2/anki/deckpicker/BackgroundImage$ResolveResult$None; +SPLcom/ichi2/anki/deckpicker/BackgroundImage$ResolveResult$None;->()V +SPLcom/ichi2/anki/deckpicker/BackgroundImage$ResolveResult$None;->()V +Lcom/ichi2/anki/deckpicker/BackgroundImage$ResolveResult$Ready; +Lcom/ichi2/anki/deckpicker/BackgroundImage$resolve$1; +SPLcom/ichi2/anki/deckpicker/BackgroundImage$resolve$1;->(Lcom/ichi2/anki/deckpicker/BackgroundImage;Lkotlin/coroutines/Continuation;)V +Lcom/ichi2/anki/deckpicker/DeckFilters; +SPLcom/ichi2/anki/deckpicker/DeckFilters;->()V +SPLcom/ichi2/anki/deckpicker/DeckFilters;->(Ljava/util/List;)V +SPLcom/ichi2/anki/deckpicker/DeckFilters;->accept(Ljava/lang/String;)Z +SPLcom/ichi2/anki/deckpicker/DeckFilters;->isActive()Z +Lcom/ichi2/anki/deckpicker/DeckFilters$Companion; +SPLcom/ichi2/anki/deckpicker/DeckFilters$Companion;->()V +SPLcom/ichi2/anki/deckpicker/DeckFilters$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/deckpicker/DeckFilters$Companion;->create(Ljava/lang/CharSequence;)Lcom/ichi2/anki/deckpicker/DeckFilters; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->access$getFlowOfRefreshDeckList$p(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;)Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->access$loadDeckList(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->access$refreshUndoMenuState(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->access$setDueTree(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lcom/ichi2/anki/libanki/sched/DeckNode;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->access$setSchedulerUpgradeDialogShownForVersion$p(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Ljava/lang/Long;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->fetchSyncIconState(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->findDeckPosition(J)I +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getDeckDeletedNotification()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getDueTree()Lcom/ichi2/anki/libanki/sched/DeckNode; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getEmptyCardsNotification()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfCardsDue()Lkotlinx/coroutines/flow/Flow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfCollectionHasNoCards()Lkotlinx/coroutines/flow/MutableStateFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfCreateShortcut()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDeckCountsChanged()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDeckList()Lkotlinx/coroutines/flow/StateFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDeckListInInitialState()Lkotlinx/coroutines/flow/StateFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDecksReloaded()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDeleteDeckConfirmation()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDestination()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfDisableShortcuts()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfExportDeck()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfFocusedDeck()Lkotlinx/coroutines/flow/MutableStateFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfNavigate()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfOptionsMenuState()Lkotlinx/coroutines/flow/MutableStateFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfPromptUserToUpdateScheduler()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfRenameDeck()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfResizingDividerVisible()Lkotlinx/coroutines/flow/Flow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfShowContextMenu()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfShowRightClickContextMenu()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfStartupResponse()Lkotlinx/coroutines/flow/MutableStateFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfStudiedTodayStats()Lkotlinx/coroutines/flow/MutableStateFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getFlowOfStudyDeck()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getOnError()Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getOptionsMenuState()Lcom/ichi2/anki/deckpicker/OptionsMenuState; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->getProgressManager()Lcom/ichi2/anki/progress/ProgressManager; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->handleStartup(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$AnkiDroidEnvironment;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->isDeckSearchExpanded()Z +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->loadDeckList(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->onScreenResumed()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->refreshMenuState$lambda$0(Lcom/ichi2/anki/libanki/Collection;)Lcom/ichi2/anki/deckpicker/OptionsMenuState; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->refreshMenuState(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->refreshUndoMenuState$lambda$0(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lcom/ichi2/anki/libanki/Collection;)Lkotlin/Unit; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->refreshUndoMenuState(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->reloadDeckCounts()Lkotlinx/coroutines/Job; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->setDueTree(Lcom/ichi2/anki/libanki/sched/DeckNode;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->setFocusedDeck(Ljava/lang/Long;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel;->updateDeckList()Lkotlinx/coroutines/Job; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$AnkiDroidEnvironment; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$Companion; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$Companion;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;->(Ljava/util/List;Z)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;->access$getEmpty$cp()Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;->equals(Ljava/lang/Object;)Z +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;->getData()Ljava/util/List; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList;->getHasSubDecks()Z +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList$Companion; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList$Companion;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList$Companion;->getEmpty()Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$FlattenedDeckList; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse$FatalError; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse$RequestPermissions; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse$Success; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse$Success;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse$Success;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse$Success;->equals(Ljava/lang/Object;)Z +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$StartupResponse$Success;->toString()Ljava/lang/String; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$fetchSyncIconState$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$fetchSyncIconState$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)V +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfCardsDue$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfCardsDue$1;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfCardsDue$1;->invoke(Lcom/ichi2/anki/libanki/sched/DeckNode;Ljava/lang/Boolean;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfCardsDue$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfCardsDue$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$1;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$1;->invoke(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2;->invoke(Lcom/ichi2/anki/libanki/sched/DeckNode;Ljava/lang/String;Ljava/lang/Long;Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2;->invokeSuspend$lambda$0(Lcom/ichi2/anki/libanki/Collection;)J +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckList$2$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckListInInitialState$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckListInInitialState$1;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckListInInitialState$1;->invoke(Lcom/ichi2/anki/libanki/sched/DeckNode;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckListInInitialState$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfDeckListInInitialState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfResizingDividerVisible$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfResizingDividerVisible$1;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfResizingDividerVisible$1;->invoke(Ljava/lang/Boolean;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfResizingDividerVisible$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$flowOfResizingDividerVisible$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$AnkiDroidEnvironment;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$failure$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$failure$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$AnkiDroidEnvironment;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$failure$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$failure$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$failure$1$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$handleStartup$1$failure$1$1;->(Ljava/lang/Object;)V +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$loadDeckList$2; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$loadDeckList$2;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$loadDeckList$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$loadDeckList$2;->invoke(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$loadDeckList$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$loadDeckList$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$refreshMenuState$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$refreshMenuState$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$refreshMenuState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$refreshUndoMenuState$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$refreshUndoMenuState$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$refreshUndoMenuState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->(Lcom/ichi2/anki/deckpicker/DeckPickerViewModel;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->invokeSuspend$lambda$0(Lcom/ichi2/anki/libanki/Collection;)Lkotlin/Pair; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->invokeSuspend$lambda$1(Lcom/ichi2/anki/libanki/Collection;)Ljava/lang/String; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->invokeSuspend$lambda$2(Lcom/ichi2/anki/libanki/Collection;)J +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->invokeSuspend$lambda$3(Lcom/ichi2/anki/libanki/Collection;)J +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda1;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda2;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda3;->()V +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModel$reloadDeckCounts$loadDeckCounts$1$$ExternalSyntheticLambda3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/deckpicker/DeckPickerViewModelKt; +SPLcom/ichi2/anki/deckpicker/DeckPickerViewModelKt;->onlyHasDefaultDeck(Lcom/ichi2/anki/libanki/sched/DeckNode;)Z +Lcom/ichi2/anki/deckpicker/DisplayDeckNode; +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->()V +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->(JLjava/lang/String;Ljava/lang/String;ZZIZIIIZ)V +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->(JLjava/lang/String;Ljava/lang/String;ZZIZIIIZLkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->equals(Ljava/lang/Object;)Z +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getCanCollapse()Z +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getCollapsed()Z +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getDepth()I +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getDid()J +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getFiltered()Z +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getLastDeckNameComponent()Ljava/lang/String; +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getLrnCount()I +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getNewCount()I +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->getRevCount()I +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->isSelected()Z +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode;->setDeckNode(Lcom/ichi2/anki/libanki/sched/DeckNode;)V +Lcom/ichi2/anki/deckpicker/DisplayDeckNode$Companion; +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode$Companion;->()V +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/deckpicker/DisplayDeckNode$Companion;->from(Lcom/ichi2/anki/libanki/sched/DeckNode;ZJ)Lcom/ichi2/anki/deckpicker/DisplayDeckNode; +Lcom/ichi2/anki/deckpicker/DisplayDeckNodeKt; +SPLcom/ichi2/anki/deckpicker/DisplayDeckNodeKt;->addVisibleToList(Lcom/ichi2/anki/libanki/sched/DeckNode;Ljava/util/List;ZJ)V +SPLcom/ichi2/anki/deckpicker/DisplayDeckNodeKt;->filterAndFlattenDisplay(Lcom/ichi2/anki/libanki/sched/DeckNode;Lcom/ichi2/anki/deckpicker/DeckFilters;J)Ljava/util/List; +SPLcom/ichi2/anki/deckpicker/DisplayDeckNodeKt;->filterAndFlattenDisplayInner(Lcom/ichi2/anki/libanki/sched/DeckNode;Lcom/ichi2/anki/deckpicker/DeckFilters;Ljava/util/List;ZJ)V +Lcom/ichi2/anki/deckpicker/OptionsMenuState; +SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->()V +SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->(ZLjava/lang/String;Lcom/ichi2/anki/deckpicker/SyncIconState;ZZ)V +SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->copy$default(Lcom/ichi2/anki/deckpicker/OptionsMenuState;ZLjava/lang/String;Lcom/ichi2/anki/deckpicker/SyncIconState;ZZILjava/lang/Object;)Lcom/ichi2/anki/deckpicker/OptionsMenuState; +SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->copy(ZLjava/lang/String;Lcom/ichi2/anki/deckpicker/SyncIconState;ZZ)Lcom/ichi2/anki/deckpicker/OptionsMenuState; +SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->equals(Ljava/lang/Object;)Z +SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->getSearchIcon()Z +SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->getSyncIcon()Lcom/ichi2/anki/deckpicker/SyncIconState; +SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->getUndoAvailable()Z +SPLcom/ichi2/anki/deckpicker/OptionsMenuState;->getUndoLabel()Ljava/lang/String; +Lcom/ichi2/anki/deckpicker/SyncIconState; +SPLcom/ichi2/anki/deckpicker/SyncIconState;->$values()[Lcom/ichi2/anki/deckpicker/SyncIconState; +SPLcom/ichi2/anki/deckpicker/SyncIconState;->()V +SPLcom/ichi2/anki/deckpicker/SyncIconState;->(Ljava/lang/String;I)V +SPLcom/ichi2/anki/deckpicker/SyncIconState;->values()[Lcom/ichi2/anki/deckpicker/SyncIconState; +Lcom/ichi2/anki/dialogs/BackupPromptDialog; +SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->()V +SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->(Landroid/content/Context;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->access$shouldShowDialog(Lcom/ichi2/anki/dialogs/BackupPromptDialog;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->access$userIsNewToAnkiDroid(Lcom/ichi2/anki/dialogs/BackupPromptDialog;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->getFirstInstallTime()Ljava/lang/Long; +SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->shouldShowDialog(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->userIsNewToAnkiDroid$lambda$0(Lcom/ichi2/anki/libanki/Collection;)Z +SPLcom/ichi2/anki/dialogs/BackupPromptDialog;->userIsNewToAnkiDroid(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/dialogs/BackupPromptDialog$$ExternalSyntheticLambda6; +SPLcom/ichi2/anki/dialogs/BackupPromptDialog$$ExternalSyntheticLambda6;->()V +SPLcom/ichi2/anki/dialogs/BackupPromptDialog$$ExternalSyntheticLambda6;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/dialogs/BackupPromptDialog$Companion; +SPLcom/ichi2/anki/dialogs/BackupPromptDialog$Companion;->()V +SPLcom/ichi2/anki/dialogs/BackupPromptDialog$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/dialogs/BackupPromptDialog$Companion;->showIfAvailable(Lcom/ichi2/anki/DeckPicker;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/dialogs/BackupPromptDialog$Companion$showIfAvailable$1; +SPLcom/ichi2/anki/dialogs/BackupPromptDialog$Companion$showIfAvailable$1;->(Lcom/ichi2/anki/dialogs/BackupPromptDialog$Companion;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/dialogs/BackupPromptDialog$Companion$showIfAvailable$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/dialogs/BackupPromptDialog$shouldShowDialog$1; +SPLcom/ichi2/anki/dialogs/BackupPromptDialog$shouldShowDialog$1;->(Lcom/ichi2/anki/dialogs/BackupPromptDialog;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/dialogs/BackupPromptDialog$shouldShowDialog$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/dialogs/BackupPromptDialog$userIsNewToAnkiDroid$1; +SPLcom/ichi2/anki/dialogs/BackupPromptDialog$userIsNewToAnkiDroid$1;->(Lcom/ichi2/anki/dialogs/BackupPromptDialog;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/dialogs/BackupPromptDialog$userIsNewToAnkiDroid$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption; +SPLcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption;->$values()[Lcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption; +SPLcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption;->()V +SPLcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption;->(Ljava/lang/String;I)V +SPLcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption;->values()[Lcom/ichi2/anki/dialogs/DeckPickerContextMenu$DeckPickerContextMenuOption; +Lcom/ichi2/anki/dialogs/DeckPickerContextMenuKt; +SPLcom/ichi2/anki/dialogs/DeckPickerContextMenuKt;->setDeckPickerContextMenuResultListener(Landroidx/fragment/app/FragmentActivity;Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/anki/dialogs/DeckPickerContextMenuKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/dialogs/DeckPickerContextMenuKt$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/anki/dialogs/DeckPickerMaintenanceDialog$Check; +SPLcom/ichi2/anki/dialogs/DeckPickerMaintenanceDialog$Check;->$values()[Lcom/ichi2/anki/dialogs/DeckPickerMaintenanceDialog$Check; +SPLcom/ichi2/anki/dialogs/DeckPickerMaintenanceDialog$Check;->()V +SPLcom/ichi2/anki/dialogs/DeckPickerMaintenanceDialog$Check;->(Ljava/lang/String;ILjava/lang/String;)V +SPLcom/ichi2/anki/dialogs/DeckPickerMaintenanceDialog$Check;->getRequestKey()Ljava/lang/String; +Lcom/ichi2/anki/dialogs/DialogHandler; +SPLcom/ichi2/anki/dialogs/DialogHandler;->()V +SPLcom/ichi2/anki/dialogs/DialogHandler;->(Lcom/ichi2/anki/AnkiActivity;)V +SPLcom/ichi2/anki/dialogs/DialogHandler;->executeMessage()V +SPLcom/ichi2/anki/dialogs/DialogHandler;->popMessage()Landroid/os/Message; +Lcom/ichi2/anki/dialogs/DialogHandler$Companion; +SPLcom/ichi2/anki/dialogs/DialogHandler$Companion;->()V +SPLcom/ichi2/anki/dialogs/DialogHandler$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/dialogs/ImportFileSelectionFragment$ApkgImportResultLauncherProvider; +Lcom/ichi2/anki/dialogs/ImportFileSelectionFragment$CsvImportResultLauncherProvider; +Lcom/ichi2/anki/dialogs/ImportViewModel; +SPLcom/ichi2/anki/dialogs/ImportViewModel;->()V +SPLcom/ichi2/anki/dialogs/ImportViewModel;->()V +SPLcom/ichi2/anki/dialogs/ImportViewModel;->getImportAddFlow()Lkotlinx/coroutines/flow/SharedFlow; +SPLcom/ichi2/anki/dialogs/ImportViewModel;->getImportReplaceFlow()Lkotlinx/coroutines/flow/SharedFlow; +Lcom/ichi2/anki/dialogs/LoadingDialogFragment; +Lcom/ichi2/anki/dialogs/LoadingDialogFragmentKt; +SPLcom/ichi2/anki/dialogs/LoadingDialogFragmentKt;->dismissLoadingDialog(Lcom/ichi2/anki/AnkiActivity;Ljava/lang/String;)V +SPLcom/ichi2/anki/dialogs/LoadingDialogFragmentKt;->removeImmediately(Lcom/ichi2/anki/AnkiActivity;Lcom/ichi2/anki/dialogs/LoadingDialogFragment;)V +Lcom/ichi2/anki/dialogs/SyncErrorDialog$SyncErrorDialogListener; +Lcom/ichi2/anki/dialogs/customstudy/CustomStudyDialog$CustomStudyAction; +SPLcom/ichi2/anki/dialogs/customstudy/CustomStudyDialog$CustomStudyAction;->$values()[Lcom/ichi2/anki/dialogs/customstudy/CustomStudyDialog$CustomStudyAction; +SPLcom/ichi2/anki/dialogs/customstudy/CustomStudyDialog$CustomStudyAction;->()V +SPLcom/ichi2/anki/dialogs/customstudy/CustomStudyDialog$CustomStudyAction;->(Ljava/lang/String;I)V +SPLcom/ichi2/anki/dialogs/customstudy/CustomStudyDialog$CustomStudyAction;->values()[Lcom/ichi2/anki/dialogs/customstudy/CustomStudyDialog$CustomStudyAction; +Lcom/ichi2/anki/dialogs/customstudy/CustomStudyDialog$CustomStudyAction$Companion; +SPLcom/ichi2/anki/dialogs/customstudy/CustomStudyDialog$CustomStudyAction$Companion;->()V +SPLcom/ichi2/anki/dialogs/customstudy/CustomStudyDialog$CustomStudyAction$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/dialogs/tags/TagsDialogListener; +SPLcom/ichi2/anki/dialogs/tags/TagsDialogListener;->()V +Lcom/ichi2/anki/dialogs/tags/TagsDialogListener$Companion; +SPLcom/ichi2/anki/dialogs/tags/TagsDialogListener$Companion;->()V +SPLcom/ichi2/anki/dialogs/tags/TagsDialogListener$Companion;->()V +Lcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel; +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel;->()V +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel;->(Landroidx/lifecycle/SavedStateHandle;)V +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel;->access$getFactory$cp()Landroidx/lifecycle/ViewModelProvider$Factory; +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel;->getExportReadyDestination()Lkotlinx/coroutines/flow/StateFlow; +Lcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$Companion; +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$Companion;->()V +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$Companion;->getFactory()Landroidx/lifecycle/ViewModelProvider$Factory; +Lcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$special$$inlined$savedStateViewModelFactory$1; +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$special$$inlined$savedStateViewModelFactory$1;->()V +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$special$$inlined$savedStateViewModelFactory$1;->invoke(Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +SPLcom/ichi2/anki/dialogs/viewmodel/ExportReadyViewModel$special$$inlined$savedStateViewModelFactory$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/exception/CollectionLockedException; +SPLcom/ichi2/anki/exception/CollectionLockedException;->()V +SPLcom/ichi2/anki/exception/CollectionLockedException;->access$setMessageProvider$cp(Lkotlin/jvm/functions/Function0;)V +Lcom/ichi2/anki/exception/CollectionLockedException$Companion; +SPLcom/ichi2/anki/exception/CollectionLockedException$Companion;->()V +SPLcom/ichi2/anki/exception/CollectionLockedException$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/exception/CollectionLockedException$Companion;->setMessageProvider(Lkotlin/jvm/functions/Function0;)V +Lcom/ichi2/anki/exception/SanitizedReportCollector; +SPLcom/ichi2/anki/exception/SanitizedReportCollector;->()V +SPLcom/ichi2/anki/exception/SanitizedReportCollector;->()V +SPLcom/ichi2/anki/exception/SanitizedReportCollector;->enabled(Lorg/acra/config/CoreConfiguration;)Z +SPLcom/ichi2/anki/exception/SanitizedReportCollector;->getOrder()Lorg/acra/collector/Collector$Order; +Lcom/ichi2/anki/exception/StorageAccessException; +Lcom/ichi2/anki/exception/StorageNotConfiguredException; +Lcom/ichi2/anki/exception/SystemStorageException; +Lcom/ichi2/anki/i18n/LocaleCodesKt; +SPLcom/ichi2/anki/i18n/LocaleCodesKt;->()V +SPLcom/ichi2/anki/i18n/LocaleCodesKt;->normalize(Ljava/util/Locale;)Ljava/util/Locale; +SPLcom/ichi2/anki/i18n/LocaleCodesKt;->toAnkiTwoLetterCode(Ljava/util/Locale;)Ljava/lang/String; +Lcom/ichi2/anki/i18n/LocaleCodesKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/i18n/LocaleCodesKt$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/introduction/CollectionPermissionScreenLauncher; +SPLcom/ichi2/anki/introduction/CollectionPermissionScreenLauncher;->recreateActivityResultLauncher(Lcom/ichi2/anki/AnkiActivity;)Landroidx/activity/result/ActivityResultLauncher; +Lcom/ichi2/anki/introduction/CollectionPermissionScreenLauncher$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/introduction/CollectionPermissionScreenLauncher$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/AnkiActivity;)V +Lcom/ichi2/anki/introduction/CollectionPermissionScreenLauncherKt; +SPLcom/ichi2/anki/introduction/CollectionPermissionScreenLauncherKt;->hasCollectionStoragePermissions(Lcom/ichi2/anki/AnkiActivity;)Z +Lcom/ichi2/anki/libanki/BackendUndoKt; +SPLcom/ichi2/anki/libanki/BackendUndoKt;->undoAvailable(Lcom/ichi2/anki/libanki/Collection;)Z +SPLcom/ichi2/anki/libanki/BackendUndoKt;->undoLabel(Lcom/ichi2/anki/libanki/Collection;)Ljava/lang/String; +Lcom/ichi2/anki/libanki/Collection; +SPLcom/ichi2/anki/libanki/Collection;->(Lcom/ichi2/anki/libanki/CollectionFiles;Lnet/ankiweb/rsdroid/Backend;Lkotlin/jvm/functions/Function1;)V +SPLcom/ichi2/anki/libanki/Collection;->_loadScheduler()V +SPLcom/ichi2/anki/libanki/Collection;->cardCount()I +SPLcom/ichi2/anki/libanki/Collection;->createBackup(Ljava/lang/String;ZZ)Z +SPLcom/ichi2/anki/libanki/Collection;->getBackend()Lnet/ankiweb/rsdroid/Backend; +SPLcom/ichi2/anki/libanki/Collection;->getColDb()Ljava/io/File; +SPLcom/ichi2/anki/libanki/Collection;->getCollectionFiles()Lcom/ichi2/anki/libanki/CollectionFiles; +SPLcom/ichi2/anki/libanki/Collection;->getConfig()Lcom/ichi2/anki/libanki/Config; +SPLcom/ichi2/anki/libanki/Collection;->getDb()Lcom/ichi2/anki/libanki/DB; +SPLcom/ichi2/anki/libanki/Collection;->getDecks()Lcom/ichi2/anki/libanki/Decks; +SPLcom/ichi2/anki/libanki/Collection;->getSched()Lcom/ichi2/anki/libanki/sched/Scheduler; +SPLcom/ichi2/anki/libanki/Collection;->isDbClosed()Z +SPLcom/ichi2/anki/libanki/Collection;->isEmpty()Z +SPLcom/ichi2/anki/libanki/Collection;->load()V +SPLcom/ichi2/anki/libanki/Collection;->reopen$default(Lcom/ichi2/anki/libanki/Collection;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Z +SPLcom/ichi2/anki/libanki/Collection;->reopen(ZLkotlin/jvm/functions/Function1;)Z +SPLcom/ichi2/anki/libanki/Collection;->schedVer()I +SPLcom/ichi2/anki/libanki/Collection;->setConfig(Lcom/ichi2/anki/libanki/Config;)V +SPLcom/ichi2/anki/libanki/Collection;->setDecks(Lcom/ichi2/anki/libanki/Decks;)V +SPLcom/ichi2/anki/libanki/Collection;->setNotetypes(Lcom/ichi2/anki/libanki/Notetypes;)V +SPLcom/ichi2/anki/libanki/Collection;->setSched(Lcom/ichi2/anki/libanki/sched/Scheduler;)V +SPLcom/ichi2/anki/libanki/Collection;->undoStatus()Lcom/ichi2/anki/libanki/UndoStatus; +Lcom/ichi2/anki/libanki/CollectionFiles; +SPLcom/ichi2/anki/libanki/CollectionFiles;->()V +SPLcom/ichi2/anki/libanki/CollectionFiles;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/libanki/CollectionFiles;->requireDiskBasedCollection()Lcom/ichi2/anki/libanki/CollectionFiles$FolderBasedCollection; +Lcom/ichi2/anki/libanki/CollectionFiles$FolderBasedCollection; +SPLcom/ichi2/anki/libanki/CollectionFiles$FolderBasedCollection;->(Ljava/io/File;Ljava/lang/String;)V +SPLcom/ichi2/anki/libanki/CollectionFiles$FolderBasedCollection;->(Ljava/io/File;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/libanki/CollectionFiles$FolderBasedCollection;->getColDb()Ljava/io/File; +SPLcom/ichi2/anki/libanki/CollectionFiles$FolderBasedCollection;->getMediaFolder()Ljava/io/File; +Lcom/ichi2/anki/libanki/CollectionFiles$InMemory; +Lcom/ichi2/anki/libanki/CollectionFiles$InMemoryWithMedia; +Lcom/ichi2/anki/libanki/CollectionKt; +SPLcom/ichi2/anki/libanki/CollectionKt;->getMediaFolder(Lcom/ichi2/anki/libanki/Collection;)Ljava/io/File; +Lcom/ichi2/anki/libanki/Config; +SPLcom/ichi2/anki/libanki/Config;->(Lnet/ankiweb/rsdroid/Backend;)V +SPLcom/ichi2/anki/libanki/Config;->getBackend()Lnet/ankiweb/rsdroid/Backend; +Lcom/ichi2/anki/libanki/DB; +SPLcom/ichi2/anki/libanki/DB;->()V +SPLcom/ichi2/anki/libanki/DB;->(Landroidx/sqlite/db/SupportSQLiteDatabase;)V +SPLcom/ichi2/anki/libanki/DB;->queryScalar(Ljava/lang/String;[Ljava/lang/Object;)I +Lcom/ichi2/anki/libanki/DB$Companion; +SPLcom/ichi2/anki/libanki/DB$Companion;->()V +SPLcom/ichi2/anki/libanki/DB$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/libanki/Deck; +SPLcom/ichi2/anki/libanki/Deck;->()V +SPLcom/ichi2/anki/libanki/Deck;->(Lorg/json/JSONObject;)V +SPLcom/ichi2/anki/libanki/Deck;->getId()J +SPLcom/ichi2/anki/libanki/Deck;->getJsonObject()Lorg/json/JSONObject; +Lcom/ichi2/anki/libanki/DeckNameId; +SPLcom/ichi2/anki/libanki/DeckNameId;->(Ljava/lang/String;J)V +Lcom/ichi2/anki/libanki/Decks; +SPLcom/ichi2/anki/libanki/Decks;->()V +SPLcom/ichi2/anki/libanki/Decks;->(Lcom/ichi2/anki/libanki/Collection;)V +SPLcom/ichi2/anki/libanki/Decks;->allNamesAndIds$default(Lcom/ichi2/anki/libanki/Decks;ZZILjava/lang/Object;)Ljava/util/List; +SPLcom/ichi2/anki/libanki/Decks;->allNamesAndIds(ZZ)Ljava/util/List; +SPLcom/ichi2/anki/libanki/Decks;->count()I +SPLcom/ichi2/anki/libanki/Decks;->current()Lcom/ichi2/anki/libanki/Deck; +SPLcom/ichi2/anki/libanki/Decks;->getCurrentId()J +SPLcom/ichi2/anki/libanki/Decks;->getLegacy(J)Lcom/ichi2/anki/libanki/Deck; +SPLcom/ichi2/anki/libanki/Decks;->selected()J +Lcom/ichi2/anki/libanki/Decks$Companion; +SPLcom/ichi2/anki/libanki/Decks$Companion;->()V +SPLcom/ichi2/anki/libanki/Decks$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/libanki/LibAnki; +SPLcom/ichi2/anki/libanki/LibAnki;->()V +SPLcom/ichi2/anki/libanki/LibAnki;->()V +SPLcom/ichi2/anki/libanki/LibAnki;->getBackend()Lnet/ankiweb/rsdroid/Backend; +SPLcom/ichi2/anki/libanki/LibAnki;->getCollection()Lcom/ichi2/anki/libanki/Collection; +SPLcom/ichi2/anki/libanki/LibAnki;->setBackend(Lnet/ankiweb/rsdroid/Backend;)V +SPLcom/ichi2/anki/libanki/LibAnki;->setCollection(Lcom/ichi2/anki/libanki/Collection;)V +Lcom/ichi2/anki/libanki/Media; +SPLcom/ichi2/anki/libanki/Media;->()V +SPLcom/ichi2/anki/libanki/Media;->(Lcom/ichi2/anki/libanki/Collection;)V +Lcom/ichi2/anki/libanki/Media$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/libanki/Media$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/libanki/Media;)V +Lcom/ichi2/anki/libanki/Media$Companion; +SPLcom/ichi2/anki/libanki/Media$Companion;->()V +SPLcom/ichi2/anki/libanki/Media$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/libanki/Notetypes; +SPLcom/ichi2/anki/libanki/Notetypes;->()V +SPLcom/ichi2/anki/libanki/Notetypes;->(Lcom/ichi2/anki/libanki/Collection;)V +Lcom/ichi2/anki/libanki/Notetypes$Companion; +SPLcom/ichi2/anki/libanki/Notetypes$Companion;->()V +SPLcom/ichi2/anki/libanki/Notetypes$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/libanki/Storage; +SPLcom/ichi2/anki/libanki/Storage;->()V +SPLcom/ichi2/anki/libanki/Storage;->()V +SPLcom/ichi2/anki/libanki/Storage;->collection(Lcom/ichi2/anki/libanki/CollectionFiles;Lkotlin/jvm/functions/Function1;Lnet/ankiweb/rsdroid/Backend;)Lcom/ichi2/anki/libanki/Collection; +SPLcom/ichi2/anki/libanki/Storage;->openDB$libanki(Lcom/ichi2/anki/libanki/Storage$OpenDbArgs;Lnet/ankiweb/rsdroid/Backend;ZLkotlin/jvm/functions/Function1;)Lkotlin/Pair; +Lcom/ichi2/anki/libanki/Storage$OpenDbArgs; +SPLcom/ichi2/anki/libanki/Storage$OpenDbArgs;->()V +SPLcom/ichi2/anki/libanki/Storage$OpenDbArgs;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/libanki/Storage$OpenDbArgs;->getCollectionPath()Ljava/lang/String; +SPLcom/ichi2/anki/libanki/Storage$OpenDbArgs;->isNewDatabase()Z +Lcom/ichi2/anki/libanki/Storage$OpenDbArgs$InMemory; +Lcom/ichi2/anki/libanki/Storage$OpenDbArgs$Path; +SPLcom/ichi2/anki/libanki/Storage$OpenDbArgs$Path;->(Ljava/io/File;)V +SPLcom/ichi2/anki/libanki/Storage$OpenDbArgs$Path;->getPath()Ljava/io/File; +SPLcom/ichi2/anki/libanki/Storage$OpenDbArgs$Path;->toString()Ljava/lang/String; +Lcom/ichi2/anki/libanki/Tags; +SPLcom/ichi2/anki/libanki/Tags;->(Lcom/ichi2/anki/libanki/Collection;)V +Lcom/ichi2/anki/libanki/TemplateManager; +SPLcom/ichi2/anki/libanki/TemplateManager;->()V +SPLcom/ichi2/anki/libanki/TemplateManager;->access$getFieldFilters$cp()Ljava/util/Map; +Lcom/ichi2/anki/libanki/TemplateManager$Companion; +SPLcom/ichi2/anki/libanki/TemplateManager$Companion;->()V +SPLcom/ichi2/anki/libanki/TemplateManager$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/libanki/TemplateManager$Companion;->getFieldFilters()Ljava/util/Map; +Lcom/ichi2/anki/libanki/TemplateManager$FieldFilter; +Lcom/ichi2/anki/libanki/TtsVoice; +SPLcom/ichi2/anki/libanki/TtsVoice;->(Ljava/lang/String;Ljava/lang/String;)V +Lcom/ichi2/anki/libanki/UndoStatus; +SPLcom/ichi2/anki/libanki/UndoStatus;->()V +SPLcom/ichi2/anki/libanki/UndoStatus;->(Ljava/lang/String;Ljava/lang/String;I)V +SPLcom/ichi2/anki/libanki/UndoStatus;->getUndo()Ljava/lang/String; +Lcom/ichi2/anki/libanki/UndoStatus$Companion; +SPLcom/ichi2/anki/libanki/UndoStatus$Companion;->()V +SPLcom/ichi2/anki/libanki/UndoStatus$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/libanki/UndoStatus$Companion;->from(Lanki/collection/UndoStatus;)Lcom/ichi2/anki/libanki/UndoStatus; +Lcom/ichi2/anki/libanki/backend/BackendUtils; +SPLcom/ichi2/anki/libanki/backend/BackendUtils;->()V +SPLcom/ichi2/anki/libanki/backend/BackendUtils;->()V +SPLcom/ichi2/anki/libanki/backend/BackendUtils;->fromJsonBytes(Lcom/google/protobuf/ByteString;)Lorg/json/JSONObject; +Lcom/ichi2/anki/libanki/exception/ConfirmModSchemaException; +Lcom/ichi2/anki/libanki/exception/EmptyMediaException; +Lcom/ichi2/anki/libanki/sched/DeckNode; +SPLcom/ichi2/anki/libanki/sched/DeckNode;->(Lanki/decks/DeckTreeNode;Ljava/lang/String;Ljava/lang/ref/WeakReference;)V +SPLcom/ichi2/anki/libanki/sched/DeckNode;->(Lanki/decks/DeckTreeNode;Ljava/lang/String;Ljava/lang/ref/WeakReference;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/libanki/sched/DeckNode;->find(J)Lcom/ichi2/anki/libanki/sched/DeckNode; +SPLcom/ichi2/anki/libanki/sched/DeckNode;->getChildren()Ljava/util/List; +SPLcom/ichi2/anki/libanki/sched/DeckNode;->getCollapsed()Z +SPLcom/ichi2/anki/libanki/sched/DeckNode;->getDepth()I +SPLcom/ichi2/anki/libanki/sched/DeckNode;->getDid()J +SPLcom/ichi2/anki/libanki/sched/DeckNode;->getFiltered()Z +SPLcom/ichi2/anki/libanki/sched/DeckNode;->getFullDeckName()Ljava/lang/String; +SPLcom/ichi2/anki/libanki/sched/DeckNode;->getLastDeckNameComponent()Ljava/lang/String; +SPLcom/ichi2/anki/libanki/sched/DeckNode;->getLrnCount()I +SPLcom/ichi2/anki/libanki/sched/DeckNode;->getNewCount()I +SPLcom/ichi2/anki/libanki/sched/DeckNode;->getParent()Ljava/lang/ref/WeakReference; +SPLcom/ichi2/anki/libanki/sched/DeckNode;->getRevCount()I +SPLcom/ichi2/anki/libanki/sched/DeckNode;->isSyntheticDeck()Z +SPLcom/ichi2/anki/libanki/sched/DeckNode;->totalCardsDue()I +Lcom/ichi2/anki/libanki/sched/Scheduler; +SPLcom/ichi2/anki/libanki/sched/Scheduler;->(Lcom/ichi2/anki/libanki/Collection;)V +SPLcom/ichi2/anki/libanki/sched/Scheduler;->deckDueTree()Lcom/ichi2/anki/libanki/sched/DeckNode; +SPLcom/ichi2/anki/libanki/sched/Scheduler;->deckTree(Z)Lcom/ichi2/anki/libanki/sched/DeckNode; +SPLcom/ichi2/anki/libanki/sched/Scheduler;->getDayCutoff()J +SPLcom/ichi2/anki/libanki/sched/Scheduler;->studiedToday()Ljava/lang/String; +SPLcom/ichi2/anki/libanki/sched/Scheduler;->timingToday()Lanki/scheduler/SchedTimingTodayResponse; +Lcom/ichi2/anki/libanki/utils/PythonExtensionsKt; +SPLcom/ichi2/anki/libanki/utils/PythonExtensionsKt;->append(Ljava/util/List;Ljava/lang/Object;)V +SPLcom/ichi2/anki/libanki/utils/PythonExtensionsKt;->len(Ljava/util/List;)I +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->()V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation$lambda$2(Landroid/content/Intent;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation$lambda$3(Landroid/content/Intent;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation$lambda$4(Landroid/app/Activity;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation$lambda$5(Landroid/app/Activity;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation$lambda$6(Landroid/app/Activity;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation$lambda$7(Landroid/os/Bundle;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->logActivityCreation(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->readSafely(Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt;->summarizeNames(Ljava/util/Set;Ljava/util/Set;)Ljava/util/Map; +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda1;->(Landroid/content/Intent;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda1;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda2;->(Landroid/content/Intent;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda2;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda3;->(Landroid/app/Activity;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda3;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda4;->(Landroid/app/Activity;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda4;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda5; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda5;->(Landroid/app/Activity;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda5;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda6; +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda6;->(Landroid/os/Bundle;)V +SPLcom/ichi2/anki/logging/ActivityLaunchLoggerKt$$ExternalSyntheticLambda6;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/logging/FragmentLifecycleLogger; +SPLcom/ichi2/anki/logging/FragmentLifecycleLogger;->()V +SPLcom/ichi2/anki/logging/FragmentLifecycleLogger;->(Landroid/app/Activity;)V +Lcom/ichi2/anki/logging/LogType; +SPLcom/ichi2/anki/logging/LogType;->$values()[Lcom/ichi2/anki/logging/LogType; +SPLcom/ichi2/anki/logging/LogType;->()V +SPLcom/ichi2/anki/logging/LogType;->(Ljava/lang/String;I)V +SPLcom/ichi2/anki/logging/LogType;->values()[Lcom/ichi2/anki/logging/LogType; +Lcom/ichi2/anki/logging/LogType$Companion; +SPLcom/ichi2/anki/logging/LogType$Companion;->()V +SPLcom/ichi2/anki/logging/LogType$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/logging/LogType$Companion;->getValue()Lcom/ichi2/anki/logging/LogType; +Lcom/ichi2/anki/logging/ProductionCrashReportingTree; +SPLcom/ichi2/anki/logging/ProductionCrashReportingTree;->()V +SPLcom/ichi2/anki/logging/ProductionCrashReportingTree;->()V +PLcom/ichi2/anki/logging/ProductionCrashReportingTree;->createStackElementTag(Ljava/lang/StackTraceElement;)Ljava/lang/String; +PLcom/ichi2/anki/logging/ProductionCrashReportingTree;->getTag()Ljava/lang/String; +SPLcom/ichi2/anki/logging/ProductionCrashReportingTree;->log(ILjava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V +Lcom/ichi2/anki/logging/ProductionCrashReportingTree$Companion; +SPLcom/ichi2/anki/logging/ProductionCrashReportingTree$Companion;->()V +SPLcom/ichi2/anki/logging/ProductionCrashReportingTree$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/logging/TimberLogger; +SPLcom/ichi2/anki/logging/TimberLogger;->(Ljava/lang/String;)V +SPLcom/ichi2/anki/logging/TimberLogger;->handleNormalizedLoggingCall(Lorg/slf4j/event/Level;Lorg/slf4j/Marker;Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V +SPLcom/ichi2/anki/logging/TimberLogger;->isDebugEnabled()Z +SPLcom/ichi2/anki/logging/TimberLogger;->isInfoEnabled()Z +Lcom/ichi2/anki/logging/TimberLoggerFactory; +SPLcom/ichi2/anki/logging/TimberLoggerFactory;->()V +SPLcom/ichi2/anki/logging/TimberLoggerFactory;->getLogger$lambda$0(Ljava/lang/String;)Lorg/slf4j/Logger; +SPLcom/ichi2/anki/logging/TimberLoggerFactory;->getLogger$lambda$1(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Lorg/slf4j/Logger; +SPLcom/ichi2/anki/logging/TimberLoggerFactory;->getLogger(Ljava/lang/String;)Lorg/slf4j/Logger; +Lcom/ichi2/anki/logging/TimberLoggerFactory$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/logging/TimberLoggerFactory$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/logging/TimberLoggerFactory$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/logging/TimberLoggerFactory$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/logging/TimberLoggerFactory$$ExternalSyntheticLambda1;->(Lkotlin/jvm/functions/Function1;)V +SPLcom/ichi2/anki/logging/TimberLoggerFactory$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/logging/TimberServiceProvider; +SPLcom/ichi2/anki/logging/TimberServiceProvider;->()V +SPLcom/ichi2/anki/logging/TimberServiceProvider;->()V +SPLcom/ichi2/anki/logging/TimberServiceProvider;->getLoggerFactory()Lorg/slf4j/ILoggerFactory; +SPLcom/ichi2/anki/logging/TimberServiceProvider;->getMDCAdapter()Lorg/slf4j/spi/MDCAdapter; +SPLcom/ichi2/anki/logging/TimberServiceProvider;->getRequestedApiVersion()Ljava/lang/String; +SPLcom/ichi2/anki/logging/TimberServiceProvider;->initialize()V +Lcom/ichi2/anki/logging/TimberServiceProviderKt; +SPLcom/ichi2/anki/logging/TimberServiceProviderKt;->access$getPriority(Lorg/slf4j/event/Level;)I +SPLcom/ichi2/anki/logging/TimberServiceProviderKt;->getPriority(Lorg/slf4j/event/Level;)I +Lcom/ichi2/anki/logging/TimberServiceProviderKt$WhenMappings; +SPLcom/ichi2/anki/logging/TimberServiceProviderKt$WhenMappings;->()V +Lcom/ichi2/anki/model/FieldFilter; +Lcom/ichi2/anki/model/FieldFilters$NoSuggestFilter; +SPLcom/ichi2/anki/model/FieldFilters$NoSuggestFilter;->()V +SPLcom/ichi2/anki/model/FieldFilters$NoSuggestFilter;->()V +SPLcom/ichi2/anki/model/FieldFilters$NoSuggestFilter;->ensureApplied()V +SPLcom/ichi2/anki/model/FieldFilters$NoSuggestFilter;->getName()Ljava/lang/String; +Lcom/ichi2/anki/multimedia/MultimediaArgsStorage; +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage;->()V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage;->(Ljava/io/File;)V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage;->(Ljava/io/File;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage;->removeExpiredFiles$default(Lcom/ichi2/anki/multimedia/MultimediaArgsStorage;JILjava/lang/Object;)V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage;->removeExpiredFiles$lambda$0(Ljava/io/File;Ljava/lang/String;)Z +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage;->removeExpiredFiles(J)V +Lcom/ichi2/anki/multimedia/MultimediaArgsStorage$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage$$ExternalSyntheticLambda0;->accept(Ljava/io/File;Ljava/lang/String;)Z +Lcom/ichi2/anki/multimedia/MultimediaArgsStorage$Companion; +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage$Companion;->()V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/multimedia/MultimediaArgsStorage$Companion;->create(Landroid/content/Context;)Lcom/ichi2/anki/multimedia/MultimediaArgsStorage; +Lcom/ichi2/anki/multiprofile/AppRestartKt; +SPLcom/ichi2/anki/multiprofile/AppRestartKt;->currentProcessName()Ljava/lang/String; +SPLcom/ichi2/anki/multiprofile/AppRestartKt;->isPhoenixProcess()Z +SPLcom/ichi2/anki/multiprofile/AppRestartKt;->isPhoenixProcessName(Ljava/lang/String;)Z +Lcom/ichi2/anki/multiprofile/ProfileContextWrapper; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->()V +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->(Landroid/content/Context;Ljava/lang/String;Ljava/io/File;)V +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->(Landroid/content/Context;Ljava/lang/String;Ljava/io/File;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->access$requireCustomDirectories(Lcom/ichi2/anki/multiprofile/ProfileContextWrapper;)V +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getCacheDir()Ljava/io/File; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getDatabasePath(Ljava/lang/String;)Ljava/io/File; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getDir(Ljava/lang/String;I)Ljava/io/File; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getFilesDir()Ljava/io/File; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getNoBackupFilesDir()Ljava/io/File; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getProfileId-evi8WI0()Ljava/lang/String; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper;->requireCustomDirectories()V +Lcom/ichi2/anki/multiprofile/ProfileContextWrapper$Companion; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper$Companion;->()V +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper$Companion;->create-vKkjgeQ(Landroid/content/Context;Ljava/lang/String;Ljava/io/File;)Lcom/ichi2/anki/multiprofile/ProfileContextWrapper; +SPLcom/ichi2/anki/multiprofile/ProfileContextWrapper$Companion;->requirePathInFilesDir(Ljava/io/File;Landroid/content/Context;)V +Lcom/ichi2/anki/multiprofile/ProfileId; +SPLcom/ichi2/anki/multiprofile/ProfileId;->()V +SPLcom/ichi2/anki/multiprofile/ProfileId;->constructor-impl(Ljava/lang/String;)Ljava/lang/String; +SPLcom/ichi2/anki/multiprofile/ProfileId;->equals-impl0(Ljava/lang/String;Ljava/lang/String;)Z +SPLcom/ichi2/anki/multiprofile/ProfileId;->isDefault-impl(Ljava/lang/String;)Z +SPLcom/ichi2/anki/multiprofile/ProfileId;->toString-impl(Ljava/lang/String;)Ljava/lang/String; +Lcom/ichi2/anki/multiprofile/ProfileId$Companion; +SPLcom/ichi2/anki/multiprofile/ProfileId$Companion;->()V +SPLcom/ichi2/anki/multiprofile/ProfileId$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/multiprofile/ProfileManager; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->()V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->(Landroid/content/Context;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->access$getAttachError$cp()Ljava/lang/Throwable; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->access$initializeActiveProfile(Lcom/ichi2/anki/multiprofile/ProfileManager;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->access$setAttachError$cp(Ljava/lang/Throwable;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->configureWebView-eoBvq2w(Ljava/lang/String;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->ensureProfileCollectionPath(Lcom/ichi2/anki/multiprofile/ProfileContextWrapper;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->getActiveProfileContext()Landroid/content/Context; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->getGlobalProfilePrefs()Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->getProfileRegistry()Lcom/ichi2/anki/multiprofile/ProfileManager$ProfileRegistry; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->globalProfilePrefs_delegate$lambda$0(Lcom/ichi2/anki/multiprofile/ProfileManager;)Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->initializeActiveProfile()V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->loadProfileData-eoBvq2w(Ljava/lang/String;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager;->profileRegistry_delegate$lambda$0(Lcom/ichi2/anki/multiprofile/ProfileManager;)Lcom/ichi2/anki/multiprofile/ProfileManager$ProfileRegistry; +SPLcom/ichi2/anki/multiprofile/ProfileManager;->resolveProfileDirectory-TRoClbo(Ljava/lang/String;)Ljava/io/File; +Lcom/ichi2/anki/multiprofile/ProfileManager$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/multiprofile/ProfileManager$$ExternalSyntheticLambda3;->(Lcom/ichi2/anki/multiprofile/ProfileManager;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager$$ExternalSyntheticLambda3;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/multiprofile/ProfileManager$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/multiprofile/ProfileManager$$ExternalSyntheticLambda4;->(Lcom/ichi2/anki/multiprofile/ProfileManager;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager$$ExternalSyntheticLambda4;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/multiprofile/ProfileManager$Companion; +SPLcom/ichi2/anki/multiprofile/ProfileManager$Companion;->()V +SPLcom/ichi2/anki/multiprofile/ProfileManager$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager$Companion;->create(Landroid/content/Context;)Lcom/ichi2/anki/multiprofile/ProfileManager; +SPLcom/ichi2/anki/multiprofile/ProfileManager$Companion;->createOrNull(Landroid/content/Context;)Lcom/ichi2/anki/multiprofile/ProfileManager; +SPLcom/ichi2/anki/multiprofile/ProfileManager$Companion;->getAttachError()Ljava/lang/Throwable; +Lcom/ichi2/anki/multiprofile/ProfileManager$ProfileRegistry; +SPLcom/ichi2/anki/multiprofile/ProfileManager$ProfileRegistry;->(Landroid/content/SharedPreferences;)V +SPLcom/ichi2/anki/multiprofile/ProfileManager$ProfileRegistry;->getLastActiveProfileId-K_c7ANI()Ljava/lang/String; +Lcom/ichi2/anki/multiprofile/ProfileRestrictedDirectory; +SPLcom/ichi2/anki/multiprofile/ProfileRestrictedDirectory;->constructor-impl(Ljava/io/File;)Ljava/io/File; +Lcom/ichi2/anki/navigation/AnkiDroidNavigator; +SPLcom/ichi2/anki/navigation/AnkiDroidNavigator;->()V +SPLcom/ichi2/anki/navigation/AnkiDroidNavigator;->()V +SPLcom/ichi2/anki/navigation/AnkiDroidNavigator;->initialize(Landroid/app/Application;)V +SPLcom/ichi2/anki/navigation/AnkiDroidNavigator;->toIntent(Lcom/ichi2/anki/common/destinations/Destination;)Landroid/content/Intent; +Lcom/ichi2/anki/navigation/AnkiDroidNavigatorKt; +SPLcom/ichi2/anki/navigation/AnkiDroidNavigatorKt;->initializeNavigator(Landroid/app/Application;)V +Lcom/ichi2/anki/noteeditor/NoteEditorDestinationKt; +SPLcom/ichi2/anki/noteeditor/NoteEditorDestinationKt;->toIntent(Lcom/ichi2/anki/common/destinations/NoteEditorDestination;Landroid/content/Context;)Landroid/content/Intent; +Lcom/ichi2/anki/noteeditor/NoteEditorFragmentDelegate; +Lcom/ichi2/anki/observability/ChangeManager; +SPLcom/ichi2/anki/observability/ChangeManager;->()V +SPLcom/ichi2/anki/observability/ChangeManager;->()V +SPLcom/ichi2/anki/observability/ChangeManager;->access$getSubscribers$p()Ljava/util/concurrent/CopyOnWriteArrayList; +SPLcom/ichi2/anki/observability/ChangeManager;->setThrowOnDuplicateSubscription(Z)V +SPLcom/ichi2/anki/observability/ChangeManager;->subscribe$default(Lcom/ichi2/anki/observability/ChangeManager;Lcom/ichi2/anki/observability/ChangeManager$Subscriber;Landroidx/lifecycle/LifecycleOwner;ILjava/lang/Object;)V +SPLcom/ichi2/anki/observability/ChangeManager;->subscribe(Lcom/ichi2/anki/observability/ChangeManager$Subscriber;Landroidx/lifecycle/LifecycleOwner;)V +Lcom/ichi2/anki/observability/ChangeManager$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/observability/ChangeManager$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/observability/ChangeManager$Subscriber; +Lcom/ichi2/anki/observability/ChangeManager$subscribe$2; +SPLcom/ichi2/anki/observability/ChangeManager$subscribe$2;->(Ljava/lang/ref/WeakReference;Lcom/ichi2/anki/observability/ChangeManager$Subscriber;)V +SPLcom/ichi2/anki/observability/ChangeManager$subscribe$2;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/observability/ChangeManager$subscribe$2;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/observability/ChangeManager$subscribe$2;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +Lcom/ichi2/anki/observability/OpChangesPublisher; +SPLcom/ichi2/anki/observability/OpChangesPublisher;->()V +SPLcom/ichi2/anki/observability/OpChangesPublisher;->(Lkotlin/jvm/functions/Function2;)V +Lcom/ichi2/anki/pages/PostRequestHandler; +Lcom/ichi2/anki/preferences/SharedPreferencesProvider; +Lcom/ichi2/anki/progress/HasProgress; +Lcom/ichi2/anki/progress/ProgressManager; +SPLcom/ichi2/anki/progress/ProgressManager;->()V +SPLcom/ichi2/anki/progress/ProgressManager;->()V +SPLcom/ichi2/anki/progress/ProgressManager;->getProgress()Lkotlinx/coroutines/flow/StateFlow; +Lcom/ichi2/anki/progress/ProgressObserverKt; +SPLcom/ichi2/anki/progress/ProgressObserverKt;->()V +SPLcom/ichi2/anki/progress/ProgressObserverKt;->access$observeProgress_exY8QGI$unblockInput(Lkotlin/jvm/internal/Ref$ObjectRef;Lcom/ichi2/anki/AnkiActivity;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt;->blockTouches(Landroid/view/Window;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt;->observeProgress-exY8QGI$default(Lcom/ichi2/anki/AnkiActivity;Lcom/ichi2/anki/progress/HasProgress;JLkotlin/jvm/functions/Function2;ILjava/lang/Object;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt;->observeProgress-exY8QGI(Lcom/ichi2/anki/AnkiActivity;Lcom/ichi2/anki/progress/HasProgress;JLkotlin/jvm/functions/Function2;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt;->observeProgress_exY8QGI$unblockInput(Lkotlin/jvm/internal/Ref$ObjectRef;Lcom/ichi2/anki/AnkiActivity;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt;->unblockTouches(Landroid/view/Window;)V +Lcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1;->(Lcom/ichi2/anki/AnkiActivity;Lcom/ichi2/anki/progress/HasProgress;Lkotlin/jvm/internal/Ref$BooleanRef;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/internal/Ref$ObjectRef;JLkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1;->(Lcom/ichi2/anki/progress/HasProgress;Lkotlin/jvm/internal/Ref$BooleanRef;Lcom/ichi2/anki/AnkiActivity;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/internal/Ref$ObjectRef;JLkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1$1; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlin/jvm/internal/Ref$BooleanRef;Lcom/ichi2/anki/AnkiActivity;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lcom/ichi2/anki/progress/HasProgress;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/internal/Ref$ObjectRef;J)V +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1$1;->emit(Lcom/ichi2/anki/progress/ViewModelProgress;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/progress/ProgressObserverKt$observeProgress$1$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/progress/ViewModelProgress; +Lcom/ichi2/anki/progress/ViewModelProgress$Idle; +SPLcom/ichi2/anki/progress/ViewModelProgress$Idle;->()V +SPLcom/ichi2/anki/progress/ViewModelProgress$Idle;->()V +Lcom/ichi2/anki/provider/CardContentProvider; +SPLcom/ichi2/anki/provider/CardContentProvider;->()V +SPLcom/ichi2/anki/provider/CardContentProvider;->()V +SPLcom/ichi2/anki/provider/CardContentProvider;->_init_$addUri(Ljava/lang/String;I)V +SPLcom/ichi2/anki/provider/CardContentProvider;->onCreate()Z +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda1;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda10; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda10;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda11; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda11;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda12; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda12;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda13; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda13;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda14; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda14;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda15; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda15;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda16; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda16;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda17; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda17;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda18; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda18;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda19; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda19;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda2;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda21; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda21;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda22; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda22;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda23; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda23;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda24; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda24;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda25; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda25;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda26; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda26;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda27; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda27;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda28; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda28;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda3;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda4;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda5; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda5;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda6; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda6;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda7; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda7;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda8; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda8;->()V +Lcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda9; +SPLcom/ichi2/anki/provider/CardContentProvider$$ExternalSyntheticLambda9;->()V +Lcom/ichi2/anki/provider/CardContentProvider$Companion; +SPLcom/ichi2/anki/provider/CardContentProvider$Companion;->()V +SPLcom/ichi2/anki/provider/CardContentProvider$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/provider/ContentProviderStartup; +SPLcom/ichi2/anki/provider/ContentProviderStartup;->()V +SPLcom/ichi2/anki/provider/ContentProviderStartup;->()V +SPLcom/ichi2/anki/provider/ContentProviderStartup;->onProviderCreate$lambda$0(Lcom/ichi2/anki/provider/ContentProviderStartup;)V +SPLcom/ichi2/anki/provider/ContentProviderStartup;->onProviderCreate()V +Lcom/ichi2/anki/provider/ContentProviderStartup$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/provider/ContentProviderStartup$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/provider/ContentProviderStartup;)V +SPLcom/ichi2/anki/provider/ContentProviderStartup$$ExternalSyntheticLambda0;->run()V +Lcom/ichi2/anki/recorder/VoiceRecorder; +SPLcom/ichi2/anki/recorder/VoiceRecorder;->()V +SPLcom/ichi2/anki/recorder/VoiceRecorder;->access$getRECORDING_RETENTION$cp()J +Lcom/ichi2/anki/recorder/VoiceRecorder$Companion; +SPLcom/ichi2/anki/recorder/VoiceRecorder$Companion;->()V +SPLcom/ichi2/anki/recorder/VoiceRecorder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/recorder/VoiceRecorder$Companion;->recordingsDirectory(Landroid/content/Context;)Ljava/io/File; +SPLcom/ichi2/anki/recorder/VoiceRecorder$Companion;->removeExpiredRecordings$default(Lcom/ichi2/anki/recorder/VoiceRecorder$Companion;Ljava/io/File;JILjava/lang/Object;)V +SPLcom/ichi2/anki/recorder/VoiceRecorder$Companion;->removeExpiredRecordings(Ljava/io/File;J)V +Lcom/ichi2/anki/recorder/VoiceRecorder$Companion$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/recorder/VoiceRecorder$Companion$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/reviewer/AutomaticAnswer$AutomaticallyAnswered; +Lcom/ichi2/anki/reviewer/BindingProcessor; +Lcom/ichi2/anki/reviewer/ReviewerUi; +Lcom/ichi2/anki/reviewreminders/ReminderLogTree; +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree;->()V +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree;->isLoggable(Ljava/lang/String;I)Z +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree;->log(ILjava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V +Lcom/ichi2/anki/reviewreminders/ReminderLogTree$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/reviewreminders/ReminderLogTree$Companion; +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree$Companion;->()V +SPLcom/ichi2/anki/reviewreminders/ReminderLogTree$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/reviewreminders/ReviewReminder; +Lcom/ichi2/anki/reviewreminders/ReviewReminderSchema; +Lcom/ichi2/anki/reviewreminders/ReviewReminderSchemaV1; +Lcom/ichi2/anki/reviewreminders/ReviewReminderSchemaV2; +Lcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion; +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion;->()V +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion;->(I)V +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion;->box-impl(I)Lcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion; +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion;->constructor-impl(I)I +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion;->hashCode()I +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion;->hashCode-impl(I)I +Lcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion$Companion; +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion$Companion;->()V +SPLcom/ichi2/anki/reviewreminders/ReviewReminderSchemaVersion$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/reviewreminders/ReviewRemindersDatabase; +SPLcom/ichi2/anki/reviewreminders/ReviewRemindersDatabase;->()V +SPLcom/ichi2/anki/reviewreminders/ReviewRemindersDatabase;->()V +SPLcom/ichi2/anki/reviewreminders/ReviewRemindersDatabase;->checkDeserializationErrors(Landroid/content/Context;)V +Lcom/ichi2/anki/servicelayer/DebugInfoService; +SPLcom/ichi2/anki/servicelayer/DebugInfoService;->()V +SPLcom/ichi2/anki/servicelayer/DebugInfoService;->()V +SPLcom/ichi2/anki/servicelayer/DebugInfoService;->getDebugInfo(Landroid/content/Context;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/servicelayer/DebugInfoService;->isSendingCrashReports(Landroid/content/Context;)Z +Lcom/ichi2/anki/servicelayer/DebugInfoService$getDebugInfo$1; +SPLcom/ichi2/anki/servicelayer/DebugInfoService$getDebugInfo$1;->(Lcom/ichi2/anki/servicelayer/DebugInfoService;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/servicelayer/DebugInfoService$getDebugInfo$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/servicelayer/DebugInfoServiceKt; +SPLcom/ichi2/anki/servicelayer/DebugInfoServiceKt;->getFSRSStatus$lambda$0(Lcom/ichi2/anki/libanki/Collection;)Ljava/lang/Boolean; +SPLcom/ichi2/anki/servicelayer/DebugInfoServiceKt;->getFSRSStatus(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/servicelayer/DebugInfoServiceKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/servicelayer/DebugInfoServiceKt$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/servicelayer/DebugInfoServiceKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/servicelayer/DebugInfoServiceKt$getFSRSStatus$1; +SPLcom/ichi2/anki/servicelayer/DebugInfoServiceKt$getFSRSStatus$1;->(Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/servicelayer/DebugInfoServiceKt$getFSRSStatus$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/servicelayer/ThrowableFilterService; +SPLcom/ichi2/anki/servicelayer/ThrowableFilterService;->()V +SPLcom/ichi2/anki/servicelayer/ThrowableFilterService;->()V +SPLcom/ichi2/anki/servicelayer/ThrowableFilterService;->initialize()V +SPLcom/ichi2/anki/servicelayer/ThrowableFilterService;->installDefaultExceptionHandler()V +Lcom/ichi2/anki/servicelayer/ThrowableFilterService$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/servicelayer/ThrowableFilterService$$ExternalSyntheticLambda0;->()V +Lcom/ichi2/anki/servicelayer/ThrowableFilterService$FilteringExceptionHandler; +Lcom/ichi2/anki/services/BootService; +SPLcom/ichi2/anki/services/BootService;->()V +SPLcom/ichi2/anki/services/BootService;->()V +SPLcom/ichi2/anki/services/BootService;->catchAlarmManagerErrors(Landroid/content/Context;Ljava/lang/Runnable;)V +SPLcom/ichi2/anki/services/BootService;->getColSafe()Lcom/ichi2/anki/libanki/Collection; +SPLcom/ichi2/anki/services/BootService;->onReceiveBroadcast$lambda$1(Landroid/content/Context;)V +SPLcom/ichi2/anki/services/BootService;->onReceiveBroadcast(Landroid/content/Context;Landroid/content/Intent;)V +Lcom/ichi2/anki/services/BootService$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/services/BootService$$ExternalSyntheticLambda0;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/services/BootService$$ExternalSyntheticLambda0;->run()V +Lcom/ichi2/anki/services/BootService$Companion; +SPLcom/ichi2/anki/services/BootService$Companion;->()V +SPLcom/ichi2/anki/services/BootService$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/services/BootService$Companion;->scheduleNotification(Lcom/ichi2/anki/common/time/Time;Landroid/content/Context;)V +Lcom/ichi2/anki/settings/Prefs; +SPLcom/ichi2/anki/settings/Prefs;->()V +SPLcom/ichi2/anki/settings/Prefs;->()V +Lcom/ichi2/anki/settings/PrefsRepository; +SPLcom/ichi2/anki/settings/PrefsRepository;->()V +SPLcom/ichi2/anki/settings/PrefsRepository;->(Landroid/content/Context;)V +SPLcom/ichi2/anki/settings/PrefsRepository;->(Landroid/content/SharedPreferences;Landroid/content/res/Resources;)V +SPLcom/ichi2/anki/settings/PrefsRepository;->(Lcom/ichi2/anki/preferences/SharedPreferencesProvider;Landroid/content/res/Resources;)V +SPLcom/ichi2/anki/settings/PrefsRepository;->_init_$lambda$0(Landroid/content/SharedPreferences;)Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/settings/PrefsRepository;->booleanPref(IZ)Lkotlin/properties/ReadWriteProperty; +SPLcom/ichi2/anki/settings/PrefsRepository;->booleanPref(Ljava/lang/String;Z)Lkotlin/properties/ReadWriteProperty; +SPLcom/ichi2/anki/settings/PrefsRepository;->enumPref(ILjava/lang/Enum;)Lkotlin/properties/ReadWriteProperty; +SPLcom/ichi2/anki/settings/PrefsRepository;->getAppTheme()Lcom/ichi2/anki/settings/enums/AppTheme; +SPLcom/ichi2/anki/settings/PrefsRepository;->getBoolean(IZ)Z +SPLcom/ichi2/anki/settings/PrefsRepository;->getCurrentSyncUri()Ljava/lang/String; +SPLcom/ichi2/anki/settings/PrefsRepository;->getCustomSyncCertificate()Ljava/lang/String; +SPLcom/ichi2/anki/settings/PrefsRepository;->getDayTheme()Lcom/ichi2/anki/settings/enums/DayTheme; +SPLcom/ichi2/anki/settings/PrefsRepository;->getDevBottomNavEnabled()Z +SPLcom/ichi2/anki/settings/PrefsRepository;->getDisplaySyncStatus()Z +SPLcom/ichi2/anki/settings/PrefsRepository;->getEnum(ILjava/lang/Enum;)Ljava/lang/Enum; +SPLcom/ichi2/anki/settings/PrefsRepository;->getExitViaDoubleTapBack()Z +SPLcom/ichi2/anki/settings/PrefsRepository;->getHkey()Ljava/lang/String; +SPLcom/ichi2/anki/settings/PrefsRepository;->getNewReviewRemindersEnabled()Z +SPLcom/ichi2/anki/settings/PrefsRepository;->getRemoveAppAnimations()Z +SPLcom/ichi2/anki/settings/PrefsRepository;->getReviewReminderDeserializationErrors()Ljava/lang/String; +SPLcom/ichi2/anki/settings/PrefsRepository;->getSharedPrefs()Landroid/content/SharedPreferences; +SPLcom/ichi2/anki/settings/PrefsRepository;->getString(ILjava/lang/String;)Ljava/lang/String; +SPLcom/ichi2/anki/settings/PrefsRepository;->intPref(II)Lkotlin/properties/ReadWriteProperty; +SPLcom/ichi2/anki/settings/PrefsRepository;->isAutoSyncEnabled()Z +SPLcom/ichi2/anki/settings/PrefsRepository;->isBackgroundEnabled()Z +SPLcom/ichi2/anki/settings/PrefsRepository;->isCustomSyncEnabled()Z +SPLcom/ichi2/anki/settings/PrefsRepository;->isNewStudyScreenEnabled()Z +SPLcom/ichi2/anki/settings/PrefsRepository;->isWebDebugEnabled()Z +SPLcom/ichi2/anki/settings/PrefsRepository;->key(I)Ljava/lang/String; +SPLcom/ichi2/anki/settings/PrefsRepository;->longPref(IJ)Lkotlin/properties/ReadWriteProperty; +SPLcom/ichi2/anki/settings/PrefsRepository;->stringPref$default(Lcom/ichi2/anki/settings/PrefsRepository;ILjava/lang/String;ILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; +SPLcom/ichi2/anki/settings/PrefsRepository;->stringPref(ILjava/lang/String;)Lkotlin/properties/ReadWriteProperty; +Lcom/ichi2/anki/settings/PrefsRepository$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/settings/PrefsRepository$$ExternalSyntheticLambda0;->(Landroid/content/SharedPreferences;)V +SPLcom/ichi2/anki/settings/PrefsRepository$$ExternalSyntheticLambda0;->sharedPrefs()Landroid/content/SharedPreferences; +Lcom/ichi2/anki/settings/PrefsRepository$Companion; +SPLcom/ichi2/anki/settings/PrefsRepository$Companion;->()V +SPLcom/ichi2/anki/settings/PrefsRepository$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/settings/PrefsRepository$booleanPref$1; +SPLcom/ichi2/anki/settings/PrefsRepository$booleanPref$1;->(Lcom/ichi2/anki/settings/PrefsRepository;Ljava/lang/String;Z)V +SPLcom/ichi2/anki/settings/PrefsRepository$booleanPref$1;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Boolean; +SPLcom/ichi2/anki/settings/PrefsRepository$booleanPref$1;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; +Lcom/ichi2/anki/settings/PrefsRepository$enumPref$1; +SPLcom/ichi2/anki/settings/PrefsRepository$enumPref$1;->(Lcom/ichi2/anki/settings/PrefsRepository;ILjava/lang/Enum;)V +SPLcom/ichi2/anki/settings/PrefsRepository$enumPref$1;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Enum; +SPLcom/ichi2/anki/settings/PrefsRepository$enumPref$1;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; +Lcom/ichi2/anki/settings/PrefsRepository$intPref$1; +SPLcom/ichi2/anki/settings/PrefsRepository$intPref$1;->(Lcom/ichi2/anki/settings/PrefsRepository;II)V +Lcom/ichi2/anki/settings/PrefsRepository$longPref$1; +SPLcom/ichi2/anki/settings/PrefsRepository$longPref$1;->(Lcom/ichi2/anki/settings/PrefsRepository;IJ)V +Lcom/ichi2/anki/settings/PrefsRepository$stringPref$1; +SPLcom/ichi2/anki/settings/PrefsRepository$stringPref$1;->(Lcom/ichi2/anki/settings/PrefsRepository;ILjava/lang/String;)V +SPLcom/ichi2/anki/settings/PrefsRepository$stringPref$1;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; +SPLcom/ichi2/anki/settings/PrefsRepository$stringPref$1;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/String; +Lcom/ichi2/anki/settings/enums/AppTheme; +SPLcom/ichi2/anki/settings/enums/AppTheme;->$values()[Lcom/ichi2/anki/settings/enums/AppTheme; +SPLcom/ichi2/anki/settings/enums/AppTheme;->()V +SPLcom/ichi2/anki/settings/enums/AppTheme;->(Ljava/lang/String;II)V +SPLcom/ichi2/anki/settings/enums/AppTheme;->getEntryResId()I +SPLcom/ichi2/anki/settings/enums/AppTheme;->values()[Lcom/ichi2/anki/settings/enums/AppTheme; +Lcom/ichi2/anki/settings/enums/DayTheme; +SPLcom/ichi2/anki/settings/enums/DayTheme;->$values()[Lcom/ichi2/anki/settings/enums/DayTheme; +SPLcom/ichi2/anki/settings/enums/DayTheme;->()V +SPLcom/ichi2/anki/settings/enums/DayTheme;->(Ljava/lang/String;III)V +SPLcom/ichi2/anki/settings/enums/DayTheme;->getEntryResId()I +SPLcom/ichi2/anki/settings/enums/DayTheme;->getStyleResId()I +SPLcom/ichi2/anki/settings/enums/DayTheme;->values()[Lcom/ichi2/anki/settings/enums/DayTheme; +Lcom/ichi2/anki/settings/enums/FrameStyle; +SPLcom/ichi2/anki/settings/enums/FrameStyle;->$values()[Lcom/ichi2/anki/settings/enums/FrameStyle; +SPLcom/ichi2/anki/settings/enums/FrameStyle;->()V +SPLcom/ichi2/anki/settings/enums/FrameStyle;->(Ljava/lang/String;II)V +Lcom/ichi2/anki/settings/enums/HideSystemBars; +SPLcom/ichi2/anki/settings/enums/HideSystemBars;->$values()[Lcom/ichi2/anki/settings/enums/HideSystemBars; +SPLcom/ichi2/anki/settings/enums/HideSystemBars;->()V +SPLcom/ichi2/anki/settings/enums/HideSystemBars;->(Ljava/lang/String;II)V +Lcom/ichi2/anki/settings/enums/NightTheme; +SPLcom/ichi2/anki/settings/enums/NightTheme;->$values()[Lcom/ichi2/anki/settings/enums/NightTheme; +SPLcom/ichi2/anki/settings/enums/NightTheme;->()V +SPLcom/ichi2/anki/settings/enums/NightTheme;->(Ljava/lang/String;III)V +Lcom/ichi2/anki/settings/enums/PrefEnum; +Lcom/ichi2/anki/settings/enums/Theme; +Lcom/ichi2/anki/settings/enums/ToolbarPosition; +SPLcom/ichi2/anki/settings/enums/ToolbarPosition;->$values()[Lcom/ichi2/anki/settings/enums/ToolbarPosition; +SPLcom/ichi2/anki/settings/enums/ToolbarPosition;->()V +SPLcom/ichi2/anki/settings/enums/ToolbarPosition;->(Ljava/lang/String;II)V +Lcom/ichi2/anki/snackbar/BaseSnackbarBuilderProvider; +Lcom/ichi2/anki/startup/BackendSetupKt; +SPLcom/ichi2/anki/startup/BackendSetupKt;->configureBackendTemporaryDirectory(Landroid/content/Context;)V +SPLcom/ichi2/anki/startup/BackendSetupKt;->isUsableTemporaryDirectory(Ljava/lang/String;)Z +Lcom/ichi2/anki/startup/SetupStorageKt; +SPLcom/ichi2/anki/startup/SetupStorageKt;->ensureCollectionPathSet(Landroid/content/Context;)V +Lcom/ichi2/anki/ui/BottomFadeFrameLayout; +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->()V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->dispatchDraw(Landroid/graphics/Canvas;)V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->setAnchorView(Landroid/view/View;)V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout;->setup(Landroid/view/Window;)V +Lcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion; +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion;->()V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion;->navigationBarStyle$lambda$0(Landroid/content/res/Resources;)Z +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion;->navigationBarStyle()Landroidx/activity/SystemBarStyle; +Lcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion$$ExternalSyntheticLambda0;->()V +SPLcom/ichi2/anki/ui/BottomFadeFrameLayout$Companion$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/ui/DoubleTapListener; +SPLcom/ichi2/anki/ui/DoubleTapListener;->()V +SPLcom/ichi2/anki/ui/DoubleTapListener;->(Landroid/content/Context;)V +Lcom/ichi2/anki/ui/DoubleTapListener$detector$1; +SPLcom/ichi2/anki/ui/DoubleTapListener$detector$1;->(Landroid/content/Context;Lcom/ichi2/anki/ui/DoubleTapListener$detector$2;)V +Lcom/ichi2/anki/ui/DoubleTapListener$detector$2; +SPLcom/ichi2/anki/ui/DoubleTapListener$detector$2;->(Lcom/ichi2/anki/ui/DoubleTapListener;)V +Lcom/ichi2/anki/ui/ResizablePaneLayout; +Lcom/ichi2/anki/ui/ResizingDivider; +Lcom/ichi2/anki/ui/animations/ViewAnimationsKt; +SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt;->fadeIn$default(Landroid/view/View;IFLjava/lang/Runnable;ILjava/lang/Object;)Landroid/view/ViewPropertyAnimator; +SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt;->fadeIn$lambda$0(Landroid/view/View;)V +SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt;->fadeIn(Landroid/view/View;IFLjava/lang/Runnable;)Landroid/view/ViewPropertyAnimator; +SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt;->fadeOut$default(Landroid/view/View;IFLjava/lang/Runnable;ILjava/lang/Object;)Landroid/view/ViewPropertyAnimator; +SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt;->fadeOut$lambda$0(Landroid/view/View;)V +SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt;->fadeOut(Landroid/view/View;IFLjava/lang/Runnable;)Landroid/view/ViewPropertyAnimator; +Lcom/ichi2/anki/ui/animations/ViewAnimationsKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt$$ExternalSyntheticLambda0;->(Landroid/view/View;)V +SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt$$ExternalSyntheticLambda0;->run()V +Lcom/ichi2/anki/ui/animations/ViewAnimationsKt$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt$$ExternalSyntheticLambda1;->(Landroid/view/View;)V +SPLcom/ichi2/anki/ui/animations/ViewAnimationsKt$$ExternalSyntheticLambda1;->run()V +Lcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs; +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs;->()V +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs;->(Landroid/app/Application;)V +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs;->(Landroid/app/Application;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs;->access$getStartedActivityStack$p(Lcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs;)Ljava/util/List; +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs;->access$registerCallbacks(Lcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs;)V +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs;->registerCallbacks()V +Lcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs$Companion; +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs$Companion;->()V +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs$Companion;->register(Landroid/app/Application;)Lcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs; +Lcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs$registerCallbacks$1; +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs$registerCallbacks$1;->(Lcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs;)V +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs$registerCallbacks$1;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs$registerCallbacks$1;->onActivityDestroyed(Landroid/app/Activity;)V +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs$registerCallbacks$1;->onActivityResumed(Landroid/app/Activity;)V +SPLcom/ichi2/anki/ui/dialogs/ActivityAgnosticDialogs$registerCallbacks$1;->onActivityStarted(Landroid/app/Activity;)V +Lcom/ichi2/anki/ui/dialogs/DefaultActivityLifecycleCallbacks; +SPLcom/ichi2/anki/ui/dialogs/DefaultActivityLifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLcom/ichi2/anki/ui/dialogs/DefaultActivityLifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V +SPLcom/ichi2/anki/ui/dialogs/DefaultActivityLifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V +Lcom/ichi2/anki/ui/internationalization/SentenceCase; +SPLcom/ichi2/anki/ui/internationalization/SentenceCase;->()V +SPLcom/ichi2/anki/ui/internationalization/SentenceCase;->()V +SPLcom/ichi2/anki/ui/internationalization/SentenceCase;->getCheckDatabase(Landroid/content/Context;)Ljava/lang/String; +SPLcom/ichi2/anki/ui/internationalization/SentenceCase;->getCheckMediaAction(Landroid/content/Context;)Ljava/lang/String; +SPLcom/ichi2/anki/ui/internationalization/SentenceCase;->getCreateDeck(Landroid/content/Context;)Ljava/lang/String; +SPLcom/ichi2/anki/ui/internationalization/SentenceCase;->getEmptyCards(Landroid/content/Context;)Ljava/lang/String; +Lcom/ichi2/anki/ui/internationalization/SentenceCaseKt; +SPLcom/ichi2/anki/ui/internationalization/SentenceCaseKt;->getSentenceCase(Lanki/i18n/GeneratedTranslations;)Lcom/ichi2/anki/ui/internationalization/SentenceCase; +SPLcom/ichi2/anki/ui/internationalization/SentenceCaseKt;->matchesSentenceCaseResource(Ljava/lang/String;Ljava/lang/String;)Z +SPLcom/ichi2/anki/ui/internationalization/SentenceCaseKt;->toSentenceCase(Landroid/content/Context;Ljava/lang/String;I)Ljava/lang/String; +SPLcom/ichi2/anki/ui/internationalization/SentenceCaseKt;->toSentenceCase(Ljava/lang/String;Landroid/content/Context;I)Ljava/lang/String; +Lcom/ichi2/anki/ui/windows/permissions/InternetPermissionFragment; +Lcom/ichi2/anki/ui/windows/permissions/PermissionsFragment; +Lcom/ichi2/anki/ui/windows/permissions/PermissionsStartingAt30Fragment; +Lcom/ichi2/anki/ui/windows/permissions/PermissionsUntil29Fragment; +Lcom/ichi2/anki/utils/ExceptionsKt; +SPLcom/ichi2/anki/utils/ExceptionsKt;->runWithOOMCheck(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; +Lcom/ichi2/anki/utils/MimeTypeUtils; +SPLcom/ichi2/anki/utils/MimeTypeUtils;->()V +SPLcom/ichi2/anki/utils/MimeTypeUtils;->()V +SPLcom/ichi2/anki/utils/MimeTypeUtils;->getCSV_TSV_MIME_TYPES()[Ljava/lang/String; +Lcom/ichi2/anki/utils/ext/FlowKt; +SPLcom/ichi2/anki/utils/ext/FlowKt;->launchCollectionInLifecycleScope(Lcom/ichi2/anki/AnkiActivity;Lkotlinx/coroutines/flow/Flow;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;)V +SPLcom/ichi2/anki/utils/ext/FlowKt;->launchCollectionInLifecycleScope(Lcom/ichi2/anki/AnkiActivity;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)V +SPLcom/ichi2/anki/utils/ext/FlowKt;->launchCollectionInLifecycleScope(Lcom/ichi2/anki/AnkiActivity;Lkotlinx/coroutines/flow/StateFlow;Lkotlin/jvm/functions/Function2;)V +Lcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2;->(Lcom/ichi2/anki/AnkiActivity;Landroidx/lifecycle/Lifecycle$State;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1;->(Lkotlinx/coroutines/flow/Flow;Lcom/ichi2/anki/AnkiActivity;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1$1; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1$1;->(Lcom/ichi2/anki/AnkiActivity;Lkotlin/jvm/functions/Function2;)V +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$2$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3;->(Lcom/ichi2/anki/AnkiActivity;Lkotlinx/coroutines/flow/StateFlow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1;->(Lkotlinx/coroutines/flow/StateFlow;Lkotlin/jvm/internal/Ref$ObjectRef;Lcom/ichi2/anki/AnkiActivity;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1$1; +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lcom/ichi2/anki/AnkiActivity;Lkotlin/jvm/functions/Function2;)V +SPLcom/ichi2/anki/utils/ext/FlowKt$launchCollectionInLifecycleScope$3$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/anki/utils/ext/FragmentResultKt; +SPLcom/ichi2/anki/utils/ext/FragmentResultKt;->setFragmentResultListener(Landroidx/fragment/app/FragmentActivity;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V +Lcom/ichi2/anki/utils/ext/FragmentResultKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/utils/ext/FragmentResultKt$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function2;)V +Lcom/ichi2/anki/utils/ext/ImageViewKt; +SPLcom/ichi2/anki/utils/ext/ImageViewKt;->setImageDrawableSafe$lambda$1(Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;)Z +SPLcom/ichi2/anki/utils/ext/ImageViewKt;->setImageDrawableSafe(Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;Lkotlin/jvm/functions/Function1;)Z +Lcom/ichi2/anki/utils/ext/ImageViewKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/utils/ext/ImageViewKt$$ExternalSyntheticLambda0;->(Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;)V +SPLcom/ichi2/anki/utils/ext/ImageViewKt$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Lcom/ichi2/anki/utils/ext/LinearLayoutManagerKt; +SPLcom/ichi2/anki/utils/ext/LinearLayoutManagerKt;->getVisibleItemPositions(Landroidx/recyclerview/widget/LinearLayoutManager;)Lkotlin/ranges/IntRange; +SPLcom/ichi2/anki/utils/ext/LinearLayoutManagerKt;->positionIsVisible(Landroidx/recyclerview/widget/LinearLayoutManager;I)Z +Lcom/ichi2/anki/utils/ext/ViewKt; +SPLcom/ichi2/anki/utils/ext/ViewKt;->onGlobalLayout$lambda$0(Lkotlin/jvm/functions/Function0;)V +SPLcom/ichi2/anki/utils/ext/ViewKt;->onGlobalLayout(Landroid/view/View;Landroidx/lifecycle/LifecycleOwner;Lkotlin/jvm/functions/Function0;)V +Lcom/ichi2/anki/utils/ext/ViewKt$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/utils/ext/ViewKt$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function0;)V +SPLcom/ichi2/anki/utils/ext/ViewKt$$ExternalSyntheticLambda0;->onGlobalLayout()V +Lcom/ichi2/anki/utils/ext/ViewKt$onGlobalLayout$1; +SPLcom/ichi2/anki/utils/ext/ViewKt$onGlobalLayout$1;->(Landroid/view/View;Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V +SPLcom/ichi2/anki/utils/ext/ViewKt$onGlobalLayout$1;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/utils/ext/ViewKt$onGlobalLayout$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +SPLcom/ichi2/anki/utils/ext/ViewKt$onGlobalLayout$1;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +Lcom/ichi2/anki/widget/WidgetRegistryKt; +SPLcom/ichi2/anki/widget/WidgetRegistryKt;->()V +SPLcom/ichi2/anki/widget/WidgetRegistryKt;->getRECURRING_WIDGETS()Ljava/util/List; +Lcom/ichi2/anki/widgets/DeckAdapter; +SPLcom/ichi2/anki/widgets/DeckAdapter;->()V +SPLcom/ichi2/anki/widgets/DeckAdapter;->(Landroid/content/Context;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;)V +SPLcom/ichi2/anki/widgets/DeckAdapter;->access$setDeckExpander(Lcom/ichi2/anki/widgets/DeckAdapter;Landroid/widget/ImageButton;Landroid/widget/ImageButton;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V +SPLcom/ichi2/anki/widgets/DeckAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V +SPLcom/ichi2/anki/widgets/DeckAdapter;->onBindViewHolder(Lcom/ichi2/anki/widgets/DeckAdapter$ViewHolder;I)V +SPLcom/ichi2/anki/widgets/DeckAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +SPLcom/ichi2/anki/widgets/DeckAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Lcom/ichi2/anki/widgets/DeckAdapter$ViewHolder; +SPLcom/ichi2/anki/widgets/DeckAdapter;->setActivityHasBackground(Z)V +SPLcom/ichi2/anki/widgets/DeckAdapter;->setDeckExpander(Landroid/widget/ImageButton;Landroid/widget/ImageButton;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V +SPLcom/ichi2/anki/widgets/DeckAdapter;->submit(Ljava/util/List;Z)V +Lcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda0; +SPLcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda0;->(Lcom/ichi2/anki/widgets/DeckAdapter;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V +Lcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda1; +SPLcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda1;->(Lcom/ichi2/anki/widgets/DeckAdapter;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V +Lcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda2; +SPLcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda2;->(Lcom/ichi2/anki/widgets/DeckAdapter;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V +Lcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda3; +SPLcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda3;->(Lcom/ichi2/anki/widgets/DeckAdapter;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V +Lcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda4; +SPLcom/ichi2/anki/widgets/DeckAdapter$$ExternalSyntheticLambda4;->(Lcom/ichi2/anki/widgets/DeckAdapter;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;)V +Lcom/ichi2/anki/widgets/DeckAdapter$Companion; +SPLcom/ichi2/anki/widgets/DeckAdapter$Companion;->()V +SPLcom/ichi2/anki/widgets/DeckAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/anki/widgets/DeckAdapter$ViewHolder; +SPLcom/ichi2/anki/widgets/DeckAdapter$ViewHolder;->()V +SPLcom/ichi2/anki/widgets/DeckAdapter$ViewHolder;->(Lcom/ichi2/anki/databinding/ItemDeckBinding;)V +SPLcom/ichi2/anki/widgets/DeckAdapter$ViewHolder;->getBinding()Lcom/ichi2/anki/databinding/ItemDeckBinding; +Lcom/ichi2/anki/widgets/DeckAdapter$onBindViewHolder$1; +SPLcom/ichi2/anki/widgets/DeckAdapter$onBindViewHolder$1;->(Lcom/ichi2/anki/widgets/DeckAdapter;Lcom/ichi2/anki/databinding/ItemDeckBinding;Lcom/ichi2/anki/widgets/DeckAdapter$ViewHolder;Lcom/ichi2/anki/deckpicker/DisplayDeckNode;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/anki/widgets/DeckAdapter$onBindViewHolder$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/anki/widgets/DeckAdapter$onBindViewHolder$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/anki/widgets/DeckAdapterKt; +SPLcom/ichi2/anki/widgets/DeckAdapterKt;->()V +SPLcom/ichi2/anki/widgets/DeckAdapterKt;->access$getDeckNodeDiffCallback$p()Lcom/ichi2/anki/widgets/DeckAdapterKt$deckNodeDiffCallback$1; +Lcom/ichi2/anki/widgets/DeckAdapterKt$deckNodeDiffCallback$1; +SPLcom/ichi2/anki/widgets/DeckAdapterKt$deckNodeDiffCallback$1;->()V +Lcom/ichi2/anki/widgets/R$id; +Lcom/ichi2/anki/widgets/R$layout; +Lcom/ichi2/anki/workarounds/AppLoadedFromBackupWorkaround; +SPLcom/ichi2/anki/workarounds/AppLoadedFromBackupWorkaround;->()V +SPLcom/ichi2/anki/workarounds/AppLoadedFromBackupWorkaround;->()V +SPLcom/ichi2/anki/workarounds/AppLoadedFromBackupWorkaround;->showedActivityFailedScreen(Landroid/app/Activity;Landroid/os/Bundle;Lkotlin/jvm/functions/Function1;)Z +Lcom/ichi2/anki/worker/SyncWorker; +SPLcom/ichi2/anki/worker/SyncWorker;->()V +Lcom/ichi2/anki/worker/SyncWorker$Companion; +SPLcom/ichi2/anki/worker/SyncWorker$Companion;->()V +SPLcom/ichi2/anki/worker/SyncWorker$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/anki/worker/SyncWorker$Companion;->cancel(Landroid/content/Context;)V +Lcom/ichi2/compat/customtabs/CustomTabActivityHelper; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->()V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->(Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/CoroutineDispatcher;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->(Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/CoroutineDispatcher;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->access$getIoDispatcher$p(Lcom/ichi2/compat/customtabs/CustomTabActivityHelper;)Lkotlinx/coroutines/CoroutineDispatcher; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->access$setCustomTabsSession$p(Lcom/ichi2/compat/customtabs/CustomTabActivityHelper;Landroidx/browser/customtabs/CustomTabsSession;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->access$warmup(Lcom/ichi2/compat/customtabs/CustomTabActivityHelper;Landroidx/browser/customtabs/CustomTabsClient;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->bindCustomTabsService(Landroid/app/Activity;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->getProviderInfo(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->onServiceConnected(Landroidx/browser/customtabs/CustomTabsClient;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->onServiceDisconnected()V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper;->warmup(Landroidx/browser/customtabs/CustomTabsClient;)V +Lcom/ichi2/compat/customtabs/CustomTabActivityHelper$Companion; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$Companion;->()V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1;->(Lcom/ichi2/compat/customtabs/CustomTabActivityHelper;Landroidx/browser/customtabs/CustomTabsClient;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1$1; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1$1;->(Lcom/ichi2/compat/customtabs/CustomTabActivityHelper;Landroidx/browser/customtabs/CustomTabsClient;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/compat/customtabs/CustomTabActivityHelper$onServiceConnected$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/compat/customtabs/CustomTabsHelper; +SPLcom/ichi2/compat/customtabs/CustomTabsHelper;->()V +SPLcom/ichi2/compat/customtabs/CustomTabsHelper;->()V +SPLcom/ichi2/compat/customtabs/CustomTabsHelper;->getPackageNameToUse$lambda$0(Landroid/content/pm/PackageManager;Landroid/content/Intent;)Landroid/content/pm/ResolveInfo; +SPLcom/ichi2/compat/customtabs/CustomTabsHelper;->getPackageNameToUse(Landroid/content/Context;)Ljava/lang/String; +Lcom/ichi2/compat/customtabs/CustomTabsHelper$$ExternalSyntheticLambda0; +SPLcom/ichi2/compat/customtabs/CustomTabsHelper$$ExternalSyntheticLambda0;->(Landroid/content/pm/PackageManager;Landroid/content/Intent;)V +SPLcom/ichi2/compat/customtabs/CustomTabsHelper$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Lcom/ichi2/compat/customtabs/ServiceConnection; +SPLcom/ichi2/compat/customtabs/ServiceConnection;->()V +SPLcom/ichi2/compat/customtabs/ServiceConnection;->(Lcom/ichi2/compat/customtabs/ServiceConnectionCallback;)V +SPLcom/ichi2/compat/customtabs/ServiceConnection;->onCustomTabsServiceConnected(Landroid/content/ComponentName;Landroidx/browser/customtabs/CustomTabsClient;)V +Lcom/ichi2/compat/customtabs/ServiceConnectionCallback; +Lcom/ichi2/themes/Themes; +SPLcom/ichi2/themes/Themes;->()V +SPLcom/ichi2/themes/Themes;->()V +SPLcom/ichi2/themes/Themes;->getCurrentTheme()Lcom/ichi2/anki/settings/enums/Theme; +SPLcom/ichi2/themes/Themes;->isNightTheme()Z +SPLcom/ichi2/themes/Themes;->setTheme(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLcom/ichi2/themes/Themes;->setTheme(Landroid/content/Context;)V +SPLcom/ichi2/themes/Themes;->updateCurrentTheme(Landroid/content/Context;)V +Lcom/ichi2/themes/Themes$WhenMappings; +SPLcom/ichi2/themes/Themes$WhenMappings;->()V +Lcom/ichi2/ui/AccessibleSearchView; +SPLcom/ichi2/ui/AccessibleSearchView;->()V +SPLcom/ichi2/ui/AccessibleSearchView;->(Landroid/content/Context;)V +Lcom/ichi2/ui/BadgeDrawable; +SPLcom/ichi2/ui/BadgeDrawable;->()V +SPLcom/ichi2/ui/BadgeDrawable;->(Landroid/graphics/drawable/Drawable;)V +SPLcom/ichi2/ui/BadgeDrawable;->draw(Landroid/graphics/Canvas;)V +SPLcom/ichi2/ui/BadgeDrawable;->getBottom()D +SPLcom/ichi2/ui/BadgeDrawable;->getIconScale()D +SPLcom/ichi2/ui/BadgeDrawable;->getLeft()D +SPLcom/ichi2/ui/BadgeDrawable;->invalidateSize()V +SPLcom/ichi2/ui/BadgeDrawable;->isShowingText()Z +SPLcom/ichi2/ui/BadgeDrawable;->setBadgeDrawable(Landroid/graphics/drawable/Drawable;)V +SPLcom/ichi2/ui/BadgeDrawable;->setText(C)V +Lcom/ichi2/ui/BadgeDrawable$Companion; +SPLcom/ichi2/ui/BadgeDrawable$Companion;->()V +SPLcom/ichi2/ui/BadgeDrawable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/ui/BadgeDrawableBuilder; +SPLcom/ichi2/ui/BadgeDrawableBuilder;->()V +SPLcom/ichi2/ui/BadgeDrawableBuilder;->(Landroid/content/Context;)V +SPLcom/ichi2/ui/BadgeDrawableBuilder;->replaceBadge(Lcom/ichi2/anki/SyncActionProvider;)V +SPLcom/ichi2/ui/BadgeDrawableBuilder;->withColorAttr(I)Lcom/ichi2/ui/BadgeDrawableBuilder; +SPLcom/ichi2/ui/BadgeDrawableBuilder;->withText(C)Lcom/ichi2/ui/BadgeDrawableBuilder; +Lcom/ichi2/ui/BadgeDrawableBuilder$Companion; +SPLcom/ichi2/ui/BadgeDrawableBuilder$Companion;->()V +SPLcom/ichi2/ui/BadgeDrawableBuilder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/ui/FixedTextView; +SPLcom/ichi2/ui/FixedTextView;->()V +SPLcom/ichi2/ui/FixedTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +SPLcom/ichi2/ui/FixedTextView;->onDraw(Landroid/graphics/Canvas;)V +SPLcom/ichi2/ui/FixedTextView;->onMeasure(II)V +SPLcom/ichi2/ui/FixedTextView;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V +Lcom/ichi2/ui/RtlCompliantActionProvider; +SPLcom/ichi2/ui/RtlCompliantActionProvider;->()V +Lcom/ichi2/ui/RtlCompliantActionProvider$Companion; +SPLcom/ichi2/ui/RtlCompliantActionProvider$Companion;->()V +SPLcom/ichi2/ui/RtlCompliantActionProvider$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/ui/RtlCompliantActionProvider$Companion;->unwrapContext(Landroid/content/Context;)Landroid/app/Activity; +Lcom/ichi2/utils/ClipboardUtil; +SPLcom/ichi2/utils/ClipboardUtil;->()V +SPLcom/ichi2/utils/ClipboardUtil;->()V +SPLcom/ichi2/utils/ClipboardUtil;->getIMPORT_MIME_TYPES()[Ljava/lang/String; +Lcom/ichi2/utils/FileUtil; +SPLcom/ichi2/utils/FileUtil;->()V +SPLcom/ichi2/utils/FileUtil;->()V +SPLcom/ichi2/utils/FileUtil;->getFreeDiskSpace(Ljava/io/File;J)J +Lcom/ichi2/utils/LanguageDebugInfo; +SPLcom/ichi2/utils/LanguageDebugInfo;->()V +SPLcom/ichi2/utils/LanguageDebugInfo;->(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V +SPLcom/ichi2/utils/LanguageDebugInfo;->getAppLocale()Ljava/lang/String; +SPLcom/ichi2/utils/LanguageDebugInfo;->getBackendLocales()Ljava/util/List; +SPLcom/ichi2/utils/LanguageDebugInfo;->getSystemLocale()Ljava/lang/String; +Lcom/ichi2/utils/LanguageUtil; +SPLcom/ichi2/utils/LanguageUtil;->()V +SPLcom/ichi2/utils/LanguageUtil;->()V +SPLcom/ichi2/utils/LanguageUtil;->getLocaleCompat(Landroid/content/res/Resources;)Ljava/util/Locale; +SPLcom/ichi2/utils/LanguageUtil;->getSystemLocale()Ljava/util/Locale; +SPLcom/ichi2/utils/LanguageUtil;->setDefaultBackendLanguages$default(Lcom/ichi2/utils/LanguageUtil;Ljava/lang/String;ILjava/lang/Object;)V +SPLcom/ichi2/utils/LanguageUtil;->setDefaultBackendLanguages(Ljava/lang/String;)V +Lcom/ichi2/utils/LanguageUtilKt; +SPLcom/ichi2/utils/LanguageUtilKt;->getLanguageDebugInfo(Landroid/content/Context;)Lcom/ichi2/utils/LanguageDebugInfo; +Lcom/ichi2/utils/Permissions; +SPLcom/ichi2/utils/Permissions;->()V +SPLcom/ichi2/utils/Permissions;->()V +SPLcom/ichi2/utils/Permissions;->getAppPrivateStartupPermissions()Ljava/util/List; +SPLcom/ichi2/utils/Permissions;->getExternalManagerStorageAccessStartupPermissions()Ljava/util/List; +SPLcom/ichi2/utils/Permissions;->getLegacyStorageAccessStartupPermissions()Ljava/util/List; +Lcom/ichi2/utils/VersionUtils; +SPLcom/ichi2/utils/VersionUtils;->()V +SPLcom/ichi2/utils/VersionUtils;->()V +SPLcom/ichi2/utils/VersionUtils;->getApplicationInstance()Landroid/content/Context; +SPLcom/ichi2/utils/VersionUtils;->getPkgVersionName()Ljava/lang/String; +Lcom/ichi2/utils/ViewUtilsKt; +SPLcom/ichi2/utils/ViewUtilsKt;->configureView(Landroid/view/View;Landroid/app/Activity;[Ljava/lang/String;Landroidx/draganddrop/DropHelper$Options;Landroidx/core/view/OnReceiveContentListener;)V +SPLcom/ichi2/utils/ViewUtilsKt;->isRtl(Landroid/content/res/Resources;)Z +SPLcom/ichi2/utils/ViewUtilsKt;->isRtl(Landroid/view/View;)Z +Lcom/ichi2/utils/WebViewInfo; +SPLcom/ichi2/utils/WebViewInfo;->()V +SPLcom/ichi2/utils/WebViewInfo;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;)V +SPLcom/ichi2/utils/WebViewInfo;->getPackageName()Ljava/lang/String; +SPLcom/ichi2/utils/WebViewInfo;->getUserAgent()Ljava/lang/String; +SPLcom/ichi2/utils/WebViewInfo;->getVersionCode()Ljava/lang/Long; +Lcom/ichi2/utils/WebViewUtilsKt; +SPLcom/ichi2/utils/WebViewUtilsKt;->()V +SPLcom/ichi2/utils/WebViewUtilsKt;->checkWebViewVersionComponents-kAAzjZc(Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;I)Ljava/lang/Integer; +SPLcom/ichi2/utils/WebViewUtilsKt;->getChromeLikeWebViewVersionIfOutdated-3O3hvnY(Landroid/content/Context;I)Ljava/lang/Integer; +SPLcom/ichi2/utils/WebViewUtilsKt;->getWebViewInfo(Landroid/content/Context;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/utils/WebViewUtilsKt;->getWebviewUserAgent(Landroid/content/Context;)Ljava/lang/String; +SPLcom/ichi2/utils/WebViewUtilsKt;->setWebContentsDebuggingEnabled(Z)V +SPLcom/ichi2/utils/WebViewUtilsKt;->showDialogIfWebViewOutdated-DpGE9L0$default(Landroid/content/Context;ILkotlin/jvm/functions/Function0;ILjava/lang/Object;)Z +SPLcom/ichi2/utils/WebViewUtilsKt;->showDialogIfWebViewOutdated-DpGE9L0(Landroid/content/Context;ILkotlin/jvm/functions/Function0;)Z +Lcom/ichi2/utils/WebViewUtilsKt$$ExternalSyntheticLambda1; +SPLcom/ichi2/utils/WebViewUtilsKt$$ExternalSyntheticLambda1;->()V +Lcom/ichi2/utils/WebViewUtilsKt$getWebViewInfo$2; +SPLcom/ichi2/utils/WebViewUtilsKt$getWebViewInfo$2;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/utils/WebViewUtilsKt$getWebViewInfo$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/utils/WebViewUtilsKt$getWebViewInfo$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/utils/WebViewVersion; +SPLcom/ichi2/utils/WebViewVersion;->constructor-impl(I)I +Lcom/ichi2/utils/WebViewVersionCode; +SPLcom/ichi2/utils/WebViewVersionCode;->constructor-impl(J)J +Lcom/ichi2/widget/AddNoteWidget; +SPLcom/ichi2/widget/AddNoteWidget;->()V +Lcom/ichi2/widget/AddNoteWidget$Companion; +SPLcom/ichi2/widget/AddNoteWidget$Companion;->()V +SPLcom/ichi2/widget/AddNoteWidget$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/widget/AddNoteWidget$Companion;->updateWidgets-g9s5mYc(Landroid/content/Context;Landroid/appwidget/AppWidgetManager;[I)V +Lcom/ichi2/widget/AnalyticsWidgetProvider; +Lcom/ichi2/widget/AnkiDroidWidgetSmall; +Lcom/ichi2/widget/AppWidgetIds; +SPLcom/ichi2/widget/AppWidgetIds;->()V +SPLcom/ichi2/widget/AppWidgetIds;->constructor-impl([I)[I +Lcom/ichi2/widget/AppWidgetIds$Companion; +SPLcom/ichi2/widget/AppWidgetIds$Companion;->()V +SPLcom/ichi2/widget/AppWidgetIds$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lcom/ichi2/widget/DayRolloverAlarm; +SPLcom/ichi2/widget/DayRolloverAlarm;->()V +Lcom/ichi2/widget/DayRolloverAlarm$Companion; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->()V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->access$nextFutureCutoffMs(Lcom/ichi2/widget/DayRolloverAlarm$Companion;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->buildPendingIntent(Landroid/content/Context;Ljava/lang/String;)Landroid/app/PendingIntent; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->nextFutureCutoffMs$lambda$0(Lcom/ichi2/anki/libanki/Collection;)J +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->nextFutureCutoffMs(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->scheduleNext(Landroid/content/Context;)V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->scheduleNextInternal$lambda$0(JLandroid/app/PendingIntent;Landroid/app/AlarmManager;)Lkotlin/Unit; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion;->scheduleNextInternal(Landroid/content/Context;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lcom/ichi2/widget/DayRolloverAlarm$Companion$$ExternalSyntheticLambda0; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$$ExternalSyntheticLambda0;->(JLandroid/app/PendingIntent;)V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/widget/DayRolloverAlarm$Companion$$ExternalSyntheticLambda1; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$$ExternalSyntheticLambda1;->()V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/widget/DayRolloverAlarm$Companion$nextFutureCutoffMs$1; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$nextFutureCutoffMs$1;->(Lcom/ichi2/widget/DayRolloverAlarm$Companion;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$nextFutureCutoffMs$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNext$1; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNext$1;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNext$1;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNext$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNext$1;->invoke(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNext$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNextInternal$1; +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNextInternal$1;->(Lcom/ichi2/widget/DayRolloverAlarm$Companion;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/widget/DayRolloverAlarm$Companion$scheduleNextInternal$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/widget/DayRolloverAlarmKt; +SPLcom/ichi2/widget/DayRolloverAlarmKt;->access$launchCatchingIoWithReport(Lkotlinx/coroutines/CoroutineScope;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V +SPLcom/ichi2/widget/DayRolloverAlarmKt;->launchCatchingIoWithReport(Lkotlinx/coroutines/CoroutineScope;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$1; +SPLcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$1;->(Ljava/lang/String;Lkotlin/coroutines/Continuation;)V +Lcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$2; +SPLcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$2;->(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V +SPLcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLcom/ichi2/widget/DayRolloverAlarmKt$launchCatchingIoWithReport$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcom/ichi2/widget/IdKt; +SPLcom/ichi2/widget/IdKt;->getAppWidgetIdsEx(Landroid/appwidget/AppWidgetManager;Landroid/content/ComponentName;)[I +SPLcom/ichi2/widget/IdKt;->updateAppWidget-DMUWGG8(Landroid/appwidget/AppWidgetManager;[ILandroid/widget/RemoteViews;)V +Lcom/ichi2/widget/WidgetAlarmKt; +SPLcom/ichi2/widget/WidgetAlarmKt;->getAppWidgetIds(Landroid/appwidget/AppWidgetManager;Landroid/content/Context;Ljava/lang/Class;)Ljava/util/List; +SPLcom/ichi2/widget/WidgetAlarmKt;->restoreRecurringAlarms(Landroid/content/Context;Ljava/util/List;)V +Lcom/ichi2/widget/WidgetNotificationScheduler; +SPLcom/ichi2/widget/WidgetNotificationScheduler;->()V +Lcom/ichi2/widget/WidgetNotificationScheduler$Companion; +SPLcom/ichi2/widget/WidgetNotificationScheduler$Companion;->()V +SPLcom/ichi2/widget/WidgetNotificationScheduler$Companion;->()V +SPLcom/ichi2/widget/WidgetNotificationScheduler$Companion;->register(Lcom/ichi2/widget/WidgetNotificationScheduler;)V +Lcom/ichi2/widget/WidgetNotificationSchedulerKt; +SPLcom/ichi2/widget/WidgetNotificationSchedulerKt;->access$setWidgetNotificationScheduler$p(Lcom/ichi2/widget/WidgetNotificationScheduler;)V +Lcom/ichi2/widget/WidgetPermissionReceiver; +SPLcom/ichi2/widget/WidgetPermissionReceiver;->()V +SPLcom/ichi2/widget/WidgetPermissionReceiver;->onReceiveBroadcast(Landroid/content/Context;Landroid/content/Intent;)V +Lcom/ichi2/widget/WidgetRepository; +SPLcom/ichi2/widget/WidgetRepository;->()V +Lcom/ichi2/widget/WidgetRepository$Companion; +SPLcom/ichi2/widget/WidgetRepository$Companion;->()V +SPLcom/ichi2/widget/WidgetRepository$Companion;->()V +SPLcom/ichi2/widget/WidgetRepository$Companion;->register(Lcom/ichi2/widget/WidgetRepository;)V +Lcom/ichi2/widget/WidgetRepositoryKt; +SPLcom/ichi2/widget/WidgetRepositoryKt;->access$setWidgetRepository$p(Lcom/ichi2/widget/WidgetRepository;)V +Lcom/ichi2/widget/WidgetStatus; +SPLcom/ichi2/widget/WidgetStatus;->()V +SPLcom/ichi2/widget/WidgetStatus;->()V +SPLcom/ichi2/widget/WidgetStatus;->register(Landroid/app/Application;Lcom/ichi2/anki/common/preferences/NotificationPreferences;Lkotlin/jvm/functions/Function1;)V +Lcom/ichi2/widget/WidgetUtilsKt; +SPLcom/ichi2/widget/WidgetUtilsKt;->getAppWidgetManager(Landroid/content/Context;)Landroid/appwidget/AppWidgetManager; +Lcom/ichi2/widget/cardanalysis/CardAnalysisWidget; +Lcom/ichi2/widget/deckpicker/DeckPickerWidget; +Lio/github/oshai/kotlinlogging/DelegatingKLogger; +Lio/github/oshai/kotlinlogging/KLogger; +Lio/github/oshai/kotlinlogging/KLogger$DefaultImpls; +SPLio/github/oshai/kotlinlogging/KLogger$DefaultImpls;->at$default(Lio/github/oshai/kotlinlogging/KLogger;Lio/github/oshai/kotlinlogging/Level;Lio/github/oshai/kotlinlogging/Marker;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +SPLio/github/oshai/kotlinlogging/KLogger$DefaultImpls;->info(Lio/github/oshai/kotlinlogging/KLogger;Lkotlin/jvm/functions/Function0;)V +Lio/github/oshai/kotlinlogging/KLogger$info$1; +SPLio/github/oshai/kotlinlogging/KLogger$info$1;->(Lkotlin/jvm/functions/Function0;)V +SPLio/github/oshai/kotlinlogging/KLogger$info$1;->invoke(Lio/github/oshai/kotlinlogging/KLoggingEventBuilder;)V +SPLio/github/oshai/kotlinlogging/KLogger$info$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lio/github/oshai/kotlinlogging/KLoggingEventBuilder; +SPLio/github/oshai/kotlinlogging/KLoggingEventBuilder;->()V +SPLio/github/oshai/kotlinlogging/KLoggingEventBuilder;->getCause()Ljava/lang/Throwable; +SPLio/github/oshai/kotlinlogging/KLoggingEventBuilder;->getMessage()Ljava/lang/String; +SPLio/github/oshai/kotlinlogging/KLoggingEventBuilder;->getPayload()Ljava/util/Map; +SPLio/github/oshai/kotlinlogging/KLoggingEventBuilder;->setMessage(Ljava/lang/String;)V +Lio/github/oshai/kotlinlogging/KotlinLogging; +SPLio/github/oshai/kotlinlogging/KotlinLogging;->()V +SPLio/github/oshai/kotlinlogging/KotlinLogging;->()V +SPLio/github/oshai/kotlinlogging/KotlinLogging;->logger(Ljava/lang/String;)Lio/github/oshai/kotlinlogging/KLogger; +SPLio/github/oshai/kotlinlogging/KotlinLogging;->logger(Lkotlin/jvm/functions/Function0;)Lio/github/oshai/kotlinlogging/KLogger; +Lio/github/oshai/kotlinlogging/Level; +SPLio/github/oshai/kotlinlogging/Level;->$values()[Lio/github/oshai/kotlinlogging/Level; +SPLio/github/oshai/kotlinlogging/Level;->()V +SPLio/github/oshai/kotlinlogging/Level;->(Ljava/lang/String;IILjava/lang/String;)V +SPLio/github/oshai/kotlinlogging/Level;->values()[Lio/github/oshai/kotlinlogging/Level; +Lio/github/oshai/kotlinlogging/internal/KLoggerFactory; +SPLio/github/oshai/kotlinlogging/internal/KLoggerFactory;->()V +SPLio/github/oshai/kotlinlogging/internal/KLoggerFactory;->()V +SPLio/github/oshai/kotlinlogging/internal/KLoggerFactory;->logger$kotlin_logging(Ljava/lang/String;)Lio/github/oshai/kotlinlogging/KLogger; +Lio/github/oshai/kotlinlogging/internal/KLoggerNameResolver; +SPLio/github/oshai/kotlinlogging/internal/KLoggerNameResolver;->()V +SPLio/github/oshai/kotlinlogging/internal/KLoggerNameResolver;->()V +SPLio/github/oshai/kotlinlogging/internal/KLoggerNameResolver;->name$kotlin_logging(Lkotlin/jvm/functions/Function0;)Ljava/lang/String; +Lio/github/oshai/kotlinlogging/internal/MessageInvokerKt; +SPLio/github/oshai/kotlinlogging/internal/MessageInvokerKt;->toStringSafe(Lkotlin/jvm/functions/Function0;)Ljava/lang/String; +Lio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger; +SPLio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger;->(Lorg/slf4j/Logger;)V +SPLio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger;->at(Lio/github/oshai/kotlinlogging/Level;Lio/github/oshai/kotlinlogging/Marker;Lkotlin/jvm/functions/Function1;)V +SPLio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger;->getUnderlyingLogger()Lorg/slf4j/Logger; +SPLio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger;->isLoggingEnabledFor(Lio/github/oshai/kotlinlogging/Level;Lio/github/oshai/kotlinlogging/Marker;)Z +SPLio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger;->logWithoutPayload(Lio/github/oshai/kotlinlogging/KLoggingEventBuilder;Lio/github/oshai/kotlinlogging/Level;Lio/github/oshai/kotlinlogging/Marker;)V +Lio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger$WhenMappings; +SPLio/github/oshai/kotlinlogging/slf4j/internal/LocationIgnorantKLogger$WhenMappings;->()V +Lio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLogger; +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLogger;->()V +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLogger;->info(Lkotlin/jvm/functions/Function0;)V +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLogger;->isLoggingEnabledFor(Lorg/slf4j/Logger;Lio/github/oshai/kotlinlogging/Level;Lio/github/oshai/kotlinlogging/Marker;)Z +Lio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLogger$WhenMappings; +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLogger$WhenMappings;->()V +Lio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLoggerFactory; +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLoggerFactory;->()V +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLoggerFactory;->()V +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLoggerFactory;->jLogger$kotlin_logging(Ljava/lang/String;)Lorg/slf4j/Logger; +SPLio/github/oshai/kotlinlogging/slf4j/internal/Slf4jLoggerFactory;->wrapJLogger$kotlin_logging(Lorg/slf4j/Logger;)Lio/github/oshai/kotlinlogging/KLogger; +Lj$/util/DesugarTimeZone; +SPLj$/util/DesugarTimeZone;->getTimeZone(Ljava/lang/String;)Ljava/util/TimeZone; +Lkotlin/Function; +Lkotlin/InitializedLazyImpl; +SPLkotlin/InitializedLazyImpl;->(Ljava/lang/Object;)V +Lkotlin/Lazy; +Lkotlin/LazyKt; +Lkotlin/LazyKt__LazyJVMKt; +SPLkotlin/LazyKt__LazyJVMKt;->lazy(Lkotlin/LazyThreadSafetyMode;Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy; +SPLkotlin/LazyKt__LazyJVMKt;->lazy(Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy; +Lkotlin/LazyKt__LazyJVMKt$WhenMappings; +SPLkotlin/LazyKt__LazyJVMKt$WhenMappings;->()V +Lkotlin/LazyKt__LazyKt; +SPLkotlin/LazyKt__LazyKt;->lazyOf(Ljava/lang/Object;)Lkotlin/Lazy; +Lkotlin/LazyThreadSafetyMode; +SPLkotlin/LazyThreadSafetyMode;->$values()[Lkotlin/LazyThreadSafetyMode; +SPLkotlin/LazyThreadSafetyMode;->()V +SPLkotlin/LazyThreadSafetyMode;->(Ljava/lang/String;I)V +SPLkotlin/LazyThreadSafetyMode;->values()[Lkotlin/LazyThreadSafetyMode; +Lkotlin/Metadata; +Lkotlin/NotImplementedError; +Lkotlin/Pair; +SPLkotlin/Pair;->(Ljava/lang/Object;Ljava/lang/Object;)V +SPLkotlin/Pair;->component1()Ljava/lang/Object; +SPLkotlin/Pair;->component2()Ljava/lang/Object; +SPLkotlin/Pair;->getFirst()Ljava/lang/Object; +SPLkotlin/Pair;->getSecond()Ljava/lang/Object; +SPLkotlin/Pair;->hashCode()I +Lkotlin/Result; +SPLkotlin/Result;->()V +SPLkotlin/Result;->constructor-impl(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlin/Result;->exceptionOrNull-impl(Ljava/lang/Object;)Ljava/lang/Throwable; +SPLkotlin/Result;->isFailure-impl(Ljava/lang/Object;)Z +SPLkotlin/Result;->isSuccess-impl(Ljava/lang/Object;)Z +Lkotlin/Result$Companion; +SPLkotlin/Result$Companion;->()V +SPLkotlin/Result$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/Result$Failure; +SPLkotlin/Result$Failure;->(Ljava/lang/Throwable;)V +Lkotlin/ResultKt; +SPLkotlin/ResultKt;->createFailure(Ljava/lang/Throwable;)Ljava/lang/Object; +SPLkotlin/ResultKt;->throwOnFailure(Ljava/lang/Object;)V +Lkotlin/SafePublicationLazyImpl; +SPLkotlin/SafePublicationLazyImpl;->()V +SPLkotlin/SafePublicationLazyImpl;->(Lkotlin/jvm/functions/Function0;)V +SPLkotlin/SafePublicationLazyImpl;->getValue()Ljava/lang/Object; +Lkotlin/SafePublicationLazyImpl$Companion; +SPLkotlin/SafePublicationLazyImpl$Companion;->()V +SPLkotlin/SafePublicationLazyImpl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/SynchronizedLazyImpl; +SPLkotlin/SynchronizedLazyImpl;->(Lkotlin/jvm/functions/Function0;Ljava/lang/Object;)V +SPLkotlin/SynchronizedLazyImpl;->(Lkotlin/jvm/functions/Function0;Ljava/lang/Object;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/SynchronizedLazyImpl;->getValue()Ljava/lang/Object; +SPLkotlin/SynchronizedLazyImpl;->isInitialized()Z +Lkotlin/TuplesKt; +SPLkotlin/TuplesKt;->to(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair; +Lkotlin/UByte; +SPLkotlin/UByte;->()V +Lkotlin/UByte$$ExternalSyntheticBackport0; +SPLkotlin/UByte$$ExternalSyntheticBackport0;->m(JJ)I +SPLkotlin/UByte$$ExternalSyntheticBackport0;->m(Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/UByte$$ExternalSyntheticBackport0;->m(Ljava/lang/Object;)V +SPLkotlin/UByte$$ExternalSyntheticBackport0;->m([Ljava/lang/Object;)Ljava/util/List; +Lkotlin/UByte$Companion; +SPLkotlin/UByte$Companion;->()V +SPLkotlin/UByte$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/UByteArray; +Lkotlin/UInt; +SPLkotlin/UInt;->()V +Lkotlin/UInt$Companion; +SPLkotlin/UInt$Companion;->()V +SPLkotlin/UInt$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/UIntArray; +Lkotlin/ULong; +SPLkotlin/ULong;->()V +SPLkotlin/ULong;->constructor-impl(J)J +Lkotlin/ULong$Companion; +SPLkotlin/ULong$Companion;->()V +SPLkotlin/ULong$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/ULongArray; +Lkotlin/UNINITIALIZED_VALUE; +SPLkotlin/UNINITIALIZED_VALUE;->()V +SPLkotlin/UNINITIALIZED_VALUE;->()V +Lkotlin/UShort; +SPLkotlin/UShort;->()V +Lkotlin/UShort$Companion; +SPLkotlin/UShort$Companion;->()V +SPLkotlin/UShort$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/UShortArray; +Lkotlin/Unit; +SPLkotlin/Unit;->()V +SPLkotlin/Unit;->()V +Lkotlin/annotation/MustBeDocumented; +Lkotlin/annotation/Retention; +Lkotlin/annotation/Target; +Lkotlin/collections/AbstractCollection; +SPLkotlin/collections/AbstractCollection;->()V +SPLkotlin/collections/AbstractCollection;->size()I +Lkotlin/collections/AbstractList; +SPLkotlin/collections/AbstractList;->()V +SPLkotlin/collections/AbstractList;->()V +SPLkotlin/collections/AbstractList;->iterator()Ljava/util/Iterator; +Lkotlin/collections/AbstractList$Companion; +SPLkotlin/collections/AbstractList$Companion;->()V +SPLkotlin/collections/AbstractList$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/collections/AbstractList$Companion;->checkElementIndex$kotlin_stdlib(II)V +SPLkotlin/collections/AbstractList$Companion;->newCapacity$kotlin_stdlib(II)I +Lkotlin/collections/AbstractList$IteratorImpl; +SPLkotlin/collections/AbstractList$IteratorImpl;->(Lkotlin/collections/AbstractList;)V +SPLkotlin/collections/AbstractList$IteratorImpl;->hasNext()Z +SPLkotlin/collections/AbstractList$IteratorImpl;->next()Ljava/lang/Object; +Lkotlin/collections/AbstractMutableList; +SPLkotlin/collections/AbstractMutableList;->()V +SPLkotlin/collections/AbstractMutableList;->size()I +Lkotlin/collections/AbstractMutableSet; +SPLkotlin/collections/AbstractMutableSet;->()V +SPLkotlin/collections/AbstractMutableSet;->size()I +Lkotlin/collections/ArrayAsCollection; +SPLkotlin/collections/ArrayAsCollection;->([Ljava/lang/Object;Z)V +SPLkotlin/collections/ArrayAsCollection;->toArray()[Ljava/lang/Object; +Lkotlin/collections/ArrayDeque; +SPLkotlin/collections/ArrayDeque;->()V +SPLkotlin/collections/ArrayDeque;->()V +SPLkotlin/collections/ArrayDeque;->addFirst(Ljava/lang/Object;)V +SPLkotlin/collections/ArrayDeque;->addLast(Ljava/lang/Object;)V +SPLkotlin/collections/ArrayDeque;->decremented(I)I +SPLkotlin/collections/ArrayDeque;->ensureCapacity(I)V +SPLkotlin/collections/ArrayDeque;->get(I)Ljava/lang/Object; +SPLkotlin/collections/ArrayDeque;->getSize()I +SPLkotlin/collections/ArrayDeque;->incremented(I)I +SPLkotlin/collections/ArrayDeque;->isEmpty()Z +SPLkotlin/collections/ArrayDeque;->positiveMod(I)I +SPLkotlin/collections/ArrayDeque;->registerModification()V +SPLkotlin/collections/ArrayDeque;->removeFirst()Ljava/lang/Object; +SPLkotlin/collections/ArrayDeque;->removeFirstOrNull()Ljava/lang/Object; +Lkotlin/collections/ArrayDeque$Companion; +SPLkotlin/collections/ArrayDeque$Companion;->()V +SPLkotlin/collections/ArrayDeque$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/collections/ArraysKt; +Lkotlin/collections/ArraysKt__ArraysJVMKt; +SPLkotlin/collections/ArraysKt__ArraysJVMKt;->copyOfRangeToIndexCheck(II)V +Lkotlin/collections/ArraysKt__ArraysKt; +Lkotlin/collections/ArraysKt___ArraysJvmKt; +SPLkotlin/collections/ArraysKt___ArraysJvmKt;->asList([Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto$default([I[IIIIILjava/lang/Object;)[I +SPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto$default([Ljava/lang/Object;[Ljava/lang/Object;IIIILjava/lang/Object;)[Ljava/lang/Object; +SPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([I[IIII)[I +SPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([Ljava/lang/Object;[Ljava/lang/Object;III)[Ljava/lang/Object; +SPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyOfRange([Ljava/lang/Object;II)[Ljava/lang/Object; +SPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill$default([JJIIILjava/lang/Object;)V +SPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill$default([Ljava/lang/Object;Ljava/lang/Object;IIILjava/lang/Object;)V +SPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill([JJII)V +SPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill([Ljava/lang/Object;Ljava/lang/Object;II)V +SPLkotlin/collections/ArraysKt___ArraysJvmKt;->sortWith([Ljava/lang/Object;Ljava/util/Comparator;)V +Lkotlin/collections/ArraysKt___ArraysKt; +SPLkotlin/collections/ArraysKt___ArraysKt;->filterNotNull([Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/ArraysKt___ArraysKt;->filterNotNullTo([Ljava/lang/Object;Ljava/util/Collection;)Ljava/util/Collection; +SPLkotlin/collections/ArraysKt___ArraysKt;->getLastIndex([Ljava/lang/Object;)I +SPLkotlin/collections/ArraysKt___ArraysKt;->sortedArrayWith([Ljava/lang/Object;Ljava/util/Comparator;)[Ljava/lang/Object; +SPLkotlin/collections/ArraysKt___ArraysKt;->sortedWith([Ljava/lang/Object;Ljava/util/Comparator;)Ljava/util/List; +SPLkotlin/collections/ArraysKt___ArraysKt;->toCollection([Ljava/lang/Object;Ljava/util/Collection;)Ljava/util/Collection; +SPLkotlin/collections/ArraysKt___ArraysKt;->toList([Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/ArraysKt___ArraysKt;->toSet([Ljava/lang/Object;)Ljava/util/Set; +Lkotlin/collections/ArraysUtilJVM; +SPLkotlin/collections/ArraysUtilJVM;->asList([Ljava/lang/Object;)Ljava/util/List; +Lkotlin/collections/CollectionsKt; +Lkotlin/collections/CollectionsKt__CollectionsJVMKt; +SPLkotlin/collections/CollectionsKt__CollectionsJVMKt;->build(Ljava/util/List;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt__CollectionsJVMKt;->copyToArrayOfAny([Ljava/lang/Object;Z)[Ljava/lang/Object; +SPLkotlin/collections/CollectionsKt__CollectionsJVMKt;->createListBuilder()Ljava/util/List; +SPLkotlin/collections/CollectionsKt__CollectionsJVMKt;->listOf(Ljava/lang/Object;)Ljava/util/List; +Lkotlin/collections/CollectionsKt__CollectionsKt; +SPLkotlin/collections/CollectionsKt__CollectionsKt;->asCollection([Ljava/lang/Object;Z)Ljava/util/Collection; +SPLkotlin/collections/CollectionsKt__CollectionsKt;->emptyList()Ljava/util/List; +SPLkotlin/collections/CollectionsKt__CollectionsKt;->getLastIndex(Ljava/util/List;)I +SPLkotlin/collections/CollectionsKt__CollectionsKt;->listOf([Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt__CollectionsKt;->listOfNotNull(Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt__CollectionsKt;->listOfNotNull([Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt__CollectionsKt;->mutableListOf([Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt__CollectionsKt;->optimizeReadOnlyList(Ljava/util/List;)Ljava/util/List; +Lkotlin/collections/CollectionsKt__IterablesKt; +SPLkotlin/collections/CollectionsKt__IterablesKt;->collectionSizeOrDefault(Ljava/lang/Iterable;I)I +SPLkotlin/collections/CollectionsKt__IterablesKt;->collectionSizeOrNull(Ljava/lang/Iterable;)Ljava/lang/Integer; +Lkotlin/collections/CollectionsKt__IteratorsJVMKt; +Lkotlin/collections/CollectionsKt__IteratorsKt; +Lkotlin/collections/CollectionsKt__MutableCollectionsJVMKt; +Lkotlin/collections/CollectionsKt__MutableCollectionsKt; +SPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->addAll(Ljava/util/Collection;Ljava/lang/Iterable;)Z +SPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->addAll(Ljava/util/Collection;[Ljava/lang/Object;)Z +SPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->removeLastOrNull(Ljava/util/List;)Ljava/lang/Object; +Lkotlin/collections/CollectionsKt__ReversedViewsKt; +Lkotlin/collections/CollectionsKt___CollectionsJvmKt; +Lkotlin/collections/CollectionsKt___CollectionsKt; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->any(Ljava/lang/Iterable;)Z +SPLkotlin/collections/CollectionsKt___CollectionsKt;->distinct(Ljava/lang/Iterable;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->joinTo$default(Ljava/lang/Iterable;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Appendable; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->joinTo(Ljava/lang/Iterable;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/Appendable; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->joinToString$default(Ljava/lang/Iterable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/String; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->joinToString(Ljava/lang/Iterable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/String; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->lastOrNull(Ljava/util/List;)Ljava/lang/Object; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->minOrNull(Ljava/lang/Iterable;)Ljava/lang/Comparable; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->plus(Ljava/util/Collection;Ljava/lang/Iterable;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->plus(Ljava/util/Collection;Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->plus(Ljava/util/Collection;[Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->singleOrNull(Ljava/util/List;)Ljava/lang/Object; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->sortedWith(Ljava/lang/Iterable;Ljava/util/Comparator;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->toCollection(Ljava/lang/Iterable;Ljava/util/Collection;)Ljava/util/Collection; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->toList(Ljava/lang/Iterable;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableList(Ljava/lang/Iterable;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableList(Ljava/util/Collection;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableSet(Ljava/lang/Iterable;)Ljava/util/Set; +SPLkotlin/collections/CollectionsKt___CollectionsKt;->toSet(Ljava/lang/Iterable;)Ljava/util/Set; +Lkotlin/collections/EmptyIterator; +SPLkotlin/collections/EmptyIterator;->()V +SPLkotlin/collections/EmptyIterator;->()V +SPLkotlin/collections/EmptyIterator;->hasNext()Z +Lkotlin/collections/EmptyList; +SPLkotlin/collections/EmptyList;->()V +SPLkotlin/collections/EmptyList;->()V +SPLkotlin/collections/EmptyList;->contains(Ljava/lang/Object;)Z +SPLkotlin/collections/EmptyList;->equals(Ljava/lang/Object;)Z +SPLkotlin/collections/EmptyList;->getSize()I +SPLkotlin/collections/EmptyList;->isEmpty()Z +SPLkotlin/collections/EmptyList;->iterator()Ljava/util/Iterator; +SPLkotlin/collections/EmptyList;->listIterator()Ljava/util/ListIterator; +SPLkotlin/collections/EmptyList;->size()I +Lkotlin/collections/EmptyMap; +SPLkotlin/collections/EmptyMap;->()V +SPLkotlin/collections/EmptyMap;->()V +SPLkotlin/collections/EmptyMap;->getKeys()Ljava/util/Set; +SPLkotlin/collections/EmptyMap;->getSize()I +SPLkotlin/collections/EmptyMap;->isEmpty()Z +SPLkotlin/collections/EmptyMap;->keySet()Ljava/util/Set; +SPLkotlin/collections/EmptyMap;->size()I +Lkotlin/collections/EmptySet; +SPLkotlin/collections/EmptySet;->()V +SPLkotlin/collections/EmptySet;->()V +SPLkotlin/collections/EmptySet;->iterator()Ljava/util/Iterator; +Lkotlin/collections/IndexedValue; +SPLkotlin/collections/IndexedValue;->(ILjava/lang/Object;)V +SPLkotlin/collections/IndexedValue;->getIndex()I +SPLkotlin/collections/IndexedValue;->getValue()Ljava/lang/Object; +Lkotlin/collections/MapsKt; +Lkotlin/collections/MapsKt__MapWithDefaultKt; +Lkotlin/collections/MapsKt__MapsJVMKt; +SPLkotlin/collections/MapsKt__MapsJVMKt;->build(Ljava/util/Map;)Ljava/util/Map; +SPLkotlin/collections/MapsKt__MapsJVMKt;->createMapBuilder()Ljava/util/Map; +SPLkotlin/collections/MapsKt__MapsJVMKt;->createMapBuilder(I)Ljava/util/Map; +SPLkotlin/collections/MapsKt__MapsJVMKt;->mapCapacity(I)I +SPLkotlin/collections/MapsKt__MapsJVMKt;->mapOf(Lkotlin/Pair;)Ljava/util/Map; +Lkotlin/collections/MapsKt__MapsKt; +SPLkotlin/collections/MapsKt__MapsKt;->emptyMap()Ljava/util/Map; +SPLkotlin/collections/MapsKt__MapsKt;->mapOf([Lkotlin/Pair;)Ljava/util/Map; +SPLkotlin/collections/MapsKt__MapsKt;->plus(Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map; +SPLkotlin/collections/MapsKt__MapsKt;->putAll(Ljava/util/Map;Ljava/lang/Iterable;)V +SPLkotlin/collections/MapsKt__MapsKt;->putAll(Ljava/util/Map;[Lkotlin/Pair;)V +SPLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/lang/Iterable;)Ljava/util/Map; +SPLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/lang/Iterable;Ljava/util/Map;)Ljava/util/Map; +SPLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/util/Map;)Ljava/util/Map; +SPLkotlin/collections/MapsKt__MapsKt;->toMap([Lkotlin/Pair;Ljava/util/Map;)Ljava/util/Map; +SPLkotlin/collections/MapsKt__MapsKt;->toMutableMap(Ljava/util/Map;)Ljava/util/Map; +Lkotlin/collections/MapsKt___MapsJvmKt; +Lkotlin/collections/MapsKt___MapsKt; +Lkotlin/collections/SetsKt; +Lkotlin/collections/SetsKt__SetsJVMKt; +SPLkotlin/collections/SetsKt__SetsJVMKt;->build(Ljava/util/Set;)Ljava/util/Set; +SPLkotlin/collections/SetsKt__SetsJVMKt;->createSetBuilder()Ljava/util/Set; +SPLkotlin/collections/SetsKt__SetsJVMKt;->setOf(Ljava/lang/Object;)Ljava/util/Set; +Lkotlin/collections/SetsKt__SetsKt; +SPLkotlin/collections/SetsKt__SetsKt;->emptySet()Ljava/util/Set; +SPLkotlin/collections/SetsKt__SetsKt;->setOf([Ljava/lang/Object;)Ljava/util/Set; +Lkotlin/collections/SetsKt___SetsKt; +SPLkotlin/collections/SetsKt___SetsKt;->plus(Ljava/util/Set;Ljava/lang/Iterable;)Ljava/util/Set; +SPLkotlin/collections/SetsKt___SetsKt;->plus(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/Set; +Lkotlin/collections/builders/ListBuilder; +SPLkotlin/collections/builders/ListBuilder;->()V +SPLkotlin/collections/builders/ListBuilder;->(I)V +SPLkotlin/collections/builders/ListBuilder;->(IILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/collections/builders/ListBuilder;->add(Ljava/lang/Object;)Z +SPLkotlin/collections/builders/ListBuilder;->addAll(Ljava/util/Collection;)Z +SPLkotlin/collections/builders/ListBuilder;->addAllInternal(ILjava/util/Collection;I)V +SPLkotlin/collections/builders/ListBuilder;->addAtInternal(ILjava/lang/Object;)V +SPLkotlin/collections/builders/ListBuilder;->build()Ljava/util/List; +SPLkotlin/collections/builders/ListBuilder;->checkIsMutable()V +SPLkotlin/collections/builders/ListBuilder;->ensureCapacityInternal(I)V +SPLkotlin/collections/builders/ListBuilder;->ensureExtraCapacity(I)V +SPLkotlin/collections/builders/ListBuilder;->getSize()I +SPLkotlin/collections/builders/ListBuilder;->insertAtInternal(II)V +SPLkotlin/collections/builders/ListBuilder;->isEmpty()Z +SPLkotlin/collections/builders/ListBuilder;->registerModification()V +Lkotlin/collections/builders/ListBuilder$Companion; +SPLkotlin/collections/builders/ListBuilder$Companion;->()V +SPLkotlin/collections/builders/ListBuilder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/collections/builders/ListBuilderKt; +SPLkotlin/collections/builders/ListBuilderKt;->arrayOfUninitializedElements(I)[Ljava/lang/Object; +SPLkotlin/collections/builders/ListBuilderKt;->copyOfUninitializedElements([Ljava/lang/Object;I)[Ljava/lang/Object; +Lkotlin/collections/builders/MapBuilder; +SPLkotlin/collections/builders/MapBuilder;->()V +SPLkotlin/collections/builders/MapBuilder;->()V +SPLkotlin/collections/builders/MapBuilder;->(I)V +SPLkotlin/collections/builders/MapBuilder;->([Ljava/lang/Object;[Ljava/lang/Object;[I[III)V +SPLkotlin/collections/builders/MapBuilder;->access$getEmpty$cp()Lkotlin/collections/builders/MapBuilder; +SPLkotlin/collections/builders/MapBuilder;->access$getKeysArray$p(Lkotlin/collections/builders/MapBuilder;)[Ljava/lang/Object; +SPLkotlin/collections/builders/MapBuilder;->access$getLength$p(Lkotlin/collections/builders/MapBuilder;)I +SPLkotlin/collections/builders/MapBuilder;->access$getModCount$p(Lkotlin/collections/builders/MapBuilder;)I +SPLkotlin/collections/builders/MapBuilder;->access$getPresenceArray$p(Lkotlin/collections/builders/MapBuilder;)[I +SPLkotlin/collections/builders/MapBuilder;->addKey$kotlin_stdlib(Ljava/lang/Object;)I +SPLkotlin/collections/builders/MapBuilder;->allocateValuesArray()[Ljava/lang/Object; +SPLkotlin/collections/builders/MapBuilder;->build()Ljava/util/Map; +SPLkotlin/collections/builders/MapBuilder;->checkIsMutable$kotlin_stdlib()V +SPLkotlin/collections/builders/MapBuilder;->ensureCapacity(I)V +SPLkotlin/collections/builders/MapBuilder;->ensureExtraCapacity(I)V +SPLkotlin/collections/builders/MapBuilder;->findKey(Ljava/lang/Object;)I +SPLkotlin/collections/builders/MapBuilder;->get(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlin/collections/builders/MapBuilder;->getCapacity$kotlin_stdlib()I +SPLkotlin/collections/builders/MapBuilder;->getHashSize()I +SPLkotlin/collections/builders/MapBuilder;->getSize()I +SPLkotlin/collections/builders/MapBuilder;->hash(Ljava/lang/Object;)I +SPLkotlin/collections/builders/MapBuilder;->isEmpty()Z +SPLkotlin/collections/builders/MapBuilder;->keysIterator$kotlin_stdlib()Lkotlin/collections/builders/MapBuilder$KeysItr; +SPLkotlin/collections/builders/MapBuilder;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlin/collections/builders/MapBuilder;->putRehash(I)Z +SPLkotlin/collections/builders/MapBuilder;->registerModification()V +SPLkotlin/collections/builders/MapBuilder;->rehash(I)V +SPLkotlin/collections/builders/MapBuilder;->shouldCompact(I)Z +SPLkotlin/collections/builders/MapBuilder;->size()I +Lkotlin/collections/builders/MapBuilder$Companion; +SPLkotlin/collections/builders/MapBuilder$Companion;->()V +SPLkotlin/collections/builders/MapBuilder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/collections/builders/MapBuilder$Companion;->access$computeHashSize(Lkotlin/collections/builders/MapBuilder$Companion;I)I +SPLkotlin/collections/builders/MapBuilder$Companion;->access$computeShift(Lkotlin/collections/builders/MapBuilder$Companion;I)I +SPLkotlin/collections/builders/MapBuilder$Companion;->computeHashSize(I)I +SPLkotlin/collections/builders/MapBuilder$Companion;->computeShift(I)I +SPLkotlin/collections/builders/MapBuilder$Companion;->getEmpty$kotlin_stdlib()Lkotlin/collections/builders/MapBuilder; +Lkotlin/collections/builders/MapBuilder$Itr; +SPLkotlin/collections/builders/MapBuilder$Itr;->(Lkotlin/collections/builders/MapBuilder;)V +SPLkotlin/collections/builders/MapBuilder$Itr;->checkForComodification$kotlin_stdlib()V +SPLkotlin/collections/builders/MapBuilder$Itr;->getIndex$kotlin_stdlib()I +SPLkotlin/collections/builders/MapBuilder$Itr;->getLastIndex$kotlin_stdlib()I +SPLkotlin/collections/builders/MapBuilder$Itr;->getMap$kotlin_stdlib()Lkotlin/collections/builders/MapBuilder; +SPLkotlin/collections/builders/MapBuilder$Itr;->hasNext()Z +SPLkotlin/collections/builders/MapBuilder$Itr;->initNext$kotlin_stdlib()V +SPLkotlin/collections/builders/MapBuilder$Itr;->setIndex$kotlin_stdlib(I)V +SPLkotlin/collections/builders/MapBuilder$Itr;->setLastIndex$kotlin_stdlib(I)V +Lkotlin/collections/builders/MapBuilder$KeysItr; +SPLkotlin/collections/builders/MapBuilder$KeysItr;->(Lkotlin/collections/builders/MapBuilder;)V +SPLkotlin/collections/builders/MapBuilder$KeysItr;->next()Ljava/lang/Object; +Lkotlin/collections/builders/SetBuilder; +SPLkotlin/collections/builders/SetBuilder;->()V +SPLkotlin/collections/builders/SetBuilder;->()V +SPLkotlin/collections/builders/SetBuilder;->(Lkotlin/collections/builders/MapBuilder;)V +SPLkotlin/collections/builders/SetBuilder;->add(Ljava/lang/Object;)Z +SPLkotlin/collections/builders/SetBuilder;->build()Ljava/util/Set; +SPLkotlin/collections/builders/SetBuilder;->getSize()I +SPLkotlin/collections/builders/SetBuilder;->isEmpty()Z +SPLkotlin/collections/builders/SetBuilder;->iterator()Ljava/util/Iterator; +Lkotlin/collections/builders/SetBuilder$Companion; +SPLkotlin/collections/builders/SetBuilder$Companion;->()V +SPLkotlin/collections/builders/SetBuilder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/comparisons/ComparisonsKt; +Lkotlin/comparisons/ComparisonsKt__ComparisonsKt; +SPLkotlin/comparisons/ComparisonsKt__ComparisonsKt;->compareValues(Ljava/lang/Comparable;Ljava/lang/Comparable;)I +Lkotlin/comparisons/ComparisonsKt___ComparisonsJvmKt; +Lkotlin/comparisons/ComparisonsKt___ComparisonsKt; +Lkotlin/coroutines/AbstractCoroutineContextElement; +SPLkotlin/coroutines/AbstractCoroutineContextElement;->(Lkotlin/coroutines/CoroutineContext$Key;)V +SPLkotlin/coroutines/AbstractCoroutineContextElement;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlin/coroutines/AbstractCoroutineContextElement;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLkotlin/coroutines/AbstractCoroutineContextElement;->getKey()Lkotlin/coroutines/CoroutineContext$Key; +SPLkotlin/coroutines/AbstractCoroutineContextElement;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +Lkotlin/coroutines/AbstractCoroutineContextKey; +SPLkotlin/coroutines/AbstractCoroutineContextKey;->(Lkotlin/coroutines/CoroutineContext$Key;Lkotlin/jvm/functions/Function1;)V +Lkotlin/coroutines/CombinedContext; +SPLkotlin/coroutines/CombinedContext;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext$Element;)V +SPLkotlin/coroutines/CombinedContext;->contains(Lkotlin/coroutines/CoroutineContext$Element;)Z +SPLkotlin/coroutines/CombinedContext;->containsAll(Lkotlin/coroutines/CombinedContext;)Z +SPLkotlin/coroutines/CombinedContext;->equals(Ljava/lang/Object;)Z +SPLkotlin/coroutines/CombinedContext;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlin/coroutines/CombinedContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLkotlin/coroutines/CombinedContext;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +SPLkotlin/coroutines/CombinedContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +SPLkotlin/coroutines/CombinedContext;->size()I +Lkotlin/coroutines/Continuation; +Lkotlin/coroutines/ContinuationInterceptor; +SPLkotlin/coroutines/ContinuationInterceptor;->()V +Lkotlin/coroutines/ContinuationInterceptor$DefaultImpls; +HSPLkotlin/coroutines/ContinuationInterceptor$DefaultImpls;->get(Lkotlin/coroutines/ContinuationInterceptor;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLkotlin/coroutines/ContinuationInterceptor$DefaultImpls;->minusKey(Lkotlin/coroutines/ContinuationInterceptor;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +Lkotlin/coroutines/ContinuationInterceptor$Key; +SPLkotlin/coroutines/ContinuationInterceptor$Key;->()V +SPLkotlin/coroutines/ContinuationInterceptor$Key;->()V +Lkotlin/coroutines/ContinuationKt; +SPLkotlin/coroutines/ContinuationKt;->startCoroutine(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +Lkotlin/coroutines/CoroutineContext; +Lkotlin/coroutines/CoroutineContext$DefaultImpls; +HSPLkotlin/coroutines/CoroutineContext$DefaultImpls;->plus$lambda$0(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext$Element;)Lkotlin/coroutines/CoroutineContext; +SPLkotlin/coroutines/CoroutineContext$DefaultImpls;->plus(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +Lkotlin/coroutines/CoroutineContext$DefaultImpls$$ExternalSyntheticLambda0; +SPLkotlin/coroutines/CoroutineContext$DefaultImpls$$ExternalSyntheticLambda0;->()V +SPLkotlin/coroutines/CoroutineContext$DefaultImpls$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lkotlin/coroutines/CoroutineContext$Element; +Lkotlin/coroutines/CoroutineContext$Element$DefaultImpls; +SPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->fold(Lkotlin/coroutines/CoroutineContext$Element;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->get(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->minusKey(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +SPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->plus(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +Lkotlin/coroutines/CoroutineContext$Key; +Lkotlin/coroutines/EmptyCoroutineContext; +SPLkotlin/coroutines/EmptyCoroutineContext;->()V +SPLkotlin/coroutines/EmptyCoroutineContext;->()V +SPLkotlin/coroutines/EmptyCoroutineContext;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlin/coroutines/EmptyCoroutineContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLkotlin/coroutines/EmptyCoroutineContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +Lkotlin/coroutines/intrinsics/CoroutineSingletons; +SPLkotlin/coroutines/intrinsics/CoroutineSingletons;->$values()[Lkotlin/coroutines/intrinsics/CoroutineSingletons; +SPLkotlin/coroutines/intrinsics/CoroutineSingletons;->()V +SPLkotlin/coroutines/intrinsics/CoroutineSingletons;->(Ljava/lang/String;I)V +Lkotlin/coroutines/intrinsics/IntrinsicsKt; +Lkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsJvmKt; +SPLkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsJvmKt;->createCoroutineUnintercepted(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsJvmKt;->intercepted(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +Lkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsKt; +SPLkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsKt;->getCOROUTINE_SUSPENDED()Ljava/lang/Object; +Lkotlin/coroutines/jvm/internal/BaseContinuationImpl; +SPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->(Lkotlin/coroutines/Continuation;)V +SPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->resumeWith(Ljava/lang/Object;)V +Lkotlin/coroutines/jvm/internal/Boxing; +SPLkotlin/coroutines/jvm/internal/Boxing;->boxBoolean(Z)Ljava/lang/Boolean; +SPLkotlin/coroutines/jvm/internal/Boxing;->boxInt(I)Ljava/lang/Integer; +SPLkotlin/coroutines/jvm/internal/Boxing;->boxLong(J)Ljava/lang/Long; +Lkotlin/coroutines/jvm/internal/CompletedContinuation; +SPLkotlin/coroutines/jvm/internal/CompletedContinuation;->()V +SPLkotlin/coroutines/jvm/internal/CompletedContinuation;->()V +Lkotlin/coroutines/jvm/internal/ContinuationImpl; +SPLkotlin/coroutines/jvm/internal/ContinuationImpl;->(Lkotlin/coroutines/Continuation;)V +SPLkotlin/coroutines/jvm/internal/ContinuationImpl;->(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V +SPLkotlin/coroutines/jvm/internal/ContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext; +SPLkotlin/coroutines/jvm/internal/ContinuationImpl;->intercepted()Lkotlin/coroutines/Continuation; +SPLkotlin/coroutines/jvm/internal/ContinuationImpl;->releaseIntercepted()V +Lkotlin/coroutines/jvm/internal/CoroutineStackFrame; +Lkotlin/coroutines/jvm/internal/DebugProbesKt; +SPLkotlin/coroutines/jvm/internal/DebugProbesKt;->probeCoroutineCreated(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLkotlin/coroutines/jvm/internal/DebugProbesKt;->probeCoroutineResumed(Lkotlin/coroutines/Continuation;)V +SPLkotlin/coroutines/jvm/internal/DebugProbesKt;->probeCoroutineSuspended(Lkotlin/coroutines/Continuation;)V +Lkotlin/coroutines/jvm/internal/SpillingKt; +SPLkotlin/coroutines/jvm/internal/SpillingKt;->nullOutSpilledVariable(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlin/coroutines/jvm/internal/SuspendFunction; +Lkotlin/coroutines/jvm/internal/SuspendLambda; +SPLkotlin/coroutines/jvm/internal/SuspendLambda;->(ILkotlin/coroutines/Continuation;)V +SPLkotlin/coroutines/jvm/internal/SuspendLambda;->getArity()I +Lkotlin/enums/EnumEntries; +Lkotlin/enums/EnumEntriesKt; +SPLkotlin/enums/EnumEntriesKt;->enumEntries([Ljava/lang/Enum;)Lkotlin/enums/EnumEntries; +Lkotlin/enums/EnumEntriesList; +SPLkotlin/enums/EnumEntriesList;->([Ljava/lang/Enum;)V +SPLkotlin/enums/EnumEntriesList;->get(I)Ljava/lang/Enum; +SPLkotlin/enums/EnumEntriesList;->get(I)Ljava/lang/Object; +SPLkotlin/enums/EnumEntriesList;->getSize()I +Lkotlin/internal/PlatformImplementations; +SPLkotlin/internal/PlatformImplementations;->()V +Lkotlin/internal/PlatformImplementationsKt; +SPLkotlin/internal/PlatformImplementationsKt;->()V +Lkotlin/internal/ProgressionUtilKt; +SPLkotlin/internal/ProgressionUtilKt;->getProgressionLastElement(III)I +Lkotlin/internal/jdk7/JDK7PlatformImplementations; +SPLkotlin/internal/jdk7/JDK7PlatformImplementations;->()V +Lkotlin/internal/jdk8/JDK8PlatformImplementations; +SPLkotlin/internal/jdk8/JDK8PlatformImplementations;->()V +SPLkotlin/internal/jdk8/JDK8PlatformImplementations;->defaultPlatformRandom()Lkotlin/random/Random; +SPLkotlin/internal/jdk8/JDK8PlatformImplementations;->sdkIsNullOrAtLeast(I)Z +Lkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion; +SPLkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion;->()V +SPLkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion;->()V +Lkotlin/io/CloseableKt; +SPLkotlin/io/CloseableKt;->closeFinally(Ljava/io/Closeable;Ljava/lang/Throwable;)V +Lkotlin/io/FileSystemException; +Lkotlin/io/FilesKt; +Lkotlin/io/FilesKt__FilePathComponentsKt; +Lkotlin/io/FilesKt__FileReadWriteKt; +SPLkotlin/io/FilesKt__FileReadWriteKt;->readText$default(Ljava/io/File;Ljava/nio/charset/Charset;ILjava/lang/Object;)Ljava/lang/String; +SPLkotlin/io/FilesKt__FileReadWriteKt;->readText(Ljava/io/File;Ljava/nio/charset/Charset;)Ljava/lang/String; +Lkotlin/io/FilesKt__FileTreeWalkKt; +Lkotlin/io/FilesKt__UtilsKt; +Lkotlin/io/TerminateException; +Lkotlin/io/TextStreamsKt; +SPLkotlin/io/TextStreamsKt;->copyTo$default(Ljava/io/Reader;Ljava/io/Writer;IILjava/lang/Object;)J +SPLkotlin/io/TextStreamsKt;->copyTo(Ljava/io/Reader;Ljava/io/Writer;I)J +SPLkotlin/io/TextStreamsKt;->readText(Ljava/io/Reader;)Ljava/lang/String; +Lkotlin/jdk7/AutoCloseableKt; +SPLkotlin/jdk7/AutoCloseableKt;->closeFinally(Ljava/lang/AutoCloseable;Ljava/lang/Throwable;)V +Lkotlin/jvm/JvmClassMappingKt; +SPLkotlin/jvm/JvmClassMappingKt;->getJavaClass(Lkotlin/reflect/KClass;)Ljava/lang/Class; +SPLkotlin/jvm/JvmClassMappingKt;->getJavaObjectType(Lkotlin/reflect/KClass;)Ljava/lang/Class; +SPLkotlin/jvm/JvmClassMappingKt;->getJavaPrimitiveType(Lkotlin/reflect/KClass;)Ljava/lang/Class; +SPLkotlin/jvm/JvmClassMappingKt;->getKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/KClass; +Lkotlin/jvm/functions/Function0; +Lkotlin/jvm/functions/Function1; +Lkotlin/jvm/functions/Function10; +Lkotlin/jvm/functions/Function11; +Lkotlin/jvm/functions/Function12; +Lkotlin/jvm/functions/Function13; +Lkotlin/jvm/functions/Function14; +Lkotlin/jvm/functions/Function15; +Lkotlin/jvm/functions/Function16; +Lkotlin/jvm/functions/Function17; +Lkotlin/jvm/functions/Function18; +Lkotlin/jvm/functions/Function19; +Lkotlin/jvm/functions/Function2; +Lkotlin/jvm/functions/Function20; +Lkotlin/jvm/functions/Function21; +Lkotlin/jvm/functions/Function22; +Lkotlin/jvm/functions/Function3; +Lkotlin/jvm/functions/Function4; +Lkotlin/jvm/functions/Function5; +Lkotlin/jvm/functions/Function6; +Lkotlin/jvm/functions/Function7; +Lkotlin/jvm/functions/Function8; +Lkotlin/jvm/functions/Function9; +Lkotlin/jvm/internal/AdaptedFunctionReference; +SPLkotlin/jvm/internal/AdaptedFunctionReference;->(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +SPLkotlin/jvm/internal/AdaptedFunctionReference;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +Lkotlin/jvm/internal/BooleanCompanionObject; +SPLkotlin/jvm/internal/BooleanCompanionObject;->()V +SPLkotlin/jvm/internal/BooleanCompanionObject;->()V +Lkotlin/jvm/internal/ByteCompanionObject; +SPLkotlin/jvm/internal/ByteCompanionObject;->()V +SPLkotlin/jvm/internal/ByteCompanionObject;->()V +Lkotlin/jvm/internal/CallableReference; +SPLkotlin/jvm/internal/CallableReference;->()V +SPLkotlin/jvm/internal/CallableReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Z)V +SPLkotlin/jvm/internal/CallableReference;->getName()Ljava/lang/String; +SPLkotlin/jvm/internal/CallableReference;->getOwner()Lkotlin/reflect/KDeclarationContainer; +SPLkotlin/jvm/internal/CallableReference;->getSignature()Ljava/lang/String; +Lkotlin/jvm/internal/CallableReference$NoReceiver; +SPLkotlin/jvm/internal/CallableReference$NoReceiver;->()V +SPLkotlin/jvm/internal/CallableReference$NoReceiver;->()V +SPLkotlin/jvm/internal/CallableReference$NoReceiver;->access$000()Lkotlin/jvm/internal/CallableReference$NoReceiver; +Lkotlin/jvm/internal/CharCompanionObject; +SPLkotlin/jvm/internal/CharCompanionObject;->()V +SPLkotlin/jvm/internal/CharCompanionObject;->()V +Lkotlin/jvm/internal/ClassBasedDeclarationContainer; +Lkotlin/jvm/internal/DefaultConstructorMarker; +Lkotlin/jvm/internal/DoubleCompanionObject; +SPLkotlin/jvm/internal/DoubleCompanionObject;->()V +SPLkotlin/jvm/internal/DoubleCompanionObject;->()V +Lkotlin/jvm/internal/FloatCompanionObject; +SPLkotlin/jvm/internal/FloatCompanionObject;->()V +SPLkotlin/jvm/internal/FloatCompanionObject;->()V +Lkotlin/jvm/internal/FunctionAdapter; +Lkotlin/jvm/internal/FunctionBase; +Lkotlin/jvm/internal/FunctionReference; +SPLkotlin/jvm/internal/FunctionReference;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +SPLkotlin/jvm/internal/FunctionReference;->getArity()I +Lkotlin/jvm/internal/FunctionReferenceImpl; +SPLkotlin/jvm/internal/FunctionReferenceImpl;->(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +SPLkotlin/jvm/internal/FunctionReferenceImpl;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +Lkotlin/jvm/internal/IntCompanionObject; +SPLkotlin/jvm/internal/IntCompanionObject;->()V +SPLkotlin/jvm/internal/IntCompanionObject;->()V +Lkotlin/jvm/internal/Intrinsics; +HSPLkotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z +SPLkotlin/jvm/internal/Intrinsics;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V +SPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;)V +SPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V +SPLkotlin/jvm/internal/Intrinsics;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V +SPLkotlin/jvm/internal/Intrinsics;->checkNotNullParameter(Ljava/lang/Object;Ljava/lang/String;)V +SPLkotlin/jvm/internal/Intrinsics;->checkParameterIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V +SPLkotlin/jvm/internal/Intrinsics;->compare(II)I +Lkotlin/jvm/internal/Intrinsics$Kotlin; +Lkotlin/jvm/internal/KTypeBase; +Lkotlin/jvm/internal/KotlinGenericDeclaration; +Lkotlin/jvm/internal/Lambda; +SPLkotlin/jvm/internal/Lambda;->(I)V +Lkotlin/jvm/internal/LongCompanionObject; +SPLkotlin/jvm/internal/LongCompanionObject;->()V +SPLkotlin/jvm/internal/LongCompanionObject;->()V +Lkotlin/jvm/internal/MagicApiIntrinsics; +SPLkotlin/jvm/internal/MagicApiIntrinsics;->voidMagicApiCall(Ljava/lang/Object;)V +Lkotlin/jvm/internal/MutablePropertyReference; +SPLkotlin/jvm/internal/MutablePropertyReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +Lkotlin/jvm/internal/MutablePropertyReference1; +SPLkotlin/jvm/internal/MutablePropertyReference1;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +Lkotlin/jvm/internal/MutablePropertyReference1Impl; +SPLkotlin/jvm/internal/MutablePropertyReference1Impl;->(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +Lkotlin/jvm/internal/PropertyReference; +SPLkotlin/jvm/internal/PropertyReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +Lkotlin/jvm/internal/PropertyReference1; +SPLkotlin/jvm/internal/PropertyReference1;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +Lkotlin/jvm/internal/PropertyReference1Impl; +SPLkotlin/jvm/internal/PropertyReference1Impl;->(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +Lkotlin/jvm/internal/Ref$BooleanRef; +SPLkotlin/jvm/internal/Ref$BooleanRef;->()V +Lkotlin/jvm/internal/Ref$IntRef; +SPLkotlin/jvm/internal/Ref$IntRef;->()V +Lkotlin/jvm/internal/Ref$ObjectRef; +SPLkotlin/jvm/internal/Ref$ObjectRef;->()V +Lkotlin/jvm/internal/Reflection; +SPLkotlin/jvm/internal/Reflection;->()V +SPLkotlin/jvm/internal/Reflection;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/KClass; +SPLkotlin/jvm/internal/Reflection;->mutableProperty1(Lkotlin/jvm/internal/MutablePropertyReference1;)Lkotlin/reflect/KMutableProperty1; +SPLkotlin/jvm/internal/Reflection;->nullableTypeOf(Ljava/lang/Class;)Lkotlin/reflect/KType; +Lkotlin/jvm/internal/ReflectionFactory; +SPLkotlin/jvm/internal/ReflectionFactory;->()V +Lkotlin/jvm/internal/ShortCompanionObject; +SPLkotlin/jvm/internal/ShortCompanionObject;->()V +SPLkotlin/jvm/internal/ShortCompanionObject;->()V +Lkotlin/jvm/internal/SpreadBuilder; +SPLkotlin/jvm/internal/SpreadBuilder;->(I)V +SPLkotlin/jvm/internal/SpreadBuilder;->addSpread(Ljava/lang/Object;)V +SPLkotlin/jvm/internal/SpreadBuilder;->size()I +SPLkotlin/jvm/internal/SpreadBuilder;->toArray([Ljava/lang/Object;)[Ljava/lang/Object; +Lkotlin/jvm/internal/StringCompanionObject; +SPLkotlin/jvm/internal/StringCompanionObject;->()V +SPLkotlin/jvm/internal/StringCompanionObject;->()V +Lkotlin/jvm/internal/TypeIntrinsics; +SPLkotlin/jvm/internal/TypeIntrinsics;->beforeCheckcastToFunctionOfArity(Ljava/lang/Object;I)Ljava/lang/Object; +SPLkotlin/jvm/internal/TypeIntrinsics;->getFunctionArity(Ljava/lang/Object;)I +SPLkotlin/jvm/internal/TypeIntrinsics;->isFunctionOfArity(Ljava/lang/Object;I)Z +Lkotlin/jvm/internal/markers/KMappedMarker; +Lkotlin/jvm/internal/markers/KMutableCollection; +Lkotlin/jvm/internal/markers/KMutableIterable; +Lkotlin/jvm/internal/markers/KMutableIterator; +Lkotlin/jvm/internal/markers/KMutableList; +Lkotlin/jvm/internal/markers/KMutableMap; +Lkotlin/jvm/internal/markers/KMutableSet; +Lkotlin/properties/Delegates; +SPLkotlin/properties/Delegates;->()V +SPLkotlin/properties/Delegates;->()V +Lkotlin/properties/ObservableProperty; +SPLkotlin/properties/ObservableProperty;->(Ljava/lang/Object;)V +SPLkotlin/properties/ObservableProperty;->beforeChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)Z +SPLkotlin/properties/ObservableProperty;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; +SPLkotlin/properties/ObservableProperty;->setValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;Ljava/lang/Object;)V +Lkotlin/properties/ReadOnlyProperty; +Lkotlin/properties/ReadWriteProperty; +Lkotlin/random/AbstractPlatformRandom; +SPLkotlin/random/AbstractPlatformRandom;->()V +SPLkotlin/random/AbstractPlatformRandom;->nextInt(I)I +Lkotlin/random/Random; +SPLkotlin/random/Random;->()V +SPLkotlin/random/Random;->()V +SPLkotlin/random/Random;->access$getDefaultRandom$cp()Lkotlin/random/Random; +Lkotlin/random/Random$Default; +SPLkotlin/random/Random$Default;->()V +SPLkotlin/random/Random$Default;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/random/Random$Default;->nextInt(I)I +SPLkotlin/random/Random$Default;->nextInt(II)I +Lkotlin/random/jdk8/PlatformThreadLocalRandom; +SPLkotlin/random/jdk8/PlatformThreadLocalRandom;->()V +SPLkotlin/random/jdk8/PlatformThreadLocalRandom;->getImpl()Ljava/util/Random; +SPLkotlin/random/jdk8/PlatformThreadLocalRandom;->nextInt(II)I +Lkotlin/ranges/ClosedRange; +Lkotlin/ranges/IntProgression; +SPLkotlin/ranges/IntProgression;->()V +SPLkotlin/ranges/IntProgression;->(III)V +SPLkotlin/ranges/IntProgression;->getFirst()I +SPLkotlin/ranges/IntProgression;->getLast()I +Lkotlin/ranges/IntProgression$Companion; +SPLkotlin/ranges/IntProgression$Companion;->()V +SPLkotlin/ranges/IntProgression$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/ranges/IntRange; +SPLkotlin/ranges/IntRange;->()V +SPLkotlin/ranges/IntRange;->(II)V +SPLkotlin/ranges/IntRange;->access$getEMPTY$cp()Lkotlin/ranges/IntRange; +Lkotlin/ranges/IntRange$Companion; +SPLkotlin/ranges/IntRange$Companion;->()V +SPLkotlin/ranges/IntRange$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/ranges/IntRange$Companion;->getEMPTY()Lkotlin/ranges/IntRange; +Lkotlin/ranges/OpenEndRange; +Lkotlin/ranges/RangesKt; +Lkotlin/ranges/RangesKt__RangesKt; +Lkotlin/ranges/RangesKt___RangesKt; +SPLkotlin/ranges/RangesKt___RangesKt;->coerceAtLeast(II)I +SPLkotlin/ranges/RangesKt___RangesKt;->coerceAtLeast(JJ)J +SPLkotlin/ranges/RangesKt___RangesKt;->coerceAtMost(II)I +SPLkotlin/ranges/RangesKt___RangesKt;->coerceAtMost(JJ)J +Lkotlin/reflect/KAnnotatedElement; +Lkotlin/reflect/KCallable; +Lkotlin/reflect/KClass; +Lkotlin/reflect/KClassifier; +Lkotlin/reflect/KDeclarationContainer; +Lkotlin/reflect/KFunction; +Lkotlin/reflect/KMutableProperty; +Lkotlin/reflect/KMutableProperty1; +Lkotlin/reflect/KProperty; +Lkotlin/reflect/KProperty1; +Lkotlin/reflect/KType; +Lkotlin/reflect/full/KClassifiers; +SPLkotlin/reflect/full/KClassifiers;->createTypeImpl$default(Lkotlin/reflect/KClassifier;Ljava/util/List;ZLjava/util/List;Lkotlin/reflect/KClass;ILjava/lang/Object;)Lkotlin/reflect/jvm/internal/types/AbstractKType; +SPLkotlin/reflect/full/KClassifiers;->createTypeImpl(Lkotlin/reflect/KClassifier;Ljava/util/List;ZLjava/util/List;Lkotlin/reflect/KClass;)Lkotlin/reflect/jvm/internal/types/AbstractKType; +Lkotlin/reflect/jvm/internal/CacheByClass; +SPLkotlin/reflect/jvm/internal/CacheByClass;->()V +Lkotlin/reflect/jvm/internal/CacheByClassKt; +SPLkotlin/reflect/jvm/internal/CacheByClassKt;->()V +SPLkotlin/reflect/jvm/internal/CacheByClassKt;->createCache(Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/CacheByClass; +Lkotlin/reflect/jvm/internal/CachesKt; +SPLkotlin/reflect/jvm/internal/CachesKt;->()V +SPLkotlin/reflect/jvm/internal/CachesKt;->CACHE_FOR_NULLABLE_BASE_CLASSIFIERS$lambda$0(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/types/AbstractKType; +SPLkotlin/reflect/jvm/internal/CachesKt;->K_CLASS_CACHE$lambda$0(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/KClassImpl; +SPLkotlin/reflect/jvm/internal/CachesKt;->accessor$CachesKt$lambda0(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/KClassImpl; +SPLkotlin/reflect/jvm/internal/CachesKt;->accessor$CachesKt$lambda3(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/types/AbstractKType; +SPLkotlin/reflect/jvm/internal/CachesKt;->getOrCreateKType(Ljava/lang/Class;Ljava/util/List;Z)Lkotlin/reflect/KType; +SPLkotlin/reflect/jvm/internal/CachesKt;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/KClassImpl; +Lkotlin/reflect/jvm/internal/CachesKt$$Lambda$0; +SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$0;->()V +SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$0;->()V +SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlin/reflect/jvm/internal/CachesKt$$Lambda$1; +SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$1;->()V +SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$1;->()V +Lkotlin/reflect/jvm/internal/CachesKt$$Lambda$2; +SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$2;->()V +SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$2;->()V +Lkotlin/reflect/jvm/internal/CachesKt$$Lambda$3; +SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$3;->()V +SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$3;->()V +SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlin/reflect/jvm/internal/CachesKt$$Lambda$4; +SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$4;->()V +SPLkotlin/reflect/jvm/internal/CachesKt$$Lambda$4;->()V +Lkotlin/reflect/jvm/internal/ClassValueCache; +SPLkotlin/reflect/jvm/internal/ClassValueCache;->(Lkotlin/jvm/functions/Function1;)V +SPLkotlin/reflect/jvm/internal/ClassValueCache;->get(Ljava/lang/Class;)Ljava/lang/Object; +Lkotlin/reflect/jvm/internal/ClassValueCache$$ExternalSyntheticApiModelOutline0; +SPLkotlin/reflect/jvm/internal/ClassValueCache$$ExternalSyntheticApiModelOutline0;->m(Lkotlin/reflect/jvm/internal/ComputableClassValue;Ljava/lang/Class;)Ljava/lang/Object; +Lkotlin/reflect/jvm/internal/ComputableClassValue; +SPLkotlin/reflect/jvm/internal/ComputableClassValue;->(Lkotlin/jvm/functions/Function1;)V +SPLkotlin/reflect/jvm/internal/ComputableClassValue;->computeValue(Ljava/lang/Class;)Ljava/lang/Object; +SPLkotlin/reflect/jvm/internal/ComputableClassValue;->computeValue(Ljava/lang/Class;)Ljava/lang/ref/SoftReference; +Lkotlin/reflect/jvm/internal/KClassImpl; +SPLkotlin/reflect/jvm/internal/KClassImpl;->()V +SPLkotlin/reflect/jvm/internal/KClassImpl;->(Ljava/lang/Class;)V +SPLkotlin/reflect/jvm/internal/KClassImpl;->accessor$KClassImpl$lambda0(Lkotlin/reflect/jvm/internal/KClassImpl;)Lkotlin/reflect/jvm/internal/KClassImpl$Data; +SPLkotlin/reflect/jvm/internal/KClassImpl;->data$lambda$0(Lkotlin/reflect/jvm/internal/KClassImpl;)Lkotlin/reflect/jvm/internal/KClassImpl$Data; +SPLkotlin/reflect/jvm/internal/KClassImpl;->equals(Ljava/lang/Object;)Z +SPLkotlin/reflect/jvm/internal/KClassImpl;->getClassId$kotlin_reflection()Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/KClassImpl;->getJClass()Ljava/lang/Class; +SPLkotlin/reflect/jvm/internal/KClassImpl;->getQualifiedName()Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/KClassImpl;->getSimpleName()Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/KClassImpl;->hashCode()I +SPLkotlin/reflect/jvm/internal/KClassImpl;->isInstance(Ljava/lang/Object;)Z +Lkotlin/reflect/jvm/internal/KClassImpl$$Lambda$0; +SPLkotlin/reflect/jvm/internal/KClassImpl$$Lambda$0;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V +SPLkotlin/reflect/jvm/internal/KClassImpl$$Lambda$0;->invoke()Ljava/lang/Object; +Lkotlin/reflect/jvm/internal/KClassImpl$Companion; +SPLkotlin/reflect/jvm/internal/KClassImpl$Companion;->()V +SPLkotlin/reflect/jvm/internal/KClassImpl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data;->()V +SPLkotlin/reflect/jvm/internal/KClassImpl$Data;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V +SPLkotlin/reflect/jvm/internal/KClassImpl$Data;->accessor$KClassImpl$Data$lambda3(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data;->accessor$KClassImpl$Data$lambda4(Lkotlin/reflect/jvm/internal/KClassImpl;)Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data;->getQualifiedName()Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data;->getSimpleName()Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data;->qualifiedName_delegate$lambda$0(Lkotlin/reflect/jvm/internal/KClassImpl;)Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data;->simpleName_delegate$lambda$0(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)Ljava/lang/String; +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$0; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$0;->(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$1; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$1;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$10; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$10;->(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$11; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$11;->(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$12; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$12;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$13; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$13;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$14; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$14;->(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$2; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$3; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$3;->(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$3;->invoke()Ljava/lang/Object; +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$4; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$4;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$4;->invoke()Ljava/lang/Object; +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$5; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$5;->(Lkotlin/reflect/jvm/internal/KClassImpl;Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$6; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$6;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$7; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$7;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$8; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$8;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$9; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$$Lambda$9;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$allMembers$2; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$allMembers$2;->(Ljava/lang/Object;)V +Lkotlin/reflect/jvm/internal/KClassImpl$Data$declaredMembers$2; +SPLkotlin/reflect/jvm/internal/KClassImpl$Data$declaredMembers$2;->(Ljava/lang/Object;)V +Lkotlin/reflect/jvm/internal/KClassMembersKt; +Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl; +SPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl;->()V +SPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl;->()V +Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Companion; +SPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Companion;->()V +SPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data; +SPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data;->()V +SPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;)V +Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data$$Lambda$0; +SPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data$$Lambda$0;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;)V +Lkotlin/reflect/jvm/internal/KTypeParameterOwnerImpl; +Lkotlin/reflect/jvm/internal/LazyKMutableProperty1; +SPLkotlin/reflect/jvm/internal/LazyKMutableProperty1;->(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V +Lkotlin/reflect/jvm/internal/LazyKProperty; +SPLkotlin/reflect/jvm/internal/LazyKProperty;->(Lkotlin/jvm/functions/Function0;)V +Lkotlin/reflect/jvm/internal/LazyKProperty1; +SPLkotlin/reflect/jvm/internal/LazyKProperty1;->(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V +Lkotlin/reflect/jvm/internal/ReflectProperties; +SPLkotlin/reflect/jvm/internal/ReflectProperties;->lazySoft(Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal; +SPLkotlin/reflect/jvm/internal/ReflectProperties;->lazySoft(Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal; +Lkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal; +SPLkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)V +SPLkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal;->invoke()Ljava/lang/Object; +Lkotlin/reflect/jvm/internal/ReflectProperties$Val; +SPLkotlin/reflect/jvm/internal/ReflectProperties$Val;->()V +SPLkotlin/reflect/jvm/internal/ReflectProperties$Val;->()V +SPLkotlin/reflect/jvm/internal/ReflectProperties$Val;->escape(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlin/reflect/jvm/internal/ReflectProperties$Val;->getValue(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlin/reflect/jvm/internal/ReflectProperties$Val;->unescape(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlin/reflect/jvm/internal/ReflectProperties$Val$1; +SPLkotlin/reflect/jvm/internal/ReflectProperties$Val$1;->()V +Lkotlin/reflect/jvm/internal/ReflectionFactoryImpl; +SPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->()V +SPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/KClass; +SPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->getOwner(Lkotlin/jvm/internal/CallableReference;)Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl; +SPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->mutableProperty1(Lkotlin/jvm/internal/MutablePropertyReference1;)Lkotlin/reflect/KMutableProperty1; +SPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->typeOf(Lkotlin/reflect/KClassifier;Ljava/util/List;Z)Lkotlin/reflect/KType; +Lkotlin/reflect/jvm/internal/ReflectionFactoryImpl$$Lambda$3; +SPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl$$Lambda$3;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/internal/MutablePropertyReference1;)V +Lkotlin/reflect/jvm/internal/RuntimeTypeMapper; +SPLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->()V +SPLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->()V +SPLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->getPrimitiveType(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType; +SPLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->mapJvmClassToKotlinClassId(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +Lkotlin/reflect/jvm/internal/SystemPropertiesKt; +SPLkotlin/reflect/jvm/internal/SystemPropertiesKt;->()V +SPLkotlin/reflect/jvm/internal/SystemPropertiesKt;->getUseK1Implementation()Z +Lkotlin/reflect/jvm/internal/impl/SpecialJvmAnnotations; +SPLkotlin/reflect/jvm/internal/impl/SpecialJvmAnnotations;->()V +SPLkotlin/reflect/jvm/internal/impl/SpecialJvmAnnotations;->()V +SPLkotlin/reflect/jvm/internal/impl/SpecialJvmAnnotations;->getSPECIAL_ANNOTATIONS()Ljava/util/Set; +Lkotlin/reflect/jvm/internal/impl/builtins/CompanionObjectMapping; +SPLkotlin/reflect/jvm/internal/impl/builtins/CompanionObjectMapping;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/CompanionObjectMapping;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/CompanionObjectMapping;->allClassesWithIntrinsicCompanions()Ljava/util/Set; +Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType; +SPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->$values()[Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType; +SPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->(Ljava/lang/String;ILjava/lang/String;)V +SPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->getArrayTypeName()Lkotlin/reflect/jvm/internal/impl/name/Name; +SPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->getTypeName()Lkotlin/reflect/jvm/internal/impl/name/Name; +SPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->values()[Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType; +Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$$Lambda$0; +SPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$$Lambda$0;->(Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;)V +Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$$Lambda$1; +SPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$$Lambda$1;->(Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;)V +Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$Companion; +SPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$Companion;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/reflect/jvm/internal/impl/builtins/StandardNames; +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->getFunctionClassId(I)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->getFunctionName(I)Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->getPrimitiveFqName(Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;)Lkotlin/reflect/jvm/internal/impl/name/FqName; +Lkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames; +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->annotationName(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->collectionsFqName(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->concurrentAtomics(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->fqName(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->fqNameUnsafe(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->internalName(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->rangesFqName(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; +SPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->reflect(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; +Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind; +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/lang/String;ZLkotlin/reflect/jvm/internal/impl/name/ClassId;ZI)V +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/lang/String;ZLkotlin/reflect/jvm/internal/impl/name/ClassId;ZIILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->getClassNamePrefix()Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->getMaxArity()I +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->getPackageFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; +Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Companion; +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Companion;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Function; +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Function;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Function;->()V +Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KFunction; +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KFunction;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KFunction;->()V +Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KSuspendFunction; +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KSuspendFunction;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KSuspendFunction;->()V +Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$SuspendFunction; +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$SuspendFunction;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$SuspendFunction;->()V +Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap; +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->()V +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->add(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)V +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->addJavaToKotlin(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)V +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->addKotlinToJava(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)V +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->addMapping(Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;)V +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->addTopLevel(Ljava/lang/Class;Lkotlin/reflect/jvm/internal/impl/name/FqName;)V +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->addTopLevel(Ljava/lang/Class;Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;)V +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->classId(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->mapJavaToKotlin(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping; +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)V +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->getJavaClass()Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->getKotlinMutable()Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->getKotlinReadOnly()Lkotlin/reflect/jvm/internal/impl/name/ClassId; +Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt; +SPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->()V +SPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getClassId(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getFunctionClassArity(Ljava/lang/Class;)Ljava/lang/Integer; +SPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getWrapperByPrimitive(Ljava/lang/Class;)Ljava/lang/Class; +Lkotlin/reflect/jvm/internal/impl/load/java/JvmAnnotationNames; +SPLkotlin/reflect/jvm/internal/impl/load/java/JvmAnnotationNames;->()V +Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/ClassId;->()V +SPLkotlin/reflect/jvm/internal/impl/name/ClassId;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/FqName;Z)V +SPLkotlin/reflect/jvm/internal/impl/name/ClassId;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/Name;)V +SPLkotlin/reflect/jvm/internal/impl/name/ClassId;->asSingleFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/ClassId;->createNestedClassId(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/ClassId;->getPackageFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/ClassId;->getShortClassName()Lkotlin/reflect/jvm/internal/impl/name/Name; +SPLkotlin/reflect/jvm/internal/impl/name/ClassId;->hashCode()I +SPLkotlin/reflect/jvm/internal/impl/name/ClassId;->isLocal()Z +Lkotlin/reflect/jvm/internal/impl/name/ClassId$Companion; +SPLkotlin/reflect/jvm/internal/impl/name/ClassId$Companion;->()V +SPLkotlin/reflect/jvm/internal/impl/name/ClassId$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/reflect/jvm/internal/impl/name/ClassId$Companion;->topLevel(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/FqName;->()V +SPLkotlin/reflect/jvm/internal/impl/name/FqName;->(Ljava/lang/String;)V +SPLkotlin/reflect/jvm/internal/impl/name/FqName;->(Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;)V +SPLkotlin/reflect/jvm/internal/impl/name/FqName;->(Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;Lkotlin/reflect/jvm/internal/impl/name/FqName;)V +SPLkotlin/reflect/jvm/internal/impl/name/FqName;->asString()Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/impl/name/FqName;->child(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/FqName;->equals(Ljava/lang/Object;)Z +SPLkotlin/reflect/jvm/internal/impl/name/FqName;->hashCode()I +SPLkotlin/reflect/jvm/internal/impl/name/FqName;->isRoot()Z +SPLkotlin/reflect/jvm/internal/impl/name/FqName;->parent()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/FqName;->shortName()Lkotlin/reflect/jvm/internal/impl/name/Name; +SPLkotlin/reflect/jvm/internal/impl/name/FqName;->toString()Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/impl/name/FqName;->toUnsafe()Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; +Lkotlin/reflect/jvm/internal/impl/name/FqName$Companion; +SPLkotlin/reflect/jvm/internal/impl/name/FqName$Companion;->()V +SPLkotlin/reflect/jvm/internal/impl/name/FqName$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/reflect/jvm/internal/impl/name/FqName$Companion;->topLevel(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/FqName; +Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->()V +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->(Ljava/lang/String;)V +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->(Ljava/lang/String;Lkotlin/reflect/jvm/internal/impl/name/FqName;)V +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->(Ljava/lang/String;Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;Lkotlin/reflect/jvm/internal/impl/name/Name;)V +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->(Ljava/lang/String;Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->asString()Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->child(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->compute()V +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->equals(Ljava/lang/Object;)Z +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->hashCode()I +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->indexOfLastDotWithBackticksSupport(Ljava/lang/String;)I +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->isRoot()Z +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->parent()Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->shortName()Lkotlin/reflect/jvm/internal/impl/name/Name; +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->toSafe()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->toString()Ljava/lang/String; +Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe$Companion; +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe$Companion;->()V +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe$Companion;->topLevel(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; +Lkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt; +SPLkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt;->isSubpackageOf(Ljava/lang/String;Ljava/lang/String;)Z +SPLkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt;->isSubpackageOf(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/FqName;)Z +SPLkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt;->tail(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/name/FqName; +Lkotlin/reflect/jvm/internal/impl/name/Name; +SPLkotlin/reflect/jvm/internal/impl/name/Name;->(Ljava/lang/String;Z)V +SPLkotlin/reflect/jvm/internal/impl/name/Name;->asString()Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/impl/name/Name;->getIdentifier()Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/impl/name/Name;->guessByFirstCharacter(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/Name; +SPLkotlin/reflect/jvm/internal/impl/name/Name;->hashCode()I +SPLkotlin/reflect/jvm/internal/impl/name/Name;->identifier(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/Name; +SPLkotlin/reflect/jvm/internal/impl/name/Name;->special(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/Name; +Lkotlin/reflect/jvm/internal/impl/name/SpecialNames; +SPLkotlin/reflect/jvm/internal/impl/name/SpecialNames;->()V +SPLkotlin/reflect/jvm/internal/impl/name/SpecialNames;->()V +Lkotlin/reflect/jvm/internal/impl/name/StandardClassIds; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->()V +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->()V +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getArray()Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_ANNOTATION_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_COLLECTIONS_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_CONCURRENT_ATOMICS_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_COROUTINES_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_ENUMS_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_KOTLIN_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_RANGES_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_REFLECT_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_SEQUENCES_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getKClass()Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getKFunction()Lkotlin/reflect/jvm/internal/impl/name/ClassId; +Lkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$annotationId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$atomicsId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$baseId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$collectionsId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$coroutinesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$enumsId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$inverseMap(Ljava/util/Map;)Ljava/util/Map; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$primitiveArrayId(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$rangesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$reflectId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$sequencesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$unsignedId(Lkotlin/reflect/jvm/internal/impl/name/ClassId;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->annotationId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->atomicsId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->baseId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->collectionsId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->coroutinesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->enumsId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->inverseMap(Ljava/util/Map;)Ljava/util/Map; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->primitiveArrayId(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->rangesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->reflectId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->sequencesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +SPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->unsignedId(Lkotlin/reflect/jvm/internal/impl/name/ClassId;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; +Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmClassName; +SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmClassName;->(Ljava/lang/String;)V +SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmClassName;->byFqNameWithoutInnerClasses(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmClassName; +SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmClassName;->getInternalName()Ljava/lang/String; +Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType; +SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->()V +SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->(Ljava/lang/String;ILkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V +SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getDesc()Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getJavaKeywordName()Ljava/lang/String; +SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getPrimitiveType()Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType; +SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getWrapperFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; +SPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->values()[Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType; +Lkotlin/reflect/jvm/internal/impl/types/model/DefinitelyNotNullTypeMarker; +Lkotlin/reflect/jvm/internal/impl/types/model/FlexibleTypeMarker; +Lkotlin/reflect/jvm/internal/impl/types/model/KotlinTypeMarker; +Lkotlin/reflect/jvm/internal/impl/types/model/RigidTypeMarker; +Lkotlin/reflect/jvm/internal/impl/types/model/SimpleTypeMarker; +Lkotlin/reflect/jvm/internal/impl/types/model/TypeArgumentListMarker; +Lkotlin/reflect/jvm/internal/impl/types/model/TypeConstructorMarker; +Lkotlin/reflect/jvm/internal/impl/utils/CollectionsKt; +SPLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->capacity(I)I +SPLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->newHashMapWithExpectedSize(I)Ljava/util/HashMap; +SPLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->newHashSetWithExpectedSize(I)Ljava/util/HashSet; +Lkotlin/reflect/jvm/internal/types/AbstractKType; +SPLkotlin/reflect/jvm/internal/types/AbstractKType;->(Lkotlin/jvm/functions/Function0;)V +Lkotlin/reflect/jvm/internal/types/SimpleKType; +SPLkotlin/reflect/jvm/internal/types/SimpleKType;->(Lkotlin/reflect/KClassifier;Ljava/util/List;ZLkotlin/Lazy;Lkotlin/reflect/KType;ZZZLkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;)V +SPLkotlin/reflect/jvm/internal/types/SimpleKType;->(Lkotlin/reflect/KClassifier;Ljava/util/List;ZLkotlin/Lazy;Lkotlin/reflect/KType;ZZZLkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/reflect/jvm/internal/types/SimpleKType;->getArguments()Ljava/util/List; +SPLkotlin/reflect/jvm/internal/types/SimpleKType;->getClassifier()Lkotlin/reflect/KClassifier; +SPLkotlin/reflect/jvm/internal/types/SimpleKType;->isMarkedNullable()Z +Lkotlin/sequences/ConstrainedOnceSequence; +SPLkotlin/sequences/ConstrainedOnceSequence;->(Lkotlin/sequences/Sequence;)V +SPLkotlin/sequences/ConstrainedOnceSequence;->iterator()Ljava/util/Iterator; +Lkotlin/sequences/GeneratorSequence; +SPLkotlin/sequences/GeneratorSequence;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V +SPLkotlin/sequences/GeneratorSequence;->access$getGetInitialValue$p(Lkotlin/sequences/GeneratorSequence;)Lkotlin/jvm/functions/Function0; +SPLkotlin/sequences/GeneratorSequence;->iterator()Ljava/util/Iterator; +Lkotlin/sequences/GeneratorSequence$iterator$1; +SPLkotlin/sequences/GeneratorSequence$iterator$1;->(Lkotlin/sequences/GeneratorSequence;)V +SPLkotlin/sequences/GeneratorSequence$iterator$1;->calcNext()V +SPLkotlin/sequences/GeneratorSequence$iterator$1;->hasNext()Z +SPLkotlin/sequences/GeneratorSequence$iterator$1;->next()Ljava/lang/Object; +Lkotlin/sequences/Sequence; +Lkotlin/sequences/SequencesKt; +Lkotlin/sequences/SequencesKt__SequenceBuilderKt; +Lkotlin/sequences/SequencesKt__SequencesJVMKt; +Lkotlin/sequences/SequencesKt__SequencesKt; +SPLkotlin/sequences/SequencesKt__SequencesKt;->constrainOnce(Lkotlin/sequences/Sequence;)Lkotlin/sequences/Sequence; +SPLkotlin/sequences/SequencesKt__SequencesKt;->generateSequence(Lkotlin/jvm/functions/Function0;)Lkotlin/sequences/Sequence; +Lkotlin/sequences/SequencesKt__SequencesKt$$ExternalSyntheticLambda1; +SPLkotlin/sequences/SequencesKt__SequencesKt$$ExternalSyntheticLambda1;->(Lkotlin/jvm/functions/Function0;)V +Lkotlin/sequences/SequencesKt___SequencesJvmKt; +Lkotlin/sequences/SequencesKt___SequencesKt; +SPLkotlin/sequences/SequencesKt___SequencesKt;->toList(Lkotlin/sequences/Sequence;)Ljava/util/List; +Lkotlin/text/CharsKt; +Lkotlin/text/CharsKt__CharJVMKt; +SPLkotlin/text/CharsKt__CharJVMKt;->isWhitespace(C)Z +Lkotlin/text/CharsKt__CharKt; +Lkotlin/text/Charsets; +SPLkotlin/text/Charsets;->()V +SPLkotlin/text/Charsets;->()V +Lkotlin/text/LinesIterator; +SPLkotlin/text/LinesIterator;->()V +SPLkotlin/text/LinesIterator;->(Ljava/lang/CharSequence;)V +SPLkotlin/text/LinesIterator;->hasNext()Z +SPLkotlin/text/LinesIterator;->next()Ljava/lang/Object; +SPLkotlin/text/LinesIterator;->next()Ljava/lang/String; +Lkotlin/text/LinesIterator$State; +SPLkotlin/text/LinesIterator$State;->()V +SPLkotlin/text/LinesIterator$State;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/text/MatchGroupCollection; +Lkotlin/text/MatchNamedGroupCollection; +Lkotlin/text/MatchResult; +Lkotlin/text/MatcherMatchResult; +SPLkotlin/text/MatcherMatchResult;->(Ljava/util/regex/Matcher;Ljava/lang/CharSequence;)V +SPLkotlin/text/MatcherMatchResult;->access$getMatchResult(Lkotlin/text/MatcherMatchResult;)Ljava/util/regex/MatchResult; +SPLkotlin/text/MatcherMatchResult;->getGroupValues()Ljava/util/List; +SPLkotlin/text/MatcherMatchResult;->getMatchResult()Ljava/util/regex/MatchResult; +Lkotlin/text/MatcherMatchResult$groupValues$1; +SPLkotlin/text/MatcherMatchResult$groupValues$1;->(Lkotlin/text/MatcherMatchResult;)V +SPLkotlin/text/MatcherMatchResult$groupValues$1;->get(I)Ljava/lang/Object; +SPLkotlin/text/MatcherMatchResult$groupValues$1;->get(I)Ljava/lang/String; +Lkotlin/text/MatcherMatchResult$groups$1; +SPLkotlin/text/MatcherMatchResult$groups$1;->(Lkotlin/text/MatcherMatchResult;)V +Lkotlin/text/Regex; +SPLkotlin/text/Regex;->()V +SPLkotlin/text/Regex;->(Ljava/lang/String;)V +SPLkotlin/text/Regex;->(Ljava/util/regex/Pattern;)V +SPLkotlin/text/Regex;->find$default(Lkotlin/text/Regex;Ljava/lang/CharSequence;IILjava/lang/Object;)Lkotlin/text/MatchResult; +SPLkotlin/text/Regex;->find(Ljava/lang/CharSequence;I)Lkotlin/text/MatchResult; +SPLkotlin/text/Regex;->matchAt(Ljava/lang/CharSequence;I)Lkotlin/text/MatchResult; +SPLkotlin/text/Regex;->matches(Ljava/lang/CharSequence;)Z +SPLkotlin/text/Regex;->split(Ljava/lang/CharSequence;I)Ljava/util/List; +Lkotlin/text/Regex$Companion; +SPLkotlin/text/Regex$Companion;->()V +SPLkotlin/text/Regex$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/text/RegexKt; +SPLkotlin/text/RegexKt;->access$findNext(Ljava/util/regex/Matcher;ILjava/lang/CharSequence;)Lkotlin/text/MatchResult; +SPLkotlin/text/RegexKt;->findNext(Ljava/util/regex/Matcher;ILjava/lang/CharSequence;)Lkotlin/text/MatchResult; +Lkotlin/text/StringsKt; +Lkotlin/text/StringsKt__AppendableKt; +SPLkotlin/text/StringsKt__AppendableKt;->appendElement(Ljava/lang/Appendable;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V +Lkotlin/text/StringsKt__IndentKt; +SPLkotlin/text/StringsKt__IndentKt;->$r8$lambda$3BvvMery65JEhzYBhCrX5rYm0VE(Ljava/lang/String;)Ljava/lang/String; +SPLkotlin/text/StringsKt__IndentKt;->getIndentFunction$StringsKt__IndentKt(Ljava/lang/String;)Lkotlin/jvm/functions/Function1; +SPLkotlin/text/StringsKt__IndentKt;->getIndentFunction$lambda$0$StringsKt__IndentKt(Ljava/lang/String;)Ljava/lang/String; +SPLkotlin/text/StringsKt__IndentKt;->indentWidth$StringsKt__IndentKt(Ljava/lang/String;)I +SPLkotlin/text/StringsKt__IndentKt;->replaceIndent(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +SPLkotlin/text/StringsKt__IndentKt;->trimIndent(Ljava/lang/String;)Ljava/lang/String; +Lkotlin/text/StringsKt__IndentKt$$ExternalSyntheticLambda1; +SPLkotlin/text/StringsKt__IndentKt$$ExternalSyntheticLambda1;->()V +SPLkotlin/text/StringsKt__IndentKt$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlin/text/StringsKt__RegexExtensionsJVMKt; +Lkotlin/text/StringsKt__RegexExtensionsKt; +Lkotlin/text/StringsKt__StringBuilderJVMKt; +Lkotlin/text/StringsKt__StringBuilderKt; +Lkotlin/text/StringsKt__StringNumberConversionsJVMKt; +Lkotlin/text/StringsKt__StringNumberConversionsKt; +Lkotlin/text/StringsKt__StringsJVMKt; +SPLkotlin/text/StringsKt__StringsJVMKt;->endsWith$default(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z +SPLkotlin/text/StringsKt__StringsJVMKt;->endsWith(Ljava/lang/String;Ljava/lang/String;Z)Z +SPLkotlin/text/StringsKt__StringsJVMKt;->equals$default(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z +SPLkotlin/text/StringsKt__StringsJVMKt;->equals(Ljava/lang/String;Ljava/lang/String;Z)Z +SPLkotlin/text/StringsKt__StringsJVMKt;->replace$default(Ljava/lang/String;CCZILjava/lang/Object;)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsJVMKt;->replace$default(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsJVMKt;->replace(Ljava/lang/String;CCZ)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsJVMKt;->replace(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsJVMKt;->startsWith$default(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z +SPLkotlin/text/StringsKt__StringsJVMKt;->startsWith(Ljava/lang/String;Ljava/lang/String;Z)Z +Lkotlin/text/StringsKt__StringsKt; +SPLkotlin/text/StringsKt__StringsKt;->contains$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z +SPLkotlin/text/StringsKt__StringsKt;->contains(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z +SPLkotlin/text/StringsKt__StringsKt;->endsWith$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z +SPLkotlin/text/StringsKt__StringsKt;->endsWith(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z +SPLkotlin/text/StringsKt__StringsKt;->getLastIndex(Ljava/lang/CharSequence;)I +SPLkotlin/text/StringsKt__StringsKt;->indexOf$default(Ljava/lang/CharSequence;Ljava/lang/String;IZILjava/lang/Object;)I +SPLkotlin/text/StringsKt__StringsKt;->indexOf(Ljava/lang/CharSequence;Ljava/lang/String;IZ)I +SPLkotlin/text/StringsKt__StringsKt;->isBlank(Ljava/lang/CharSequence;)Z +SPLkotlin/text/StringsKt__StringsKt;->lastIndexOf$default(Ljava/lang/CharSequence;CIZILjava/lang/Object;)I +SPLkotlin/text/StringsKt__StringsKt;->lastIndexOf(Ljava/lang/CharSequence;CIZ)I +SPLkotlin/text/StringsKt__StringsKt;->lineSequence(Ljava/lang/CharSequence;)Lkotlin/sequences/Sequence; +SPLkotlin/text/StringsKt__StringsKt;->lines(Ljava/lang/CharSequence;)Ljava/util/List; +SPLkotlin/text/StringsKt__StringsKt;->padStart(Ljava/lang/CharSequence;IC)Ljava/lang/CharSequence; +SPLkotlin/text/StringsKt__StringsKt;->padStart(Ljava/lang/String;IC)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsKt;->removePrefix(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsKt;->removeSuffix(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsKt;->requireNonNegativeLimit(I)V +SPLkotlin/text/StringsKt__StringsKt;->startsWith$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z +SPLkotlin/text/StringsKt__StringsKt;->startsWith(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z +SPLkotlin/text/StringsKt__StringsKt;->substringAfterLast$default(Ljava/lang/String;CLjava/lang/String;ILjava/lang/Object;)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsKt;->substringAfterLast(Ljava/lang/String;CLjava/lang/String;)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsKt;->substringBefore$default(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsKt;->substringBefore(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +SPLkotlin/text/StringsKt__StringsKt;->trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +Lkotlin/text/StringsKt__StringsKt$lineSequence$$inlined$Sequence$1; +SPLkotlin/text/StringsKt__StringsKt$lineSequence$$inlined$Sequence$1;->(Ljava/lang/CharSequence;)V +SPLkotlin/text/StringsKt__StringsKt$lineSequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator; +Lkotlin/text/StringsKt___StringsJvmKt; +Lkotlin/text/StringsKt___StringsKt; +SPLkotlin/text/StringsKt___StringsKt;->drop(Ljava/lang/String;I)Ljava/lang/String; +Lkotlin/time/ComparableTimeMark; +Lkotlin/time/Duration; +SPLkotlin/time/Duration;->()V +SPLkotlin/time/Duration;->(J)V +SPLkotlin/time/Duration;->appendFractional-impl(JLjava/lang/StringBuilder;IIILjava/lang/String;Z)V +SPLkotlin/time/Duration;->box-impl(J)Lkotlin/time/Duration; +SPLkotlin/time/Duration;->constructor-impl(J)J +SPLkotlin/time/Duration;->getAbsoluteValue-UwyO8pc(J)J +SPLkotlin/time/Duration;->getHoursComponent-impl(J)I +SPLkotlin/time/Duration;->getInWholeDays-impl(J)J +SPLkotlin/time/Duration;->getInWholeHours-impl(J)J +SPLkotlin/time/Duration;->getInWholeMilliseconds-impl(J)J +SPLkotlin/time/Duration;->getInWholeMinutes-impl(J)J +SPLkotlin/time/Duration;->getInWholeSeconds-impl(J)J +SPLkotlin/time/Duration;->getMinutesComponent-impl(J)I +SPLkotlin/time/Duration;->getNanosecondsComponent-impl(J)I +SPLkotlin/time/Duration;->getSecondsComponent-impl(J)I +SPLkotlin/time/Duration;->getStorageUnit-impl(J)Lkotlin/time/DurationUnit; +SPLkotlin/time/Duration;->getValue-impl(J)J +SPLkotlin/time/Duration;->isInMillis-impl(J)Z +SPLkotlin/time/Duration;->isInNanos-impl(J)Z +SPLkotlin/time/Duration;->isInfinite-impl(J)Z +SPLkotlin/time/Duration;->isNegative-impl(J)Z +SPLkotlin/time/Duration;->isPositive-impl(J)Z +SPLkotlin/time/Duration;->plus-LRDsOJo(JJ)J +SPLkotlin/time/Duration;->toLong-impl(JLkotlin/time/DurationUnit;)J +SPLkotlin/time/Duration;->toString()Ljava/lang/String; +SPLkotlin/time/Duration;->toString-impl(J)Ljava/lang/String; +SPLkotlin/time/Duration;->unbox-impl()J +Lkotlin/time/Duration$Companion; +SPLkotlin/time/Duration$Companion;->()V +SPLkotlin/time/Duration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlin/time/Duration$Companion;->fromRawValue-UwyO8pc$kotlin_stdlib(J)J +Lkotlin/time/DurationJvmKt; +SPLkotlin/time/DurationJvmKt;->()V +SPLkotlin/time/DurationJvmKt;->getDurationAssertionsEnabled()Z +Lkotlin/time/DurationKt; +SPLkotlin/time/DurationKt;->access$durationOfMillis(J)J +SPLkotlin/time/DurationKt;->access$durationOfNanosNormalized(J)J +SPLkotlin/time/DurationKt;->durationOfMillis(J)J +SPLkotlin/time/DurationKt;->durationOfNanos(J)J +SPLkotlin/time/DurationKt;->durationOfNanosNormalized(J)J +SPLkotlin/time/DurationKt;->toDuration(ILkotlin/time/DurationUnit;)J +SPLkotlin/time/DurationKt;->toDuration(JLkotlin/time/DurationUnit;)J +Lkotlin/time/DurationUnit; +SPLkotlin/time/DurationUnit;->$values()[Lkotlin/time/DurationUnit; +SPLkotlin/time/DurationUnit;->()V +SPLkotlin/time/DurationUnit;->(Ljava/lang/String;ILjava/util/concurrent/TimeUnit;)V +SPLkotlin/time/DurationUnit;->getTimeUnit$kotlin_stdlib()Ljava/util/concurrent/TimeUnit; +Lkotlin/time/DurationUnitKt; +Lkotlin/time/DurationUnitKt__DurationUnitJvmKt; +SPLkotlin/time/DurationUnitKt__DurationUnitJvmKt;->convertDurationUnit(JLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)J +SPLkotlin/time/DurationUnitKt__DurationUnitJvmKt;->convertDurationUnitOverflow(JLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)J +Lkotlin/time/DurationUnitKt__DurationUnitKt; +Lkotlin/time/Instant; +SPLkotlin/time/Instant;->()V +SPLkotlin/time/Instant;->(JI)V +Lkotlin/time/Instant$Companion; +SPLkotlin/time/Instant$Companion;->()V +SPLkotlin/time/Instant$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlin/time/LongSaturatedMathKt; +SPLkotlin/time/LongSaturatedMathKt;->saturatingDiff(JJLkotlin/time/DurationUnit;)J +SPLkotlin/time/LongSaturatedMathKt;->saturatingFiniteDiff(JJLkotlin/time/DurationUnit;)J +Lkotlin/time/MonotonicTimeSource; +SPLkotlin/time/MonotonicTimeSource;->()V +SPLkotlin/time/MonotonicTimeSource;->()V +SPLkotlin/time/MonotonicTimeSource;->elapsedFrom-6eNON_k(J)J +SPLkotlin/time/MonotonicTimeSource;->markNow-z9LOYto()J +SPLkotlin/time/MonotonicTimeSource;->read()J +Lkotlin/time/TimeMark; +Lkotlin/time/TimeSource; +Lkotlin/time/TimeSource$Monotonic; +SPLkotlin/time/TimeSource$Monotonic;->()V +SPLkotlin/time/TimeSource$Monotonic;->()V +SPLkotlin/time/TimeSource$Monotonic;->markNow-z9LOYto()J +Lkotlin/time/TimeSource$Monotonic$ValueTimeMark; +SPLkotlin/time/TimeSource$Monotonic$ValueTimeMark;->constructor-impl(J)J +SPLkotlin/time/TimeSource$Monotonic$ValueTimeMark;->elapsedNow-UwyO8pc(J)J +Lkotlin/time/TimeSource$WithComparableMarks; +Lkotlin/uuid/Uuid; +SPLkotlin/uuid/Uuid;->()V +SPLkotlin/uuid/Uuid;->(JJ)V +Lkotlin/uuid/Uuid$Companion; +SPLkotlin/uuid/Uuid$Companion;->()V +SPLkotlin/uuid/Uuid$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/coroutines/AbstractCoroutine; +SPLkotlinx/coroutines/AbstractCoroutine;->(Lkotlin/coroutines/CoroutineContext;ZZ)V +SPLkotlinx/coroutines/AbstractCoroutine;->afterResume(Ljava/lang/Object;)V +SPLkotlinx/coroutines/AbstractCoroutine;->cancellationExceptionMessage()Ljava/lang/String; +SPLkotlinx/coroutines/AbstractCoroutine;->getContext()Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/AbstractCoroutine;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/AbstractCoroutine;->isActive()Z +SPLkotlinx/coroutines/AbstractCoroutine;->onCancelled(Ljava/lang/Throwable;Z)V +SPLkotlinx/coroutines/AbstractCoroutine;->onCompleted(Ljava/lang/Object;)V +SPLkotlinx/coroutines/AbstractCoroutine;->onCompletionInternal(Ljava/lang/Object;)V +SPLkotlinx/coroutines/AbstractCoroutine;->resumeWith(Ljava/lang/Object;)V +SPLkotlinx/coroutines/AbstractCoroutine;->start(Lkotlinx/coroutines/CoroutineStart;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V +Lkotlinx/coroutines/AbstractTimeSourceKt; +SPLkotlinx/coroutines/AbstractTimeSourceKt;->()V +SPLkotlinx/coroutines/AbstractTimeSourceKt;->access$getTimeSource$p()Lkotlinx/coroutines/AbstractTimeSource; +Lkotlinx/coroutines/Active; +SPLkotlinx/coroutines/Active;->()V +SPLkotlinx/coroutines/Active;->()V +Lkotlinx/coroutines/BlockingCoroutine; +SPLkotlinx/coroutines/BlockingCoroutine;->(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Thread;Lkotlinx/coroutines/EventLoop;)V +SPLkotlinx/coroutines/BlockingCoroutine;->afterCompletion(Ljava/lang/Object;)V +SPLkotlinx/coroutines/BlockingCoroutine;->joinBlocking()Ljava/lang/Object; +Lkotlinx/coroutines/BlockingEventLoop; +SPLkotlinx/coroutines/BlockingEventLoop;->(Ljava/lang/Thread;)V +SPLkotlinx/coroutines/BlockingEventLoop;->getThread()Ljava/lang/Thread; +Lkotlinx/coroutines/BuildersKt; +SPLkotlinx/coroutines/BuildersKt;->launch$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; +SPLkotlinx/coroutines/BuildersKt;->launch(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; +SPLkotlinx/coroutines/BuildersKt;->runBlocking$default(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/BuildersKt;->runBlocking(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlinx/coroutines/BuildersKt;->runBlockingImpl(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/EventLoop;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlinx/coroutines/BuildersKt;->runBlockingK$default(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/BuildersKt;->runBlockingK(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlinx/coroutines/BuildersKt;->withContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/BuildersKt__BuildersKt; +SPLkotlinx/coroutines/BuildersKt__BuildersKt;->runBlocking$default(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/BuildersKt__BuildersKt;->runBlocking(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlinx/coroutines/BuildersKt__BuildersKt;->runBlockingImpl(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/EventLoop;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +Lkotlinx/coroutines/BuildersKt__Builders_commonKt; +SPLkotlinx/coroutines/BuildersKt__Builders_commonKt;->launch$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; +SPLkotlinx/coroutines/BuildersKt__Builders_commonKt;->launch(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; +SPLkotlinx/coroutines/BuildersKt__Builders_commonKt;->withContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/BuildersKt__Builders_concurrentKt; +SPLkotlinx/coroutines/BuildersKt__Builders_concurrentKt;->runBlockingK$default(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/BuildersKt__Builders_concurrentKt;->runBlockingK(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +Lkotlinx/coroutines/CancelHandler; +Lkotlinx/coroutines/CancelHandler$UserSupplied; +SPLkotlinx/coroutines/CancelHandler$UserSupplied;->(Lkotlin/jvm/functions/Function1;)V +Lkotlinx/coroutines/CancellableContinuation; +Lkotlinx/coroutines/CancellableContinuationImpl; +SPLkotlinx/coroutines/CancellableContinuationImpl;->()V +SPLkotlinx/coroutines/CancellableContinuationImpl;->(Lkotlin/coroutines/Continuation;I)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->callSegmentOnCancellation(Lkotlinx/coroutines/internal/Segment;Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->cancel(Ljava/lang/Throwable;)Z +SPLkotlinx/coroutines/CancellableContinuationImpl;->cancelLater(Ljava/lang/Throwable;)Z +SPLkotlinx/coroutines/CancellableContinuationImpl;->completeResume(Ljava/lang/Object;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->detachChild$kotlinx_coroutines_core()V +SPLkotlinx/coroutines/CancellableContinuationImpl;->detachChildIfNonReusable()V +SPLkotlinx/coroutines/CancellableContinuationImpl;->dispatchResume(I)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/CancellableContinuationImpl;->getContinuationCancellationCause(Lkotlinx/coroutines/Job;)Ljava/lang/Throwable; +SPLkotlinx/coroutines/CancellableContinuationImpl;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/CancellableContinuationImpl;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable; +SPLkotlinx/coroutines/CancellableContinuationImpl;->getParentHandle()Lkotlinx/coroutines/DisposableHandle; +SPLkotlinx/coroutines/CancellableContinuationImpl;->getResult()Ljava/lang/Object; +SPLkotlinx/coroutines/CancellableContinuationImpl;->getState$kotlinx_coroutines_core()Ljava/lang/Object; +SPLkotlinx/coroutines/CancellableContinuationImpl;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/CancellableContinuationImpl;->get_decisionAndIndex$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/CancellableContinuationImpl;->get_parentHandle$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/CancellableContinuationImpl;->get_state$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/CancellableContinuationImpl;->initCancellability()V +SPLkotlinx/coroutines/CancellableContinuationImpl;->installParentHandle()Lkotlinx/coroutines/DisposableHandle; +SPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellation(Lkotlin/jvm/functions/Function1;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellationImpl(Ljava/lang/Object;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellationInternal$kotlinx_coroutines_core(Lkotlinx/coroutines/CancelHandler;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->isCompleted()Z +SPLkotlinx/coroutines/CancellableContinuationImpl;->isReusable()Z +SPLkotlinx/coroutines/CancellableContinuationImpl;->parentCancelled$kotlinx_coroutines_core(Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->releaseClaimedReusableContinuation$kotlinx_coroutines_core()V +SPLkotlinx/coroutines/CancellableContinuationImpl;->resetStateReusable()Z +SPLkotlinx/coroutines/CancellableContinuationImpl;->resumeImpl$kotlinx_coroutines_core$default(Lkotlinx/coroutines/CancellableContinuationImpl;Ljava/lang/Object;ILkotlin/jvm/functions/Function3;ILjava/lang/Object;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->resumeImpl$kotlinx_coroutines_core(Ljava/lang/Object;ILkotlin/jvm/functions/Function3;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->resumeUndispatched(Lkotlinx/coroutines/CoroutineDispatcher;Ljava/lang/Object;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->resumeWith(Ljava/lang/Object;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->resumedState(Lkotlinx/coroutines/NotCompleted;Ljava/lang/Object;ILkotlin/jvm/functions/Function3;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/CancellableContinuationImpl;->takeState$kotlinx_coroutines_core()Ljava/lang/Object; +SPLkotlinx/coroutines/CancellableContinuationImpl;->tryResume()Z +SPLkotlinx/coroutines/CancellableContinuationImpl;->tryResume(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object; +SPLkotlinx/coroutines/CancellableContinuationImpl;->tryResumeImpl(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/CancellableContinuationImpl;->trySuspend()Z +Lkotlinx/coroutines/CancellableContinuationImplKt; +SPLkotlinx/coroutines/CancellableContinuationImplKt;->()V +Lkotlinx/coroutines/CancellableContinuationKt; +SPLkotlinx/coroutines/CancellableContinuationKt;->disposeOnCancellation(Lkotlinx/coroutines/CancellableContinuation;Lkotlinx/coroutines/DisposableHandle;)V +SPLkotlinx/coroutines/CancellableContinuationKt;->getOrCreateCancellableContinuation(Lkotlin/coroutines/Continuation;)Lkotlinx/coroutines/CancellableContinuationImpl; +SPLkotlinx/coroutines/CancellableContinuationKt;->invokeOnCancellation(Lkotlinx/coroutines/CancellableContinuation;Lkotlinx/coroutines/CancelHandler;)V +Lkotlinx/coroutines/CancelledContinuation; +SPLkotlinx/coroutines/CancelledContinuation;->()V +SPLkotlinx/coroutines/CancelledContinuation;->(Lkotlin/coroutines/Continuation;Ljava/lang/Throwable;Z)V +Lkotlinx/coroutines/ChildContinuation; +SPLkotlinx/coroutines/ChildContinuation;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V +SPLkotlinx/coroutines/ChildContinuation;->getOnCancelling()Z +SPLkotlinx/coroutines/ChildContinuation;->invoke(Ljava/lang/Throwable;)V +Lkotlinx/coroutines/ChildHandle; +Lkotlinx/coroutines/ChildHandleNode; +SPLkotlinx/coroutines/ChildHandleNode;->(Lkotlinx/coroutines/ChildJob;)V +SPLkotlinx/coroutines/ChildHandleNode;->childCancelled(Ljava/lang/Throwable;)Z +SPLkotlinx/coroutines/ChildHandleNode;->getOnCancelling()Z +SPLkotlinx/coroutines/ChildHandleNode;->invoke(Ljava/lang/Throwable;)V +Lkotlinx/coroutines/ChildJob; +Lkotlinx/coroutines/CompletableDeferred; +Lkotlinx/coroutines/CompletableDeferredImpl; +SPLkotlinx/coroutines/CompletableDeferredImpl;->(Lkotlinx/coroutines/Job;)V +SPLkotlinx/coroutines/CompletableDeferredImpl;->complete(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/CompletableDeferredImpl;->getCompleted()Ljava/lang/Object; +Lkotlinx/coroutines/CompletableDeferredKt; +SPLkotlinx/coroutines/CompletableDeferredKt;->CompletableDeferred$default(Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/CompletableDeferred; +SPLkotlinx/coroutines/CompletableDeferredKt;->CompletableDeferred(Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/CompletableDeferred; +SPLkotlinx/coroutines/CompletableDeferredKt;->completeWith(Lkotlinx/coroutines/CompletableDeferred;Ljava/lang/Object;)Z +Lkotlinx/coroutines/CompletableJob; +Lkotlinx/coroutines/CompletedContinuation; +SPLkotlinx/coroutines/CompletedContinuation;->(Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function3;Ljava/lang/Object;Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/CompletedContinuation;->(Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function3;Ljava/lang/Object;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/coroutines/CompletedExceptionally; +SPLkotlinx/coroutines/CompletedExceptionally;->()V +SPLkotlinx/coroutines/CompletedExceptionally;->(Ljava/lang/Throwable;Z)V +SPLkotlinx/coroutines/CompletedExceptionally;->(Ljava/lang/Throwable;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlinx/coroutines/CompletedExceptionally;->getHandled()Z +SPLkotlinx/coroutines/CompletedExceptionally;->get_handled$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/CompletedExceptionally;->makeHandled()Z +Lkotlinx/coroutines/CompletionStateKt; +SPLkotlinx/coroutines/CompletionStateKt;->recoverResult(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/CompletionStateKt;->toState(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/CompletionStateKt;->toState(Ljava/lang/Object;Lkotlinx/coroutines/CancellableContinuation;)Ljava/lang/Object; +Lkotlinx/coroutines/CopyableThreadContextElement; +Lkotlinx/coroutines/CopyableThrowable; +Lkotlinx/coroutines/CoroutineContextKt; +SPLkotlinx/coroutines/CoroutineContextKt;->foldCopies(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;Z)Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/CoroutineContextKt;->hasCopyableElements$lambda$0(ZLkotlin/coroutines/CoroutineContext$Element;)Z +SPLkotlinx/coroutines/CoroutineContextKt;->hasCopyableElements(Lkotlin/coroutines/CoroutineContext;)Z +SPLkotlinx/coroutines/CoroutineContextKt;->newCoroutineContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/CoroutineContextKt;->newCoroutineContext(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +Lkotlinx/coroutines/CoroutineContextKt$$ExternalSyntheticLambda0; +SPLkotlinx/coroutines/CoroutineContextKt$$ExternalSyntheticLambda0;->()V +SPLkotlinx/coroutines/CoroutineContextKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/CoroutineDispatcher; +SPLkotlinx/coroutines/CoroutineDispatcher;->()V +SPLkotlinx/coroutines/CoroutineDispatcher;->()V +SPLkotlinx/coroutines/CoroutineDispatcher;->dispatchYield(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/CoroutineDispatcher;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLkotlinx/coroutines/CoroutineDispatcher;->interceptContinuation(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/CoroutineDispatcher;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z +SPLkotlinx/coroutines/CoroutineDispatcher;->limitedParallelism$default(Lkotlinx/coroutines/CoroutineDispatcher;ILjava/lang/String;ILjava/lang/Object;)Lkotlinx/coroutines/CoroutineDispatcher; +SPLkotlinx/coroutines/CoroutineDispatcher;->limitedParallelism(ILjava/lang/String;)Lkotlinx/coroutines/CoroutineDispatcher; +SPLkotlinx/coroutines/CoroutineDispatcher;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/CoroutineDispatcher;->releaseInterceptedContinuation(Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/CoroutineDispatcher$Key; +SPLkotlinx/coroutines/CoroutineDispatcher$Key;->()V +SPLkotlinx/coroutines/CoroutineDispatcher$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/coroutines/CoroutineDispatcher$Key$$ExternalSyntheticLambda0; +SPLkotlinx/coroutines/CoroutineDispatcher$Key$$ExternalSyntheticLambda0;->()V +Lkotlinx/coroutines/CoroutineId; +Lkotlinx/coroutines/CoroutineName; +SPLkotlinx/coroutines/CoroutineName;->()V +SPLkotlinx/coroutines/CoroutineName;->(Ljava/lang/String;)V +Lkotlinx/coroutines/CoroutineName$Key; +SPLkotlinx/coroutines/CoroutineName$Key;->()V +SPLkotlinx/coroutines/CoroutineName$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/coroutines/CoroutineScope; +Lkotlinx/coroutines/CoroutineScopeKt; +SPLkotlinx/coroutines/CoroutineScopeKt;->CoroutineScope(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/CoroutineScope; +SPLkotlinx/coroutines/CoroutineScopeKt;->MainScope()Lkotlinx/coroutines/CoroutineScope; +SPLkotlinx/coroutines/CoroutineScopeKt;->cancel$default(Lkotlinx/coroutines/CoroutineScope;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V +SPLkotlinx/coroutines/CoroutineScopeKt;->cancel(Lkotlinx/coroutines/CoroutineScope;Ljava/util/concurrent/CancellationException;)V +SPLkotlinx/coroutines/CoroutineScopeKt;->coroutineScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/CoroutineScopeKt;->ensureActive(Lkotlinx/coroutines/CoroutineScope;)V +Lkotlinx/coroutines/CoroutineStart; +SPLkotlinx/coroutines/CoroutineStart;->$values()[Lkotlinx/coroutines/CoroutineStart; +SPLkotlinx/coroutines/CoroutineStart;->()V +SPLkotlinx/coroutines/CoroutineStart;->(Ljava/lang/String;I)V +SPLkotlinx/coroutines/CoroutineStart;->invoke(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/CoroutineStart;->isLazy()Z +SPLkotlinx/coroutines/CoroutineStart;->values()[Lkotlinx/coroutines/CoroutineStart; +Lkotlinx/coroutines/CoroutineStart$WhenMappings; +SPLkotlinx/coroutines/CoroutineStart$WhenMappings;->()V +Lkotlinx/coroutines/DebugKt; +SPLkotlinx/coroutines/DebugKt;->()V +SPLkotlinx/coroutines/DebugKt;->getASSERTIONS_ENABLED()Z +SPLkotlinx/coroutines/DebugKt;->getDEBUG()Z +SPLkotlinx/coroutines/DebugKt;->getRECOVER_STACK_TRACES()Z +Lkotlinx/coroutines/DebugStringsKt; +SPLkotlinx/coroutines/DebugStringsKt;->getClassSimpleName(Ljava/lang/Object;)Ljava/lang/String; +Lkotlinx/coroutines/DefaultExecutor; +SPLkotlinx/coroutines/DefaultExecutor;->()V +SPLkotlinx/coroutines/DefaultExecutor;->()V +SPLkotlinx/coroutines/DefaultExecutor;->acknowledgeShutdownIfNeeded()V +SPLkotlinx/coroutines/DefaultExecutor;->createThreadSync()Ljava/lang/Thread; +SPLkotlinx/coroutines/DefaultExecutor;->getThread()Ljava/lang/Thread; +SPLkotlinx/coroutines/DefaultExecutor;->isShutdownRequested()Z +SPLkotlinx/coroutines/DefaultExecutor;->notifyStartup()Z +SPLkotlinx/coroutines/DefaultExecutor;->run()V +Lkotlinx/coroutines/DefaultExecutorKt; +SPLkotlinx/coroutines/DefaultExecutorKt;->()V +SPLkotlinx/coroutines/DefaultExecutorKt;->getDefaultDelay()Lkotlinx/coroutines/Delay; +SPLkotlinx/coroutines/DefaultExecutorKt;->initializeDefaultDelay()Lkotlinx/coroutines/Delay; +Lkotlinx/coroutines/Deferred; +Lkotlinx/coroutines/Delay; +Lkotlinx/coroutines/DelayKt; +SPLkotlinx/coroutines/DelayKt;->awaitCancellation(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/DelayKt;->delay(JLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/DelayKt;->delay-VtjQ1oo(JLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/DelayKt;->getDelay(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Delay; +SPLkotlinx/coroutines/DelayKt;->toDelayMillis-LRDsOJo(J)J +Lkotlinx/coroutines/DelayKt$awaitCancellation$1; +SPLkotlinx/coroutines/DelayKt$awaitCancellation$1;->(Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/DispatchException; +Lkotlinx/coroutines/DispatchedCoroutine; +SPLkotlinx/coroutines/DispatchedCoroutine;->()V +SPLkotlinx/coroutines/DispatchedCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/DispatchedCoroutine;->afterResume(Ljava/lang/Object;)V +SPLkotlinx/coroutines/DispatchedCoroutine;->getResult$kotlinx_coroutines_core()Ljava/lang/Object; +SPLkotlinx/coroutines/DispatchedCoroutine;->get_decision$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/DispatchedCoroutine;->tryResume()Z +SPLkotlinx/coroutines/DispatchedCoroutine;->trySuspend()Z +Lkotlinx/coroutines/DispatchedTask; +SPLkotlinx/coroutines/DispatchedTask;->(I)V +SPLkotlinx/coroutines/DispatchedTask;->cancelCompletedResult$kotlinx_coroutines_core(Ljava/lang/Object;Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/DispatchedTask;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable; +SPLkotlinx/coroutines/DispatchedTask;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/DispatchedTask;->run()V +Lkotlinx/coroutines/DispatchedTaskKt; +SPLkotlinx/coroutines/DispatchedTaskKt;->dispatch(Lkotlinx/coroutines/DispatchedTask;I)V +SPLkotlinx/coroutines/DispatchedTaskKt;->isCancellableMode(I)Z +SPLkotlinx/coroutines/DispatchedTaskKt;->isReusableMode(I)Z +SPLkotlinx/coroutines/DispatchedTaskKt;->resume(Lkotlinx/coroutines/DispatchedTask;Lkotlin/coroutines/Continuation;Z)V +SPLkotlinx/coroutines/DispatchedTaskKt;->resumeUnconfined(Lkotlinx/coroutines/DispatchedTask;)V +Lkotlinx/coroutines/DispatcherExecutor; +SPLkotlinx/coroutines/DispatcherExecutor;->(Lkotlinx/coroutines/CoroutineDispatcher;)V +Lkotlinx/coroutines/Dispatchers; +SPLkotlinx/coroutines/Dispatchers;->()V +SPLkotlinx/coroutines/Dispatchers;->()V +SPLkotlinx/coroutines/Dispatchers;->getDefault()Lkotlinx/coroutines/CoroutineDispatcher; +SPLkotlinx/coroutines/Dispatchers;->getIO()Lkotlinx/coroutines/CoroutineDispatcher; +SPLkotlinx/coroutines/Dispatchers;->getMain()Lkotlinx/coroutines/MainCoroutineDispatcher; +Lkotlinx/coroutines/DisposableHandle; +Lkotlinx/coroutines/DisposeOnCancel; +SPLkotlinx/coroutines/DisposeOnCancel;->(Lkotlinx/coroutines/DisposableHandle;)V +Lkotlinx/coroutines/Empty; +SPLkotlinx/coroutines/Empty;->(Z)V +SPLkotlinx/coroutines/Empty;->getList()Lkotlinx/coroutines/NodeList; +SPLkotlinx/coroutines/Empty;->isActive()Z +Lkotlinx/coroutines/EventLoop; +SPLkotlinx/coroutines/EventLoop;->()V +SPLkotlinx/coroutines/EventLoop;->decrementUseCount$default(Lkotlinx/coroutines/EventLoop;ZILjava/lang/Object;)V +SPLkotlinx/coroutines/EventLoop;->decrementUseCount(Z)V +SPLkotlinx/coroutines/EventLoop;->delta(Z)J +SPLkotlinx/coroutines/EventLoop;->dispatchUnconfined(Lkotlinx/coroutines/DispatchedTask;)V +SPLkotlinx/coroutines/EventLoop;->getNextTime()J +SPLkotlinx/coroutines/EventLoop;->incrementUseCount$default(Lkotlinx/coroutines/EventLoop;ZILjava/lang/Object;)V +SPLkotlinx/coroutines/EventLoop;->incrementUseCount(Z)V +SPLkotlinx/coroutines/EventLoop;->isUnconfinedLoopActive()Z +SPLkotlinx/coroutines/EventLoop;->isUnconfinedQueueEmpty()Z +SPLkotlinx/coroutines/EventLoop;->processUnconfinedEvent()Z +Lkotlinx/coroutines/EventLoopImplBase; +SPLkotlinx/coroutines/EventLoopImplBase;->()V +SPLkotlinx/coroutines/EventLoopImplBase;->()V +SPLkotlinx/coroutines/EventLoopImplBase;->access$isCompleted(Lkotlinx/coroutines/EventLoopImplBase;)Z +SPLkotlinx/coroutines/EventLoopImplBase;->closeQueue()V +SPLkotlinx/coroutines/EventLoopImplBase;->dequeue()Ljava/lang/Runnable; +SPLkotlinx/coroutines/EventLoopImplBase;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/EventLoopImplBase;->enqueue(Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/EventLoopImplBase;->enqueueDelayedTasks()V +SPLkotlinx/coroutines/EventLoopImplBase;->enqueueImpl(Ljava/lang/Runnable;)Z +SPLkotlinx/coroutines/EventLoopImplBase;->getNextTime()J +SPLkotlinx/coroutines/EventLoopImplBase;->get_delayed$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/EventLoopImplBase;->get_isCompleted$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/EventLoopImplBase;->get_queue$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/EventLoopImplBase;->isCompleted()Z +SPLkotlinx/coroutines/EventLoopImplBase;->isEmpty()Z +SPLkotlinx/coroutines/EventLoopImplBase;->processNextEvent()J +SPLkotlinx/coroutines/EventLoopImplBase;->rescheduleAllDelayed()V +SPLkotlinx/coroutines/EventLoopImplBase;->schedule(JLkotlinx/coroutines/EventLoopImplBase$DelayedTask;)V +SPLkotlinx/coroutines/EventLoopImplBase;->scheduleImpl(JLkotlinx/coroutines/EventLoopImplBase$DelayedTask;)I +SPLkotlinx/coroutines/EventLoopImplBase;->scheduleResumeAfterDelay(JLkotlinx/coroutines/CancellableContinuation;)V +SPLkotlinx/coroutines/EventLoopImplBase;->setCompleted(Z)V +SPLkotlinx/coroutines/EventLoopImplBase;->shouldUnpark(Lkotlinx/coroutines/EventLoopImplBase$DelayedTask;)Z +SPLkotlinx/coroutines/EventLoopImplBase;->shutdown()V +Lkotlinx/coroutines/EventLoopImplBase$DelayedResumeTask; +SPLkotlinx/coroutines/EventLoopImplBase$DelayedResumeTask;->(Lkotlinx/coroutines/EventLoopImplBase;JLkotlinx/coroutines/CancellableContinuation;)V +SPLkotlinx/coroutines/EventLoopImplBase$DelayedResumeTask;->run()V +Lkotlinx/coroutines/EventLoopImplBase$DelayedTask; +SPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->(J)V +SPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->scheduleTask(JLkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue;Lkotlinx/coroutines/EventLoopImplBase;)I +SPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->setHeap(Lkotlinx/coroutines/internal/ThreadSafeHeap;)V +SPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->setIndex(I)V +SPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->timeToExecute(J)Z +Lkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue; +SPLkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue;->(J)V +Lkotlinx/coroutines/EventLoopImplPlatform; +SPLkotlinx/coroutines/EventLoopImplPlatform;->()V +SPLkotlinx/coroutines/EventLoopImplPlatform;->unpark()V +Lkotlinx/coroutines/EventLoopKt; +SPLkotlinx/coroutines/EventLoopKt;->createEventLoop()Lkotlinx/coroutines/EventLoop; +Lkotlinx/coroutines/EventLoop_commonKt; +SPLkotlinx/coroutines/EventLoop_commonKt;->()V +SPLkotlinx/coroutines/EventLoop_commonKt;->access$getCLOSED_EMPTY$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/EventLoop_commonKt;->access$getDISPOSED_TASK$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/EventLoop_commonKt;->delayToNanos(J)J +Lkotlinx/coroutines/ExecutorCoroutineDispatcher; +SPLkotlinx/coroutines/ExecutorCoroutineDispatcher;->()V +SPLkotlinx/coroutines/ExecutorCoroutineDispatcher;->()V +Lkotlinx/coroutines/ExecutorCoroutineDispatcher$Key; +SPLkotlinx/coroutines/ExecutorCoroutineDispatcher$Key;->()V +SPLkotlinx/coroutines/ExecutorCoroutineDispatcher$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/coroutines/ExecutorCoroutineDispatcher$Key$$ExternalSyntheticLambda0; +SPLkotlinx/coroutines/ExecutorCoroutineDispatcher$Key$$ExternalSyntheticLambda0;->()V +Lkotlinx/coroutines/ExecutorCoroutineDispatcherImpl; +SPLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->(Ljava/util/concurrent/Executor;)V +SPLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->equals(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->getExecutor()Ljava/util/concurrent/Executor; +Lkotlinx/coroutines/ExecutorsKt; +SPLkotlinx/coroutines/ExecutorsKt;->asExecutor(Lkotlinx/coroutines/CoroutineDispatcher;)Ljava/util/concurrent/Executor; +SPLkotlinx/coroutines/ExecutorsKt;->from(Ljava/util/concurrent/Executor;)Lkotlinx/coroutines/CoroutineDispatcher; +Lkotlinx/coroutines/GlobalScope; +SPLkotlinx/coroutines/GlobalScope;->()V +SPLkotlinx/coroutines/GlobalScope;->()V +SPLkotlinx/coroutines/GlobalScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; +Lkotlinx/coroutines/InactiveNodeList; +Lkotlinx/coroutines/Incomplete; +Lkotlinx/coroutines/IncompleteStateBox; +Lkotlinx/coroutines/Job; +SPLkotlinx/coroutines/Job;->()V +SPLkotlinx/coroutines/Job;->cancel$default(Lkotlinx/coroutines/Job;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V +Lkotlinx/coroutines/Job$DefaultImpls; +SPLkotlinx/coroutines/Job$DefaultImpls;->cancel$default(Lkotlinx/coroutines/Job;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V +SPLkotlinx/coroutines/Job$DefaultImpls;->fold(Lkotlinx/coroutines/Job;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlinx/coroutines/Job$DefaultImpls;->get(Lkotlinx/coroutines/Job;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLkotlinx/coroutines/Job$DefaultImpls;->minusKey(Lkotlinx/coroutines/Job;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/Job$DefaultImpls;->plus(Lkotlinx/coroutines/Job;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +Lkotlinx/coroutines/Job$Key; +SPLkotlinx/coroutines/Job$Key;->()V +SPLkotlinx/coroutines/Job$Key;->()V +Lkotlinx/coroutines/JobCancellationException; +SPLkotlinx/coroutines/JobCancellationException;->(Ljava/lang/String;Ljava/lang/Throwable;Lkotlinx/coroutines/Job;)V +SPLkotlinx/coroutines/JobCancellationException;->equals(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/JobCancellationException;->fillInStackTrace()Ljava/lang/Throwable; +Lkotlinx/coroutines/JobImpl; +SPLkotlinx/coroutines/JobImpl;->(Lkotlinx/coroutines/Job;)V +SPLkotlinx/coroutines/JobImpl;->complete()Z +SPLkotlinx/coroutines/JobImpl;->getOnCancelComplete$kotlinx_coroutines_core()Z +SPLkotlinx/coroutines/JobImpl;->handlesException()Z +Lkotlinx/coroutines/JobKt; +SPLkotlinx/coroutines/JobKt;->Job$default(Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/CompletableJob; +SPLkotlinx/coroutines/JobKt;->Job(Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/CompletableJob; +SPLkotlinx/coroutines/JobKt;->ensureActive(Lkotlin/coroutines/CoroutineContext;)V +SPLkotlinx/coroutines/JobKt;->ensureActive(Lkotlinx/coroutines/Job;)V +SPLkotlinx/coroutines/JobKt;->invokeOnCompletion$default(Lkotlinx/coroutines/Job;ZLkotlinx/coroutines/JobNode;ILjava/lang/Object;)Lkotlinx/coroutines/DisposableHandle; +SPLkotlinx/coroutines/JobKt;->invokeOnCompletion(Lkotlinx/coroutines/Job;ZLkotlinx/coroutines/JobNode;)Lkotlinx/coroutines/DisposableHandle; +Lkotlinx/coroutines/JobKt__JobKt; +SPLkotlinx/coroutines/JobKt__JobKt;->Job$default(Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/CompletableJob; +SPLkotlinx/coroutines/JobKt__JobKt;->Job(Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/CompletableJob; +SPLkotlinx/coroutines/JobKt__JobKt;->ensureActive(Lkotlin/coroutines/CoroutineContext;)V +SPLkotlinx/coroutines/JobKt__JobKt;->ensureActive(Lkotlinx/coroutines/Job;)V +SPLkotlinx/coroutines/JobKt__JobKt;->invokeOnCompletion$default(Lkotlinx/coroutines/Job;ZLkotlinx/coroutines/JobNode;ILjava/lang/Object;)Lkotlinx/coroutines/DisposableHandle; +SPLkotlinx/coroutines/JobKt__JobKt;->invokeOnCompletion(Lkotlinx/coroutines/Job;ZLkotlinx/coroutines/JobNode;)Lkotlinx/coroutines/DisposableHandle; +Lkotlinx/coroutines/JobNode; +SPLkotlinx/coroutines/JobNode;->()V +SPLkotlinx/coroutines/JobNode;->dispose()V +SPLkotlinx/coroutines/JobNode;->getJob()Lkotlinx/coroutines/JobSupport; +SPLkotlinx/coroutines/JobNode;->getList()Lkotlinx/coroutines/NodeList; +SPLkotlinx/coroutines/JobNode;->isActive()Z +SPLkotlinx/coroutines/JobNode;->setJob(Lkotlinx/coroutines/JobSupport;)V +Lkotlinx/coroutines/JobSupport; +SPLkotlinx/coroutines/JobSupport;->()V +SPLkotlinx/coroutines/JobSupport;->(Z)V +SPLkotlinx/coroutines/JobSupport;->access$cancellationExceptionMessage(Lkotlinx/coroutines/JobSupport;)Ljava/lang/String; +SPLkotlinx/coroutines/JobSupport;->access$continueCompleting(Lkotlinx/coroutines/JobSupport;Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)V +SPLkotlinx/coroutines/JobSupport;->addSuppressedExceptions(Ljava/lang/Throwable;Ljava/util/List;)V +SPLkotlinx/coroutines/JobSupport;->afterCompletion(Ljava/lang/Object;)V +SPLkotlinx/coroutines/JobSupport;->attachChild(Lkotlinx/coroutines/ChildJob;)Lkotlinx/coroutines/ChildHandle; +SPLkotlinx/coroutines/JobSupport;->cancel(Ljava/util/concurrent/CancellationException;)V +SPLkotlinx/coroutines/JobSupport;->cancelImpl$kotlinx_coroutines_core(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/JobSupport;->cancelInternal(Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/JobSupport;->cancelMakeCompleting(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->cancelParent(Ljava/lang/Throwable;)Z +SPLkotlinx/coroutines/JobSupport;->cancellationExceptionMessage()Ljava/lang/String; +SPLkotlinx/coroutines/JobSupport;->childCancelled(Ljava/lang/Throwable;)Z +SPLkotlinx/coroutines/JobSupport;->completeStateFinalization(Lkotlinx/coroutines/Incomplete;Ljava/lang/Object;)V +SPLkotlinx/coroutines/JobSupport;->continueCompleting(Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)V +SPLkotlinx/coroutines/JobSupport;->createCauseException(Ljava/lang/Object;)Ljava/lang/Throwable; +SPLkotlinx/coroutines/JobSupport;->finalizeFinishingState(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLkotlinx/coroutines/JobSupport;->getCancellationException()Ljava/util/concurrent/CancellationException; +SPLkotlinx/coroutines/JobSupport;->getChildJobCancellationCause()Ljava/util/concurrent/CancellationException; +SPLkotlinx/coroutines/JobSupport;->getCompletedInternal$kotlinx_coroutines_core()Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->getFinalRootCause(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/util/List;)Ljava/lang/Throwable; +SPLkotlinx/coroutines/JobSupport;->getKey()Lkotlin/coroutines/CoroutineContext$Key; +SPLkotlinx/coroutines/JobSupport;->getOnCancelComplete$kotlinx_coroutines_core()Z +SPLkotlinx/coroutines/JobSupport;->getOrPromoteCancellingList(Lkotlinx/coroutines/Incomplete;)Lkotlinx/coroutines/NodeList; +SPLkotlinx/coroutines/JobSupport;->getParentHandle$kotlinx_coroutines_core()Lkotlinx/coroutines/ChildHandle; +SPLkotlinx/coroutines/JobSupport;->getState$kotlinx_coroutines_core()Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->get_parentHandle$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/JobSupport;->get_state$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/JobSupport;->initParentJob(Lkotlinx/coroutines/Job;)V +SPLkotlinx/coroutines/JobSupport;->invokeOnCompletionInternal$kotlinx_coroutines_core(ZLkotlinx/coroutines/JobNode;)Lkotlinx/coroutines/DisposableHandle; +SPLkotlinx/coroutines/JobSupport;->isActive()Z +SPLkotlinx/coroutines/JobSupport;->isCancelled()Z +SPLkotlinx/coroutines/JobSupport;->isCompleted()Z +SPLkotlinx/coroutines/JobSupport;->isScopedCoroutine()Z +SPLkotlinx/coroutines/JobSupport;->join(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->joinInternal()Z +SPLkotlinx/coroutines/JobSupport;->joinSuspend(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->makeCancelling(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->makeCompleting$kotlinx_coroutines_core(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/JobSupport;->makeCompletingOnce$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/JobSupport;->nextChild(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Lkotlinx/coroutines/ChildHandleNode; +SPLkotlinx/coroutines/JobSupport;->notifyCancelling(Lkotlinx/coroutines/NodeList;Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/JobSupport;->notifyCompletion(Lkotlinx/coroutines/NodeList;Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/JobSupport;->onCancelling(Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/JobSupport;->onCompletionInternal(Ljava/lang/Object;)V +SPLkotlinx/coroutines/JobSupport;->parentCancelled(Lkotlinx/coroutines/ParentJob;)V +SPLkotlinx/coroutines/JobSupport;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/JobSupport;->promoteSingleToNodeList(Lkotlinx/coroutines/JobNode;)V +SPLkotlinx/coroutines/JobSupport;->removeNode$kotlinx_coroutines_core(Lkotlinx/coroutines/JobNode;)V +SPLkotlinx/coroutines/JobSupport;->setParentHandle$kotlinx_coroutines_core(Lkotlinx/coroutines/ChildHandle;)V +SPLkotlinx/coroutines/JobSupport;->start()Z +SPLkotlinx/coroutines/JobSupport;->startInternal(Ljava/lang/Object;)I +SPLkotlinx/coroutines/JobSupport;->toCancellationException(Ljava/lang/Throwable;Ljava/lang/String;)Ljava/util/concurrent/CancellationException; +SPLkotlinx/coroutines/JobSupport;->tryFinalizeSimpleState(Lkotlinx/coroutines/Incomplete;Ljava/lang/Object;)Z +SPLkotlinx/coroutines/JobSupport;->tryMakeCancelling(Lkotlinx/coroutines/Incomplete;Ljava/lang/Throwable;)Z +SPLkotlinx/coroutines/JobSupport;->tryMakeCompleting(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->tryMakeCompletingSlowPath(Lkotlinx/coroutines/Incomplete;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->tryWaitForChild(Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)Z +Lkotlinx/coroutines/JobSupport$ChildCompletion; +SPLkotlinx/coroutines/JobSupport$ChildCompletion;->(Lkotlinx/coroutines/JobSupport;Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)V +SPLkotlinx/coroutines/JobSupport$ChildCompletion;->getOnCancelling()Z +SPLkotlinx/coroutines/JobSupport$ChildCompletion;->invoke(Ljava/lang/Throwable;)V +Lkotlinx/coroutines/JobSupport$Finishing; +SPLkotlinx/coroutines/JobSupport$Finishing;->()V +SPLkotlinx/coroutines/JobSupport$Finishing;->(Lkotlinx/coroutines/NodeList;ZLjava/lang/Throwable;)V +SPLkotlinx/coroutines/JobSupport$Finishing;->addExceptionLocked(Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/JobSupport$Finishing;->allocateList()Ljava/util/ArrayList; +SPLkotlinx/coroutines/JobSupport$Finishing;->getExceptionsHolder()Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport$Finishing;->getList()Lkotlinx/coroutines/NodeList; +SPLkotlinx/coroutines/JobSupport$Finishing;->getRootCause()Ljava/lang/Throwable; +SPLkotlinx/coroutines/JobSupport$Finishing;->get_exceptionsHolder$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/JobSupport$Finishing;->get_isCompleting$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/JobSupport$Finishing;->get_rootCause$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/JobSupport$Finishing;->isActive()Z +SPLkotlinx/coroutines/JobSupport$Finishing;->isCancelling()Z +SPLkotlinx/coroutines/JobSupport$Finishing;->isCompleting()Z +SPLkotlinx/coroutines/JobSupport$Finishing;->isSealed()Z +SPLkotlinx/coroutines/JobSupport$Finishing;->sealLocked(Ljava/lang/Throwable;)Ljava/util/List; +SPLkotlinx/coroutines/JobSupport$Finishing;->setCompleting(Z)V +SPLkotlinx/coroutines/JobSupport$Finishing;->setExceptionsHolder(Ljava/lang/Object;)V +SPLkotlinx/coroutines/JobSupport$Finishing;->setRootCause(Ljava/lang/Throwable;)V +Lkotlinx/coroutines/JobSupportKt; +SPLkotlinx/coroutines/JobSupportKt;->()V +SPLkotlinx/coroutines/JobSupportKt;->access$getCOMPLETING_ALREADY$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/JobSupportKt;->access$getCOMPLETING_RETRY$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/JobSupportKt;->access$getEMPTY_ACTIVE$p()Lkotlinx/coroutines/Empty; +SPLkotlinx/coroutines/JobSupportKt;->access$getSEALED$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/JobSupportKt;->access$getTOO_LATE_TO_CANCEL$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/JobSupportKt;->boxIncomplete(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupportKt;->unboxState(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/MainCoroutineDispatcher; +SPLkotlinx/coroutines/MainCoroutineDispatcher;->()V +Lkotlinx/coroutines/NodeList; +SPLkotlinx/coroutines/NodeList;->()V +SPLkotlinx/coroutines/NodeList;->getList()Lkotlinx/coroutines/NodeList; +SPLkotlinx/coroutines/NodeList;->isActive()Z +Lkotlinx/coroutines/NonDisposableHandle; +SPLkotlinx/coroutines/NonDisposableHandle;->()V +SPLkotlinx/coroutines/NonDisposableHandle;->()V +SPLkotlinx/coroutines/NonDisposableHandle;->dispose()V +Lkotlinx/coroutines/NotCompleted; +Lkotlinx/coroutines/ParentJob; +Lkotlinx/coroutines/ResumeOnCompletion; +SPLkotlinx/coroutines/ResumeOnCompletion;->(Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/ResumeOnCompletion;->invoke(Ljava/lang/Throwable;)V +Lkotlinx/coroutines/StandaloneCoroutine; +SPLkotlinx/coroutines/StandaloneCoroutine;->(Lkotlin/coroutines/CoroutineContext;Z)V +Lkotlinx/coroutines/SupervisorJobImpl; +SPLkotlinx/coroutines/SupervisorJobImpl;->(Lkotlinx/coroutines/Job;)V +SPLkotlinx/coroutines/SupervisorJobImpl;->childCancelled(Ljava/lang/Throwable;)Z +Lkotlinx/coroutines/SupervisorKt; +SPLkotlinx/coroutines/SupervisorKt;->SupervisorJob$default(Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/CompletableJob; +SPLkotlinx/coroutines/SupervisorKt;->SupervisorJob(Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/CompletableJob; +Lkotlinx/coroutines/ThreadContextElement; +Lkotlinx/coroutines/ThreadLocalEventLoop; +SPLkotlinx/coroutines/ThreadLocalEventLoop;->()V +SPLkotlinx/coroutines/ThreadLocalEventLoop;->()V +SPLkotlinx/coroutines/ThreadLocalEventLoop;->getEventLoop$kotlinx_coroutines_core()Lkotlinx/coroutines/EventLoop; +SPLkotlinx/coroutines/ThreadLocalEventLoop;->resetEventLoop$kotlinx_coroutines_core()V +SPLkotlinx/coroutines/ThreadLocalEventLoop;->setEventLoop$kotlinx_coroutines_core(Lkotlinx/coroutines/EventLoop;)V +Lkotlinx/coroutines/TimeoutCancellationException; +Lkotlinx/coroutines/Unconfined; +SPLkotlinx/coroutines/Unconfined;->()V +SPLkotlinx/coroutines/Unconfined;->()V +Lkotlinx/coroutines/UndispatchedCoroutine; +SPLkotlinx/coroutines/UndispatchedCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/UndispatchedCoroutine;->afterCompletionUndispatched()V +SPLkotlinx/coroutines/UndispatchedCoroutine;->afterResume(Ljava/lang/Object;)V +SPLkotlinx/coroutines/UndispatchedCoroutine;->clearThreadLocal()V +Lkotlinx/coroutines/UndispatchedMarker; +SPLkotlinx/coroutines/UndispatchedMarker;->()V +SPLkotlinx/coroutines/UndispatchedMarker;->()V +SPLkotlinx/coroutines/UndispatchedMarker;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlinx/coroutines/UndispatchedMarker;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLkotlinx/coroutines/UndispatchedMarker;->getKey()Lkotlin/coroutines/CoroutineContext$Key; +Lkotlinx/coroutines/Waiter; +Lkotlinx/coroutines/YieldContext; +SPLkotlinx/coroutines/YieldContext;->()V +SPLkotlinx/coroutines/YieldContext;->()V +Lkotlinx/coroutines/YieldContext$Key; +SPLkotlinx/coroutines/YieldContext$Key;->()V +SPLkotlinx/coroutines/YieldContext$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/coroutines/YieldKt; +SPLkotlinx/coroutines/YieldKt;->yield(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/android/AndroidDispatcherFactory; +SPLkotlinx/coroutines/android/AndroidDispatcherFactory;->()V +SPLkotlinx/coroutines/android/AndroidDispatcherFactory;->createDispatcher(Ljava/util/List;)Lkotlinx/coroutines/MainCoroutineDispatcher; +Lkotlinx/coroutines/android/HandlerContext; +SPLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;)V +SPLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;Z)V +SPLkotlinx/coroutines/android/HandlerContext;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/android/HandlerContext;->equals(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/android/HandlerContext;->getImmediate()Lkotlinx/coroutines/MainCoroutineDispatcher; +SPLkotlinx/coroutines/android/HandlerContext;->getImmediate()Lkotlinx/coroutines/android/HandlerContext; +SPLkotlinx/coroutines/android/HandlerContext;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z +Lkotlinx/coroutines/android/HandlerDispatcher; +SPLkotlinx/coroutines/android/HandlerDispatcher;->()V +SPLkotlinx/coroutines/android/HandlerDispatcher;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/coroutines/android/HandlerDispatcherKt; +SPLkotlinx/coroutines/android/HandlerDispatcherKt;->()V +SPLkotlinx/coroutines/android/HandlerDispatcherKt;->asHandler(Landroid/os/Looper;Z)Landroid/os/Handler; +Lkotlinx/coroutines/channels/BufferOverflow; +SPLkotlinx/coroutines/channels/BufferOverflow;->$values()[Lkotlinx/coroutines/channels/BufferOverflow; +SPLkotlinx/coroutines/channels/BufferOverflow;->()V +SPLkotlinx/coroutines/channels/BufferOverflow;->(Ljava/lang/String;I)V +Lkotlinx/coroutines/channels/BufferedChannel; +SPLkotlinx/coroutines/channels/BufferedChannel;->()V +SPLkotlinx/coroutines/channels/BufferedChannel;->(ILkotlin/jvm/functions/Function1;)V +SPLkotlinx/coroutines/channels/BufferedChannel;->access$getReceiveSegment$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/channels/BufferedChannel;->access$getReceivers$volatile$FU()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; +SPLkotlinx/coroutines/channels/BufferedChannel;->access$getSendSegment$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/channels/BufferedChannel;->access$getSendersAndCloseStatus$volatile$FU()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; +SPLkotlinx/coroutines/channels/BufferedChannel;->access$isClosedForSend0(Lkotlinx/coroutines/channels/BufferedChannel;J)Z +SPLkotlinx/coroutines/channels/BufferedChannel;->access$prepareReceiverForSuspension(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/Waiter;Lkotlinx/coroutines/channels/ChannelSegment;I)V +SPLkotlinx/coroutines/channels/BufferedChannel;->access$receiveCatchingOnNoWaiterSuspend-GKJJFZk(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel;->access$updateCellReceive(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/channels/ChannelSegment;IJLjava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel;->access$updateCellSend(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/channels/ChannelSegment;ILjava/lang/Object;JLjava/lang/Object;Z)I +SPLkotlinx/coroutines/channels/BufferedChannel;->bufferOrRendezvousSend(J)Z +SPLkotlinx/coroutines/channels/BufferedChannel;->cancelSuspendedReceiveRequests(Lkotlinx/coroutines/channels/ChannelSegment;J)V +SPLkotlinx/coroutines/channels/BufferedChannel;->close(Ljava/lang/Throwable;)Z +SPLkotlinx/coroutines/channels/BufferedChannel;->closeLinkedList()Lkotlinx/coroutines/channels/ChannelSegment; +SPLkotlinx/coroutines/channels/BufferedChannel;->closeOrCancelImpl(Ljava/lang/Throwable;Z)Z +SPLkotlinx/coroutines/channels/BufferedChannel;->completeClose(J)Lkotlinx/coroutines/channels/ChannelSegment; +SPLkotlinx/coroutines/channels/BufferedChannel;->completeCloseOrCancel()V +SPLkotlinx/coroutines/channels/BufferedChannel;->expandBuffer()V +SPLkotlinx/coroutines/channels/BufferedChannel;->getBufferEnd$volatile$FU()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; +SPLkotlinx/coroutines/channels/BufferedChannel;->getBufferEndCounter()J +SPLkotlinx/coroutines/channels/BufferedChannel;->getBufferEndSegment$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/channels/BufferedChannel;->getCloseCause()Ljava/lang/Throwable; +SPLkotlinx/coroutines/channels/BufferedChannel;->getCloseHandler$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/channels/BufferedChannel;->getCompletedExpandBuffersAndPauseFlag$volatile$FU()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; +SPLkotlinx/coroutines/channels/BufferedChannel;->getReceiveSegment$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/channels/BufferedChannel;->getReceivers$volatile$FU()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; +SPLkotlinx/coroutines/channels/BufferedChannel;->getReceiversCounter$kotlinx_coroutines_core()J +SPLkotlinx/coroutines/channels/BufferedChannel;->getSendSegment$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/channels/BufferedChannel;->getSendersAndCloseStatus$volatile$FU()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; +SPLkotlinx/coroutines/channels/BufferedChannel;->getSendersCounter$kotlinx_coroutines_core()J +SPLkotlinx/coroutines/channels/BufferedChannel;->get_closeCause$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/channels/BufferedChannel;->incCompletedExpandBufferAttempts$default(Lkotlinx/coroutines/channels/BufferedChannel;JILjava/lang/Object;)V +SPLkotlinx/coroutines/channels/BufferedChannel;->incCompletedExpandBufferAttempts(J)V +SPLkotlinx/coroutines/channels/BufferedChannel;->invokeCloseHandler()V +SPLkotlinx/coroutines/channels/BufferedChannel;->isClosed(JZ)Z +SPLkotlinx/coroutines/channels/BufferedChannel;->isClosedForReceive()Z +SPLkotlinx/coroutines/channels/BufferedChannel;->isClosedForReceive0(J)Z +SPLkotlinx/coroutines/channels/BufferedChannel;->isClosedForSend()Z +SPLkotlinx/coroutines/channels/BufferedChannel;->isClosedForSend0(J)Z +SPLkotlinx/coroutines/channels/BufferedChannel;->isConflatedDropOldest()Z +SPLkotlinx/coroutines/channels/BufferedChannel;->isRendezvousOrUnlimited()Z +SPLkotlinx/coroutines/channels/BufferedChannel;->iterator()Lkotlinx/coroutines/channels/ChannelIterator; +SPLkotlinx/coroutines/channels/BufferedChannel;->markAllEmptyCellsAsClosed(Lkotlinx/coroutines/channels/ChannelSegment;)J +SPLkotlinx/coroutines/channels/BufferedChannel;->markClosed()V +SPLkotlinx/coroutines/channels/BufferedChannel;->onClosedIdempotent()V +SPLkotlinx/coroutines/channels/BufferedChannel;->onReceiveDequeued()V +SPLkotlinx/coroutines/channels/BufferedChannel;->onReceiveEnqueued()V +SPLkotlinx/coroutines/channels/BufferedChannel;->prepareReceiverForSuspension(Lkotlinx/coroutines/Waiter;Lkotlinx/coroutines/channels/ChannelSegment;I)V +SPLkotlinx/coroutines/channels/BufferedChannel;->receiveCatching-JP2dKIU$suspendImpl(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel;->receiveCatching-JP2dKIU(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel;->receiveCatchingOnNoWaiterSuspend-GKJJFZk(Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel;->resumeReceiverOnClosedChannel(Lkotlinx/coroutines/Waiter;)V +SPLkotlinx/coroutines/channels/BufferedChannel;->resumeWaiterOnClosedChannel(Lkotlinx/coroutines/Waiter;Z)V +SPLkotlinx/coroutines/channels/BufferedChannel;->send$suspendImpl(Lkotlinx/coroutines/channels/BufferedChannel;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel;->tryReceive-PtdJZtk()Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel;->tryResumeReceiver(Ljava/lang/Object;Ljava/lang/Object;)Z +SPLkotlinx/coroutines/channels/BufferedChannel;->updateCellReceive(Lkotlinx/coroutines/channels/ChannelSegment;IJLjava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel;->updateCellSend(Lkotlinx/coroutines/channels/ChannelSegment;ILjava/lang/Object;JLjava/lang/Object;Z)I +SPLkotlinx/coroutines/channels/BufferedChannel;->waitExpandBufferCompletion$kotlinx_coroutines_core(J)V +Lkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator; +SPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->(Lkotlinx/coroutines/channels/BufferedChannel;)V +SPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->access$setContinuation$p(Lkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;Lkotlinx/coroutines/CancellableContinuationImpl;)V +SPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->hasNext(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->hasNextOnNoWaiterSuspend(Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V +SPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->next()Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->tryResumeHasNext(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->tryResumeHasNextOnClosedChannel()V +Lkotlinx/coroutines/channels/BufferedChannel$SendBroadcast; +Lkotlinx/coroutines/channels/BufferedChannel$receiveCatching$1; +SPLkotlinx/coroutines/channels/BufferedChannel$receiveCatching$1;->(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/channels/BufferedChannel$receiveCatching$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/channels/BufferedChannel$receiveCatchingOnNoWaiterSuspend$1; +SPLkotlinx/coroutines/channels/BufferedChannel$receiveCatchingOnNoWaiterSuspend$1;->(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/channels/BufferedChannel$receiveCatchingOnNoWaiterSuspend$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/channels/BufferedChannelKt; +SPLkotlinx/coroutines/channels/BufferedChannelKt;->()V +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$constructSendersAndCloseStatus(JI)J +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getCLOSE_HANDLER_CLOSED$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getDONE_RCV$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getEXPAND_BUFFER_COMPLETION_WAIT_ITERATIONS$p()I +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getFAILED$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getINTERRUPTED_RCV$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getIN_BUFFER$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getNO_CLOSE_CAUSE$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getNO_RECEIVE_RESULT$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getNULL_SEGMENT$p()Lkotlinx/coroutines/channels/ChannelSegment; +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getSUSPEND$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getSUSPEND_NO_WAITER$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$initialBufferEnd(I)J +SPLkotlinx/coroutines/channels/BufferedChannelKt;->access$tryResume0(Lkotlinx/coroutines/CancellableContinuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Z +SPLkotlinx/coroutines/channels/BufferedChannelKt;->constructSendersAndCloseStatus(JI)J +SPLkotlinx/coroutines/channels/BufferedChannelKt;->getCHANNEL_CLOSED()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/channels/BufferedChannelKt;->initialBufferEnd(I)J +SPLkotlinx/coroutines/channels/BufferedChannelKt;->tryResume0(Lkotlinx/coroutines/CancellableContinuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Z +Lkotlinx/coroutines/channels/Channel; +SPLkotlinx/coroutines/channels/Channel;->()V +Lkotlinx/coroutines/channels/Channel$Factory; +SPLkotlinx/coroutines/channels/Channel$Factory;->()V +SPLkotlinx/coroutines/channels/Channel$Factory;->()V +SPLkotlinx/coroutines/channels/Channel$Factory;->getCHANNEL_DEFAULT_CAPACITY$kotlinx_coroutines_core()I +Lkotlinx/coroutines/channels/ChannelCoroutine; +SPLkotlinx/coroutines/channels/ChannelCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/Channel;ZZ)V +SPLkotlinx/coroutines/channels/ChannelCoroutine;->cancel(Ljava/util/concurrent/CancellationException;)V +SPLkotlinx/coroutines/channels/ChannelCoroutine;->get_channel()Lkotlinx/coroutines/channels/Channel; +SPLkotlinx/coroutines/channels/ChannelCoroutine;->iterator()Lkotlinx/coroutines/channels/ChannelIterator; +SPLkotlinx/coroutines/channels/ChannelCoroutine;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/channels/ChannelIterator; +Lkotlinx/coroutines/channels/ChannelKt; +SPLkotlinx/coroutines/channels/ChannelKt;->Channel$default(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/channels/Channel; +SPLkotlinx/coroutines/channels/ChannelKt;->Channel(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/channels/Channel; +Lkotlinx/coroutines/channels/ChannelResult; +SPLkotlinx/coroutines/channels/ChannelResult;->()V +SPLkotlinx/coroutines/channels/ChannelResult;->(Ljava/lang/Object;)V +SPLkotlinx/coroutines/channels/ChannelResult;->access$getFailed$cp()Lkotlinx/coroutines/channels/ChannelResult$Failed; +SPLkotlinx/coroutines/channels/ChannelResult;->box-impl(Ljava/lang/Object;)Lkotlinx/coroutines/channels/ChannelResult; +SPLkotlinx/coroutines/channels/ChannelResult;->constructor-impl(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/ChannelResult;->getOrNull-impl(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/ChannelResult;->unbox-impl()Ljava/lang/Object; +Lkotlinx/coroutines/channels/ChannelResult$Closed; +Lkotlinx/coroutines/channels/ChannelResult$Companion; +SPLkotlinx/coroutines/channels/ChannelResult$Companion;->()V +SPLkotlinx/coroutines/channels/ChannelResult$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlinx/coroutines/channels/ChannelResult$Companion;->failure-PtdJZtk()Ljava/lang/Object; +SPLkotlinx/coroutines/channels/ChannelResult$Companion;->success-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/channels/ChannelResult$Failed; +SPLkotlinx/coroutines/channels/ChannelResult$Failed;->()V +Lkotlinx/coroutines/channels/ChannelSegment; +SPLkotlinx/coroutines/channels/ChannelSegment;->(JLkotlinx/coroutines/channels/ChannelSegment;Lkotlinx/coroutines/channels/BufferedChannel;I)V +SPLkotlinx/coroutines/channels/ChannelSegment;->casState$kotlinx_coroutines_core(ILjava/lang/Object;Ljava/lang/Object;)Z +SPLkotlinx/coroutines/channels/ChannelSegment;->cleanElement$kotlinx_coroutines_core(I)V +SPLkotlinx/coroutines/channels/ChannelSegment;->getChannel()Lkotlinx/coroutines/channels/BufferedChannel; +SPLkotlinx/coroutines/channels/ChannelSegment;->getData()Ljava/util/concurrent/atomic/AtomicReferenceArray; +SPLkotlinx/coroutines/channels/ChannelSegment;->getElement$kotlinx_coroutines_core(I)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/ChannelSegment;->getNumberOfSlots()I +SPLkotlinx/coroutines/channels/ChannelSegment;->getState$kotlinx_coroutines_core(I)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/ChannelSegment;->onCancellation(ILjava/lang/Throwable;Lkotlin/coroutines/CoroutineContext;)V +SPLkotlinx/coroutines/channels/ChannelSegment;->onCancelledRequest(IZ)V +SPLkotlinx/coroutines/channels/ChannelSegment;->retrieveElement$kotlinx_coroutines_core(I)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/ChannelSegment;->setElementLazy(ILjava/lang/Object;)V +SPLkotlinx/coroutines/channels/ChannelSegment;->setState$kotlinx_coroutines_core(ILjava/lang/Object;)V +SPLkotlinx/coroutines/channels/ChannelSegment;->storeElement$kotlinx_coroutines_core(ILjava/lang/Object;)V +Lkotlinx/coroutines/channels/ChannelsKt; +SPLkotlinx/coroutines/channels/ChannelsKt;->cancelConsumed(Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;)V +Lkotlinx/coroutines/channels/ChannelsKt__Channels_commonKt; +SPLkotlinx/coroutines/channels/ChannelsKt__Channels_commonKt;->cancelConsumed(Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;)V +Lkotlinx/coroutines/channels/ConflatedBufferedChannel; +SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;)V +SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->isConflatedDropOldest()Z +SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->send$suspendImpl(Lkotlinx/coroutines/channels/ConflatedBufferedChannel;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->trySendDropOldest-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->trySendImpl-Mj0NB7M(Ljava/lang/Object;Z)Ljava/lang/Object; +Lkotlinx/coroutines/channels/ProduceKt; +SPLkotlinx/coroutines/channels/ProduceKt;->produce$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; +SPLkotlinx/coroutines/channels/ProduceKt;->produce(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; +Lkotlinx/coroutines/channels/ProducerCoroutine; +SPLkotlinx/coroutines/channels/ProducerCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/Channel;)V +SPLkotlinx/coroutines/channels/ProducerCoroutine;->isActive()Z +SPLkotlinx/coroutines/channels/ProducerCoroutine;->onCancelled(Ljava/lang/Throwable;Z)V +Lkotlinx/coroutines/channels/ProducerScope; +Lkotlinx/coroutines/channels/ReceiveCatching; +SPLkotlinx/coroutines/channels/ReceiveCatching;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V +SPLkotlinx/coroutines/channels/ReceiveCatching;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V +Lkotlinx/coroutines/channels/ReceiveChannel; +Lkotlinx/coroutines/channels/SendChannel; +Lkotlinx/coroutines/channels/WaiterEB; +Lkotlinx/coroutines/flow/AbstractFlow; +SPLkotlinx/coroutines/flow/AbstractFlow;->()V +SPLkotlinx/coroutines/flow/AbstractFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/AbstractFlow$collect$1; +SPLkotlinx/coroutines/flow/AbstractFlow$collect$1;->(Lkotlinx/coroutines/flow/AbstractFlow;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/AbstractFlow$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/CallbackFlowBuilder; +SPLkotlinx/coroutines/flow/CallbackFlowBuilder;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V +SPLkotlinx/coroutines/flow/CallbackFlowBuilder;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlinx/coroutines/flow/CallbackFlowBuilder;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/CallbackFlowBuilder$collectTo$1; +SPLkotlinx/coroutines/flow/CallbackFlowBuilder$collectTo$1;->(Lkotlinx/coroutines/flow/CallbackFlowBuilder;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/CallbackFlowBuilder$collectTo$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/CancellableFlow; +Lkotlinx/coroutines/flow/ChannelFlowBuilder; +SPLkotlinx/coroutines/flow/ChannelFlowBuilder;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V +SPLkotlinx/coroutines/flow/ChannelFlowBuilder;->collectTo$suspendImpl(Lkotlinx/coroutines/flow/ChannelFlowBuilder;Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/ChannelFlowBuilder;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/DistinctFlowImpl; +SPLkotlinx/coroutines/flow/DistinctFlowImpl;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V +SPLkotlinx/coroutines/flow/DistinctFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2; +SPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;->(Lkotlinx/coroutines/flow/DistinctFlowImpl;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/flow/FlowCollector;)V +SPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1; +SPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1;->(Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/Flow; +Lkotlinx/coroutines/flow/FlowCollector; +Lkotlinx/coroutines/flow/FlowKt; +SPLkotlinx/coroutines/flow/FlowKt;->asStateFlow(Lkotlinx/coroutines/flow/MutableStateFlow;)Lkotlinx/coroutines/flow/StateFlow; +SPLkotlinx/coroutines/flow/FlowKt;->buffer$default(Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->buffer(Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->callbackFlow(Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->catchImpl(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt;->collect(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt;->collectLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt;->combine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->combine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function5;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->conflate(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->distinctUntilChanged(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->emitAll(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt;->ensureActive(Lkotlinx/coroutines/flow/FlowCollector;)V +SPLkotlinx/coroutines/flow/FlowKt;->filterNotNull(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->flow(Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->flowCombine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->flowOn(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->launchIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/Job; +SPLkotlinx/coroutines/flow/FlowKt;->mapLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->onEach(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->onStart(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->retryWhen(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function4;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->stateIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/flow/StateFlow; +SPLkotlinx/coroutines/flow/FlowKt;->transformLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; +Lkotlinx/coroutines/flow/FlowKt__BuildersKt; +SPLkotlinx/coroutines/flow/FlowKt__BuildersKt;->callbackFlow(Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt__BuildersKt;->flow(Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; +Lkotlinx/coroutines/flow/FlowKt__ChannelsKt; +SPLkotlinx/coroutines/flow/FlowKt__ChannelsKt;->access$emitAllImpl$FlowKt__ChannelsKt(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__ChannelsKt;->emitAll(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__ChannelsKt;->emitAllImpl$FlowKt__ChannelsKt(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1; +SPLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;->(Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__CollectKt; +SPLkotlinx/coroutines/flow/FlowKt__CollectKt;->collect(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__CollectKt;->collectLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__CollectKt;->launchIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/Job; +Lkotlinx/coroutines/flow/FlowKt__CollectKt$launchIn$1; +SPLkotlinx/coroutines/flow/FlowKt__CollectKt$launchIn$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/FlowKt__CollectKt$launchIn$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/FlowKt__CollectKt$launchIn$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__ContextKt; +SPLkotlinx/coroutines/flow/FlowKt__ContextKt;->buffer$default(Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt__ContextKt;->buffer(Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt__ContextKt;->checkFlowContext$FlowKt__ContextKt(Lkotlin/coroutines/CoroutineContext;)V +SPLkotlinx/coroutines/flow/FlowKt__ContextKt;->conflate(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt__ContextKt;->flowOn(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/flow/Flow; +Lkotlinx/coroutines/flow/FlowKt__DistinctKt; +SPLkotlinx/coroutines/flow/FlowKt__DistinctKt;->$r8$lambda$mgidQTCZEwPL4AoZywC2sds_69k(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__DistinctKt;->()V +SPLkotlinx/coroutines/flow/FlowKt__DistinctKt;->defaultKeySelector$lambda$0$FlowKt__DistinctKt(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__DistinctKt;->distinctUntilChanged(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt__DistinctKt;->distinctUntilChangedBy$FlowKt__DistinctKt(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; +Lkotlinx/coroutines/flow/FlowKt__DistinctKt$$ExternalSyntheticLambda0; +SPLkotlinx/coroutines/flow/FlowKt__DistinctKt$$ExternalSyntheticLambda0;->()V +SPLkotlinx/coroutines/flow/FlowKt__DistinctKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__DistinctKt$$ExternalSyntheticLambda1; +SPLkotlinx/coroutines/flow/FlowKt__DistinctKt$$ExternalSyntheticLambda1;->()V +Lkotlinx/coroutines/flow/FlowKt__EmittersKt; +SPLkotlinx/coroutines/flow/FlowKt__EmittersKt;->ensureActive(Lkotlinx/coroutines/flow/FlowCollector;)V +SPLkotlinx/coroutines/flow/FlowKt__EmittersKt;->onStart(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; +Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1; +SPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;->(Lkotlin/jvm/functions/Function2;Lkotlinx/coroutines/flow/Flow;)V +SPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1$1; +SPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__ErrorsKt; +SPLkotlinx/coroutines/flow/FlowKt__ErrorsKt;->catchImpl(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__ErrorsKt;->retryWhen(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function4;)Lkotlinx/coroutines/flow/Flow; +Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$1; +SPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$1;->(Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2; +SPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/internal/Ref$ObjectRef;)V +SPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2$emit$1; +SPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2$emit$1;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$retryWhen$$inlined$unsafeFlow$1; +SPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$retryWhen$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function4;)V +SPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$retryWhen$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$retryWhen$$inlined$unsafeFlow$1$1; +SPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$retryWhen$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$retryWhen$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/FlowKt__MergeKt; +SPLkotlinx/coroutines/flow/FlowKt__MergeKt;->()V +SPLkotlinx/coroutines/flow/FlowKt__MergeKt;->mapLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt__MergeKt;->transformLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; +Lkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1; +SPLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->invoke(Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__ShareKt; +SPLkotlinx/coroutines/flow/FlowKt__ShareKt;->asStateFlow(Lkotlinx/coroutines/flow/MutableStateFlow;)Lkotlinx/coroutines/flow/StateFlow; +SPLkotlinx/coroutines/flow/FlowKt__ShareKt;->configureSharing$FlowKt__ShareKt(Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/SharingConfig; +SPLkotlinx/coroutines/flow/FlowKt__ShareKt;->launchSharing$FlowKt__ShareKt(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/Job; +SPLkotlinx/coroutines/flow/FlowKt__ShareKt;->stateIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/flow/StateFlow; +Lkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1; +SPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->(Lkotlinx/coroutines/flow/SharingStarted;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__TransformKt; +SPLkotlinx/coroutines/flow/FlowKt__TransformKt;->filterNotNull(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt__TransformKt;->onEach(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; +Lkotlinx/coroutines/flow/FlowKt__TransformKt$filterNotNull$$inlined$unsafeTransform$1; +SPLkotlinx/coroutines/flow/FlowKt__TransformKt$filterNotNull$$inlined$unsafeTransform$1;->(Lkotlinx/coroutines/flow/Flow;)V +SPLkotlinx/coroutines/flow/FlowKt__TransformKt$filterNotNull$$inlined$unsafeTransform$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__TransformKt$filterNotNull$$inlined$unsafeTransform$1$2; +SPLkotlinx/coroutines/flow/FlowKt__TransformKt$filterNotNull$$inlined$unsafeTransform$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V +SPLkotlinx/coroutines/flow/FlowKt__TransformKt$filterNotNull$$inlined$unsafeTransform$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__TransformKt$filterNotNull$$inlined$unsafeTransform$1$2$1; +SPLkotlinx/coroutines/flow/FlowKt__TransformKt$filterNotNull$$inlined$unsafeTransform$1$2$1;->(Lkotlinx/coroutines/flow/FlowKt__TransformKt$filterNotNull$$inlined$unsafeTransform$1$2;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1; +SPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)V +SPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2; +SPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/functions/Function2;)V +SPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2$1; +SPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2$1;->(Lkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/FlowKt__ZipKt; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt;->access$nullArrayFactory()Lkotlin/jvm/functions/Function0; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt;->combine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt;->combine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function5;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt;->flowCombine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt;->nullArrayFactory$FlowKt__ZipKt()Lkotlin/jvm/functions/Function0; +Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$2; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$2;->([Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function5;)V +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$2;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$2$2; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$2$2;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function5;)V +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$2$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$2$2;->invoke(Lkotlinx/coroutines/flow/FlowCollector;[Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$2$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)V +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->(Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->invoke(Lkotlinx/coroutines/flow/FlowCollector;[Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->()V +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->()V +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->invoke()Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->invoke()Ljava/lang/Void; +Lkotlinx/coroutines/flow/MutableSharedFlow; +Lkotlinx/coroutines/flow/MutableStateFlow; +Lkotlinx/coroutines/flow/ReadonlyStateFlow; +SPLkotlinx/coroutines/flow/ReadonlyStateFlow;->(Lkotlinx/coroutines/flow/StateFlow;Lkotlinx/coroutines/Job;)V +SPLkotlinx/coroutines/flow/ReadonlyStateFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/ReadonlyStateFlow;->getValue()Ljava/lang/Object; +Lkotlinx/coroutines/flow/SafeFlow; +SPLkotlinx/coroutines/flow/SafeFlow;->(Lkotlin/jvm/functions/Function2;)V +SPLkotlinx/coroutines/flow/SafeFlow;->collectSafely(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/SharedFlow; +Lkotlinx/coroutines/flow/SharedFlowImpl; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->(IILkotlinx/coroutines/channels/BufferOverflow;)V +SPLkotlinx/coroutines/flow/SharedFlowImpl;->access$tryPeekLocked(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlinx/coroutines/flow/SharedFlowSlot;)J +SPLkotlinx/coroutines/flow/SharedFlowImpl;->awaitValue(Lkotlinx/coroutines/flow/SharedFlowSlot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->cleanupTailLocked()V +SPLkotlinx/coroutines/flow/SharedFlowImpl;->collect$suspendImpl(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlot()Lkotlinx/coroutines/flow/SharedFlowSlot; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/SharedFlowSlot; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->emit$suspendImpl(Lkotlinx/coroutines/flow/SharedFlowImpl;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->enqueueLocked(Ljava/lang/Object;)V +SPLkotlinx/coroutines/flow/SharedFlowImpl;->findSlotsToResumeLocked([Lkotlin/coroutines/Continuation;)[Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->getBufferEndIndex()J +SPLkotlinx/coroutines/flow/SharedFlowImpl;->getHead()J +SPLkotlinx/coroutines/flow/SharedFlowImpl;->getPeekedValueLockedAt(J)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->getQueueEndIndex()J +SPLkotlinx/coroutines/flow/SharedFlowImpl;->getReplaySize()I +SPLkotlinx/coroutines/flow/SharedFlowImpl;->getTotalSize()I +SPLkotlinx/coroutines/flow/SharedFlowImpl;->growBuffer([Ljava/lang/Object;II)[Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmit(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmitLocked(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/flow/SharedFlowImpl;->tryPeekLocked(Lkotlinx/coroutines/flow/SharedFlowSlot;)J +SPLkotlinx/coroutines/flow/SharedFlowImpl;->tryTakeValue(Lkotlinx/coroutines/flow/SharedFlowSlot;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->updateBufferLocked(JJJJ)V +SPLkotlinx/coroutines/flow/SharedFlowImpl;->updateCollectorIndexLocked$kotlinx_coroutines_core(J)[Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->updateNewCollectorIndexLocked$kotlinx_coroutines_core()J +Lkotlinx/coroutines/flow/SharedFlowImpl$Emitter; +Lkotlinx/coroutines/flow/SharedFlowImpl$collect$1; +SPLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;->(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/SharedFlowKt; +SPLkotlinx/coroutines/flow/SharedFlowKt;->()V +SPLkotlinx/coroutines/flow/SharedFlowKt;->MutableSharedFlow$default(IILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLkotlinx/coroutines/flow/SharedFlowKt;->MutableSharedFlow(IILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/MutableSharedFlow; +SPLkotlinx/coroutines/flow/SharedFlowKt;->access$getBufferAt([Ljava/lang/Object;J)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowKt;->access$setBufferAt([Ljava/lang/Object;JLjava/lang/Object;)V +SPLkotlinx/coroutines/flow/SharedFlowKt;->getBufferAt([Ljava/lang/Object;J)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowKt;->setBufferAt([Ljava/lang/Object;JLjava/lang/Object;)V +Lkotlinx/coroutines/flow/SharedFlowSlot; +SPLkotlinx/coroutines/flow/SharedFlowSlot;->()V +SPLkotlinx/coroutines/flow/SharedFlowSlot;->allocateLocked(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/flow/SharedFlowSlot;->allocateLocked(Lkotlinx/coroutines/flow/SharedFlowImpl;)Z +Lkotlinx/coroutines/flow/SharingConfig; +SPLkotlinx/coroutines/flow/SharingConfig;->(Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/coroutines/CoroutineContext;)V +Lkotlinx/coroutines/flow/SharingStarted; +SPLkotlinx/coroutines/flow/SharingStarted;->()V +Lkotlinx/coroutines/flow/SharingStarted$Companion; +SPLkotlinx/coroutines/flow/SharingStarted$Companion;->()V +SPLkotlinx/coroutines/flow/SharingStarted$Companion;->()V +SPLkotlinx/coroutines/flow/SharingStarted$Companion;->getEagerly()Lkotlinx/coroutines/flow/SharingStarted; +Lkotlinx/coroutines/flow/StartedEagerly; +SPLkotlinx/coroutines/flow/StartedEagerly;->()V +Lkotlinx/coroutines/flow/StartedLazily; +SPLkotlinx/coroutines/flow/StartedLazily;->()V +Lkotlinx/coroutines/flow/StateFlow; +Lkotlinx/coroutines/flow/StateFlowImpl; +SPLkotlinx/coroutines/flow/StateFlowImpl;->()V +SPLkotlinx/coroutines/flow/StateFlowImpl;->(Ljava/lang/Object;)V +SPLkotlinx/coroutines/flow/StateFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/StateFlowImpl;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z +SPLkotlinx/coroutines/flow/StateFlowImpl;->createSlot()Lkotlinx/coroutines/flow/StateFlowSlot; +SPLkotlinx/coroutines/flow/StateFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +SPLkotlinx/coroutines/flow/StateFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/StateFlowSlot; +SPLkotlinx/coroutines/flow/StateFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +SPLkotlinx/coroutines/flow/StateFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/StateFlowImpl;->getValue()Ljava/lang/Object; +SPLkotlinx/coroutines/flow/StateFlowImpl;->get_state$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/flow/StateFlowImpl;->setValue(Ljava/lang/Object;)V +SPLkotlinx/coroutines/flow/StateFlowImpl;->updateState(Ljava/lang/Object;Ljava/lang/Object;)Z +Lkotlinx/coroutines/flow/StateFlowImpl$collect$1; +SPLkotlinx/coroutines/flow/StateFlowImpl$collect$1;->(Lkotlinx/coroutines/flow/StateFlowImpl;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/StateFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/StateFlowKt; +SPLkotlinx/coroutines/flow/StateFlowKt;->()V +SPLkotlinx/coroutines/flow/StateFlowKt;->MutableStateFlow(Ljava/lang/Object;)Lkotlinx/coroutines/flow/MutableStateFlow; +SPLkotlinx/coroutines/flow/StateFlowKt;->access$getNONE$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/flow/StateFlowKt;->access$getPENDING$p()Lkotlinx/coroutines/internal/Symbol; +Lkotlinx/coroutines/flow/StateFlowSlot; +SPLkotlinx/coroutines/flow/StateFlowSlot;->()V +SPLkotlinx/coroutines/flow/StateFlowSlot;->access$get_state$p(Lkotlinx/coroutines/flow/StateFlowSlot;)Ljava/util/concurrent/atomic/AtomicReference; +SPLkotlinx/coroutines/flow/StateFlowSlot;->allocateLocked(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/flow/StateFlowSlot;->allocateLocked(Lkotlinx/coroutines/flow/StateFlowImpl;)Z +SPLkotlinx/coroutines/flow/StateFlowSlot;->awaitPending(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/StateFlowSlot;->freeLocked(Ljava/lang/Object;)[Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/StateFlowSlot;->freeLocked(Lkotlinx/coroutines/flow/StateFlowImpl;)[Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/StateFlowSlot;->makePending()V +SPLkotlinx/coroutines/flow/StateFlowSlot;->takePending()Z +Lkotlinx/coroutines/flow/SubscribedFlowCollector; +Lkotlinx/coroutines/flow/ThrowingCollector; +Lkotlinx/coroutines/flow/internal/AbstractSharedFlow; +SPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->()V +SPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->access$getNCollectors(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)I +SPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->access$getSlots(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +SPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->allocateSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +SPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->freeSlot(Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;)V +SPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->getNCollectors()I +SPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->getSlots()[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +Lkotlinx/coroutines/flow/internal/AbstractSharedFlowKt; +SPLkotlinx/coroutines/flow/internal/AbstractSharedFlowKt;->()V +Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +SPLkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;->()V +Lkotlinx/coroutines/flow/internal/ChannelFlow; +SPLkotlinx/coroutines/flow/internal/ChannelFlow;->(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlow;->collect$suspendImpl(Lkotlinx/coroutines/flow/internal/ChannelFlow;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlow;->fuse(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/internal/ChannelFlow;->getCollectToFun$kotlinx_coroutines_core()Lkotlin/jvm/functions/Function2; +SPLkotlinx/coroutines/flow/internal/ChannelFlow;->getProduceCapacity$kotlinx_coroutines_core()I +SPLkotlinx/coroutines/flow/internal/ChannelFlow;->produceImpl(Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/channels/ReceiveChannel; +Lkotlinx/coroutines/flow/internal/ChannelFlow$collect$2; +SPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/flow/internal/ChannelFlow;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1; +SPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->(Lkotlinx/coroutines/flow/internal/ChannelFlow;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/ChannelFlowOperator; +SPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collect$suspendImpl(Lkotlinx/coroutines/flow/internal/ChannelFlowOperator;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collectTo$suspendImpl(Lkotlinx/coroutines/flow/internal/ChannelFlowOperator;Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl; +SPLkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl;->flowCollect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->access$getTransform$p(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;)Lkotlin/jvm/functions/Function3; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->create(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/internal/ChannelFlow; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->flowCollect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/internal/CombineKt; +SPLkotlinx/coroutines/flow/internal/CombineKt;->combineInternal(Lkotlinx/coroutines/flow/FlowCollector;[Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2; +SPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->([Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1; +SPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->([Lkotlinx/coroutines/flow/Flow;ILjava/util/concurrent/atomic/AtomicInteger;Lkotlinx/coroutines/channels/Channel;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1; +SPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;->(Lkotlinx/coroutines/channels/Channel;I)V +SPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1; +SPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1;->(Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/DownstreamExceptionContext; +Lkotlinx/coroutines/flow/internal/FlowCoroutine; +SPLkotlinx/coroutines/flow/internal/FlowCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/internal/FlowCoroutineKt; +SPLkotlinx/coroutines/flow/internal/FlowCoroutineKt;->flowScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/FusibleFlow; +SPLkotlinx/coroutines/flow/internal/FusibleFlow;->fuse$default(Lkotlinx/coroutines/flow/internal/FusibleFlow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; +Lkotlinx/coroutines/flow/internal/NoOpContinuation; +SPLkotlinx/coroutines/flow/internal/NoOpContinuation;->()V +SPLkotlinx/coroutines/flow/internal/NoOpContinuation;->()V +Lkotlinx/coroutines/flow/internal/NopCollector; +SPLkotlinx/coroutines/flow/internal/NopCollector;->()V +SPLkotlinx/coroutines/flow/internal/NopCollector;->()V +SPLkotlinx/coroutines/flow/internal/NopCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/NullSurrogateKt; +SPLkotlinx/coroutines/flow/internal/NullSurrogateKt;->()V +Lkotlinx/coroutines/flow/internal/SafeCollector; +SPLkotlinx/coroutines/flow/internal/SafeCollector;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/CoroutineContext;)V +SPLkotlinx/coroutines/flow/internal/SafeCollector;->checkContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V +SPLkotlinx/coroutines/flow/internal/SafeCollector;->collectContextSize$lambda$0(ILkotlin/coroutines/CoroutineContext$Element;)I +SPLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Lkotlin/coroutines/Continuation;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/SafeCollector;->getContext()Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/flow/internal/SafeCollector;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/SafeCollector;->releaseIntercepted()V +Lkotlinx/coroutines/flow/internal/SafeCollector$$ExternalSyntheticLambda0; +SPLkotlinx/coroutines/flow/internal/SafeCollector$$ExternalSyntheticLambda0;->()V +SPLkotlinx/coroutines/flow/internal/SafeCollector$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/SafeCollectorKt; +SPLkotlinx/coroutines/flow/internal/SafeCollectorKt;->()V +SPLkotlinx/coroutines/flow/internal/SafeCollectorKt;->access$getEmitFun$p()Lkotlin/jvm/functions/Function3; +Lkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1; +SPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->()V +SPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->()V +SPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->invoke(Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/SafeCollector_commonKt; +SPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt;->checkContext$lambda$0(Lkotlinx/coroutines/flow/internal/SafeCollector;ILkotlin/coroutines/CoroutineContext$Element;)I +SPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt;->checkContext(Lkotlinx/coroutines/flow/internal/SafeCollector;Lkotlin/coroutines/CoroutineContext;)V +SPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt;->transitiveCoroutineParent(Lkotlinx/coroutines/Job;Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/Job; +Lkotlinx/coroutines/flow/internal/SafeCollector_commonKt$$ExternalSyntheticLambda0; +SPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt$$ExternalSyntheticLambda0;->(Lkotlinx/coroutines/flow/internal/SafeCollector;)V +SPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/SendingCollector; +SPLkotlinx/coroutines/flow/internal/SendingCollector;->(Lkotlinx/coroutines/channels/SendChannel;)V +SPLkotlinx/coroutines/flow/internal/SendingCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/internal/ConcurrentKt; +SPLkotlinx/coroutines/internal/ConcurrentKt;->()V +SPLkotlinx/coroutines/internal/ConcurrentKt;->removeFutureOnCancel(Ljava/util/concurrent/Executor;)Z +Lkotlinx/coroutines/internal/ConcurrentLinkedListKt; +SPLkotlinx/coroutines/internal/ConcurrentLinkedListKt;->()V +SPLkotlinx/coroutines/internal/ConcurrentLinkedListKt;->access$getCLOSED$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/internal/ConcurrentLinkedListKt;->close(Lkotlinx/coroutines/internal/ConcurrentLinkedListNode;)Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; +Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->()V +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->(Lkotlinx/coroutines/internal/ConcurrentLinkedListNode;)V +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->access$getNextOrClosed(Lkotlinx/coroutines/internal/ConcurrentLinkedListNode;)Ljava/lang/Object; +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->cleanPrev()V +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->getNext()Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->getNextOrClosed()Ljava/lang/Object; +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->get_next$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->get_prev$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->markAsClosed()Z +Lkotlinx/coroutines/internal/Concurrent_commonKt; +SPLkotlinx/coroutines/internal/Concurrent_commonKt;->getValue(Ljava/util/concurrent/atomic/AtomicReference;)Ljava/lang/Object; +SPLkotlinx/coroutines/internal/Concurrent_commonKt;->setValue(Ljava/util/concurrent/atomic/AtomicReference;Ljava/lang/Object;)V +Lkotlinx/coroutines/internal/ContextScope; +SPLkotlinx/coroutines/internal/ContextScope;->(Lkotlin/coroutines/CoroutineContext;)V +SPLkotlinx/coroutines/internal/ContextScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; +Lkotlinx/coroutines/internal/DispatchedContinuation; +SPLkotlinx/coroutines/internal/DispatchedContinuation;->()V +SPLkotlinx/coroutines/internal/DispatchedContinuation;->(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/internal/DispatchedContinuation;->awaitReusability$kotlinx_coroutines_core()V +SPLkotlinx/coroutines/internal/DispatchedContinuation;->claimReusableCancellableContinuation$kotlinx_coroutines_core()Lkotlinx/coroutines/CancellableContinuationImpl; +SPLkotlinx/coroutines/internal/DispatchedContinuation;->dispatchYield$kotlinx_coroutines_core(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V +SPLkotlinx/coroutines/internal/DispatchedContinuation;->getContext()Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/internal/DispatchedContinuation;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/internal/DispatchedContinuation;->getReusableCancellableContinuation()Lkotlinx/coroutines/CancellableContinuationImpl; +SPLkotlinx/coroutines/internal/DispatchedContinuation;->get_reusableCancellableContinuation$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/internal/DispatchedContinuation;->isReusable$kotlinx_coroutines_core()Z +SPLkotlinx/coroutines/internal/DispatchedContinuation;->postponeCancellation$kotlinx_coroutines_core(Ljava/lang/Throwable;)Z +SPLkotlinx/coroutines/internal/DispatchedContinuation;->release$kotlinx_coroutines_core()V +SPLkotlinx/coroutines/internal/DispatchedContinuation;->resumeWith(Ljava/lang/Object;)V +SPLkotlinx/coroutines/internal/DispatchedContinuation;->takeState$kotlinx_coroutines_core()Ljava/lang/Object; +SPLkotlinx/coroutines/internal/DispatchedContinuation;->tryReleaseClaimedContinuation$kotlinx_coroutines_core(Lkotlinx/coroutines/CancellableContinuation;)Ljava/lang/Throwable; +Lkotlinx/coroutines/internal/DispatchedContinuationKt; +SPLkotlinx/coroutines/internal/DispatchedContinuationKt;->()V +SPLkotlinx/coroutines/internal/DispatchedContinuationKt;->access$getUNDEFINED$p()Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/internal/DispatchedContinuationKt;->resumeCancellableWithInternal(Lkotlin/coroutines/Continuation;Ljava/lang/Object;)V +SPLkotlinx/coroutines/internal/DispatchedContinuationKt;->safeDispatch(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/internal/DispatchedContinuationKt;->safeIsDispatchNeeded(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/coroutines/CoroutineContext;)Z +Lkotlinx/coroutines/internal/FastServiceLoader; +SPLkotlinx/coroutines/internal/FastServiceLoader;->()V +SPLkotlinx/coroutines/internal/FastServiceLoader;->()V +SPLkotlinx/coroutines/internal/FastServiceLoader;->loadMainDispatcherFactory$kotlinx_coroutines_core()Ljava/util/List; +Lkotlinx/coroutines/internal/FastServiceLoaderKt; +SPLkotlinx/coroutines/internal/FastServiceLoaderKt;->()V +SPLkotlinx/coroutines/internal/FastServiceLoaderKt;->getANDROID_DETECTED()Z +Lkotlinx/coroutines/internal/InlineList; +SPLkotlinx/coroutines/internal/InlineList;->constructor-impl$default(Ljava/lang/Object;ILkotlin/jvm/internal/DefaultConstructorMarker;)Ljava/lang/Object; +SPLkotlinx/coroutines/internal/InlineList;->constructor-impl(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/internal/InlineList;->plus-FjFbRPM(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/internal/LimitedDispatcher; +SPLkotlinx/coroutines/internal/LimitedDispatcher;->()V +SPLkotlinx/coroutines/internal/LimitedDispatcher;->(Lkotlinx/coroutines/CoroutineDispatcher;ILjava/lang/String;)V +SPLkotlinx/coroutines/internal/LimitedDispatcher;->access$obtainTaskOrDeallocateWorker(Lkotlinx/coroutines/internal/LimitedDispatcher;)Ljava/lang/Runnable; +SPLkotlinx/coroutines/internal/LimitedDispatcher;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/internal/LimitedDispatcher;->getRunningWorkers$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/internal/LimitedDispatcher;->obtainTaskOrDeallocateWorker()Ljava/lang/Runnable; +SPLkotlinx/coroutines/internal/LimitedDispatcher;->tryAllocateWorker()Z +Lkotlinx/coroutines/internal/LimitedDispatcher$Worker; +SPLkotlinx/coroutines/internal/LimitedDispatcher$Worker;->(Lkotlinx/coroutines/internal/LimitedDispatcher;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/internal/LimitedDispatcher$Worker;->run()V +Lkotlinx/coroutines/internal/LimitedDispatcherKt; +SPLkotlinx/coroutines/internal/LimitedDispatcherKt;->checkParallelism(I)V +Lkotlinx/coroutines/internal/ListClosed; +SPLkotlinx/coroutines/internal/ListClosed;->(I)V +Lkotlinx/coroutines/internal/LockFreeLinkedListHead; +SPLkotlinx/coroutines/internal/LockFreeLinkedListHead;->()V +SPLkotlinx/coroutines/internal/LockFreeLinkedListHead;->isRemoved()Z +Lkotlinx/coroutines/internal/LockFreeLinkedListNode; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->()V +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->()V +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->addLast(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;I)Z +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->addNext(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Z +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->addOneIfEmpty(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Z +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->close(I)V +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->correctPrev()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->findPrevNonRemoved(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Lkotlinx/coroutines/internal/LockFreeLinkedListNode; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->finishAdd(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getNext()Ljava/lang/Object; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getNextNode()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getPrevNode()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->get_next$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->get_prev$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->get_removedRef$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->isRemoved()Z +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->remove()Z +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->removeOrNext()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->removed()Lkotlinx/coroutines/internal/Removed; +Lkotlinx/coroutines/internal/LockFreeTaskQueue; +SPLkotlinx/coroutines/internal/LockFreeTaskQueue;->()V +SPLkotlinx/coroutines/internal/LockFreeTaskQueue;->(Z)V +SPLkotlinx/coroutines/internal/LockFreeTaskQueue;->addLast(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/internal/LockFreeTaskQueue;->getSize()I +SPLkotlinx/coroutines/internal/LockFreeTaskQueue;->get_cur$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/internal/LockFreeTaskQueue;->removeFirstOrNull()Ljava/lang/Object; +Lkotlinx/coroutines/internal/LockFreeTaskQueueCore; +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->()V +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->(IZ)V +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->addLast(Ljava/lang/Object;)I +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->getArray()Ljava/util/concurrent/atomic/AtomicReferenceArray; +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->getSize()I +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->get_state$volatile$FU()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->removeFirstOrNull()Ljava/lang/Object; +Lkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion; +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion;->()V +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion;->updateHead(JI)J +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion;->updateTail(JI)J +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion;->wo(JJ)J +Lkotlinx/coroutines/internal/LockFreeTaskQueueCore$Placeholder; +Lkotlinx/coroutines/internal/MainDispatcherFactory; +Lkotlinx/coroutines/internal/MainDispatcherLoader; +SPLkotlinx/coroutines/internal/MainDispatcherLoader;->()V +SPLkotlinx/coroutines/internal/MainDispatcherLoader;->()V +SPLkotlinx/coroutines/internal/MainDispatcherLoader;->loadMainDispatcher()Lkotlinx/coroutines/MainCoroutineDispatcher; +Lkotlinx/coroutines/internal/MainDispatchersKt; +SPLkotlinx/coroutines/internal/MainDispatchersKt;->()V +SPLkotlinx/coroutines/internal/MainDispatchersKt;->tryCreateDispatcher(Lkotlinx/coroutines/internal/MainDispatcherFactory;Ljava/util/List;)Lkotlinx/coroutines/MainCoroutineDispatcher; +Lkotlinx/coroutines/internal/Removed; +SPLkotlinx/coroutines/internal/Removed;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V +Lkotlinx/coroutines/internal/ResizableAtomicArray; +SPLkotlinx/coroutines/internal/ResizableAtomicArray;->(I)V +SPLkotlinx/coroutines/internal/ResizableAtomicArray;->get(I)Ljava/lang/Object; +SPLkotlinx/coroutines/internal/ResizableAtomicArray;->setSynchronized(ILjava/lang/Object;)V +Lkotlinx/coroutines/internal/ScopeCoroutine; +SPLkotlinx/coroutines/internal/ScopeCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/internal/ScopeCoroutine;->afterCompletion(Ljava/lang/Object;)V +SPLkotlinx/coroutines/internal/ScopeCoroutine;->afterResume(Ljava/lang/Object;)V +SPLkotlinx/coroutines/internal/ScopeCoroutine;->isScopedCoroutine()Z +Lkotlinx/coroutines/internal/Segment; +SPLkotlinx/coroutines/internal/Segment;->()V +SPLkotlinx/coroutines/internal/Segment;->(JLkotlinx/coroutines/internal/Segment;I)V +SPLkotlinx/coroutines/internal/Segment;->getCleanedAndPointers$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/internal/Segment;->onSlotCleaned()V +Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/internal/Symbol;->(Ljava/lang/String;)V +Lkotlinx/coroutines/internal/SystemPropsKt; +SPLkotlinx/coroutines/internal/SystemPropsKt;->getAVAILABLE_PROCESSORS()I +SPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp$default(Ljava/lang/String;IIIILjava/lang/Object;)I +SPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp$default(Ljava/lang/String;JJJILjava/lang/Object;)J +SPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;)Ljava/lang/String; +SPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;III)I +SPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;JJJ)J +SPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +SPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;Z)Z +Lkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt; +SPLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;->()V +SPLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;->getAVAILABLE_PROCESSORS()I +SPLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;->systemProp(Ljava/lang/String;)Ljava/lang/String; +Lkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt; +SPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp$default(Ljava/lang/String;IIIILjava/lang/Object;)I +SPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp$default(Ljava/lang/String;JJJILjava/lang/Object;)J +SPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;III)I +SPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;JJJ)J +SPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +SPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;Z)Z +Lkotlinx/coroutines/internal/ThreadContextKt; +SPLkotlinx/coroutines/internal/ThreadContextKt;->()V +SPLkotlinx/coroutines/internal/ThreadContextKt;->countAll$lambda$0(Ljava/lang/Object;Lkotlin/coroutines/CoroutineContext$Element;)Ljava/lang/Object; +SPLkotlinx/coroutines/internal/ThreadContextKt;->restoreThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V +SPLkotlinx/coroutines/internal/ThreadContextKt;->threadContextElements(Lkotlin/coroutines/CoroutineContext;)Ljava/lang/Object; +SPLkotlinx/coroutines/internal/ThreadContextKt;->updateThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/internal/ThreadContextKt$$ExternalSyntheticLambda0; +SPLkotlinx/coroutines/internal/ThreadContextKt$$ExternalSyntheticLambda0;->()V +SPLkotlinx/coroutines/internal/ThreadContextKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/internal/ThreadContextKt$$ExternalSyntheticLambda1; +SPLkotlinx/coroutines/internal/ThreadContextKt$$ExternalSyntheticLambda1;->()V +Lkotlinx/coroutines/internal/ThreadContextKt$$ExternalSyntheticLambda2; +SPLkotlinx/coroutines/internal/ThreadContextKt$$ExternalSyntheticLambda2;->()V +Lkotlinx/coroutines/internal/ThreadLocalKt; +SPLkotlinx/coroutines/internal/ThreadLocalKt;->commonThreadLocal(Lkotlinx/coroutines/internal/Symbol;)Ljava/lang/ThreadLocal; +Lkotlinx/coroutines/internal/ThreadSafeHeap; +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->()V +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->()V +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->addImpl(Lkotlinx/coroutines/internal/ThreadSafeHeapNode;)V +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->firstImpl()Lkotlinx/coroutines/internal/ThreadSafeHeapNode; +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->getSize()I +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->get_size$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->isEmpty()Z +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->peek()Lkotlinx/coroutines/internal/ThreadSafeHeapNode; +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->realloc()[Lkotlinx/coroutines/internal/ThreadSafeHeapNode; +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->removeAtImpl(I)Lkotlinx/coroutines/internal/ThreadSafeHeapNode; +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->setSize(I)V +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->siftUpFrom(I)V +Lkotlinx/coroutines/internal/ThreadSafeHeapNode; +Lkotlinx/coroutines/intrinsics/CancellableKt; +SPLkotlinx/coroutines/intrinsics/CancellableKt;->startCoroutineCancellable(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/intrinsics/UndispatchedKt; +SPLkotlinx/coroutines/intrinsics/UndispatchedKt;->startCoroutineUndispatched(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/intrinsics/UndispatchedKt;->startUndispatched(Lkotlinx/coroutines/internal/ScopeCoroutine;ZLjava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlinx/coroutines/intrinsics/UndispatchedKt;->startUndispatchedOrReturn(Lkotlinx/coroutines/internal/ScopeCoroutine;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +Lkotlinx/coroutines/scheduling/CoroutineScheduler; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->()V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->(IIJLjava/lang/String;)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->access$getControlState$volatile$FU()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->addToGlobalQueue(Lkotlinx/coroutines/scheduling/Task;)Z +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->createNewWorker()I +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->createTask(Ljava/lang/Runnable;Z)Lkotlinx/coroutines/scheduling/Task; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->currentWorker()Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->dispatch$default(Lkotlinx/coroutines/scheduling/CoroutineScheduler;Ljava/lang/Runnable;ZZILjava/lang/Object;)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->dispatch(Ljava/lang/Runnable;ZZ)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->execute(Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->getControlState$volatile$FU()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->getParkedWorkersStack$volatile$FU()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->get_isTerminated$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->isTerminated()Z +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackNextIndex(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;)I +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackPop()Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackPush(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;)Z +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->runSafely(Lkotlinx/coroutines/scheduling/Task;)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->signalBlockingWork(J)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->signalCpuWork()V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->submitToLocalQueue(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;Lkotlinx/coroutines/scheduling/Task;Z)Lkotlinx/coroutines/scheduling/Task; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryCreateWorker$default(Lkotlinx/coroutines/scheduling/CoroutineScheduler;JILjava/lang/Object;)Z +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryCreateWorker(J)Z +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryUnpark()Z +Lkotlinx/coroutines/scheduling/CoroutineScheduler$Companion; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Companion;->()V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->()V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->(Lkotlinx/coroutines/scheduling/CoroutineScheduler;)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->(Lkotlinx/coroutines/scheduling/CoroutineScheduler;I)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->access$getThis$0$p(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;)Lkotlinx/coroutines/scheduling/CoroutineScheduler; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->executeTask(Lkotlinx/coroutines/scheduling/Task;)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->findAnyTask(Z)Lkotlinx/coroutines/scheduling/Task; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->findTask(Z)Lkotlinx/coroutines/scheduling/Task; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getIndexInArray()I +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getNextParkedWorker()Ljava/lang/Object; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getWorkerCtl$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->inStack()Z +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->nextInt(I)I +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->park()V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->pollGlobalQueues()Lkotlinx/coroutines/scheduling/Task; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->run()V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->runWorker()V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->setIndexInArray(I)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->setNextParkedWorker(Ljava/lang/Object;)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->tryAcquireCpuPermit()Z +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->tryPark()V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->tryReleaseCpu(Lkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState;)Z +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->trySteal(I)Lkotlinx/coroutines/scheduling/Task; +Lkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState;->$values()[Lkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState;->()V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState;->(Ljava/lang/String;I)V +Lkotlinx/coroutines/scheduling/DefaultIoScheduler; +SPLkotlinx/coroutines/scheduling/DefaultIoScheduler;->()V +SPLkotlinx/coroutines/scheduling/DefaultIoScheduler;->()V +SPLkotlinx/coroutines/scheduling/DefaultIoScheduler;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/scheduling/DefaultIoScheduler;->limitedParallelism(ILjava/lang/String;)Lkotlinx/coroutines/CoroutineDispatcher; +Lkotlinx/coroutines/scheduling/DefaultScheduler; +SPLkotlinx/coroutines/scheduling/DefaultScheduler;->()V +SPLkotlinx/coroutines/scheduling/DefaultScheduler;->()V +SPLkotlinx/coroutines/scheduling/DefaultScheduler;->limitedParallelism(ILjava/lang/String;)Lkotlinx/coroutines/CoroutineDispatcher; +Lkotlinx/coroutines/scheduling/GlobalQueue; +SPLkotlinx/coroutines/scheduling/GlobalQueue;->()V +Lkotlinx/coroutines/scheduling/NanoTimeSource; +SPLkotlinx/coroutines/scheduling/NanoTimeSource;->()V +SPLkotlinx/coroutines/scheduling/NanoTimeSource;->()V +SPLkotlinx/coroutines/scheduling/NanoTimeSource;->nanoTime()J +Lkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher; +SPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->(IIJLjava/lang/String;)V +SPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->createScheduler()Lkotlinx/coroutines/scheduling/CoroutineScheduler; +SPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->dispatchWithContext$kotlinx_coroutines_core(Ljava/lang/Runnable;ZZ)V +SPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->getExecutor()Ljava/util/concurrent/Executor; +Lkotlinx/coroutines/scheduling/SchedulerTimeSource; +SPLkotlinx/coroutines/scheduling/SchedulerTimeSource;->()V +Lkotlinx/coroutines/scheduling/Task; +SPLkotlinx/coroutines/scheduling/Task;->()V +SPLkotlinx/coroutines/scheduling/Task;->(JZ)V +Lkotlinx/coroutines/scheduling/TaskImpl; +SPLkotlinx/coroutines/scheduling/TaskImpl;->(Ljava/lang/Runnable;JZ)V +SPLkotlinx/coroutines/scheduling/TaskImpl;->run()V +Lkotlinx/coroutines/scheduling/TasksKt; +SPLkotlinx/coroutines/scheduling/TasksKt;->()V +SPLkotlinx/coroutines/scheduling/TasksKt;->asTask(Ljava/lang/Runnable;JZ)Lkotlinx/coroutines/scheduling/Task; +Lkotlinx/coroutines/scheduling/UnlimitedIoScheduler; +SPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->()V +SPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->()V +SPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->limitedParallelism(ILjava/lang/String;)Lkotlinx/coroutines/CoroutineDispatcher; +Lkotlinx/coroutines/scheduling/WorkQueue; +SPLkotlinx/coroutines/scheduling/WorkQueue;->()V +SPLkotlinx/coroutines/scheduling/WorkQueue;->()V +SPLkotlinx/coroutines/scheduling/WorkQueue;->add(Lkotlinx/coroutines/scheduling/Task;Z)Lkotlinx/coroutines/scheduling/Task; +SPLkotlinx/coroutines/scheduling/WorkQueue;->addLast(Lkotlinx/coroutines/scheduling/Task;)Lkotlinx/coroutines/scheduling/Task; +SPLkotlinx/coroutines/scheduling/WorkQueue;->decrementIfBlocking(Lkotlinx/coroutines/scheduling/Task;)V +SPLkotlinx/coroutines/scheduling/WorkQueue;->getBlockingTasksInBuffer$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/scheduling/WorkQueue;->getBufferSize()I +SPLkotlinx/coroutines/scheduling/WorkQueue;->getConsumerIndex$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/scheduling/WorkQueue;->getLastScheduledTask$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/scheduling/WorkQueue;->getProducerIndex$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/scheduling/WorkQueue;->poll()Lkotlinx/coroutines/scheduling/Task; +SPLkotlinx/coroutines/scheduling/WorkQueue;->pollBuffer()Lkotlinx/coroutines/scheduling/Task; +SPLkotlinx/coroutines/scheduling/WorkQueue;->trySteal(ILkotlin/jvm/internal/Ref$ObjectRef;)J +SPLkotlinx/coroutines/scheduling/WorkQueue;->tryStealLastScheduled(ILkotlin/jvm/internal/Ref$ObjectRef;)J +Lkotlinx/coroutines/selects/SelectInstance; +Lkotlinx/coroutines/sync/Mutex; +Lkotlinx/coroutines/sync/MutexImpl; +SPLkotlinx/coroutines/sync/MutexImpl;->()V +SPLkotlinx/coroutines/sync/MutexImpl;->(Z)V +SPLkotlinx/coroutines/sync/MutexImpl;->getOwner$volatile$FU()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; +SPLkotlinx/coroutines/sync/MutexImpl;->isLocked()Z +SPLkotlinx/coroutines/sync/MutexImpl;->lock$suspendImpl(Lkotlinx/coroutines/sync/MutexImpl;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/sync/MutexImpl;->lock(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/sync/MutexImpl;->tryLock(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/sync/MutexImpl;->tryLockImpl(Ljava/lang/Object;)I +SPLkotlinx/coroutines/sync/MutexImpl;->unlock(Ljava/lang/Object;)V +Lkotlinx/coroutines/sync/MutexImpl$$ExternalSyntheticLambda1; +SPLkotlinx/coroutines/sync/MutexImpl$$ExternalSyntheticLambda1;->(Lkotlinx/coroutines/sync/MutexImpl;)V +Lkotlinx/coroutines/sync/MutexKt; +SPLkotlinx/coroutines/sync/MutexKt;->()V +SPLkotlinx/coroutines/sync/MutexKt;->Mutex$default(ZILjava/lang/Object;)Lkotlinx/coroutines/sync/Mutex; +SPLkotlinx/coroutines/sync/MutexKt;->Mutex(Z)Lkotlinx/coroutines/sync/Mutex; +SPLkotlinx/coroutines/sync/MutexKt;->access$getNO_OWNER$p()Lkotlinx/coroutines/internal/Symbol; +Lkotlinx/coroutines/sync/SemaphoreAndMutexImpl; +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl;->()V +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl;->(II)V +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl;->getAvailablePermits()I +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl;->get_availablePermits$volatile$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl;->release()V +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl;->tryAcquire()Z +Lkotlinx/coroutines/sync/SemaphoreAndMutexImpl$$ExternalSyntheticLambda0; +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl$$ExternalSyntheticLambda0;->(Lkotlinx/coroutines/sync/SemaphoreAndMutexImpl;)V +Lkotlinx/coroutines/sync/SemaphoreKt; +SPLkotlinx/coroutines/sync/SemaphoreKt;->()V +SPLkotlinx/coroutines/sync/SemaphoreKt;->access$getSEGMENT_SIZE$p()I +Lkotlinx/coroutines/sync/SemaphoreSegment; +SPLkotlinx/coroutines/sync/SemaphoreSegment;->(JLkotlinx/coroutines/sync/SemaphoreSegment;I)V +Lkotlinx/serialization/DeserializationStrategy; +Lkotlinx/serialization/InternalSerializationApi; +Lkotlinx/serialization/KSerializer; +Lkotlinx/serialization/MissingFieldException; +Lkotlinx/serialization/Polymorphic; +Lkotlinx/serialization/SerialFormat; +Lkotlinx/serialization/Serializable; +Lkotlinx/serialization/SerializationException; +Lkotlinx/serialization/SerializationStrategy; +Lkotlinx/serialization/SerializersCacheKt; +SPLkotlinx/serialization/SerializersCacheKt;->()V +SPLkotlinx/serialization/SerializersCacheKt;->SERIALIZERS_CACHE_NULLABLE$lambda$0(Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/SerializersCacheKt;->findCachedSerializer(Lkotlin/reflect/KClass;Z)Lkotlinx/serialization/KSerializer; +Lkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda0; +SPLkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda0;->()V +Lkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda1; +SPLkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda1;->()V +SPLkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda2; +SPLkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda2;->()V +Lkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda3; +SPLkotlinx/serialization/SerializersCacheKt$$ExternalSyntheticLambda3;->()V +Lkotlinx/serialization/SerializersKt; +SPLkotlinx/serialization/SerializersKt;->serializer(Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/SerializersKt;->serializerOrNull(Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer; +Lkotlinx/serialization/SerializersKt__SerializersKt; +SPLkotlinx/serialization/SerializersKt__SerializersKt;->serializer(Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/SerializersKt__SerializersKt;->serializerByKTypeImpl$SerializersKt__SerializersKt(Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;Z)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/SerializersKt__SerializersKt;->serializerOrNull(Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer; +Lkotlinx/serialization/StringFormat; +Lkotlinx/serialization/builtins/BuiltinSerializersKt; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->BooleanArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->ByteArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->CharArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->DoubleArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->FloatArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->IntArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->LongArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->NothingSerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->ShortArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->UByteArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->UIntArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->ULongArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->UShortArraySerializer()Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->getNullable(Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/UByte$Companion;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/UInt$Companion;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/ULong$Companion;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/UShort$Companion;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/Unit;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/BooleanCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/ByteCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/CharCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/DoubleCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/FloatCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/IntCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/LongCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/ShortCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/StringCompanionObject;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/time/Duration$Companion;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/time/Instant$Companion;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/uuid/Uuid$Companion;)Lkotlinx/serialization/KSerializer; +Lkotlinx/serialization/descriptors/PrimitiveKind; +SPLkotlinx/serialization/descriptors/PrimitiveKind;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/descriptors/PrimitiveKind$BOOLEAN; +SPLkotlinx/serialization/descriptors/PrimitiveKind$BOOLEAN;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$BOOLEAN;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$BYTE; +SPLkotlinx/serialization/descriptors/PrimitiveKind$BYTE;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$BYTE;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$CHAR; +SPLkotlinx/serialization/descriptors/PrimitiveKind$CHAR;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$CHAR;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$DOUBLE; +SPLkotlinx/serialization/descriptors/PrimitiveKind$DOUBLE;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$DOUBLE;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$FLOAT; +SPLkotlinx/serialization/descriptors/PrimitiveKind$FLOAT;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$FLOAT;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$INT; +SPLkotlinx/serialization/descriptors/PrimitiveKind$INT;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$INT;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$LONG; +SPLkotlinx/serialization/descriptors/PrimitiveKind$LONG;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$LONG;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$SHORT; +SPLkotlinx/serialization/descriptors/PrimitiveKind$SHORT;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$SHORT;->()V +Lkotlinx/serialization/descriptors/PrimitiveKind$STRING; +SPLkotlinx/serialization/descriptors/PrimitiveKind$STRING;->()V +SPLkotlinx/serialization/descriptors/PrimitiveKind$STRING;->()V +Lkotlinx/serialization/descriptors/SerialDescriptor; +SPLkotlinx/serialization/descriptors/SerialDescriptor;->isNullable()Z +Lkotlinx/serialization/descriptors/SerialKind; +SPLkotlinx/serialization/descriptors/SerialKind;->()V +SPLkotlinx/serialization/descriptors/SerialKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/descriptors/StructureKind; +SPLkotlinx/serialization/descriptors/StructureKind;->()V +SPLkotlinx/serialization/descriptors/StructureKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/descriptors/StructureKind$OBJECT; +SPLkotlinx/serialization/descriptors/StructureKind$OBJECT;->()V +SPLkotlinx/serialization/descriptors/StructureKind$OBJECT;->()V +Lkotlinx/serialization/encoding/AbstractDecoder; +SPLkotlinx/serialization/encoding/AbstractDecoder;->()V +Lkotlinx/serialization/encoding/ChunkedDecoder; +Lkotlinx/serialization/encoding/CompositeDecoder; +SPLkotlinx/serialization/encoding/CompositeDecoder;->()V +Lkotlinx/serialization/encoding/CompositeDecoder$Companion; +SPLkotlinx/serialization/encoding/CompositeDecoder$Companion;->()V +SPLkotlinx/serialization/encoding/CompositeDecoder$Companion;->()V +Lkotlinx/serialization/encoding/Decoder; +Lkotlinx/serialization/internal/AbstractCollectionSerializer; +SPLkotlinx/serialization/internal/AbstractCollectionSerializer;->()V +SPLkotlinx/serialization/internal/AbstractCollectionSerializer;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/internal/AbstractPolymorphicSerializer; +Lkotlinx/serialization/internal/BooleanArraySerializer; +SPLkotlinx/serialization/internal/BooleanArraySerializer;->()V +SPLkotlinx/serialization/internal/BooleanArraySerializer;->()V +Lkotlinx/serialization/internal/BooleanSerializer; +SPLkotlinx/serialization/internal/BooleanSerializer;->()V +SPLkotlinx/serialization/internal/BooleanSerializer;->()V +SPLkotlinx/serialization/internal/BooleanSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/ByteArraySerializer; +SPLkotlinx/serialization/internal/ByteArraySerializer;->()V +SPLkotlinx/serialization/internal/ByteArraySerializer;->()V +Lkotlinx/serialization/internal/ByteSerializer; +SPLkotlinx/serialization/internal/ByteSerializer;->()V +SPLkotlinx/serialization/internal/ByteSerializer;->()V +SPLkotlinx/serialization/internal/ByteSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/CacheEntry; +SPLkotlinx/serialization/internal/CacheEntry;->(Lkotlinx/serialization/KSerializer;)V +Lkotlinx/serialization/internal/CachedNames; +Lkotlinx/serialization/internal/CachingKt; +SPLkotlinx/serialization/internal/CachingKt;->()V +SPLkotlinx/serialization/internal/CachingKt;->createCache(Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/internal/SerializerCache; +SPLkotlinx/serialization/internal/CachingKt;->createParametrizedCache(Lkotlin/jvm/functions/Function2;)Lkotlinx/serialization/internal/ParametrizedSerializerCache; +Lkotlinx/serialization/internal/CharArraySerializer; +SPLkotlinx/serialization/internal/CharArraySerializer;->()V +SPLkotlinx/serialization/internal/CharArraySerializer;->()V +Lkotlinx/serialization/internal/CharSerializer; +SPLkotlinx/serialization/internal/CharSerializer;->()V +SPLkotlinx/serialization/internal/CharSerializer;->()V +SPLkotlinx/serialization/internal/CharSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/ClassValueCache; +SPLkotlinx/serialization/internal/ClassValueCache;->(Lkotlin/jvm/functions/Function1;)V +SPLkotlinx/serialization/internal/ClassValueCache;->get(Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/ClassValueCache;->getCompute()Lkotlin/jvm/functions/Function1; +Lkotlinx/serialization/internal/ClassValueCache$$ExternalSyntheticApiModelOutline0; +SPLkotlinx/serialization/internal/ClassValueCache$$ExternalSyntheticApiModelOutline0;->m(Lkotlinx/serialization/internal/ClassValueReferences;Ljava/lang/Class;)Ljava/lang/Object; +Lkotlinx/serialization/internal/ClassValueCache$get$$inlined$getOrSet$1; +SPLkotlinx/serialization/internal/ClassValueCache$get$$inlined$getOrSet$1;->(Lkotlinx/serialization/internal/ClassValueCache;Lkotlin/reflect/KClass;)V +SPLkotlinx/serialization/internal/ClassValueCache$get$$inlined$getOrSet$1;->invoke()Ljava/lang/Object; +Lkotlinx/serialization/internal/ClassValueParametrizedCache; +SPLkotlinx/serialization/internal/ClassValueParametrizedCache;->(Lkotlin/jvm/functions/Function2;)V +Lkotlinx/serialization/internal/ClassValueReferences; +SPLkotlinx/serialization/internal/ClassValueReferences;->()V +SPLkotlinx/serialization/internal/ClassValueReferences;->computeValue(Ljava/lang/Class;)Ljava/lang/Object; +SPLkotlinx/serialization/internal/ClassValueReferences;->computeValue(Ljava/lang/Class;)Lkotlinx/serialization/internal/MutableSoftReference; +Lkotlinx/serialization/internal/CollectionLikeSerializer; +SPLkotlinx/serialization/internal/CollectionLikeSerializer;->(Lkotlinx/serialization/KSerializer;)V +SPLkotlinx/serialization/internal/CollectionLikeSerializer;->(Lkotlinx/serialization/KSerializer;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/internal/DoubleArraySerializer; +SPLkotlinx/serialization/internal/DoubleArraySerializer;->()V +SPLkotlinx/serialization/internal/DoubleArraySerializer;->()V +Lkotlinx/serialization/internal/DoubleSerializer; +SPLkotlinx/serialization/internal/DoubleSerializer;->()V +SPLkotlinx/serialization/internal/DoubleSerializer;->()V +SPLkotlinx/serialization/internal/DoubleSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/DurationSerializer; +SPLkotlinx/serialization/internal/DurationSerializer;->()V +SPLkotlinx/serialization/internal/DurationSerializer;->()V +Lkotlinx/serialization/internal/FloatArraySerializer; +SPLkotlinx/serialization/internal/FloatArraySerializer;->()V +SPLkotlinx/serialization/internal/FloatArraySerializer;->()V +Lkotlinx/serialization/internal/FloatSerializer; +SPLkotlinx/serialization/internal/FloatSerializer;->()V +SPLkotlinx/serialization/internal/FloatSerializer;->()V +SPLkotlinx/serialization/internal/FloatSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/GeneratedSerializer; +Lkotlinx/serialization/internal/InlineClassDescriptor; +SPLkotlinx/serialization/internal/InlineClassDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;)V +Lkotlinx/serialization/internal/InlineClassDescriptorKt; +SPLkotlinx/serialization/internal/InlineClassDescriptorKt;->InlinePrimitiveDescriptor(Ljava/lang/String;Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/InlineClassDescriptorKt$InlinePrimitiveDescriptor$1; +SPLkotlinx/serialization/internal/InlineClassDescriptorKt$InlinePrimitiveDescriptor$1;->(Lkotlinx/serialization/KSerializer;)V +Lkotlinx/serialization/internal/InstantSerializer; +SPLkotlinx/serialization/internal/InstantSerializer;->()V +SPLkotlinx/serialization/internal/InstantSerializer;->()V +Lkotlinx/serialization/internal/IntArraySerializer; +SPLkotlinx/serialization/internal/IntArraySerializer;->()V +SPLkotlinx/serialization/internal/IntArraySerializer;->()V +Lkotlinx/serialization/internal/IntSerializer; +SPLkotlinx/serialization/internal/IntSerializer;->()V +SPLkotlinx/serialization/internal/IntSerializer;->()V +SPLkotlinx/serialization/internal/IntSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Integer; +SPLkotlinx/serialization/internal/IntSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; +SPLkotlinx/serialization/internal/IntSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/ListLikeDescriptor; +SPLkotlinx/serialization/internal/ListLikeDescriptor;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V +SPLkotlinx/serialization/internal/ListLikeDescriptor;->(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/internal/LongArraySerializer; +SPLkotlinx/serialization/internal/LongArraySerializer;->()V +SPLkotlinx/serialization/internal/LongArraySerializer;->()V +Lkotlinx/serialization/internal/LongSerializer; +SPLkotlinx/serialization/internal/LongSerializer;->()V +SPLkotlinx/serialization/internal/LongSerializer;->()V +SPLkotlinx/serialization/internal/LongSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Long; +SPLkotlinx/serialization/internal/LongSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; +SPLkotlinx/serialization/internal/LongSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/MutableSoftReference; +SPLkotlinx/serialization/internal/MutableSoftReference;->()V +SPLkotlinx/serialization/internal/MutableSoftReference;->getOrSetWithLock(Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; +Lkotlinx/serialization/internal/NamedCompanion; +Lkotlinx/serialization/internal/NothingSerialDescriptor; +SPLkotlinx/serialization/internal/NothingSerialDescriptor;->()V +SPLkotlinx/serialization/internal/NothingSerialDescriptor;->()V +Lkotlinx/serialization/internal/NothingSerializer; +SPLkotlinx/serialization/internal/NothingSerializer;->()V +SPLkotlinx/serialization/internal/NothingSerializer;->()V +Lkotlinx/serialization/internal/NullableSerializer; +SPLkotlinx/serialization/internal/NullableSerializer;->(Lkotlinx/serialization/KSerializer;)V +SPLkotlinx/serialization/internal/NullableSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; +SPLkotlinx/serialization/internal/NullableSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/ObjectSerializer; +SPLkotlinx/serialization/internal/ObjectSerializer;->(Ljava/lang/String;Ljava/lang/Object;)V +Lkotlinx/serialization/internal/ObjectSerializer$$ExternalSyntheticLambda1; +SPLkotlinx/serialization/internal/ObjectSerializer$$ExternalSyntheticLambda1;->(Ljava/lang/String;Lkotlinx/serialization/internal/ObjectSerializer;)V +Lkotlinx/serialization/internal/ParametrizedSerializerCache; +Lkotlinx/serialization/internal/PlatformKt; +SPLkotlinx/serialization/internal/PlatformKt;->companionOrNull(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object; +SPLkotlinx/serialization/internal/PlatformKt;->compiledSerializerImpl(Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/PlatformKt;->constructSerializerForGivenTypeArgs(Ljava/lang/Class;[Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/PlatformKt;->constructSerializerForGivenTypeArgs(Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/PlatformKt;->findInNamedCompanion(Ljava/lang/Class;[Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/PlatformKt;->findNamedCompanionByAnnotation(Ljava/lang/Class;)Ljava/lang/Object; +SPLkotlinx/serialization/internal/PlatformKt;->findObjectSerializer(Ljava/lang/Class;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/PlatformKt;->initBuiltins()Ljava/util/Map; +SPLkotlinx/serialization/internal/PlatformKt;->invokeSerializerOnDefaultCompanion(Ljava/lang/Class;[Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; +SPLkotlinx/serialization/internal/PlatformKt;->isInterface(Lkotlin/reflect/KClass;)Z +SPLkotlinx/serialization/internal/PlatformKt;->isPolymorphicSerializer(Ljava/lang/Class;)Z +Lkotlinx/serialization/internal/Platform_commonKt; +SPLkotlinx/serialization/internal/Platform_commonKt;->()V +SPLkotlinx/serialization/internal/Platform_commonKt;->cachedSerialNames(Lkotlinx/serialization/descriptors/SerialDescriptor;)Ljava/util/Set; +SPLkotlinx/serialization/internal/Platform_commonKt;->kclass(Lkotlin/reflect/KType;)Lkotlin/reflect/KClass; +Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor; +SPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;I)V +SPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getSerialName()Ljava/lang/String; +Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$$ExternalSyntheticLambda0; +SPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$$ExternalSyntheticLambda0;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V +Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$$ExternalSyntheticLambda1; +SPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$$ExternalSyntheticLambda1;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V +Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$$ExternalSyntheticLambda2; +SPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$$ExternalSyntheticLambda2;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V +Lkotlinx/serialization/internal/PrimitiveArrayDescriptor; +SPLkotlinx/serialization/internal/PrimitiveArrayDescriptor;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V +Lkotlinx/serialization/internal/PrimitiveArraySerializer; +SPLkotlinx/serialization/internal/PrimitiveArraySerializer;->(Lkotlinx/serialization/KSerializer;)V +Lkotlinx/serialization/internal/PrimitiveSerialDescriptor; +SPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/descriptors/PrimitiveKind;)V +SPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->getElementsCount()I +SPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->getSerialName()Ljava/lang/String; +SPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->isNullable()Z +Lkotlinx/serialization/internal/PrimitivesKt; +SPLkotlinx/serialization/internal/PrimitivesKt;->()V +SPLkotlinx/serialization/internal/PrimitivesKt;->builtinSerializerOrNull(Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer; +Lkotlinx/serialization/internal/SerialDescriptorForNullable; +SPLkotlinx/serialization/internal/SerialDescriptorForNullable;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V +Lkotlinx/serialization/internal/SerializerCache; +Lkotlinx/serialization/internal/ShortArraySerializer; +SPLkotlinx/serialization/internal/ShortArraySerializer;->()V +SPLkotlinx/serialization/internal/ShortArraySerializer;->()V +Lkotlinx/serialization/internal/ShortSerializer; +SPLkotlinx/serialization/internal/ShortSerializer;->()V +SPLkotlinx/serialization/internal/ShortSerializer;->()V +SPLkotlinx/serialization/internal/ShortSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/StringSerializer; +SPLkotlinx/serialization/internal/StringSerializer;->()V +SPLkotlinx/serialization/internal/StringSerializer;->()V +Lkotlinx/serialization/internal/UByteArraySerializer; +SPLkotlinx/serialization/internal/UByteArraySerializer;->()V +SPLkotlinx/serialization/internal/UByteArraySerializer;->()V +Lkotlinx/serialization/internal/UByteSerializer; +SPLkotlinx/serialization/internal/UByteSerializer;->()V +SPLkotlinx/serialization/internal/UByteSerializer;->()V +SPLkotlinx/serialization/internal/UByteSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/UIntArraySerializer; +SPLkotlinx/serialization/internal/UIntArraySerializer;->()V +SPLkotlinx/serialization/internal/UIntArraySerializer;->()V +Lkotlinx/serialization/internal/UIntSerializer; +SPLkotlinx/serialization/internal/UIntSerializer;->()V +SPLkotlinx/serialization/internal/UIntSerializer;->()V +SPLkotlinx/serialization/internal/UIntSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/ULongArraySerializer; +SPLkotlinx/serialization/internal/ULongArraySerializer;->()V +SPLkotlinx/serialization/internal/ULongArraySerializer;->()V +Lkotlinx/serialization/internal/ULongSerializer; +SPLkotlinx/serialization/internal/ULongSerializer;->()V +SPLkotlinx/serialization/internal/ULongSerializer;->()V +SPLkotlinx/serialization/internal/ULongSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/UShortArraySerializer; +SPLkotlinx/serialization/internal/UShortArraySerializer;->()V +SPLkotlinx/serialization/internal/UShortArraySerializer;->()V +Lkotlinx/serialization/internal/UShortSerializer; +SPLkotlinx/serialization/internal/UShortSerializer;->()V +SPLkotlinx/serialization/internal/UShortSerializer;->()V +SPLkotlinx/serialization/internal/UShortSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; +Lkotlinx/serialization/internal/UnitSerializer; +SPLkotlinx/serialization/internal/UnitSerializer;->()V +SPLkotlinx/serialization/internal/UnitSerializer;->()V +Lkotlinx/serialization/internal/UuidSerializer; +SPLkotlinx/serialization/internal/UuidSerializer;->()V +SPLkotlinx/serialization/internal/UuidSerializer;->()V +Lkotlinx/serialization/json/ClassDiscriminatorMode; +SPLkotlinx/serialization/json/ClassDiscriminatorMode;->$values()[Lkotlinx/serialization/json/ClassDiscriminatorMode; +SPLkotlinx/serialization/json/ClassDiscriminatorMode;->()V +SPLkotlinx/serialization/json/ClassDiscriminatorMode;->(Ljava/lang/String;I)V +Lkotlinx/serialization/json/Json; +SPLkotlinx/serialization/json/Json;->()V +SPLkotlinx/serialization/json/Json;->(Lkotlinx/serialization/json/JsonConfiguration;Lkotlinx/serialization/modules/SerializersModule;)V +SPLkotlinx/serialization/json/Json;->(Lkotlinx/serialization/json/JsonConfiguration;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlinx/serialization/json/Json;->decodeFromString(Lkotlinx/serialization/DeserializationStrategy;Ljava/lang/String;)Ljava/lang/Object; +SPLkotlinx/serialization/json/Json;->getConfiguration()Lkotlinx/serialization/json/JsonConfiguration; +SPLkotlinx/serialization/json/Json;->getSerializersModule()Lkotlinx/serialization/modules/SerializersModule; +Lkotlinx/serialization/json/Json$Default; +SPLkotlinx/serialization/json/Json$Default;->()V +SPLkotlinx/serialization/json/Json$Default;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/json/JsonArray; +SPLkotlinx/serialization/json/JsonArray;->()V +SPLkotlinx/serialization/json/JsonArray;->(Ljava/util/List;)V +SPLkotlinx/serialization/json/JsonArray;->toString()Ljava/lang/String; +Lkotlinx/serialization/json/JsonArray$Companion; +SPLkotlinx/serialization/json/JsonArray$Companion;->()V +SPLkotlinx/serialization/json/JsonArray$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/json/JsonArrayBuilder; +SPLkotlinx/serialization/json/JsonArrayBuilder;->()V +SPLkotlinx/serialization/json/JsonArrayBuilder;->build()Lkotlinx/serialization/json/JsonArray; +Lkotlinx/serialization/json/JsonBuilder; +SPLkotlinx/serialization/json/JsonBuilder;->(Lkotlinx/serialization/json/Json;)V +SPLkotlinx/serialization/json/JsonBuilder;->build$kotlinx_serialization_json()Lkotlinx/serialization/json/JsonConfiguration; +SPLkotlinx/serialization/json/JsonBuilder;->getSerializersModule()Lkotlinx/serialization/modules/SerializersModule; +SPLkotlinx/serialization/json/JsonBuilder;->setEncodeDefaults(Z)V +SPLkotlinx/serialization/json/JsonBuilder;->setExplicitNulls(Z)V +Lkotlinx/serialization/json/JsonConfiguration; +SPLkotlinx/serialization/json/JsonConfiguration;->(ZZZZZZLjava/lang/String;ZZLjava/lang/String;ZZLkotlinx/serialization/json/JsonNamingStrategy;ZZZLkotlinx/serialization/json/ClassDiscriminatorMode;Z)V +SPLkotlinx/serialization/json/JsonConfiguration;->(ZZZZZZLjava/lang/String;ZZLjava/lang/String;ZZLkotlinx/serialization/json/JsonNamingStrategy;ZZZLkotlinx/serialization/json/ClassDiscriminatorMode;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlinx/serialization/json/JsonConfiguration;->getAllowComments()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getAllowSpecialFloatingPointValues()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getAllowStructuredMapKeys()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getAllowTrailingComma()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getClassDiscriminator()Ljava/lang/String; +SPLkotlinx/serialization/json/JsonConfiguration;->getClassDiscriminatorMode()Lkotlinx/serialization/json/ClassDiscriminatorMode; +SPLkotlinx/serialization/json/JsonConfiguration;->getCoerceInputValues()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getDecodeEnumsCaseInsensitive()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getEncodeDefaults()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getExceptionsWithDebugInfo()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getExplicitNulls()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getIgnoreUnknownKeys()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getNamingStrategy()Lkotlinx/serialization/json/JsonNamingStrategy; +SPLkotlinx/serialization/json/JsonConfiguration;->getPrettyPrint()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getPrettyPrintIndent()Ljava/lang/String; +SPLkotlinx/serialization/json/JsonConfiguration;->getUseAlternativeNames()Z +SPLkotlinx/serialization/json/JsonConfiguration;->getUseArrayPolymorphism()Z +SPLkotlinx/serialization/json/JsonConfiguration;->isLenient()Z +Lkotlinx/serialization/json/JsonDecoder; +Lkotlinx/serialization/json/JsonDecodingException; +Lkotlinx/serialization/json/JsonElement; +SPLkotlinx/serialization/json/JsonElement;->()V +SPLkotlinx/serialization/json/JsonElement;->()V +SPLkotlinx/serialization/json/JsonElement;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/json/JsonElement$Companion; +SPLkotlinx/serialization/json/JsonElement$Companion;->()V +SPLkotlinx/serialization/json/JsonElement$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/json/JsonElementBuildersKt; +SPLkotlinx/serialization/json/JsonElementBuildersKt;->put(Lkotlinx/serialization/json/JsonObjectBuilder;Ljava/lang/String;Ljava/lang/Boolean;)Lkotlinx/serialization/json/JsonElement; +SPLkotlinx/serialization/json/JsonElementBuildersKt;->put(Lkotlinx/serialization/json/JsonObjectBuilder;Ljava/lang/String;Ljava/lang/String;)Lkotlinx/serialization/json/JsonElement; +SPLkotlinx/serialization/json/JsonElementBuildersKt;->putJsonArray(Lkotlinx/serialization/json/JsonObjectBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/json/JsonElement; +Lkotlinx/serialization/json/JsonElementKt; +SPLkotlinx/serialization/json/JsonElementKt;->()V +SPLkotlinx/serialization/json/JsonElementKt;->JsonPrimitive(Ljava/lang/Boolean;)Lkotlinx/serialization/json/JsonPrimitive; +SPLkotlinx/serialization/json/JsonElementKt;->JsonPrimitive(Ljava/lang/String;)Lkotlinx/serialization/json/JsonPrimitive; +Lkotlinx/serialization/json/JsonException; +Lkotlinx/serialization/json/JsonImpl; +SPLkotlinx/serialization/json/JsonImpl;->(Lkotlinx/serialization/json/JsonConfiguration;Lkotlinx/serialization/modules/SerializersModule;)V +SPLkotlinx/serialization/json/JsonImpl;->validateConfiguration()V +Lkotlinx/serialization/json/JsonKt; +SPLkotlinx/serialization/json/JsonKt;->Json$default(Lkotlinx/serialization/json/Json;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/serialization/json/Json; +SPLkotlinx/serialization/json/JsonKt;->Json(Lkotlinx/serialization/json/Json;Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/json/Json; +Lkotlinx/serialization/json/JsonLiteral; +SPLkotlinx/serialization/json/JsonLiteral;->(Ljava/lang/Object;ZLkotlinx/serialization/descriptors/SerialDescriptor;)V +SPLkotlinx/serialization/json/JsonLiteral;->(Ljava/lang/Object;ZLkotlinx/serialization/descriptors/SerialDescriptor;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLkotlinx/serialization/json/JsonLiteral;->getContent()Ljava/lang/String; +SPLkotlinx/serialization/json/JsonLiteral;->isString()Z +SPLkotlinx/serialization/json/JsonLiteral;->toString()Ljava/lang/String; +Lkotlinx/serialization/json/JsonNamingStrategy; +Lkotlinx/serialization/json/JsonObject; +SPLkotlinx/serialization/json/JsonObject;->()V +SPLkotlinx/serialization/json/JsonObject;->(Ljava/util/Map;)V +SPLkotlinx/serialization/json/JsonObject;->toString$lambda$0(Ljava/util/Map$Entry;)Ljava/lang/CharSequence; +SPLkotlinx/serialization/json/JsonObject;->toString()Ljava/lang/String; +Lkotlinx/serialization/json/JsonObject$$ExternalSyntheticLambda0; +SPLkotlinx/serialization/json/JsonObject$$ExternalSyntheticLambda0;->()V +SPLkotlinx/serialization/json/JsonObject$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/serialization/json/JsonObject$Companion; +SPLkotlinx/serialization/json/JsonObject$Companion;->()V +SPLkotlinx/serialization/json/JsonObject$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/json/JsonObjectBuilder; +SPLkotlinx/serialization/json/JsonObjectBuilder;->()V +SPLkotlinx/serialization/json/JsonObjectBuilder;->build()Lkotlinx/serialization/json/JsonObject; +SPLkotlinx/serialization/json/JsonObjectBuilder;->put(Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lkotlinx/serialization/json/JsonElement; +Lkotlinx/serialization/json/JsonPrimitive; +SPLkotlinx/serialization/json/JsonPrimitive;->()V +SPLkotlinx/serialization/json/JsonPrimitive;->()V +SPLkotlinx/serialization/json/JsonPrimitive;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/json/JsonPrimitive$Companion; +SPLkotlinx/serialization/json/JsonPrimitive$Companion;->()V +SPLkotlinx/serialization/json/JsonPrimitive$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/json/internal/AbstractJsonLexer; +SPLkotlinx/serialization/json/internal/AbstractJsonLexer;->(Lkotlinx/serialization/json/JsonConfiguration;)V +SPLkotlinx/serialization/json/internal/AbstractJsonLexer;->consumeNumericLiteral()J +SPLkotlinx/serialization/json/internal/AbstractJsonLexer;->expectEof()V +SPLkotlinx/serialization/json/internal/AbstractJsonLexer;->tryConsumeNull$default(Lkotlinx/serialization/json/internal/AbstractJsonLexer;ZILjava/lang/Object;)Z +SPLkotlinx/serialization/json/internal/AbstractJsonLexer;->tryConsumeNull(Z)Z +Lkotlinx/serialization/json/internal/AbstractJsonLexerKt; +SPLkotlinx/serialization/json/internal/AbstractJsonLexerKt;->charToTokenClass(C)B +Lkotlinx/serialization/json/internal/CharMappings; +SPLkotlinx/serialization/json/internal/CharMappings;->()V +SPLkotlinx/serialization/json/internal/CharMappings;->()V +SPLkotlinx/serialization/json/internal/CharMappings;->initC2ESC(CC)V +SPLkotlinx/serialization/json/internal/CharMappings;->initC2ESC(IC)V +SPLkotlinx/serialization/json/internal/CharMappings;->initC2TC(CB)V +SPLkotlinx/serialization/json/internal/CharMappings;->initC2TC(IB)V +SPLkotlinx/serialization/json/internal/CharMappings;->initCharToToken()V +SPLkotlinx/serialization/json/internal/CharMappings;->initEscape()V +Lkotlinx/serialization/json/internal/CreateMapForCacheKt; +SPLkotlinx/serialization/json/internal/CreateMapForCacheKt;->createMapForCache(I)Ljava/util/Map; +Lkotlinx/serialization/json/internal/DescriptorSchemaCache; +SPLkotlinx/serialization/json/internal/DescriptorSchemaCache;->()V +Lkotlinx/serialization/json/internal/JsonElementMarker; +Lkotlinx/serialization/json/internal/JsonPath; +SPLkotlinx/serialization/json/internal/JsonPath;->(Lkotlinx/serialization/json/JsonConfiguration;)V +Lkotlinx/serialization/json/internal/StreamingJsonDecoder; +SPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/json/internal/WriteMode;Lkotlinx/serialization/json/internal/AbstractJsonLexer;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/internal/StreamingJsonDecoder$DiscriminatorHolder;)V +SPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeInt()I +SPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeLong()J +SPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeNotNullMark()Z +SPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeSerializableValue(Lkotlinx/serialization/DeserializationStrategy;)Ljava/lang/Object; +Lkotlinx/serialization/json/internal/StreamingJsonDecoder$DiscriminatorHolder; +Lkotlinx/serialization/json/internal/StringJsonLexer; +SPLkotlinx/serialization/json/internal/StringJsonLexer;->(Ljava/lang/String;Lkotlinx/serialization/json/JsonConfiguration;)V +SPLkotlinx/serialization/json/internal/StringJsonLexer;->consumeNextToken()B +SPLkotlinx/serialization/json/internal/StringJsonLexer;->getSource()Ljava/lang/CharSequence; +SPLkotlinx/serialization/json/internal/StringJsonLexer;->getSource()Ljava/lang/String; +SPLkotlinx/serialization/json/internal/StringJsonLexer;->prefetchOrEof(I)I +SPLkotlinx/serialization/json/internal/StringJsonLexer;->skipWhitespaces()I +Lkotlinx/serialization/json/internal/StringJsonLexerKt; +SPLkotlinx/serialization/json/internal/StringJsonLexerKt;->StringJsonLexer(Lkotlinx/serialization/json/Json;Ljava/lang/String;)Lkotlinx/serialization/json/internal/StringJsonLexer; +Lkotlinx/serialization/json/internal/StringOpsKt; +SPLkotlinx/serialization/json/internal/StringOpsKt;->()V +SPLkotlinx/serialization/json/internal/StringOpsKt;->printQuoted(Ljava/lang/StringBuilder;Ljava/lang/String;)V +SPLkotlinx/serialization/json/internal/StringOpsKt;->toHexChar(I)C +Lkotlinx/serialization/json/internal/WriteMode; +SPLkotlinx/serialization/json/internal/WriteMode;->$values()[Lkotlinx/serialization/json/internal/WriteMode; +SPLkotlinx/serialization/json/internal/WriteMode;->()V +SPLkotlinx/serialization/json/internal/WriteMode;->(Ljava/lang/String;ICC)V +Lkotlinx/serialization/modules/SerialModuleImpl; +SPLkotlinx/serialization/modules/SerialModuleImpl;->(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Z)V +Lkotlinx/serialization/modules/SerializersModule; +SPLkotlinx/serialization/modules/SerializersModule;->()V +SPLkotlinx/serialization/modules/SerializersModule;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lkotlinx/serialization/modules/SerializersModuleBuildersKt; +SPLkotlinx/serialization/modules/SerializersModuleBuildersKt;->EmptySerializersModule()Lkotlinx/serialization/modules/SerializersModule; +Lkotlinx/serialization/modules/SerializersModuleKt; +SPLkotlinx/serialization/modules/SerializersModuleKt;->()V +SPLkotlinx/serialization/modules/SerializersModuleKt;->getEmptySerializersModule()Lkotlinx/serialization/modules/SerializersModule; +Lleakcanary/AndroidDebugHeapDumper; +SPLleakcanary/AndroidDebugHeapDumper;->()V +SPLleakcanary/AndroidDebugHeapDumper;->()V +Lleakcanary/AndroidLeakFixes; +SPLleakcanary/AndroidLeakFixes;->()V +SPLleakcanary/AndroidLeakFixes;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes;->(Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLleakcanary/AndroidLeakFixes;->access$getApplied$p(Lleakcanary/AndroidLeakFixes;)Z +SPLleakcanary/AndroidLeakFixes;->access$setApplied$p(Lleakcanary/AndroidLeakFixes;Z)V +SPLleakcanary/AndroidLeakFixes;->values()[Lleakcanary/AndroidLeakFixes; +Lleakcanary/AndroidLeakFixes$ACCESSIBILITY_NODE_INFO; +SPLleakcanary/AndroidLeakFixes$ACCESSIBILITY_NODE_INFO;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$ACCESSIBILITY_NODE_INFO;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$ACTIVITY_MANAGER; +SPLleakcanary/AndroidLeakFixes$ACTIVITY_MANAGER;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$ACTIVITY_MANAGER;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$BUBBLE_POPUP; +SPLleakcanary/AndroidLeakFixes$BUBBLE_POPUP;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$BUBBLE_POPUP;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$CONNECTIVITY_MANAGER; +SPLleakcanary/AndroidLeakFixes$CONNECTIVITY_MANAGER;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$CONNECTIVITY_MANAGER;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$Companion; +SPLleakcanary/AndroidLeakFixes$Companion;->()V +SPLleakcanary/AndroidLeakFixes$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLleakcanary/AndroidLeakFixes$Companion;->applyFixes$default(Lleakcanary/AndroidLeakFixes$Companion;Landroid/app/Application;Ljava/util/Set;ILjava/lang/Object;)V +SPLleakcanary/AndroidLeakFixes$Companion;->applyFixes(Landroid/app/Application;Ljava/util/Set;)V +Lleakcanary/AndroidLeakFixes$Companion$backgroundHandler$2; +SPLleakcanary/AndroidLeakFixes$Companion$backgroundHandler$2;->()V +SPLleakcanary/AndroidLeakFixes$Companion$backgroundHandler$2;->()V +Lleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS; +SPLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$IMM_CUR_ROOT_VIEW; +SPLleakcanary/AndroidLeakFixes$IMM_CUR_ROOT_VIEW;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$IMM_CUR_ROOT_VIEW;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$IMM_FOCUSED_VIEW; +SPLleakcanary/AndroidLeakFixes$IMM_FOCUSED_VIEW;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$IMM_FOCUSED_VIEW;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$LAST_HOVERED_VIEW; +SPLleakcanary/AndroidLeakFixes$LAST_HOVERED_VIEW;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$LAST_HOVERED_VIEW;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$MEDIA_SESSION_LEGACY_HELPER; +SPLleakcanary/AndroidLeakFixes$MEDIA_SESSION_LEGACY_HELPER;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$MEDIA_SESSION_LEGACY_HELPER;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$PERMISSION_CONTROLLER_MANAGER; +SPLleakcanary/AndroidLeakFixes$PERMISSION_CONTROLLER_MANAGER;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$PERMISSION_CONTROLLER_MANAGER;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$SAMSUNG_CLIPBOARD_MANAGER; +SPLleakcanary/AndroidLeakFixes$SAMSUNG_CLIPBOARD_MANAGER;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$SAMSUNG_CLIPBOARD_MANAGER;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$SPELL_CHECKER; +SPLleakcanary/AndroidLeakFixes$SPELL_CHECKER;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$SPELL_CHECKER;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$TEXT_LINE_POOL; +SPLleakcanary/AndroidLeakFixes$TEXT_LINE_POOL;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$TEXT_LINE_POOL;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$USER_MANAGER; +SPLleakcanary/AndroidLeakFixes$USER_MANAGER;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$USER_MANAGER;->apply(Landroid/app/Application;)V +Lleakcanary/AndroidLeakFixes$VIEW_LOCATION_HOLDER; +SPLleakcanary/AndroidLeakFixes$VIEW_LOCATION_HOLDER;->(Ljava/lang/String;I)V +SPLleakcanary/AndroidLeakFixes$VIEW_LOCATION_HOLDER;->apply(Landroid/app/Application;)V +Lleakcanary/AppWatcher; +SPLleakcanary/AppWatcher;->()V +SPLleakcanary/AppWatcher;->()V +SPLleakcanary/AppWatcher;->isInstalled()Z +Lleakcanary/AppWatcher$Config; +SPLleakcanary/AppWatcher$Config;->(ZZZZJZ)V +SPLleakcanary/AppWatcher$Config;->(ZZZZJZILkotlin/jvm/internal/DefaultConstructorMarker;)V +Lleakcanary/AppWatcher$objectWatcher$1; +SPLleakcanary/AppWatcher$objectWatcher$1;->()V +SPLleakcanary/AppWatcher$objectWatcher$1;->()V +Lleakcanary/AppWatcher$objectWatcher$2; +SPLleakcanary/AppWatcher$objectWatcher$2;->()V +SPLleakcanary/AppWatcher$objectWatcher$2;->()V +Lleakcanary/AppWatcher$objectWatcher$3; +SPLleakcanary/AppWatcher$objectWatcher$3;->()V +SPLleakcanary/AppWatcher$objectWatcher$3;->()V +Lleakcanary/Clock; +Lleakcanary/DefaultOnHeapAnalyzedListener; +SPLleakcanary/DefaultOnHeapAnalyzedListener;->()V +SPLleakcanary/DefaultOnHeapAnalyzedListener;->()V +SPLleakcanary/DefaultOnHeapAnalyzedListener;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lleakcanary/DefaultOnHeapAnalyzedListener$Companion; +SPLleakcanary/DefaultOnHeapAnalyzedListener$Companion;->()V +SPLleakcanary/DefaultOnHeapAnalyzedListener$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLleakcanary/DefaultOnHeapAnalyzedListener$Companion;->create()Lleakcanary/OnHeapAnalyzedListener; +Lleakcanary/EventListener; +Lleakcanary/HeapDumper; +Lleakcanary/LazyForwardingEventListener; +SPLleakcanary/LazyForwardingEventListener;->(Lkotlin/jvm/functions/Function0;)V +Lleakcanary/LeakCanary; +SPLleakcanary/LeakCanary;->()V +SPLleakcanary/LeakCanary;->()V +SPLleakcanary/LeakCanary;->getConfig()Lleakcanary/LeakCanary$Config; +SPLleakcanary/LeakCanary;->logConfigChange(Lleakcanary/LeakCanary$Config;Lleakcanary/LeakCanary$Config;)V +SPLleakcanary/LeakCanary;->setConfig(Lleakcanary/LeakCanary$Config;)V +Lleakcanary/LeakCanary$Config; +SPLleakcanary/LeakCanary$Config;->(ZZILjava/util/List;Ljava/util/List;Lleakcanary/OnHeapAnalyzedListener;Lshark/MetadataExtractor;ZIZLshark/LeakingObjectFinder;Lleakcanary/HeapDumper;Ljava/util/List;ZZ)V +SPLleakcanary/LeakCanary$Config;->(ZZILjava/util/List;Ljava/util/List;Lleakcanary/OnHeapAnalyzedListener;Lshark/MetadataExtractor;ZIZLshark/LeakingObjectFinder;Lleakcanary/HeapDumper;Ljava/util/List;ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLleakcanary/LeakCanary$Config;->copy$default(Lleakcanary/LeakCanary$Config;ZZILjava/util/List;Ljava/util/List;Lleakcanary/OnHeapAnalyzedListener;Lshark/MetadataExtractor;ZIZLshark/LeakingObjectFinder;Lleakcanary/HeapDumper;Ljava/util/List;ZZILjava/lang/Object;)Lleakcanary/LeakCanary$Config; +SPLleakcanary/LeakCanary$Config;->copy(ZZILjava/util/List;Ljava/util/List;Lleakcanary/OnHeapAnalyzedListener;Lshark/MetadataExtractor;ZIZLshark/LeakingObjectFinder;Lleakcanary/HeapDumper;Ljava/util/List;ZZ)Lleakcanary/LeakCanary$Config; +Lleakcanary/LeakCanary$Config$1; +SPLleakcanary/LeakCanary$Config$1;->()V +SPLleakcanary/LeakCanary$Config$1;->()V +Lleakcanary/LogcatEventListener; +SPLleakcanary/LogcatEventListener;->()V +SPLleakcanary/LogcatEventListener;->()V +Lleakcanary/ObjectWatcher; +SPLleakcanary/ObjectWatcher;->(Lleakcanary/Clock;Ljava/util/concurrent/Executor;Lkotlin/jvm/functions/Function0;)V +Lleakcanary/OnHeapAnalyzedListener; +Lleakcanary/ReachabilityWatcher; +Lleakcanary/RemoteWorkManagerHeapAnalyzer; +SPLleakcanary/RemoteWorkManagerHeapAnalyzer;->()V +SPLleakcanary/RemoteWorkManagerHeapAnalyzer;->()V +SPLleakcanary/RemoteWorkManagerHeapAnalyzer;->getRemoteLeakCanaryServiceInClasspath$leakcanary_android_core_release()Z +Lleakcanary/RemoteWorkManagerHeapAnalyzer$remoteLeakCanaryServiceInClasspath$2; +SPLleakcanary/RemoteWorkManagerHeapAnalyzer$remoteLeakCanaryServiceInClasspath$2;->()V +SPLleakcanary/RemoteWorkManagerHeapAnalyzer$remoteLeakCanaryServiceInClasspath$2;->()V +SPLleakcanary/RemoteWorkManagerHeapAnalyzer$remoteLeakCanaryServiceInClasspath$2;->invoke()Ljava/lang/Object; +SPLleakcanary/RemoteWorkManagerHeapAnalyzer$remoteLeakCanaryServiceInClasspath$2;->invoke()Z +Lleakcanary/ToastEventListener; +SPLleakcanary/ToastEventListener;->()V +SPLleakcanary/ToastEventListener;->()V +Lleakcanary/ViewLocationHolderLeakFix; +SPLleakcanary/ViewLocationHolderLeakFix;->()V +SPLleakcanary/ViewLocationHolderLeakFix;->()V +SPLleakcanary/ViewLocationHolderLeakFix;->applyFix$plumber_android_core_release(Landroid/app/Application;)V +Lleakcanary/WorkManagerHeapAnalyzer; +SPLleakcanary/WorkManagerHeapAnalyzer;->()V +SPLleakcanary/WorkManagerHeapAnalyzer;->()V +SPLleakcanary/WorkManagerHeapAnalyzer;->getValidWorkManagerInClasspath$leakcanary_android_core_release()Z +Lleakcanary/WorkManagerHeapAnalyzer$validWorkManagerInClasspath$2; +SPLleakcanary/WorkManagerHeapAnalyzer$validWorkManagerInClasspath$2;->()V +SPLleakcanary/WorkManagerHeapAnalyzer$validWorkManagerInClasspath$2;->()V +SPLleakcanary/WorkManagerHeapAnalyzer$validWorkManagerInClasspath$2;->invoke()Ljava/lang/Object; +SPLleakcanary/WorkManagerHeapAnalyzer$validWorkManagerInClasspath$2;->invoke()Z +Lleakcanary/WorkManagerHeapAnalyzer$workManagerSupportsExpeditedRequests$2; +SPLleakcanary/WorkManagerHeapAnalyzer$workManagerSupportsExpeditedRequests$2;->()V +SPLleakcanary/WorkManagerHeapAnalyzer$workManagerSupportsExpeditedRequests$2;->()V +Lleakcanary/internal/HandlersKt; +SPLleakcanary/internal/HandlersKt;->()V +SPLleakcanary/internal/HandlersKt;->checkMainThread()V +SPLleakcanary/internal/HandlersKt;->isMainThread()Z +Lleakcanary/internal/HandlersKt$mainHandler$2; +SPLleakcanary/internal/HandlersKt$mainHandler$2;->()V +SPLleakcanary/internal/HandlersKt$mainHandler$2;->()V +Lleakcanary/internal/HeapDumpControl; +SPLleakcanary/internal/HeapDumpControl;->()V +SPLleakcanary/internal/HeapDumpControl;->()V +SPLleakcanary/internal/HeapDumpControl;->getBackgroundUpdateHandler()Landroid/os/Handler; +SPLleakcanary/internal/HeapDumpControl;->iCanHasHeap()Lleakcanary/internal/HeapDumpControl$ICanHazHeap; +SPLleakcanary/internal/HeapDumpControl;->updateICanHasHeapInBackground()V +Lleakcanary/internal/HeapDumpControl$ICanHazHeap; +SPLleakcanary/internal/HeapDumpControl$ICanHazHeap;->()V +SPLleakcanary/internal/HeapDumpControl$ICanHazHeap;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lleakcanary/internal/HeapDumpControl$ICanHazHeap$Nope; +SPLleakcanary/internal/HeapDumpControl$ICanHazHeap$Nope;->(Lkotlin/jvm/functions/Function0;)V +Lleakcanary/internal/HeapDumpControl$ICanHazHeap$SilentNope; +SPLleakcanary/internal/HeapDumpControl$ICanHazHeap$SilentNope;->(Lkotlin/jvm/functions/Function0;)V +Lleakcanary/internal/HeapDumpControl$backgroundUpdateHandler$2; +SPLleakcanary/internal/HeapDumpControl$backgroundUpdateHandler$2;->()V +SPLleakcanary/internal/HeapDumpControl$backgroundUpdateHandler$2;->()V +SPLleakcanary/internal/HeapDumpControl$backgroundUpdateHandler$2;->invoke()Landroid/os/Handler; +SPLleakcanary/internal/HeapDumpControl$backgroundUpdateHandler$2;->invoke()Ljava/lang/Object; +Lleakcanary/internal/HeapDumpControl$hasLeakAssertionsClass$2; +SPLleakcanary/internal/HeapDumpControl$hasLeakAssertionsClass$2;->()V +SPLleakcanary/internal/HeapDumpControl$hasLeakAssertionsClass$2;->()V +Lleakcanary/internal/HeapDumpControl$hasTestClass$2; +SPLleakcanary/internal/HeapDumpControl$hasTestClass$2;->()V +SPLleakcanary/internal/HeapDumpControl$hasTestClass$2;->()V +Lleakcanary/internal/HeapDumpControl$iCanHasHeap$dumpHeap$1; +SPLleakcanary/internal/HeapDumpControl$iCanHasHeap$dumpHeap$1;->()V +SPLleakcanary/internal/HeapDumpControl$iCanHasHeap$dumpHeap$1;->()V +Lleakcanary/internal/HeapDumpControl$testClassName$2; +SPLleakcanary/internal/HeapDumpControl$testClassName$2;->()V +SPLleakcanary/internal/HeapDumpControl$testClassName$2;->()V +Lleakcanary/internal/HeapDumpControl$updateICanHasHeapInBackground$1; +SPLleakcanary/internal/HeapDumpControl$updateICanHasHeapInBackground$1;->()V +SPLleakcanary/internal/HeapDumpControl$updateICanHasHeapInBackground$1;->()V +SPLleakcanary/internal/HeapDumpControl$updateICanHasHeapInBackground$1;->run()V +Lleakcanary/internal/LeakCanaryFileProvider; +SPLleakcanary/internal/LeakCanaryFileProvider;->()V +SPLleakcanary/internal/LeakCanaryFileProvider;->()V +SPLleakcanary/internal/LeakCanaryFileProvider;->access$getSCache$cp()Ljava/util/HashMap; +SPLleakcanary/internal/LeakCanaryFileProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V +SPLleakcanary/internal/LeakCanaryFileProvider;->onCreate()Z +Lleakcanary/internal/LeakCanaryFileProvider$Companion; +SPLleakcanary/internal/LeakCanaryFileProvider$Companion;->()V +SPLleakcanary/internal/LeakCanaryFileProvider$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLleakcanary/internal/LeakCanaryFileProvider$Companion;->access$getPathStrategy(Lleakcanary/internal/LeakCanaryFileProvider$Companion;Landroid/content/Context;Ljava/lang/String;)Lleakcanary/internal/LeakCanaryFileProvider$PathStrategy; +SPLleakcanary/internal/LeakCanaryFileProvider$Companion;->buildPath(Ljava/io/File;[Ljava/lang/String;)Ljava/io/File; +SPLleakcanary/internal/LeakCanaryFileProvider$Companion;->getPathStrategy(Landroid/content/Context;Ljava/lang/String;)Lleakcanary/internal/LeakCanaryFileProvider$PathStrategy; +SPLleakcanary/internal/LeakCanaryFileProvider$Companion;->parsePathStrategy(Landroid/content/Context;Ljava/lang/String;)Lleakcanary/internal/LeakCanaryFileProvider$PathStrategy; +Lleakcanary/internal/LeakCanaryFileProvider$PathStrategy; +Lleakcanary/internal/LeakCanaryFileProvider$SimplePathStrategy; +SPLleakcanary/internal/LeakCanaryFileProvider$SimplePathStrategy;->(Ljava/lang/String;)V +SPLleakcanary/internal/LeakCanaryFileProvider$SimplePathStrategy;->addRoot(Ljava/lang/String;Ljava/io/File;)V +Lleakcanary/internal/PlumberInstaller; +SPLleakcanary/internal/PlumberInstaller;->()V +SPLleakcanary/internal/PlumberInstaller;->onCreate()Z +Lnet/ankiweb/rsdroid/Backend; +SPLnet/ankiweb/rsdroid/Backend;->()V +SPLnet/ankiweb/rsdroid/Backend;->(Ljava/lang/Iterable;)V +SPLnet/ankiweb/rsdroid/Backend;->cancelCurrentProtoQuery(I)V +SPLnet/ankiweb/rsdroid/Backend;->fullQueryProto(Ljava/lang/String;[Ljava/lang/Object;)Lanki/ankidroid/DbResponse; +SPLnet/ankiweb/rsdroid/Backend;->getTr()Lnet/ankiweb/rsdroid/Translations; +SPLnet/ankiweb/rsdroid/Backend;->openCollection(Ljava/lang/String;)V +SPLnet/ankiweb/rsdroid/Backend;->runMethodRaw$lambda$0(II[BJ)[B +SPLnet/ankiweb/rsdroid/Backend;->runMethodRaw(II[B)[B +SPLnet/ankiweb/rsdroid/Backend;->tr_delegate$lambda$0(Lnet/ankiweb/rsdroid/Backend;)Lnet/ankiweb/rsdroid/Translations; +SPLnet/ankiweb/rsdroid/Backend;->withBackend(Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; +Lnet/ankiweb/rsdroid/Backend$$ExternalSyntheticLambda0; +SPLnet/ankiweb/rsdroid/Backend$$ExternalSyntheticLambda0;->(Lnet/ankiweb/rsdroid/Backend;)V +SPLnet/ankiweb/rsdroid/Backend$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Lnet/ankiweb/rsdroid/Backend$$ExternalSyntheticLambda1; +SPLnet/ankiweb/rsdroid/Backend$$ExternalSyntheticLambda1;->(II[B)V +SPLnet/ankiweb/rsdroid/Backend$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lnet/ankiweb/rsdroid/Backend$Companion; +SPLnet/ankiweb/rsdroid/Backend$Companion;->()V +SPLnet/ankiweb/rsdroid/Backend$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lnet/ankiweb/rsdroid/BackendException; +SPLnet/ankiweb/rsdroid/BackendException;->()V +SPLnet/ankiweb/rsdroid/BackendException;->(Lanki/backend/BackendError;)V +Lnet/ankiweb/rsdroid/BackendException$BackendDbException; +Lnet/ankiweb/rsdroid/BackendException$BackendDbException$BackendDbCorruptException; +Lnet/ankiweb/rsdroid/BackendException$BackendDbException$BackendDbFileTooNewException; +Lnet/ankiweb/rsdroid/BackendException$BackendDbException$BackendDbFullException; +Lnet/ankiweb/rsdroid/BackendException$BackendDbException$BackendDbLockedException; +Lnet/ankiweb/rsdroid/BackendException$BackendSearchException; +Lnet/ankiweb/rsdroid/BackendException$Companion; +SPLnet/ankiweb/rsdroid/BackendException$Companion;->()V +SPLnet/ankiweb/rsdroid/BackendException$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLnet/ankiweb/rsdroid/BackendException$Companion;->fromError(Lanki/backend/BackendError;)Lnet/ankiweb/rsdroid/BackendException; +Lnet/ankiweb/rsdroid/BackendException$Companion$WhenMappings; +SPLnet/ankiweb/rsdroid/BackendException$Companion$WhenMappings;->()V +Lnet/ankiweb/rsdroid/BackendFactory; +SPLnet/ankiweb/rsdroid/BackendFactory;->()V +SPLnet/ankiweb/rsdroid/BackendFactory;->()V +SPLnet/ankiweb/rsdroid/BackendFactory;->getBackend$default(Ljava/lang/Iterable;ILjava/lang/Object;)Lnet/ankiweb/rsdroid/Backend; +SPLnet/ankiweb/rsdroid/BackendFactory;->getBackend(Ljava/lang/Iterable;)Lnet/ankiweb/rsdroid/Backend; +SPLnet/ankiweb/rsdroid/BackendFactory;->setDefaultLanguages(Ljava/lang/Iterable;)V +Lnet/ankiweb/rsdroid/BackendKt; +SPLnet/ankiweb/rsdroid/BackendKt;->$r8$lambda$h6IVCdbvnaDg_XJznVj3rmenO90([Ljava/lang/Object;Lkotlinx/serialization/json/JsonArrayBuilder;)Lkotlin/Unit; +SPLnet/ankiweb/rsdroid/BackendKt;->()V +SPLnet/ankiweb/rsdroid/BackendKt;->access$getLogger$p()Lorg/slf4j/Logger; +SPLnet/ankiweb/rsdroid/BackendKt;->access$unpackResult([[B)[B +SPLnet/ankiweb/rsdroid/BackendKt;->dbRequestJson$default(Ljava/lang/String;[Ljava/lang/Object;ZILjava/lang/Object;)Lcom/google/protobuf/ByteString; +SPLnet/ankiweb/rsdroid/BackendKt;->dbRequestJson$lambda$0$0([Ljava/lang/Object;Lkotlinx/serialization/json/JsonArrayBuilder;)Lkotlin/Unit; +SPLnet/ankiweb/rsdroid/BackendKt;->dbRequestJson(Ljava/lang/String;[Ljava/lang/Object;Z)Lcom/google/protobuf/ByteString; +SPLnet/ankiweb/rsdroid/BackendKt;->unpackResult([[B)[B +Lnet/ankiweb/rsdroid/BackendKt$$ExternalSyntheticLambda1; +SPLnet/ankiweb/rsdroid/BackendKt$$ExternalSyntheticLambda1;->([Ljava/lang/Object;)V +SPLnet/ankiweb/rsdroid/BackendKt$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lnet/ankiweb/rsdroid/NativeMethods; +SPLnet/ankiweb/rsdroid/NativeMethods;->()V +SPLnet/ankiweb/rsdroid/NativeMethods;->()V +Lnet/ankiweb/rsdroid/Translations; +SPLnet/ankiweb/rsdroid/Translations;->(Lnet/ankiweb/rsdroid/Backend;)V +SPLnet/ankiweb/rsdroid/Translations;->actionsDecks()Ljava/lang/String; +SPLnet/ankiweb/rsdroid/Translations;->actionsEmptyCards()Ljava/lang/String; +SPLnet/ankiweb/rsdroid/Translations;->actionsExport()Ljava/lang/String; +SPLnet/ankiweb/rsdroid/Translations;->actionsImport()Ljava/lang/String; +SPLnet/ankiweb/rsdroid/Translations;->databaseCheckTitle()Ljava/lang/String; +SPLnet/ankiweb/rsdroid/Translations;->decksCreateDeck()Ljava/lang/String; +SPLnet/ankiweb/rsdroid/Translations;->mediaCheckCheckMediaAction()Ljava/lang/String; +SPLnet/ankiweb/rsdroid/Translations;->statisticsTitle()Ljava/lang/String; +SPLnet/ankiweb/rsdroid/Translations;->translate(IILjava/util/Map;)Ljava/lang/String; +Lnet/ankiweb/rsdroid/database/AnkiDatabaseCursor; +SPLnet/ankiweb/rsdroid/database/AnkiDatabaseCursor;->()V +SPLnet/ankiweb/rsdroid/database/AnkiDatabaseCursor;->moveToNext()Z +Lnet/ankiweb/rsdroid/database/AnkiSupportSQLiteDatabase; +SPLnet/ankiweb/rsdroid/database/AnkiSupportSQLiteDatabase;->()V +Lnet/ankiweb/rsdroid/database/AnkiSupportSQLiteDatabase$Companion; +SPLnet/ankiweb/rsdroid/database/AnkiSupportSQLiteDatabase$Companion;->()V +SPLnet/ankiweb/rsdroid/database/AnkiSupportSQLiteDatabase$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLnet/ankiweb/rsdroid/database/AnkiSupportSQLiteDatabase$Companion;->withRustBackend(Lnet/ankiweb/rsdroid/Backend;)Landroidx/sqlite/db/SupportSQLiteDatabase; +Lnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase; +SPLnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase;->()V +SPLnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase;->(Lnet/ankiweb/rsdroid/Backend;)V +SPLnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase;->query(Ljava/lang/String;[Ljava/lang/Object;)Landroid/database/Cursor; +Lnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase$Companion; +SPLnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase$Companion;->()V +SPLnet/ankiweb/rsdroid/database/RustSupportSQLiteDatabase$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lnet/ankiweb/rsdroid/database/SQLHandler; +Lnet/ankiweb/rsdroid/database/StreamingProtobufSQLiteCursor; +SPLnet/ankiweb/rsdroid/database/StreamingProtobufSQLiteCursor;->(Lnet/ankiweb/rsdroid/database/SQLHandler;Ljava/lang/String;[Ljava/lang/Object;)V +SPLnet/ankiweb/rsdroid/database/StreamingProtobufSQLiteCursor;->close()V +SPLnet/ankiweb/rsdroid/database/StreamingProtobufSQLiteCursor;->getCurrentSliceRowCount()I +SPLnet/ankiweb/rsdroid/database/StreamingProtobufSQLiteCursor;->getFieldAtIndex(I)Lanki/ankidroid/SqlValue; +SPLnet/ankiweb/rsdroid/database/StreamingProtobufSQLiteCursor;->getInt(I)I +SPLnet/ankiweb/rsdroid/database/StreamingProtobufSQLiteCursor;->getLong(I)J +SPLnet/ankiweb/rsdroid/database/StreamingProtobufSQLiteCursor;->getPosition()I +SPLnet/ankiweb/rsdroid/database/StreamingProtobufSQLiteCursor;->getRowAtCurrentPosition()Lanki/ankidroid/Row; +SPLnet/ankiweb/rsdroid/database/StreamingProtobufSQLiteCursor;->getSliceStartIndex()I +SPLnet/ankiweb/rsdroid/database/StreamingProtobufSQLiteCursor;->moveToPosition(I)Z +Lnet/ankiweb/rsdroid/database/StreamingProtobufSQLiteCursor$WhenMappings; +SPLnet/ankiweb/rsdroid/database/StreamingProtobufSQLiteCursor$WhenMappings;->()V +Lnet/ankiweb/rsdroid/exceptions/BackendDeckIsFilteredException; +Lnet/ankiweb/rsdroid/exceptions/BackendNetworkException; +Lnet/ankiweb/rsdroid/exceptions/BackendNotFoundException; +SPLnet/ankiweb/rsdroid/exceptions/BackendNotFoundException;->(Lanki/backend/BackendError;)V +Lokhttp3/Authenticator; +SPLokhttp3/Authenticator;->()V +Lokhttp3/Authenticator$Companion; +SPLokhttp3/Authenticator$Companion;->()V +SPLokhttp3/Authenticator$Companion;->()V +Lokhttp3/Authenticator$Companion$AuthenticatorNone; +SPLokhttp3/Authenticator$Companion$AuthenticatorNone;->()V +Lokhttp3/Cache; +Lokhttp3/Call$Factory; +Lokhttp3/CertificatePinner; +SPLokhttp3/CertificatePinner;->()V +SPLokhttp3/CertificatePinner;->(Ljava/util/Set;Lokhttp3/internal/tls/CertificateChainCleaner;)V +SPLokhttp3/CertificatePinner;->(Ljava/util/Set;Lokhttp3/internal/tls/CertificateChainCleaner;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/CertificatePinner;->withCertificateChainCleaner$okhttp(Lokhttp3/internal/tls/CertificateChainCleaner;)Lokhttp3/CertificatePinner; +Lokhttp3/CertificatePinner$Builder; +SPLokhttp3/CertificatePinner$Builder;->()V +SPLokhttp3/CertificatePinner$Builder;->build()Lokhttp3/CertificatePinner; +Lokhttp3/CertificatePinner$Companion; +SPLokhttp3/CertificatePinner$Companion;->()V +SPLokhttp3/CertificatePinner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lokhttp3/CipherSuite; +SPLokhttp3/CipherSuite;->()V +SPLokhttp3/CipherSuite;->(Ljava/lang/String;)V +SPLokhttp3/CipherSuite;->(Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/CipherSuite;->access$getINSTANCES$cp()Ljava/util/Map; +SPLokhttp3/CipherSuite;->javaName()Ljava/lang/String; +Lokhttp3/CipherSuite$Companion; +SPLokhttp3/CipherSuite$Companion;->()V +SPLokhttp3/CipherSuite$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/CipherSuite$Companion;->access$init(Lokhttp3/CipherSuite$Companion;Ljava/lang/String;I)Lokhttp3/CipherSuite; +SPLokhttp3/CipherSuite$Companion;->init(Ljava/lang/String;I)Lokhttp3/CipherSuite; +Lokhttp3/CipherSuite$Companion$ORDER_BY_NAME$1; +SPLokhttp3/CipherSuite$Companion$ORDER_BY_NAME$1;->()V +Lokhttp3/ConnectionPool; +SPLokhttp3/ConnectionPool;->()V +SPLokhttp3/ConnectionPool;->(IJLjava/util/concurrent/TimeUnit;)V +SPLokhttp3/ConnectionPool;->(IJLjava/util/concurrent/TimeUnit;Lokhttp3/internal/concurrent/TaskRunner;Lokhttp3/internal/connection/ConnectionListener;)V +SPLokhttp3/ConnectionPool;->(Lokhttp3/internal/connection/RealConnectionPool;)V +Lokhttp3/ConnectionSpec; +SPLokhttp3/ConnectionSpec;->()V +SPLokhttp3/ConnectionSpec;->(ZZ[Ljava/lang/String;[Ljava/lang/String;)V +SPLokhttp3/ConnectionSpec;->isTls()Z +Lokhttp3/ConnectionSpec$Builder; +SPLokhttp3/ConnectionSpec$Builder;->(Z)V +SPLokhttp3/ConnectionSpec$Builder;->build()Lokhttp3/ConnectionSpec; +SPLokhttp3/ConnectionSpec$Builder;->cipherSuites([Ljava/lang/String;)Lokhttp3/ConnectionSpec$Builder; +SPLokhttp3/ConnectionSpec$Builder;->cipherSuites([Lokhttp3/CipherSuite;)Lokhttp3/ConnectionSpec$Builder; +SPLokhttp3/ConnectionSpec$Builder;->supportsTlsExtensions(Z)Lokhttp3/ConnectionSpec$Builder; +SPLokhttp3/ConnectionSpec$Builder;->tlsVersions([Ljava/lang/String;)Lokhttp3/ConnectionSpec$Builder; +SPLokhttp3/ConnectionSpec$Builder;->tlsVersions([Lokhttp3/TlsVersion;)Lokhttp3/ConnectionSpec$Builder; +Lokhttp3/ConnectionSpec$Companion; +SPLokhttp3/ConnectionSpec$Companion;->()V +SPLokhttp3/ConnectionSpec$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lokhttp3/CookieJar; +SPLokhttp3/CookieJar;->()V +Lokhttp3/CookieJar$Companion; +SPLokhttp3/CookieJar$Companion;->()V +SPLokhttp3/CookieJar$Companion;->()V +Lokhttp3/CookieJar$Companion$NoCookies; +SPLokhttp3/CookieJar$Companion$NoCookies;->()V +Lokhttp3/Dispatcher; +SPLokhttp3/Dispatcher;->()V +Lokhttp3/Dns; +SPLokhttp3/Dns;->()V +Lokhttp3/Dns$Companion; +SPLokhttp3/Dns$Companion;->()V +SPLokhttp3/Dns$Companion;->()V +Lokhttp3/Dns$Companion$SYSTEM$1; +SPLokhttp3/Dns$Companion$SYSTEM$1;->()V +Lokhttp3/EventListener; +SPLokhttp3/EventListener;->()V +SPLokhttp3/EventListener;->()V +Lokhttp3/EventListener$Companion; +SPLokhttp3/EventListener$Companion;->()V +SPLokhttp3/EventListener$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lokhttp3/EventListener$Companion$NONE$1; +SPLokhttp3/EventListener$Companion$NONE$1;->()V +Lokhttp3/EventListener$Factory; +Lokhttp3/OkHttpClient; +SPLokhttp3/OkHttpClient;->()V +SPLokhttp3/OkHttpClient;->(Lokhttp3/OkHttpClient$Builder;)V +SPLokhttp3/OkHttpClient;->access$getDEFAULT_CONNECTION_SPECS$cp()Ljava/util/List; +SPLokhttp3/OkHttpClient;->access$getDEFAULT_PROTOCOLS$cp()Ljava/util/List; +SPLokhttp3/OkHttpClient;->verifyClientState()V +Lokhttp3/OkHttpClient$Builder; +SPLokhttp3/OkHttpClient$Builder;->()V +SPLokhttp3/OkHttpClient$Builder;->build()Lokhttp3/OkHttpClient; +SPLokhttp3/OkHttpClient$Builder;->connectTimeout(JLjava/util/concurrent/TimeUnit;)Lokhttp3/OkHttpClient$Builder; +SPLokhttp3/OkHttpClient$Builder;->getAuthenticator$okhttp()Lokhttp3/Authenticator; +SPLokhttp3/OkHttpClient$Builder;->getCache$okhttp()Lokhttp3/Cache; +SPLokhttp3/OkHttpClient$Builder;->getCallTimeout$okhttp()I +SPLokhttp3/OkHttpClient$Builder;->getCertificatePinner$okhttp()Lokhttp3/CertificatePinner; +SPLokhttp3/OkHttpClient$Builder;->getConnectTimeout$okhttp()I +SPLokhttp3/OkHttpClient$Builder;->getConnectionPool$okhttp()Lokhttp3/ConnectionPool; +SPLokhttp3/OkHttpClient$Builder;->getConnectionSpecs$okhttp()Ljava/util/List; +SPLokhttp3/OkHttpClient$Builder;->getCookieJar$okhttp()Lokhttp3/CookieJar; +SPLokhttp3/OkHttpClient$Builder;->getDispatcher$okhttp()Lokhttp3/Dispatcher; +SPLokhttp3/OkHttpClient$Builder;->getDns$okhttp()Lokhttp3/Dns; +SPLokhttp3/OkHttpClient$Builder;->getEventListenerFactory$okhttp()Lokhttp3/EventListener$Factory; +SPLokhttp3/OkHttpClient$Builder;->getFastFallback$okhttp()Z +SPLokhttp3/OkHttpClient$Builder;->getFollowRedirects$okhttp()Z +SPLokhttp3/OkHttpClient$Builder;->getFollowSslRedirects$okhttp()Z +SPLokhttp3/OkHttpClient$Builder;->getHostnameVerifier$okhttp()Ljavax/net/ssl/HostnameVerifier; +SPLokhttp3/OkHttpClient$Builder;->getInterceptors$okhttp()Ljava/util/List; +SPLokhttp3/OkHttpClient$Builder;->getMinWebSocketMessageToCompress$okhttp()J +SPLokhttp3/OkHttpClient$Builder;->getNetworkInterceptors$okhttp()Ljava/util/List; +SPLokhttp3/OkHttpClient$Builder;->getPingInterval$okhttp()I +SPLokhttp3/OkHttpClient$Builder;->getProtocols$okhttp()Ljava/util/List; +SPLokhttp3/OkHttpClient$Builder;->getProxy$okhttp()Ljava/net/Proxy; +SPLokhttp3/OkHttpClient$Builder;->getProxyAuthenticator$okhttp()Lokhttp3/Authenticator; +SPLokhttp3/OkHttpClient$Builder;->getProxySelector$okhttp()Ljava/net/ProxySelector; +SPLokhttp3/OkHttpClient$Builder;->getReadTimeout$okhttp()I +SPLokhttp3/OkHttpClient$Builder;->getRetryOnConnectionFailure$okhttp()Z +SPLokhttp3/OkHttpClient$Builder;->getRouteDatabase$okhttp()Lokhttp3/internal/connection/RouteDatabase; +SPLokhttp3/OkHttpClient$Builder;->getSocketFactory$okhttp()Ljavax/net/SocketFactory; +SPLokhttp3/OkHttpClient$Builder;->getSslSocketFactoryOrNull$okhttp()Ljavax/net/ssl/SSLSocketFactory; +SPLokhttp3/OkHttpClient$Builder;->getTaskRunner$okhttp()Lokhttp3/internal/concurrent/TaskRunner; +SPLokhttp3/OkHttpClient$Builder;->getWebSocketCloseTimeout$okhttp()I +SPLokhttp3/OkHttpClient$Builder;->getWriteTimeout$okhttp()I +SPLokhttp3/OkHttpClient$Builder;->readTimeout(JLjava/util/concurrent/TimeUnit;)Lokhttp3/OkHttpClient$Builder; +SPLokhttp3/OkHttpClient$Builder;->setConnectionPool$okhttp(Lokhttp3/ConnectionPool;)V +Lokhttp3/OkHttpClient$Companion; +SPLokhttp3/OkHttpClient$Companion;->()V +SPLokhttp3/OkHttpClient$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/OkHttpClient$Companion;->getDEFAULT_CONNECTION_SPECS$okhttp()Ljava/util/List; +SPLokhttp3/OkHttpClient$Companion;->getDEFAULT_PROTOCOLS$okhttp()Ljava/util/List; +Lokhttp3/Protocol; +SPLokhttp3/Protocol;->$values()[Lokhttp3/Protocol; +SPLokhttp3/Protocol;->()V +SPLokhttp3/Protocol;->(Ljava/lang/String;ILjava/lang/String;)V +Lokhttp3/Protocol$Companion; +SPLokhttp3/Protocol$Companion;->()V +SPLokhttp3/Protocol$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lokhttp3/TlsVersion; +SPLokhttp3/TlsVersion;->$values()[Lokhttp3/TlsVersion; +SPLokhttp3/TlsVersion;->()V +SPLokhttp3/TlsVersion;->(Ljava/lang/String;ILjava/lang/String;)V +SPLokhttp3/TlsVersion;->javaName()Ljava/lang/String; +Lokhttp3/TlsVersion$Companion; +SPLokhttp3/TlsVersion$Companion;->()V +SPLokhttp3/TlsVersion$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lokhttp3/WebSocket$Factory; +Lokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0; +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ActivityManager;Ljava/lang/String;II)Ljava/util/List; +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ApplicationExitInfo;)I +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ApplicationExitInfo;)J +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/job/JobScheduler;Ljava/lang/String;)Landroid/app/job/JobScheduler; +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageInfo;)J +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Lcom/google/android/material/navigation/NavigationBarItemView;Z)V +SPLokhttp3/android/AndroidDns$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/app/ApplicationExitInfo; +Lokhttp3/internal/_UtilJvmKt; +SPLokhttp3/internal/_UtilJvmKt;->()V +SPLokhttp3/internal/_UtilJvmKt;->asFactory(Lokhttp3/EventListener;)Lokhttp3/EventListener$Factory; +SPLokhttp3/internal/_UtilJvmKt;->checkDuration(Ljava/lang/String;JLjava/util/concurrent/TimeUnit;)I +SPLokhttp3/internal/_UtilJvmKt;->immutableListOf([Ljava/lang/Object;)Ljava/util/List; +SPLokhttp3/internal/_UtilJvmKt;->threadFactory(Ljava/lang/String;Z)Ljava/util/concurrent/ThreadFactory; +SPLokhttp3/internal/_UtilJvmKt;->toImmutableList(Ljava/util/List;)Ljava/util/List; +SPLokhttp3/internal/_UtilJvmKt;->toImmutableList([Ljava/lang/Object;)Ljava/util/List; +Lokhttp3/internal/_UtilJvmKt$$ExternalSyntheticLambda0; +SPLokhttp3/internal/_UtilJvmKt$$ExternalSyntheticLambda0;->(Lokhttp3/EventListener;)V +Lokhttp3/internal/_UtilJvmKt$$ExternalSyntheticLambda1; +SPLokhttp3/internal/_UtilJvmKt$$ExternalSyntheticLambda1;->(Ljava/lang/String;Z)V +Lokhttp3/internal/authenticator/JavaNetAuthenticator; +SPLokhttp3/internal/authenticator/JavaNetAuthenticator;->(Lokhttp3/Dns;)V +SPLokhttp3/internal/authenticator/JavaNetAuthenticator;->(Lokhttp3/Dns;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +Lokhttp3/internal/concurrent/Lockable; +Lokhttp3/internal/concurrent/Task; +SPLokhttp3/internal/concurrent/Task;->(Ljava/lang/String;Z)V +SPLokhttp3/internal/concurrent/Task;->(Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V +Lokhttp3/internal/concurrent/TaskQueue; +SPLokhttp3/internal/concurrent/TaskQueue;->(Lokhttp3/internal/concurrent/TaskRunner;Ljava/lang/String;)V +Lokhttp3/internal/concurrent/TaskRunner; +SPLokhttp3/internal/concurrent/TaskRunner;->()V +SPLokhttp3/internal/concurrent/TaskRunner;->(Lokhttp3/internal/concurrent/TaskRunner$Backend;Ljava/util/logging/Logger;)V +SPLokhttp3/internal/concurrent/TaskRunner;->(Lokhttp3/internal/concurrent/TaskRunner$Backend;Ljava/util/logging/Logger;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/internal/concurrent/TaskRunner;->newQueue()Lokhttp3/internal/concurrent/TaskQueue; +Lokhttp3/internal/concurrent/TaskRunner$Backend; +Lokhttp3/internal/concurrent/TaskRunner$Companion; +SPLokhttp3/internal/concurrent/TaskRunner$Companion;->()V +SPLokhttp3/internal/concurrent/TaskRunner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lokhttp3/internal/concurrent/TaskRunner$RealBackend; +SPLokhttp3/internal/concurrent/TaskRunner$RealBackend;->(Ljava/util/concurrent/ThreadFactory;)V +Lokhttp3/internal/concurrent/TaskRunner$runnable$1; +SPLokhttp3/internal/concurrent/TaskRunner$runnable$1;->(Lokhttp3/internal/concurrent/TaskRunner;)V +Lokhttp3/internal/connection/ConnectionListener; +SPLokhttp3/internal/connection/ConnectionListener;->()V +SPLokhttp3/internal/connection/ConnectionListener;->()V +SPLokhttp3/internal/connection/ConnectionListener;->access$getNONE$cp()Lokhttp3/internal/connection/ConnectionListener; +Lokhttp3/internal/connection/ConnectionListener$Companion; +SPLokhttp3/internal/connection/ConnectionListener$Companion;->()V +SPLokhttp3/internal/connection/ConnectionListener$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/internal/connection/ConnectionListener$Companion;->getNONE()Lokhttp3/internal/connection/ConnectionListener; +Lokhttp3/internal/connection/ConnectionListener$Companion$NONE$1; +SPLokhttp3/internal/connection/ConnectionListener$Companion$NONE$1;->()V +Lokhttp3/internal/connection/RealConnectionPool; +SPLokhttp3/internal/connection/RealConnectionPool;->()V +SPLokhttp3/internal/connection/RealConnectionPool;->(Lokhttp3/internal/concurrent/TaskRunner;IJLjava/util/concurrent/TimeUnit;Lokhttp3/internal/connection/ConnectionListener;)V +Lokhttp3/internal/connection/RealConnectionPool$Companion; +SPLokhttp3/internal/connection/RealConnectionPool$Companion;->()V +SPLokhttp3/internal/connection/RealConnectionPool$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lokhttp3/internal/connection/RealConnectionPool$cleanupTask$1; +SPLokhttp3/internal/connection/RealConnectionPool$cleanupTask$1;->(Lokhttp3/internal/connection/RealConnectionPool;Ljava/lang/String;)V +Lokhttp3/internal/connection/RouteDatabase; +SPLokhttp3/internal/connection/RouteDatabase;->()V +Lokhttp3/internal/http2/Http2; +Lokhttp3/internal/platform/Android10Platform; +SPLokhttp3/internal/platform/Android10Platform;->()V +SPLokhttp3/internal/platform/Android10Platform;->()V +SPLokhttp3/internal/platform/Android10Platform;->access$isSupported$cp()Z +SPLokhttp3/internal/platform/Android10Platform;->buildCertificateChainCleaner(Ljavax/net/ssl/X509TrustManager;)Lokhttp3/internal/tls/CertificateChainCleaner; +SPLokhttp3/internal/platform/Android10Platform;->newSSLContext()Ljavax/net/ssl/SSLContext; +SPLokhttp3/internal/platform/Android10Platform;->setApplicationContext(Landroid/content/Context;)V +Lokhttp3/internal/platform/Android10Platform$Companion; +SPLokhttp3/internal/platform/Android10Platform$Companion;->()V +SPLokhttp3/internal/platform/Android10Platform$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/internal/platform/Android10Platform$Companion;->buildIfSupported()Lokhttp3/internal/platform/Platform; +SPLokhttp3/internal/platform/Android10Platform$Companion;->isSupported()Z +Lokhttp3/internal/platform/ContextAwarePlatform; +Lokhttp3/internal/platform/Platform; +SPLokhttp3/internal/platform/Platform;->()V +SPLokhttp3/internal/platform/Platform;->()V +SPLokhttp3/internal/platform/Platform;->access$getPlatform$cp()Lokhttp3/internal/platform/Platform; +SPLokhttp3/internal/platform/Platform;->getSocketFactory()Ljavax/net/SocketFactory; +SPLokhttp3/internal/platform/Platform;->newSSLContext()Ljavax/net/ssl/SSLContext; +SPLokhttp3/internal/platform/Platform;->newSslSocketFactory(Ljavax/net/ssl/X509TrustManager;)Ljavax/net/ssl/SSLSocketFactory; +SPLokhttp3/internal/platform/Platform;->platformTrustManager()Ljavax/net/ssl/X509TrustManager; +Lokhttp3/internal/platform/Platform$Companion; +SPLokhttp3/internal/platform/Platform$Companion;->()V +SPLokhttp3/internal/platform/Platform$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/internal/platform/Platform$Companion;->access$findPlatform(Lokhttp3/internal/platform/Platform$Companion;)Lokhttp3/internal/platform/Platform; +SPLokhttp3/internal/platform/Platform$Companion;->findPlatform()Lokhttp3/internal/platform/Platform; +SPLokhttp3/internal/platform/Platform$Companion;->get()Lokhttp3/internal/platform/Platform; +SPLokhttp3/internal/platform/Platform$Companion;->isAndroid()Z +Lokhttp3/internal/platform/PlatformInitializer; +SPLokhttp3/internal/platform/PlatformInitializer;->()V +SPLokhttp3/internal/platform/PlatformInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; +SPLokhttp3/internal/platform/PlatformInitializer;->create(Landroid/content/Context;)Lokhttp3/internal/platform/Platform; +SPLokhttp3/internal/platform/PlatformInitializer;->dependencies()Ljava/util/List; +Lokhttp3/internal/platform/PlatformRegistry; +SPLokhttp3/internal/platform/PlatformRegistry;->()V +SPLokhttp3/internal/platform/PlatformRegistry;->()V +SPLokhttp3/internal/platform/PlatformRegistry;->findPlatform()Lokhttp3/internal/platform/Platform; +SPLokhttp3/internal/platform/PlatformRegistry;->isAndroid()Z +SPLokhttp3/internal/platform/PlatformRegistry;->setApplicationContext(Landroid/content/Context;)V +Lokhttp3/internal/platform/android/Android10SocketAdapter; +SPLokhttp3/internal/platform/android/Android10SocketAdapter;->()V +SPLokhttp3/internal/platform/android/Android10SocketAdapter;->()V +SPLokhttp3/internal/platform/android/Android10SocketAdapter;->isSupported()Z +Lokhttp3/internal/platform/android/Android10SocketAdapter$Companion; +SPLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->()V +SPLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->buildIfSupported()Lokhttp3/internal/platform/android/SocketAdapter; +SPLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->isSupported()Z +Lokhttp3/internal/platform/android/Android17SocketAdapter; +SPLokhttp3/internal/platform/android/Android17SocketAdapter;->()V +Lokhttp3/internal/platform/android/Android17SocketAdapter$Companion; +SPLokhttp3/internal/platform/android/Android17SocketAdapter$Companion;->()V +SPLokhttp3/internal/platform/android/Android17SocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/internal/platform/android/Android17SocketAdapter$Companion;->buildIfSupported()Lokhttp3/internal/platform/android/SocketAdapter; +SPLokhttp3/internal/platform/android/Android17SocketAdapter$Companion;->isSupported()Z +Lokhttp3/internal/platform/android/AndroidCertificateChainCleaner; +SPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->()V +SPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->(Ljavax/net/ssl/X509TrustManager;Landroid/net/http/X509TrustManagerExtensions;)V +Lokhttp3/internal/platform/android/AndroidCertificateChainCleaner$Companion; +SPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner$Companion;->()V +SPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner$Companion;->buildIfSupported(Ljavax/net/ssl/X509TrustManager;)Lokhttp3/internal/platform/android/AndroidCertificateChainCleaner; +Lokhttp3/internal/platform/android/AndroidLog; +SPLokhttp3/internal/platform/android/AndroidLog;->()V +SPLokhttp3/internal/platform/android/AndroidLog;->()V +SPLokhttp3/internal/platform/android/AndroidLog;->enable()V +SPLokhttp3/internal/platform/android/AndroidLog;->enableLogging(Ljava/lang/String;Ljava/lang/String;)V +Lokhttp3/internal/platform/android/AndroidLogHandler; +SPLokhttp3/internal/platform/android/AndroidLogHandler;->()V +SPLokhttp3/internal/platform/android/AndroidLogHandler;->()V +Lokhttp3/internal/platform/android/AndroidSocketAdapter; +SPLokhttp3/internal/platform/android/AndroidSocketAdapter;->()V +SPLokhttp3/internal/platform/android/AndroidSocketAdapter;->access$getPlayProviderFactory$cp()Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; +Lokhttp3/internal/platform/android/AndroidSocketAdapter$Companion; +SPLokhttp3/internal/platform/android/AndroidSocketAdapter$Companion;->()V +SPLokhttp3/internal/platform/android/AndroidSocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/internal/platform/android/AndroidSocketAdapter$Companion;->factory(Ljava/lang/String;)Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; +SPLokhttp3/internal/platform/android/AndroidSocketAdapter$Companion;->getPlayProviderFactory()Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; +Lokhttp3/internal/platform/android/AndroidSocketAdapter$Companion$factory$1; +SPLokhttp3/internal/platform/android/AndroidSocketAdapter$Companion$factory$1;->(Ljava/lang/String;)V +Lokhttp3/internal/platform/android/BouncyCastleSocketAdapter; +SPLokhttp3/internal/platform/android/BouncyCastleSocketAdapter;->()V +SPLokhttp3/internal/platform/android/BouncyCastleSocketAdapter;->access$getFactory$cp()Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; +Lokhttp3/internal/platform/android/BouncyCastleSocketAdapter$Companion; +SPLokhttp3/internal/platform/android/BouncyCastleSocketAdapter$Companion;->()V +SPLokhttp3/internal/platform/android/BouncyCastleSocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/internal/platform/android/BouncyCastleSocketAdapter$Companion;->getFactory()Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; +Lokhttp3/internal/platform/android/BouncyCastleSocketAdapter$Companion$factory$1; +SPLokhttp3/internal/platform/android/BouncyCastleSocketAdapter$Companion$factory$1;->()V +Lokhttp3/internal/platform/android/ConscryptSocketAdapter; +SPLokhttp3/internal/platform/android/ConscryptSocketAdapter;->()V +SPLokhttp3/internal/platform/android/ConscryptSocketAdapter;->access$getFactory$cp()Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; +Lokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion; +SPLokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion;->()V +SPLokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion;->getFactory()Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; +Lokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion$factory$1; +SPLokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion$factory$1;->()V +Lokhttp3/internal/platform/android/DeferredSocketAdapter; +SPLokhttp3/internal/platform/android/DeferredSocketAdapter;->(Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory;)V +SPLokhttp3/internal/platform/android/DeferredSocketAdapter;->isSupported()Z +Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; +Lokhttp3/internal/platform/android/SocketAdapter; +Lokhttp3/internal/tls/CertificateChainCleaner; +SPLokhttp3/internal/tls/CertificateChainCleaner;->()V +SPLokhttp3/internal/tls/CertificateChainCleaner;->()V +Lokhttp3/internal/tls/CertificateChainCleaner$Companion; +SPLokhttp3/internal/tls/CertificateChainCleaner$Companion;->()V +SPLokhttp3/internal/tls/CertificateChainCleaner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLokhttp3/internal/tls/CertificateChainCleaner$Companion;->get(Ljavax/net/ssl/X509TrustManager;)Lokhttp3/internal/tls/CertificateChainCleaner; +Lokhttp3/internal/tls/OkHostnameVerifier; +SPLokhttp3/internal/tls/OkHostnameVerifier;->()V +SPLokhttp3/internal/tls/OkHostnameVerifier;->()V +Lorg/acra/ACRA; +SPLorg/acra/ACRA;->()V +SPLorg/acra/ACRA;->()V +SPLorg/acra/ACRA;->currentProcessName()Ljava/lang/String; +SPLorg/acra/ACRA;->getErrorReporter()Lorg/acra/ErrorReporter; +SPLorg/acra/ACRA;->init$default(Landroid/app/Application;Lorg/acra/config/CoreConfigurationBuilder;ZILjava/lang/Object;)V +SPLorg/acra/ACRA;->init(Landroid/app/Application;Lorg/acra/config/CoreConfiguration;Z)V +SPLorg/acra/ACRA;->init(Landroid/app/Application;Lorg/acra/config/CoreConfigurationBuilder;Z)V +SPLorg/acra/ACRA;->isACRASenderServiceProcess()Z +SPLorg/acra/ACRA;->isInitialised()Z +Lorg/acra/ErrorReporter; +Lorg/acra/ReportField; +SPLorg/acra/ReportField;->$values()[Lorg/acra/ReportField; +SPLorg/acra/ReportField;->()V +SPLorg/acra/ReportField;->(Ljava/lang/String;I)V +Lorg/acra/attachment/AttachmentUriProvider; +Lorg/acra/attachment/DefaultAttachmentProvider; +Lorg/acra/builder/LastActivityManager; +SPLorg/acra/builder/LastActivityManager;->(Landroid/app/Application;)V +SPLorg/acra/builder/LastActivityManager;->access$getActivityStack$p(Lorg/acra/builder/LastActivityManager;)Lorg/acra/collections/WeakStack; +SPLorg/acra/builder/LastActivityManager;->access$getDestroyedCondition$p(Lorg/acra/builder/LastActivityManager;)Ljava/util/concurrent/locks/Condition; +SPLorg/acra/builder/LastActivityManager;->access$getLock$p(Lorg/acra/builder/LastActivityManager;)Ljava/util/concurrent/locks/ReentrantLock; +Lorg/acra/builder/LastActivityManager$1; +SPLorg/acra/builder/LastActivityManager$1;->(Lorg/acra/builder/LastActivityManager;)V +SPLorg/acra/builder/LastActivityManager$1;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLorg/acra/builder/LastActivityManager$1;->onActivityDestroyed(Landroid/app/Activity;)V +SPLorg/acra/builder/LastActivityManager$1;->onActivityResumed(Landroid/app/Activity;)V +SPLorg/acra/builder/LastActivityManager$1;->onActivityStarted(Landroid/app/Activity;)V +Lorg/acra/builder/ReportExecutor; +SPLorg/acra/builder/ReportExecutor;->(Landroid/content/Context;Lorg/acra/config/CoreConfiguration;Lorg/acra/data/CrashReportDataFactory;Ljava/lang/Thread$UncaughtExceptionHandler;Lorg/acra/util/ProcessFinisher;Lorg/acra/scheduler/SchedulerStarter;Lorg/acra/builder/LastActivityManager;)V +SPLorg/acra/builder/ReportExecutor;->setEnabled(Z)V +Lorg/acra/collections/WeakStack; +SPLorg/acra/collections/WeakStack;->()V +SPLorg/acra/collections/WeakStack;->add(Ljava/lang/Object;)Z +SPLorg/acra/collections/WeakStack;->remove(Ljava/lang/Object;)Z +Lorg/acra/collector/ApplicationStartupCollector; +Lorg/acra/collector/BaseReportFieldCollector; +SPLorg/acra/collector/BaseReportFieldCollector;->([Lorg/acra/ReportField;)V +Lorg/acra/collector/Collector; +SPLorg/acra/collector/Collector;->getOrder()Lorg/acra/collector/Collector$Order; +Lorg/acra/collector/Collector$Order; +SPLorg/acra/collector/Collector$Order;->$values()[Lorg/acra/collector/Collector$Order; +SPLorg/acra/collector/Collector$Order;->()V +SPLorg/acra/collector/Collector$Order;->(Ljava/lang/String;I)V +Lorg/acra/collector/CollectorException; +Lorg/acra/collector/ConfigurationCollector; +SPLorg/acra/collector/ConfigurationCollector;->()V +SPLorg/acra/collector/ConfigurationCollector;->()V +SPLorg/acra/collector/ConfigurationCollector;->collectApplicationStartUp(Landroid/content/Context;Lorg/acra/config/CoreConfiguration;)V +Lorg/acra/collector/ConfigurationCollector$Companion; +SPLorg/acra/collector/ConfigurationCollector$Companion;->()V +SPLorg/acra/collector/ConfigurationCollector$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/collector/CustomDataCollector; +SPLorg/acra/collector/CustomDataCollector;->()V +Lorg/acra/collector/DeviceFeaturesCollector; +SPLorg/acra/collector/DeviceFeaturesCollector;->()V +Lorg/acra/collector/DeviceIdCollector; +SPLorg/acra/collector/DeviceIdCollector;->()V +Lorg/acra/collector/DisplayManagerCollector; +SPLorg/acra/collector/DisplayManagerCollector;->()V +Lorg/acra/collector/DropBoxCollector; +SPLorg/acra/collector/DropBoxCollector;->()V +SPLorg/acra/collector/DropBoxCollector;->()V +SPLorg/acra/collector/DropBoxCollector;->getOrder()Lorg/acra/collector/Collector$Order; +Lorg/acra/collector/DropBoxCollector$Companion; +SPLorg/acra/collector/DropBoxCollector$Companion;->()V +SPLorg/acra/collector/DropBoxCollector$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/collector/LogCatCollector; +SPLorg/acra/collector/LogCatCollector;->()V +SPLorg/acra/collector/LogCatCollector;->()V +SPLorg/acra/collector/LogCatCollector;->getOrder()Lorg/acra/collector/Collector$Order; +Lorg/acra/collector/LogCatCollector$Companion; +SPLorg/acra/collector/LogCatCollector$Companion;->()V +SPLorg/acra/collector/LogCatCollector$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/collector/LogFileCollector; +SPLorg/acra/collector/LogFileCollector;->()V +SPLorg/acra/collector/LogFileCollector;->getOrder()Lorg/acra/collector/Collector$Order; +Lorg/acra/collector/MediaCodecListCollector; +SPLorg/acra/collector/MediaCodecListCollector;->()V +SPLorg/acra/collector/MediaCodecListCollector;->()V +SPLorg/acra/collector/MediaCodecListCollector;->getOrder()Lorg/acra/collector/Collector$Order; +Lorg/acra/collector/MediaCodecListCollector$Companion; +SPLorg/acra/collector/MediaCodecListCollector$Companion;->()V +SPLorg/acra/collector/MediaCodecListCollector$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/collector/MemoryInfoCollector; +SPLorg/acra/collector/MemoryInfoCollector;->()V +Lorg/acra/collector/PackageManagerCollector; +SPLorg/acra/collector/PackageManagerCollector;->()V +Lorg/acra/collector/ReflectionCollector; +SPLorg/acra/collector/ReflectionCollector;->()V +SPLorg/acra/collector/ReflectionCollector;->()V +Lorg/acra/collector/ReflectionCollector$Companion; +SPLorg/acra/collector/ReflectionCollector$Companion;->()V +SPLorg/acra/collector/ReflectionCollector$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/collector/SettingsCollector; +SPLorg/acra/collector/SettingsCollector;->()V +SPLorg/acra/collector/SettingsCollector;->()V +Lorg/acra/collector/SettingsCollector$Companion; +SPLorg/acra/collector/SettingsCollector$Companion;->()V +SPLorg/acra/collector/SettingsCollector$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/collector/SharedPreferencesCollector; +SPLorg/acra/collector/SharedPreferencesCollector;->()V +Lorg/acra/collector/SimpleValuesCollector; +SPLorg/acra/collector/SimpleValuesCollector;->()V +SPLorg/acra/collector/SimpleValuesCollector;->()V +Lorg/acra/collector/SimpleValuesCollector$Companion; +SPLorg/acra/collector/SimpleValuesCollector$Companion;->()V +SPLorg/acra/collector/SimpleValuesCollector$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/collector/StacktraceCollector; +SPLorg/acra/collector/StacktraceCollector;->()V +SPLorg/acra/collector/StacktraceCollector;->getOrder()Lorg/acra/collector/Collector$Order; +Lorg/acra/collector/ThreadCollector; +SPLorg/acra/collector/ThreadCollector;->()V +SPLorg/acra/collector/ThreadCollector;->getOrder()Lorg/acra/collector/Collector$Order; +Lorg/acra/collector/TimeCollector; +SPLorg/acra/collector/TimeCollector;->()V +SPLorg/acra/collector/TimeCollector;->collectApplicationStartUp(Landroid/content/Context;Lorg/acra/config/CoreConfiguration;)V +Lorg/acra/config/ACRAConfigurationException; +Lorg/acra/config/ConfigUtils; +SPLorg/acra/config/ConfigUtils;->findPluginConfiguration(Lorg/acra/config/CoreConfiguration;Ljava/lang/Class;)Lorg/acra/config/Configuration; +SPLorg/acra/config/ConfigUtils;->getPluginConfiguration(Lorg/acra/config/CoreConfiguration;Ljava/lang/Class;)Lorg/acra/config/Configuration; +Lorg/acra/config/Configuration; +Lorg/acra/config/CoreConfiguration; +SPLorg/acra/config/CoreConfiguration;->(Ljava/lang/String;ZLjava/util/List;ILjava/util/List;Ljava/util/List;ZZLjava/util/List;ZZZLjava/util/List;Ljava/util/List;Ljava/lang/Class;Ljava/lang/String;ILorg/acra/file/Directory;Ljava/lang/Class;ZLjava/util/List;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Lorg/acra/data/StringFormat;ZLorg/acra/plugins/PluginLoader;Ljava/util/List;)V +SPLorg/acra/config/CoreConfiguration;->(Ljava/lang/String;ZLjava/util/List;ILjava/util/List;Ljava/util/List;ZZLjava/util/List;ZZZLjava/util/List;Ljava/util/List;Ljava/lang/Class;Ljava/lang/String;ILorg/acra/file/Directory;Ljava/lang/Class;ZLjava/util/List;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Lorg/acra/data/StringFormat;ZLorg/acra/plugins/PluginLoader;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLorg/acra/config/CoreConfiguration;->getDeleteUnapprovedReportsOnApplicationStart()Z +SPLorg/acra/config/CoreConfiguration;->getPluginConfigurations()Ljava/util/List; +SPLorg/acra/config/CoreConfiguration;->getPluginLoader()Lorg/acra/plugins/PluginLoader; +SPLorg/acra/config/CoreConfiguration;->getReportContent()Ljava/util/List; +SPLorg/acra/config/CoreConfiguration;->getSharedPreferencesName()Ljava/lang/String; +Lorg/acra/config/CoreConfigurationBuilder; +SPLorg/acra/config/CoreConfigurationBuilder;->()V +SPLorg/acra/config/CoreConfigurationBuilder;->()V +SPLorg/acra/config/CoreConfigurationBuilder;->access$get_defaultsBitField0$p(Lorg/acra/config/CoreConfigurationBuilder;)I +SPLorg/acra/config/CoreConfigurationBuilder;->access$set_defaultsBitField0$p(Lorg/acra/config/CoreConfigurationBuilder;I)V +SPLorg/acra/config/CoreConfigurationBuilder;->build()Lorg/acra/config/CoreConfiguration; +SPLorg/acra/config/CoreConfigurationBuilder;->getAdditionalDropBoxTags()Ljava/util/List; +SPLorg/acra/config/CoreConfigurationBuilder;->getAdditionalSharedPreferences()Ljava/util/List; +SPLorg/acra/config/CoreConfigurationBuilder;->getAlsoReportToAndroidFramework()Ljava/lang/Boolean; +SPLorg/acra/config/CoreConfigurationBuilder;->getApplicationLogFile()Ljava/lang/String; +SPLorg/acra/config/CoreConfigurationBuilder;->getApplicationLogFileDir()Lorg/acra/file/Directory; +SPLorg/acra/config/CoreConfigurationBuilder;->getApplicationLogFileLines()Ljava/lang/Integer; +SPLorg/acra/config/CoreConfigurationBuilder;->getAttachmentUriProvider()Ljava/lang/Class; +SPLorg/acra/config/CoreConfigurationBuilder;->getAttachmentUris()Ljava/util/List; +SPLorg/acra/config/CoreConfigurationBuilder;->getBuildConfigClass()Ljava/lang/Class; +SPLorg/acra/config/CoreConfigurationBuilder;->getDeleteUnapprovedReportsOnApplicationStart()Ljava/lang/Boolean; +SPLorg/acra/config/CoreConfigurationBuilder;->getDropboxCollectionMinutes()Ljava/lang/Integer; +SPLorg/acra/config/CoreConfigurationBuilder;->getExcludeMatchingSettingsKeys()Ljava/util/List; +SPLorg/acra/config/CoreConfigurationBuilder;->getExcludeMatchingSharedPreferencesKeys()Ljava/util/List; +SPLorg/acra/config/CoreConfigurationBuilder;->getIncludeDropBoxSystemTags()Ljava/lang/Boolean; +SPLorg/acra/config/CoreConfigurationBuilder;->getLogcatArguments()Ljava/util/List; +SPLorg/acra/config/CoreConfigurationBuilder;->getLogcatFilterByPid()Ljava/lang/Boolean; +SPLorg/acra/config/CoreConfigurationBuilder;->getLogcatReadNonBlocking()Ljava/lang/Boolean; +SPLorg/acra/config/CoreConfigurationBuilder;->getParallel()Ljava/lang/Boolean; +SPLorg/acra/config/CoreConfigurationBuilder;->getPluginConfigurations()Ljava/util/List; +SPLorg/acra/config/CoreConfigurationBuilder;->getPluginLoader()Lorg/acra/plugins/PluginLoader; +SPLorg/acra/config/CoreConfigurationBuilder;->getReportContent()Ljava/util/List; +SPLorg/acra/config/CoreConfigurationBuilder;->getReportFormat()Lorg/acra/data/StringFormat; +SPLorg/acra/config/CoreConfigurationBuilder;->getReportSendFailureToast()Ljava/lang/String; +SPLorg/acra/config/CoreConfigurationBuilder;->getReportSendSuccessToast()Ljava/lang/String; +SPLorg/acra/config/CoreConfigurationBuilder;->getRetryPolicyClass()Ljava/lang/Class; +SPLorg/acra/config/CoreConfigurationBuilder;->getSendReportsInDevMode()Ljava/lang/Boolean; +SPLorg/acra/config/CoreConfigurationBuilder;->getSharedPreferencesName()Ljava/lang/String; +SPLorg/acra/config/CoreConfigurationBuilder;->getStopServicesOnCrash()Ljava/lang/Boolean; +SPLorg/acra/config/CoreConfigurationBuilder;->setBuildConfigClass(Ljava/lang/Class;)V +SPLorg/acra/config/CoreConfigurationBuilder;->setExcludeMatchingSharedPreferencesKeys(Ljava/util/List;)V +SPLorg/acra/config/CoreConfigurationBuilder;->setLogcatArguments(Ljava/util/List;)V +SPLorg/acra/config/CoreConfigurationBuilder;->setPluginConfigurations(Ljava/util/List;)V +SPLorg/acra/config/CoreConfigurationBuilder;->setReportContent(Ljava/util/List;)V +SPLorg/acra/config/CoreConfigurationBuilder;->setSharedPreferencesName(Ljava/lang/String;)V +SPLorg/acra/config/CoreConfigurationBuilder;->withBuildConfigClass(Ljava/lang/Class;)Lorg/acra/config/CoreConfigurationBuilder; +SPLorg/acra/config/CoreConfigurationBuilder;->withExcludeMatchingSharedPreferencesKeys([Ljava/lang/String;)Lorg/acra/config/CoreConfigurationBuilder; +SPLorg/acra/config/CoreConfigurationBuilder;->withLogcatArguments([Ljava/lang/String;)Lorg/acra/config/CoreConfigurationBuilder; +SPLorg/acra/config/CoreConfigurationBuilder;->withPluginConfigurations([Lorg/acra/config/Configuration;)Lorg/acra/config/CoreConfigurationBuilder; +SPLorg/acra/config/CoreConfigurationBuilder;->withReportContent([Lorg/acra/ReportField;)Lorg/acra/config/CoreConfigurationBuilder; +SPLorg/acra/config/CoreConfigurationBuilder;->withSharedPreferencesName(Ljava/lang/String;)Lorg/acra/config/CoreConfigurationBuilder; +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$1; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$1;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$1;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$10; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$10;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$11; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$11;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$12; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$12;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$13; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$13;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$13;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$14; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$14;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$15; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$15;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$15;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$16; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$16;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$17; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$17;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$18; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$18;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$19; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$19;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$2; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$2;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$20; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$20;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$21; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$21;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$22; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$22;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$23; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$23;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$24; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$24;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$25; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$25;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$26; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$26;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$27; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$27;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$28; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$28;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$28;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$3; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$3;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$4; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$4;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$5; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$5;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$5;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$6; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$6;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$6;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$7; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$7;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$8; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$8;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$9; +SPLorg/acra/config/CoreConfigurationBuilder$special$$inlined$observable$9;->(Ljava/lang/Object;Lorg/acra/config/CoreConfigurationBuilder;)V +Lorg/acra/config/DefaultRetryPolicy; +Lorg/acra/config/DialogConfiguration; +SPLorg/acra/config/DialogConfiguration;->(ZLjava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;)V +SPLorg/acra/config/DialogConfiguration;->(ZLjava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/config/DialogConfigurationBuilder; +SPLorg/acra/config/DialogConfigurationBuilder;->()V +SPLorg/acra/config/DialogConfigurationBuilder;->()V +SPLorg/acra/config/DialogConfigurationBuilder;->access$get_defaultsBitField0$p(Lorg/acra/config/DialogConfigurationBuilder;)I +SPLorg/acra/config/DialogConfigurationBuilder;->access$set_defaultsBitField0$p(Lorg/acra/config/DialogConfigurationBuilder;I)V +SPLorg/acra/config/DialogConfigurationBuilder;->build()Lorg/acra/config/DialogConfiguration; +SPLorg/acra/config/DialogConfigurationBuilder;->getCommentPrompt()Ljava/lang/String; +SPLorg/acra/config/DialogConfigurationBuilder;->getEmailPrompt()Ljava/lang/String; +SPLorg/acra/config/DialogConfigurationBuilder;->getEnabled()Ljava/lang/Boolean; +SPLorg/acra/config/DialogConfigurationBuilder;->getNegativeButtonText()Ljava/lang/String; +SPLorg/acra/config/DialogConfigurationBuilder;->getPositiveButtonText()Ljava/lang/String; +SPLorg/acra/config/DialogConfigurationBuilder;->getReportDialogClass()Ljava/lang/Class; +SPLorg/acra/config/DialogConfigurationBuilder;->getResIcon()Ljava/lang/Integer; +SPLorg/acra/config/DialogConfigurationBuilder;->getResTheme()Ljava/lang/Integer; +SPLorg/acra/config/DialogConfigurationBuilder;->getText()Ljava/lang/String; +SPLorg/acra/config/DialogConfigurationBuilder;->getTitle()Ljava/lang/String; +SPLorg/acra/config/DialogConfigurationBuilder;->setCommentPrompt(Ljava/lang/String;)V +SPLorg/acra/config/DialogConfigurationBuilder;->setEnabled(Ljava/lang/Boolean;)V +SPLorg/acra/config/DialogConfigurationBuilder;->setPositiveButtonText(Ljava/lang/String;)V +SPLorg/acra/config/DialogConfigurationBuilder;->setReportDialogClass(Ljava/lang/Class;)V +SPLorg/acra/config/DialogConfigurationBuilder;->setResIcon(Ljava/lang/Integer;)V +SPLorg/acra/config/DialogConfigurationBuilder;->setText(Ljava/lang/String;)V +SPLorg/acra/config/DialogConfigurationBuilder;->setTitle(Ljava/lang/String;)V +SPLorg/acra/config/DialogConfigurationBuilder;->withCommentPrompt(Ljava/lang/String;)Lorg/acra/config/DialogConfigurationBuilder; +SPLorg/acra/config/DialogConfigurationBuilder;->withEnabled(Z)Lorg/acra/config/DialogConfigurationBuilder; +SPLorg/acra/config/DialogConfigurationBuilder;->withPositiveButtonText(Ljava/lang/String;)Lorg/acra/config/DialogConfigurationBuilder; +SPLorg/acra/config/DialogConfigurationBuilder;->withReportDialogClass(Ljava/lang/Class;)Lorg/acra/config/DialogConfigurationBuilder; +SPLorg/acra/config/DialogConfigurationBuilder;->withResIcon(Ljava/lang/Integer;)Lorg/acra/config/DialogConfigurationBuilder; +SPLorg/acra/config/DialogConfigurationBuilder;->withText(Ljava/lang/String;)Lorg/acra/config/DialogConfigurationBuilder; +SPLorg/acra/config/DialogConfigurationBuilder;->withTitle(Ljava/lang/String;)Lorg/acra/config/DialogConfigurationBuilder; +Lorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$1; +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$1;->(Ljava/lang/Object;Lorg/acra/config/DialogConfigurationBuilder;)V +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$1;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$10; +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$10;->(Ljava/lang/Object;Lorg/acra/config/DialogConfigurationBuilder;)V +Lorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$2; +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$2;->(Ljava/lang/Object;Lorg/acra/config/DialogConfigurationBuilder;)V +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$2;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$3; +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$3;->(Ljava/lang/Object;Lorg/acra/config/DialogConfigurationBuilder;)V +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$3;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$4; +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$4;->(Ljava/lang/Object;Lorg/acra/config/DialogConfigurationBuilder;)V +Lorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$5; +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$5;->(Ljava/lang/Object;Lorg/acra/config/DialogConfigurationBuilder;)V +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$5;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$6; +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$6;->(Ljava/lang/Object;Lorg/acra/config/DialogConfigurationBuilder;)V +Lorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$7; +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$7;->(Ljava/lang/Object;Lorg/acra/config/DialogConfigurationBuilder;)V +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$7;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$8; +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$8;->(Ljava/lang/Object;Lorg/acra/config/DialogConfigurationBuilder;)V +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$8;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$9; +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$9;->(Ljava/lang/Object;Lorg/acra/config/DialogConfigurationBuilder;)V +SPLorg/acra/config/DialogConfigurationBuilder$special$$inlined$observable$9;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/HttpSenderConfiguration; +SPLorg/acra/config/HttpSenderConfiguration;->(ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/acra/sender/HttpSender$Method;IIZLjava/lang/Class;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ZZLjava/util/List;Ljava/util/Map;)V +SPLorg/acra/config/HttpSenderConfiguration;->(ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/acra/sender/HttpSender$Method;IIZLjava/lang/Class;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ZZLjava/util/List;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/config/HttpSenderConfigurationBuilder; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->()V +SPLorg/acra/config/HttpSenderConfigurationBuilder;->()V +SPLorg/acra/config/HttpSenderConfigurationBuilder;->access$get_defaultsBitField0$p(Lorg/acra/config/HttpSenderConfigurationBuilder;)I +SPLorg/acra/config/HttpSenderConfigurationBuilder;->access$set_defaultsBitField0$p(Lorg/acra/config/HttpSenderConfigurationBuilder;I)V +SPLorg/acra/config/HttpSenderConfigurationBuilder;->build()Lorg/acra/config/HttpSenderConfiguration; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getBasicAuthLogin()Ljava/lang/String; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getBasicAuthPassword()Ljava/lang/String; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getCertificatePath()Ljava/lang/String; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getCertificateType()Ljava/lang/String; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getChunked()Ljava/lang/Boolean; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getCompress()Ljava/lang/Boolean; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getConnectionTimeout()Ljava/lang/Integer; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getDropReportsOnTimeout()Ljava/lang/Boolean; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getEnabled()Ljava/lang/Boolean; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getHttpHeaders()Ljava/util/Map; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getHttpMethod()Lorg/acra/sender/HttpSender$Method; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getKeyStoreFactoryClass()Ljava/lang/Class; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getResCertificate()Ljava/lang/Integer; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getSocketTimeout()Ljava/lang/Integer; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->getTlsProtocols()Ljava/util/List; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->setEnabled(Ljava/lang/Boolean;)V +SPLorg/acra/config/HttpSenderConfigurationBuilder;->setHttpMethod(Lorg/acra/sender/HttpSender$Method;)V +SPLorg/acra/config/HttpSenderConfigurationBuilder;->withEnabled(Z)Lorg/acra/config/HttpSenderConfigurationBuilder; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->withHttpMethod(Lorg/acra/sender/HttpSender$Method;)Lorg/acra/config/HttpSenderConfigurationBuilder; +SPLorg/acra/config/HttpSenderConfigurationBuilder;->withUri(Ljava/lang/String;)Lorg/acra/config/HttpSenderConfigurationBuilder; +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$1; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$1;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$1;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$10; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$10;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$11; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$11;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$12; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$12;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$13; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$13;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$14; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$14;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$15; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$15;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$2; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$2;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$3; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$3;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$4; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$4;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$4;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$5; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$5;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$6; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$6;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$7; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$7;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$8; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$8;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +Lorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$9; +SPLorg/acra/config/HttpSenderConfigurationBuilder$special$$inlined$observable$9;->(Ljava/lang/Object;Lorg/acra/config/HttpSenderConfigurationBuilder;)V +Lorg/acra/config/LimiterConfiguration; +SPLorg/acra/config/LimiterConfiguration;->(ZLjava/util/concurrent/TimeUnit;JIIIILjava/lang/String;ZZ)V +SPLorg/acra/config/LimiterConfiguration;->(ZLjava/util/concurrent/TimeUnit;JIIIILjava/lang/String;ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLorg/acra/config/LimiterConfiguration;->enabled()Z +SPLorg/acra/config/LimiterConfiguration;->getDeleteReportsOnAppUpdate()Z +Lorg/acra/config/LimiterConfigurationBuilder; +SPLorg/acra/config/LimiterConfigurationBuilder;->()V +SPLorg/acra/config/LimiterConfigurationBuilder;->()V +SPLorg/acra/config/LimiterConfigurationBuilder;->access$get_defaultsBitField0$p(Lorg/acra/config/LimiterConfigurationBuilder;)I +SPLorg/acra/config/LimiterConfigurationBuilder;->access$set_defaultsBitField0$p(Lorg/acra/config/LimiterConfigurationBuilder;I)V +SPLorg/acra/config/LimiterConfigurationBuilder;->build()Lorg/acra/config/LimiterConfiguration; +SPLorg/acra/config/LimiterConfigurationBuilder;->getDeleteReportsOnAppUpdate()Ljava/lang/Boolean; +SPLorg/acra/config/LimiterConfigurationBuilder;->getEnabled()Ljava/lang/Boolean; +SPLorg/acra/config/LimiterConfigurationBuilder;->getExceptionClassLimit()Ljava/lang/Integer; +SPLorg/acra/config/LimiterConfigurationBuilder;->getFailedReportLimit()Ljava/lang/Integer; +SPLorg/acra/config/LimiterConfigurationBuilder;->getIgnoredCrashToast()Ljava/lang/String; +SPLorg/acra/config/LimiterConfigurationBuilder;->getOverallLimit()Ljava/lang/Integer; +SPLorg/acra/config/LimiterConfigurationBuilder;->getPeriod()Ljava/lang/Long; +SPLorg/acra/config/LimiterConfigurationBuilder;->getPeriodUnit()Ljava/util/concurrent/TimeUnit; +SPLorg/acra/config/LimiterConfigurationBuilder;->getResetLimitsOnAppUpdate()Ljava/lang/Boolean; +SPLorg/acra/config/LimiterConfigurationBuilder;->getStacktraceLimit()Ljava/lang/Integer; +SPLorg/acra/config/LimiterConfigurationBuilder;->setDeleteReportsOnAppUpdate(Ljava/lang/Boolean;)V +SPLorg/acra/config/LimiterConfigurationBuilder;->setEnabled(Ljava/lang/Boolean;)V +SPLorg/acra/config/LimiterConfigurationBuilder;->setExceptionClassLimit(Ljava/lang/Integer;)V +SPLorg/acra/config/LimiterConfigurationBuilder;->setResetLimitsOnAppUpdate(Ljava/lang/Boolean;)V +SPLorg/acra/config/LimiterConfigurationBuilder;->setStacktraceLimit(Ljava/lang/Integer;)V +SPLorg/acra/config/LimiterConfigurationBuilder;->withDeleteReportsOnAppUpdate(Z)Lorg/acra/config/LimiterConfigurationBuilder; +SPLorg/acra/config/LimiterConfigurationBuilder;->withEnabled(Z)Lorg/acra/config/LimiterConfigurationBuilder; +SPLorg/acra/config/LimiterConfigurationBuilder;->withExceptionClassLimit(I)Lorg/acra/config/LimiterConfigurationBuilder; +SPLorg/acra/config/LimiterConfigurationBuilder;->withResetLimitsOnAppUpdate(Z)Lorg/acra/config/LimiterConfigurationBuilder; +SPLorg/acra/config/LimiterConfigurationBuilder;->withStacktraceLimit(I)Lorg/acra/config/LimiterConfigurationBuilder; +Lorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$1; +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$1;->(Ljava/lang/Object;Lorg/acra/config/LimiterConfigurationBuilder;)V +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$1;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$10; +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$10;->(Ljava/lang/Object;Lorg/acra/config/LimiterConfigurationBuilder;)V +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$10;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$2; +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$2;->(Ljava/lang/Object;Lorg/acra/config/LimiterConfigurationBuilder;)V +Lorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$3; +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$3;->(Ljava/lang/Object;Lorg/acra/config/LimiterConfigurationBuilder;)V +Lorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$4; +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$4;->(Ljava/lang/Object;Lorg/acra/config/LimiterConfigurationBuilder;)V +Lorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$5; +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$5;->(Ljava/lang/Object;Lorg/acra/config/LimiterConfigurationBuilder;)V +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$5;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$6; +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$6;->(Ljava/lang/Object;Lorg/acra/config/LimiterConfigurationBuilder;)V +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$6;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$7; +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$7;->(Ljava/lang/Object;Lorg/acra/config/LimiterConfigurationBuilder;)V +Lorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$8; +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$8;->(Ljava/lang/Object;Lorg/acra/config/LimiterConfigurationBuilder;)V +Lorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$9; +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$9;->(Ljava/lang/Object;Lorg/acra/config/LimiterConfigurationBuilder;)V +SPLorg/acra/config/LimiterConfigurationBuilder$special$$inlined$observable$9;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/LimitingReportAdministrator; +SPLorg/acra/config/LimitingReportAdministrator;->()V +Lorg/acra/config/ReportingAdministrator; +Lorg/acra/config/RetryPolicy; +Lorg/acra/config/ToastConfiguration; +SPLorg/acra/config/ToastConfiguration;->(ZLjava/lang/String;I)V +SPLorg/acra/config/ToastConfiguration;->(ZLjava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/config/ToastConfigurationBuilder; +SPLorg/acra/config/ToastConfigurationBuilder;->()V +SPLorg/acra/config/ToastConfigurationBuilder;->()V +SPLorg/acra/config/ToastConfigurationBuilder;->access$get_defaultsBitField0$p(Lorg/acra/config/ToastConfigurationBuilder;)I +SPLorg/acra/config/ToastConfigurationBuilder;->access$set_defaultsBitField0$p(Lorg/acra/config/ToastConfigurationBuilder;I)V +SPLorg/acra/config/ToastConfigurationBuilder;->build()Lorg/acra/config/ToastConfiguration; +SPLorg/acra/config/ToastConfigurationBuilder;->getEnabled()Ljava/lang/Boolean; +SPLorg/acra/config/ToastConfigurationBuilder;->getLength()Ljava/lang/Integer; +SPLorg/acra/config/ToastConfigurationBuilder;->setEnabled(Ljava/lang/Boolean;)V +SPLorg/acra/config/ToastConfigurationBuilder;->withEnabled(Z)Lorg/acra/config/ToastConfigurationBuilder; +SPLorg/acra/config/ToastConfigurationBuilder;->withText(Ljava/lang/String;)Lorg/acra/config/ToastConfigurationBuilder; +Lorg/acra/config/ToastConfigurationBuilder$special$$inlined$observable$1; +SPLorg/acra/config/ToastConfigurationBuilder$special$$inlined$observable$1;->(Ljava/lang/Object;Lorg/acra/config/ToastConfigurationBuilder;)V +SPLorg/acra/config/ToastConfigurationBuilder$special$$inlined$observable$1;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V +Lorg/acra/config/ToastConfigurationBuilder$special$$inlined$observable$2; +SPLorg/acra/config/ToastConfigurationBuilder$special$$inlined$observable$2;->(Ljava/lang/Object;Lorg/acra/config/ToastConfigurationBuilder;)V +Lorg/acra/data/CrashReportDataFactory; +SPLorg/acra/data/CrashReportDataFactory;->(Landroid/content/Context;Lorg/acra/config/CoreConfiguration;)V +SPLorg/acra/data/CrashReportDataFactory;->access$getSafeOrder(Lorg/acra/data/CrashReportDataFactory;Lorg/acra/collector/Collector;)Lorg/acra/collector/Collector$Order; +SPLorg/acra/data/CrashReportDataFactory;->collectStartUp()V +SPLorg/acra/data/CrashReportDataFactory;->getSafeOrder(Lorg/acra/collector/Collector;)Lorg/acra/collector/Collector$Order; +Lorg/acra/data/CrashReportDataFactory$special$$inlined$sortedBy$1; +SPLorg/acra/data/CrashReportDataFactory$special$$inlined$sortedBy$1;->(Lorg/acra/data/CrashReportDataFactory;)V +SPLorg/acra/data/CrashReportDataFactory$special$$inlined$sortedBy$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I +Lorg/acra/data/StringFormat; +SPLorg/acra/data/StringFormat;->$values()[Lorg/acra/data/StringFormat; +SPLorg/acra/data/StringFormat;->()V +SPLorg/acra/data/StringFormat;->(Ljava/lang/String;ILjava/lang/String;)V +SPLorg/acra/data/StringFormat;->(Ljava/lang/String;ILjava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/data/StringFormat$JSON; +SPLorg/acra/data/StringFormat$JSON;->(Ljava/lang/String;I)V +Lorg/acra/data/StringFormat$KEY_VALUE_LIST; +SPLorg/acra/data/StringFormat$KEY_VALUE_LIST;->(Ljava/lang/String;I)V +Lorg/acra/dialog/CrashReportDialog; +Lorg/acra/file/CrashReportFileNameParser; +SPLorg/acra/file/CrashReportFileNameParser;->()V +Lorg/acra/file/Directory; +SPLorg/acra/file/Directory;->$values()[Lorg/acra/file/Directory; +SPLorg/acra/file/Directory;->()V +SPLorg/acra/file/Directory;->(Ljava/lang/String;I)V +SPLorg/acra/file/Directory;->(Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/file/Directory$CACHE; +SPLorg/acra/file/Directory$CACHE;->(Ljava/lang/String;I)V +Lorg/acra/file/Directory$EXTERNAL_CACHE; +SPLorg/acra/file/Directory$EXTERNAL_CACHE;->(Ljava/lang/String;I)V +Lorg/acra/file/Directory$EXTERNAL_FILES; +SPLorg/acra/file/Directory$EXTERNAL_FILES;->(Ljava/lang/String;I)V +Lorg/acra/file/Directory$EXTERNAL_STORAGE; +SPLorg/acra/file/Directory$EXTERNAL_STORAGE;->(Ljava/lang/String;I)V +Lorg/acra/file/Directory$FILES; +SPLorg/acra/file/Directory$FILES;->(Ljava/lang/String;I)V +Lorg/acra/file/Directory$FILES_LEGACY; +SPLorg/acra/file/Directory$FILES_LEGACY;->(Ljava/lang/String;I)V +Lorg/acra/file/Directory$NO_BACKUP_FILES; +SPLorg/acra/file/Directory$NO_BACKUP_FILES;->(Ljava/lang/String;I)V +Lorg/acra/file/Directory$ROOT; +SPLorg/acra/file/Directory$ROOT;->(Ljava/lang/String;I)V +Lorg/acra/file/ReportLocator; +SPLorg/acra/file/ReportLocator;->()V +SPLorg/acra/file/ReportLocator;->(Landroid/content/Context;)V +SPLorg/acra/file/ReportLocator;->getApprovedFolder()Ljava/io/File; +SPLorg/acra/file/ReportLocator;->getApprovedReports()[Ljava/io/File; +SPLorg/acra/file/ReportLocator;->getUnapprovedFolder()Ljava/io/File; +SPLorg/acra/file/ReportLocator;->getUnapprovedReports()[Ljava/io/File; +Lorg/acra/file/ReportLocator$Companion; +SPLorg/acra/file/ReportLocator$Companion;->()V +SPLorg/acra/file/ReportLocator$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/file/ReportLocator$special$$inlined$sortedBy$1; +SPLorg/acra/file/ReportLocator$special$$inlined$sortedBy$1;->()V +Lorg/acra/log/ACRALog; +Lorg/acra/log/AndroidLogDelegate; +SPLorg/acra/log/AndroidLogDelegate;->()V +SPLorg/acra/log/AndroidLogDelegate;->i(Ljava/lang/String;Ljava/lang/String;)I +SPLorg/acra/log/AndroidLogDelegate;->w(Ljava/lang/String;Ljava/lang/String;)I +Lorg/acra/plugins/HasConfigPlugin; +SPLorg/acra/plugins/HasConfigPlugin;->(Ljava/lang/Class;)V +SPLorg/acra/plugins/HasConfigPlugin;->enabled(Lorg/acra/config/CoreConfiguration;)Z +Lorg/acra/plugins/Plugin; +SPLorg/acra/plugins/Plugin;->enabled(Lorg/acra/config/CoreConfiguration;)Z +Lorg/acra/plugins/PluginLoader; +Lorg/acra/plugins/ServicePluginLoader; +SPLorg/acra/plugins/ServicePluginLoader;->()V +SPLorg/acra/plugins/ServicePluginLoader;->loadEnabled$lambda$1(Lorg/acra/config/CoreConfiguration;Lorg/acra/plugins/Plugin;)Z +SPLorg/acra/plugins/ServicePluginLoader;->loadEnabled(Lorg/acra/config/CoreConfiguration;Ljava/lang/Class;)Ljava/util/List; +SPLorg/acra/plugins/ServicePluginLoader;->loadInternal(Ljava/lang/Class;Lkotlin/jvm/functions/Function1;)Ljava/util/List; +Lorg/acra/plugins/ServicePluginLoader$$ExternalSyntheticLambda1; +SPLorg/acra/plugins/ServicePluginLoader$$ExternalSyntheticLambda1;->(Lorg/acra/config/CoreConfiguration;)V +SPLorg/acra/plugins/ServicePluginLoader$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lorg/acra/prefs/SharedPreferencesFactory; +SPLorg/acra/prefs/SharedPreferencesFactory;->()V +SPLorg/acra/prefs/SharedPreferencesFactory;->(Landroid/content/Context;Lorg/acra/config/CoreConfiguration;)V +SPLorg/acra/prefs/SharedPreferencesFactory;->create()Landroid/content/SharedPreferences; +Lorg/acra/prefs/SharedPreferencesFactory$Companion; +SPLorg/acra/prefs/SharedPreferencesFactory$Companion;->()V +SPLorg/acra/prefs/SharedPreferencesFactory$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLorg/acra/prefs/SharedPreferencesFactory$Companion;->shouldEnableACRA(Landroid/content/SharedPreferences;)Z +Lorg/acra/reporter/ErrorReporterImpl; +SPLorg/acra/reporter/ErrorReporterImpl;->(Landroid/app/Application;Lorg/acra/config/CoreConfiguration;ZZZ)V +SPLorg/acra/reporter/ErrorReporterImpl;->putCustomData(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +SPLorg/acra/reporter/ErrorReporterImpl;->unregister()V +Lorg/acra/scheduler/DefaultSenderScheduler; +SPLorg/acra/scheduler/DefaultSenderScheduler;->(Landroid/content/Context;Lorg/acra/config/CoreConfiguration;)V +Lorg/acra/scheduler/SchedulerStarter; +SPLorg/acra/scheduler/SchedulerStarter;->(Landroid/content/Context;Lorg/acra/config/CoreConfiguration;)V +Lorg/acra/scheduler/SenderScheduler; +Lorg/acra/scheduler/SenderSchedulerFactory; +Lorg/acra/security/KeyStoreFactory; +Lorg/acra/security/NoKeyStoreFactory; +Lorg/acra/security/TLS; +SPLorg/acra/security/TLS;->$values()[Lorg/acra/security/TLS; +SPLorg/acra/security/TLS;->()V +SPLorg/acra/security/TLS;->(Ljava/lang/String;ILjava/lang/String;I)V +Lorg/acra/sender/HttpSender$Method; +SPLorg/acra/sender/HttpSender$Method;->$values()[Lorg/acra/sender/HttpSender$Method; +SPLorg/acra/sender/HttpSender$Method;->()V +SPLorg/acra/sender/HttpSender$Method;->(Ljava/lang/String;I)V +SPLorg/acra/sender/HttpSender$Method;->(Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/sender/HttpSender$Method$POST; +SPLorg/acra/sender/HttpSender$Method$POST;->(Ljava/lang/String;I)V +Lorg/acra/sender/HttpSender$Method$PUT; +SPLorg/acra/sender/HttpSender$Method$PUT;->(Ljava/lang/String;I)V +Lorg/acra/startup/LimiterStartupProcessor; +SPLorg/acra/startup/LimiterStartupProcessor;->()V +SPLorg/acra/startup/LimiterStartupProcessor;->getAppVersion(Landroid/content/Context;)J +SPLorg/acra/startup/LimiterStartupProcessor;->processReports(Landroid/content/Context;Lorg/acra/config/CoreConfiguration;Ljava/util/List;)V +Lorg/acra/startup/StartupProcessor; +Lorg/acra/startup/StartupProcessorExecutor; +SPLorg/acra/startup/StartupProcessorExecutor;->(Landroid/content/Context;Lorg/acra/config/CoreConfiguration;Lorg/acra/scheduler/SchedulerStarter;)V +SPLorg/acra/startup/StartupProcessorExecutor;->processReports$lambda$6$lambda$5(Lorg/acra/startup/StartupProcessorExecutor;Ljava/util/Calendar;Z)V +SPLorg/acra/startup/StartupProcessorExecutor;->processReports$lambda$6(Lorg/acra/startup/StartupProcessorExecutor;Ljava/util/Calendar;Z)V +SPLorg/acra/startup/StartupProcessorExecutor;->processReports(Z)V +Lorg/acra/startup/StartupProcessorExecutor$$ExternalSyntheticLambda0; +SPLorg/acra/startup/StartupProcessorExecutor$$ExternalSyntheticLambda0;->(Lorg/acra/startup/StartupProcessorExecutor;Ljava/util/Calendar;Z)V +SPLorg/acra/startup/StartupProcessorExecutor$$ExternalSyntheticLambda0;->run()V +Lorg/acra/startup/StartupProcessorExecutor$$ExternalSyntheticLambda1; +SPLorg/acra/startup/StartupProcessorExecutor$$ExternalSyntheticLambda1;->(Lorg/acra/startup/StartupProcessorExecutor;Ljava/util/Calendar;Z)V +SPLorg/acra/startup/StartupProcessorExecutor$$ExternalSyntheticLambda1;->run()V +Lorg/acra/startup/UnapprovedStartupProcessor; +SPLorg/acra/startup/UnapprovedStartupProcessor;->()V +SPLorg/acra/startup/UnapprovedStartupProcessor;->processReports(Landroid/content/Context;Lorg/acra/config/CoreConfiguration;Ljava/util/List;)V +Lorg/acra/util/Installation; +SPLorg/acra/util/Installation;->()V +SPLorg/acra/util/Installation;->()V +SPLorg/acra/util/Installation;->id(Landroid/content/Context;)Ljava/lang/String; +Lorg/acra/util/PackageManagerWrapper; +SPLorg/acra/util/PackageManagerWrapper;->(Landroid/content/Context;)V +SPLorg/acra/util/PackageManagerWrapper;->getPackageInfo()Landroid/content/pm/PackageInfo; +Lorg/acra/util/PackageManagerWrapperKt; +SPLorg/acra/util/PackageManagerWrapperKt;->getVersionCodeLong(Landroid/content/pm/PackageInfo;)J +Lorg/acra/util/ProcessFinisher; +SPLorg/acra/util/ProcessFinisher;->(Landroid/content/Context;Lorg/acra/config/CoreConfiguration;Lorg/acra/builder/LastActivityManager;)V +Lorg/acra/util/StreamReader; +SPLorg/acra/util/StreamReader;->()V +SPLorg/acra/util/StreamReader;->(Ljava/io/File;)V +SPLorg/acra/util/StreamReader;->(Ljava/io/InputStream;IILkotlin/jvm/functions/Function1;)V +SPLorg/acra/util/StreamReader;->(Ljava/io/InputStream;IILkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLorg/acra/util/StreamReader;->(Ljava/lang/String;)V +SPLorg/acra/util/StreamReader;->read()Ljava/lang/String; +SPLorg/acra/util/StreamReader;->readFully()Ljava/lang/String; +Lorg/acra/util/StreamReader$Companion; +SPLorg/acra/util/StreamReader$Companion;->()V +SPLorg/acra/util/StreamReader$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lorg/acra/util/StubCreator; +SPLorg/acra/util/StubCreator;->()V +SPLorg/acra/util/StubCreator;->()V +SPLorg/acra/util/StubCreator;->createErrorReporterStub()Lorg/acra/ErrorReporter; +SPLorg/acra/util/StubCreator;->createStub(Ljava/lang/Class;Ljava/lang/reflect/InvocationHandler;)Ljava/lang/Object; +Lorg/acra/util/StubCreator$$ExternalSyntheticLambda0; +SPLorg/acra/util/StubCreator$$ExternalSyntheticLambda0;->()V +Lorg/acra/util/SystemServices$ServiceNotReachedException; +Lorg/slf4j/ILoggerFactory; +Lorg/slf4j/IMarkerFactory; +Lorg/slf4j/Logger; +Lorg/slf4j/LoggerFactory; +SPLorg/slf4j/LoggerFactory;->()V +SPLorg/slf4j/LoggerFactory;->bind()V +SPLorg/slf4j/LoggerFactory;->earlyBindMDCAdapter()V +SPLorg/slf4j/LoggerFactory;->findServiceProviders()Ljava/util/List; +SPLorg/slf4j/LoggerFactory;->fixSubstituteLoggers()V +SPLorg/slf4j/LoggerFactory;->getILoggerFactory()Lorg/slf4j/ILoggerFactory; +SPLorg/slf4j/LoggerFactory;->getLogger(Ljava/lang/Class;)Lorg/slf4j/Logger; +SPLorg/slf4j/LoggerFactory;->getLogger(Ljava/lang/String;)Lorg/slf4j/Logger; +SPLorg/slf4j/LoggerFactory;->getProvider()Lorg/slf4j/spi/SLF4JServiceProvider; +SPLorg/slf4j/LoggerFactory;->getServiceLoader(Ljava/lang/ClassLoader;)Ljava/util/ServiceLoader; +SPLorg/slf4j/LoggerFactory;->isAmbiguousProviderList(Ljava/util/List;)Z +SPLorg/slf4j/LoggerFactory;->loadExplicitlySpecified(Ljava/lang/ClassLoader;)Lorg/slf4j/spi/SLF4JServiceProvider; +SPLorg/slf4j/LoggerFactory;->performInitialization()V +SPLorg/slf4j/LoggerFactory;->postBindCleanUp()V +SPLorg/slf4j/LoggerFactory;->replayEvents()V +SPLorg/slf4j/LoggerFactory;->reportActualBinding(Ljava/util/List;)V +SPLorg/slf4j/LoggerFactory;->reportMultipleBindingAmbiguity(Ljava/util/List;)V +SPLorg/slf4j/LoggerFactory;->safelyInstantiate(Ljava/util/List;Ljava/util/Iterator;)V +SPLorg/slf4j/LoggerFactory;->versionSanityCheck()V +Lorg/slf4j/MDC; +SPLorg/slf4j/MDC;->setMDCAdapter(Lorg/slf4j/spi/MDCAdapter;)V +Lorg/slf4j/event/Level; +SPLorg/slf4j/event/Level;->$values()[Lorg/slf4j/event/Level; +SPLorg/slf4j/event/Level;->()V +SPLorg/slf4j/event/Level;->(Ljava/lang/String;IILjava/lang/String;)V +SPLorg/slf4j/event/Level;->values()[Lorg/slf4j/event/Level; +Lorg/slf4j/helpers/AbstractLogger; +SPLorg/slf4j/helpers/AbstractLogger;->()V +SPLorg/slf4j/helpers/AbstractLogger;->debug(Ljava/lang/String;Ljava/lang/Object;)V +SPLorg/slf4j/helpers/AbstractLogger;->handle_0ArgsCall(Lorg/slf4j/event/Level;Lorg/slf4j/Marker;Ljava/lang/String;Ljava/lang/Throwable;)V +SPLorg/slf4j/helpers/AbstractLogger;->handle_1ArgsCall(Lorg/slf4j/event/Level;Lorg/slf4j/Marker;Ljava/lang/String;Ljava/lang/Object;)V +SPLorg/slf4j/helpers/AbstractLogger;->info(Lorg/slf4j/Marker;Ljava/lang/String;Ljava/lang/Throwable;)V +Lorg/slf4j/helpers/BasicMDCAdapter; +SPLorg/slf4j/helpers/BasicMDCAdapter;->()V +Lorg/slf4j/helpers/BasicMDCAdapter$1; +SPLorg/slf4j/helpers/BasicMDCAdapter$1;->(Lorg/slf4j/helpers/BasicMDCAdapter;)V +Lorg/slf4j/helpers/BasicMarkerFactory; +SPLorg/slf4j/helpers/BasicMarkerFactory;->()V +Lorg/slf4j/helpers/FormattingTuple; +SPLorg/slf4j/helpers/FormattingTuple;->()V +SPLorg/slf4j/helpers/FormattingTuple;->(Ljava/lang/String;)V +SPLorg/slf4j/helpers/FormattingTuple;->(Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V +SPLorg/slf4j/helpers/FormattingTuple;->getMessage()Ljava/lang/String; +Lorg/slf4j/helpers/LegacyAbstractLogger; +SPLorg/slf4j/helpers/LegacyAbstractLogger;->()V +SPLorg/slf4j/helpers/LegacyAbstractLogger;->isInfoEnabled(Lorg/slf4j/Marker;)Z +Lorg/slf4j/helpers/MessageFormatter; +SPLorg/slf4j/helpers/MessageFormatter;->arrayFormat(Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)Lorg/slf4j/helpers/FormattingTuple; +SPLorg/slf4j/helpers/MessageFormatter;->basicArrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; +SPLorg/slf4j/helpers/MessageFormatter;->deeplyAppendParameter(Ljava/lang/StringBuilder;Ljava/lang/Object;Ljava/util/Map;)V +SPLorg/slf4j/helpers/MessageFormatter;->isEscapedDelimeter(Ljava/lang/String;I)Z +SPLorg/slf4j/helpers/MessageFormatter;->safeObjectAppend(Ljava/lang/StringBuilder;Ljava/lang/Object;)V +Lorg/slf4j/helpers/NOPLoggerFactory; +SPLorg/slf4j/helpers/NOPLoggerFactory;->()V +Lorg/slf4j/helpers/NOPMDCAdapter; +SPLorg/slf4j/helpers/NOPMDCAdapter;->()V +Lorg/slf4j/helpers/NOP_FallbackServiceProvider; +SPLorg/slf4j/helpers/NOP_FallbackServiceProvider;->()V +SPLorg/slf4j/helpers/NOP_FallbackServiceProvider;->()V +Lorg/slf4j/helpers/Reporter; +SPLorg/slf4j/helpers/Reporter;->()V +SPLorg/slf4j/helpers/Reporter;->debug(Ljava/lang/String;)V +SPLorg/slf4j/helpers/Reporter;->getTargetChoice()Lorg/slf4j/helpers/Reporter$TargetChoice; +SPLorg/slf4j/helpers/Reporter;->initVerbosity()Lorg/slf4j/helpers/Reporter$Level; +SPLorg/slf4j/helpers/Reporter;->isEnabledFor(Lorg/slf4j/helpers/Reporter$Level;)Z +Lorg/slf4j/helpers/Reporter$Level; +SPLorg/slf4j/helpers/Reporter$Level;->$values()[Lorg/slf4j/helpers/Reporter$Level; +SPLorg/slf4j/helpers/Reporter$Level;->()V +SPLorg/slf4j/helpers/Reporter$Level;->(Ljava/lang/String;II)V +Lorg/slf4j/helpers/Reporter$TargetChoice; +SPLorg/slf4j/helpers/Reporter$TargetChoice;->$values()[Lorg/slf4j/helpers/Reporter$TargetChoice; +SPLorg/slf4j/helpers/Reporter$TargetChoice;->()V +SPLorg/slf4j/helpers/Reporter$TargetChoice;->(Ljava/lang/String;I)V +Lorg/slf4j/helpers/SubstituteLoggerFactory; +SPLorg/slf4j/helpers/SubstituteLoggerFactory;->()V +SPLorg/slf4j/helpers/SubstituteLoggerFactory;->clear()V +SPLorg/slf4j/helpers/SubstituteLoggerFactory;->getEventQueue()Ljava/util/concurrent/LinkedBlockingQueue; +SPLorg/slf4j/helpers/SubstituteLoggerFactory;->getLoggers()Ljava/util/List; +SPLorg/slf4j/helpers/SubstituteLoggerFactory;->postInitialization()V +Lorg/slf4j/helpers/SubstituteServiceProvider; +SPLorg/slf4j/helpers/SubstituteServiceProvider;->()V +SPLorg/slf4j/helpers/SubstituteServiceProvider;->getSubstituteLoggerFactory()Lorg/slf4j/helpers/SubstituteLoggerFactory; +Lorg/slf4j/helpers/ThreadLocalMapOfStacks; +SPLorg/slf4j/helpers/ThreadLocalMapOfStacks;->()V +Lorg/slf4j/helpers/Util; +SPLorg/slf4j/helpers/Util;->()V +SPLorg/slf4j/helpers/Util;->safeGetBooleanSystemProperty(Ljava/lang/String;)Z +SPLorg/slf4j/helpers/Util;->safeGetSystemProperty(Ljava/lang/String;)Ljava/lang/String; +Lorg/slf4j/spi/LocationAwareLogger; +Lorg/slf4j/spi/MDCAdapter; +Lorg/slf4j/spi/SLF4JServiceProvider; +Lshark/AndroidMetadataExtractor; +SPLshark/AndroidMetadataExtractor;->()V +SPLshark/AndroidMetadataExtractor;->()V +Lshark/AndroidObjectInspectors; +SPLshark/AndroidObjectInspectors;->()V +SPLshark/AndroidObjectInspectors;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors;->(Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLshark/AndroidObjectInspectors;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +SPLshark/AndroidObjectInspectors;->values()[Lshark/AndroidObjectInspectors; +Lshark/AndroidObjectInspectors$ACTIVITY; +SPLshark/AndroidObjectInspectors$ACTIVITY;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$ACTIVITY;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$ACTIVITY$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$ACTIVITY$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$ACTIVITY$leakingObjectFilter$1;->()V +Lshark/AndroidObjectInspectors$ACTIVITY_THREAD; +SPLshark/AndroidObjectInspectors$ACTIVITY_THREAD;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$ANDROIDX_FRAGMENT; +SPLshark/AndroidObjectInspectors$ANDROIDX_FRAGMENT;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$ANDROIDX_FRAGMENT;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$ANDROIDX_FRAGMENT$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$ANDROIDX_FRAGMENT$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$ANDROIDX_FRAGMENT$leakingObjectFilter$1;->()V +Lshark/AndroidObjectInspectors$ANIMATOR; +SPLshark/AndroidObjectInspectors$ANIMATOR;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$APPLICATION; +SPLshark/AndroidObjectInspectors$APPLICATION;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$APPLICATION_PACKAGE_MANAGER; +SPLshark/AndroidObjectInspectors$APPLICATION_PACKAGE_MANAGER;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$APPLICATION_PACKAGE_MANAGER;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$APPLICATION_PACKAGE_MANAGER$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$APPLICATION_PACKAGE_MANAGER$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$APPLICATION_PACKAGE_MANAGER$leakingObjectFilter$1;->()V +Lshark/AndroidObjectInspectors$COMPOSITION_IMPL; +SPLshark/AndroidObjectInspectors$COMPOSITION_IMPL;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$CONTEXT_FIELD; +SPLshark/AndroidObjectInspectors$CONTEXT_FIELD;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$CONTEXT_IMPL; +SPLshark/AndroidObjectInspectors$CONTEXT_IMPL;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$CONTEXT_IMPL;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$CONTEXT_IMPL$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$CONTEXT_IMPL$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$CONTEXT_IMPL$leakingObjectFilter$1;->()V +Lshark/AndroidObjectInspectors$CONTEXT_WRAPPER; +SPLshark/AndroidObjectInspectors$CONTEXT_WRAPPER;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$CONTEXT_WRAPPER;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$CONTEXT_WRAPPER$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$CONTEXT_WRAPPER$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$CONTEXT_WRAPPER$leakingObjectFilter$1;->()V +Lshark/AndroidObjectInspectors$COORDINATOR; +SPLshark/AndroidObjectInspectors$COORDINATOR;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$Companion; +SPLshark/AndroidObjectInspectors$Companion;->()V +SPLshark/AndroidObjectInspectors$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLshark/AndroidObjectInspectors$Companion;->createLeakingObjectFilters(Ljava/util/Set;)Ljava/util/List; +SPLshark/AndroidObjectInspectors$Companion;->getAppDefaults()Ljava/util/List; +Lshark/AndroidObjectInspectors$Companion$createLeakingObjectFilters$2$1; +SPLshark/AndroidObjectInspectors$Companion$createLeakingObjectFilters$2$1;->(Lkotlin/jvm/functions/Function1;)V +Lshark/AndroidObjectInspectors$DIALOG; +SPLshark/AndroidObjectInspectors$DIALOG;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$EDITOR; +SPLshark/AndroidObjectInspectors$EDITOR;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$EDITOR;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$EDITOR$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$EDITOR$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$EDITOR$leakingObjectFilter$1;->()V +Lshark/AndroidObjectInspectors$FRAGMENT; +SPLshark/AndroidObjectInspectors$FRAGMENT;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$FRAGMENT;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$FRAGMENT$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$FRAGMENT$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$FRAGMENT$leakingObjectFilter$1;->()V +Lshark/AndroidObjectInspectors$INPUT_METHOD_MANAGER; +SPLshark/AndroidObjectInspectors$INPUT_METHOD_MANAGER;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$LIFECYCLE_REGISTRY; +SPLshark/AndroidObjectInspectors$LIFECYCLE_REGISTRY;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$LOADED_APK; +SPLshark/AndroidObjectInspectors$LOADED_APK;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$MAIN_THREAD; +SPLshark/AndroidObjectInspectors$MAIN_THREAD;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$MESSAGE; +SPLshark/AndroidObjectInspectors$MESSAGE;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$MESSAGE_QUEUE; +SPLshark/AndroidObjectInspectors$MESSAGE_QUEUE;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$MESSAGE_QUEUE;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$MESSAGE_QUEUE$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$MESSAGE_QUEUE$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$MESSAGE_QUEUE$leakingObjectFilter$1;->()V +Lshark/AndroidObjectInspectors$MORTAR_PRESENTER; +SPLshark/AndroidObjectInspectors$MORTAR_PRESENTER;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$MORTAR_SCOPE; +SPLshark/AndroidObjectInspectors$MORTAR_SCOPE;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$MORTAR_SCOPE;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$MORTAR_SCOPE$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$MORTAR_SCOPE$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$MORTAR_SCOPE$leakingObjectFilter$1;->()V +Lshark/AndroidObjectInspectors$OBJECT_ANIMATOR; +SPLshark/AndroidObjectInspectors$OBJECT_ANIMATOR;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$RECOMPOSER; +SPLshark/AndroidObjectInspectors$RECOMPOSER;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$SERVICE; +SPLshark/AndroidObjectInspectors$SERVICE;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$SERVICE;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$SERVICE$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$SERVICE$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$SERVICE$leakingObjectFilter$1;->()V +Lshark/AndroidObjectInspectors$STUB; +SPLshark/AndroidObjectInspectors$STUB;->(Ljava/lang/String;I)V +Lshark/AndroidObjectInspectors$SUPPORT_FRAGMENT; +SPLshark/AndroidObjectInspectors$SUPPORT_FRAGMENT;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$SUPPORT_FRAGMENT;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$SUPPORT_FRAGMENT$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$SUPPORT_FRAGMENT$leakingObjectFilter$1;->(Lshark/AndroidObjectInspectors$SUPPORT_FRAGMENT;)V +Lshark/AndroidObjectInspectors$TOAST; +SPLshark/AndroidObjectInspectors$TOAST;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$TOAST;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$TOAST$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$TOAST$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$TOAST$leakingObjectFilter$1;->()V +Lshark/AndroidObjectInspectors$VIEW; +SPLshark/AndroidObjectInspectors$VIEW;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$VIEW;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$VIEW$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$VIEW$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$VIEW$leakingObjectFilter$1;->()V +Lshark/AndroidObjectInspectors$VIEW_ROOT_IMPL; +SPLshark/AndroidObjectInspectors$VIEW_ROOT_IMPL;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$VIEW_ROOT_IMPL;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$VIEW_ROOT_IMPL$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$VIEW_ROOT_IMPL$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$VIEW_ROOT_IMPL$leakingObjectFilter$1;->()V +Lshark/AndroidObjectInspectors$WINDOW; +SPLshark/AndroidObjectInspectors$WINDOW;->(Ljava/lang/String;I)V +SPLshark/AndroidObjectInspectors$WINDOW;->getLeakingObjectFilter$shark_android()Lkotlin/jvm/functions/Function1; +Lshark/AndroidObjectInspectors$WINDOW$leakingObjectFilter$1; +SPLshark/AndroidObjectInspectors$WINDOW$leakingObjectFilter$1;->()V +SPLshark/AndroidObjectInspectors$WINDOW$leakingObjectFilter$1;->()V +Lshark/AndroidReferenceMatchers; +SPLshark/AndroidReferenceMatchers;->()V +SPLshark/AndroidReferenceMatchers;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers;->(Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLshark/AndroidReferenceMatchers;->access$getALWAYS$cp()Lkotlin/jvm/functions/Function1; +SPLshark/AndroidReferenceMatchers;->values()[Lshark/AndroidReferenceMatchers; +Lshark/AndroidReferenceMatchers$ACCESSIBILITY_ITERATORS; +SPLshark/AndroidReferenceMatchers$ACCESSIBILITY_ITERATORS;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$ACCESSIBILITY_ITERATORS;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$ACCESSIBILITY_ITERATORS$add$1; +SPLshark/AndroidReferenceMatchers$ACCESSIBILITY_ITERATORS$add$1;->()V +SPLshark/AndroidReferenceMatchers$ACCESSIBILITY_ITERATORS$add$1;->()V +Lshark/AndroidReferenceMatchers$ACCESSIBILITY_NODE_ID_MANAGER; +SPLshark/AndroidReferenceMatchers$ACCESSIBILITY_NODE_ID_MANAGER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$ACCESSIBILITY_NODE_ID_MANAGER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$ACCESSIBILITY_NODE_ID_MANAGER$add$1; +SPLshark/AndroidReferenceMatchers$ACCESSIBILITY_NODE_ID_MANAGER$add$1;->()V +SPLshark/AndroidReferenceMatchers$ACCESSIBILITY_NODE_ID_MANAGER$add$1;->()V +Lshark/AndroidReferenceMatchers$ACCESSIBILITY_NODE_INFO__MORIGINALTEXT; +SPLshark/AndroidReferenceMatchers$ACCESSIBILITY_NODE_INFO__MORIGINALTEXT;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$ACCESSIBILITY_NODE_INFO__MORIGINALTEXT;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$ACCESSIBILITY_NODE_INFO__MORIGINALTEXT$add$1; +SPLshark/AndroidReferenceMatchers$ACCESSIBILITY_NODE_INFO__MORIGINALTEXT$add$1;->()V +SPLshark/AndroidReferenceMatchers$ACCESSIBILITY_NODE_INFO__MORIGINALTEXT$add$1;->()V +Lshark/AndroidReferenceMatchers$ACCOUNT_MANAGER__AMS_TASK__RESPONSE; +SPLshark/AndroidReferenceMatchers$ACCOUNT_MANAGER__AMS_TASK__RESPONSE;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$ACCOUNT_MANAGER__AMS_TASK__RESPONSE;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$ACCOUNT_MANAGER__AMS_TASK__RESPONSE$add$1; +SPLshark/AndroidReferenceMatchers$ACCOUNT_MANAGER__AMS_TASK__RESPONSE$add$1;->()V +SPLshark/AndroidReferenceMatchers$ACCOUNT_MANAGER__AMS_TASK__RESPONSE$add$1;->()V +Lshark/AndroidReferenceMatchers$ACTIVITY_CHOOSE_MODEL; +SPLshark/AndroidReferenceMatchers$ACTIVITY_CHOOSE_MODEL;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$ACTIVITY_CHOOSE_MODEL;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$ACTIVITY_CHOOSE_MODEL$add$1; +SPLshark/AndroidReferenceMatchers$ACTIVITY_CHOOSE_MODEL$add$1;->()V +SPLshark/AndroidReferenceMatchers$ACTIVITY_CHOOSE_MODEL$add$1;->()V +Lshark/AndroidReferenceMatchers$ACTIVITY_MANAGER_MCONTEXT; +SPLshark/AndroidReferenceMatchers$ACTIVITY_MANAGER_MCONTEXT;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$ACTIVITY_MANAGER_MCONTEXT;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$ACTIVITY_MANAGER_MCONTEXT$add$1; +SPLshark/AndroidReferenceMatchers$ACTIVITY_MANAGER_MCONTEXT$add$1;->()V +SPLshark/AndroidReferenceMatchers$ACTIVITY_MANAGER_MCONTEXT$add$1;->()V +Lshark/AndroidReferenceMatchers$ACTIVITY_THREAD__M_NEW_ACTIVITIES; +SPLshark/AndroidReferenceMatchers$ACTIVITY_THREAD__M_NEW_ACTIVITIES;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$ACTIVITY_THREAD__M_NEW_ACTIVITIES;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$ACTIVITY_THREAD__M_NEW_ACTIVITIES$add$1; +SPLshark/AndroidReferenceMatchers$ACTIVITY_THREAD__M_NEW_ACTIVITIES$add$1;->()V +SPLshark/AndroidReferenceMatchers$ACTIVITY_THREAD__M_NEW_ACTIVITIES$add$1;->()V +Lshark/AndroidReferenceMatchers$ACTIVITY_TRANSITION_STATE__M_EXITING_TO_VIEW; +SPLshark/AndroidReferenceMatchers$ACTIVITY_TRANSITION_STATE__M_EXITING_TO_VIEW;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$ACTIVITY_TRANSITION_STATE__M_EXITING_TO_VIEW;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$ACTIVITY_TRANSITION_STATE__M_EXITING_TO_VIEW$add$1; +SPLshark/AndroidReferenceMatchers$ACTIVITY_TRANSITION_STATE__M_EXITING_TO_VIEW$add$1;->()V +SPLshark/AndroidReferenceMatchers$ACTIVITY_TRANSITION_STATE__M_EXITING_TO_VIEW$add$1;->()V +Lshark/AndroidReferenceMatchers$ANIMATION_HANDLER__ANIMATOR_REQUESTORS; +SPLshark/AndroidReferenceMatchers$ANIMATION_HANDLER__ANIMATOR_REQUESTORS;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$ANIMATION_HANDLER__ANIMATOR_REQUESTORS;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$ANIMATION_HANDLER__ANIMATOR_REQUESTORS$add$1; +SPLshark/AndroidReferenceMatchers$ANIMATION_HANDLER__ANIMATOR_REQUESTORS$add$1;->()V +SPLshark/AndroidReferenceMatchers$ANIMATION_HANDLER__ANIMATOR_REQUESTORS$add$1;->()V +Lshark/AndroidReferenceMatchers$APPLICATION_PACKAGE_MANAGER__HAS_SYSTEM_FEATURE_QUERY; +SPLshark/AndroidReferenceMatchers$APPLICATION_PACKAGE_MANAGER__HAS_SYSTEM_FEATURE_QUERY;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$APPLICATION_PACKAGE_MANAGER__HAS_SYSTEM_FEATURE_QUERY;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$APPLICATION_PACKAGE_MANAGER__HAS_SYSTEM_FEATURE_QUERY$add$1; +SPLshark/AndroidReferenceMatchers$APPLICATION_PACKAGE_MANAGER__HAS_SYSTEM_FEATURE_QUERY$add$1;->()V +SPLshark/AndroidReferenceMatchers$APPLICATION_PACKAGE_MANAGER__HAS_SYSTEM_FEATURE_QUERY$add$1;->()V +Lshark/AndroidReferenceMatchers$APP_OPS_MANAGER__CALLBACK_STUB; +SPLshark/AndroidReferenceMatchers$APP_OPS_MANAGER__CALLBACK_STUB;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$APP_OPS_MANAGER__CALLBACK_STUB;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$APP_OPS_MANAGER__CALLBACK_STUB$add$1; +SPLshark/AndroidReferenceMatchers$APP_OPS_MANAGER__CALLBACK_STUB$add$1;->()V +SPLshark/AndroidReferenceMatchers$APP_OPS_MANAGER__CALLBACK_STUB$add$1;->()V +Lshark/AndroidReferenceMatchers$APP_WIDGET_HOST_CALLBACKS; +SPLshark/AndroidReferenceMatchers$APP_WIDGET_HOST_CALLBACKS;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$APP_WIDGET_HOST_CALLBACKS;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$APP_WIDGET_HOST_CALLBACKS$add$1; +SPLshark/AndroidReferenceMatchers$APP_WIDGET_HOST_CALLBACKS$add$1;->()V +SPLshark/AndroidReferenceMatchers$APP_WIDGET_HOST_CALLBACKS$add$1;->()V +Lshark/AndroidReferenceMatchers$ASSIST_STRUCTURE; +SPLshark/AndroidReferenceMatchers$ASSIST_STRUCTURE;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$ASSIST_STRUCTURE;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$ASSIST_STRUCTURE$add$1; +SPLshark/AndroidReferenceMatchers$ASSIST_STRUCTURE$add$1;->()V +SPLshark/AndroidReferenceMatchers$ASSIST_STRUCTURE$add$1;->()V +Lshark/AndroidReferenceMatchers$AUDIO_MANAGER; +SPLshark/AndroidReferenceMatchers$AUDIO_MANAGER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$AUDIO_MANAGER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$AUDIO_MANAGER$add$1; +SPLshark/AndroidReferenceMatchers$AUDIO_MANAGER$add$1;->()V +SPLshark/AndroidReferenceMatchers$AUDIO_MANAGER$add$1;->()V +Lshark/AndroidReferenceMatchers$AUDIO_MANAGER__MCONTEXT_STATIC; +SPLshark/AndroidReferenceMatchers$AUDIO_MANAGER__MCONTEXT_STATIC;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$AUDIO_MANAGER__MCONTEXT_STATIC;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$AUDIO_MANAGER__MCONTEXT_STATIC$add$1; +SPLshark/AndroidReferenceMatchers$AUDIO_MANAGER__MCONTEXT_STATIC$add$1;->()V +SPLshark/AndroidReferenceMatchers$AUDIO_MANAGER__MCONTEXT_STATIC$add$1;->()V +Lshark/AndroidReferenceMatchers$AW_CONTENTS_POSTED_CALLBACK; +SPLshark/AndroidReferenceMatchers$AW_CONTENTS_POSTED_CALLBACK;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$AW_CONTENTS_POSTED_CALLBACK;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$AW_CONTENTS__A0; +SPLshark/AndroidReferenceMatchers$AW_CONTENTS__A0;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$AW_CONTENTS__A0;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$AW_RESOURCE__SRESOURCES; +SPLshark/AndroidReferenceMatchers$AW_RESOURCE__SRESOURCES;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$AW_RESOURCE__SRESOURCES;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$AW_RESOURCE__SRESOURCES$add$1; +SPLshark/AndroidReferenceMatchers$AW_RESOURCE__SRESOURCES$add$1;->()V +SPLshark/AndroidReferenceMatchers$AW_RESOURCE__SRESOURCES$add$1;->()V +Lshark/AndroidReferenceMatchers$BACKDROP_FRAME_RENDERER__MDECORVIEW; +SPLshark/AndroidReferenceMatchers$BACKDROP_FRAME_RENDERER__MDECORVIEW;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$BACKDROP_FRAME_RENDERER__MDECORVIEW;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$BACKDROP_FRAME_RENDERER__MDECORVIEW$add$1; +SPLshark/AndroidReferenceMatchers$BACKDROP_FRAME_RENDERER__MDECORVIEW$add$1;->()V +SPLshark/AndroidReferenceMatchers$BACKDROP_FRAME_RENDERER__MDECORVIEW$add$1;->()V +Lshark/AndroidReferenceMatchers$BIOMETRIC_PROMPT; +SPLshark/AndroidReferenceMatchers$BIOMETRIC_PROMPT;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$BIOMETRIC_PROMPT;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$BIOMETRIC_PROMPT$add$1; +SPLshark/AndroidReferenceMatchers$BIOMETRIC_PROMPT$add$1;->()V +SPLshark/AndroidReferenceMatchers$BIOMETRIC_PROMPT$add$1;->()V +Lshark/AndroidReferenceMatchers$BLOCKING_QUEUE; +SPLshark/AndroidReferenceMatchers$BLOCKING_QUEUE;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$BLOCKING_QUEUE;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$BLOCKING_QUEUE$add$1; +SPLshark/AndroidReferenceMatchers$BLOCKING_QUEUE$add$1;->()V +SPLshark/AndroidReferenceMatchers$BLOCKING_QUEUE$add$1;->()V +Lshark/AndroidReferenceMatchers$BUBBLE_POPUP_HELPER__SHELPER; +SPLshark/AndroidReferenceMatchers$BUBBLE_POPUP_HELPER__SHELPER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$BUBBLE_POPUP_HELPER__SHELPER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$BUBBLE_POPUP_HELPER__SHELPER$add$1; +SPLshark/AndroidReferenceMatchers$BUBBLE_POPUP_HELPER__SHELPER$add$1;->()V +SPLshark/AndroidReferenceMatchers$BUBBLE_POPUP_HELPER__SHELPER$add$1;->()V +Lshark/AndroidReferenceMatchers$CLIPBOARD_EX_MANAGER; +SPLshark/AndroidReferenceMatchers$CLIPBOARD_EX_MANAGER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$CLIPBOARD_EX_MANAGER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$CLIPBOARD_EX_MANAGER$add$1; +SPLshark/AndroidReferenceMatchers$CLIPBOARD_EX_MANAGER$add$1;->()V +SPLshark/AndroidReferenceMatchers$CLIPBOARD_EX_MANAGER$add$1;->()V +Lshark/AndroidReferenceMatchers$CLIPBOARD_EX_MANAGER$add$2; +SPLshark/AndroidReferenceMatchers$CLIPBOARD_EX_MANAGER$add$2;->()V +SPLshark/AndroidReferenceMatchers$CLIPBOARD_EX_MANAGER$add$2;->()V +Lshark/AndroidReferenceMatchers$CLIPBOARD_EX_MANAGER$add$3; +SPLshark/AndroidReferenceMatchers$CLIPBOARD_EX_MANAGER$add$3;->()V +SPLshark/AndroidReferenceMatchers$CLIPBOARD_EX_MANAGER$add$3;->()V +Lshark/AndroidReferenceMatchers$CLIPBOARD_UI_MANAGER__SINSTANCE; +SPLshark/AndroidReferenceMatchers$CLIPBOARD_UI_MANAGER__SINSTANCE;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$CLIPBOARD_UI_MANAGER__SINSTANCE;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$CLIPBOARD_UI_MANAGER__SINSTANCE$add$1; +SPLshark/AndroidReferenceMatchers$CLIPBOARD_UI_MANAGER__SINSTANCE$add$1;->()V +SPLshark/AndroidReferenceMatchers$CLIPBOARD_UI_MANAGER__SINSTANCE$add$1;->()V +Lshark/AndroidReferenceMatchers$COMPANION_DEVICE_SERVICE__STUB; +SPLshark/AndroidReferenceMatchers$COMPANION_DEVICE_SERVICE__STUB;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$COMPANION_DEVICE_SERVICE__STUB;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$COMPANION_DEVICE_SERVICE__STUB$add$1; +SPLshark/AndroidReferenceMatchers$COMPANION_DEVICE_SERVICE__STUB$add$1;->()V +SPLshark/AndroidReferenceMatchers$COMPANION_DEVICE_SERVICE__STUB$add$1;->()V +Lshark/AndroidReferenceMatchers$CONNECTIVITY_MANAGER_CALLBACK_HANDLER; +SPLshark/AndroidReferenceMatchers$CONNECTIVITY_MANAGER_CALLBACK_HANDLER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$CONNECTIVITY_MANAGER_CALLBACK_HANDLER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$CONNECTIVITY_MANAGER_CALLBACK_HANDLER$add$1; +SPLshark/AndroidReferenceMatchers$CONNECTIVITY_MANAGER_CALLBACK_HANDLER$add$1;->()V +SPLshark/AndroidReferenceMatchers$CONNECTIVITY_MANAGER_CALLBACK_HANDLER$add$1;->()V +Lshark/AndroidReferenceMatchers$CONNECTIVITY_MANAGER__SINSTANCE; +SPLshark/AndroidReferenceMatchers$CONNECTIVITY_MANAGER__SINSTANCE;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$CONNECTIVITY_MANAGER__SINSTANCE;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$CONNECTIVITY_MANAGER__SINSTANCE$add$1; +SPLshark/AndroidReferenceMatchers$CONNECTIVITY_MANAGER__SINSTANCE$add$1;->()V +SPLshark/AndroidReferenceMatchers$CONNECTIVITY_MANAGER__SINSTANCE$add$1;->()V +Lshark/AndroidReferenceMatchers$CONTROLLED_INPUT_CONNECTION_WRAPPER; +SPLshark/AndroidReferenceMatchers$CONTROLLED_INPUT_CONNECTION_WRAPPER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$CONTROLLED_INPUT_CONNECTION_WRAPPER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$Companion; +SPLshark/AndroidReferenceMatchers$Companion;->()V +SPLshark/AndroidReferenceMatchers$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLshark/AndroidReferenceMatchers$Companion;->buildKnownReferences(Ljava/util/Set;)Ljava/util/List; +SPLshark/AndroidReferenceMatchers$Companion;->getAppDefaults()Ljava/util/List; +SPLshark/AndroidReferenceMatchers$Companion;->ignoredInstanceField(Ljava/lang/String;Ljava/lang/String;)Lshark/IgnoredReferenceMatcher; +SPLshark/AndroidReferenceMatchers$Companion;->ignoredJavaLocal(Ljava/lang/String;)Lshark/IgnoredReferenceMatcher; +SPLshark/AndroidReferenceMatchers$Companion;->instanceFieldLeak$default(Lshark/AndroidReferenceMatchers$Companion;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lshark/LibraryLeakReferenceMatcher; +SPLshark/AndroidReferenceMatchers$Companion;->instanceFieldLeak(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lshark/LibraryLeakReferenceMatcher; +SPLshark/AndroidReferenceMatchers$Companion;->libraryLeak(Lshark/ReferencePattern;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lshark/LibraryLeakReferenceMatcher; +SPLshark/AndroidReferenceMatchers$Companion;->nativeGlobalVariableLeak$default(Lshark/AndroidReferenceMatchers$Companion;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lshark/LibraryLeakReferenceMatcher; +SPLshark/AndroidReferenceMatchers$Companion;->nativeGlobalVariableLeak(Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lshark/LibraryLeakReferenceMatcher; +SPLshark/AndroidReferenceMatchers$Companion;->staticFieldLeak$default(Lshark/AndroidReferenceMatchers$Companion;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lshark/LibraryLeakReferenceMatcher; +SPLshark/AndroidReferenceMatchers$Companion;->staticFieldLeak(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lshark/LibraryLeakReferenceMatcher; +Lshark/AndroidReferenceMatchers$Companion$ALWAYS$1; +SPLshark/AndroidReferenceMatchers$Companion$ALWAYS$1;->()V +SPLshark/AndroidReferenceMatchers$Companion$ALWAYS$1;->()V +Lshark/AndroidReferenceMatchers$Companion$libraryLeak$1; +SPLshark/AndroidReferenceMatchers$Companion$libraryLeak$1;->(Lkotlin/jvm/functions/Function1;)V +Lshark/AndroidReferenceMatchers$DEVICE_POLICY_MANAGER__SETTINGS_OBSERVER; +SPLshark/AndroidReferenceMatchers$DEVICE_POLICY_MANAGER__SETTINGS_OBSERVER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$DEVICE_POLICY_MANAGER__SETTINGS_OBSERVER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$DEVICE_POLICY_MANAGER__SETTINGS_OBSERVER$add$1; +SPLshark/AndroidReferenceMatchers$DEVICE_POLICY_MANAGER__SETTINGS_OBSERVER$add$1;->()V +SPLshark/AndroidReferenceMatchers$DEVICE_POLICY_MANAGER__SETTINGS_OBSERVER$add$1;->()V +Lshark/AndroidReferenceMatchers$DREAM_SERVICE; +SPLshark/AndroidReferenceMatchers$DREAM_SERVICE;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$DREAM_SERVICE;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$DREAM_SERVICE$add$1; +SPLshark/AndroidReferenceMatchers$DREAM_SERVICE$add$1;->()V +SPLshark/AndroidReferenceMatchers$DREAM_SERVICE$add$1;->()V +Lshark/AndroidReferenceMatchers$EDITTEXT_BLINK_MESSAGEQUEUE; +SPLshark/AndroidReferenceMatchers$EDITTEXT_BLINK_MESSAGEQUEUE;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$EDITTEXT_BLINK_MESSAGEQUEUE;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$EDITTEXT_BLINK_MESSAGEQUEUE$add$1; +SPLshark/AndroidReferenceMatchers$EDITTEXT_BLINK_MESSAGEQUEUE$add$1;->()V +SPLshark/AndroidReferenceMatchers$EDITTEXT_BLINK_MESSAGEQUEUE$add$1;->()V +Lshark/AndroidReferenceMatchers$EVENT_RECEIVER__MMESSAGE_QUEUE; +SPLshark/AndroidReferenceMatchers$EVENT_RECEIVER__MMESSAGE_QUEUE;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$EVENT_RECEIVER__MMESSAGE_QUEUE;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$EXTENDED_STATUS_BAR_MANAGER; +SPLshark/AndroidReferenceMatchers$EXTENDED_STATUS_BAR_MANAGER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$EXTENDED_STATUS_BAR_MANAGER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$EXTENDED_STATUS_BAR_MANAGER$add$1; +SPLshark/AndroidReferenceMatchers$EXTENDED_STATUS_BAR_MANAGER$add$1;->()V +SPLshark/AndroidReferenceMatchers$EXTENDED_STATUS_BAR_MANAGER$add$1;->()V +Lshark/AndroidReferenceMatchers$FINALIZER_WATCHDOG_DAEMON; +SPLshark/AndroidReferenceMatchers$FINALIZER_WATCHDOG_DAEMON;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$FINALIZER_WATCHDOG_DAEMON;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$FLIPPER__APPLICATION_DESCRIPTOR; +SPLshark/AndroidReferenceMatchers$FLIPPER__APPLICATION_DESCRIPTOR;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$FLIPPER__APPLICATION_DESCRIPTOR;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$GESTURE_BOOST_MANAGER; +SPLshark/AndroidReferenceMatchers$GESTURE_BOOST_MANAGER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$GESTURE_BOOST_MANAGER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$GESTURE_BOOST_MANAGER$add$1; +SPLshark/AndroidReferenceMatchers$GESTURE_BOOST_MANAGER$add$1;->()V +SPLshark/AndroidReferenceMatchers$GESTURE_BOOST_MANAGER$add$1;->()V +Lshark/AndroidReferenceMatchers$HOST_ADPU_SERVICE_MSG_HANDLER; +SPLshark/AndroidReferenceMatchers$HOST_ADPU_SERVICE_MSG_HANDLER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$HOST_ADPU_SERVICE_MSG_HANDLER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$HOST_ADPU_SERVICE_MSG_HANDLER$add$1; +SPLshark/AndroidReferenceMatchers$HOST_ADPU_SERVICE_MSG_HANDLER$add$1;->()V +SPLshark/AndroidReferenceMatchers$HOST_ADPU_SERVICE_MSG_HANDLER$add$1;->()V +Lshark/AndroidReferenceMatchers$IMM_CURRENT_INPUT_CONNECTION; +SPLshark/AndroidReferenceMatchers$IMM_CURRENT_INPUT_CONNECTION;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$IMM_CURRENT_INPUT_CONNECTION;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$IMM_CURRENT_INPUT_CONNECTION$add$1; +SPLshark/AndroidReferenceMatchers$IMM_CURRENT_INPUT_CONNECTION$add$1;->()V +SPLshark/AndroidReferenceMatchers$IMM_CURRENT_INPUT_CONNECTION$add$1;->()V +Lshark/AndroidReferenceMatchers$IMM_LAST_FOCUS_VIEW; +SPLshark/AndroidReferenceMatchers$IMM_LAST_FOCUS_VIEW;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$IMM_LAST_FOCUS_VIEW;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$IMM_LAST_FOCUS_VIEW$add$1; +SPLshark/AndroidReferenceMatchers$IMM_LAST_FOCUS_VIEW$add$1;->()V +SPLshark/AndroidReferenceMatchers$IMM_LAST_FOCUS_VIEW$add$1;->()V +Lshark/AndroidReferenceMatchers$INPUT_MANAGER__M_LATE_INIT_CONTEXT; +SPLshark/AndroidReferenceMatchers$INPUT_MANAGER__M_LATE_INIT_CONTEXT;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$INPUT_MANAGER__M_LATE_INIT_CONTEXT;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$INPUT_MANAGER__M_LATE_INIT_CONTEXT$add$1; +SPLshark/AndroidReferenceMatchers$INPUT_MANAGER__M_LATE_INIT_CONTEXT$add$1;->()V +SPLshark/AndroidReferenceMatchers$INPUT_MANAGER__M_LATE_INIT_CONTEXT$add$1;->()V +Lshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE; +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$1; +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$1;->()V +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$1;->()V +Lshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$2; +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$2;->()V +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$2;->()V +Lshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$3; +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$3;->()V +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$3;->()V +Lshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$4; +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$4;->()V +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$4;->()V +Lshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$5; +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$5;->()V +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$5;->()V +Lshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$6; +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$6;->()V +SPLshark/AndroidReferenceMatchers$INPUT_METHOD_MANAGER_IS_TERRIBLE$add$6;->()V +Lshark/AndroidReferenceMatchers$INSTRUMENTATION_RECOMMEND_ACTIVITY; +SPLshark/AndroidReferenceMatchers$INSTRUMENTATION_RECOMMEND_ACTIVITY;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$INSTRUMENTATION_RECOMMEND_ACTIVITY;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$INSTRUMENTATION_RECOMMEND_ACTIVITY$add$1; +SPLshark/AndroidReferenceMatchers$INSTRUMENTATION_RECOMMEND_ACTIVITY$add$1;->()V +SPLshark/AndroidReferenceMatchers$INSTRUMENTATION_RECOMMEND_ACTIVITY$add$1;->()V +Lshark/AndroidReferenceMatchers$IREQUEST_FINISH_CALLBACK; +SPLshark/AndroidReferenceMatchers$IREQUEST_FINISH_CALLBACK;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$IREQUEST_FINISH_CALLBACK;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$IREQUEST_FINISH_CALLBACK$add$1; +SPLshark/AndroidReferenceMatchers$IREQUEST_FINISH_CALLBACK$add$1;->()V +SPLshark/AndroidReferenceMatchers$IREQUEST_FINISH_CALLBACK$add$1;->()V +Lshark/AndroidReferenceMatchers$JOB_SERVICE; +SPLshark/AndroidReferenceMatchers$JOB_SERVICE;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$JOB_SERVICE;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$JOB_SERVICE$add$1; +SPLshark/AndroidReferenceMatchers$JOB_SERVICE$add$1;->()V +SPLshark/AndroidReferenceMatchers$JOB_SERVICE$add$1;->()V +Lshark/AndroidReferenceMatchers$LAYOUT_TRANSITION; +SPLshark/AndroidReferenceMatchers$LAYOUT_TRANSITION;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$LAYOUT_TRANSITION;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$LAYOUT_TRANSITION$add$1; +SPLshark/AndroidReferenceMatchers$LAYOUT_TRANSITION$add$1;->()V +SPLshark/AndroidReferenceMatchers$LAYOUT_TRANSITION$add$1;->()V +Lshark/AndroidReferenceMatchers$LEAK_CANARY_HEAP_DUMPER; +SPLshark/AndroidReferenceMatchers$LEAK_CANARY_HEAP_DUMPER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$LEAK_CANARY_HEAP_DUMPER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$LEAK_CANARY_INTERNAL; +SPLshark/AndroidReferenceMatchers$LEAK_CANARY_INTERNAL;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$LEAK_CANARY_INTERNAL;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$LEAK_CANARY_THREAD; +SPLshark/AndroidReferenceMatchers$LEAK_CANARY_THREAD;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$LEAK_CANARY_THREAD;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$LGCONTEXT__MCONTEXT; +SPLshark/AndroidReferenceMatchers$LGCONTEXT__MCONTEXT;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$LGCONTEXT__MCONTEXT;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$LGCONTEXT__MCONTEXT$add$1; +SPLshark/AndroidReferenceMatchers$LGCONTEXT__MCONTEXT$add$1;->()V +SPLshark/AndroidReferenceMatchers$LGCONTEXT__MCONTEXT$add$1;->()V +Lshark/AndroidReferenceMatchers$MAGNIFIER; +SPLshark/AndroidReferenceMatchers$MAGNIFIER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$MAGNIFIER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$MAGNIFIER$add$1; +SPLshark/AndroidReferenceMatchers$MAGNIFIER$add$1;->()V +SPLshark/AndroidReferenceMatchers$MAGNIFIER$add$1;->()V +Lshark/AndroidReferenceMatchers$MAIN; +SPLshark/AndroidReferenceMatchers$MAIN;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$MAIN;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$MAPPER_CLIENT; +SPLshark/AndroidReferenceMatchers$MAPPER_CLIENT;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$MAPPER_CLIENT;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$MAPPER_CLIENT$add$1; +SPLshark/AndroidReferenceMatchers$MAPPER_CLIENT$add$1;->()V +SPLshark/AndroidReferenceMatchers$MAPPER_CLIENT$add$1;->()V +Lshark/AndroidReferenceMatchers$MEDIA_PROJECTION_CALLBACK; +SPLshark/AndroidReferenceMatchers$MEDIA_PROJECTION_CALLBACK;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$MEDIA_PROJECTION_CALLBACK;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$MEDIA_PROJECTION_CALLBACK$add$1; +SPLshark/AndroidReferenceMatchers$MEDIA_PROJECTION_CALLBACK$add$1;->()V +SPLshark/AndroidReferenceMatchers$MEDIA_PROJECTION_CALLBACK$add$1;->()V +Lshark/AndroidReferenceMatchers$MEDIA_SCANNER_CONNECTION; +SPLshark/AndroidReferenceMatchers$MEDIA_SCANNER_CONNECTION;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$MEDIA_SCANNER_CONNECTION;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$MEDIA_SCANNER_CONNECTION$add$1; +SPLshark/AndroidReferenceMatchers$MEDIA_SCANNER_CONNECTION$add$1;->()V +SPLshark/AndroidReferenceMatchers$MEDIA_SCANNER_CONNECTION$add$1;->()V +Lshark/AndroidReferenceMatchers$MEDIA_SESSION_LEGACY_HELPER__SINSTANCE; +SPLshark/AndroidReferenceMatchers$MEDIA_SESSION_LEGACY_HELPER__SINSTANCE;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$MEDIA_SESSION_LEGACY_HELPER__SINSTANCE;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$MEDIA_SESSION_LEGACY_HELPER__SINSTANCE$add$1; +SPLshark/AndroidReferenceMatchers$MEDIA_SESSION_LEGACY_HELPER__SINSTANCE$add$1;->()V +SPLshark/AndroidReferenceMatchers$MEDIA_SESSION_LEGACY_HELPER__SINSTANCE$add$1;->()V +Lshark/AndroidReferenceMatchers$MULTI_WINDOW_DECOR_SUPPORT__MWINDOW; +SPLshark/AndroidReferenceMatchers$MULTI_WINDOW_DECOR_SUPPORT__MWINDOW;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$MULTI_WINDOW_DECOR_SUPPORT__MWINDOW;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$MULTI_WINDOW_DECOR_SUPPORT__MWINDOW$add$1; +SPLshark/AndroidReferenceMatchers$MULTI_WINDOW_DECOR_SUPPORT__MWINDOW$add$1;->()V +SPLshark/AndroidReferenceMatchers$MULTI_WINDOW_DECOR_SUPPORT__MWINDOW$add$1;->()V +Lshark/AndroidReferenceMatchers$OEM_SCENE_CALL_BLOCKER; +SPLshark/AndroidReferenceMatchers$OEM_SCENE_CALL_BLOCKER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$OEM_SCENE_CALL_BLOCKER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$OEM_SCENE_CALL_BLOCKER$add$1; +SPLshark/AndroidReferenceMatchers$OEM_SCENE_CALL_BLOCKER$add$1;->()V +SPLshark/AndroidReferenceMatchers$OEM_SCENE_CALL_BLOCKER$add$1;->()V +Lshark/AndroidReferenceMatchers$PERF_MONITOR_LAST_CALLBACK; +SPLshark/AndroidReferenceMatchers$PERF_MONITOR_LAST_CALLBACK;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$PERF_MONITOR_LAST_CALLBACK;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$PERF_MONITOR_LAST_CALLBACK$add$1; +SPLshark/AndroidReferenceMatchers$PERF_MONITOR_LAST_CALLBACK$add$1;->()V +SPLshark/AndroidReferenceMatchers$PERF_MONITOR_LAST_CALLBACK$add$1;->()V +Lshark/AndroidReferenceMatchers$PERMISSION_CONTROLLER_MANAGER; +SPLshark/AndroidReferenceMatchers$PERMISSION_CONTROLLER_MANAGER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$PERMISSION_CONTROLLER_MANAGER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$PERMISSION_CONTROLLER_MANAGER$add$1; +SPLshark/AndroidReferenceMatchers$PERMISSION_CONTROLLER_MANAGER$add$1;->()V +SPLshark/AndroidReferenceMatchers$PERMISSION_CONTROLLER_MANAGER$add$1;->()V +Lshark/AndroidReferenceMatchers$PERSONA_MANAGER; +SPLshark/AndroidReferenceMatchers$PERSONA_MANAGER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$PERSONA_MANAGER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$PERSONA_MANAGER$add$1; +SPLshark/AndroidReferenceMatchers$PERSONA_MANAGER$add$1;->()V +SPLshark/AndroidReferenceMatchers$PERSONA_MANAGER$add$1;->()V +Lshark/AndroidReferenceMatchers$PLAYER_BASE; +SPLshark/AndroidReferenceMatchers$PLAYER_BASE;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$PLAYER_BASE;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$PLAYER_BASE$add$1; +SPLshark/AndroidReferenceMatchers$PLAYER_BASE$add$1;->()V +SPLshark/AndroidReferenceMatchers$PLAYER_BASE$add$1;->()V +Lshark/AndroidReferenceMatchers$RAZER_TEXT_KEY_LISTENER__MCONTEXT; +SPLshark/AndroidReferenceMatchers$RAZER_TEXT_KEY_LISTENER__MCONTEXT;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$RAZER_TEXT_KEY_LISTENER__MCONTEXT;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$RAZER_TEXT_KEY_LISTENER__MCONTEXT$add$1; +SPLshark/AndroidReferenceMatchers$RAZER_TEXT_KEY_LISTENER__MCONTEXT$add$1;->()V +SPLshark/AndroidReferenceMatchers$RAZER_TEXT_KEY_LISTENER__MCONTEXT$add$1;->()V +Lshark/AndroidReferenceMatchers$REFERENCES; +SPLshark/AndroidReferenceMatchers$REFERENCES;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$REFERENCES;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$RENDER_NODE_ANIMATOR; +SPLshark/AndroidReferenceMatchers$RENDER_NODE_ANIMATOR;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$RENDER_NODE_ANIMATOR;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$RENDER_NODE_ANIMATOR$add$1; +SPLshark/AndroidReferenceMatchers$RENDER_NODE_ANIMATOR$add$1;->()V +SPLshark/AndroidReferenceMatchers$RENDER_NODE_ANIMATOR$add$1;->()V +Lshark/AndroidReferenceMatchers$RESOURCES__MCONTEXT; +SPLshark/AndroidReferenceMatchers$RESOURCES__MCONTEXT;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$RESOURCES__MCONTEXT;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$RESOURCES__MCONTEXT$add$1; +SPLshark/AndroidReferenceMatchers$RESOURCES__MCONTEXT$add$1;->()V +SPLshark/AndroidReferenceMatchers$RESOURCES__MCONTEXT$add$1;->()V +Lshark/AndroidReferenceMatchers$SEM_APP_ICON_SOLUTION; +SPLshark/AndroidReferenceMatchers$SEM_APP_ICON_SOLUTION;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$SEM_APP_ICON_SOLUTION;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$SEM_APP_ICON_SOLUTION$add$1; +SPLshark/AndroidReferenceMatchers$SEM_APP_ICON_SOLUTION$add$1;->()V +SPLshark/AndroidReferenceMatchers$SEM_APP_ICON_SOLUTION$add$1;->()V +Lshark/AndroidReferenceMatchers$SEM_CLIPBOARD_MANAGER__MCONTEXT; +SPLshark/AndroidReferenceMatchers$SEM_CLIPBOARD_MANAGER__MCONTEXT;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$SEM_CLIPBOARD_MANAGER__MCONTEXT;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$SEM_CLIPBOARD_MANAGER__MCONTEXT$add$1; +SPLshark/AndroidReferenceMatchers$SEM_CLIPBOARD_MANAGER__MCONTEXT$add$1;->()V +SPLshark/AndroidReferenceMatchers$SEM_CLIPBOARD_MANAGER__MCONTEXT$add$1;->()V +Lshark/AndroidReferenceMatchers$SEM_CLIPBOARD_MANAGER__MCONTEXT$add$2; +SPLshark/AndroidReferenceMatchers$SEM_CLIPBOARD_MANAGER__MCONTEXT$add$2;->()V +SPLshark/AndroidReferenceMatchers$SEM_CLIPBOARD_MANAGER__MCONTEXT$add$2;->()V +Lshark/AndroidReferenceMatchers$SEM_EMERGENCY_MANAGER__MCONTEXT; +SPLshark/AndroidReferenceMatchers$SEM_EMERGENCY_MANAGER__MCONTEXT;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$SEM_EMERGENCY_MANAGER__MCONTEXT;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$SEM_EMERGENCY_MANAGER__MCONTEXT$add$1; +SPLshark/AndroidReferenceMatchers$SEM_EMERGENCY_MANAGER__MCONTEXT$add$1;->()V +SPLshark/AndroidReferenceMatchers$SEM_EMERGENCY_MANAGER__MCONTEXT$add$1;->()V +Lshark/AndroidReferenceMatchers$SEM_PERSONA_MANAGER; +SPLshark/AndroidReferenceMatchers$SEM_PERSONA_MANAGER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$SEM_PERSONA_MANAGER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$SEM_PERSONA_MANAGER$add$1; +SPLshark/AndroidReferenceMatchers$SEM_PERSONA_MANAGER$add$1;->()V +SPLshark/AndroidReferenceMatchers$SEM_PERSONA_MANAGER$add$1;->()V +Lshark/AndroidReferenceMatchers$SMART_COVER_MANAGER; +SPLshark/AndroidReferenceMatchers$SMART_COVER_MANAGER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$SMART_COVER_MANAGER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$SMART_COVER_MANAGER$add$1; +SPLshark/AndroidReferenceMatchers$SMART_COVER_MANAGER$add$1;->()V +SPLshark/AndroidReferenceMatchers$SMART_COVER_MANAGER$add$1;->()V +Lshark/AndroidReferenceMatchers$SPAN_CONTROLLER; +SPLshark/AndroidReferenceMatchers$SPAN_CONTROLLER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$SPAN_CONTROLLER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$SPAN_CONTROLLER$add$1; +SPLshark/AndroidReferenceMatchers$SPAN_CONTROLLER$add$1;->()V +SPLshark/AndroidReferenceMatchers$SPAN_CONTROLLER$add$1;->()V +Lshark/AndroidReferenceMatchers$SPAN_CONTROLLER$add$2; +SPLshark/AndroidReferenceMatchers$SPAN_CONTROLLER$add$2;->()V +SPLshark/AndroidReferenceMatchers$SPAN_CONTROLLER$add$2;->()V +Lshark/AndroidReferenceMatchers$SPEECH_RECOGNIZER; +SPLshark/AndroidReferenceMatchers$SPEECH_RECOGNIZER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$SPEECH_RECOGNIZER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$SPEECH_RECOGNIZER$add$1; +SPLshark/AndroidReferenceMatchers$SPEECH_RECOGNIZER$add$1;->()V +SPLshark/AndroidReferenceMatchers$SPEECH_RECOGNIZER$add$1;->()V +Lshark/AndroidReferenceMatchers$SPELL_CHECKER; +SPLshark/AndroidReferenceMatchers$SPELL_CHECKER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$SPELL_CHECKER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$SPELL_CHECKER$add$1; +SPLshark/AndroidReferenceMatchers$SPELL_CHECKER$add$1;->()V +SPLshark/AndroidReferenceMatchers$SPELL_CHECKER$add$1;->()V +Lshark/AndroidReferenceMatchers$SPELL_CHECKER_SESSION; +SPLshark/AndroidReferenceMatchers$SPELL_CHECKER_SESSION;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$SPELL_CHECKER_SESSION;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$SPELL_CHECKER_SESSION$add$1; +SPLshark/AndroidReferenceMatchers$SPELL_CHECKER_SESSION$add$1;->()V +SPLshark/AndroidReferenceMatchers$SPELL_CHECKER_SESSION$add$1;->()V +Lshark/AndroidReferenceMatchers$SPEN_GESTURE_MANAGER; +SPLshark/AndroidReferenceMatchers$SPEN_GESTURE_MANAGER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$SPEN_GESTURE_MANAGER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$SPEN_GESTURE_MANAGER$add$1; +SPLshark/AndroidReferenceMatchers$SPEN_GESTURE_MANAGER$add$1;->()V +SPLshark/AndroidReferenceMatchers$SPEN_GESTURE_MANAGER$add$1;->()V +Lshark/AndroidReferenceMatchers$STATIC_MTARGET_VIEW; +SPLshark/AndroidReferenceMatchers$STATIC_MTARGET_VIEW;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$STATIC_MTARGET_VIEW;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$STATIC_MTARGET_VIEW$add$1; +SPLshark/AndroidReferenceMatchers$STATIC_MTARGET_VIEW$add$1;->()V +SPLshark/AndroidReferenceMatchers$STATIC_MTARGET_VIEW$add$1;->()V +Lshark/AndroidReferenceMatchers$SYSTEM_SENSOR_MANAGER__MAPPCONTEXTIMPL; +SPLshark/AndroidReferenceMatchers$SYSTEM_SENSOR_MANAGER__MAPPCONTEXTIMPL;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$SYSTEM_SENSOR_MANAGER__MAPPCONTEXTIMPL;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$SYSTEM_SENSOR_MANAGER__MAPPCONTEXTIMPL$add$1; +SPLshark/AndroidReferenceMatchers$SYSTEM_SENSOR_MANAGER__MAPPCONTEXTIMPL$add$1;->()V +SPLshark/AndroidReferenceMatchers$SYSTEM_SENSOR_MANAGER__MAPPCONTEXTIMPL$add$1;->()V +Lshark/AndroidReferenceMatchers$TEXT_LINE__SCACHED; +SPLshark/AndroidReferenceMatchers$TEXT_LINE__SCACHED;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$TEXT_LINE__SCACHED;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$TEXT_LINE__SCACHED$add$1; +SPLshark/AndroidReferenceMatchers$TEXT_LINE__SCACHED$add$1;->()V +SPLshark/AndroidReferenceMatchers$TEXT_LINE__SCACHED$add$1;->()V +Lshark/AndroidReferenceMatchers$TEXT_TO_SPEECH; +SPLshark/AndroidReferenceMatchers$TEXT_TO_SPEECH;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$TEXT_TO_SPEECH;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$TEXT_TO_SPEECH$add$1; +SPLshark/AndroidReferenceMatchers$TEXT_TO_SPEECH$add$1;->()V +SPLshark/AndroidReferenceMatchers$TEXT_TO_SPEECH$add$1;->()V +Lshark/AndroidReferenceMatchers$TEXT_TO_SPEECH$add$2; +SPLshark/AndroidReferenceMatchers$TEXT_TO_SPEECH$add$2;->()V +SPLshark/AndroidReferenceMatchers$TEXT_TO_SPEECH$add$2;->()V +Lshark/AndroidReferenceMatchers$TEXT_VIEW__MLAST_HOVERED_VIEW; +SPLshark/AndroidReferenceMatchers$TEXT_VIEW__MLAST_HOVERED_VIEW;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$TEXT_VIEW__MLAST_HOVERED_VIEW;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$TEXT_VIEW__MLAST_HOVERED_VIEW$add$1; +SPLshark/AndroidReferenceMatchers$TEXT_VIEW__MLAST_HOVERED_VIEW$add$1;->()V +SPLshark/AndroidReferenceMatchers$TEXT_VIEW__MLAST_HOVERED_VIEW$add$1;->()V +Lshark/AndroidReferenceMatchers$TOAST_TN; +SPLshark/AndroidReferenceMatchers$TOAST_TN;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$TOAST_TN;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$UI_MODE_MANAGER; +SPLshark/AndroidReferenceMatchers$UI_MODE_MANAGER;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$UI_MODE_MANAGER;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$UI_MODE_MANAGER$add$1; +SPLshark/AndroidReferenceMatchers$UI_MODE_MANAGER$add$1;->()V +SPLshark/AndroidReferenceMatchers$UI_MODE_MANAGER$add$1;->()V +Lshark/AndroidReferenceMatchers$USER_MANAGER__SINSTANCE; +SPLshark/AndroidReferenceMatchers$USER_MANAGER__SINSTANCE;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$USER_MANAGER__SINSTANCE;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$USER_MANAGER__SINSTANCE$add$1; +SPLshark/AndroidReferenceMatchers$USER_MANAGER__SINSTANCE$add$1;->()V +SPLshark/AndroidReferenceMatchers$USER_MANAGER__SINSTANCE$add$1;->()V +Lshark/AndroidReferenceMatchers$VIEWLOCATIONHOLDER_ROOT; +SPLshark/AndroidReferenceMatchers$VIEWLOCATIONHOLDER_ROOT;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$VIEWLOCATIONHOLDER_ROOT;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$VIEWLOCATIONHOLDER_ROOT$add$1; +SPLshark/AndroidReferenceMatchers$VIEWLOCATIONHOLDER_ROOT$add$1;->()V +SPLshark/AndroidReferenceMatchers$VIEWLOCATIONHOLDER_ROOT$add$1;->()V +Lshark/AndroidReferenceMatchers$VIEW_CONFIGURATION__MCONTEXT; +SPLshark/AndroidReferenceMatchers$VIEW_CONFIGURATION__MCONTEXT;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$VIEW_CONFIGURATION__MCONTEXT;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$VIEW_CONFIGURATION__MCONTEXT$add$1; +SPLshark/AndroidReferenceMatchers$VIEW_CONFIGURATION__MCONTEXT$add$1;->()V +SPLshark/AndroidReferenceMatchers$VIEW_CONFIGURATION__MCONTEXT$add$1;->()V +Lshark/AndroidReferenceMatchers$VIEW_GROUP__M_CURRENT_DRAG_CHILD; +SPLshark/AndroidReferenceMatchers$VIEW_GROUP__M_CURRENT_DRAG_CHILD;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$VIEW_GROUP__M_CURRENT_DRAG_CHILD;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$VIEW_GROUP__M_CURRENT_DRAG_CHILD$add$1; +SPLshark/AndroidReferenceMatchers$VIEW_GROUP__M_CURRENT_DRAG_CHILD$add$1;->()V +SPLshark/AndroidReferenceMatchers$VIEW_GROUP__M_CURRENT_DRAG_CHILD$add$1;->()V +Lshark/AndroidReferenceMatchers$VIEW_GROUP__M_PRE_SORTED_CHILDREN; +SPLshark/AndroidReferenceMatchers$VIEW_GROUP__M_PRE_SORTED_CHILDREN;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$VIEW_GROUP__M_PRE_SORTED_CHILDREN;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$VIEW_GROUP__M_PRE_SORTED_CHILDREN$add$1; +SPLshark/AndroidReferenceMatchers$VIEW_GROUP__M_PRE_SORTED_CHILDREN$add$1;->()V +SPLshark/AndroidReferenceMatchers$VIEW_GROUP__M_PRE_SORTED_CHILDREN$add$1;->()V +Lshark/AndroidReferenceMatchers$VIEW_TOOLTIP_CALLBACK; +SPLshark/AndroidReferenceMatchers$VIEW_TOOLTIP_CALLBACK;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$VIEW_TOOLTIP_CALLBACK;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$VIEW_TOOLTIP_CALLBACK$add$1; +SPLshark/AndroidReferenceMatchers$VIEW_TOOLTIP_CALLBACK$add$1;->()V +SPLshark/AndroidReferenceMatchers$VIEW_TOOLTIP_CALLBACK$add$1;->()V +Lshark/AndroidReferenceMatchers$WINDOW_ON_BACK_INVOKED_DISPATCHER__STUB; +SPLshark/AndroidReferenceMatchers$WINDOW_ON_BACK_INVOKED_DISPATCHER__STUB;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$WINDOW_ON_BACK_INVOKED_DISPATCHER__STUB;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$WINDOW_ON_BACK_INVOKED_DISPATCHER__STUB$add$1; +SPLshark/AndroidReferenceMatchers$WINDOW_ON_BACK_INVOKED_DISPATCHER__STUB$add$1;->()V +SPLshark/AndroidReferenceMatchers$WINDOW_ON_BACK_INVOKED_DISPATCHER__STUB$add$1;->()V +Lshark/AndroidReferenceMatchers$XIAMI__RESOURCES_IMPL; +SPLshark/AndroidReferenceMatchers$XIAMI__RESOURCES_IMPL;->(Ljava/lang/String;I)V +SPLshark/AndroidReferenceMatchers$XIAMI__RESOURCES_IMPL;->add$shark_android(Ljava/util/List;)V +Lshark/AndroidReferenceMatchers$XIAMI__RESOURCES_IMPL$add$1; +SPLshark/AndroidReferenceMatchers$XIAMI__RESOURCES_IMPL$add$1;->()V +SPLshark/AndroidReferenceMatchers$XIAMI__RESOURCES_IMPL$add$1;->()V +Lshark/FilteringLeakingObjectFinder$LeakingObjectFilter; +Lshark/IgnoredReferenceMatcher; +SPLshark/IgnoredReferenceMatcher;->(Lshark/ReferencePattern;)V +Lshark/KeyedWeakReferenceFinder; +SPLshark/KeyedWeakReferenceFinder;->()V +SPLshark/KeyedWeakReferenceFinder;->()V +Lshark/LeakingObjectFinder; +Lshark/LibraryLeakReferenceMatcher; +SPLshark/LibraryLeakReferenceMatcher;->(Lshark/ReferencePattern;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V +Lshark/MetadataExtractor; +Lshark/ObjectInspector; +Lshark/ObjectInspectors; +SPLshark/ObjectInspectors;->()V +SPLshark/ObjectInspectors;->(Ljava/lang/String;I)V +SPLshark/ObjectInspectors;->(Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLshark/ObjectInspectors;->access$getJdkLeakingObjectFilters$cp()Ljava/util/List; +SPLshark/ObjectInspectors;->getLeakingObjectFilter$shark()Lkotlin/jvm/functions/Function1; +SPLshark/ObjectInspectors;->values()[Lshark/ObjectInspectors; +Lshark/ObjectInspectors$ANONYMOUS_CLASS; +SPLshark/ObjectInspectors$ANONYMOUS_CLASS;->(Ljava/lang/String;I)V +Lshark/ObjectInspectors$CLASS; +SPLshark/ObjectInspectors$CLASS;->(Ljava/lang/String;I)V +Lshark/ObjectInspectors$CLASSLOADER; +SPLshark/ObjectInspectors$CLASSLOADER;->(Ljava/lang/String;I)V +Lshark/ObjectInspectors$Companion; +SPLshark/ObjectInspectors$Companion;->()V +SPLshark/ObjectInspectors$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLshark/ObjectInspectors$Companion;->createLeakingObjectFilters(Ljava/util/Set;)Ljava/util/List; +SPLshark/ObjectInspectors$Companion;->getJdkDefaults()Ljava/util/List; +SPLshark/ObjectInspectors$Companion;->getJdkLeakingObjectFilters()Ljava/util/List; +Lshark/ObjectInspectors$Companion$createLeakingObjectFilters$2$1; +SPLshark/ObjectInspectors$Companion$createLeakingObjectFilters$2$1;->(Lkotlin/jvm/functions/Function1;)V +Lshark/ObjectInspectors$KEYED_WEAK_REFERENCE; +SPLshark/ObjectInspectors$KEYED_WEAK_REFERENCE;->(Ljava/lang/String;I)V +SPLshark/ObjectInspectors$KEYED_WEAK_REFERENCE;->getLeakingObjectFilter$shark()Lkotlin/jvm/functions/Function1; +Lshark/ObjectInspectors$KEYED_WEAK_REFERENCE$leakingObjectFilter$1; +SPLshark/ObjectInspectors$KEYED_WEAK_REFERENCE$leakingObjectFilter$1;->()V +SPLshark/ObjectInspectors$KEYED_WEAK_REFERENCE$leakingObjectFilter$1;->()V +Lshark/ObjectInspectors$THREAD; +SPLshark/ObjectInspectors$THREAD;->(Ljava/lang/String;I)V +Lshark/ReferenceMatcher; +SPLshark/ReferenceMatcher;->()V +SPLshark/ReferenceMatcher;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lshark/ReferencePattern; +SPLshark/ReferencePattern;->()V +SPLshark/ReferencePattern;->()V +SPLshark/ReferencePattern;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lshark/ReferencePattern$Companion; +SPLshark/ReferencePattern$Companion;->()V +SPLshark/ReferencePattern$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lshark/ReferencePattern$InstanceFieldPattern; +SPLshark/ReferencePattern$InstanceFieldPattern;->()V +SPLshark/ReferencePattern$InstanceFieldPattern;->(Ljava/lang/String;Ljava/lang/String;)V +Lshark/ReferencePattern$InstanceFieldPattern$Companion; +SPLshark/ReferencePattern$InstanceFieldPattern$Companion;->()V +SPLshark/ReferencePattern$InstanceFieldPattern$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lshark/ReferencePattern$JavaLocalPattern; +SPLshark/ReferencePattern$JavaLocalPattern;->()V +SPLshark/ReferencePattern$JavaLocalPattern;->(Ljava/lang/String;)V +Lshark/ReferencePattern$JavaLocalPattern$Companion; +SPLshark/ReferencePattern$JavaLocalPattern$Companion;->()V +SPLshark/ReferencePattern$JavaLocalPattern$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lshark/ReferencePattern$NativeGlobalVariablePattern; +SPLshark/ReferencePattern$NativeGlobalVariablePattern;->()V +SPLshark/ReferencePattern$NativeGlobalVariablePattern;->(Ljava/lang/String;)V +Lshark/ReferencePattern$NativeGlobalVariablePattern$Companion; +SPLshark/ReferencePattern$NativeGlobalVariablePattern$Companion;->()V +SPLshark/ReferencePattern$NativeGlobalVariablePattern$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lshark/ReferencePattern$StaticFieldPattern; +SPLshark/ReferencePattern$StaticFieldPattern;->()V +SPLshark/ReferencePattern$StaticFieldPattern;->(Ljava/lang/String;Ljava/lang/String;)V +Lshark/ReferencePattern$StaticFieldPattern$Companion; +SPLshark/ReferencePattern$StaticFieldPattern$Companion;->()V +SPLshark/ReferencePattern$StaticFieldPattern$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +Lshark/SharkLog; +SPLshark/SharkLog;->()V +SPLshark/SharkLog;->()V +SPLshark/SharkLog;->getLogger()Lshark/SharkLog$Logger; +Ltimber/log/Timber; +SPLtimber/log/Timber;->()V +SPLtimber/log/Timber;->access$getTreeArray$cp()[Ltimber/log/Timber$Tree; +SPLtimber/log/Timber;->access$getTrees$cp()Ljava/util/ArrayList; +SPLtimber/log/Timber;->access$setTreeArray$cp([Ltimber/log/Timber$Tree;)V +Ltimber/log/Timber$Forest; +SPLtimber/log/Timber$Forest;->()V +SPLtimber/log/Timber$Forest;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +SPLtimber/log/Timber$Forest;->d(Ljava/lang/String;[Ljava/lang/Object;)V +SPLtimber/log/Timber$Forest;->i(Ljava/lang/String;[Ljava/lang/Object;)V +SPLtimber/log/Timber$Forest;->log(ILjava/lang/Throwable;Ljava/lang/String;[Ljava/lang/Object;)V +SPLtimber/log/Timber$Forest;->plant(Ltimber/log/Timber$Tree;)V +SPLtimber/log/Timber$Forest;->tag(Ljava/lang/String;)Ltimber/log/Timber$Tree; +SPLtimber/log/Timber$Forest;->v(Ljava/lang/String;[Ljava/lang/Object;)V +PLtimber/log/Timber$Forest;->w(Ljava/lang/String;[Ljava/lang/Object;)V +Ltimber/log/Timber$Tree; +SPLtimber/log/Timber$Tree;->()V +SPLtimber/log/Timber$Tree;->d(Ljava/lang/String;[Ljava/lang/Object;)V +SPLtimber/log/Timber$Tree;->formatMessage(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; +SPLtimber/log/Timber$Tree;->getExplicitTag$timber_release()Ljava/lang/ThreadLocal; +SPLtimber/log/Timber$Tree;->getTag$timber_release()Ljava/lang/String; +SPLtimber/log/Timber$Tree;->i(Ljava/lang/String;[Ljava/lang/Object;)V +SPLtimber/log/Timber$Tree;->isLoggable(I)Z +SPLtimber/log/Timber$Tree;->isLoggable(Ljava/lang/String;I)Z +SPLtimber/log/Timber$Tree;->log(ILjava/lang/Throwable;Ljava/lang/String;[Ljava/lang/Object;)V +SPLtimber/log/Timber$Tree;->prepareLog(ILjava/lang/Throwable;Ljava/lang/String;[Ljava/lang/Object;)V +SPLtimber/log/Timber$Tree;->v(Ljava/lang/String;[Ljava/lang/Object;)V +PLtimber/log/Timber$Tree;->w(Ljava/lang/String;[Ljava/lang/Object;)V \ No newline at end of file diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt b/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt index d3f2effea34e..5bc7688de104 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt @@ -9,7 +9,6 @@ package com.ichi2.anki import android.annotation.SuppressLint -import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.content.SharedPreferences @@ -131,7 +130,6 @@ import com.ichi2.anki.multimedia.getAvTag import com.ichi2.anki.observability.ChangeManager import com.ichi2.anki.observability.undoableOp import com.ichi2.anki.pages.AnkiServer -import com.ichi2.anki.pages.CongratsPage import com.ichi2.anki.pages.PostRequestHandler import com.ichi2.anki.pages.PostRequestUri import com.ichi2.anki.reviewer.AutomaticAnswer @@ -150,6 +148,7 @@ import com.ichi2.anki.settings.Prefs import com.ichi2.anki.snackbar.BaseSnackbarBuilderProvider import com.ichi2.anki.snackbar.SnackbarBuilder import com.ichi2.anki.snackbar.showSnackbar +import com.ichi2.anki.study.StudyCompletionUi import com.ichi2.anki.ui.windows.reviewer.StudyScreenRepository import com.ichi2.anki.utils.OnlyOnce.Method.ANSWER_CARD import com.ichi2.anki.utils.OnlyOnce.preventSimultaneousExecutions @@ -179,6 +178,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock import java.util.function.Consumer import java.util.function.Function import kotlin.math.abs +import com.ichi2.anki.common.android.R as CommonR abstract class AbstractFlashcardViewer : NavigationDrawerActivity(), @@ -526,7 +526,7 @@ abstract class AbstractFlashcardViewer : closeReviewer(RESULT_NO_MORE_CARDS) // When launched with a shortcut, we want to display a message when finishing if (intent.getBooleanExtra(EXTRA_STARTED_WITH_SHORTCUT, false)) { - CongratsPage.display(this) + StudyCompletionUi.displayFromShortcut(this) } return } @@ -977,7 +977,7 @@ abstract class AbstractFlashcardViewer : } } if (animationEnabled()) { - flipCardLayout?.setBackgroundResource(getResFromAttr(this, R.attr.hardButtonRippleRef)) + flipCardLayout?.setBackgroundResource(getResFromAttr(this, CommonR.attr.hardButtonRippleRef)) } if (!buttonHeightSet && relativeButtonSize != 100) { val params = flipCardLayout!!.layoutParams @@ -2627,7 +2627,8 @@ abstract class AbstractFlashcardViewer : } if (intent == null) { val uri = url.toUri() - if (!appPermission.checkCanLaunchExternalApps()) { + intent = appPermission.createUrlIntent(uri) + if (intent == null) { Timber.w("URL blocked: canLaunchExternalApps") return true } @@ -2636,14 +2637,13 @@ abstract class AbstractFlashcardViewer : return true } Timber.d("Opening external link \"%s\" with an Intent", url) - intent = Intent(Intent.ACTION_VIEW, uri) } else { Timber.d("Opening resolved external link \"%s\" with an Intent: %s", url, intent) } try { startActivity(intent) - } catch (_: ActivityNotFoundException) { - Timber.w("No app found to handle open external url from AbstractFlashcardViewer") + } catch (e: Exception) { + Timber.w(e, "Could not open url from AbstractFlashcardViewer") showSnackbar(CommonString.activity_start_failed) } return true diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/AndroidTtsPlayer.kt b/AnkiDroid/src/main/java/com/ichi2/anki/AndroidTtsPlayer.kt index f300040ba594..d72fb7a5b42f 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/AndroidTtsPlayer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/AndroidTtsPlayer.kt @@ -24,6 +24,7 @@ import timber.log.Timber import kotlin.coroutines.resume class AndroidTtsPlayer( + /** Voices in engine-preference order, with the default engine first. */ private val voices: List, /** Builds a [TextToSpeech] bound to an engine package. Overridable for testing */ private val ttsFactory: suspend (engine: String) -> TextToSpeech? = { engine -> TtsVoices.createTts(engine) }, @@ -93,7 +94,7 @@ class AndroidTtsPlayer( TtsVoices.ttsEngine?.let { defaultEngine -> getOrCreateTts(defaultEngine) } } - // Prefer installed voices for language fallback without changing the shared matcher. + // Prefer installed voices for language fallback, preserving engine-preference order. // Keep uninstalled voices selectable: an explicit request can trigger their download. override fun getAvailableVoices(): List = voices.sortedBy { it.unavailable() } @@ -198,7 +199,7 @@ class AndroidTtsPlayer( @CheckResult suspend fun createInstance(scope: CoroutineScope): AndroidTtsPlayer { - val voices = TtsVoices.allTtsVoices().toList() + val voices = TtsVoices.allTtsVoices() return AndroidTtsPlayer(voices).apply { init(scope) Timber.v("TTS creation: initialized player instance") diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/AnkiActivity.kt b/AnkiDroid/src/main/java/com/ichi2/anki/AnkiActivity.kt index 65f4a46e8656..4a777452fad0 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/AnkiActivity.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/AnkiActivity.kt @@ -83,10 +83,10 @@ import com.ichi2.anki.dialogs.DatabaseErrorDialog import com.ichi2.anki.dialogs.DatabaseErrorDialog.CustomExceptionData import com.ichi2.anki.dialogs.DatabaseErrorDialog.DatabaseErrorDialogType import com.ichi2.anki.dialogs.DialogHandler -import com.ichi2.anki.dialogs.ExportReadyDialog.Companion.ARG_SHARE_AS_TEXT -import com.ichi2.anki.dialogs.ExportReadyDialog.Companion.KEY_EXPORT_PATH import com.ichi2.anki.dialogs.ExportReadyDialog.Companion.REQUEST_EXPORT_SAVE import com.ichi2.anki.dialogs.ExportReadyDialog.Companion.REQUEST_EXPORT_SHARE +import com.ichi2.anki.dialogs.ExportReadyDialog.Companion.RESULT_EXPORT_PATH +import com.ichi2.anki.dialogs.ExportReadyDialog.Companion.RESULT_SHARE_AS_TEXT import com.ichi2.anki.dialogs.SimpleMessageDialog import com.ichi2.anki.dialogs.handleExportReadyRequest import com.ichi2.anki.dialogs.viewmodel.ExportReadyViewModel @@ -166,17 +166,17 @@ open class AnkiActivity( super.onCreate(savedInstanceState) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { @Suppress("deprecation") - window.navigationBarColor = getColor(R.color.transparent) + window.navigationBarColor = getColor(CommonR.color.transparent) } supportFragmentManager.setFragmentResultListener(REQUEST_EXPORT_SAVE, this) { _, bundle -> saveExportFile( - bundle.getString(KEY_EXPORT_PATH) ?: error("Missing required exportPath!"), + bundle.getString(RESULT_EXPORT_PATH) ?: error("Missing required exportPath!"), ) } supportFragmentManager.setFragmentResultListener(REQUEST_EXPORT_SHARE, this) { _, bundle -> shareFile( - path = bundle.requireString(KEY_EXPORT_PATH), - asText = bundle.getBoolean(ARG_SHARE_AS_TEXT, false), + path = bundle.requireString(RESULT_EXPORT_PATH), + asText = bundle.getBoolean(RESULT_SHARE_AS_TEXT, false), ) } @@ -187,7 +187,7 @@ open class AnkiActivity( } if (savedInstanceState != null) { - val restoredValue = savedInstanceState.getString(KEY_EXPORT_FILE_NAME) ?: return + val restoredValue = savedInstanceState.getString(STATE_EXPORT_FILE_PATH) ?: return fileExportPath = restoredValue } } @@ -279,12 +279,12 @@ open class AnkiActivity( /** * Maps from intent name action to function to run when this action is received by [broadcastReceiver]. - * By default it handles [SdCardReceiver.MEDIA_EJECT], and shows/dismisses dialogs when an SD + * By default it handles [SdCardReceiver.ACTION_MEDIA_EJECT], and shows/dismisses dialogs when an SD * card is ejected/remounted (collection is saved beforehand by [SdCardReceiver]) */ protected open val broadcastsActions = mapOf( - SdCardReceiver.MEDIA_EJECT to { onSdCardNotMounted() }, + SdCardReceiver.ACTION_MEDIA_EJECT to { onSdCardNotMounted() }, ) /** @@ -718,7 +718,7 @@ open class AnkiActivity( override fun onSaveInstanceState(outState: Bundle) { if (::fileExportPath.isInitialized) { - outState.putString(KEY_EXPORT_FILE_NAME, fileExportPath) + outState.putString(STATE_EXPORT_FILE_PATH, fileExportPath) } super.onSaveInstanceState(outState) } @@ -864,7 +864,7 @@ open class AnkiActivity( const val EXTRA_FINISH_ANIMATION = "finishAnimation" private const val SIMPLE_NOTIFICATION_ID = 0 - private const val KEY_EXPORT_FILE_NAME = "key_export_file_name" + private const val STATE_EXPORT_FILE_PATH = "key_export_file_name" } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidApp.kt b/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidApp.kt index e0936fb42fee..18a4373e5b02 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidApp.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidApp.kt @@ -38,6 +38,7 @@ import com.ichi2.anki.common.crashreporting.CrashReportService.sendExceptionRepo import com.ichi2.anki.common.permissions.hasLegacyStorageAccessPermission import com.ichi2.anki.common.preferences.sharedPrefs import com.ichi2.anki.common.storage.CollectionHelper +import com.ichi2.anki.common.storage.StorageDecision import com.ichi2.anki.common.utils.android.SdCard import com.ichi2.anki.common.utils.android.showThemedToast import com.ichi2.anki.common.utils.annotation.KotlinCleanup @@ -59,6 +60,7 @@ import com.ichi2.anki.multiprofile.isPhoenixProcess import com.ichi2.anki.navigation.initializeNavigator import com.ichi2.anki.observability.ChangeManager import com.ichi2.anki.preferences.SharedPreferencesProvider +import com.ichi2.anki.recorder.VoiceRecorder import com.ichi2.anki.reviewreminders.ReminderLogTree import com.ichi2.anki.servicelayer.DebugInfoService import com.ichi2.anki.servicelayer.ThrowableFilterService @@ -66,16 +68,18 @@ import com.ichi2.anki.services.NotificationService import com.ichi2.anki.settings.Prefs import com.ichi2.anki.settings.PrefsRepository import com.ichi2.anki.startup.configureBackendTemporaryDirectory -import com.ichi2.anki.startup.ensureCollectionPathSet import com.ichi2.anki.startup.getDefaultAnkiDroidDirectory +import com.ichi2.anki.startup.maybeSetDefaultCollectionPath import com.ichi2.anki.ui.dialogs.ActivityAgnosticDialogs import com.ichi2.anki.widget.RECURRING_WIDGETS import com.ichi2.utils.ExceptionUtil import com.ichi2.utils.LanguageUtil import com.ichi2.utils.measureTime import com.ichi2.utils.setWebContentsDebuggingEnabled +import com.ichi2.widget.AnkiDroidWidgetSmall import com.ichi2.widget.DayRolloverAlarm import com.ichi2.widget.WidgetNotificationScheduler +import com.ichi2.widget.WidgetStatus import com.ichi2.widget.cardanalysis.CardAnalysisWidget import com.ichi2.widget.deckpicker.DeckPickerWidget import com.ichi2.widget.restoreRecurringAlarms @@ -129,8 +133,8 @@ open class AnkiDroidApp : } } + @set:VisibleForTesting var profileManager: ProfileManager? = null - private set private val profileContext: Context? get() = profileManager?.activeProfileContext @@ -188,6 +192,7 @@ open class AnkiDroidApp : initializeNavigator() initializeWidgetRepository() WidgetNotificationScheduler.register { scheduleNotification() } + WidgetStatus.register(Prefs) { context -> AnkiDroidWidgetSmall.UpdateService().doUpdate(context) } Animations.setPreferencesProvider { context -> PrefsRepository(context) } CollectionLockedException.messageProvider = { getString(CommonString.database_locked_summary_new, getString(CommonString.col_path)) @@ -279,6 +284,7 @@ open class AnkiDroidApp : runCatching { measureTime("cacheCleanup") { MultimediaArgsStorage.create(this@AnkiDroidApp).removeExpiredFiles() + VoiceRecorder.removeExpiredRecordings(VoiceRecorder.recordingsDirectory(this@AnkiDroidApp)) } }.onFailure { Timber.w(it, "Unable to clean up expired cache files") } } @@ -346,7 +352,13 @@ open class AnkiDroidApp : // is not considered to be a fatal error, unless the directory itself is not writable. val ankiDroidDir = try { - ensureCollectionPathSet(this) + maybeSetDefaultCollectionPath(this) + if (CollectionHelper.storageDecision(this.sharedPrefs()) != StorageDecision.Decided) { + // a fresh install without access to public storage: the user + // decides via the permission screen (see maybeSetDefaultCollectionPath) + Timber.i("skipping AnkiDroid directory init: storage is undecided") + return@setup + } CollectionHelper.getCurrentAnkiDroidDirectory(this) } catch (e: SystemStorageException) { fatalInitializationError = FatalInitializationError.StorageError(e) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt b/AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt index e25b9b46ff09..b562c562a452 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt @@ -35,6 +35,7 @@ import com.google.android.material.snackbar.Snackbar import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.browser.BrowserRowCollection +import com.ichi2.anki.browser.BrowserSearchFeedbackMode import com.ichi2.anki.browser.CardBrowserFragment import com.ichi2.anki.browser.CardBrowserLaunchOptions import com.ichi2.anki.browser.CardBrowserViewModel @@ -84,6 +85,7 @@ import com.ichi2.anki.ui.internationalization.sentenceCase import com.ichi2.anki.utils.ext.addPrepareMenuProvider import com.ichi2.anki.utils.ext.launchCollectionInLifecycleScope import com.ichi2.anki.utils.ext.onAllFragmentsLoaded +import com.ichi2.anki.utils.showSearchError import com.ichi2.ui.CardBrowserSearchView import com.ichi2.utils.AndroidUiUtils.hideKeyboard import com.ichi2.utils.LanguageUtil @@ -489,7 +491,7 @@ open class CardBrowser : searchView?.post { searchView?.clearFocus() } } is SearchState.Error -> { - showError(searchState.error, crashReportData = null) + showSearchError(searchState.error) } } } @@ -617,18 +619,21 @@ open class CardBrowser : ) } - private fun forceRefreshSearch(useSearchTextValue: Boolean = false) { + private fun forceRefreshSearch( + useSearchTextValue: Boolean = false, + feedbackMode: BrowserSearchFeedbackMode = BrowserSearchFeedbackMode.NONE, + ) { if (useSearchTextValue && searchView != null) { - viewModel.setQuery(searchView!!.query.toString()) + viewModel.setQuery(searchView!!.query.toString(), feedbackMode = feedbackMode) } else { - viewModel.launchSearchForCards() + viewModel.launchSearchForCards(feedbackMode = feedbackMode) } } - private fun refreshBrowserUI() { + private fun refreshBrowserUI(feedbackMode: BrowserSearchFeedbackMode) { hideProgressBar() // reload whole view - forceRefreshSearch() + forceRefreshSearch(feedbackMode = feedbackMode) viewModel.endMultiSelectMode(SingleSelectCause.Other) invalidateOptionsMenu() // maybe the availability of undo changed } @@ -670,7 +675,9 @@ open class CardBrowser : changes.card ) { // We refresh the Browser's own UI - refreshBrowserUI() + val feedbackMode = + if (handler is NoteEditorFragment) BrowserSearchFeedbackMode.COUNT_ONLY else BrowserSearchFeedbackMode.NONE + refreshBrowserUI(feedbackMode) } } @@ -727,7 +734,7 @@ open class CardBrowser : companion object { // Keys for saving pane weights in SharedPreferences private const val PREF_CARD_BROWSER_PANE_WEIGHT = "cardBrowserPaneWeight" - private const val PREF_NOTE_EDITOR_PANE_WEIGHT = "noteEditorPaneWeight" + private const val PREF_NOTE_EDITOR_PANE_WEIGHT = "cardBrowserNoteEditorPaneWeight" // Values related to persistent state data fun clearLastDeckId() = SharedPreferencesLastDeckIdRepository.clearLastDeckId() diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateBrowserAppearanceEditor.kt b/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateBrowserAppearanceEditor.kt index 3f3e446b9b55..929ae1319c10 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateBrowserAppearanceEditor.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateBrowserAppearanceEditor.kt @@ -69,13 +69,17 @@ class CardTemplateBrowserAppearanceEditor : AnkiActivity(R.layout.activity_card_ view.updatePadding(left = constraints.left, right = constraints.right, bottom = constraints.bottom) insets } - val bundle = savedInstanceState ?: intent.extras - if (bundle == null) { - showThemedToast(this, getString(CommonString.something_wrong), true) - finish() - return + when { + savedInstanceState != null -> + initializeUi(savedInstanceState.getString(STATE_QUESTION_FORMAT), savedInstanceState.getString(STATE_ANSWER_FORMAT)) + intent.extras != null -> + initializeUi(intent.getStringExtra(EXTRA_QUESTION_FORMAT), intent.getStringExtra(EXTRA_ANSWER_FORMAT)) + else -> { + showThemedToast(this, getString(CommonString.something_wrong), true) + finish() + return + } } - initializeUiFromBundle(bundle) // default result, only changed to RESULT_OK if actually saving changes setResult(RESULT_CANCELED) onBackPressedDispatcher.addCallback(discardChangesCallback) @@ -137,14 +141,17 @@ class CardTemplateBrowserAppearanceEditor : AnkiActivity(R.layout.activity_card_ } public override fun onSaveInstanceState(outState: Bundle) { - outState.putString(INTENT_QUESTION_FORMAT, questionFormat) - outState.putString(INTENT_ANSWER_FORMAT, answerFormat) + outState.putString(STATE_QUESTION_FORMAT, questionFormat) + outState.putString(STATE_ANSWER_FORMAT, answerFormat) super.onSaveInstanceState(outState) } - private fun initializeUiFromBundle(bundle: Bundle) { - binding.questionFormat.setText(bundle.getString(INTENT_QUESTION_FORMAT)) - binding.answerFormat.setText(bundle.getString(INTENT_ANSWER_FORMAT)) + private fun initializeUi( + questionFormat: String?, + answerFormat: String?, + ) { + binding.questionFormat.setText(questionFormat) + binding.answerFormat.setText(answerFormat) discardChangesCallback.isEnabled = hasChanges() @@ -152,9 +159,9 @@ class CardTemplateBrowserAppearanceEditor : AnkiActivity(R.layout.activity_card_ title = TR.sentenceCase.browserAppearance } - private fun answerHasChanged(intent: Intent): Boolean = intent.getStringExtra(INTENT_ANSWER_FORMAT) != answerFormat + private fun answerHasChanged(intent: Intent): Boolean = intent.getStringExtra(EXTRA_ANSWER_FORMAT) != answerFormat - private fun questionHasChanged(intent: Intent): Boolean = intent.getStringExtra(INTENT_QUESTION_FORMAT) != questionFormat + private fun questionHasChanged(intent: Intent): Boolean = intent.getStringExtra(EXTRA_QUESTION_FORMAT) != questionFormat private val questionFormat: String get() = getTextValue(binding.questionFormat) @@ -174,8 +181,8 @@ class CardTemplateBrowserAppearanceEditor : AnkiActivity(R.layout.activity_card_ Timber.i("Save and Exit") val data = Intent().apply { - putExtra(INTENT_QUESTION_FORMAT, questionFormat) - putExtra(INTENT_ANSWER_FORMAT, answerFormat) + putExtra(EXTRA_QUESTION_FORMAT, questionFormat) + putExtra(EXTRA_ANSWER_FORMAT, answerFormat) } setResult(RESULT_OK, data) finish() @@ -208,8 +215,8 @@ class CardTemplateBrowserAppearanceEditor : AnkiActivity(R.layout.activity_card_ null } else { try { - val question = intent.getStringExtra(INTENT_QUESTION_FORMAT) - val answer = intent.getStringExtra(INTENT_ANSWER_FORMAT) + val question = intent.getStringExtra(EXTRA_QUESTION_FORMAT) + val answer = intent.getStringExtra(EXTRA_ANSWER_FORMAT) Result(question, answer) } catch (e: Exception) { Timber.w(e, "Could not read result from intent") @@ -220,8 +227,10 @@ class CardTemplateBrowserAppearanceEditor : AnkiActivity(R.layout.activity_card_ } companion object { - const val INTENT_QUESTION_FORMAT = "bqfmt" - const val INTENT_ANSWER_FORMAT = "bafmt" + const val EXTRA_QUESTION_FORMAT = "bqfmt" + const val EXTRA_ANSWER_FORMAT = "bafmt" + private const val STATE_QUESTION_FORMAT = "bqfmt" + private const val STATE_ANSWER_FORMAT = "bafmt" /** Specified the card browser should use the default template formatter */ const val VALUE_USE_DEFAULT = "" @@ -239,8 +248,8 @@ class CardTemplateBrowserAppearanceEditor : AnkiActivity(R.layout.activity_card_ answerFormat: String, ): Intent = Intent(context, CardTemplateBrowserAppearanceEditor::class.java).apply { - putExtra(INTENT_QUESTION_FORMAT, questionFormat) - putExtra(INTENT_ANSWER_FORMAT, answerFormat) + putExtra(EXTRA_QUESTION_FORMAT, questionFormat) + putExtra(EXTRA_ANSWER_FORMAT, answerFormat) } } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateChanges.kt b/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateChanges.kt deleted file mode 100644 index 92d86f8d8d5f..000000000000 --- a/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateChanges.kt +++ /dev/null @@ -1,286 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later - -package com.ichi2.anki - -import com.ichi2.anki.CardTemplateNotetype.ChangeType -import com.ichi2.anki.CardTemplateNotetype.TemplateChange -import timber.log.Timber - -/** Tracks unsaved template operations and translates editor positions to database ordinals. */ -class CardTemplateChanges { - var templateChanges = ArrayList() - - /** - * Template deletes shift card ordinals in the database. To operate without saving, we must keep track to apply in order. - * In addition, we don't want to persist a template add just to delete it later, so we combine those if they happen - */ - fun addTemplateChange( - type: ChangeType, - ordinal: Int, - ) { - Timber.d("addTemplateChange() type %s for ordinal %s", type, ordinal) - val templateChanges = templateChanges - val change = TemplateChange(ordinal, type) - - // If we are deleting something we added but have not saved, edit it out of the change list - if (type == ChangeType.DELETE) { - var ordinalAdjustment = 0 - for (i in templateChanges.indices.reversed()) { - val oldChange = templateChanges[i] - when (oldChange.type) { - ChangeType.DELETE -> - if (oldChange.ordinal - ordinalAdjustment <= ordinal) { - // Deleting an ordinal at or below us? Adjust our comparison basis... - ordinalAdjustment++ - continue - } - ChangeType.ADD -> - if (ordinal == oldChange.ordinal - ordinalAdjustment) { - // Deleting something we added this session? Edit it out via compaction - compactTemplateChanges(oldChange.ordinal) - return - } - } - } - } - Timber.d("addTemplateChange() added ord/type: %s/%s", change.ordinal, change.type) - templateChanges.add(change) - dumpChanges() - } - - /** - * Return an int[] containing the collection-relative ordinals of all the currently pending deletes, - * including the ordinal passed in, as opposed to the changelist-relative ordinals - * - * @param ord int UI-relative ordinal to check database for delete safety along with existing deletes - * @return int[] of all ordinals currently in the database, pending delete - */ - fun getDeleteDbOrds(ord: Int): IntArray { - dumpChanges() - Timber.d("getDeleteDbOrds()") - - // array containing the original / db-relative ordinals for all pending deletes plus the proposed one - val deletedDbOrds = ArrayList(templateChanges.size) - - // For each entry in the changes list - and the proposed delete - scan for deletes to get original ordinal - for (i in 0..templateChanges.size) { - var ordinalAdjustment = 0 - - // We need an initializer. Though proposed change is checked last, it's a reasonable default initializer. - var currentChange = TemplateChange(ord, ChangeType.DELETE) - if (i < templateChanges.size) { - // Until we exhaust the pending change list we will use them - currentChange = templateChanges[i] - } - - // If the current pending change isn't a delete, it is unimportant here - if (currentChange.type !== ChangeType.DELETE) { - continue - } - - // If it is a delete, scan previous deletes and shift as necessary for original ord - for (j in 0 until i) { - val previousChange = templateChanges[j] - - // Is previous change a delete? Lower ordinal than current change? - if (previousChange.type === ChangeType.DELETE && previousChange.ordinal <= currentChange.ordinal) { - // If so, that is the case where things shift. It means our ordinals moved and original ord is higher - ordinalAdjustment++ - } - } - - // We know how many times ordinals smaller than the current were deleted so we have the total adjustment - // Save this pending delete at it's original / db-relative position - deletedDbOrds.add(currentChange.ordinal + ordinalAdjustment) - } - val deletedDbOrdInts = IntArray(deletedDbOrds.size) - for (i in deletedDbOrdInts.indices) { - deletedDbOrdInts[i] = deletedDbOrds[i] - } - return deletedDbOrdInts - } - - fun dumpChanges() { - if (!BuildConfig.DEBUG) { - return - } - val adjustedChanges = adjustedTemplateChanges - for (i in templateChanges.indices) { - val change = templateChanges[i] - val adjustedChange = adjustedChanges[i] - Timber.d("dumpChanges() Change %s is ord/type %s/%s", i, change.ordinal, change.type) - Timber.d( - "dumpChanges() During save change %s will be ord/type %s/%s", - i, - adjustedChange.ordinal, - adjustedChange.type, - ) - } - } - - /** - * Adjust the ordinals in our accrued change list so that any pending adds have the correct - * ordinal after taking into account any pending deletes - * - * @return ArrayList[2]> of [ordinal][ChangeType] entries - */ - val adjustedTemplateChanges: ArrayList - get() { - val changes = templateChanges - val adjustedChanges = ArrayList(changes.size) - - // In order to save the changes into the database, the ordinals in the changelist must correspond to the - // ordinals in the database (for deletes) or the correct index in the changes array (for adds) - // It is not possible to know what those will be until the user requests a save, so they are stored in the - // change list as-is until the save time comes, then the adjustment is made all at once - for (i in changes.indices) { - val change = changes[i] - val adjustedChange = - when (change.type) { - ChangeType.ADD -> { - val adjustedOrdinal = getAdjustedAddOrdinalAtChangeIndex(this, i) - Timber.d( - "getAdjustedTemplateChanges() change %s ordinal adjusted from %s to %s", - i, - change.ordinal, - adjustedOrdinal, - ) - TemplateChange(adjustedOrdinal, ChangeType.ADD) - } - ChangeType.DELETE -> change - } - adjustedChanges.add(adjustedChange) - } - return adjustedChanges - } - - /** - * Scan the sequence of template add/deletes, looking for the given ordinal. - * When found, purge that ordinal and shift future changes down if they had ordinals higher than the one purged - */ - private fun compactTemplateChanges(addedOrdinalToDelete: Int) { - Timber.d( - "compactTemplateChanges() merge/purge add/delete ordinal added as %s", - addedOrdinalToDelete, - ) - var postChange = false - var ordinalAdjustment = 0 - var i = 0 - while (i < templateChanges.size) { - val change = templateChanges[i] - var ordinal = change.ordinal - val changeType = change.type - Timber.d("compactTemplateChanges() examining change entry %s / %s", ordinal, changeType) - - // Only make adjustments after the ordinal we want to delete was added - if (!postChange) { - if (ordinal == addedOrdinalToDelete && changeType == ChangeType.ADD) { - Timber.d("compactTemplateChanges() found our entry at index %s", i) - // Remove this entry to start compaction, then fix up the loop counter since we altered size - postChange = true - templateChanges.removeAt(i) - i-- - } - i++ - continue - } - - // We compact all deletes with higher ordinals, so any delete is below us: shift our comparison basis - if (changeType == ChangeType.DELETE) { - ordinalAdjustment++ - Timber.d( - "compactTemplateChanges() delete affecting purged template, shifting basis, adj: %s", - ordinalAdjustment, - ) - } - - // If following ordinals were higher, we move them as part of compaction - if (ordinal + ordinalAdjustment > addedOrdinalToDelete) { - Timber.d("compactTemplateChanges() shifting later/higher ordinal down") - change.ordinal = --ordinal - } - i++ - } - } - - companion object { - /** - * Check if the given ordinal from the current UI state (which includes all pending changes) is a pending add - * - * @param ord int representing an ordinal in the note type, that might be an unsaved addition - * @return boolean true if it is a pending addition from this editing session - */ - fun isOrdinalPendingAdd( - noteType: CardTemplateChanges, - ord: Int, - ): Boolean { - for (i in noteType.templateChanges.indices) { - // commented out to make the code compile, why is this unused? - // val change = noteType.templateChanges[i] - val adjustedOrdinal = getAdjustedAddOrdinalAtChangeIndex(noteType, i) - if (adjustedOrdinal == ord) { - Timber.d( - "isOrdinalPendingAdd() found ord %s was pending add (would adjust to %s)", - ord, - adjustedOrdinal, - ) - return true - } - } - Timber.d("isOrdinalPendingAdd() ord %s is not a pending add", ord) - return false - } - - /** - * Check if the change at the given index in the changes array is an addition from this editing session - * (and thus is not in the database yet, and possibly needing ordinal adjustment from subsequent deletes) - * @param changesIndex the index of the template in the changes array - * @return either ordinal adjusted by any pending deletes if it is a pending add, or -1 if the ordinal is not an add - */ - fun getAdjustedAddOrdinalAtChangeIndex( - noteType: CardTemplateChanges, - changesIndex: Int, - ): Int { - if (changesIndex >= noteType.templateChanges.size) { - return -1 - } - var ordinalAdjustment = 0 - val change = noteType.templateChanges[changesIndex] - val ordinalToInspect = change.ordinal - for (i in noteType.templateChanges.size - 1 downTo changesIndex) { - val oldChange = noteType.templateChanges[i] - val currentOrdinal = change.ordinal - when (oldChange.type) { - ChangeType.DELETE -> { - // Deleting an ordinal at or below us? Adjust our comparison basis... - if (currentOrdinal - ordinalAdjustment <= ordinalToInspect) { - ordinalAdjustment++ - continue - } - Timber.d( - "getAdjustedAddOrdinalAtChangeIndex() contemplating delete at index %s, current ord adj %s", - i, - ordinalAdjustment, - ) - } - ChangeType.ADD -> - if (changesIndex == i) { - // something we added this session - Timber.d( - "getAdjustedAddOrdinalAtChangeIndex() pending add found at at index %s, old ord/adjusted ord %s/%s", - i, - currentOrdinal, - currentOrdinal - ordinalAdjustment, - ) - return currentOrdinal - ordinalAdjustment - } - } - } - Timber.d( - "getAdjustedAddOrdinalAtChangeIndex() determined changesIndex %s was not a pending add", - changesIndex, - ) - return -1 - } - } -} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateEditor.kt b/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateEditor.kt index eebc07c52163..ccc8fde442b5 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateEditor.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateEditor.kt @@ -60,12 +60,14 @@ import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.android.input.ShortcutGroup import com.ichi2.anki.android.input.shortcut import com.ichi2.anki.cardviewer.SingleCardSide +import com.ichi2.anki.common.analytics.Analytics import com.ichi2.anki.common.android.animationDisabled import com.ichi2.anki.common.android.appContext import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.common.utils.android.getColorFromAttr import com.ichi2.anki.common.utils.android.showThemedToast import com.ichi2.anki.common.utils.annotation.KotlinCleanup +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.common.utils.ext.contentEquals import com.ichi2.anki.compat.CompatHelper.Companion.getSerializableCompat import com.ichi2.anki.databinding.ActivityCardTemplateEditorBinding @@ -87,6 +89,8 @@ import com.ichi2.anki.libanki.NoteTypeId import com.ichi2.anki.libanki.NotetypeJson import com.ichi2.anki.libanki.Notetypes import com.ichi2.anki.libanki.Notetypes.Companion.NOT_FOUND_NOTE_TYPE +import com.ichi2.anki.libanki.backend.BackendUtils +import com.ichi2.anki.libanki.backend.model.toBackendNote import com.ichi2.anki.libanki.exception.ConfirmModSchemaException import com.ichi2.anki.libanki.getStockNotetype import com.ichi2.anki.libanki.getStockNotetypeKinds @@ -111,20 +115,24 @@ import com.ichi2.anki.utils.ext.showDialogFragment import com.ichi2.anki.utils.postDelayed import com.ichi2.utils.TruncatedString import com.ichi2.utils.copyToClipboard -import com.ichi2.utils.dp import com.ichi2.utils.listItems import com.ichi2.utils.show import dev.androidbroadcast.vbpd.viewBinding import kotlinx.coroutines.launch import net.ankiweb.rsdroid.Translations +import net.ankiweb.rsdroid.exceptions.BackendTemplateException import org.json.JSONArray import org.json.JSONException import org.json.JSONObject import timber.log.Timber +import java.util.concurrent.TimeoutException import java.util.regex.Pattern import kotlin.math.max import kotlin.math.min +import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds +import kotlin.time.TimeSource +import com.ichi2.anki.common.android.R as CommonR private typealias BackendCardTemplate = com.ichi2.anki.libanki.CardTemplate @@ -204,30 +212,30 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi // Load the args either from the intent or savedInstanceState bundle if (savedInstanceState == null) { // get note type id - noteTypeId = intent.getLongExtra(EDITOR_NOTE_TYPE_ID, NOT_FOUND_NOTE_TYPE) + noteTypeId = intent.getLongExtra(EXTRA_NOTE_TYPE_ID, NOT_FOUND_NOTE_TYPE) if (noteTypeId == NOT_FOUND_NOTE_TYPE) { Timber.e("CardTemplateEditor :: no note type ID was provided") finish() return } // get id for currently edited note (optional) - noteId = intent.getLongExtra(EDITOR_NOTE_ID, -1L) + noteId = intent.getLongExtra(EXTRA_NOTE_ID, -1L) // get id for currently edited template (optional) - startingOrdId = intent.getIntExtra(EDITOR_START_ORD_ID, -1) + startingOrdId = intent.getIntExtra(EXTRA_START_ORD_ID, -1) tabToCursorPositions[0] = hashMapOf() tabToViewId[0] = R.id.front_edit } else { - noteTypeId = savedInstanceState.getLong(EDITOR_NOTE_TYPE_ID) - noteId = savedInstanceState.getLong(EDITOR_NOTE_ID) - startingOrdId = savedInstanceState.getInt(EDITOR_START_ORD_ID) - tabToCursorPositions = savedInstanceState.getSerializableCompat>>(TAB_TO_CURSOR_POSITION_KEY)!! - tabToViewId = savedInstanceState.getSerializableCompat>(TAB_TO_VIEW_ID)!! + noteTypeId = savedInstanceState.getLong(STATE_NOTE_TYPE_ID) + noteId = savedInstanceState.getLong(STATE_NOTE_ID) + startingOrdId = savedInstanceState.getInt(STATE_STARTING_TEMPLATE_ORDINAL) + tabToCursorPositions = savedInstanceState.getSerializableCompat>>(STATE_TAB_TO_CURSOR_POSITION)!! + tabToViewId = savedInstanceState.getSerializableCompat>(STATE_TAB_TO_VIEW_ID)!! tempNoteType = CardTemplateNotetype.fromBundle(savedInstanceState) } fragmented = binding.fragmentContainer?.isVisible == true - setNavigationBarColor(R.attr.alternativeBackgroundColor) + setNavigationBarColor(CommonR.attr.alternativeBackgroundColor) // Disable the home icon enableToolbar() @@ -335,11 +343,11 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi public override fun onSaveInstanceState(outState: Bundle) { with(outState) { tempNoteType?.let { putAll(it.toBundle()) } - putLong(EDITOR_NOTE_TYPE_ID, noteTypeId) - putLong(EDITOR_NOTE_ID, noteId) - putInt(EDITOR_START_ORD_ID, startingOrdId) - putSerializable(TAB_TO_VIEW_ID, tabToViewId) - putSerializable(TAB_TO_CURSOR_POSITION_KEY, tabToCursorPositions) + putLong(STATE_NOTE_TYPE_ID, noteTypeId) + putLong(STATE_NOTE_ID, noteId) + putInt(STATE_STARTING_TEMPLATE_ORDINAL, ord) + putSerializable(STATE_TAB_TO_VIEW_ID, tabToViewId) + putSerializable(STATE_TAB_TO_CURSOR_POSITION, tabToCursorPositions) super.onSaveInstanceState(this) } } @@ -546,6 +554,39 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi return supportFragmentManager.findFragmentByTag("f${adapter.getItemId(position)}") as? CardTemplateFragment } + private fun repositionTemplate( + from: CardOrdinal, + to: CardOrdinal, + ) { + if (from == to) return + val positions = (0 until tempNoteType!!.templateCount).toMutableList() + // Save the live cursor positions before the fragments are recreated at their new positions. + for (position in positions) { + templateFragment(position)?.takeIf { it.view != null }?.let { fragment -> + tabToCursorPositions[position]?.set(fragment.currentEditorViewId, fragment.binding.editText.selectionStart) + } + } + positions.add(to, positions.removeAt(from)) + tabToCursorPositions = reorderTabState(tabToCursorPositions, positions) + tabToViewId = reorderTabState(tabToViewId, positions) + tempNoteType!!.repositionTemplate(from, to) + + val pager = mainBinding.cardTemplateEditorPager + (pager.adapter as TemplatePagerAdapter).ordinalShift() + pager.adapter!!.notifyDataSetChanged() + pager.setCurrentItem(to, false) + loadTemplatePreviewerFragmentIfFragmented(to) + updateDiscardChangesCallback() + } + + private fun reorderTabState( + state: HashMap, + positions: List, + ): HashMap = + positions + .mapIndexedNotNull { newPosition, oldPosition -> state[oldPosition]?.let { newPosition to it } } + .toMap(HashMap()) + @get:VisibleForTesting val currentFragment: CardTemplateFragment? get() = templateFragment(ord) @@ -611,7 +652,7 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi // Index of this card template fragment in ViewPager private val cardIndex - get() = requireArguments().getInt(CARD_INDEX) + get() = requireArguments().getInt(ARG_CARD_INDEX) /** Whether this is the page shown by the pager. */ private val isCurrentPage: Boolean @@ -665,7 +706,7 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi binding.mainLayout.setBackgroundColor( getColorFromAttr( requireContext(), - R.attr.alternativeBackgroundColor, + CommonR.attr.alternativeBackgroundColor, ), ) @@ -732,7 +773,7 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi } // set saved or default view binding.bottomNavigation.selectedItemId = - templateEditor.tabToViewId[cardIndex] ?: requireArguments().getInt(EDITOR_VIEW_ID_KEY) + templateEditor.tabToViewId[cardIndex] ?: requireArguments().getInt(ARG_EDITOR_VIEW_ID) // Set text change listeners val templateEditorWatcher: TextWatcher = @@ -816,7 +857,7 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi parentFragmentManager.setFragmentResultListener(insertFieldRequestKey, viewLifecycleOwner) { key, bundle -> // this is guaranteed to be non null, as we put a non null value on the other side - insertField(bundle.getString(InsertFieldDialog.KEY_INSERTED_FIELD)!!) + insertField(bundle.getString(InsertFieldDialog.RESULT_INSERTED_FIELD)!!) } setupMenu() } @@ -887,16 +928,7 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi // use the ord of the selected template, not the ord of the currently edited card - val ord = - // deletions change ordinals, don't try to preview metadata if this occurs. - if (tempModel.templateChanges.any { - it.type == CardTemplateNotetype.ChangeType.DELETE - } - ) { - null - } else { - templateEditor.ord - } + val ord = tempModel.getOriginalOrdinal(templateEditor.ord) val dialog = InsertFieldDialog.newInstance( @@ -953,14 +985,16 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi } private fun showRepositionDialog() { + if (noteTypeCreatesDynamicNumberOfNotes() || tempModel.templateCount < 2) return + val currentPosition = templateEditor.ord RepositionCardTemplateDialog.showInstance( requireContext(), - templateEditor.mainBinding.cardTemplateEditorPager.adapter!! - .itemCount, + tempModel.templateCount, ) { newPosition -> - val currentPosition = templateEditor.ord - Timber.w("moving card template %d to %d", currentPosition, newPosition) - TODO("CardTemplateNotetype is a complex class and requires significant testing") + val newOrdinal = newPosition - 1 + if (newOrdinal == currentPosition) return@showInstance + Timber.i("moving card template %d to %d", currentPosition, newOrdinal) + executeWithSyncCheck(Runnable { templateEditor.repositionTemplate(currentPosition, newOrdinal) }) } } @@ -1043,7 +1077,7 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi val numAffectedCards = if (!CardTemplateNotetype.isOrdinalPendingAdd(tempModel, ordinal)) { Timber.d("Ordinal is not a pending add, so we'll get the current card count for confirmation") - withCol { notetypes.tmplUseCount(tempModel.notetype, ordinal) } + withCol { notetypes.tmplUseCount(tempModel.notetype, tempModel.getOriginalOrdinal(ordinal)!!) } } else { 0 } @@ -1076,16 +1110,13 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi Timber.w("addCardTemplate attempted on cloze note type") return } - // Show confirmation dialog - // isOrdinalPendingAdd method will check if there are any new card types added or not, - // if TempModel has new card type then numAffectedCards will be 0 by default. - val numAffectedCards = - if (!CardTemplateNotetype.isOrdinalPendingAdd(templateEditor.tempNoteType!!, templateEditor.ord)) { - templateEditor.getColUnsafe.notetypes.tmplUseCount(templateEditor.tempNoteType!!.notetype, templateEditor.ord) - } else { - 0 - } - confirmAddCards(templateEditor.tempNoteType!!.notetype, numAffectedCards) + val noteType = templateEditor.tempNoteType!!.notetype + val newTemplate = buildNewTemplate(noteType) + launchCatchingTask { + // Show confirmation dialog + val numAffectedCards = withProgress { withCol { countCardsCreatedBy(noteType, newTemplate) } } + confirmAddCards(noteType, newTemplate, numAffectedCards) + } } fun saveNoteType(): Boolean { @@ -1127,6 +1158,7 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi fun setupCommonMenu(menu: Menu) { menu.findItem(R.id.action_restore_to_default).title = TR.sentenceCase.restoreToDefault menu.findItem(R.id.action_card_browser_appearance).title = TR.sentenceCase.browserAppearance + menu.findItem(R.id.action_reposition).isVisible = !noteTypeCreatesDynamicNumberOfNotes() && tempModel.templateCount > 1 if (noteTypeCreatesDynamicNumberOfNotes()) { Timber.d("Editing cloze/occlusion note type, disabling add/delete card template and deck override functionality") menu.findItem(R.id.action_add).isVisible = false @@ -1313,7 +1345,7 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi } fun getNote(col: Collection): Note? { - val nid = requireArguments().getLong(EDITOR_NOTE_ID) + val nid = requireArguments().getLong(EXTRA_NOTE_ID) return if (nid != -1L) col.getNote(nid) else null } @@ -1382,7 +1414,7 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi */ private fun getCurrentCardTemplateIndex(): Int { // COULD_BE_BETTER: Lots of duplicate code could call this. Hold off on the refactor until #5151 goes in. - return requireArguments().getInt(CARD_INDEX) + return requireArguments().getInt(ARG_CARD_INDEX) } private suspend fun deletionWouldOrphanNote( @@ -1484,6 +1516,7 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi */ private fun confirmAddCards( notetype: NotetypeJson, + newTemplate: BackendCardTemplate, numAffectedCards: Int, ) { val d = ConfirmationDialog() @@ -1501,7 +1534,7 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi positiveButtonText = getString(CommonString.menu_add), ) - val addCard = Runnable { addNewTemplate(notetype) } + val addCard = Runnable { addNewTemplate(notetype, newTemplate) } val confirm = Runnable { executeWithSyncCheck(addCard) } d.setConfirm(confirm) templateEditor.showDialogFragment(d) @@ -1577,9 +1610,23 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi * Add new template to a given note type * @param noteType note type to add new template to */ - private fun addNewTemplate(noteType: NotetypeJson) { - // Build new template - val oldCardIndex = requireArguments().getInt(CARD_INDEX) + private fun addNewTemplate( + noteType: NotetypeJson, + newTemplate: BackendCardTemplate, + ) { + val templates = noteType.templates + templates.append(newTemplate) + templateEditor.tempNoteType!!.addNewTemplate() + templateEditor.mainBinding.cardTemplateEditorPager.adapter!! + .notifyDataSetChanged() + templateEditor.mainBinding.cardTemplateEditorPager.setCurrentItem( + templates.length() - 1, + templateEditor.animationDisabled(), + ) + } + + private fun buildNewTemplate(noteType: NotetypeJson): BackendCardTemplate { + val oldCardIndex = requireArguments().getInt(ARG_CARD_INDEX) val templates = noteType.templates val oldTemplate = templates[oldCardIndex] val newTemplate = Notetypes.newTemplate(newCardName(templates)) @@ -1591,16 +1638,9 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi flipQA(newTemplate) } val lastExistingOrd = templates.last().ord - Timber.d("addNewTemplate() lastExistingOrd was %s", lastExistingOrd) + Timber.d("buildNewTemplate() lastExistingOrd was %s", lastExistingOrd) newTemplate.setOrd(lastExistingOrd + 1) - templates.append(newTemplate) - templateEditor.tempNoteType!!.addNewTemplate(newTemplate) - templateEditor.mainBinding.cardTemplateEditorPager.adapter!! - .notifyDataSetChanged() - templateEditor.mainBinding.cardTemplateEditorPager.setCurrentItem( - templates.length() - 1, - templateEditor.animationDisabled(), - ) + return newTemplate } /** @@ -1668,9 +1708,9 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi ): CardTemplateFragment { val f = CardTemplateFragment() val args = Bundle() - args.putInt(CARD_INDEX, cardIndex) - args.putLong(EDITOR_NOTE_ID, noteId) - args.putInt(EDITOR_VIEW_ID_KEY, viewId) + args.putInt(ARG_CARD_INDEX, cardIndex) + args.putLong(EXTRA_NOTE_ID, noteId) + args.putInt(ARG_EDITOR_VIEW_ID, viewId) f.arguments = args return f } @@ -1684,13 +1724,16 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi } companion object { - private const val TAB_TO_CURSOR_POSITION_KEY = "tabToCursorPosition" - private const val EDITOR_VIEW_ID_KEY = "editorViewId" - private const val TAB_TO_VIEW_ID = "tabToViewId" - const val EDITOR_NOTE_TYPE_ID = "noteTypeId" - private const val EDITOR_NOTE_ID = "noteId" - private const val EDITOR_START_ORD_ID = "ordId" - private const val CARD_INDEX = "card_ord" + private const val STATE_TAB_TO_CURSOR_POSITION = "tabToCursorPosition" + private const val ARG_EDITOR_VIEW_ID = "editorViewId" + private const val STATE_TAB_TO_VIEW_ID = "tabToViewId" + const val EXTRA_NOTE_TYPE_ID = "noteTypeId" + private const val EXTRA_NOTE_ID = "noteId" + private const val EXTRA_START_ORD_ID = "ordId" + private const val STATE_NOTE_TYPE_ID = "noteTypeId" + private const val STATE_NOTE_ID = "noteId" + private const val STATE_STARTING_TEMPLATE_ORDINAL = "ordId" + private const val ARG_CARD_INDEX = "card_ord" // Keys for saving pane weights in SharedPreferences private const val PREF_TEMPLATE_EDITOR_PANE_WEIGHT = "cardTemplateEditorPaneWeight" @@ -1713,9 +1756,9 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi ord: CardOrdinal? = null, ) = Intent(context, CardTemplateEditor::class.java) .apply { - putExtra(EDITOR_NOTE_TYPE_ID, noteTypeId) - noteId?.let { putExtra(EDITOR_NOTE_ID, it) } - ord?.let { putExtra(EDITOR_START_ORD_ID, it) } + putExtra(EXTRA_NOTE_TYPE_ID, noteTypeId) + noteId?.let { putExtra(EXTRA_NOTE_ID, it) } + ord?.let { putExtra(EXTRA_START_ORD_ID, it) } Timber.d( "Built intent for CardTemplateEditor; ntid: %s; nid: %s; ord: %s", @@ -1726,3 +1769,30 @@ open class CardTemplateEditor : AnkiActivity(R.layout.activity_card_template_edi } } } + +@VisibleForTesting +internal fun Collection.countCardsCreatedBy( + noteType: NotetypeJson, + template: BackendCardTemplate, + timeout: Duration = 1.seconds, +): Int { + val deadline = TimeSource.Monotonic.markNow() + timeout + val unreferencedOrd = generateSequence(0) { it + 1 }.first { "c${it + 1}" !in template.qfmt } + val templateBytes = BackendUtils.toJsonBytes(template.deepClone().apply { setOrd(unreferencedOrd) }) + val noteIds = notetypes.nids(noteType) + return try { + noteIds.count { nid -> + if (deadline.hasPassedNow()) { + Timber.w("counting the cards of a new card type timed out") + Analytics.sendAnalyticsException(TimeoutException("New card type count timed out with ${noteIds.size} notes"), false) + return noteIds.size + } + !backend + .renderUncommittedCardLegacy(getNote(nid).toBackendNote(), unreferencedOrd, templateBytes, false, true) + .isEmpty + } + } catch (e: BackendTemplateException) { + Timber.w(e, "new card type has a template error") + 0 + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateNotetype.kt b/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateNotetype.kt index 650b701a4dda..0d6508f722e6 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateNotetype.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/CardTemplateNotetype.kt @@ -8,12 +8,15 @@ import android.content.Intent import android.os.Bundle import android.os.Parcel import android.os.Parcelable -import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.common.android.appContext import com.ichi2.anki.compat.CompatHelper.Companion.getSerializableCompat +import com.ichi2.anki.libanki.CardOrdinal import com.ichi2.anki.libanki.CardTemplate import com.ichi2.anki.libanki.NoteTypeId import com.ichi2.anki.libanki.NotetypeJson +import com.ichi2.anki.libanki.Notetypes +import com.ichi2.anki.libanki.utils.insert +import com.ichi2.anki.libanki.utils.remove import com.ichi2.anki.observability.undoableOp import com.ichi2.anki.utils.ext.readJson import com.ichi2.anki.utils.ext.writeJson @@ -25,33 +28,21 @@ import java.io.IOException class CardTemplateNotetype( val notetype: NotetypeJson, ) { - enum class ChangeType { - ADD, - DELETE, - } - - data class TemplateChange( - var ordinal: Int, - val type: ChangeType, - ) : java.io.Serializable - - private val changes = CardTemplateChanges() - - var templateChanges: ArrayList - get() = changes.templateChanges - private set(value) { - changes.templateChanges = value - } + /** Database identity at each editor position; null for an unsaved addition. */ + private var originalTemplateOrds: ArrayList = notetype.templates.mapTo(ArrayList()) { it.ord } + private var deletedTemplateOrds = ArrayList() fun toBundle(): Bundle = Bundle().apply { - putString(INTENT_MODEL_FILENAME, saveTempNoteType(appContext, notetype)) - putSerializable("mTemplateChanges", templateChanges) + putString(STATE_EDITED_NOTE_TYPE_FILENAME, saveTempNoteType(appContext, notetype)) + putSerializable(STATE_ORIGINAL_TEMPLATE_ORDS, originalTemplateOrds) + putSerializable(STATE_DELETED_TEMPLATE_ORDS, deletedTemplateOrds) } private fun loadTemplateChanges(bundle: Bundle) { try { - templateChanges = bundle.getSerializableCompat("mTemplateChanges")!! + originalTemplateOrds = bundle.getSerializableCompat(STATE_ORIGINAL_TEMPLATE_ORDS)!! + deletedTemplateOrds = bundle.getSerializableCompat(STATE_DELETED_TEMPLATE_ORDS)!! } catch (e: ClassCastException) { Timber.e(e, "Unexpected cast failure") } @@ -81,80 +72,64 @@ class CardTemplateNotetype( notetype.templates[ordinal] = template } - fun addNewTemplate(newTemplate: CardTemplate) { + fun addNewTemplate() { Timber.d("addNewTemplate()") - addTemplateChange(ChangeType.ADD, newTemplate.ord) + originalTemplateOrds.add(null) } fun removeTemplate(ord: Int) { Timber.d("removeTemplate() on ordinal %s", ord) - addTemplateChange(ChangeType.DELETE, ord) - } - - suspend fun saveToDatabase() { - Timber.d("saveToDatabase() called") - changes.dumpChanges() - clearTempNoteTypeFiles() - saveNoteType(notetype, adjustedTemplateChanges) + originalTemplateOrds.removeAt(ord)?.let { deletedTemplateOrds.add(it) } } - /** - * Handles everything for a note type change at once - template add / deletes as well as content updates - */ - suspend fun saveNoteType( - notetype: NotetypeJson, - templateChanges: ArrayList, + /** Move a template while retaining its database identity for saving, previews and deletion checks. */ + fun repositionTemplate( + from: CardOrdinal, + to: CardOrdinal, ) { - Timber.d("saveNoteType") - val oldNoteType = withCol { notetypes.get(notetype.id) } + require(from in 0 until templateCount && to in 0 until templateCount) + if (from == to) return + val template = getTemplate(from) + notetype.templates.remove(template) + notetype.templates.insert(to, template) + originalTemplateOrds.add(to, originalTemplateOrds.removeAt(from)) + Notetypes._updateTemplOrds(notetype) + } - val newTemplates = notetype.templates - for (change in templateChanges) { - val oldTemplates = oldNoteType!!.templates - when (change.type) { - ChangeType.ADD -> { - Timber.d("saveNoteType() adding template %s", change.ordinal) - withCol { notetypes.addTemplate(oldNoteType, newTemplates[change.ordinal]) } - } - ChangeType.DELETE -> { - Timber.d("saveNoteType() deleting template currently at ordinal %s", change.ordinal) - withCol { notetypes.removeTemplate(oldNoteType, oldTemplates[change.ordinal]) } - } - } + suspend fun saveToDatabase() { + Timber.d("saveToDatabase() called") + val updated = notetype.deepClone() + for ((i, template) in updated.templates.withIndex()) { + template.setOrd(originalTemplateOrds[i]) } - - // required for Rust: the modified time can't go backwards, and we updated the note type by adding fields - // This could be done better - notetype.mod = oldNoteType!!.mod undoableOp { - notetypes.updateDict(notetype) + notetypes.updateDict(updated) } + clearTempNoteTypeFiles() } - fun addTemplateChange( - type: ChangeType, - ordinal: Int, - ) = changes.addTemplateChange(type, ordinal) - - fun getDeleteDbOrds(ord: Int): IntArray = changes.getDeleteDbOrds(ord) + /** Database ordinals of pending deletions, including the proposed editor position. */ + fun getDeleteDbOrds(ord: Int): IntArray = (deletedTemplateOrds + listOfNotNull(getOriginalOrdinal(ord))).toIntArray() - val adjustedTemplateChanges: ArrayList - get() = changes.adjustedTemplateChanges + /** Database ordinal for an editor position, or null for an unsaved addition. */ + fun getOriginalOrdinal(ordinal: Int): CardOrdinal? = originalTemplateOrds[ordinal] companion object { - const val INTENT_MODEL_FILENAME = "editedNoteTypeFilename" + private const val STATE_EDITED_NOTE_TYPE_FILENAME = "editedNoteTypeFilename" + private const val STATE_ORIGINAL_TEMPLATE_ORDS = "originalTemplateOrds" + private const val STATE_DELETED_TEMPLATE_ORDS = "deletedTemplateOrds" /** * Load the TemporaryNoteType from the filename included in a Bundle * - * @param bundle a Bundle that should contain persisted JSON under INTENT_MODEL_FILENAME key + * @param bundle a Bundle that should contain persisted JSON under STATE_EDITED_NOTE_TYPE_FILENAME key * @return re-hydrated TemporaryNoteType or null if there was a problem, null means should reload from database */ fun fromBundle(bundle: Bundle): CardTemplateNotetype? { - val editedNoteTypeFileName = bundle.getString(INTENT_MODEL_FILENAME) + val editedNoteTypeFileName = bundle.getString(STATE_EDITED_NOTE_TYPE_FILENAME) // Bundle.getString is @Nullable, so we have to check. if (editedNoteTypeFileName == null) { - Timber.d("fromBundle() - note type file name under key %s", INTENT_MODEL_FILENAME) + Timber.d("fromBundle() - note type file name under key %s", STATE_EDITED_NOTE_TYPE_FILENAME) return null } Timber.d("onCreate() loading saved note type file %s", editedNoteTypeFileName) @@ -225,12 +200,7 @@ class CardTemplateNotetype( fun isOrdinalPendingAdd( noteType: CardTemplateNotetype, ord: Int, - ): Boolean = CardTemplateChanges.isOrdinalPendingAdd(noteType.changes, ord) - - fun getAdjustedAddOrdinalAtChangeIndex( - noteType: CardTemplateNotetype, - changesIndex: Int, - ): Int = CardTemplateChanges.getAdjustedAddOrdinalAtChangeIndex(noteType.changes, changesIndex) + ): Boolean = noteType.getOriginalOrdinal(ord) == null } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/CoroutineHelpers.kt b/AnkiDroid/src/main/java/com/ichi2/anki/CoroutineHelpers.kt index be57b28f4648..f8a7fc9fa211 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/CoroutineHelpers.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/CoroutineHelpers.kt @@ -17,8 +17,10 @@ import androidx.appcompat.app.AlertDialog import androidx.core.net.toUri import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.Lifecycle import androidx.lifecycle.ViewModel import androidx.lifecycle.coroutineScope +import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewModelScope import anki.collection.Progress import com.ichi2.anki.CollectionManager.TR @@ -30,15 +32,15 @@ import com.ichi2.anki.common.annotations.UseContextParameter import com.ichi2.anki.common.coroutines.applicationScope import com.ichi2.anki.common.crashreporting.CrashReportService import com.ichi2.anki.common.destinations.DeckOptionsDestination +import com.ichi2.anki.common.destinations.DeferredNavigation import com.ichi2.anki.common.destinations.PreferencesDestination +import com.ichi2.anki.common.destinations.toIntent import com.ichi2.anki.common.utils.android.isRobolectric import com.ichi2.anki.dialogs.DatabaseErrorDialog import com.ichi2.anki.dialogs.DatabaseErrorDialog.DatabaseErrorDialogType import com.ichi2.anki.exception.CollectionLockedException import com.ichi2.anki.exception.StorageAccessException import com.ichi2.anki.exception.StorageNotConfiguredException -import com.ichi2.anki.pages.toIntent -import com.ichi2.anki.preferences.toIntent import com.ichi2.anki.progress.blockTouches import com.ichi2.anki.progress.unblockTouches import com.ichi2.anki.snackbar.showSnackbar @@ -241,24 +243,33 @@ fun Fragment.launchCatchingTask( errorMessage: String? = null, skipCrashReport: ((Exception) -> Boolean)? = null, block: suspend CoroutineScope.() -> Unit, -): Job = - lifecycle.coroutineScope.launch { - // It's a bug to call this if the activity is invalid or finishing. - val validActivity = - kotlin - .runCatching { - requireActivity(simpleName = true).also { activity -> - check(!activity.isFinishing) { - "Cannot launch task for ${this@launchCatchingTask.javaClass.simpleName}: activity is finishing" - } - } - }.getOrElse { - Timber.w(it, "Fragment.launchCatchingTask") - if (isRobolectric) throw it - return@launch - } +): Job { + val fragmentLifecycle = lifecycle + return fragmentLifecycle.coroutineScope.launch { + // Removal can precede scope registration; reading the fragment creates a new lifecycle. + if (fragmentLifecycle.currentState == Lifecycle.State.DESTROYED) { + Timber.w("Skipping launchCatchingTask for %s: fragment lifecycle is destroyed", this@launchCatchingTask.javaClass.simpleName) + return@launch + } + val validActivity = validActivityForTask() ?: return@launch validActivity.runCatching(errorMessage, skipCrashReport = skipCrashReport) { block() } } +} + +private fun Fragment.validActivityForTask(): FragmentActivity? = + // It's a bug to call this if the activity is invalid or finishing. + kotlin + .runCatching { + requireActivity(simpleName = true).also { activity -> + check(!activity.isFinishing) { + "Cannot launch task for ${this@validActivityForTask.javaClass.simpleName}: activity is finishing" + } + } + }.getOrElse { + Timber.w(it, "Fragment.launchCatchingTask") + if (isRobolectric) throw it + null + } /** * [Fragment.requireActivity], with a short stable name so crash reports can be grouped together. @@ -275,6 +286,32 @@ fun Fragment.requireActivity(simpleName: Boolean): FragmentActivity = requireActivity() } +/** + * Like [Fragment.launchCatchingTask], but tied to the current view's lifecycle. + * Skips [block] if the view is destroyed before the job starts. + * + * @return the launched job, or `null` if the fragment has no view. + */ +fun Fragment.launchCatchingViewTask( + errorMessage: String? = null, + skipCrashReport: ((Exception) -> Boolean)? = null, + block: suspend CoroutineScope.() -> Unit, +): Job? { + val owner = viewLifecycleOwnerLiveData.value ?: return null + return owner.lifecycleScope.launch { + // A synchronous replacement can destroy the view before lifecycleScope registers cancellation. + if (owner.lifecycle.currentState == Lifecycle.State.DESTROYED) { + Timber.w( + "Skipping launchCatchingViewTask for %s: view lifecycle is destroyed", + this@launchCatchingViewTask.javaClass.simpleName, + ) + return@launch + } + val validActivity = validActivityForTask() ?: return@launch + validActivity.runCatching(errorMessage, skipCrashReport = skipCrashReport) { block() } + } +} + /** * Displays an error dialog with title 'Error' and provided [message]. * May report the error when the dialog is dismissed @@ -283,10 +320,10 @@ fun Fragment.requireActivity(simpleName: Boolean): FragmentActivity = * @param crashReportData Crash report data which may be reported when the dialog is dismissed. */ fun Context.showError( - message: String, + message: CharSequence, crashReportData: CrashReportData?, ) { - crashReportData.throwIfDialogUnusable(message) + crashReportData.throwIfDialogUnusable(message.toString()) Timber.i("Error dialog displayed") @@ -721,7 +758,7 @@ data class CrashReportData( // if we're in the error dialog, we have no context of the deck which caused the exception // assume it's the current deck val openCurrentDeckOptions = DeckOptionsDestination.fromCurrentDeck() - context.startActivity(openCurrentDeckOptions.toIntent(context)) + context.startActivity(with(DeferredNavigation) { openCurrentDeckOptions.toIntent() }) // dismiss the dialog - the user should have resolved the issue return true } @@ -736,7 +773,7 @@ data class CrashReportData( override suspend fun execute(context: Context): Boolean { Timber.i("Opening 'Advanced settings'") - context.startActivity(PreferencesDestination.Advanced.toIntent(context)) + context.startActivity(with(DeferredNavigation) { PreferencesDestination.Advanced.toIntent() }) return true } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt b/AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt index 7f8194ae4104..b0e12373479b 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt @@ -24,7 +24,9 @@ import android.text.util.Linkify import android.view.KeyEvent import android.view.Menu import android.view.MenuItem +import android.view.MotionEvent import android.view.View +import android.view.ViewConfiguration import android.view.ViewGroup.MarginLayoutParams import android.widget.TextView import androidx.activity.OnBackPressedCallback @@ -65,6 +67,7 @@ import androidx.fragment.app.commitNow import androidx.lifecycle.Lifecycle import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.LinearLayoutManager import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.work.NetworkType @@ -72,12 +75,14 @@ import androidx.work.WorkInfo import androidx.work.WorkManager import anki.collection.OpChanges import anki.sync.SyncStatusResponse +import com.google.android.material.behavior.HideViewOnScrollBehavior import com.google.android.material.progressindicator.LinearProgressIndicator import com.google.android.material.snackbar.BaseTransientBottomBar import com.google.android.material.snackbar.Snackbar import com.ichi2.anki.BottomNavController.NavigationItem import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CollectionManager.withCol +import com.ichi2.anki.DeckPickerFloatingActionMenu.CloseAnimation import com.ichi2.anki.DeckPickerFloatingActionMenu.FloatingActionBarToggleListener import com.ichi2.anki.InitialActivity.StartupFailure import com.ichi2.anki.InitialActivity.StartupFailure.DBError @@ -112,6 +117,7 @@ import com.ichi2.anki.common.storage.CollectionHelper import com.ichi2.anki.common.time.TimeManager import com.ichi2.anki.common.utils.android.showThemedToast import com.ichi2.anki.common.utils.annotation.KotlinCleanup +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.compat.CompatHelper.Companion.getSerializableCompat import com.ichi2.anki.contextmenu.DeckPickerMenuContentProvider import com.ichi2.anki.databinding.ActivityHomescreenBinding @@ -165,8 +171,6 @@ import com.ichi2.anki.libanki.sched.DeckNode import com.ichi2.anki.mediacheck.MediaCheckFragment import com.ichi2.anki.observability.ChangeManager import com.ichi2.anki.pages.AnkiPackageImporterFragment -import com.ichi2.anki.pages.CongratsPage -import com.ichi2.anki.pages.CongratsPage.Companion.onDeckCompleted import com.ichi2.anki.progress.observeProgress import com.ichi2.anki.receiver.SdCardReceiver import com.ichi2.anki.reviewreminders.ReviewReminderScope @@ -179,6 +183,9 @@ import com.ichi2.anki.shareddeck.SharedDecksActivity import com.ichi2.anki.snackbar.BaseSnackbarBuilderProvider import com.ichi2.anki.snackbar.SnackbarBuilder import com.ichi2.anki.snackbar.showSnackbar +import com.ichi2.anki.study.StudyAvailability +import com.ichi2.anki.study.StudyCompletionUi +import com.ichi2.anki.study.currentDeckStudyState import com.ichi2.anki.sync.MeteredSyncPolicy import com.ichi2.anki.sync.launchCatchingRequiringOneWaySyncDiscardUndo import com.ichi2.anki.sync.syncStatus @@ -213,7 +220,7 @@ import com.ichi2.utils.Permissions import com.ichi2.utils.VersionUtils import com.ichi2.utils.configureView import com.ichi2.utils.customView -import com.ichi2.utils.dp +import com.ichi2.utils.isRtl import com.ichi2.utils.message import com.ichi2.utils.positiveButton import com.ichi2.utils.show @@ -221,6 +228,7 @@ import com.ichi2.utils.showDialogIfWebViewOutdated import com.ichi2.utils.title import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.launch @@ -301,6 +309,7 @@ open class DeckPicker : private lateinit var decksLayoutManager: LinearLayoutManager private lateinit var deckListAdapter: DeckAdapter + private var backgroundImageErrorShown = false private lateinit var pullToSyncWrapper: SwipeRefreshLayout @VisibleForTesting @@ -431,7 +440,7 @@ open class DeckPicker : private val closeFloatingActionBarBackPressCallback = object : OnBackPressedCallback(enabled = false) { override fun handleOnBackPressed() { - floatingActionMenu.closeFloatingActionMenu(applyRiseAndShrinkAnimation = true) + floatingActionMenu.closeFloatingActionMenu(style = CloseAnimation.SHORT) } } @@ -522,7 +531,7 @@ open class DeckPicker : return } Timber.d("Not displaying app intro") - if (intent.hasExtra(INTENT_SYNC_FROM_LOGIN)) { + if (intent.hasExtra(EXTRA_SYNC_FROM_LOGIN)) { Timber.d("launched from introduction activity login: syncing") syncOnResume = true } @@ -588,7 +597,16 @@ open class DeckPicker : ) } - lifecycleScope.launch { applyDeckPickerBackground() } + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + applyDeckPickerBackground() + try { + awaitCancellation() + } finally { + deckPickerBinding.background.setImageDrawable(null) + } + } + } setupPullToSync() // Setup the FloatingActionButtons @@ -638,6 +656,16 @@ open class DeckPicker : setFragmentResultListener(Check.DATABASE.requestKey) { _, _ -> performIntegrityCheck() } + setFragmentResultListener(SchedulerUpgradeDialog.REQUEST_SCHEDULER_UPGRADE) { _, result -> + if (result.getBoolean(SchedulerUpgradeDialog.RESULT_UPGRADE)) { + launchCatchingRequiringOneWaySyncDiscardUndo { + this@DeckPicker.withProgress { withCol { sched.upgradeToV2() } } + showThemedToast(this@DeckPicker, TR.schedulingUpdateDone(), false) + } + } else { + onBackPressedDispatcher.onBackPressed() + } + } registerStudyOptionsStudyHandler { Timber.d("Opening study screen from DeckPicker's study options panel") @@ -724,14 +752,19 @@ open class DeckPicker : val nav = insets.getInsets(navigationBars()) window.isNavigationBarContrastEnforced = nav.left > 0 || nav.right > 0 } + val isRtl = deckPickerInclude.isRtl() deckPickerInclude.updatePadding( - left = bars.left, - right = if (fragmented) 0 else bars.right, + left = if (isRtl && fragmented) 0 else bars.left, + right = if (!isRtl && fragmented) 0 else bars.right, ) deckPickerBinding.reviewSummaryTextView.updatePadding(bottom = withKeyboard.bottom) - val bottomNavView = findViewById(R.id.bottom_navigation) - val bottomNavOffset = if (bottomNavView?.isVisible == true) BOTTOM_NAV_HEIGHT_DP.dp.toPx(this) else 0 + val bottomNavOffset = + if (binding.bottomNavigation?.let { it.isVisible && HideViewOnScrollBehavior.from(it).isScrolledIn } == true) { + BOTTOM_NAV_HEIGHT_DP.dp.toPx(this) + } else { + 0 + } // the keyboard covers the bottom navigation: clear whichever is taller floatingActionButtonBinding.root.updatePadding( bottom = maxOf(bars.bottom + bottomNavOffset, withKeyboard.bottom), @@ -758,10 +791,16 @@ open class DeckPicker : val studyoptionsView = binding.studyoptionsFragment ?: return ViewCompat.setOnApplyWindowInsetsListener(studyoptionsView) { _, insets -> val bars = insets.getInsets(systemBars() or displayCutout()) - // the toolbar clears the top and the deck list clears the left: the panel's - // fragments apply the remaining insets themselves, so their scrolled content + // the toolbar clears the top and the deck list clears the side touching the divider: + // the panel's fragments apply the remaining insets themselves, so their scrolled content // renders underneath the navigation bar - insets.inset(bars.left, bars.top, 0, 0) + val isRtl = studyoptionsView.isRtl() + insets.inset( + if (isRtl) 0 else bars.left, + bars.top, + if (isRtl) bars.right else 0, + 0, + ) } } } @@ -811,18 +850,9 @@ open class DeckPicker : } fun onPromptUserToUpdateScheduler(op: Unit) { - SchedulerUpgradeDialog( - activity = this, - onUpgrade = { - launchCatchingRequiringOneWaySyncDiscardUndo { - this@DeckPicker.withProgress { withCol { sched.upgradeToV2() } } - showThemedToast(this@DeckPicker, TR.schedulingUpdateDone(), false) - } - }, - onCancel = { - onBackPressedDispatcher.onBackPressed() - }, - ).showDialog() + if (supportFragmentManager.findFragmentByTag(SchedulerUpgradeDialog.TAG) == null) { + SchedulerUpgradeDialog().showNow(supportFragmentManager, SchedulerUpgradeDialog.TAG) + } } fun onOptionsMenuUpdated(unused: OptionsMenuState) = invalidateOptionsMenu() @@ -1160,9 +1190,9 @@ open class DeckPicker : is DiskFull -> displayNoStorageError() is DBError -> displayDatabaseFailure(CustomExceptionData.fromException(failure.exception)) is StorageUndecided -> { - // unreachable: Undecided requires PREF_COLLECTION_PATH to be unset, which only - // happens if ensureCollectionPathSet failed at startup; getStartupFailureType - // then returns InitializationError (fatalError) before checking the decision + // Undecided requires PREF_COLLECTION_PATH to be unset: only expected if + // choosing a default collection path failed (SystemStorageException) after + // the permission checks passed // TODO: #19552 - replace with the storage setup flow Timber.w("storage setup flow (#19552) not implemented; showing load-failure options") CrashReportService.sendExceptionReport( @@ -1212,17 +1242,23 @@ open class DeckPicker : private suspend fun applyDeckPickerBackground() { val result = BackgroundImage.resolve(this) if (result is BackgroundImage.ResolveResult.Failure) { - showThemedToast(this, result.message(this), shortLength = false) + showBackgroundImageError(result.message(this)) } val drawable = (result as? BackgroundImage.ResolveResult.Ready)?.drawable val applied = deckPickerBinding.background.setImageDrawableSafe(drawable) { - showThemedToast(this, getString(CommonString.background_image_too_large), shortLength = false) + showBackgroundImageError(getString(CommonString.background_image_too_large)) } // activityHasBackground calls notifyDataSetChanged, ensure only 1 call deckListAdapter.activityHasBackground = applied && drawable != null } + private fun showBackgroundImageError(message: String) { + if (backgroundImageErrorShown) return + backgroundImageErrorShown = true + showThemedToast(this, message, shortLength = false) + } + override fun onCreateOptionsMenu(menu: Menu): Boolean { if (viewModel.flowOfStartupResponse.value is StartupResponse.FatalError) { return false @@ -1230,7 +1266,7 @@ open class DeckPicker : Timber.d("onCreateOptionsMenu()") if (isDrawerOpen) { - floatingActionMenu.closeFloatingActionMenu(applyRiseAndShrinkAnimation = false) + floatingActionMenu.closeFloatingActionMenu(style = CloseAnimation.LONG) } // Fragments own their menus: each fragment registers a MenuProvider against this // activity (see StudyOptionsFragment), and the menu host dispatches creation, @@ -1430,13 +1466,13 @@ open class DeckPicker : } SyncIconState.PendingChanges -> { BadgeDrawableBuilder(this) - .withColorAttr(R.attr.badgeWarningColor) + .withColorAttr(CommonR.attr.badgeWarningColor) .replaceBadge(provider) } SyncIconState.OneWay, SyncIconState.NotLoggedIn -> { BadgeDrawableBuilder(this) .withText('!') - .withColorAttr(R.attr.badgeErrorColor) + .withColorAttr(CommonR.attr.badgeErrorColor) .replaceBadge(provider) } } @@ -1507,9 +1543,7 @@ open class DeckPicker : return true } R.id.action_deck_delete -> { - launchCatchingTask { - viewModel.deleteSelectedDeck().join() - } + deleteSelectedDeck() return true } R.id.action_export_collection -> { @@ -1549,7 +1583,10 @@ open class DeckPicker : private fun processReviewResults(resultCode: Int) { if (resultCode == AbstractFlashcardViewer.RESULT_NO_MORE_CARDS) { - CongratsPage.onReviewsCompleted(this, getColUnsafe.sched.totalCount() == 0) + launchCatchingTask { + val state = withCol { currentDeckStudyState() } + StudyCompletionUi.onReviewsCompleted(this@DeckPicker, state) + } fragment?.refreshInterface() } } @@ -1572,7 +1609,7 @@ open class DeckPicker : // Due to the App Introduction, this may be called before permission has been granted. if (syncOnResume && hasCollectionStoragePermissions()) { syncOnResume = false - intent.removeExtra(INTENT_SYNC_FROM_LOGIN) + intent.removeExtra(EXTRA_SYNC_FROM_LOGIN) Timber.i("Performing Sync on Resume") Permissions.requestNotificationPermissionsForSyncing(this) sync() @@ -1692,6 +1729,32 @@ open class DeckPicker : return false } + /** Where the current downward drag started: reset whenever the finger moves up */ + private var touchAnchorY = 0f + private var lastTouchY = 0f + + override fun dispatchTouchEvent(event: MotionEvent): Boolean { + // Content which fits once the bottom bar hides can no longer scroll, so scrolling alone + // could never bring the bar back: a downward drag always restores it. + if (bottomNavigationEnabled) { + when (event.actionMasked) { + MotionEvent.ACTION_DOWN -> { + touchAnchorY = event.y + lastTouchY = event.y + } + MotionEvent.ACTION_MOVE -> { + if (event.y < lastTouchY) { + touchAnchorY = event.y + } else if (event.y - touchAnchorY > ViewConfiguration.get(this).scaledTouchSlop) { + binding.bottomNavigation?.let { HideViewOnScrollBehavior.from(it).slideIn(it) } + } + lastTouchY = event.y + } + } + } + return super.dispatchTouchEvent(event) + } + override fun dispatchKeyEvent(event: KeyEvent): Boolean { if (!bottomNavigationEnabled || event.action != KeyEvent.ACTION_DOWN || !event.isAltPressed) { return super.dispatchKeyEvent(event) @@ -1786,7 +1849,7 @@ open class DeckPicker : if (event.isShiftPressed) { // Shortcut: Shift + DEL - Delete deck without confirmation dialog Timber.i("Shift+DEL: Deck deck without confirmation") - viewModel.focusedDeck?.let { did -> deleteDeck(did) } + deleteSelectedDeck() } else { // Shortcut: DEL Timber.i("Delete Deck from keypress") @@ -1801,7 +1864,7 @@ open class DeckPicker : // that is, when it appears in the trailing study option fragment if (fragmented) { Timber.i("Rename Deck from keypress") - viewModel.focusedDeck?.let { did -> renameDeckDialog(did) } + viewModel.requestRenameSelectedDeck() return true } } @@ -1898,7 +1961,7 @@ open class DeckPicker : } else if (skip < 2 && !InitialActivity.isLatestVersion(preferences)) { Timber.i("AnkiDroid is being updated and a collection already exists.") // The user might appreciate us now, see if they will help us get better? - if (!preferences.contains(AnkiDroidUsageAnalytics.ANALYTICS_OPTIN_KEY)) { + if (!preferences.contains(AnkiDroidUsageAnalytics.PREF_ANALYTICS_OPTIN)) { displayAnalyticsOptInDialog() } @@ -1909,14 +1972,14 @@ open class DeckPicker : val current = VersionUtils.pkgVersionCode Timber.i("Current AnkiDroid version: %s", current) val previous: Long = - if (preferences.contains(DeckPickerViewModel.UPGRADE_VERSION_KEY)) { + if (preferences.contains(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION)) { // Upgrading currently installed app viewModel.getPreviousVersion(preferences, current) } else { // Fresh install current } - preferences.edit { putLong(DeckPickerViewModel.UPGRADE_VERSION_KEY, current) } + preferences.edit { putLong(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION, current) } val upgradedPreferences = InitialActivity.upgradePreferences(this, previous) // Integrity check loads asynchronously and then restart deck picker when finished @@ -2117,11 +2180,15 @@ open class DeckPicker : private fun tryShowStudyOptionsPanel(): Boolean { val containerId = binding.studyoptionsFragment?.id ?: return false - // Close other panels before looking for restored study options. - supportFragmentManager.popBackStackImmediate( - null, - FragmentManager.POP_BACK_STACK_INCLUSIVE, - ) + // Only clear navigation when closing another side panel. Import dialogs can already + // be on the back stack when startup finishes, and must survive panel initialization. + val sidePanel = supportFragmentManager.findFragmentById(containerId) + if (sidePanel != null && sidePanel !is StudyOptionsFragment) { + supportFragmentManager.popBackStackImmediate( + null, + FragmentManager.POP_BACK_STACK_INCLUSIVE, + ) + } val studyOptions = fragment if (studyOptions != null) { @@ -2159,7 +2226,7 @@ open class DeckPicker : override val broadcastsActions = super.broadcastsActions + mapOf( - SdCardReceiver.MEDIA_MOUNT + SdCardReceiver.ACTION_MEDIA_MOUNT to { ActivityCompat.recreate(this) }, ) @@ -2229,25 +2296,26 @@ open class DeckPicker : updateDeckList() } - withCol { decks.select(did) } + val study = + withCol { + decks.select(did) + currentDeckStudyState() + } deckListAdapter.updateSelectedDeck(did) // Also forget the last deck used by the Browser CardBrowser.clearLastDeckId() viewModel.focusedDeck = did - // TODO: Reuse dueTree from ViewModel instead of recalculating for better performance. - val deck = withCol { sched.deckDueTree().find(did) } - if (deck?.hasCardsReadyToStudy() == true) { + if (study.availability == StudyAvailability.CardsAvailable) { openReviewerOrStudyOptions(selectionType) return } - val isEmpty = withCol { decks.cardCount(did, includeSubdecks = true) == 0 } - if (!deck?.filtered!! && isEmpty) { + if (study.isEmptyRegularDeck) { showEmptyDeckSnackbar() updateUi() } else { - onDeckCompleted() + StudyCompletionUi.openCongratsPage(this) } } @@ -2364,6 +2432,11 @@ open class DeckPicker : viewModel.deleteDeck(did).join() } + private fun deleteSelectedDeck() = + launchCatchingTask { + viewModel.deleteSelectedDeck().join() + } + @NeedsTest("14285: regression test to ensure UI is updated after this call") fun rebuildFiltered(did: DeckId) { launchCatchingTask { @@ -2488,7 +2561,7 @@ open class DeckPicker : * * This is for the 'download existing collection from AnkiWeb' use case */ - const val INTENT_SYNC_FROM_LOGIN = "syncFromLogin" + const val EXTRA_SYNC_FROM_LOGIN = "syncFromLogin" /** * Available options performed by other activities (request codes for onActivityResult()) @@ -2515,7 +2588,7 @@ open class DeckPicker : autoSync: Boolean = false, ) = Intent(context, DeckPicker::class.java).apply { if (autoSync) { - putExtra(INTENT_SYNC_FROM_LOGIN, true) + putExtra(EXTRA_SYNC_FROM_LOGIN, true) } } } @@ -2523,7 +2596,7 @@ open class DeckPicker : override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) this.intent = intent - if (intent.hasExtra(INTENT_SYNC_FROM_LOGIN)) { + if (intent.hasExtra(EXTRA_SYNC_FROM_LOGIN)) { Timber.i("Sync requested from Login") this.syncOnResume = true } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/DeckPickerFloatingActionMenu.kt b/AnkiDroid/src/main/java/com/ichi2/anki/DeckPickerFloatingActionMenu.kt index 00b80c70c1d1..f6288e2b0338 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/DeckPickerFloatingActionMenu.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/DeckPickerFloatingActionMenu.kt @@ -4,6 +4,7 @@ package com.ichi2.anki import android.animation.Animator +import android.animation.AnimatorListenerAdapter import android.content.Context import android.content.res.ColorStateList import android.view.KeyEvent @@ -11,6 +12,8 @@ import android.view.MotionEvent import android.view.View import android.widget.LinearLayout import androidx.annotation.VisibleForTesting +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner import com.google.android.material.color.MaterialColors import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.common.android.animationEnabled @@ -30,14 +33,15 @@ class DeckPickerFloatingActionMenu( ) { // TODO: refactor this to decouple with Homescreen & DeckPicker private val binding: IncludeFloatingAddButtonBinding = homescreenBinding.deckPickerPane.floatingActionButton + private val extendedFabHorizontalPadding = binding.fabMain.paddingStart + binding.fabMain.paddingEnd /** Layout deck_picker.xml is attached here */ private val linearLayout: LinearLayout = homescreenBinding.deckPickerPane.deckpickerView private val studyOptionsFrame: View? = homescreenBinding.studyoptionsFrame // Colors values obtained from attributes - private val fabNormalColor = MaterialColors.getColor(binding.fabMain, R.attr.fab_normal) - private val fabPressedColor = MaterialColors.getColor(binding.fabMain, R.attr.fab_pressed) + private val fabNormalColor = MaterialColors.getColor(binding.fabMain, CommonR.attr.fab_normal) + private val fabPressedColor = MaterialColors.getColor(binding.fabMain, CommonR.attr.fab_pressed) // Add Note Drawable Icon private val addNoteIcon: Int = R.drawable.ic_add_note @@ -48,12 +52,15 @@ class DeckPickerFloatingActionMenu( var isFABOpen = false private set + private var pendingMenuReset = false + @Suppress("unused") val isFragmented: Boolean get() = studyOptionsFrame != null @VisibleForTesting fun showFloatingActionMenu() { + if (pendingMenuReset) return toggleListener.onBeginToggle(isOpening = true) deckPicker.activeSnackBar?.dismiss() linearLayout.alpha = 0.5f @@ -70,9 +77,12 @@ class DeckPickerFloatingActionMenu( binding.fabBGLayout.visibility = View.VISIBLE binding.fabMain.backgroundTintList = ColorStateList.valueOf(fabPressedColor) binding.fabMain.setIconResource(addNoteIcon) - binding.fabMain.extend() + extendMainButton() with(binding) { + // Dismissal listeners must not run when these opening animations finish. + addDeckButton.animate().setListener(null) + addFilteredDeckButton.animate().setListener(null) addSharedButton.animate().translationY(0f).duration = 100 addDeckButton.animate().translationY(0f).duration = 70 addFilteredDeckButton.animate().translationY(0f).duration = 100 @@ -102,159 +112,83 @@ class DeckPickerFloatingActionMenu( } } + /** Extends Add without overshooting its final width, preserving the styled minimum width. */ + private fun extendMainButton() = + with(binding.fabMain) { + val originalMinWidth = minWidth + val originalMinimumWidth = minimumWidth + // Material measures with collapsed padding, then adds the extra extended padding. + // Discount that padding from the minimum during measurement so it isn't counted twice. + val extraPadding = extendedFabHorizontalPadding - paddingStart - paddingEnd + // Both TextView's minWidth and View's minimumWidth constrain this measurement. + minWidth = (originalMinWidth - extraPadding).coerceAtLeast(0) + minimumWidth = (originalMinimumWidth - extraPadding).coerceAtLeast(0) + try { + extend() + } finally { + // Preserve the styled minimum width for the final wrap_content layout. + minWidth = originalMinWidth + minimumWidth = originalMinimumWidth + } + } + /** - * This function takes a parameter which decides if we want to apply the rise and shrink animation - * for FAB or not. - * - * Case 1: When the FAB is already opened and we close it by pressing the back button then we need to show - * the rise and shrink animation and get back to the FAB with `+` icon. - * - * Case 2: When the user opens the side navigation drawer (without touching the FAB). In that case we don't - * want to show any type of rise and shrink animation for the FAB so we put the value `false` for the parameter. + * Dismisses the menu, or resets it off-screen after opening the editor. + * [style] selects the closing animation for Back/outside taps or menu actions. + * [animate] is false for the off-screen reset. */ - fun closeFloatingActionMenu(applyRiseAndShrinkAnimation: Boolean) { + fun closeFloatingActionMenu( + style: CloseAnimation, + animate: Boolean = deckPicker.animationEnabled(), + ) { toggleListener.onBeginToggle(isOpening = false) - if (applyRiseAndShrinkAnimation) { - linearLayout.alpha = 1f - studyOptionsFrame?.let { it.alpha = 1f } - isFABOpen = false - binding.fabBGLayout.visibility = View.GONE - if (deckPicker.animationEnabled()) { - // Changes the background color of FAB to default - binding.fabMain.backgroundTintList = ColorStateList.valueOf(fabNormalColor) - // Close with animation - binding.fabMain.setIconResource(addWhiteIcon) - binding.fabMain.shrink() - - with(binding) { - addSharedButton.animate().alpha(0f).duration = 50 - addDeckButton.animate().alpha(0f).duration = 100 - addFilteredDeckButton.animate().alpha(0f).duration = 100 - addSharedButton.animate().translationY(400f).duration = 100 - addDeckButton - .animate() - .translationY(300f) - .setDuration(50) - .setListener( - object : Animator.AnimatorListener { - override fun onAnimationStart(animator: Animator) {} - - override fun onAnimationEnd(animator: Animator) { - if (!isFABOpen) { - addSharedButton.visibility = View.GONE - addDeckButton.visibility = View.GONE - addFilteredDeckButton.visibility = View.GONE - } - } - - override fun onAnimationCancel(animator: Animator) {} - - override fun onAnimationRepeat(animator: Animator) {} - }, - ) - addFilteredDeckButton - .animate() - .translationY(400f) - .setDuration(100) - .setListener( - object : Animator.AnimatorListener { - override fun onAnimationStart(animator: Animator) {} - - override fun onAnimationEnd(animator: Animator) { - if (!isFABOpen) { - addSharedButton.visibility = View.GONE - addDeckButton.visibility = View.GONE - addFilteredDeckButton.visibility = View.GONE - } - } - - override fun onAnimationCancel(animator: Animator) {} - - override fun onAnimationRepeat(animator: Animator) {} - }, - ) - } - } else { - // Close without animation - binding.addSharedButton.visibility = View.GONE - binding.addDeckButton.visibility = View.GONE - binding.addFilteredDeckButton.visibility = View.GONE - binding.fabMain.isExtended = false - - binding.fabMain.setIconResource(addWhiteIcon) + linearLayout.alpha = 1f + studyOptionsFrame?.let { it.alpha = 1f } + isFABOpen = false + with(binding) { + fabBGLayout.visibility = View.GONE + fabMain.backgroundTintList = ColorStateList.valueOf(fabNormalColor) + fabMain.setIconResource(addWhiteIcon) + + if (!animate) { + addSharedButton.animate().cancel() + addDeckButton.animate().cancel() + addFilteredDeckButton.animate().cancel() + hideMenuButtons() + fabMain.isExtended = false + return } - } else { - linearLayout.alpha = 1f - studyOptionsFrame?.let { it.alpha = 1f } - isFABOpen = false - binding.fabBGLayout.visibility = View.GONE - if (deckPicker.animationEnabled()) { - // Changes the background color of FAB to default - binding.fabMain.backgroundTintList = ColorStateList.valueOf(fabNormalColor) - // Close with animation - binding.fabMain.setIconResource(addWhiteIcon) - binding.fabMain.shrink() - - with(binding) { - addSharedButton.animate().alpha(0f).duration = 70 - addDeckButton.animate().alpha(0f).duration = 50 - addFilteredDeckButton.animate().alpha(0f).duration = 50 - addSharedButton.animate().translationY(600f).duration = 100 - addDeckButton - .animate() - .translationY(400f) - .setDuration(50) - .setListener( - object : Animator.AnimatorListener { - override fun onAnimationStart(animator: Animator) {} - - override fun onAnimationEnd(animator: Animator) { - if (!isFABOpen) { - addSharedButton.visibility = View.GONE - addDeckButton.visibility = View.GONE - addFilteredDeckButton.visibility = View.GONE - } - } - - override fun onAnimationCancel(animator: Animator) {} - - override fun onAnimationRepeat(animator: Animator) {} - }, - ) - addFilteredDeckButton - .animate() - .translationY(600f) - .setDuration(100) - .setListener( - object : Animator.AnimatorListener { - override fun onAnimationStart(animator: Animator) {} - - override fun onAnimationEnd(animator: Animator) { - if (!isFABOpen) { - addSharedButton.visibility = View.GONE - addDeckButton.visibility = View.GONE - addFilteredDeckButton.visibility = View.GONE - } - } - - override fun onAnimationCancel(animator: Animator) {} - - override fun onAnimationRepeat(animator: Animator) {} - }, - ) + + fabMain.shrink() + val hideButtons = + object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + if (!isFABOpen) { + hideMenuButtons() + } + } } - } else { - // Close without animation - binding.addSharedButton.visibility = View.GONE - binding.addDeckButton.visibility = View.GONE - binding.addFilteredDeckButton.visibility = View.GONE - binding.fabMain.isExtended = false - - binding.fabMain.setIconResource(addWhiteIcon) - } + addSharedButton.animateClose(style.otherOffset, 100) + addDeckButton.animateClose(style.deckOffset, 50).setListener(hideButtons) + addFilteredDeckButton.animateClose(style.otherOffset, 100).setListener(hideButtons) } } + private fun hideMenuButtons() = + with(binding) { + addSharedButton.visibility = View.GONE + addDeckButton.visibility = View.GONE + addFilteredDeckButton.visibility = View.GONE + } + + private fun View.animateClose( + offset: Float, + duration: Long, + ) = animate() + .alpha(0f) + .translationY(offset) + .setDuration(duration) + fun showFloatingActionButton() { if (!binding.fabMain.isShown) { Timber.i("DeckPicker:: showFloatingActionButton()") @@ -265,7 +199,7 @@ class DeckPickerFloatingActionMenu( fun hideFloatingActionButton() { if (binding.fabMain.isShown) { // close the menu if it's open so the other menu items are hidden as well - closeFloatingActionMenu(false) + closeFloatingActionMenu(style = CloseAnimation.LONG) Timber.i("DeckPicker:: hideFloatingActionButton()") binding.fabMain.visibility = View.GONE } @@ -287,6 +221,14 @@ class DeckPickerFloatingActionMenu( } init { + deckPicker.lifecycle.addObserver( + object : DefaultLifecycleObserver { + override fun onStop(owner: LifecycleOwner) = resetMenuAfterAdding() + + // In multi-window mode the deck screen may remain visible behind the editor. + override fun onResume(owner: LifecycleOwner) = resetMenuAfterAdding() + }, + ) binding.fabMain.isExtended = false binding.fabMain.setOnTouchListener( object : DoubleTapListener(context) { @@ -322,7 +264,7 @@ class DeckPickerFloatingActionMenu( KeyEvent.KEYCODE_ESCAPE -> { if (isFABOpen) { Timber.d("FAB main button: ESC key pressed - closing menu") - closeFloatingActionMenu(applyRiseAndShrinkAnimation = true) + closeFloatingActionMenu(style = CloseAnimation.SHORT) return@setOnKeyListener true } } @@ -331,11 +273,21 @@ class DeckPickerFloatingActionMenu( false } - binding.fabBGLayout.setOnClickListener { closeFloatingActionMenu(applyRiseAndShrinkAnimation = true) } + // Close the FAB menu when clicking outside the menu container + binding.fabBGLayout.setOnClickListener { closeFloatingActionMenu(style = CloseAnimation.SHORT) } + + // Close the FAB menu when clicking the background inside the menu container + // (e.g., when tapping to the left of narrower buttons such as the "Add" button) + binding.fabLinearLayout.setOnClickListener { + if (isFABOpen) { + closeFloatingActionMenu(style = CloseAnimation.SHORT) + } + } + val addDeckListener = View.OnClickListener { if (isFABOpen) { - closeFloatingActionMenu(applyRiseAndShrinkAnimation = false) + closeFloatingActionMenu(style = CloseAnimation.LONG) deckPicker.showCreateDeckDialog() } } @@ -346,7 +298,7 @@ class DeckPickerFloatingActionMenu( val addDeckKeyListener = createActivationKeyListener("Add Deck button: ENTER key pressed") { if (isFABOpen) { - closeFloatingActionMenu(applyRiseAndShrinkAnimation = false) + closeFloatingActionMenu(style = CloseAnimation.LONG) deckPicker.showCreateDeckDialog() } } @@ -354,7 +306,7 @@ class DeckPickerFloatingActionMenu( val addFilteredDeckListener = View.OnClickListener { if (isFABOpen) { - closeFloatingActionMenu(applyRiseAndShrinkAnimation = false) + closeFloatingActionMenu(style = CloseAnimation.LONG) deckPicker.showCreateFilteredDeckDialog() } } @@ -364,7 +316,7 @@ class DeckPickerFloatingActionMenu( val addFilteredDeckKeyListener = createActivationKeyListener("Add Filtered Deck button: ENTER key pressed") { if (isFABOpen) { - closeFloatingActionMenu(applyRiseAndShrinkAnimation = false) + closeFloatingActionMenu(style = CloseAnimation.LONG) deckPicker.showCreateFilteredDeckDialog() } } @@ -372,7 +324,7 @@ class DeckPickerFloatingActionMenu( val addSharedListener = View.OnClickListener { if (isFABOpen) { - closeFloatingActionMenu(applyRiseAndShrinkAnimation = false) + closeFloatingActionMenu(style = CloseAnimation.LONG) Timber.d("configureFloatingActionsMenu::addSharedButton::onClickListener - Adding Shared Deck") deckPicker.openAnkiWebSharedDecks() } @@ -383,7 +335,7 @@ class DeckPickerFloatingActionMenu( val addSharedKeyListener = createActivationKeyListener("Add Shared Deck button: ENTER key pressed") { if (isFABOpen) { - closeFloatingActionMenu(applyRiseAndShrinkAnimation = false) + closeFloatingActionMenu(style = CloseAnimation.LONG) deckPicker.openAnkiWebSharedDecks() } } @@ -408,14 +360,23 @@ class DeckPickerFloatingActionMenu( } /** - * Closes the FAB menu and opens the [NoteEditorFragment] + * Opens the [NoteEditorFragment], preserving the menu during the outgoing transition. * @see DeckPicker.addNote */ private fun addNote() { - closeFloatingActionMenu(applyRiseAndShrinkAnimation = false) + if (pendingMenuReset) return + pendingMenuReset = true + // Save a closed menu state without changing its appearance during the transition. + isFABOpen = false deckPicker.addNote() } + private fun resetMenuAfterAdding() { + if (!pendingMenuReset) return + pendingMenuReset = false + closeFloatingActionMenu(style = CloseAnimation.LONG, animate = false) + } + /** * Sets the label of the 'Create deck' button from the backend translation. */ @@ -427,6 +388,18 @@ class DeckPickerFloatingActionMenu( } } + /** Animation styles for closing the FAB menu, with offsets in pixels. */ + enum class CloseAnimation( + val deckOffset: Float, + val otherOffset: Float, + ) { + /** Back or an outside tap moves the menu buttons a shorter distance. */ + SHORT(deckOffset = 300f, otherOffset = 400f), + + /** Menu actions, the navigation drawer, or hiding the FAB move the buttons farther. */ + LONG(deckOffset = 400f, otherOffset = 600f), + } + fun interface FloatingActionBarToggleListener { /** Triggered when the drawer is starting to open/close */ fun onBeginToggle(isOpening: Boolean) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/DrawingFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/DrawingFragment.kt index 42ee61a1ed73..50e550ab5a42 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/DrawingFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/DrawingFragment.kt @@ -94,7 +94,7 @@ class DrawingFragment : Fragment(R.layout.fragment_drawing) { val imagePath = saveWhiteboard(whiteboardView) val result = Intent().apply { - putExtra(IMAGE_PATH_KEY, imagePath) + putExtra(EXTRA_IMAGE_PATH, imagePath) } // TODO don't depend on an Activity requireActivity().setResult(Activity.RESULT_OK, result) @@ -130,7 +130,7 @@ class DrawingFragment : Fragment(R.layout.fragment_drawing) { } companion object { - const val IMAGE_PATH_KEY = "path" + const val EXTRA_IMAGE_PATH = "path" fun getIntent(context: Context): Intent = SingleFragmentActivity.getIntent(context, DrawingFragment::class) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/FieldEditText.kt b/AnkiDroid/src/main/java/com/ichi2/anki/FieldEditText.kt index c658b29e4066..c97bdc20fd75 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/FieldEditText.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/FieldEditText.kt @@ -31,6 +31,7 @@ import timber.log.Timber import java.util.Locale import kotlin.math.max import kotlin.math.min +import com.ichi2.anki.common.android.R as CommonR class FieldEditText : FixedEditText, @@ -79,7 +80,7 @@ class FieldEditText : val highlightColor = MaterialColors.getColor( context, - R.attr.editTextHighlightColor, + CommonR.attr.editTextHighlightColor, "#99CCFF".toColorInt(), // light blue color for fallback just-in-case ) setHighlightColor(highlightColor) @@ -112,7 +113,7 @@ class FieldEditText : * Modify the style of this view to represent a duplicate field. */ fun setDupeStyle() { - setBackgroundColor(MaterialColors.getColor(context, R.attr.duplicateColor, 0)) + setBackgroundColor(MaterialColors.getColor(context, CommonR.attr.duplicateColor, 0)) } /** diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/HomeScreenNavigation.kt b/AnkiDroid/src/main/java/com/ichi2/anki/HomeScreenNavigation.kt index 3cbc6bcd07b2..db86c1afe205 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/HomeScreenNavigation.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/HomeScreenNavigation.kt @@ -16,7 +16,9 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction import androidx.fragment.app.commit import androidx.lifecycle.ViewModelProvider +import com.google.android.material.behavior.HideViewOnScrollBehavior import com.google.android.material.bottomnavigation.BottomNavigationView +import com.google.android.material.color.MaterialColors import com.ichi2.anki.BottomNavController.NavigationItem import com.ichi2.anki.browser.CardBrowserFragment import com.ichi2.anki.browser.CardBrowserViewModel @@ -24,6 +26,7 @@ import com.ichi2.anki.browser.IdsFile import com.ichi2.anki.common.analytics.Analytics import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.pages.Statistics +import com.google.android.material.R as MaterialR /** * Manages the bottom navigation bar for the home screen. @@ -43,7 +46,68 @@ fun setupBottomNavigation() { val bottomNav = deckPicker.findViewById(R.id.bottom_navigation) val fragmentContainer = deckPicker.findViewById(R.id.bottom_nav_fragment_container) val contentWrapper = deckPicker.findViewById(R.id.deck_picker_content_wrapper) + val studiedSummary = deckPicker.deckPickerBinding.reviewSummaryTextView + // Once raised above the bar, the summary overlaps the deck list: a solid background stops deck names showing through. + studiedSummary.setBackgroundColor(MaterialColors.getColor(bottomNav, MaterialR.attr.colorSurface)) bottomNav.isVisible = true + val scrollBehavior = HideViewOnScrollBehavior.from(bottomNav) + + fun updateFragmentBottomMargin() { + val margin = + if (scrollBehavior.isScrolledIn) { + bottomNav.height + } else { + ViewCompat.getRootWindowInsets(bottomNav)?.getInsets(navigationBars())?.bottom ?: 0 + } + if (fragmentContainer.marginBottom != margin) { + fragmentContainer.updateLayoutParams { bottomMargin = margin } + } + } + + fun positionStudiedSummary(animate: Boolean) { + // The "Studied X cards today" summary is anchored to the bottom of the Decks layout, not to the bar. + // Raise it above the bar while the bar is shown. When the bar hides, return it to its resting + // position, where its bottom padding already keeps it above the system navigation bar. + val translation = + if (scrollBehavior.isScrolledIn && studiedSummary.height > 0) { + val navLocation = IntArray(2).also(bottomNav::getLocationInWindow) + val summaryLocation = IntArray(2).also(studiedSummary::getLocationInWindow) + // Subtract current translations so this is the resting position, even mid-animation. + val navTop = navLocation[1] - bottomNav.translationY + val summaryContentBottom = + summaryLocation[1] - studiedSummary.translationY + studiedSummary.height - studiedSummary.paddingBottom + // Only ever raise it: an open keyboard already pads the text above the bar. + (navTop - summaryContentBottom - studiedSummary.marginBottom).coerceAtMost(0f) + } else if (scrollBehavior.isScrolledIn) { + -bottomNav.height.toFloat() + } else { + 0f + } + // The deck list fades from the summary downwards. Moving the summary does not redraw that fade, + // so redraw it on every step, or it stays at the summary's old position. + val fadeWrapper = deckPicker.deckPickerBinding.decksFadeWrapper + studiedSummary.animate().cancel() + if (animate) { + studiedSummary + .animate() + .translationY(translation) + .setDuration(bottomNav.resources.getInteger(android.R.integer.config_shortAnimTime).toLong()) + .setUpdateListener { fadeWrapper.invalidate() } + .start() + } else { + studiedSummary.translationY = translation + fadeWrapper.invalidate() + } + } + + // Never hide the bar while explore-by-touch (e.g. TalkBack) is on, so it stays reachable. + scrollBehavior.disableOnTouchExploration(true) + scrollBehavior.addOnScrollStateChangedListener { _, _ -> + updateFragmentBottomMargin() + positionStudiedSummary(animate = true) + // Re-apply insets so the Decks FAB and list padding follow the bar's new position. + ViewCompat.requestApplyInsets(deckPicker.deckPickerBinding.root) + } NavigationItem.populateMenu(bottomNav, deckPicker) @@ -67,14 +131,17 @@ fun setupBottomNavigation() { val navItem = NavigationItem.fromId(item.itemId) ?: return@setOnItemSelectedListener false if (item.itemId != bottomNav.selectedItemId) { Analytics.sendAnalyticsScreenView(navItem.analyticsScreenName) + scrollBehavior.slideIn(bottomNav) } handleNavigationItemSelected(navItem, contentWrapper, fragmentContainer, bottomNavBackCallback) } - bottomNav.addOnLayoutChangeListener { view, _, _, _, _, _, _, _, _ -> - if (fragmentContainer.marginBottom != view.height) { - fragmentContainer.updateLayoutParams { bottomMargin = view.height } - } + bottomNav.addOnLayoutChangeListener { _, _, top, _, bottom, _, oldTop, _, oldBottom -> + updateFragmentBottomMargin() + if (bottom - top != oldBottom - oldTop) positionStudiedSummary(animate = false) + } + studiedSummary.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> + if (scrollBehavior.isScrolledIn) positionStudiedSummary(animate = false) } } @@ -172,6 +239,18 @@ private fun showBottomNavFragment( fragmentContainer.isVisible = true } +/** + * Hides the bottom bar on downward scrolls and shows it on upward scrolls. + * For views which do not send nested-scroll events to the bar's [HideViewOnScrollBehavior]. + */ +fun Fragment.updateBottomNavOnScroll(dy: Int) { + val deckPicker = activity as? DeckPicker ?: return + if (dy == 0 || !isVisible || !deckPicker.bottomNavigationEnabled) return + val bottomNav = deckPicker.binding.bottomNavigation ?: return + val behavior = HideViewOnScrollBehavior.from(bottomNav) + if (dy > 0) behavior.slideOut(bottomNav) else behavior.slideIn(bottomNav) +} + /** Hides any fragments currently hosted in the bottom-nav container. */ context(deckPicker: DeckPicker) private fun FragmentTransaction.hideBottomNavFragments() { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/Import.kt b/AnkiDroid/src/main/java/com/ichi2/anki/Import.kt index 57db4db39996..679ccdcae3e8 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/Import.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/Import.kt @@ -13,11 +13,13 @@ import com.ichi2.anki.common.destinations.addNextIntent import com.ichi2.anki.common.preferences.sharedPrefs import com.ichi2.anki.common.storage.CollectionHelper import com.ichi2.anki.dialogs.AsyncDialogFragment +import com.ichi2.anki.dialogs.DialogHandler import com.ichi2.anki.dialogs.ImportDialog import com.ichi2.anki.dialogs.ImportFileSelectionFragment import com.ichi2.anki.dialogs.ImportFileSelectionFragment.ImportOptions import com.ichi2.anki.utils.ext.dismissAllDialogFragments import com.ichi2.anki.utils.ext.showDialogFragment +import com.ichi2.utils.ImportResolution import com.ichi2.utils.ImportResult import com.ichi2.utils.ImportUtils import timber.log.Timber @@ -55,7 +57,10 @@ fun AnkiActivity.onSelectedPackageToImport(data: Intent) { fun Activity.onSelectedCsvForImport(data: Intent) { val path = ImportUtils.getFileCachedCopy(this, data) ?: return + openCsvImporter(path) +} +fun Activity.openCsvImporter(path: String) { val stackBuilder = TaskStackBuilder.create(this) stackBuilder.addNextIntentWithParentStack(Intent(this, DeckPicker::class.java)) stackBuilder.addNextIntent(CsvImporterDestination(path)) @@ -63,6 +68,22 @@ fun Activity.onSelectedCsvForImport(data: Intent) { stackBuilder.startActivities() } +/** + * Open prepared text immediately, or store a package confirmation for the caller or onResume. + */ +fun Activity.openImport(result: ImportResult.Success) { + val message = + when (result.file) { + is ImportResolution.DeckPackage -> ImportUtils.CollectionImportAdd(result.path) + is ImportResolution.CollectionPackage -> ImportUtils.CollectionImportReplace(result.path) + is ImportResolution.Text -> { + openCsvImporter(result.path) + return + } + } + DialogHandler.storeMessage(message.toMessage()) +} + fun AnkiActivity.showImportDialog( id: ImportDialog.Type, importPath: String, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/Info.kt b/AnkiDroid/src/main/java/com/ichi2/anki/Info.kt index d9d639fae1c6..4920fbd75ec6 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/Info.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/Info.kt @@ -12,7 +12,6 @@ import android.view.View import android.webkit.WebChromeClient import android.webkit.WebResourceRequest import android.webkit.WebView -import android.webkit.WebViewClient import androidx.activity.OnBackPressedCallback import androidx.activity.SystemBarStyle import androidx.activity.enableEdgeToEdge @@ -26,6 +25,8 @@ import com.ichi2.anki.common.utils.android.getColorFromAttr import com.ichi2.anki.databinding.ActivityInfoBinding import com.ichi2.anki.snackbar.BaseSnackbarBuilderProvider import com.ichi2.anki.snackbar.SnackbarBuilder +import com.ichi2.anki.workarounds.OnWebViewRecreatedListener +import com.ichi2.anki.workarounds.SafeWebViewClient import com.ichi2.utils.IntentUtil.canOpenIntent import com.ichi2.utils.IntentUtil.tryOpenIntent import com.ichi2.utils.VersionUtils.appName @@ -44,8 +45,10 @@ private const val CHANGE_LOG_URL = "https://docs.ankidroid.org/changelog.html" */ class Info : AnkiActivity(R.layout.activity_info), - BaseSnackbarBuilderProvider { + BaseSnackbarBuilderProvider, + OnWebViewRecreatedListener { private val binding by viewBinding(ActivityInfoBinding::bind) + private lateinit var onBackPressedCallback: OnBackPressedCallback override val baseSnackbarBuilder: SnackbarBuilder = { anchorView = binding.buttons @@ -69,18 +72,6 @@ class Info : binding.donate.isVisible = false } title = "$appName v$pkgVersionName" - binding.webView.webChromeClient = - object : WebChromeClient() { - override fun onProgressChanged( - view: WebView, - progress: Int, - ) { - // Hide the progress indicator when the page has finished loaded - if (progress == 100) { - binding.progressBar.visibility = View.GONE - } - } - } binding.leftButton.run { if (canOpenMarketUri()) { setText(CommonString.info_rate) @@ -94,33 +85,58 @@ class Info : visibility = View.GONE } } - val onBackPressedCallback = + onBackPressedCallback = object : OnBackPressedCallback(false) { override fun handleOnBackPressed() { if (binding.webView.canGoBack()) binding.webView.goBack() } } + onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + binding.rightButton.run { + text = getString(CommonString.dialog_continue) + setOnClickListener { close() } + } + setupWebView() + } + + override fun onWebViewRecreated(webView: WebView) { + setupWebView() + } + + @SuppressLint("SetJavaScriptEnabled") + private fun setupWebView() { // Apply Theme colors val typedArray = theme.obtainStyledAttributes(intArrayOf(android.R.attr.colorBackground, android.R.attr.textColor)) val backgroundColor = typedArray.getColor(0, -1) val textColor = typedArray.getColor(1, -1).toRGBHex() + typedArray.recycle() val anchorTextThemeColor = getColorFromAttr(this, android.R.attr.colorAccent) val anchorTextColor = anchorTextThemeColor.toRGBHex() + val background = backgroundColor.toRGBHex() binding.webView.setBackgroundColor(backgroundColor) binding.webView.settings.allowFileAccess = true binding.webView.settings.allowContentAccess = true setRenderWorkaround(this) - binding.rightButton.run { - text = getString(CommonString.dialog_continue) - setOnClickListener { close() } - } - val background = backgroundColor.toRGBHex() - binding.webView.loadUrl("/android_asset/changelog.html") + + binding.webView.setWebChromeClient( + object : WebChromeClient() { + override fun onProgressChanged( + view: WebView, + progress: Int, + ) { + // Hide the progress indicator when the page has finished loaded + if (progress == 100) { + binding.progressBar.visibility = View.GONE + } + } + }, + ) + binding.webView.settings.javaScriptEnabled = true - binding.webView.webViewClient = - object : WebViewClient() { + binding.webView.setWebViewClient( + object : SafeWebViewClient() { override fun onPageFinished( view: WebView, url: String, @@ -129,7 +145,7 @@ class Info : * or else it will break in any one mode. */ @Suppress("ktlint:standard:max-line-length") - binding.webView.loadUrl( + view.loadUrl( """javascript:document.body.style.setProperty("color", "$textColor"); x=document.getElementsByTagName("a"); for(i=0; i a.replaceWith(...a.childNodes));""", null, @@ -172,10 +188,16 @@ class Info : isReload: Boolean, ) { super.doUpdateVisitedHistory(view, url, isReload) - onBackPressedCallback.isEnabled = view != null && view.canGoBack() + onBackPressedCallback.isEnabled = binding.webView.canGoBack() } - } - onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + }, + ) + binding.webView.loadUrl("/android_asset/changelog.html") + } + + override fun onDestroy() { + binding.webView.safeDestroy() + super.onDestroy() } /** diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/InitialActivity.kt b/AnkiDroid/src/main/java/com/ichi2/anki/InitialActivity.kt index 2fa9b5732c65..47032a3a5b60 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/InitialActivity.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/InitialActivity.kt @@ -30,8 +30,8 @@ import com.ichi2.anki.exception.SystemStorageException import com.ichi2.anki.servicelayer.PreferenceUpgradeService import com.ichi2.anki.servicelayer.PreferenceUpgradeService.setPreferencesUpToDate import com.ichi2.anki.startup.StoragePolicy -import com.ichi2.anki.startup.ensureCollectionPathSet import com.ichi2.anki.startup.folderToPersist +import com.ichi2.anki.startup.maybeSetDefaultCollectionPath import com.ichi2.anki.ui.windows.permissions.InternetPermissionFragment import com.ichi2.anki.ui.windows.permissions.LegacyNotificationsPermissionFragment import com.ichi2.anki.ui.windows.permissions.NotificationsPermissionFragment @@ -55,11 +55,11 @@ object InitialActivity { * [StorageDecision] undecided. Startup calls this once permissions are granted, so a * deferred decision is recorded before the collection is opened. * - * @see ensureCollectionPathSet + * @see maybeSetDefaultCollectionPath */ fun decideStorageIfUndecided(context: Context) { try { - ensureCollectionPathSet(context) + maybeSetDefaultCollectionPath(context) } catch (e: SystemStorageException) { // startup continues: getStartupFailureType reports the undecided state Timber.w(e, "unable to choose a default collection path") @@ -268,7 +268,7 @@ enum class StoragePermissionSet( get() = when (this) { LEGACY_ACCESS -> StoragePolicy.Fixed(AnkiDroidFolder.PUBLIC) - EXTERNAL_MANAGER -> StoragePolicy.Fixed(AnkiDroidFolder.PUBLIC) + EXTERNAL_MANAGER -> StoragePolicy.UserChoosesOnPermissionScreen APP_PRIVATE -> StoragePolicy.Fixed(AnkiDroidFolder.APP_PRIVATE) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/IntentHandler.kt b/AnkiDroid/src/main/java/com/ichi2/anki/IntentHandler.kt index ca424c2f39af..c4cca328a2f6 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/IntentHandler.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/IntentHandler.kt @@ -29,13 +29,14 @@ import com.ichi2.anki.common.utils.ext.getParcelableExtraCompat import com.ichi2.anki.dialogs.DialogHandler.Companion.storeMessage import com.ichi2.anki.dialogs.DialogHandlerMessage import com.ichi2.anki.dialogs.requireDeckPickerOrShowError -import com.ichi2.anki.exception.SystemStorageException import com.ichi2.anki.libanki.DeckId import com.ichi2.anki.settings.Prefs import com.ichi2.anki.shareddeck.SharedDecksDownloadFragment +import com.ichi2.anki.sync.MeteredSyncPolicy import com.ichi2.anki.ui.windows.reviewer.ReviewerFragment import com.ichi2.anki.utils.MimeTypeUtils import com.ichi2.anki.worker.SyncWorker +import com.ichi2.anki.worker.UniqueWorkNames import com.ichi2.utils.FileUtil import com.ichi2.utils.ImportResult import com.ichi2.utils.ImportUtils.handleFileImport @@ -46,6 +47,9 @@ import com.ichi2.utils.NetworkUtils import com.ichi2.utils.TruncatedString import com.ichi2.utils.copyToClipboard import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import timber.log.Timber import java.io.File @@ -60,6 +64,9 @@ import kotlin.math.min * @author Tim */ class IntentHandler : AbstractIntentHandler() { + // A delayed work query must not reopen DeckPicker after this activity is dismissed. + private val syncIntentScope = MainScope() + override fun onCreate(savedInstanceState: Bundle?) { // Note: This is our entry point from the launcher with intent: android.intent.action.MAIN if (showedActivityFailedScreen(savedInstanceState)) { @@ -76,7 +83,8 @@ class IntentHandler : AbstractIntentHandler() { val runIfStoragePermissions = { runnable: () -> Unit -> performActionIfStorageAccessible(reloadIntent, action) { runnable() } } val launchType = getLaunchType(intent) // TODO block the UI with some kind of ProgressDialog instead of cancelling the sync work - if (requiresCollectionAccess(launchType)) { + // A sync intent must not interrupt an existing sync; handleSyncIntent ignores duplicates. + if (launchType != LaunchType.SYNC && requiresCollectionAccess(launchType)) { if (WorkManager.isInitialized()) { SyncWorker.cancel(this) } else { @@ -118,6 +126,11 @@ class IntentHandler : AbstractIntentHandler() { } } + override fun onDestroy() { + syncIntentScope.cancel() + super.onDestroy() + } + private fun copyDebugInfoToClipboard(intent: Intent) { Timber.i("Copying debug info to clipboard") val clipboardData = @@ -210,11 +223,23 @@ class IntentHandler : AbstractIntentHandler() { action: String?, ) { Timber.i("Handling Sync Intent") - sendDoSyncMsg() - reloadIntent.action = action - reloadIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) - startActivity(reloadIntent) - finish() + syncIntentScope.launch { + val existingSync = WorkManager.getInstance(this@IntentHandler).getWorkInfosForUniqueWorkFlow(UniqueWorkNames.SYNC).first() + // finish() may be called before onDestroy() cancels the query. + if (isFinishing) return@launch + val foregroundSync = CollectionManager.collectionLease?.operation?.isSync == true + if (foregroundSync || existingSync.any { !it.state.isFinished }) { + // Opening DeckPicker would also access the collection while the existing sync is using it. + Timber.w("Ignoring sync intent: collection sync is already pending or running") + finish() + return@launch + } + sendDoSyncMsg() + reloadIntent.action = action + reloadIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + startActivity(reloadIntent) + finish() + } } private fun handleFileImport( @@ -358,8 +383,9 @@ class IntentHandler : AbstractIntentHandler() { } companion object { + private const val ACTION_DO_SYNC = "com.ichi2.anki.DO_SYNC" const val EXTRA_DECK_ID = "EXTRA_DECK_ID" - private const val CLIPBOARD_INTENT = "com.ichi2.anki.COPY_DEBUG_INFO" + private const val ACTION_COPY_DEBUG_INFO = "com.ichi2.anki.COPY_DEBUG_INFO" private const val EXTRA_CLIPBOARD_DATA = "clip_data" private val textMimeTypes = MimeTypeUtils.CSV_TSV_MIME_TYPES @@ -370,25 +396,6 @@ class IntentHandler : AbstractIntentHandler() { return !isInvalidViewIntent(intent) } - /** Checks whether storage permissions are granted on the device. If the device is not using legacy storage, - * it verifies if the app has been granted the necessary storage access permission. - * @return `true`: if granted, otherwise `false` and shows a missing permission toast - * - * @throws SystemStorageException if `getExternalFilesDir` returns null - */ - fun grantedStoragePermissions( - context: Context, - showToast: Boolean, - ): Boolean { - val granted = grantedStoragePermissions(context) - - if (!granted && showToast) { - showThemedToast(context, context.getString(CommonString.intent_handler_failed_no_storage_permission), false) - } - - return granted - } - /** Whether this is the `anki://x-callback-url/browser` deep link that opens the [CardBrowser]. */ private fun Intent.isBrowserDeepLink(): Boolean { val data = data ?: return false @@ -414,11 +421,11 @@ class IntentHandler : AbstractIntentHandler() { textMimeTypes.contains(mimeType) -> LaunchType.TEXT_IMPORT else -> LaunchType.FILE_IMPORT } - } else if ("com.ichi2.anki.DO_SYNC" == action) { + } else if (ACTION_DO_SYNC == action) { LaunchType.SYNC } else if (intent.hasExtra(EXTRA_DECK_ID)) { LaunchType.REVIEW - } else if (action == CLIPBOARD_INTENT) { + } else if (action == ACTION_COPY_DEBUG_INFO) { LaunchType.COPY_DEBUG_INFO } else { LaunchType.DEFAULT_START_APP_IF_NEW @@ -457,17 +464,18 @@ class IntentHandler : AbstractIntentHandler() { val deckPicker = activity.requireDeckPickerOrShowError() ?: return val res = deckPicker.resources val hkey = Prefs.hkey - val millisecondsSinceLastSync = millisecondsSinceLastSync() - val limited = millisecondsSinceLastSync < INTENT_SYNC_MIN_INTERVAL + val millisecondsSinceLastSyncAttempt = millisecondsSinceLastSyncAttempt() + val limited = millisecondsSinceLastSyncAttempt < INTENT_SYNC_MIN_INTERVAL if (!limited && !hkey.isNullOrEmpty() && NetworkUtils.isOnline) { - deckPicker.sync() + startBackgroundSync(deckPicker) } else { val err = res.getString(CommonString.sync_error) if (limited) { val remainingTimeInSeconds = - max((INTENT_SYNC_MIN_INTERVAL - millisecondsSinceLastSync) / 1000, 1) + max((INTENT_SYNC_MIN_INTERVAL - millisecondsSinceLastSyncAttempt) / 1000, 1) // getQuantityString needs an int val remaining = min(Int.MAX_VALUE.toLong(), remainingTimeInSeconds).toInt() + Timber.i("Ignoring sync intent: rate limited for another %d seconds", remaining) val message = res.getQuantityString( CommonPlurals.sync_automatic_sync_needs_more_time, @@ -476,6 +484,7 @@ class IntentHandler : AbstractIntentHandler() { ) deckPicker.showSimpleNotification(err, message, NotificationChannel.SYNC) } else { + Timber.i("Ignoring sync intent: %s", if (hkey.isNullOrEmpty()) "not logged in" else "offline") deckPicker.showSimpleNotification( err, res.getString(CommonString.youre_offline), @@ -486,6 +495,23 @@ class IntentHandler : AbstractIntentHandler() { deckPicker.finish() } + private fun startBackgroundSync(deckPicker: DeckPicker) { + if (MeteredSyncPolicy.shouldBlock()) { + Timber.i("Ignoring sync intent: metered sync is disabled") + return + } + val auth = syncAuth() + if (auth == null) { + Timber.i("Ignoring sync intent: no sync credentials") + return + } + + // Keep collection and media sync running after DeckPicker finishes. + val syncMedia = shouldFetchMedia() + Timber.i("Enqueuing background sync from intent (syncMedia=%s)", syncMedia) + SyncWorker.start(deckPicker, auth, syncMedia = syncMedia) + } + override fun toMessage(): Message = emptyMessage(this.what) companion object { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/IntroductionActivity.kt b/AnkiDroid/src/main/java/com/ichi2/anki/IntroductionActivity.kt index c7e8bd5cc6ae..4428a320d9ef 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/IntroductionActivity.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/IntroductionActivity.kt @@ -20,7 +20,7 @@ import com.ichi2.anki.common.preferences.sharedPrefs import com.ichi2.anki.introduction.CollectionPermissionScreenLauncher import com.ichi2.anki.introduction.SetupCollectionFragment import com.ichi2.anki.introduction.SetupCollectionFragment.CollectionSetupOption -import com.ichi2.anki.introduction.SetupCollectionFragment.Companion.FRAGMENT_KEY +import com.ichi2.anki.introduction.SetupCollectionFragment.Companion.REQUEST_COLLECTION_SETUP import com.ichi2.anki.introduction.SetupCollectionFragment.Companion.RESULT_KEY import com.ichi2.anki.introduction.hasCollectionStoragePermissions import com.ichi2.anki.utils.ext.setFragmentResultListener @@ -63,7 +63,7 @@ class IntroductionActivity : super.onCreate(savedInstanceState) enableEdgeToEdge(statusBarStyle = SystemBarStyle.dark(Color.TRANSPARENT)) - setFragmentResultListener(FRAGMENT_KEY) { _, bundle -> + setFragmentResultListener(REQUEST_COLLECTION_SETUP) { _, bundle -> val option = BundleCompat.getParcelable(bundle, RESULT_KEY, CollectionSetupOption::class.java) ?: error("Missing introduction option!") when (option) { @@ -82,11 +82,11 @@ class IntroductionActivity : private fun startDeckPicker(result: Int = RESULT_START_NEW) { Timber.i("Opening deck picker, login: %b", result == RESULT_SYNC_PROFILE) - this.sharedPrefs().edit { putBoolean(INTRODUCTION_SLIDES_SHOWN, true) } + this.sharedPrefs().edit { putBoolean(PREF_INTRODUCTION_SLIDES_SHOWN, true) } val deckPicker = Intent(this, DeckPicker::class.java) deckPicker.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) if (result == RESULT_SYNC_PROFILE) { - deckPicker.putExtra(DeckPicker.INTENT_SYNC_FROM_LOGIN, true) + deckPicker.putExtra(DeckPicker.EXTRA_SYNC_FROM_LOGIN, true) } startActivity(deckPicker) @@ -101,8 +101,8 @@ class IntroductionActivity : * Key for the preference recording that the slide "Study less/ Remember more" offering to * get started or sync from ankiweb, was displayed. If so don't display it again. */ - const val INTRODUCTION_SLIDES_SHOWN = "IntroductionSlidesShown" + const val PREF_INTRODUCTION_SLIDES_SHOWN = "IntroductionSlidesShown" } } -internal fun Context.hasShownAppIntro(): Boolean = sharedPrefs().getBoolean(IntroductionActivity.INTRODUCTION_SLIDES_SHOWN, false) +internal fun Context.hasShownAppIntro(): Boolean = sharedPrefs().getBoolean(IntroductionActivity.PREF_INTRODUCTION_SLIDES_SHOWN, false) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/MediaRegistration.kt b/AnkiDroid/src/main/java/com/ichi2/anki/MediaRegistration.kt index 39889d4771f3..07d23332199a 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/MediaRegistration.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/MediaRegistration.kt @@ -197,7 +197,8 @@ object MediaRegistration { } // register media for webView - if (!registerMediaForWebView(tempFilePath)) { + val importedFile = registerMediaForWebView(tempFilePath) + if (importedFile == null) { clipCopy.delete() return null } @@ -205,8 +206,7 @@ object MediaRegistration { val field = if (isImage) ImageField() else MediaClipField() - field.hasTemporaryMedia = true - field.mediaFile = tempFilePath + field.mediaFile = importedFile return field.formattedValue } @@ -231,25 +231,22 @@ object MediaRegistration { } /** + * @return the imported file, including any filename changes made by the backend, or null on failure + * * @throws OutOfMemoryError if the file could not be copied to a contiguous block of memory (or is >= 2GB) */ @CheckResult - fun registerMediaForWebView(mediaPath: File?): Boolean { - if (mediaPath == null) { - // Nothing to register - continue with execution. - return true - } + private fun registerMediaForWebView(mediaPath: File): File? { Timber.i("Adding media to collection: %s", mediaPath) - val f = mediaPath return try { - CollectionManager.getColUnsafe().media.addFile(f) - true + val media = CollectionManager.getColUnsafe().media + File(media.dir, media.addFile(mediaPath)) } catch (e: IOException) { Timber.w(e, "Failed to add file") - false + null } catch (e: EmptyMediaException) { Timber.w(e, "Failed to add file") - false + null } } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/NavigationDrawerActivity.kt b/AnkiDroid/src/main/java/com/ichi2/anki/NavigationDrawerActivity.kt index b4c4adbed9b4..e0016b6e8389 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/NavigationDrawerActivity.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/NavigationDrawerActivity.kt @@ -38,7 +38,6 @@ import androidx.viewbinding.ViewBinding import com.google.android.material.color.MaterialColors import com.google.android.material.navigation.NavigationView import com.ichi2.anki.CollectionManager.TR -import com.ichi2.anki.IntentHandler.Companion.grantedStoragePermissions import com.ichi2.anki.NoteEditorFragment.Companion.NoteEditorCaller import com.ichi2.anki.common.android.animationEnabled import com.ichi2.anki.common.destinations.BrowserDestination @@ -48,6 +47,7 @@ import com.ichi2.anki.common.destinations.StatisticsDestination import com.ichi2.anki.common.destinations.navigate import com.ichi2.anki.common.destinations.toIntent import com.ichi2.anki.common.preferences.sharedPrefs +import com.ichi2.anki.common.storage.grantedStoragePermissions import com.ichi2.anki.common.utils.android.HandlerUtils import com.ichi2.anki.dialogs.help.HelpDialog import com.ichi2.anki.utils.ext.showDialogFragment @@ -99,7 +99,7 @@ abstract class NavigationDrawerActivity( ) as ClosableDrawerLayout val coordinatorLayout = binding.root - if (preferences.getBoolean(FULL_SCREEN_NAVIGATION_DRAWER, false)) { + if (preferences.getBoolean(PREF_FULL_SCREEN_NAVIGATION_DRAWER, false)) { // If full screen navigation drawer is needed, then add FullDraggableContainer as a child view of closableDrawerLayout. // Then add coordinatorLayout as a child view of fullDraggableContainer. val fullDraggableContainer = FullDraggableContainerFix(this) @@ -129,7 +129,7 @@ abstract class NavigationDrawerActivity( LayoutInflater .from(this) .inflate(layoutResID, closableDrawerLayout, false) as CoordinatorLayout - if (preferences.getBoolean(FULL_SCREEN_NAVIGATION_DRAWER, false)) { + if (preferences.getBoolean(PREF_FULL_SCREEN_NAVIGATION_DRAWER, false)) { // If full screen navigation drawer is needed, then add FullDraggableContainer as a child view of closableDrawerLayout. // Then add coordinatorLayout as a child view of fullDraggableContainer. val fullDraggableContainer = FullDraggableContainerFix(this) @@ -157,7 +157,7 @@ abstract class NavigationDrawerActivity( // Create inherited navigation drawer layout here so that it can be used by parent class drawerLayout = mainView.findViewById(R.id.drawer_layout) // Force transparent status bar with primary dark color underlaid so that the drawer displays under status bar - window.statusBarColor = getColor(R.color.transparent) + window.statusBarColor = getColor(CommonR.color.transparent) drawerLayout.setStatusBarBackgroundColor( MaterialColors.getColor( this, @@ -306,7 +306,9 @@ abstract class NavigationDrawerActivity( override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) // Pass any configuration change to the drawer toggles - drawerToggle.onConfigurationChanged(newConfig) + if (::drawerToggle.isInitialized) { + drawerToggle.onConfigurationChanged(newConfig) + } } /** @@ -497,7 +499,7 @@ abstract class NavigationDrawerActivity( companion object { // Intent request codes const val REQUEST_PREFERENCES_UPDATE = 100 - const val FULL_SCREEN_NAVIGATION_DRAWER = "gestureFullScreenNavigationDrawer" + const val PREF_FULL_SCREEN_NAVIGATION_DRAWER = "gestureFullScreenNavigationDrawer" const val EXTRA_STARTED_WITH_SHORTCUT = "com.ichi2.anki.StartedWithShortcut" diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditorActivity.kt b/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditorActivity.kt index 1bf05a082800..1b16456a4923 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditorActivity.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditorActivity.kt @@ -40,6 +40,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.delay import timber.log.Timber import kotlin.time.Duration.Companion.milliseconds +import com.ichi2.anki.common.android.R as CommonR /** * To find the actual note Editor, @see [NoteEditorFragment] @@ -105,7 +106,7 @@ class NoteEditorActivity : if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { window.isNavigationBarContrastEnforced = false } else { - setNavigationBarColor(R.attr.toolbarBackgroundColor) + setNavigationBarColor(CommonR.attr.toolbarBackgroundColor) } ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets -> val bars = insets.getInsets(systemBars() or displayCutout() or ime()) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditorFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditorFragment.kt index baee819a2a3a..29475bef92a7 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditorFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditorFragment.kt @@ -98,8 +98,9 @@ import com.ichi2.anki.common.utils.android.showThemedToast import com.ichi2.anki.common.utils.annotation.KotlinCleanup import com.ichi2.anki.common.utils.ext.AddingDefaultsMode import com.ichi2.anki.common.utils.ext.addingDefaultsMode -import com.ichi2.anki.common.utils.ext.currentDeckId import com.ichi2.anki.common.utils.ext.getParcelableExtraCompat +import com.ichi2.anki.common.utils.ext.ifZero +import com.ichi2.anki.common.utils.ext.indexOfOrNull import com.ichi2.anki.common.utils.ext.pasteImagesAsPng import com.ichi2.anki.compat.CompatHelper.Companion.getSerializableCompat import com.ichi2.anki.compat.setTooltipTextCompat @@ -145,6 +146,8 @@ import com.ichi2.anki.noteeditor.NoteEditorMultimediaController import com.ichi2.anki.noteeditor.Toolbar import com.ichi2.anki.noteeditor.Toolbar.TextFormatListener import com.ichi2.anki.noteeditor.Toolbar.TextWrapper +import com.ichi2.anki.noteeditor.ToolbarLayoutDialogHost +import com.ichi2.anki.noteeditor.data.ToolbarPreferences import com.ichi2.anki.observability.undoableOp import com.ichi2.anki.pages.ImageOcclusion import com.ichi2.anki.pages.viewmodel.ImageOcclusionArgs @@ -153,6 +156,7 @@ import com.ichi2.anki.previewer.TemplatePreviewerPage import com.ichi2.anki.servicelayer.LanguageHintService.languageHint import com.ichi2.anki.servicelayer.NoteService import com.ichi2.anki.servicelayer.NoteService.convertToHtmlNewline +import com.ichi2.anki.settings.Prefs import com.ichi2.anki.snackbar.BaseSnackbarBuilderProvider import com.ichi2.anki.snackbar.SnackbarBuilder import com.ichi2.anki.snackbar.showSnackbar @@ -162,13 +166,14 @@ import com.ichi2.anki.utils.HanUnificationDetector import com.ichi2.anki.utils.RunOnlyOnce import com.ichi2.anki.utils.bottomCornerSideClearance import com.ichi2.anki.utils.doOnApplyWindowInsets +import com.ichi2.anki.utils.ext.getLongOrNull import com.ichi2.anki.utils.ext.requireLong import com.ichi2.anki.utils.ext.sharedPrefs import com.ichi2.anki.utils.ext.showDialogFragment import com.ichi2.anki.utils.insetsOf import com.ichi2.anki.utils.openUrl import com.ichi2.imagecropper.ImageCropper -import com.ichi2.imagecropper.ImageCropper.Companion.CROP_IMAGE_RESULT +import com.ichi2.imagecropper.ImageCropper.Companion.EXTRA_CROP_IMAGE_RESULT import com.ichi2.imagecropper.ImageCropperLauncher import com.ichi2.utils.AndroidUiUtils.showSoftInput import com.ichi2.utils.ClipboardUtil @@ -199,8 +204,7 @@ import kotlin.math.max import kotlin.math.min import kotlin.math.roundToInt import com.ichi2.anki.common.android.R as CommonR - -const val CALLER_KEY = "caller" +import com.ichi2.anki.noteeditor.R as NoteEditorR /** * Allows the user to edit a note, for instance if there is a typo. A card is a presentation of a note, and has two @@ -299,6 +303,8 @@ class NoteEditorFragment : private var sourceText: Array? = null private val fieldState = FieldState.fromEditor(this) private lateinit var toolbar: Toolbar + private val toolbarPreferences by lazy { ToolbarPreferences(sharedPrefs()) } + private val toolbarLayoutDialog = ToolbarLayoutDialogHost() // save field index as key and text as value when toggle sticky clicked in Field Edit Text @VisibleForTesting @@ -323,7 +329,7 @@ class NoteEditorFragment : * If true, this fragment is on the trailing side of the card browser. */ private val inCardBrowserActivity - get() = requireArguments().getBoolean(IN_CARD_BROWSER_ACTIVITY) + get() = requireArguments().getBoolean(EXTRA_IN_CARD_BROWSER_ACTIVITY) private val requestAddLauncher = registerForActivityResult( @@ -351,9 +357,7 @@ class NoteEditorFragment : } @VisibleForTesting - internal val multimediaController: NoteEditorMultimediaController by lazy { - NoteEditorMultimediaController(this, multimediaFragmentLauncher) - } + internal val multimediaController: NoteEditorMultimediaController = NoteEditorMultimediaController(this, multimediaFragmentLauncher) private val requestTemplateEditLauncher = registerForActivityResult( @@ -539,17 +543,18 @@ class NoteEditorFragment : fieldState.setInstanceState(savedInstanceState) val intent = requireActivity().intent if (savedInstanceState != null) { - caller = fromValue(savedInstanceState.getInt(CALLER_KEY)) + caller = fromValue(savedInstanceState.getInt(STATE_CALLER)) addNote = savedInstanceState.getBoolean("addNote") + isFieldEdited = savedInstanceState.getBoolean("isFieldEdited") deckId = savedInstanceState.getLong("did") selectedNoteTypeId = if (savedInstanceState.containsKey("noteTypeId")) savedInstanceState.getLong("noteTypeId") else null selectedTags = savedInstanceState.getStringArrayList("tags") - reloadRequired = savedInstanceState.getBoolean(EXTRA_RELOAD_REQUIRED) + reloadRequired = savedInstanceState.getBoolean(STATE_RELOAD_REQUIRED) multimediaController.onRestoreInstanceState(savedInstanceState) toggleStickyText = savedInstanceState.getSerializableCompat>("toggleSticky")!! - changed = savedInstanceState.getBoolean(EXTRA_NOTE_CHANGED) + changed = savedInstanceState.getBoolean(STATE_NOTE_CHANGED) } else { caller = fromValue(requireArguments().getInt(EXTRA_CALLER, NoteEditorCaller.NO_CALLER.value)) if (caller == NoteEditorCaller.NO_CALLER) { @@ -578,16 +583,20 @@ class NoteEditorFragment : setBackgroundColor( MaterialColors.getColor( requireContext(), - R.attr.toolbarBackgroundColor, + CommonR.attr.toolbarBackgroundColor, 0, ), ) - setIconColor(MaterialColors.getColor(requireContext(), R.attr.toolbarIconColor, 0)) + setIconColor(MaterialColors.getColor(requireContext(), CommonR.attr.toolbarIconColor, 0)) } + toolbarLayoutDialog.bind(binding.toolbarLayoutDialog, toolbarPreferences, savedInstanceState, ::updateToolbar) setupEdgeToEdge() registerDeckSelectedHandler(REQUEST_DECK_SELECTION_NOTE_EDITOR, ::onDeckSelected) try { - setupEditor(getColUnsafe) + setupEditor(getColUnsafe, savedInstanceState) + if (addNote) { + savedInstanceState?.getStringArrayList("addNoteFieldBaseline")?.let { addNoteFieldBaseline = it } + } } catch (ex: RuntimeException) { Timber.w(ex, "setupEditor") requireAnkiActivity().onCollectionLoadError() @@ -611,17 +620,23 @@ class NoteEditorFragment : override fun onSaveInstanceState(outState: Bundle) { addInstanceStateToBundle(outState) super.onSaveInstanceState(outState) + toolbarLayoutDialog.onSaveInstanceState(outState) } private fun addInstanceStateToBundle(savedInstanceState: Bundle) { Timber.i("Saving instance") - savedInstanceState.putInt(CALLER_KEY, caller.value) + savedInstanceState.putInt(STATE_CALLER, caller.value) savedInstanceState.putBoolean("addNote", addNote) + if (addNote) { + savedInstanceState.putBoolean("isFieldEdited", isFieldEdited) + savedInstanceState.putStringArrayList("addNoteFieldBaseline", ArrayList(addNoteFieldBaseline)) + } savedInstanceState.putLong("did", deckId) selectedNoteTypeId?.let { savedInstanceState.putLong("noteTypeId", it) } - savedInstanceState.putBoolean(EXTRA_NOTE_CHANGED, changed) - savedInstanceState.putBoolean(EXTRA_RELOAD_REQUIRED, reloadRequired) + savedInstanceState.putBoolean(STATE_NOTE_CHANGED, changed) + savedInstanceState.putBoolean(STATE_RELOAD_REQUIRED, reloadRequired) savedInstanceState.putIntegerArrayList("customViewIds", customViewIds) + fieldState.saveInstanceState(savedInstanceState) multimediaController.onSaveInstanceState(savedInstanceState) savedInstanceState.putSerializable("toggleSticky", toggleStickyText) if (selectedTags == null) { @@ -631,7 +646,10 @@ class NoteEditorFragment : } // Finish initializing the fragment after the collection has been correctly loaded - private fun setupEditor(col: Collection) { + private fun setupEditor( + col: Collection, + savedInstanceState: Bundle?, + ) { val intent = requireActivity().intent Timber.d("NoteEditor() onCollectionLoaded: caller: %s", caller) requireAnkiActivity().registerReceiver() @@ -761,7 +779,6 @@ class NoteEditorFragment : deckTextView.setText(CommonString.CardEditorCardDeck) } - deckId = requireArguments().getLong(EXTRA_DID, deckId) if (addNote) { // Initialize both selections from the same defaults // https://github.com/ankitects/anki/blob/754ce3a25f608010c0249e074e5d7fe95bda035f/qt/aqt/addcards_legacy.py#L91-L108 @@ -769,6 +786,14 @@ class NoteEditorFragment : if (selectedNoteTypeId?.let { col.notetypes.get(it) } == null) { selectedNoteTypeId = defaults.notetypeId } + // A restored selection takes precedence over the original launch destination. + deckId = deckId.ifZero { requireArguments().getLong(EXTRA_DID) } + if (deckId == 0L && caller == NoteEditorCaller.NOTEEDITOR_INTENT_ADD && + col.config.addingDefaultsMode == AddingDefaultsMode.USE_CURRENT_DECK + ) { + // Sharing has its own destination; adding notes must not change the study deck. + deckId = Prefs.lastSharedDeckId + } val deck = col.decks.getLegacy(deckId) if (deck == null || deck.isFiltered) { deckId = defaults.deckId @@ -791,8 +816,11 @@ class NoteEditorFragment : } } val getTextFromSearchView = requireArguments().getString(EXTRA_TEXT_FROM_SEARCH_VIEW) - setDid(editorNote) - setNote(editorNote, FieldChangeType.onActivityCreation(shouldReplaceNewlines())) + setNote( + editorNote, + FieldChangeType.onActivityCreation(shouldReplaceNewlines()), + noteTypeId = savedInstanceState?.getLongOrNull("noteTypeId") ?: requireArguments().getLongOrNull(EXTRA_NOTE_TYPE_ID), + ) if (addNote) { noteTypeSpinner!!.onItemSelectedListener = SetNoteTypeListener() requireAnkiActivity().setToolbarText(titleRes = CommonString.menu_add) @@ -928,7 +956,7 @@ class NoteEditorFragment : result.data?.let { val cropResultData = - it.getParcelableExtraCompat(CROP_IMAGE_RESULT) + it.getParcelableExtraCompat(EXTRA_CROP_IMAGE_RESULT) Timber.d("Cropped image data: $cropResultData") if (cropResultData?.uriPath == null) return@registerForActivityResult setupImageOcclusionEditor(cropResultData.uriPath) @@ -1114,8 +1142,8 @@ class NoteEditorFragment : } else if (ACTION_CREATE_FLASHCARD == intent.action) { // mSourceLanguage = extras.getString(SOURCE_LANGUAGE); // mTargetLanguage = extras.getString(TARGET_LANGUAGE); - sourceText!![0] = extras.getString(SOURCE_TEXT) - sourceText!![1] = extras.getString(TARGET_TEXT) + sourceText!![0] = extras.getString(EXTRA_SOURCE_TEXT) + sourceText!![1] = extras.getString(EXTRA_TARGET_TEXT) } else { var first: String? var second: String? @@ -1187,8 +1215,7 @@ class NoteEditorFragment : } if (!isFieldEdited) return false - val currentStrings = editFields!!.map { it.text?.toString() ?: "" } - return currentStrings != addNoteFieldBaseline + return fieldState.currentFieldValues != addNoteFieldBaseline } // changed note type? @@ -1243,49 +1270,52 @@ class NoteEditorFragment : // SAVE NOTE METHODS // ---------------------------------------------------------------------------- - @KotlinCleanup("return early and simplify if possible") private fun onNoteAdded(count: Int) { - var closeEditorAfterSave = false - var closeIntent: Intent? = null changed = true sourceText = null + if (caller == NoteEditorCaller.NOTEEDITOR || caller == NoteEditorCaller.NOTEEDITOR_INTENT_ADD || aedictIntent) { + // Do not queue field or preview updates for an activity which is about to finish. + val closeIntent = Intent() + if (caller == NoteEditorCaller.NOTEEDITOR_INTENT_ADD) { + closeIntent.putExtra(EXTRA_ID, requireArguments().getString(EXTRA_ID)) + } + if (caller == NoteEditorCaller.NOTEEDITOR_INTENT_ADD || aedictIntent) { + showThemedToast(requireContext(), CommonString.note_message, shortLength = true) + } + closeNoteEditor(closeIntent) + return + } + + fieldState.clearHiddenFields() refreshNoteData(FieldChangeType.onNoteAdded(shouldReplaceNewlines())) // backend text ends with dot val successMessage = TR.importingCardsAdded(count).replace(".", "") showSnackbar(successMessage, Snackbar.LENGTH_SHORT) - if (caller == NoteEditorCaller.NOTEEDITOR || aedictIntent) { - closeEditorAfterSave = true - } else if (caller == NoteEditorCaller.NOTEEDITOR_INTENT_ADD) { - closeEditorAfterSave = true - closeIntent = Intent().apply { putExtra(EXTRA_ID, requireArguments().getString(EXTRA_ID)) } - } else if (!editFields!!.isEmpty()) { + if (!editFields!!.isEmpty()) { editFields!!.first().focusWithKeyboard() } - if (closeEditorAfterSave) { - if (caller == NoteEditorCaller.NOTEEDITOR_INTENT_ADD || aedictIntent) { - showThemedToast(requireContext(), CommonString.note_message, shortLength = true) - } - closeNoteEditor(closeIntent ?: Intent()) - } else { - // Reset check for changes to fields - isFieldEdited = false - isTagsEdited = false - } + // Reset check for changes to fields + isFieldEdited = false + isTagsEdited = false + delegate?.onNoteSaved() } private suspend fun saveNoteWithProgress() { + val destinationDeckId = deckId // adding current note to collection val changes = requireActivity().withProgress(resources.getString(CommonString.saving_facts)) { undoableOp { - addNote(editorNote!!, deckId) + addNote(editorNote!!, destinationDeckId) } } + if (caller == NoteEditorCaller.NOTEEDITOR_INTENT_ADD) { + Prefs.lastSharedDeckId = destinationDeckId + } // update UI based on the result, noOfAddedCards onNoteAdded(changes.count) - delegate?.onNoteSaved() } @VisibleForTesting @@ -1333,7 +1363,7 @@ class NoteEditorFragment : reloadRequired = true val cardIdsToMove = getAffectedCards() - undoableOp { setDeck(cardIdsToMove, deckId) } + undoableOp(this@NoteEditorFragment) { setDeck(cardIdsToMove, deckId) } // refresh the card object to reflect the database changes from above currentEditedCard!!.load(getColUnsafe) @@ -1371,7 +1401,7 @@ class NoteEditorFragment : // accept & update the note in the activity if (caller == NoteEditorCaller.PREVIEWER_EDIT || caller == NoteEditorCaller.EDIT) { requireActivity().withProgress { - undoableOp { + undoableOp(this@NoteEditorFragment) { updateNote(currentEditedCard!!.note(this@undoableOp)) } } @@ -1380,7 +1410,6 @@ class NoteEditorFragment : closeNoteEditorAfterSave() return } - delegate?.onNoteSaved() } /** @@ -1501,16 +1530,8 @@ class NoteEditorFragment : } } } - menu.findItem(R.id.action_show_toolbar).isChecked = - !shouldHideToolbar() menu.findItem(R.id.action_capitalize).isChecked = sharedPrefs().getBoolean(PREF_NOTE_EDITOR_CAPITALIZE, true) - menu.findItem(R.id.action_scroll_toolbar).apply { - isChecked = - sharedPrefs().getBoolean(PREF_NOTE_EDITOR_SCROLL_TOOLBAR, true) - isEnabled = - !shouldHideToolbar() - } } /** @@ -1585,15 +1606,9 @@ class NoteEditorFragment : showDialogFragment(fontSizeDialog) return true } - R.id.action_show_toolbar -> { - item.isChecked = !item.isChecked - this.sharedPrefs().edit { - putBoolean(PREF_NOTE_EDITOR_SHOW_TOOLBAR, item.isChecked) - } - updateToolbar() - - // Update the overflow action menu in order to switch the enable/disable status of the "Scroll toolbar" item on the spot - requireActivity().invalidateOptionsMenu() + R.id.action_toolbar_layout -> { + toolbarLayoutDialog.show() + return true } R.id.action_capitalize -> { Timber.i("NoteEditor:: Capitalize button pressed. New State: %b", !item.isChecked) @@ -1601,13 +1616,6 @@ class NoteEditorFragment : toggleCapitalize(item.isChecked) return true } - R.id.action_scroll_toolbar -> { - item.isChecked = !item.isChecked - this.sharedPrefs().edit { - putBoolean(PREF_NOTE_EDITOR_SCROLL_TOOLBAR, item.isChecked) - } - updateToolbar() - } } return false } @@ -1649,7 +1657,14 @@ class NoteEditorFragment : } fun copyNote() { - requestAddLauncher.navigate(NoteEditorDestination.CopyNote(deckId, fieldsText, selectedTags.orEmpty())) + requestAddLauncher.navigate( + NoteEditorDestination.CopyNote( + deckId = deckId, + fieldsText = fieldsText, + noteTypeId = currentlySelectedNotetype?.id ?: editorNote!!.noteTypeId, + tags = selectedTags.orEmpty(), + ), + ) } // ---------------------------------------------------------------------------- @@ -2199,34 +2214,7 @@ class NoteEditorFragment : return fieldText.toString() } - private fun setDid(note: Note?) { - fun calculateDeckId(): DeckId { - if (deckId != 0L) return deckId - if (note != null && !addNote && currentEditedCard != null) { - return currentEditedCard!!.currentDeckId() - } - - if (getColUnsafe.config.addingDefaultsMode == AddingDefaultsMode.DECIDE_BY_NOTE_TYPE) { - return getColUnsafe.notetypes.current().let { - Timber.d("Adding to deck of note type, noteType: %s", it.name) - return@let it.did - } - } - - val currentDeckId = getColUnsafe.config.currentDeckId - return if (getColUnsafe.decks.isFiltered(currentDeckId)) { - /* - * If the deck in mCurrentDid is a filtered (dynamic) deck, then we can't create cards in it, - * and we set mCurrentDid to the Default deck. Otherwise, we keep the number that had been - * selected previously in the activity. - */ - 1 - } else { - currentDeckId - } - } - - deckId = calculateDeckId() + private fun updateDeckName() { launchCatchingTask { val selectedDeckName = withCol { decks.name(deckId) } view?.findViewById(R.id.note_deck_name)?.text = selectedDeckName @@ -2242,14 +2230,17 @@ class NoteEditorFragment : private fun setNote( note: Note?, changeType: FieldChangeType, + noteTypeId: NoteTypeId? = null, ) { + // An explicit type takes precedence over the deck's remembered type. + noteTypeId?.let { selectedNoteTypeId = it } editorNote = note ?: Note.fromNotetypeId(getColUnsafe, checkNotNull(selectedNoteTypeId)) if (selectedTags == null) { selectedTags = editorNote!!.tags } // nb: setOnItemSelectedListener and populateEditFields need to occur after this setNoteTypePosition() - setDid(note) + updateDeckName() updateTags() updateCards(editorNote!!.notetype) updateToolbar() @@ -2269,19 +2260,17 @@ class NoteEditorFragment : } else { populateEditFields(changeType) if (changeType.type == Type.CHANGE_FIELD_COUNT) { - // A note type switch may carry the user's just-typed text into the new fields, - // so don't re-capture the baseline from current content. Instead, remap the - // existing baseline the same way the field content itself was remapped: keep - // baseline values for fields that still exist (put through the same
    -to-newline - // conversion `populateEditFields` just applied to the actual field content, so a - // sticky field containing literal `
    ` text doesn't look edited), and treat any - // field the new note type added as baseline-empty, since it didn't exist for the - // user to edit before. + // Keep the baseline for hidden fields as well as visible ones. Only visible + // values pass through setContent(), so only normalize those baseline values. if (addNote) { addNoteFieldBaseline = - List(editFields!!.size) { i -> + List(maxOf(editFields!!.size, addNoteFieldBaseline.size)) { i -> val old = addNoteFieldBaseline.getOrElse(i) { "" } - FieldEditText.convertBrToNewline(old, changeType.replaceNewlines) + if (i < editFields!!.size) { + FieldEditText.convertBrToNewline(old, changeType.replaceNewlines) + } else { + old + } } } } else { @@ -2300,7 +2289,7 @@ class NoteEditorFragment : ) { val drawable = ResourcesCompat.getDrawable(resources, drawableRes, null)!!.apply { - setTint(MaterialColors.getColor(requireContext(), R.attr.toolbarIconColor, 0)) + setTint(MaterialColors.getColor(requireContext(), CommonR.attr.toolbarIconColor, 0)) } val button = toolbar.insertItem(0, drawable) { insertCloze(type) }.apply { @@ -2352,7 +2341,7 @@ class NoteEditorFragment : } private fun updateToolbar() { - toolbar.isVisible = !shouldHideToolbar() + toolbar.isVisible = toolbarPreferences.isVisible applyBottomInset() if (!toolbar.isVisible) return toolbar.clearCustomItems() @@ -2398,8 +2387,8 @@ class NoteEditorFragment : // Let the user add more buttons (always at the end). // Sets the add custom tag icon color. - val drawable = ResourcesCompat.getDrawable(resources, R.drawable.ic_add_toolbar_icon, null) - drawable!!.setTint(MaterialColors.getColor(requireContext(), R.attr.toolbarIconColor, 0)) + val drawable = ResourcesCompat.getDrawable(resources, NoteEditorR.drawable.ic_add_toolbar_icon, null) + drawable!!.setTint(MaterialColors.getColor(requireContext(), CommonR.attr.toolbarIconColor, 0)) val addButton = toolbar.insertItem(0, drawable) { displayAddToolbarDialog() } addButton.contentDescription = resources.getString(CommonString.add_toolbar_item) addButton.setTooltipTextCompat(resources.getString(CommonString.add_toolbar_item)) @@ -2445,8 +2434,8 @@ class NoteEditorFragment : CustomToolbarButton( index = currentButtonIndex, buttonText = buttonText.ifEmpty { currentButton.buttonText }, - prefix = prefix.ifEmpty { currentButton.prefix }, - suffix = suffix.ifEmpty { currentButton.suffix }, + prefix = prefix, + suffix = suffix, ) saveToolbarButtons(toolbarButtons) @@ -2571,11 +2560,18 @@ class NoteEditorFragment : ) } editToolbarDialog.show() + + fun updateSaveButton() { + editToolbarDialog.positiveButton.isEnabled = !et.text.isNullOrBlank() || !et2.text.isNullOrBlank() + } + + et.doAfterTextChanged { updateSaveButton() } + et2.doAfterTextChanged { updateSaveButton() } + updateSaveButton() } private fun setNoteTypePosition() { - // Set current note type and deck positions in spinners - val position = allNoteTypeIds!!.indexOf(editorNote!!.notetype.id) + val position = allNoteTypeIds!!.indexOfOrNull(editorNote!!.noteTypeId)!! // set selection without firing selectionChanged event noteTypeSpinner!!.setSelection(position, false) } @@ -2838,24 +2834,28 @@ class NoteEditorFragment : // the action is cancelled? // public static final String SOURCE_LANGUAGE = "SOURCE_LANGUAGE"; // public static final String TARGET_LANGUAGE = "TARGET_LANGUAGE"; - const val SOURCE_TEXT = "SOURCE_TEXT" - const val TARGET_TEXT = "TARGET_TEXT" + const val EXTRA_SOURCE_TEXT = "SOURCE_TEXT" + const val EXTRA_TARGET_TEXT = "TARGET_TEXT" const val EXTRA_CALLER = "CALLER" const val EXTRA_CARD_ID = "CARD_ID" const val EXTRA_CONTENTS = "CONTENTS" const val EXTRA_TAGS = "TAGS" const val EXTRA_ID = "ID" const val EXTRA_DID = "DECK_ID" + const val EXTRA_NOTE_TYPE_ID = "NOTE_TYPE_ID" const val EXTRA_TEXT_FROM_SEARCH_VIEW = "SEARCH" const val EXTRA_EDIT_FROM_CARD_ID = "editCid" const val ACTION_CREATE_FLASHCARD = "org.openintents.action.CREATE_FLASHCARD" const val ACTION_CREATE_FLASHCARD_SEND = "android.intent.action.SEND" const val EXTRA_NOTE_CHANGED = "noteChanged" const val EXTRA_RELOAD_REQUIRED = "reloadRequired" + private const val STATE_NOTE_CHANGED = "noteChanged" + private const val STATE_RELOAD_REQUIRED = "reloadRequired" const val EXTRA_IMG_OCCLUSION = "image_uri" - const val IN_CARD_BROWSER_ACTIVITY = "inCardBrowserActivity" + const val EXTRA_IN_CARD_BROWSER_ACTIVITY = "inCardBrowserActivity" const val EXTRA_CARD_IDS = "EXTRA_CARD_IDS" const val REQUEST_DECK_SELECTION_NOTE_EDITOR = "request_deck_selection_note_editor" + private const val STATE_CALLER = "caller" // calling activity enum class NoteEditorCaller( @@ -2883,8 +2883,6 @@ class NoteEditorFragment : const val RESULT_UPDATED_IO_NOTE = 11 // preferences keys - const val PREF_NOTE_EDITOR_SCROLL_TOOLBAR = "noteEditorScrollToolbar" - private const val PREF_NOTE_EDITOR_SHOW_TOOLBAR = "noteEditorShowToolbar" private const val PREF_NOTE_EDITOR_NEWLINE_REPLACE = "noteEditorNewlineReplace" private const val PREF_NOTE_EDITOR_CAPITALIZE = "note_editor_capitalize" private const val PREF_NOTE_EDITOR_FONT_SIZE = "note_editor_font_size" @@ -2913,10 +2911,5 @@ class NoteEditorFragment : if (ImportUtils.isInvalidViewIntent(intent)) return false return intent.resolveMimeType()?.startsWith("image/") == true } - - private fun shouldHideToolbar(): Boolean = - !appContext - .sharedPrefs() - .getBoolean(PREF_NOTE_EDITOR_SHOW_TOOLBAR, true) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/NoteTypeFieldEditor.kt b/AnkiDroid/src/main/java/com/ichi2/anki/NoteTypeFieldEditor.kt index 4ae9410e5dd8..5bbd69735cf7 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/NoteTypeFieldEditor.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/NoteTypeFieldEditor.kt @@ -32,12 +32,13 @@ import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.common.utils.android.showThemedToast +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.databinding.ActivityNoteTypeFieldEditorBinding import com.ichi2.anki.databinding.ItemNotetypeFieldBinding import com.ichi2.anki.dialogs.ConfirmationDialog import com.ichi2.anki.dialogs.LocaleSelectionDialog -import com.ichi2.anki.dialogs.LocaleSelectionDialog.Companion.KEY_SELECTED_LOCALE import com.ichi2.anki.dialogs.LocaleSelectionDialog.Companion.REQUEST_HINT_LOCALE_SELECTION +import com.ichi2.anki.dialogs.LocaleSelectionDialog.Companion.RESULT_SELECTED_LOCALE import com.ichi2.anki.dialogs.NoteTypeFieldEditorContextMenu.Companion.newInstance import com.ichi2.anki.dialogs.NoteTypeFieldEditorContextMenu.NoteTypeFieldEditorContextMenuAction import com.ichi2.anki.libanki.Collection @@ -54,7 +55,6 @@ import com.ichi2.anki.utils.ext.setFragmentResultListener import com.ichi2.anki.utils.ext.showDialogFragment import com.ichi2.ui.FixedEditText import com.ichi2.utils.customView -import com.ichi2.utils.dp import com.ichi2.utils.getInputField import com.ichi2.utils.input import com.ichi2.utils.moveCursorToEnd @@ -67,6 +67,7 @@ import org.json.JSONArray import org.json.JSONException import timber.log.Timber import java.util.Locale +import com.ichi2.anki.common.android.R as CommonR @NeedsTest("perform one action, then another") class NoteTypeFieldEditor : AnkiActivity(R.layout.activity_note_type_field_editor) { @@ -123,7 +124,7 @@ class NoteTypeFieldEditor : AnkiActivity(R.layout.activity_note_type_field_edito val selectedLocale = BundleCompat.getSerializable( bundle, - KEY_SELECTED_LOCALE, + RESULT_SELECTED_LOCALE, Locale::class.java, ) if (selectedLocale != null) { @@ -408,7 +409,7 @@ class NoteTypeFieldEditor : AnkiActivity(R.layout.activity_note_type_field_edito } negativeButton(CommonString.dialog_cancel) setMessage(TR.fieldsNewPosition1(numberOfTemplates)) - setView(R.layout.dialog_generic_text_input) + setView(CommonR.layout.dialog_generic_text_input) }.input( prefill = (currentPos + 1).toString(), inputType = InputType.TYPE_CLASS_NUMBER, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ReadText.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ReadText.kt index e77befd592cf..b9622b7aee04 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ReadText.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ReadText.kt @@ -15,6 +15,7 @@ import androidx.appcompat.app.AlertDialog import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.cardviewer.SingleCardSide import com.ichi2.anki.common.utils.android.showThemedToast +import com.ichi2.anki.dialogs.TtsPlaybackErrorDialog import com.ichi2.anki.i18n.getIso3LanguageOrNull import com.ichi2.anki.libanki.Card import com.ichi2.anki.libanki.Collection @@ -326,7 +327,9 @@ object ReadText { } } } else { - showThemedToast(context, context.getString(CommonString.no_tts_available_message), false) + if (ankiActivityContext == null || !TtsPlaybackErrorDialog.showMissingEngineDialogIfNeeded(ankiActivityContext)) { + showThemedToast(context, context.getString(CommonString.no_tts_available_message), false) + } Timber.w("TTS not successfully initialized") } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/Reviewer.kt b/AnkiDroid/src/main/java/com/ichi2/anki/Reviewer.kt index b09eb89aa188..b808a548ba78 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/Reviewer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/Reviewer.kt @@ -87,6 +87,7 @@ import com.ichi2.anki.common.time.TimeManager import com.ichi2.anki.common.utils.android.HandlerUtils.executeFunctionWithDelay import com.ichi2.anki.common.utils.android.HandlerUtils.getDefaultLooper import com.ichi2.anki.common.utils.android.showThemedToast +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.common.utils.ext.showRemainingDueCounts import com.ichi2.anki.libanki.Card import com.ichi2.anki.libanki.CardId @@ -144,7 +145,6 @@ import com.ichi2.themes.Themes.currentTheme import com.ichi2.utils.Permissions.canRecordAudio import com.ichi2.utils.ViewGroupUtils.setRenderWorkaround import com.ichi2.utils.cancelable -import com.ichi2.utils.dp import com.ichi2.utils.iconAlpha import com.ichi2.utils.increaseHorizontalPaddingOfOverflowMenuIcons import com.ichi2.utils.message @@ -157,6 +157,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine import timber.log.Timber import kotlin.coroutines.resume +import com.ichi2.anki.common.android.R as CommonR @Suppress("LeakingThis") @NeedsTest("#14709: Timebox shouldn't appear instantly when the Reviewer is opened") @@ -266,7 +267,7 @@ open class Reviewer : } startLoadingCollection() registerOnForgetHandler { listOf(currentCardId!!) } - previousCardId = savedInstanceState?.getLongOrNull(KEY_PREVIOUS_CARD_ID) + previousCardId = savedInstanceState?.getLongOrNull(STATE_PREVIOUS_CARD_ID) } override fun onPause() { @@ -287,7 +288,7 @@ open class Reviewer : override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - previousCardId?.let { outState.putLong(KEY_PREVIOUS_CARD_ID, it) } + previousCardId?.let { outState.putLong(STATE_PREVIOUS_CARD_ID, it) } } protected val flagToDisplay: Flag @@ -511,7 +512,7 @@ open class Reviewer : } clearInsets( topBar, - basePadding = resources.getDimensionPixelSize(R.dimen.side_margin), + basePadding = resources.getDimensionPixelSize(CommonR.dimen.side_margin), top = if (fullscreenMode == FullScreenMode.BUTTONS_ONLY) topBarTop else null, ) } @@ -558,7 +559,7 @@ open class Reviewer : } val answerArea = findViewById(R.id.answer_options_layout) - answerArea.setBackgroundColor(MaterialColors.getColor(this, R.attr.showAnswerColor, 0)) + answerArea.setBackgroundColor(MaterialColors.getColor(this, CommonR.attr.showAnswerColor, 0)) // The bottom inset is painted showAnswerColor by the background, extending the // answer area's color underneath the navigation bar - or, in immersive review, // down to the screen edge @@ -2143,7 +2144,7 @@ open class Reviewer : */ const val EXTRA_DECK_ID = "deckId" - private const val KEY_PREVIOUS_CARD_ID = "key_previous_card_id" + private const val STATE_PREVIOUS_CARD_ID = "key_previous_card_id" private const val REQUEST_AUDIO_PERMISSION = 0 private const val ANIMATION_DURATION = 200 diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsFragment.kt index 73023aa76ccc..98f9c5a0dbf3 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsFragment.kt @@ -20,6 +20,7 @@ import android.widget.ScrollView import android.widget.TextView import androidx.activity.result.ActivityResult import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.StringRes import androidx.annotation.VisibleForTesting import androidx.constraintlayout.widget.Group import androidx.core.text.HtmlCompat @@ -48,10 +49,11 @@ import com.ichi2.anki.filtered.FilteredDeckOptionsFragment import com.ichi2.anki.libanki.DeckId import com.ichi2.anki.libanki.Decks import com.ichi2.anki.observability.ChangeManager +import com.ichi2.anki.progress.observeProgress import com.ichi2.anki.settings.Prefs import com.ichi2.anki.ui.internationalization.sentenceCase import com.ichi2.anki.utils.doOnApplyWindowInsets -import com.ichi2.anki.utils.ext.launchCollectionInLifecycleScope +import com.ichi2.anki.utils.ext.launchCollectionInViewLifecycleScope import com.ichi2.anki.utils.ext.setFragmentResultListener import com.ichi2.anki.utils.ext.showDialogFragment import com.ichi2.ui.CollectionMediaImageGetter @@ -114,7 +116,7 @@ class StudyOptionsFragment : displayedDeckId = savedInstanceState?.getLong(STATE_DISPLAYED_DECK_ID)?.takeIf { it != 0L } // Subscribe once per fragment: returning from another panel can recreate its view. ChangeManager.subscribe(this) - viewModel.flowOfState.launchCollectionInLifecycleScope(::rebuildUi) + observeProgress(viewModel) { progress -> getString(progress.messageRes) } } override fun onCreateView( @@ -140,6 +142,7 @@ class StudyOptionsFragment : requireAnkiActivity().setToolbarText(title = "") } setupContentInsets(view) + viewModel.flowOfState.launchCollectionInViewLifecycleScope(::rebuildUi) refreshInterface() } @@ -289,20 +292,12 @@ class StudyOptionsFragment : } R.id.action_rebuild -> { Timber.i("StudyOptionsFragment:: rebuild cram deck button pressed") - launchCatchingTask { - withProgress(CommonString.rebuild_filtered_deck) { - viewModel.rebuildCram() - } - } + launchCatchingTask { viewModel.rebuildCram() } return true } R.id.action_empty -> { Timber.i("StudyOptionsFragment:: empty cram deck button pressed") - launchCatchingTask { - withProgress(CommonString.empty_filtered_deck) { - viewModel.emptyCram() - } - } + launchCatchingTask { viewModel.emptyCram() } return true } else -> return false @@ -326,7 +321,7 @@ class StudyOptionsFragment : menu.findItem(R.id.action_custom_study)?.isVisible = true menu.findItem(R.id.action_deck_or_study_options)?.title = TR.sentenceCase.deckOptions } - if (state is StudyOptionsState.Congrats) { + if (state is StudyOptionsState.Congrats || state is StudyOptionsState.Empty) { menu.findItem(R.id.action_custom_study)?.isVisible = false } menu.findItem(R.id.action_schedule_reminders)?.isVisible = Prefs.newReviewRemindersEnabled @@ -356,7 +351,7 @@ class StudyOptionsFragment : fun refreshInterface() { Timber.d("Refreshing StudyOptionsFragment") - launchCatchingTask { viewModel.refreshData() } + launchCatchingViewTask { viewModel.refreshData() } } private fun rebuildUi(state: StudyOptionsState) { @@ -449,7 +444,7 @@ class StudyOptionsFragment : buryInfoLabel.isVisible = data.hasBuriedCards fun TextView.updateBuryText(count: Int) { - this.isVisible = count > 0 + this.isVisible = deckInfoLayout.isVisible && count > 0 this.text = when { count > 0 -> @@ -458,7 +453,6 @@ class StudyOptionsFragment : count, count, ) - // #18094 - potential race condition: view may be visible with a count of 0 else -> "" } } @@ -572,3 +566,11 @@ class StudyOptionsFragment : } } } + +@get:StringRes +private val StudyOptionsProgress.messageRes: Int + get() = + when (this) { + StudyOptionsProgress.REBUILDING_FILTERED_DECK -> CommonString.rebuild_filtered_deck + StudyOptionsProgress.EMPTYING_FILTERED_DECK -> CommonString.empty_filtered_deck + } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsViewModel.kt index 528abc126751..5b175cab7653 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/StudyOptionsViewModel.kt @@ -10,6 +10,11 @@ import com.ichi2.anki.CollectionManager.withOpenColOrNull import com.ichi2.anki.libanki.Collection import com.ichi2.anki.libanki.DeckId import com.ichi2.anki.observability.undoableOp +import com.ichi2.anki.progress.HasProgress +import com.ichi2.anki.progress.ProgressManager +import com.ichi2.anki.study.DeckKind +import com.ichi2.anki.study.StudyAvailability +import com.ichi2.anki.study.currentDeckStudyState import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -17,7 +22,11 @@ import kotlinx.coroutines.launch import timber.log.Timber import java.io.File -class StudyOptionsViewModel : ViewModel() { +class StudyOptionsViewModel : + ViewModel(), + HasProgress { + override val progressManager = ProgressManager() + val flowOfState: StateFlow field = MutableStateFlow(StudyOptionsState.Loading) val state: StudyOptionsState get() = flowOfState.value @@ -49,14 +58,18 @@ class StudyOptionsViewModel : ViewModel() { suspend fun rebuildCram() { Timber.d("doInBackground - RebuildCram") - undoableOp { sched.rebuildFilteredDeck(decks.selected()) } - withCol { updateStateFromCollection() } + progressManager.withProgress(message = StudyOptionsProgress.REBUILDING_FILTERED_DECK) { + undoableOp { sched.rebuildFilteredDeck(decks.selected()) } + withCol { updateStateFromCollection() } + } } suspend fun emptyCram() { Timber.d("doInBackgroundEmptyCram") - undoableOp { sched.emptyFilteredDeck(decks.selected()) } - withCol { updateStateFromCollection() } + progressManager.withProgress(message = StudyOptionsProgress.EMPTYING_FILTERED_DECK) { + undoableOp { sched.emptyFilteredDeck(decks.selected()) } + withCol { updateStateFromCollection() } + } } fun unbury(): Job = @@ -69,19 +82,18 @@ class StudyOptionsViewModel : ViewModel() { */ private fun Collection.updateStateFromCollection() { val deck = decks.current() - val deckId = deck.id - val counts = sched.counts() + val study = currentDeckStudyState() + val deckId = study.deckId var buriedNew = 0 var buriedLearning = 0 var buriedReview = 0 val tree = sched.deckDueTree(deckId) if (tree != null) { - buriedNew = tree.newCount - counts.new - buriedLearning = tree.learnCount - counts.lrn - buriedReview = tree.reviewCount - counts.rev + buriedNew = tree.newCount - study.newCardsAvailable + buriedLearning = tree.learnCount - study.learningCardsAvailable + buriedReview = tree.reviewCount - study.reviewCardsAvailable } - val isDynamic = deck.isFiltered - val fullName = deck.getString("name") + val isDynamic = study.kind == DeckKind.Filtered val description = if (isDynamic) { null @@ -95,40 +107,39 @@ class StudyOptionsViewModel : ViewModel() { } val data = DeckStudyData( - newCardsToday = counts.new, - lrnCardsToday = counts.lrn, - revCardsToday = counts.rev, + newCardsToday = study.newCardsAvailable, + lrnCardsToday = study.learningCardsAvailable, + revCardsToday = study.reviewCardsAvailable, buriedNew = buriedNew, buriedLearning = buriedLearning, buriedReview = buriedReview, totalNewCards = sched.totalNewForCurrentDeck(), - numberOfCardsInDeck = decks.cardCount(deckId, includeSubdecks = true), + numberOfCardsInDeck = study.cardCount, ) flowOfIsFilteredDeck.value = isDynamic flowOfHaveBuried.value = sched.haveBuried() - flowOfSelectedDeckId.value = decks.selected() + flowOfSelectedDeckId.value = study.deckId // Only resolve the media directory when a description will render it: an in-memory // collection has no media folder and `media.dir` would throw. flowOfMediaDir.value = if (!description.isNullOrEmpty()) media.dir else null - val totalDue = data.newCardsToday + data.lrnCardsToday + data.revCardsToday flowOfState.value = when { - data.numberOfCardsInDeck == 0 && !isDynamic -> + study.isEmptyRegularDeck -> StudyOptionsState.Empty( - deckName = fullName, + deckName = deck.name, data = data, ) - totalDue == 0 -> + study.availability == StudyAvailability.NoCardsAvailable -> StudyOptionsState.Congrats( - deckName = fullName, + deckName = deck.name, isDynamic = isDynamic, data = data, ) else -> StudyOptionsState.StudyOptions( - deckName = fullName, + deckName = deck.name, deckDescription = description, isDynamic = isDynamic, data = data, @@ -137,6 +148,11 @@ class StudyOptionsViewModel : ViewModel() { } } +enum class StudyOptionsProgress { + REBUILDING_FILTERED_DECK, + EMPTYING_FILTERED_DECK, +} + class DeckStudyData( val newCardsToday: Int, val lrnCardsToday: Int, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/Sync.kt b/AnkiDroid/src/main/java/com/ichi2/anki/Sync.kt index bce8c357ca36..d6333a2f2e87 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/Sync.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/Sync.kt @@ -19,6 +19,7 @@ import com.ichi2.anki.observability.ChangeManager.notifySubscribersAllValuesChan import com.ichi2.anki.settings.Prefs import com.ichi2.anki.settings.enums.ShouldFetchMedia import com.ichi2.anki.snackbar.showSnackbar +import com.ichi2.anki.sync.MediaSync import com.ichi2.anki.sync.MeteredSyncPermission import com.ichi2.anki.sync.MeteredSyncPolicy import com.ichi2.anki.sync.SyncAuth @@ -43,7 +44,7 @@ import timber.log.Timber import kotlin.time.Duration.Companion.milliseconds object SyncPreferences { - const val CURRENT_SYNC_URI = "currentSyncUri" + const val PREF_CURRENT_SYNC_URI = "currentSyncUri" const val CUSTOM_SYNC_URI = "syncBaseUrl" const val CUSTOM_SYNC_ENABLED = CUSTOM_SYNC_URI + VersatileTextWithASwitchPreference.SWITCH_SUFFIX } @@ -88,7 +89,8 @@ fun getEndpoint(): String? { */ fun isLoggedIn(): Boolean = !Prefs.hkey.isNullOrEmpty() -fun millisecondsSinceLastSync() = TimeManager.time.intTimeMS() - Prefs.lastSyncTime +/** Elapsed milliseconds since the last manual or automatic sync attempt. */ +fun millisecondsSinceLastSyncAttempt() = TimeManager.time.intTimeMS() - Prefs.lastSyncTime fun DeckPicker.handleNewSync( conflict: ConflictResolution?, @@ -137,8 +139,6 @@ fun DeckPicker.handleNewSync( notifySubscribersAllValuesChanged(deckPicker) refreshState() } finally { - // Always update last sync time to prevent infinite retry loops - // when sync fails (e.g., collection too large). See issue #19776 setLastSyncTimeToNow() } } @@ -284,7 +284,12 @@ private suspend fun handleDownload( Timber.i("Sync: Backup skipped before full download: collection unchanged") } close(downgrade = false, forFullSync = true) - fullUploadOrDownload(auth, upload = false, serverUsn = mediaUsn) + // Media starts through SyncMediaWorker so WorkManager can enforce network constraints. + fullUploadOrDownload( + auth, + upload = false, + mediaSync = MediaSync.Skip, + ) } finally { reopen(afterFullSync = true) } @@ -318,7 +323,12 @@ private suspend fun handleUpload( ) { close(downgrade = false, forFullSync = true) try { - fullUploadOrDownload(auth, upload = true, serverUsn = mediaUsn) + // Media starts through SyncMediaWorker so WorkManager can enforce network constraints. + fullUploadOrDownload( + auth, + upload = true, + mediaSync = MediaSync.Skip, + ) } finally { reopen(afterFullSync = true) } @@ -420,6 +430,7 @@ fun DeckPicker.showSyncLogMessage( } } +/** Starts the retry delay after every sync attempt, regardless of outcome. */ fun setLastSyncTimeToNow() { Prefs.lastSyncTime = TimeManager.time.intTimeMS() } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/TtsVoices.kt b/AnkiDroid/src/main/java/com/ichi2/anki/TtsVoices.kt index 977fbc5851de..a46a95096c6b 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/TtsVoices.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/TtsVoices.kt @@ -20,6 +20,9 @@ package com.ichi2.anki +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager import android.speech.tts.TextToSpeech import android.speech.tts.Voice import com.ichi2.anki.common.android.appContext @@ -55,8 +58,8 @@ object TtsVoices { /** Published before scanning other engines, so legacy TTS need not wait for them. */ private val engineLocaleData = AtomicReference(CompletableDeferred()) - /** An immutable list of voices available for TTS */ - private lateinit var availableVoices: Set + /** Voices in engine-preference order: the default engine first, then the other engines. */ + private lateinit var availableVoices: List /** A job which populates both the default-engine languages and all available voices. */ private var buildLocalesJob: Job? = null @@ -72,6 +75,16 @@ object TtsVoices { var ttsEngine: String? = null private set + /** Returns whether the system has any installed TTS services. */ + fun hasInstalledEngine(context: Context): Boolean { + val engines = + context.packageManager.queryIntentServices( + Intent(TextToSpeech.Engine.INTENT_ACTION_TTS_SERVICE), + PackageManager.MATCH_DEFAULT_ONLY, + ) + return engines.isNotEmpty() + } + suspend fun refresh() { launchBuildLocalesJob() buildLocalesJob?.join() @@ -105,9 +118,10 @@ object TtsVoices { } /** - * Returns the list of available voices for use in TTS + * Returns distinct voices from the default engine first, then other engines in discovery order. + * Voice order within each engine is preserved. Playback uses this order for language fallback. */ - suspend fun allTtsVoices(): Set { + suspend fun allTtsVoices(): List { if (this::availableVoices.isInitialized) { return this.availableVoices } @@ -150,7 +164,7 @@ object TtsVoices { internal suspend fun loadVoices( defaultLocales: CompletableDeferred, createTts: suspend (String?) -> TextToSpeech?, - ): Set { + ): List { // A default-engine instance is needed first to enumerate the installed engines val probeTts = try { @@ -163,16 +177,16 @@ object TtsVoices { if (probeTts == null) { Timber.e("Unable to build list of TTS Voices") defaultLocales.complete(EngineLocales(null, emptyList())) - return emptySet() + return emptyList() } val enginePackages = try { val engine = probeTts.defaultEngine defaultLocales.complete(EngineLocales(engine, readLocales(probeTts))) - // `engines` lists every installed engine; include the default defensively + // Put the default first, preserving discovery order for the remaining engines. try { - (probeTts.engines.map { it.name } + listOfNotNull(engine)).distinct() + (listOfNotNull(engine) + probeTts.engines.map { it.name }).distinct() } catch (e: Exception) { Timber.w(e, "unable to list TTS engines") listOfNotNull(engine) @@ -209,15 +223,16 @@ object TtsVoices { * * Each engine is initialised independently so a single misbehaving engine cannot prevent the * others from being listed. + * Voices are distinct by engine and voice name, keeping the first occurrence. * * @param createTts builds a [TextToSpeech] bound to the provided engine package, or `null` on failure - * @return the union of all voices across [enginePackages] + * @return all voices in [enginePackages] order, preserving each engine's voice order */ internal suspend fun loadVoicesFromEngines( enginePackages: List, createTts: suspend (engine: String) -> TextToSpeech?, - ): Set { - val voices = mutableSetOf() + ): List { + val voices = mutableListOf() for (engine in enginePackages) { val tts = createTts(engine) if (tts == null) { @@ -234,7 +249,7 @@ object TtsVoices { tts.shutdown() } } - return voices + return voices.distinctBy { it.engine to it.voice.name } } /** diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/account/AccountActivity.kt b/AnkiDroid/src/main/java/com/ichi2/anki/account/AccountActivity.kt index a24fdf35cf23..152727598acf 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/account/AccountActivity.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/account/AccountActivity.kt @@ -17,7 +17,7 @@ import com.ichi2.anki.isLoggedIn class AccountActivity : SingleFragmentActivity() { companion object { /** Sees if we want to go back to the DeckPicker after login*/ - const val START_FROM_DECKPICKER = "START_FOR_RESULT" + const val ARG_START_FOR_RESULT = "START_FOR_RESULT" /** * Returns an [Intent] to launch either [LoggedInFragment] or [LoginFragment] @@ -39,7 +39,7 @@ class AccountActivity : SingleFragmentActivity() { fragmentClass = if (isLoggedIn()) LoggedInFragment::class else LoginFragment::class, arguments = Bundle().apply { - putBoolean(START_FROM_DECKPICKER, forResult) + putBoolean(ARG_START_FOR_RESULT, forResult) }, ).setClass(context, AccountActivity::class.java) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/account/LoginFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/account/LoginFragment.kt index 3965a07e2e32..ee2b33648365 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/account/LoginFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/account/LoginFragment.kt @@ -33,7 +33,7 @@ import com.ichi2.anki.CommonString import com.ichi2.anki.CrashReportData.Companion.toCrashReportData import com.ichi2.anki.DeckPicker import com.ichi2.anki.R -import com.ichi2.anki.account.AccountActivity.Companion.START_FROM_DECKPICKER +import com.ichi2.anki.account.AccountActivity.Companion.ARG_START_FOR_RESULT import com.ichi2.anki.dialogs.help.HelpDialog import com.ichi2.anki.exception.CollectionLockedException import com.ichi2.anki.getEndpoint @@ -235,7 +235,7 @@ class LoginFragment : Fragment(R.layout.fragment_my_account) { is LoginState.Success -> { Timber.i("Login Successful") val activity = requireActivity() - val isForResult = arguments?.getBoolean(START_FROM_DECKPICKER) ?: false + val isForResult = arguments?.getBoolean(ARG_START_FOR_RESULT) ?: false // If the user explicitly came from a sync prompt (onboarding/pressing sync) // then their intent was to sync after login success diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/analytics/AnkiDroidUsageAnalytics.kt b/AnkiDroid/src/main/java/com/ichi2/anki/analytics/AnkiDroidUsageAnalytics.kt index 7a82e0098c55..852c35aefbcb 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/analytics/AnkiDroidUsageAnalytics.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/analytics/AnkiDroidUsageAnalytics.kt @@ -35,8 +35,8 @@ import java.util.UUID */ @NeedsTest("Add coverage for opt-in handling, client id persistence and event/exception sending") internal object AnkiDroidUsageAnalytics : UsageAnalytics { - const val ANALYTICS_OPTIN_KEY = UsageAnalytics.ANALYTICS_OPTIN_KEY - private const val ANALYTICS_CLIENT_ID = "googleAnalyticsClientId" + const val PREF_ANALYTICS_OPTIN = UsageAnalytics.PREF_ANALYTICS_OPTIN + private const val PREF_ANALYTICS_CLIENT_ID = "googleAnalyticsClientId" /** * Hard cap on the length of an exception description sent to GA. @@ -73,7 +73,7 @@ internal object AnkiDroidUsageAnalytics : UsageAnalytics { private val sharedPrefsListener = SharedPreferences.OnSharedPreferenceChangeListener { prefs, key -> - if (key == ANALYTICS_OPTIN_KEY) { + if (key == PREF_ANALYTICS_OPTIN) { val newOptIn = prefs.getBoolean(key, false) // [isEnabled] updates `optIn` before it writes, so an unchanged value // means it's already handling this toggle: don't rebuild twice @@ -147,7 +147,7 @@ internal object AnkiDroidUsageAnalytics : UsageAnalytics { private fun handlePreferences(context: Context) { val userPrefs = context.sharedPrefs() - optIn = userPrefs.getBoolean(ANALYTICS_OPTIN_KEY, false) + optIn = userPrefs.getBoolean(PREF_ANALYTICS_OPTIN, false) userPrefs.registerOnSharedPreferenceChangeListener(sharedPrefsListener) } @@ -226,8 +226,8 @@ internal object AnkiDroidUsageAnalytics : UsageAnalytics { private fun getOrCreateClientId(context: Context): String { Timber.d("AnkiDroidUsageAnalytics:: getting client Id") val prefs = context.getSharedPreferences(ANALYTICS_PREFS, Context.MODE_PRIVATE) - return prefs.getString(ANALYTICS_CLIENT_ID, null) ?: UUID.randomUUID().toString().also { - prefs.edit { putString(ANALYTICS_CLIENT_ID, it) } + return prefs.getString(PREF_ANALYTICS_CLIENT_ID, null) ?: UUID.randomUUID().toString().also { + prefs.edit { putString(PREF_ANALYTICS_CLIENT_ID, it) } } } @@ -258,7 +258,7 @@ internal object AnkiDroidUsageAnalytics : UsageAnalytics { set(value) { optIn = value appContext.sharedPrefs().edit { - putBoolean(ANALYTICS_OPTIN_KEY, value) + putBoolean(PREF_ANALYTICS_OPTIN, value) } // Rebuild the underlying client so its own `enabled` flag picks // up the new opt-in state without waiting for the next launch. diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/analytics/SharedPreferencesAnrReportState.kt b/AnkiDroid/src/main/java/com/ichi2/anki/analytics/SharedPreferencesAnrReportState.kt index 8cfca2049c91..be7026c3ac54 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/analytics/SharedPreferencesAnrReportState.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/analytics/SharedPreferencesAnrReportState.kt @@ -11,10 +11,10 @@ internal class SharedPreferencesAnrReportState( private val preferences get() = context.getSharedPreferences("historical_anrs", Context.MODE_PRIVATE) val lastProcessedTimestamp: Long - get() = preferences.getLong(TIMESTAMP_KEY, 0L) + get() = preferences.getLong(PREF_TIMESTAMP, 0L) @SuppressLint("UseKtx") // The commit result decides whether it is safe to report this exit. - fun markProcessed(timestamp: Long): Boolean = preferences.edit().putLong(TIMESTAMP_KEY, timestamp).commit() + fun markProcessed(timestamp: Long): Boolean = preferences.edit().putLong(PREF_TIMESTAMP, timestamp).commit() } -private const val TIMESTAMP_KEY = "checked_through" +private const val PREF_TIMESTAMP = "checked_through" diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/BrowserColumnSelectionFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/BrowserColumnSelectionFragment.kt index 6ac488863e6a..f82082622b59 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/BrowserColumnSelectionFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/BrowserColumnSelectionFragment.kt @@ -30,7 +30,7 @@ import com.ichi2.anki.browser.ColumnUsage.AVAILABLE import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.databinding.DialogBrowserColumnsSelectionBinding import com.ichi2.anki.dialogs.DiscardChangesDialog -import com.ichi2.anki.launchCatchingTask +import com.ichi2.anki.launchCatchingViewTask import com.ichi2.anki.model.CardsOrNotes import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.anki.utils.ext.requireParcelable @@ -104,7 +104,7 @@ class BrowserColumnSelectionFragment : DialogFragment(R.layout.dialog_browser_co applyInsets() if (savedInstanceState == null) { - launchCatchingTask { + launchCatchingViewTask { val (active, available) = withProgress { viewModel.previewColumnHeadings(cardsOrNotes) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/BrowserMultiColumnAdapter.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/BrowserMultiColumnAdapter.kt index 08b1f03a2e84..b94eb289b4fb 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/BrowserMultiColumnAdapter.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/BrowserMultiColumnAdapter.kt @@ -28,16 +28,17 @@ import com.ichi2.anki.R import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.common.utils.android.darkenColor import com.ichi2.anki.common.utils.android.lightenColorAbsolute +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.common.utils.ext.replaceWith import com.ichi2.anki.common.utils.ext.setBitFlag import com.ichi2.anki.databinding.ItemCardBrowserBinding import com.ichi2.anki.databinding.ViewBrowserColumnCellBinding import com.ichi2.themes.Themes -import com.ichi2.utils.dp import com.ichi2.utils.removeChildren import net.ankiweb.rsdroid.BackendException import timber.log.Timber import kotlin.math.abs +import com.ichi2.anki.common.android.R as CommonR typealias RowIsSelected = Boolean @@ -259,7 +260,7 @@ class BrowserMultiColumnAdapter( val rowColor = // This only highlights in fragmented mode if (viewModel.paneRow == id) { - ThemeUtils.getThemeAttrColor(context, R.attr.focusedRowBackgroundColor) + ThemeUtils.getThemeAttrColor(context, CommonR.attr.focusedRowBackgroundColor) } else { backendColorToColor(row.color) } @@ -289,9 +290,9 @@ class BrowserMultiColumnAdapter( Color.COLOR_FLAG_TURQUOISE -> context.getColor(Flag.TURQUOISE.browserColorRes!!) Color.COLOR_FLAG_PURPLE -> context.getColor(Flag.PURPLE.browserColorRes!!) - Color.COLOR_SUSPENDED -> ThemeUtils.getThemeAttrColor(context, R.attr.suspendedColor) - Color.COLOR_MARKED -> ThemeUtils.getThemeAttrColor(context, R.attr.markedColor) - Color.COLOR_BURIED -> ThemeUtils.getThemeAttrColor(context, R.attr.buriedColor) + Color.COLOR_SUSPENDED -> ThemeUtils.getThemeAttrColor(context, CommonR.attr.suspendedColor) + Color.COLOR_MARKED -> ThemeUtils.getThemeAttrColor(context, CommonR.attr.markedColor) + Color.COLOR_BURIED -> ThemeUtils.getThemeAttrColor(context, CommonR.attr.buriedColor) Color.COLOR_DEFAULT, Color.UNRECOGNIZED -> ThemeUtils.getThemeAttrColor(context, android.R.attr.colorBackground) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/BrowserSearchFeedback.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/BrowserSearchFeedback.kt new file mode 100644 index 000000000000..d573dc06deaf --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/BrowserSearchFeedback.kt @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.browser + +/** The feedback requested for a completed browser search. */ +enum class BrowserSearchFeedbackMode { + /** Suppress search feedback, including for operations which provide their own message. */ + NONE, + + /** Report search results, offering "Search all decks" when applicable. */ + SEARCH_RESULTS, + + /** Show the result count when it is hidden in the header. */ + COUNT_ONLY, +} + +/** The feedback to display after a browser search completes. */ +internal enum class BrowserSearchFeedback( + val offersSearchAllDecks: Boolean = false, +) { + NONE, + COUNT, + COUNT_WITH_SEARCH_ALL_DECKS(offersSearchAllDecks = true), + NO_CARDS_IN_SELECTED_DECK(offersSearchAllDecks = true), +} + +internal fun browserSearchFeedback( + feedbackMode: BrowserSearchFeedbackMode, + rowCount: Int, + allDecksSelected: Boolean, + isHeaderCountVisible: Boolean, +): BrowserSearchFeedback = + // The search facts come from the completed search; header visibility is checked when displaying it. + when (feedbackMode) { + // Ordinary opening, deck changes and sorting stay quiet (Issue 21242). + // Operations with their own feedback use this mode. + BrowserSearchFeedbackMode.NONE -> BrowserSearchFeedback.NONE + // User actions without their own message report the hidden count, without an action (Issue 22384). + BrowserSearchFeedbackMode.COUNT_ONLY -> + if (isHeaderCountVisible) BrowserSearchFeedback.NONE else BrowserSearchFeedback.COUNT + BrowserSearchFeedbackMode.SEARCH_RESULTS -> + when { + // A search within a deck also offers "Search all decks", even with a visible header (Issue 5159). + !allDecksSelected && rowCount == 0 -> BrowserSearchFeedback.NO_CARDS_IN_SELECTED_DECK + !allDecksSelected -> BrowserSearchFeedback.COUNT_WITH_SEARCH_ALL_DECKS + // Submitted searches show the count when the header hides it (Issue 3592). + isHeaderCountVisible -> BrowserSearchFeedback.NONE + else -> BrowserSearchFeedback.COUNT + } + } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserFragment.kt index dc837e4f137e..dc7e34e8ee99 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserFragment.kt @@ -79,7 +79,6 @@ import com.ichi2.anki.browser.CardBrowserViewModel.ChangeMultiSelectMode.MultiSe import com.ichi2.anki.browser.CardBrowserViewModel.ChangeMultiSelectMode.SingleSelectCause import com.ichi2.anki.browser.CardBrowserViewModel.ChangeNoteTypeResponse import com.ichi2.anki.browser.CardBrowserViewModel.RowSelection -import com.ichi2.anki.browser.CardBrowserViewModel.SearchResultMessage import com.ichi2.anki.browser.CardBrowserViewModel.SearchState import com.ichi2.anki.browser.CardBrowserViewModel.SearchState.Initializing import com.ichi2.anki.browser.CardBrowserViewModel.SearchState.Searching @@ -99,17 +98,18 @@ import com.ichi2.anki.browser.search.SearchString import com.ichi2.anki.browser.search.SortOrderBottomSheetFragment import com.ichi2.anki.browser.search.StandardSearchFragment import com.ichi2.anki.browser.search.formatChipDescription +import com.ichi2.anki.browser.search.getIcon import com.ichi2.anki.browser.search.iconRes -import com.ichi2.anki.browser.search.savedFilters import com.ichi2.anki.common.ALL_DECKS_ID import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.common.destinations.NoteEditorDestination import com.ichi2.anki.common.destinations.navigate import com.ichi2.anki.common.utils.ext.ifNotZero +import com.ichi2.anki.common.utils.ext.savedFilters import com.ichi2.anki.dialogs.BrowserOptionsDialog import com.ichi2.anki.dialogs.ChangeNoteTypeDialog import com.ichi2.anki.dialogs.DeckSelectionDialog -import com.ichi2.anki.dialogs.DeckSelectionDialog.Companion.ARG_SELECTED_DECK +import com.ichi2.anki.dialogs.DeckSelectionDialog.Companion.RESULT_SELECTED_DECK import com.ichi2.anki.dialogs.GradeNowDialog import com.ichi2.anki.dialogs.SaveBrowserSearchDialogFragment import com.ichi2.anki.dialogs.SavedBrowserSearchesDialogFragment @@ -142,6 +142,7 @@ import com.ichi2.anki.ui.RecyclerFastScroller import com.ichi2.anki.ui.attachFastScroller import com.ichi2.anki.ui.internationalization.sentenceCase import com.ichi2.anki.undoAndShowSnackbar +import com.ichi2.anki.updateBottomNavOnScroll import com.ichi2.anki.utils.bottomCornerClearance import com.ichi2.anki.utils.ext.addPrepareMenuProvider import com.ichi2.anki.utils.ext.getParcelableCompat @@ -210,7 +211,7 @@ class CardBrowserFragment : if (result.resultCode == Activity.RESULT_OK) { // The old forceRefreshSearch called setQuery(searchView.text) before searching, // but the ViewModel already holds the submitted query, so we just re-run the search directly. - activityViewModel.launchSearchForCards() + activityViewModel.launchSearchForCards(feedbackMode = BrowserSearchFeedbackMode.COUNT_ONLY) } } @@ -326,7 +327,7 @@ class CardBrowserFragment : // onSearchForDecks starts deck selection using childFragmentManager childFragmentManager.setFragmentResultListener(DeckSelectionDialog.REQUEST_SELECT_DECK, this) { _, bundle -> - val selectedDeck = bundle.getParcelableCompat(ARG_SELECTED_DECK) + val selectedDeck = bundle.getParcelableCompat(RESULT_SELECTED_DECK) activityViewModel.setSelectedDeck(requireNotNull(selectedDeck) { "Expected non-null deck" }) } @@ -339,6 +340,19 @@ class CardBrowserFragment : view.findViewById(R.id.card_browser_list).apply { attachFastScroller(R.id.browser_scroller) clipToPadding = false + // Upward scrolls in the embedded browser do not reliably reach the bottom bar's + // scroll behavior, so drive the bar directly from the list. + addOnScrollListener( + object : RecyclerView.OnScrollListener() { + override fun onScrolled( + recyclerView: RecyclerView, + dx: Int, + dy: Int, + ) { + updateBottomNavOnScroll(dy) + } + }, + ) } applyContentInsets(view) DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL).apply { @@ -598,7 +612,7 @@ class CardBrowserFragment : } override fun onQueryTextSubmit(query: String): Boolean { - vm.setQuery(query, fromUserSearch = true) + vm.setQuery(query, feedbackMode = BrowserSearchFeedbackMode.SEARCH_RESULTS) legacySearchView!!.clearFocus() return true } @@ -1004,47 +1018,36 @@ class CardBrowserFragment : } } - fun onSearchCompleted(state: SearchState.Completed) { - // #3592: show the number of cards found the number of cards is not visible in the menu - val isMenuSubtitleVisible = legacySearchView != null && legacySearchView!!.isIconified - - fun showSnackbar( - message: String, - searchAllDecks: Boolean, - ) { - // Don't show a snackbar if the results are visible in the header. - // But do show the snackbar if an action is available - if (isMenuSubtitleVisible && !searchAllDecks) return - - showSnackbar(message, Snackbar.LENGTH_SHORT) { - if (!searchAllDecks) return@showSnackbar + fun onSearchFeedback(state: SearchState.Completed) { + if (!activityViewModel.consumeSearchFeedback(state)) return + val subtitle = legacySubtitle ?: requireActivity().findViewById(R.id.subtitle) + val feedback = + browserSearchFeedback( + feedbackMode = state.feedbackMode, + rowCount = state.rowCount, + allDecksSelected = state.allDecksSelected, + isHeaderCountVisible = subtitle?.isShown == true && legacySearchView?.isIconified != false, + ) + val message = + when (feedback) { + BrowserSearchFeedback.NONE -> return + BrowserSearchFeedback.COUNT, BrowserSearchFeedback.COUNT_WITH_SEARCH_ALL_DECKS -> state.formatCardCount(resources) + BrowserSearchFeedback.NO_CARDS_IN_SELECTED_DECK -> + getString(CommonString.card_browser_no_cards_in_deck, selectedDeckNameForUi) + } + showSnackbar(message, Snackbar.LENGTH_SHORT) { + if (feedback.offersSearchAllDecks) { setAction(CommonString.card_browser_search_all_decks) { - activityViewModel.setSelectedDeck(SelectableDeck.AllDecks) + activityViewModel.setSelectedDeck(SelectableDeck.AllDecks, feedbackMode = BrowserSearchFeedbackMode.SEARCH_RESULTS) } } } - - when (val result = state.resultMessage) { - // no message for browser open / deck change / order change: only user searches - null -> return - is SearchResultMessage.CardCount -> - showSnackbar( - message = state.formatCardCount(resources), - searchAllDecks = result.includeSearchAllDecksAction, - ) - SearchResultMessage.NoCardsInSelectedDeck -> - showSnackbar( - getString(CommonString.card_browser_no_cards_in_deck, selectedDeckNameForUi), - searchAllDecks = true, - ) - } } fun searchStateChanged(searchState: SearchState) { cardsAdapter.refreshRows() progressIndicator.isVisible = searchState == Initializing || searchState == Searching if (searchState is SearchState.Completed) { - onSearchCompleted(searchState) invalidateMenu() } } @@ -1150,11 +1153,14 @@ class CardBrowserFragment : @NeedsTest("displayed filter") fun onSearchSubmitted(value: SearchRequest) { + // Queued search updates can arrive after finish(), before the lifecycle stops. + if (activity?.isFinishing == true) return + // WARN: This changes the text when the SearchView is open launchCatchingTask { searchBar?.setText(value.toUserSpannable()) } Timber.i("relaying submitted search to activity") - activityViewModel.launchSearchForCards(value, forceRefresh = false, fromUserSearch = true) + activityViewModel.launchSearchForCards(value, forceRefresh = false, feedbackMode = BrowserSearchFeedbackMode.SEARCH_RESULTS) } fun onUserMessage(message: UserMessage) = @@ -1198,15 +1204,7 @@ class CardBrowserFragment : tagsChip?.hasCheckedBackground = filters.tags.any() cardStateChip?.text = formatChipDescription(filters.cardStates.map { it.label }, emptyValue = "Card state") - cardStateChip?.chipIcon = - ContextCompat.getDrawable(requireContext(), filters.cardStates.firstOrNull().iconRes)?.also { - if (filters.cardStates.isEmpty()) { - DrawableCompat.setTint( - it.mutate(), - MaterialColors.getColor(requireContext(), androidx.appcompat.R.attr.colorPrimary, 0), - ) - } - } + cardStateChip?.chipIcon = filters.cardStates.firstOrNull().getIcon(requireContext()) cardStateChip?.hasCheckedBackground = filters.cardStates.any() // Flags: Use the icon/checked state to explain what the filter is. @@ -1278,6 +1276,7 @@ class CardBrowserFragment : activityViewModel.flowOfCardsUpdated.launchCollectionInLifecycleScope(::cardsUpdatedChanged) activityViewModel.flowOfMultiSelectModeChanged.launchCollectionInLifecycleScope(::onMultiSelectModeChanged) activityViewModel.flowOfSearchState.launchCollectionInLifecycleScope(::searchStateChanged) + activityViewModel.flowOfSearchFeedback.filterNotNull().launchCollectionInLifecycleScope(::onSearchFeedback) activityViewModel.flowOfLastCompletedSearch.filterNotNull().launchCollectionInLifecycleScope(::onLastCompletedSearchChanged) activityViewModel.flowOfColumnHeadings.launchCollectionInLifecycleScope(::onColumnNamesChanged) activityViewModel.flowOfCardStateChanged.launchCollectionInLifecycleScope(::onCardsMarkedEvent) @@ -1300,10 +1299,10 @@ class CardBrowserFragment : private fun setupFragmentResultListeners() { ankiActivity.setFragmentResultListener(REQUEST_REPOSITION_NEW_CARDS) { _, bundle -> repositionCardsNoValidation( - position = bundle.getInt(RepositionCardFragment.ARG_POSITION), - step = bundle.getInt(RepositionCardFragment.ARG_STEP), - shuffle = bundle.getBoolean(RepositionCardFragment.ARG_RANDOM), - shift = bundle.getBoolean(RepositionCardFragment.ARG_SHIFT), + position = bundle.getInt(RepositionCardFragment.RESULT_POSITION), + step = bundle.getInt(RepositionCardFragment.RESULT_STEP), + shuffle = bundle.getBoolean(RepositionCardFragment.RESULT_RANDOM), + shift = bundle.getBoolean(RepositionCardFragment.RESULT_SHIFT), ) } } @@ -1918,7 +1917,11 @@ class CardBrowserFragment : tags = selectedTags, ), ) - activityViewModel.launchSearchForCards(updatedSearch, forceRefresh = false) + activityViewModel.launchSearchForCards( + updatedSearch, + forceRefresh = false, + feedbackMode = BrowserSearchFeedbackMode.SEARCH_RESULTS, + ) } else { activityViewModel.filterByTags(selectedTags, cardState) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt index 98a3e0706b0f..ad107ed857e3 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt @@ -55,7 +55,6 @@ import com.ichi2.anki.model.CardsOrNotes.CARDS import com.ichi2.anki.model.CardsOrNotes.NOTES import com.ichi2.anki.model.SelectableDeck import com.ichi2.anki.model.SortType -import com.ichi2.anki.observability.ChangeManager import com.ichi2.anki.observability.undoableOp import com.ichi2.anki.preferences.SharedPreferencesProvider import com.ichi2.anki.progress.HasProgress @@ -163,6 +162,13 @@ class CardBrowserViewModel( initialValue = null, ) + // Keep feedback while the browser is stopped (e.g. saving in the note editor). + // The UI consumes it once; a newer search discards feedback for the old results. + val flowOfSearchFeedback: StateFlow + field = MutableStateFlow(null) + + fun consumeSearchFeedback(search: SearchState.Completed): Boolean = flowOfSearchFeedback.compareAndSet(search, null) + /** * Commands to drive the note editor either in a fragment or a standalone activity * @see NoteEditorCommand @@ -186,17 +192,6 @@ class CardBrowserViewModel( companion object } - /** Result of a completed search, used to drive a snackbar in the UI */ - sealed interface SearchResultMessage { - /** "X cards/notes shown | Search all decks" */ - data class CardCount( - val includeSearchAllDecksAction: Boolean, - ) : SearchResultMessage - - /** "No cards in deck X" message; always paired with a "search all decks" action. */ - data object NoCardsInSelectedDeck : SearchResultMessage - } - /** text in the search box (potentially unsubmitted) */ // this does not currently bind to the value in the UI and is only used for posting val flowOfFilterQuery = MutableSharedFlow() @@ -418,7 +413,10 @@ class CardBrowserViewModel( val lastDeckId: DeckId? get() = lastDeckIdRepository.lastDeckId - fun setSelectedDeck(deck: SelectableDeck) { + fun setSelectedDeck( + deck: SelectableDeck, + feedbackMode: BrowserSearchFeedbackMode = BrowserSearchFeedbackMode.NONE, + ) { Timber.i("setting deck: %s", deck) lastDeckIdRepository.lastDeckId = @@ -434,7 +432,7 @@ class CardBrowserViewModel( } val updatedFilter = searchRequestFlow.value.copyFilters { it.copy(decks = deckFilter) } - launchSearchForCards(updatedFilter, forceRefresh = false) + launchSearchForCards(updatedFilter, forceRefresh = false, feedbackMode = feedbackMode) } val searchRequestFlow = MutableStateFlow(SearchRequest(query = "")) @@ -589,10 +587,22 @@ class CardBrowserViewModel( null -> {} } + val initialFeedbackMode = + when (options) { + is CardBrowserLaunchOptions.DeepLink, + is CardBrowserLaunchOptions.SystemContextMenu, + is CardBrowserLaunchOptions.SearchQueryJs, + -> BrowserSearchFeedbackMode.SEARCH_RESULTS + is CardBrowserLaunchOptions.ScrollToCard, null -> BrowserSearchFeedbackMode.NONE + } + var firstSearch = true performSearchFlow .onEach { Timber.d("performSearchFlow -> launching search") - launchSearchForCards() + // After initialization, this flow only runs when cards/notes mode changes. + val feedbackMode = if (firstSearch) initialFeedbackMode else BrowserSearchFeedbackMode.COUNT_ONLY + firstSearch = false + launchSearchForCards(feedbackMode = feedbackMode) }.launchIn(viewModelScope) flowOfCardsOrNotes @@ -611,7 +621,7 @@ class CardBrowserViewModel( val initialDeckId = if (selectAllDecks) SelectableDeck.AllDecks else getInitialDeck() // PERF: slightly inefficient if the source was lastDeckId - setSelectedDeck(initialDeckId) + setSelectedDeck(initialDeckId, feedbackMode = initialFeedbackMode) refreshBackendColumns() refreshSortState() @@ -1093,7 +1103,7 @@ class CardBrowserViewModel( * If no cards are suspended, suspend all * If there is a mix, suspend all * - * Changes are handled by [ChangeManager] + * Refreshes the results with count feedback after the edit. */ fun toggleSuspendCards() = viewModelScope.launch { @@ -1104,14 +1114,14 @@ class CardBrowserViewModel( Timber.d("toggling selected cards suspend status") val cardIds = queryAllSelectedCardIds() - undoableOp { + undoableOp(this@CardBrowserViewModel) { val wantUnsuspend = cardIds.all { getCard(it).queue == QueueType.Suspended } if (wantUnsuspend) { sched.unsuspendCards(cardIds) } else { sched.suspendCards(cardIds).changes } - } + }.also(::refreshAfterEdit) Timber.d("finished 'toggleSuspendCards'") } } @@ -1268,13 +1278,13 @@ class CardBrowserViewModel( searchRequestFlow.value.copy( query = filterQuery, ) - launchSearchForCards() + launchSearchForCards(feedbackMode = BrowserSearchFeedbackMode.SEARCH_RESULTS) } fun setQuery( query: String, forceRefresh: Boolean = true, - fromUserSearch: Boolean = false, + feedbackMode: BrowserSearchFeedbackMode = BrowserSearchFeedbackMode.NONE, ) = viewModelScope.launch { val newValue = searchRequestFlow.value.copy(query = query) if (!forceRefresh && withCol { searchRequestFlow.value.toSearchString() == newValue.toSearchString() }) { @@ -1283,7 +1293,7 @@ class CardBrowserViewModel( } searchRequestFlow.value = newValue - launchSearchForCards(fromUserSearch = fromUserSearch) + launchSearchForCards(feedbackMode = feedbackMode) } /** @@ -1329,7 +1339,7 @@ class CardBrowserViewModel( indeterminateTags: List, ) = progressManager.withProgress { val selectedNoteIds = queryAllSelectedNoteIds().distinct() - undoableOp { + undoableOp(this@CardBrowserViewModel) { val selectedNotes = selectedNoteIds .map { noteId -> getNote(noteId) } @@ -1339,7 +1349,7 @@ class CardBrowserViewModel( note.setTagsFromStr(this@undoableOp, tags.join(updatedTags)) } updateNotes(selectedNotes) - } + }.also(::refreshAfterEdit) } suspend fun filterByTags( @@ -1445,13 +1455,12 @@ class CardBrowserViewModel( /** * @param forceRefresh if `true`, perform a search even if the search query is unchanged - * @param fromUserSearch whether the user explicitly searched for something; controls whether a - * result message (snackbar) is surfaced. See [SearchState.Completed.resultMessage] + * @param feedbackMode the feedback requested for this search, resolved by [browserSearchFeedback] */ fun launchSearchForCards( searchRequest: SearchRequest, forceRefresh: Boolean, - fromUserSearch: Boolean = false, + feedbackMode: BrowserSearchFeedbackMode = BrowserSearchFeedbackMode.NONE, ) = viewModelScope.launch { Timber.d("launching search [new syntax]: '%s'", searchRequest) @@ -1463,7 +1472,7 @@ class CardBrowserViewModel( } searchRequestFlow.value = searchRequest - launchSearchForCards(fromUserSearch = fromUserSearch) + launchSearchForCards(feedbackMode = feedbackMode) } /** @@ -1471,14 +1480,16 @@ class CardBrowserViewModel( * * @see com.ichi2.anki.searchForRows */ - @NeedsTest("Invalid searches are handled. For instance: 'and'") - fun launchSearchForCards(fromUserSearch: Boolean = false) { + fun launchSearchForCards(feedbackMode: BrowserSearchFeedbackMode = BrowserSearchFeedbackMode.NONE) { if (!initCompleted) return viewModelScope.launch { + searchJob?.cancel() + flowOfSearchFeedback.value = null // update the UI while we're searching clearCardsList() + // Another request may have started a search while clearCardsList() was suspended. searchJob?.cancel() searchJob = launchCatchingIO( @@ -1498,7 +1509,12 @@ class CardBrowserViewModel( } ensurePaneRowValid() if (isFragmented) flowOfNoteEditorCommand.emit(NoteEditorCommand.fromCurrentSearchState()) - flowOfSearchState.emit(SearchState.Completed.fromCurrentState(fromUserSearch)) + val completed = SearchState.Completed.fromCurrentState(feedbackMode) + withContext(Dispatchers.Main) { + ensureActive() + flowOfSearchState.emit(completed) + flowOfSearchFeedback.value = completed.takeUnless { feedbackMode == BrowserSearchFeedbackMode.NONE } + } selectUnvalidatedRowIds(pendingSelectionRestore) pendingSelectionRestore = emptyList() } @@ -1521,6 +1537,14 @@ class CardBrowserViewModel( private fun refreshSearch() = launchSearchForCards() + /** Refreshes edits which use the result count as their feedback. */ + private fun refreshAfterEdit(changes: OpChanges) { + if (changes.browserSidebar || changes.browserTable || changes.noteText || changes.card) { + endMultiSelectMode(SingleSelectCause.Other) + launchSearchForCards(feedbackMode = BrowserSearchFeedbackMode.COUNT_ONLY) + } + } + private suspend fun clearCardsList() { cards.reset() flowOfCardsUpdated.emit(Unit) @@ -1611,20 +1635,16 @@ class CardBrowserViewModel( /** * Builds a [SearchState.Completed] event reflecting the current ViewModel state. * - * @param fromUserSearch whether this search was triggered by the user searching for something. + * @param feedbackMode the feedback requested for this search. */ - private fun SearchState.Completed.Companion.fromCurrentState(fromUserSearch: Boolean = false): SearchState.Completed = + private fun SearchState.Completed.Companion.fromCurrentState( + feedbackMode: BrowserSearchFeedbackMode = BrowserSearchFeedbackMode.NONE, + ): SearchState.Completed = SearchState.Completed( rowCount = rowCount, cardsOrNotes = cardsOrNotes, - resultMessage = - when { - !fromUserSearch -> null - // TODO: better message if rowCount == 0 AND hasSelectedAllDecks - hasSelectedAllDecks() -> SearchResultMessage.CardCount(includeSearchAllDecksAction = false) - rowCount == 0 -> SearchResultMessage.NoCardsInSelectedDeck - else -> SearchResultMessage.CardCount(includeSearchAllDecksAction = true) - }, + feedbackMode = feedbackMode, + allDecksSelected = hasSelectedAllDecks(), ) /** Builds the post-search trailing-pane command from current ViewModel state (tablet only). */ @@ -1749,13 +1769,10 @@ class CardBrowserViewModel( data class Completed( val rowCount: Int, val cardsOrNotes: CardsOrNotes, - /** - * The message (snackbar) to surface for this search, or `null` if none should be shown. - * - * Only populated for explicit user searches; `null` for browser open, deck change and - * order/direction changes. - */ - val resultMessage: SearchResultMessage?, + /** The feedback requested by the caller for this search. */ + val feedbackMode: BrowserSearchFeedbackMode, + /** The deck scope used by this search, before any subsequent UI changes. */ + val allDecksSelected: Boolean, ) : SearchState { companion object } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/ColumnSelectionDialogFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/ColumnSelectionDialogFragment.kt index b029960412e2..1a66995b189a 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/ColumnSelectionDialogFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/ColumnSelectionDialogFragment.kt @@ -16,9 +16,9 @@ import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import com.ichi2.anki.CommonString import com.ichi2.anki.R +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.databinding.ItemColumnSelectionBinding import com.ichi2.anki.utils.ext.requireParcelable -import com.ichi2.utils.dp import com.ichi2.utils.setPaddingRelative import kotlinx.coroutines.launch import timber.log.Timber @@ -26,14 +26,14 @@ import timber.log.Timber class ColumnSelectionDialogFragment : DialogFragment() { private val viewModel: CardBrowserViewModel by activityViewModels() private val columnToReplace: ColumnHeading by lazy { - requireArguments().requireParcelable(SELECTED_COLUMN) + requireArguments().requireParcelable(ARG_SELECTED_COLUMN) } private var availableColumns: List = emptyList() override fun onSaveInstanceState(outState: Bundle) { with(outState) { - outState.putParcelableArrayList(AVAILABLE_COLUMNS, availableColumns.toCollection(ArrayList())) + outState.putParcelableArrayList(STATE_AVAILABLE_COLUMNS, availableColumns.toCollection(ArrayList())) super.onSaveInstanceState(this) } } @@ -87,7 +87,13 @@ class ColumnSelectionDialogFragment : DialogFragment() { if (savedInstanceState == null) { viewModel.previewColumnHeadings(viewModel.cardsOrNotes).second } else { - BundleCompat.getParcelableArrayList(savedInstanceState, AVAILABLE_COLUMNS, ColumnWithSample::class.java)!!.toList() + BundleCompat + .getParcelableArrayList( + savedInstanceState, + STATE_AVAILABLE_COLUMNS, + ColumnWithSample::class.java, + )!! + .toList() } adapter.clear() adapter.addAll(availableColumns) @@ -121,12 +127,12 @@ class ColumnSelectionDialogFragment : DialogFragment() { companion object { const val TAG = "ColumnSelectionDialog" - private const val SELECTED_COLUMN = "selected_column" - private const val AVAILABLE_COLUMNS = "availableColumns" + private const val ARG_SELECTED_COLUMN = "selected_column" + private const val STATE_AVAILABLE_COLUMNS = "availableColumns" fun newInstance(selectedColumn: ColumnHeading): ColumnSelectionDialogFragment = ColumnSelectionDialogFragment().apply { - arguments = Bundle().apply { putParcelable(SELECTED_COLUMN, selectedColumn) } + arguments = Bundle().apply { putParcelable(ARG_SELECTED_COLUMN, selectedColumn) } } } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/FindAndReplaceDialogFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/FindAndReplaceDialogFragment.kt index 4cf9d5c73744..85bbd31be294 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/FindAndReplaceDialogFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/FindAndReplaceDialogFragment.kt @@ -20,13 +20,13 @@ import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.CommonString import com.ichi2.anki.R import com.ichi2.anki.analytics.AnalyticsDialogFragment -import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.ARG_FIELD -import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.ARG_MATCH_CASE -import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.ARG_ONLY_SELECTED_NOTES -import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.ARG_REGEX -import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.ARG_REPLACEMENT -import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.ARG_SEARCH import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.REQUEST_FIND_AND_REPLACE +import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.RESULT_FIELD +import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.RESULT_MATCH_CASE +import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.RESULT_ONLY_SELECTED_NOTES +import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.RESULT_REGEX +import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.RESULT_REPLACEMENT +import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.RESULT_SEARCH import com.ichi2.anki.databinding.FragmentFindReplaceBinding import com.ichi2.anki.libanki.NoteId import com.ichi2.anki.notetype.ManageNotetypes @@ -147,13 +147,13 @@ class FindAndReplaceDialogFragment : AnalyticsDialogFragment() { setFragmentResult( REQUEST_FIND_AND_REPLACE, Bundle().apply { - putString(ARG_SEARCH, search.toString()) - putString(ARG_REPLACEMENT, replacement.toString()) - putString(ARG_FIELD, selectedField) - putBoolean(ARG_ONLY_SELECTED_NOTES, onlyInSelectedNotes) + putString(RESULT_SEARCH, search.toString()) + putString(RESULT_REPLACEMENT, replacement.toString()) + putString(RESULT_FIELD, selectedField) + putBoolean(RESULT_ONLY_SELECTED_NOTES, onlyInSelectedNotes) // "Ignore case" checkbox text => when it's checked we pass false to the backend - putBoolean(ARG_MATCH_CASE, !ignoreCase) - putBoolean(ARG_REGEX, inputAsRegex) + putBoolean(RESULT_MATCH_CASE, !ignoreCase) + putBoolean(RESULT_REGEX, inputAsRegex) }, ) } @@ -167,21 +167,21 @@ class FindAndReplaceDialogFragment : AnalyticsDialogFragment() { const val TAG = "FindAndReplaceDialogFragment" const val REQUEST_FIND_AND_REPLACE = "request_find_and_replace" const val ARG_IDS = "arg_ids" - const val ARG_SEARCH = "arg_search" - const val ARG_REPLACEMENT = "arg_replacement" - const val ARG_FIELD = "arg_field" - const val ARG_ONLY_SELECTED_NOTES = "arg_only_selected_notes" - const val ARG_MATCH_CASE = "arg_match_case" - const val ARG_REGEX = "arg_regex" + const val RESULT_SEARCH = "arg_search" + const val RESULT_REPLACEMENT = "arg_replacement" + const val RESULT_FIELD = "arg_field" + const val RESULT_ONLY_SELECTED_NOTES = "arg_only_selected_notes" + const val RESULT_MATCH_CASE = "arg_match_case" + const val RESULT_REGEX = "arg_regex" /** - * Receiving this value in the result [Bundle] for the [ARG_FIELD] entry means that + * Receiving this value in the result [Bundle] for the [RESULT_FIELD] entry means that * the user selected "All fields" as the field target for the find and replace action. */ const val ALL_FIELDS_AS_FIELD = "find_and_replace_dialog_fragment_all_fields_as_field" /** - * Receiving this value in the result [Bundle] for the [ARG_FIELD] entry means that + * Receiving this value in the result [Bundle] for the [RESULT_FIELD] entry means that * the user selected "Tags" as the field target for the find and replace action. */ const val TAGS_AS_FIELD = "find_and_replace_dialog_fragment_tags_as_field" @@ -205,12 +205,12 @@ fun CardBrowser.registerFindReplaceHandler(action: (FindReplaceResult) -> Unit) setFragmentResultListener(REQUEST_FIND_AND_REPLACE) { _, bundle -> action( FindReplaceResult( - search = bundle.getString(ARG_SEARCH) ?: error("Missing required argument: search"), - replacement = bundle.getString(ARG_REPLACEMENT) ?: error("Missing required argument: replacement"), - field = bundle.getString(ARG_FIELD) ?: error("Missing required argument: field"), - onlyOnSelectedNotes = bundle.getBoolean(ARG_ONLY_SELECTED_NOTES, true), - matchCase = bundle.getBoolean(ARG_MATCH_CASE, false), - regex = bundle.getBoolean(ARG_REGEX, false), + search = bundle.getString(RESULT_SEARCH) ?: error("Missing required argument: search"), + replacement = bundle.getString(RESULT_REPLACEMENT) ?: error("Missing required argument: replacement"), + field = bundle.getString(RESULT_FIELD) ?: error("Missing required argument: field"), + onlyOnSelectedNotes = bundle.getBoolean(RESULT_ONLY_SELECTED_NOTES, true), + matchCase = bundle.getBoolean(RESULT_MATCH_CASE, false), + regex = bundle.getBoolean(RESULT_REGEX, false), ), ) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/LastDeckIdRepository.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/LastDeckIdRepository.kt index 2d32163112ee..76b0cb917a3f 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/LastDeckIdRepository.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/LastDeckIdRepository.kt @@ -25,14 +25,14 @@ class SharedPreferencesLastDeckIdRepository : LastDeckIdRepository { get() = appContext .getSharedPreferences(PERSISTENT_STATE_FILE, 0) - .getLong(LAST_DECK_ID_KEY, Decks.NOT_FOUND_DECK_ID) + .getLong(PREF_LAST_DECK_ID, Decks.NOT_FOUND_DECK_ID) .takeUnless { it == Decks.NOT_FOUND_DECK_ID } set(value) = if (value == null) { clearLastDeckId() } else { appContext.getSharedPreferences(PERSISTENT_STATE_FILE, 0).edit { - putLong(LAST_DECK_ID_KEY, value) + putLong(PREF_LAST_DECK_ID, value) } } @@ -40,11 +40,11 @@ class SharedPreferencesLastDeckIdRepository : LastDeckIdRepository { fun clearLastDeckId() { val context: Context = appContext context.getSharedPreferences(PERSISTENT_STATE_FILE, 0).edit { - remove(LAST_DECK_ID_KEY) + remove(PREF_LAST_DECK_ID) } } private const val PERSISTENT_STATE_FILE = "DeckPickerState" - private const val LAST_DECK_ID_KEY = "lastDeckId" + private const val PREF_LAST_DECK_ID = "lastDeckId" } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/RepositionCardFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/RepositionCardFragment.kt index a4b5bb17cda8..7b59431ab7ec 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/RepositionCardFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/RepositionCardFragment.kt @@ -75,10 +75,10 @@ class RepositionCardFragment : DialogFragment() { setFragmentResult( REQUEST_REPOSITION_NEW_CARDS, Bundle().apply { - putInt(ARG_POSITION, position) - putInt(ARG_STEP, step) - putBoolean(ARG_RANDOM, binding.randomizeOrderCheck.isChecked) - putBoolean(ARG_SHIFT, binding.shiftPositionCheck.isChecked) + putInt(RESULT_POSITION, position) + putInt(RESULT_STEP, step) + putBoolean(RESULT_RANDOM, binding.randomizeOrderCheck.isChecked) + putBoolean(RESULT_SHIFT, binding.shiftPositionCheck.isChecked) }, ) } @@ -124,10 +124,13 @@ class RepositionCardFragment : DialogFragment() { const val REQUEST_REPOSITION_NEW_CARDS = "request_repositions_new_cards" private const val ARG_QUEUE_TOP = "arg_queue_top" private const val ARG_QUEUE_BOTTOM = "arg_queue_bottom" - const val ARG_POSITION = "arg_position" - const val ARG_STEP = "arg_step" - const val ARG_RANDOM = "arg_random" - const val ARG_SHIFT = "arg_shift" + const val RESULT_POSITION = "arg_position" + const val RESULT_STEP = "arg_step" + const val RESULT_RANDOM = "arg_random" + const val RESULT_SHIFT = "arg_shift" + + private const val ARG_RANDOM = "arg_random" + private const val ARG_SHIFT = "arg_shift" fun newInstance( queueTop: Int, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/AdvancedSearchFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/AdvancedSearchFragment.kt index 4f60339ff88c..4cb7854d272d 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/AdvancedSearchFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/AdvancedSearchFragment.kt @@ -20,7 +20,7 @@ import com.ichi2.anki.browser.search.AdvancedSearchFieldsTab.FieldSearch import com.ichi2.anki.browser.search.AdvancedSearchFragment.OptionData import com.ichi2.anki.browser.search.AdvancedSearchFragment.OptionType import com.ichi2.anki.browser.search.AdvancedSearchFragment.OptionType.InsertExample -import com.ichi2.anki.databinding.DialogGenericRecyclerViewBinding +import com.ichi2.anki.common.android.databinding.DialogGenericRecyclerViewBinding import com.ichi2.anki.databinding.FragmentAdvancedSearchBinding import com.ichi2.anki.databinding.ItemAdvancedSearchBinding import com.ichi2.anki.dialogs.FieldSelectionDialog @@ -32,6 +32,7 @@ import com.ichi2.anki.utils.openUrl import dev.androidbroadcast.vbpd.viewBinding import kotlinx.parcelize.Parcelize import timber.log.Timber +import com.ichi2.anki.common.android.R as CommonR /** * Helps a user build an advanced search string, explaining options listed in the @@ -262,7 +263,7 @@ class AdvancedSearchFragment : Fragment(R.layout.fragment_advanced_search) { * * @see OptionData */ - class SelectAdvancedSearchFragment : Fragment(R.layout.dialog_generic_recycler_view) { + class SelectAdvancedSearchFragment : Fragment(CommonR.layout.dialog_generic_recycler_view) { val binding by viewBinding(DialogGenericRecyclerViewBinding::bind) val data: List diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/CardStateBottomSheetFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/CardStateBottomSheetFragment.kt index 680551fecfae..18b301f9734f 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/CardStateBottomSheetFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/CardStateBottomSheetFragment.kt @@ -2,20 +2,25 @@ package com.ichi2.anki.browser.search +import android.content.Context +import android.graphics.drawable.Drawable import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.annotation.DrawableRes +import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.DrawableCompat import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.RecyclerView import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import com.google.android.material.color.MaterialColors import com.ichi2.anki.R import com.ichi2.anki.databinding.FragmentBottomSheetListBinding import com.ichi2.anki.databinding.ItemBrowserFilterBottomSheetBinding import com.ichi2.anki.utils.ext.behavior import dev.androidbroadcast.vbpd.viewBinding +import com.ichi2.anki.common.android.R as CommonR /** * A [BottomSheetDialogFragment] allowing selection of 0-many [CardState]s @@ -92,7 +97,7 @@ class CardStateBottomSheetFragment : BottomSheetDialogFragment(R.layout.fragment val state = this.states[position] holder.binding.text.text = state.label holder.binding.checkbox.contentDescription = state.label - holder.binding.icon.setImageResource(state.iconRes) + holder.binding.icon.setImageDrawable(state.getIcon(holder.itemView.context)) holder.binding.root.setOnClickListener { onItemClickedListener(state) } holder.binding.checkbox.apply { this.isChecked = checkedItems.contains(state) @@ -121,14 +126,19 @@ class CardStateBottomSheetFragment : BottomSheetDialogFragment(R.layout.fragment } } -@get:DrawableRes -val CardState?.iconRes - get() = +/** Returns the card-state icon tinted with the current theme's state color. */ +fun CardState?.getIcon(context: Context): Drawable? { + val iconRes = if (this == null) R.drawable.ic_card_state_default else R.drawable.ic_card_state + val colorAttr = when (this) { - null -> R.drawable.ic_card_state_default - CardState.New -> R.drawable.ic_card_state_new - CardState.Learning -> R.drawable.ic_card_state_learning - CardState.Review -> R.drawable.ic_card_state_review - CardState.Buried -> R.drawable.ic_card_state_buried - CardState.Suspended -> R.drawable.ic_card_state_suspended + null -> androidx.appcompat.R.attr.colorPrimary + CardState.New -> CommonR.attr.newCountColor + CardState.Learning -> CommonR.attr.learnCountColor + CardState.Review -> CommonR.attr.reviewCountColor + CardState.Buried -> CommonR.attr.buriedColor + CardState.Suspended -> CommonR.attr.suspendedColor } + return ContextCompat.getDrawable(context, iconRes)?.mutate()?.also { + DrawableCompat.setTint(it, MaterialColors.getColor(context, colorAttr, 0)) + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/SavedSearches.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/SavedSearches.kt index bad2c71e6e1d..c6820608468e 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/SavedSearches.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/SavedSearches.kt @@ -3,25 +3,9 @@ package com.ichi2.anki.browser.search import com.ichi2.anki.CollectionManager.withCol -import com.ichi2.anki.libanki.Config +import com.ichi2.anki.common.utils.ext.savedFilters import timber.log.Timber -/** - * A named query for the Card Browser - * - * Selecting a saved search quickly allows a user to either: - * - search the given query - * - add additional terms to the query before searching - * - * @see SavedSearches - */ -data class SavedSearch( - val name: String, - val query: String, -) { - fun normalize() = SavedSearch(name = this.name, query = this.query.trim()) -} - /** * Manages saved searches (named search queries in the Card Browser) * @@ -88,20 +72,3 @@ object SavedSearches { /** Removes all saved searches from the Anki collection */ suspend fun clear() = saveToConfig(emptyList()) } - -/** - * The list of saved searches in the Anki Collection - * - * Ordering is NOT preserved in Anki Desktop. Searches are ordered based on the name and are - * case-sensitive - */ -var Config.savedFilters: List - get() = - get>("savedFilters") - .orEmpty() - .map { (key, value) -> SavedSearch(name = key, query = value) } - set(value) { - set("savedFilters", value.toMap()) - } - -fun List.toMap(): Map = associate { it.name to it.query } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/StandardSearchFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/StandardSearchFragment.kt index bbfbf70c7e57..1a131aa6ed40 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/StandardSearchFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/StandardSearchFragment.kt @@ -132,15 +132,7 @@ class StandardSearchFragment : binding.decksChip.text = it.decks.firstOrNull()?.name ?: TR.sentenceCase.allDecks binding.tagsChip.text = formatChipDescription(it.tags, emptyValue = "Tags") binding.cardStateChip.text = formatChipDescription(it.cardStates.map { it.label }, emptyValue = "Card state") - binding.cardStateChip.chipIcon = - ContextCompat.getDrawable(requireContext(), it.cardStates.firstOrNull().iconRes)?.also { drawable -> - if (it.cardStates.isEmpty()) { - DrawableCompat.setTint( - drawable.mutate(), - MaterialColors.getColor(requireContext(), androidx.appcompat.R.attr.colorPrimary, 0), - ) - } - } + binding.cardStateChip.chipIcon = it.cardStates.firstOrNull().getIcon(requireContext()) binding.flagsChip.text = formatChipDescription( diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/ui/SortPill.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/ui/SortPill.kt index 11011ac8e658..37b54352f61f 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/ui/SortPill.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/search/ui/SortPill.kt @@ -23,7 +23,7 @@ import com.google.android.material.shape.AbsoluteCornerSize import com.ichi2.anki.CommonString import com.ichi2.anki.R import com.ichi2.anki.browser.ColumnType -import com.ichi2.utils.dp +import com.ichi2.anki.common.utils.dp import com.ichi2.utils.updatePaddingRelative /** Direction expressed by a [SortPill] half — which side is the "active" sort. */ diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/TypeAnswer.kt b/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/TypeAnswer.kt index 074ae75fa06d..89a6bd612cb4 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/TypeAnswer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/TypeAnswer.kt @@ -153,14 +153,7 @@ class TypeAnswer( """
    0) { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/TypeAnswerKeyboard.kt b/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/TypeAnswerKeyboard.kt new file mode 100644 index 000000000000..8787ef1676bf --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/TypeAnswerKeyboard.kt @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.cardviewer + +/** Appends the HTML answer's keyboard attributes, including a trailing space. */ +internal fun StringBuilder.appendNoSuggestAttributes() { + append("data-ankidroid-nosuggest=\"true\"") + append(' ') + append("enterkeyhint=\"done\"") + append(' ') +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/TypeAnswerWebView.kt b/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/TypeAnswerWebView.kt index 42327e1e81c5..9de1937c4ff9 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/TypeAnswerWebView.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/TypeAnswerWebView.kt @@ -3,12 +3,14 @@ package com.ichi2.anki.cardviewer import android.content.Context +import android.util.AttributeSet import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputConnection import android.view.inputmethod.InputMethodManager import android.webkit.JavascriptInterface import android.webkit.WebView import androidx.core.content.getSystemService +import com.ichi2.anki.workarounds.SafeWebViewLayout import com.ichi2.ui.applyNoSuggest /** Applies `nosuggest` to the focused HTML answer field's keyboard connection. */ @@ -47,3 +49,11 @@ open class TypeAnswerWebView( super.destroy() } } + +/** Uses the same keyboard support when the new reviewer recreates its WebView after a crash. */ +class TypeAnswerWebViewLayout( + context: Context, + attrs: AttributeSet?, +) : SafeWebViewLayout(context, attrs) { + override fun createWebView(): WebView = TypeAnswerWebView(context) +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/ViewerCommand.kt b/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/ViewerCommand.kt index 082f1f1c2826..31e47d728467 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/ViewerCommand.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/cardviewer/ViewerCommand.kt @@ -4,11 +4,12 @@ package com.ichi2.anki.cardviewer import android.content.SharedPreferences import android.view.KeyEvent -import com.ichi2.anki.reviewer.Binding.Companion.keyCode import com.ichi2.anki.reviewer.Binding.Companion.unicode +import com.ichi2.anki.reviewer.Binding.KeyCode import com.ichi2.anki.reviewer.Binding.ModifierKeys import com.ichi2.anki.reviewer.Binding.ModifierKeys.Companion.ctrl import com.ichi2.anki.reviewer.Binding.ModifierKeys.Companion.shift +import com.ichi2.anki.reviewer.BindingUnicodeCharacter import com.ichi2.anki.reviewer.CardSide import com.ichi2.anki.reviewer.MappableAction import com.ichi2.anki.reviewer.ReviewerBinding @@ -108,11 +109,11 @@ enum class ViewerCommand : MappableAction { keyCode(KeyEvent.KEYCODE_NUMPAD_4, CardSide.ANSWER), ) EDIT -> listOf(keyCode(KeyEvent.KEYCODE_E, CardSide.BOTH)) - MARK -> listOf(unicode('*', CardSide.BOTH)) - BURY_CARD -> listOf(unicode('-', CardSide.BOTH)) - BURY_NOTE -> listOf(unicode('=', CardSide.BOTH)) - SUSPEND_CARD -> listOf(unicode('@', CardSide.BOTH)) - SUSPEND_NOTE -> listOf(unicode('!', CardSide.BOTH)) + MARK -> listOf(unicode(BindingUnicodeCharacter('*'), CardSide.BOTH)) + BURY_CARD -> listOf(unicode(BindingUnicodeCharacter('-'), CardSide.BOTH)) + BURY_NOTE -> listOf(unicode(BindingUnicodeCharacter('='), CardSide.BOTH)) + SUSPEND_CARD -> listOf(unicode(BindingUnicodeCharacter('@'), CardSide.BOTH)) + SUSPEND_NOTE -> listOf(unicode(BindingUnicodeCharacter('!'), CardSide.BOTH)) PLAY_MEDIA -> listOf(keyCode(KeyEvent.KEYCODE_R, CardSide.BOTH), keyCode(KeyEvent.KEYCODE_F5, CardSide.BOTH)) REPLAY_VOICE -> listOf(keyCode(KeyEvent.KEYCODE_V, CardSide.BOTH)) RECORD_VOICE -> listOf(keyCode(KeyEvent.KEYCODE_V, CardSide.BOTH, shift())) @@ -192,10 +193,10 @@ enum class ViewerCommand : MappableAction { keycode: Int, side: CardSide, keys: ModifierKeys = ModifierKeys.none(), - ): ReviewerBinding = ReviewerBinding(keyCode(keycode, keys), side) + ): ReviewerBinding = ReviewerBinding(KeyCode(keycode, keys), side) private fun unicode( - c: Char, + c: BindingUnicodeCharacter, side: CardSide, ): ReviewerBinding = ReviewerBinding(unicode(c), side) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/contextmenu/MouseContextMenuHandler.kt b/AnkiDroid/src/main/java/com/ichi2/anki/contextmenu/MouseContextMenuHandler.kt index c4e1bfe3c824..5b1e51e0c251 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/contextmenu/MouseContextMenuHandler.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/contextmenu/MouseContextMenuHandler.kt @@ -6,7 +6,7 @@ package com.ichi2.anki.contextmenu import android.view.View import android.view.ViewGroup import android.widget.PopupMenu -import com.ichi2.anki.R +import com.ichi2.anki.common.android.R as CommonR /** * Helper class to build a context menu for mouse right-click events. @@ -46,7 +46,7 @@ open class MouseContextMenuHandler( viewGroup.addView(anchorView) - val popupMenu = PopupMenu(context, anchorView, 0, 0, R.style.OverflowMenuStyle) + val popupMenu = PopupMenu(context, anchorView, 0, 0, CommonR.style.OverflowMenuStyle) menuContentProvider.populateMenu(popupMenu.menu) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/deckpicker/DeckPickerViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/deckpicker/DeckPickerViewModel.kt index 7275d8faf50f..d3d9eeedfe09 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/deckpicker/DeckPickerViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/deckpicker/DeckPickerViewModel.kt @@ -118,7 +118,10 @@ class DeckPickerViewModel : if (tree == null) return@combine FlattenedDeckList.empty // TODO: use flowOfFocusedDeck once it's set on all instances - val currentDeckId = withCol { decks.current().getLong("id") } + // This flow can outlive the visible screen. Do not reopen the collection just to redraw it. + val currentDeckId = + withOpenColOrNull { decks.current().id } + ?: return@combine FlattenedDeckList.empty Timber.i("currentDeckId: %d", currentDeckId) FlattenedDeckList( @@ -207,21 +210,17 @@ class DeckPickerViewModel : val isFilteredDeck: Boolean, ) - /** Prepares a confirmation dialog for deleting the focused deck. */ + /** Prepares a confirmation dialog for deleting the selected deck. */ fun requestDeleteDeckConfirmation() = launchCatchingIO { - val deckId = - focusedDeck ?: run { - Timber.w("no focused deck") - return@launchCatchingIO - } val request = withCol { + val deck = decks.current() DeleteDeckConfirmationRequest( - deckId = deckId, - deckName = decks.name(deckId), - totalCards = decks.cardCount(deckId, includeSubdecks = true), - isFilteredDeck = decks.isFiltered(deckId), + deckId = deck.id, + deckName = deck.name, + totalCards = decks.cardCount(deck.id, includeSubdecks = true), + isFilteredDeck = deck.isFiltered, ) } flowOfDeleteDeckConfirmation.emit(request) @@ -490,6 +489,8 @@ class DeckPickerViewModel : focusedDeck = withCol { decks.current().id } refreshUndoMenuState() + // Reopening can leave the counts and selection unchanged after a skipped display refresh. + flowOfRefreshDeckList.emit(Unit) flowOfDecksReloaded.emit(Unit) } this.loadDeckCounts = loadDeckCounts @@ -747,17 +748,17 @@ class DeckPickerViewModel : ): Long { var previous: Long try { - previous = preferences.getLong(UPGRADE_VERSION_KEY, current) + previous = preferences.getLong(PREF_LAST_UPGRADE_VERSION, current) } catch (e: ClassCastException) { Timber.w(e) previous = try { // set 20900203 to default value, as it's the latest version that stores integer in shared prefs - preferences.getInt(UPGRADE_VERSION_KEY, 20900203).toLong() + preferences.getInt(PREF_LAST_UPGRADE_VERSION, 20900203).toLong() } catch (cce: ClassCastException) { Timber.w(cce) // Previous versions stored this as a string. - val s = preferences.getString(UPGRADE_VERSION_KEY, "") + val s = preferences.getString(PREF_LAST_UPGRADE_VERSION, "") // The last version of AnkiDroid that stored this as a string was 2.0.2. // We manually set the version here, but anything older will force a DB check. if ("2.0.2" == s) { @@ -766,16 +767,16 @@ class DeckPickerViewModel : 0 } } - Timber.d("Updating shared preferences stored key %s type to long", UPGRADE_VERSION_KEY) + Timber.d("Updating shared preferences stored key %s type to long", PREF_LAST_UPGRADE_VERSION) // Expected Editor.putLong to be called later to update the value in shared prefs - preferences.edit().remove(UPGRADE_VERSION_KEY).apply() + preferences.edit().remove(PREF_LAST_UPGRADE_VERSION).apply() } Timber.i("Previous AnkiDroid version: %s", previous) return previous } companion object { - const val UPGRADE_VERSION_KEY = "lastUpgradeVersion" + const val PREF_LAST_UPGRADE_VERSION = "lastUpgradeVersion" } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/BackupPromptDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/BackupPromptDialog.kt index 209fd02b2bd6..60f7490c42f0 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/BackupPromptDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/BackupPromptDialog.kt @@ -17,7 +17,7 @@ import com.ichi2.anki.common.time.TimeManager import com.ichi2.anki.compat.CompatHelper.Companion.getPackageInfoCompat import com.ichi2.anki.compat.PackageInfoFlagsCompat import com.ichi2.anki.isLoggedIn -import com.ichi2.anki.millisecondsSinceLastSync +import com.ichi2.anki.millisecondsSinceLastSyncAttempt import com.ichi2.anki.servicelayer.ScopedStorageService.collectionWillBeMadeInaccessibleAfterUninstall import com.ichi2.anki.servicelayer.ScopedStorageService.userIsPromptedToDeleteCollectionOnUninstall import com.ichi2.utils.Permissions @@ -242,8 +242,8 @@ class BackupPromptDialog private constructor( // If we are on a 'full' build, the user can always restore access to their collection. // But we want them to sync regularly as a backup if (isLoggedIn()) { - // Show dialog to sync if user hasn't synced in a while - return millisecondsSinceLastSync() >= ONE_DAY_IN_MS * 7 + // Show dialog to sync if no sync attempt has been recorded in a while + return millisecondsSinceLastSyncAttempt() >= ONE_DAY_IN_MS * 7 } // Android proposes the user deletes non-legacy locations on uninstall diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/BrowserOptionsDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/BrowserOptionsDialog.kt index 3c58d7e33298..6eddfbd595d3 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/BrowserOptionsDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/BrowserOptionsDialog.kt @@ -47,7 +47,7 @@ class BrowserOptionsDialog : AppCompatDialogFragment(R.layout.dialog_browser_opt } private val cardsOrNotes by lazy { - when (arguments?.getBoolean(CARDS_OR_NOTES_KEY)) { + when (arguments?.getBoolean(ARG_CARDS_OR_NOTES)) { true -> CardsOrNotes.CARDS false -> CardsOrNotes.NOTES null -> { @@ -59,7 +59,7 @@ class BrowserOptionsDialog : AppCompatDialogFragment(R.layout.dialog_browser_opt } private val isTruncated by lazy { - arguments?.getBoolean(IS_TRUNCATED_KEY) ?: run { + arguments?.getBoolean(ARG_IS_TRUNCATED) ?: run { Timber.w("BrowserOptionsDialog instantiated without configuration.") false } @@ -120,8 +120,8 @@ class BrowserOptionsDialog : AppCompatDialogFragment(R.layout.dialog_browser_opt } companion object { - private const val CARDS_OR_NOTES_KEY = "cardsOrNotes" - private const val IS_TRUNCATED_KEY = "isTruncated" + private const val ARG_CARDS_OR_NOTES = "cardsOrNotes" + private const val ARG_IS_TRUNCATED = "isTruncated" fun newInstance( cardsOrNotes: CardsOrNotes, @@ -131,8 +131,8 @@ class BrowserOptionsDialog : AppCompatDialogFragment(R.layout.dialog_browser_opt return BrowserOptionsDialog().apply { arguments = Bundle().apply { - putBoolean(CARDS_OR_NOTES_KEY, cardsOrNotes == CardsOrNotes.CARDS) - putBoolean(IS_TRUNCATED_KEY, isTruncated) + putBoolean(ARG_CARDS_OR_NOTES, cardsOrNotes == CardsOrNotes.CARDS) + putBoolean(ARG_IS_TRUNCATED, isTruncated) } } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialog.kt index 500a5921957e..ae5247f4d2a4 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialog.kt @@ -77,6 +77,7 @@ import com.ichi2.utils.boldList import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.launch import timber.log.Timber +import com.ichi2.anki.common.android.R as CommonR /** * Supports bulk remapping of notes a different note type, remapping fields and templates @@ -211,7 +212,7 @@ class ChangeNoteTypeDialog : AnalyticsDialogFragment(R.layout.dialog_change_note android.R.layout.simple_spinner_dropdown_item, noteTypes, ) { - var clozeColor = MaterialColors.getColor(context, R.attr.clozeColor, Color.BLUE) + var clozeColor = MaterialColors.getColor(context, CommonR.attr.clozeColor, Color.BLUE) private val defaultViewTextColor: Int by lazy { (super.getView(0, null, Spinner(context)) as CheckedTextView).currentTextColor diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckOptionsSelectionDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckOptionsSelectionDialog.kt index e9a4091927dc..ab32beb8c6d7 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckOptionsSelectionDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckOptionsSelectionDialog.kt @@ -21,6 +21,7 @@ import com.ichi2.utils.create import com.ichi2.utils.customView import com.ichi2.utils.title import timber.log.Timber +import com.ichi2.anki.common.android.R as CommonR /** * Shows a list of decks from which the user can select one to display its deck options. @@ -39,7 +40,7 @@ fun Context.showDeckOptionsSelectionDialog( getColor(0, 0) } val dynamicDeckNameColor: Int = - usingStyledAttributes(null, intArrayOf(R.attr.dynDeckColor)) { + usingStyledAttributes(null, intArrayOf(CommonR.attr.dynDeckColor)) { getColor(0, 0) } val dialog = diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckPickerContextMenu.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckPickerContextMenu.kt index 85f24b7ec1de..850022f79f6b 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckPickerContextMenu.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckPickerContextMenu.kt @@ -134,19 +134,19 @@ data class DeckPickerContextMenuResult( ) { fun toBundle(): Bundle = Bundle().apply { - putLong(ARG_DECK_ID, deckId) - putSerializable(ARG_OPTION, option) + putLong(RESULT_DECK_ID, deckId) + putSerializable(RESULT_CONTEXT_MENU_OPTION, option) } companion object { const val REQUEST_KEY = "request_key_deck_picker_context_menu" - private const val ARG_DECK_ID = "deck_id" - private const val ARG_OPTION = "option" + private const val RESULT_DECK_ID = "deck_id" + private const val RESULT_CONTEXT_MENU_OPTION = "option" fun fromBundle(bundle: Bundle) = DeckPickerContextMenuResult( - deckId = bundle.requireLong(ARG_DECK_ID), - option = bundle.requireSerializableCompat(ARG_OPTION), + deckId = bundle.requireLong(RESULT_DECK_ID), + option = bundle.requireSerializableCompat(RESULT_CONTEXT_MENU_OPTION), ) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckSelectionDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckSelectionDialog.kt index 44a83beb5447..c873582488db 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckSelectionDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckSelectionDialog.kt @@ -25,7 +25,6 @@ import androidx.fragment.app.setFragmentResultListener import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.RecyclerView import anki.decks.deckTreeNode -import com.ichi2.anki.AnkiActivity import com.ichi2.anki.CardTemplateEditor import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CollectionManager.withCol @@ -38,8 +37,8 @@ import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.databinding.DialogDeckPickerBinding import com.ichi2.anki.databinding.ItemDeckPickerDialogBinding import com.ichi2.anki.deckpicker.DeckFilters -import com.ichi2.anki.dialogs.DeckSelectionDialog.Companion.ARG_SELECTED_DECK import com.ichi2.anki.dialogs.DeckSelectionDialog.Companion.REQUEST_SELECT_DECK +import com.ichi2.anki.dialogs.DeckSelectionDialog.Companion.RESULT_SELECTED_DECK import com.ichi2.anki.launchCatchingTask import com.ichi2.anki.libanki.Consts.DEFAULT_DECK_ID import com.ichi2.anki.libanki.DeckId @@ -56,6 +55,7 @@ import com.ichi2.utils.customView import com.ichi2.utils.negativeButton import com.ichi2.utils.positiveButton import timber.log.Timber +import com.ichi2.anki.common.android.R as CommonR /** * A fragment which allows the user to select one or multiple decks from a list of decks. It also @@ -113,7 +113,7 @@ class DeckSelectionDialog : AnalyticsDialogFragment() { } private fun getDeckNames(): ArrayList = - BundleCompat.getParcelableArrayList(requireArguments(), DECK_NAMES, SelectableDeck::class.java)!! + BundleCompat.getParcelableArrayList(requireArguments(), ARG_DECK_NAMES, SelectableDeck::class.java)!! private fun setupMenu() { val toolbar: Toolbar = binding.toolbar @@ -187,7 +187,7 @@ class DeckSelectionDialog : AnalyticsDialogFragment() { parentFragmentManager.setFragmentResult( requestKey, Bundle().apply { - putParcelable(ARG_SELECTED_DECK, deck) + putParcelable(RESULT_SELECTED_DECK, deck) }, ) } @@ -222,8 +222,8 @@ class DeckSelectionDialog : AnalyticsDialogFragment() { val attrs = intArrayOf( - R.attr.expandRef, - R.attr.collapseRef, + CommonR.attr.expandRef, + CommonR.attr.collapseRef, ) inner class ViewHolder( @@ -414,14 +414,14 @@ class DeckSelectionDialog : AnalyticsDialogFragment() { companion object { const val TAG = "DeckSelectionDialog" const val REQUEST_SELECT_DECK = "request_select_deck" - const val ARG_SELECTED_DECK = "arg_selected_deck" + const val RESULT_SELECTED_DECK = "arg_selected_deck" const val ARG_REQUEST_KEY = "arg_request_key" const val ARG_ALLOW_ALL = "arg_allow_all" const val ARG_ALLOW_FILTERED = "arg_allow_filtered" const val ARG_SKIP_EMPTY_DEFAULT = "arg_skip_empty_default" private const val ARG_TITLE = "arg_title" private const val ARG_TEMPLATE_EDITOR_MESSAGE = "arg_template_editor_message" - private const val DECK_NAMES = "deckNames" + private const val ARG_DECK_NAMES = "deckNames" private const val ARG_ALLOW_MULTIPLE_SELECTION = "arg_allow_multiple_selection" /** Creates a new instance of [DeckSelectionDialog]. */ @@ -440,7 +440,7 @@ class DeckSelectionDialog : AnalyticsDialogFragment() { Bundle().apply { putString(ARG_TEMPLATE_EDITOR_MESSAGE, templateEditorMessage) putString(ARG_TITLE, title) - putParcelableArrayList(DECK_NAMES, ArrayList(decks)) + putParcelableArrayList(ARG_DECK_NAMES, ArrayList(decks)) putString(ARG_REQUEST_KEY, requestKey) putBoolean(ARG_ALLOW_MULTIPLE_SELECTION, allowMultipleSelection) putBoolean(ARG_ALLOW_ALL, allowAll) @@ -462,7 +462,7 @@ fun FragmentActivity.registerDeckSelectedHandler( action: (deck: SelectableDeck?) -> Unit, ) { setFragmentResultListener(requestKey) { _, bundle -> - val selectedDeck = bundle.getParcelableCompat(ARG_SELECTED_DECK) + val selectedDeck = bundle.getParcelableCompat(RESULT_SELECTED_DECK) action(selectedDeck) } } @@ -479,7 +479,7 @@ fun Fragment.registerDeckSelectedHandler( action: (deck: SelectableDeck?) -> Unit, ) { setFragmentResultListener(requestKey) { _, bundle -> - val selectedDeck = bundle.getParcelableCompat(ARG_SELECTED_DECK) + val selectedDeck = bundle.getParcelableCompat(RESULT_SELECTED_DECK) action(selectedDeck) } } @@ -557,7 +557,7 @@ fun Fragment.startDeckSelection( * @param allowFiltered shows filtered decks if true * @param skipEmptyDefault if true, hides the 'Default' deck if it has no cards or subdecks */ -fun AnkiActivity.startDeckSelection( +fun FragmentActivity.startDeckSelection( title: String? = null, templateEditorMessage: String? = null, requestKey: String = REQUEST_SELECT_DECK, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/EditDeckDescriptionDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/EditDeckDescriptionDialog.kt index 750c13576612..4c5733f6811f 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/EditDeckDescriptionDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/EditDeckDescriptionDialog.kt @@ -17,7 +17,6 @@ import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CommonString -import com.ichi2.anki.R import com.ichi2.anki.StudyOptionsFragment import com.ichi2.anki.databinding.DialogDeckDescriptionBinding import com.ichi2.anki.dialogs.EditDeckDescriptionDialogViewModel.DismissType @@ -35,6 +34,7 @@ import com.ichi2.utils.show import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.launch import timber.log.Timber +import com.ichi2.anki.common.android.R as CommonR /** * Allows a user to edit the [deck description][com.ichi2.anki.libanki.Deck.description] @@ -115,7 +115,7 @@ class EditDeckDescriptionDialog : DialogFragment() { setOnClickListener { MaterialAlertDialogBuilder(requireContext()).show { setTitle(binding.formatAsMarkdownInput.text) - setIcon(R.drawable.ic_help_black_24dp) + setIcon(CommonR.drawable.ic_help_black_24dp) // FIXME: the upstream string unexpectedly contains newlines setMessage(TR.deckConfigDescriptionNewHandlingHint().replace("\n", " ").replace(" ", " ")) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ExportReadyDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ExportReadyDialog.kt index ea40a215ccee..e9db081842ee 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ExportReadyDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ExportReadyDialog.kt @@ -16,7 +16,7 @@ import timber.log.Timber class ExportReadyDialog : DialogFragment() { private val exportPath - get() = requireArguments().requireString(KEY_EXPORT_PATH) + get() = requireArguments().requireString(ARG_EXPORT_PATH) private val asText: Boolean get() = requireArguments().getBoolean(ARG_SHARE_AS_TEXT, false) @@ -28,14 +28,14 @@ class ExportReadyDialog : DialogFragment() { .positiveButton(CommonString.export_choice_save_to) { parentFragmentManager.setFragmentResult( REQUEST_EXPORT_SAVE, - Bundle().apply { putString(KEY_EXPORT_PATH, exportPath) }, + Bundle().apply { putString(RESULT_EXPORT_PATH, exportPath) }, ) }.negativeButton(CommonString.export_choice_share) { parentFragmentManager.setFragmentResult( REQUEST_EXPORT_SHARE, Bundle().apply { - putString(KEY_EXPORT_PATH, exportPath) - putBoolean(ARG_SHARE_AS_TEXT, asText) + putString(RESULT_EXPORT_PATH, exportPath) + putBoolean(RESULT_SHARE_AS_TEXT, asText) }, ) } @@ -46,8 +46,11 @@ class ExportReadyDialog : DialogFragment() { companion object { const val REQUEST_EXPORT_SAVE = "request_export_save" const val REQUEST_EXPORT_SHARE = "request_export_share" - const val KEY_EXPORT_PATH = "key_export_path" - const val ARG_SHARE_AS_TEXT = "arg_share_as_text" + const val RESULT_EXPORT_PATH = "key_export_path" + const val RESULT_SHARE_AS_TEXT = "arg_share_as_text" + + private const val ARG_EXPORT_PATH = "key_export_path" + private const val ARG_SHARE_AS_TEXT = "arg_share_as_text" fun newInstance( exportPath: String, @@ -55,7 +58,7 @@ class ExportReadyDialog : DialogFragment() { ) = ExportReadyDialog().apply { arguments = Bundle().apply { - putString(KEY_EXPORT_PATH, exportPath) + putString(ARG_EXPORT_PATH, exportPath) putBoolean(ARG_SHARE_AS_TEXT, asText) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/FieldSelectionDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/FieldSelectionDialog.kt index b68c78ac1c46..9718f0dde87f 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/FieldSelectionDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/FieldSelectionDialog.kt @@ -36,7 +36,7 @@ class FieldSelectionDialog : DialogFragment() { } val resultType: ResultType by lazy { - requireArguments().requireParcelable(RESULT_TYPE) + requireArguments().requireParcelable(ARG_RESULT_TYPE) } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = @@ -73,6 +73,7 @@ class FieldSelectionDialog : DialogFragment() { * Default value: `""` */ private const val RESULT_TYPE = "resultType" + private const val ARG_RESULT_TYPE = "resultType" /** * @param resultType optional result string returned in the Fragment Result API bundle under @@ -88,7 +89,7 @@ class FieldSelectionDialog : DialogFragment() { val bundle = Bundle().apply { - putParcelable(RESULT_TYPE, resultType) + putParcelable(ARG_RESULT_TYPE, resultType) putStringArrayList(ARG_FIELD_NAMES, ArrayList(fieldNames)) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ImportDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ImportDialog.kt index 1eed98a0ecb7..e3dd8a3f288c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ImportDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ImportDialog.kt @@ -22,10 +22,10 @@ class ImportDialog : AsyncDialogFragment() { private val importViewModel: ImportViewModel by activityViewModels() private val dialogType: Type - get() = Type.fromCode(requireArguments().getInt(IMPORT_DIALOG_TYPE_KEY)) + get() = Type.fromCode(requireArguments().getInt(ARG_DIALOG_TYPE)) private val packagePath: String - get() = requireArguments().getString(IMPORT_DIALOG_PACKAGE_PATH_KEY)!! + get() = requireArguments().getString(ARG_PACKAGE_PATH)!! override fun onCreateDialog(savedInstanceState: Bundle?): AlertDialog { val dialog = AlertDialog.Builder(requireActivity()) @@ -90,8 +90,8 @@ class ImportDialog : AsyncDialogFragment() { } companion object { - const val IMPORT_DIALOG_TYPE_KEY = "dialogType" - const val IMPORT_DIALOG_PACKAGE_PATH_KEY = "packagePath" + const val ARG_DIALOG_TYPE = "dialogType" + const val ARG_PACKAGE_PATH = "packagePath" /** * A set of dialogs which deal with importing a file @@ -107,8 +107,8 @@ class ImportDialog : AsyncDialogFragment() { ImportDialog().apply { arguments = Bundle().apply { - putInt(IMPORT_DIALOG_TYPE_KEY, dialogType.code) - putString(IMPORT_DIALOG_PACKAGE_PATH_KEY, packagePath) + putInt(ARG_DIALOG_TYPE, dialogType.code) + putString(ARG_PACKAGE_PATH, packagePath) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/InsertFieldDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/InsertFieldDialog.kt index d0710c2dd91f..756b15c3f0c2 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/InsertFieldDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/InsertFieldDialog.kt @@ -32,20 +32,21 @@ import com.ichi2.anki.CardTemplateEditor import com.ichi2.anki.CommonString import com.ichi2.anki.Flag import com.ichi2.anki.R -import com.ichi2.anki.databinding.DialogGenericRecyclerViewBinding +import com.ichi2.anki.common.android.databinding.DialogGenericRecyclerViewBinding import com.ichi2.anki.databinding.DialogInsertFieldBinding import com.ichi2.anki.databinding.ItemInsertSpecialFieldBinding -import com.ichi2.anki.dialogs.InsertFieldDialogViewModel.Companion.KEY_FIELD_ITEMS -import com.ichi2.anki.dialogs.InsertFieldDialogViewModel.Companion.KEY_INSERT_FIELD_METADATA -import com.ichi2.anki.dialogs.InsertFieldDialogViewModel.Companion.KEY_REQUEST_KEY +import com.ichi2.anki.dialogs.InsertFieldDialogViewModel.Companion.ARG_FIELD_NAMES +import com.ichi2.anki.dialogs.InsertFieldDialogViewModel.Companion.ARG_INSERT_FIELD_METADATA +import com.ichi2.anki.dialogs.InsertFieldDialogViewModel.Companion.ARG_REQUEST_KEY import com.ichi2.anki.dialogs.InsertFieldDialogViewModel.Tab -import com.ichi2.anki.launchCatchingTask +import com.ichi2.anki.launchCatchingViewTask import com.ichi2.anki.model.SpecialField import com.ichi2.anki.model.SpecialFields import com.ichi2.anki.utils.ext.requireString import com.ichi2.themes.Themes import dev.androidbroadcast.vbpd.viewBinding import org.jetbrains.annotations.VisibleForTesting +import com.ichi2.anki.common.android.R as CommonR /** * Dialog fragment used to show the fields that the user can insert in the card editor. This @@ -56,7 +57,7 @@ import org.jetbrains.annotations.VisibleForTesting class InsertFieldDialog : DialogFragment(R.layout.dialog_insert_field) { private val viewModel by viewModels() private val requestKey: String by lazy { - requireArguments().requireString(KEY_REQUEST_KEY) + requireArguments().requireString(ARG_REQUEST_KEY) } override fun onCreate(savedInstanceState: Bundle?) { @@ -102,12 +103,12 @@ class InsertFieldDialog : DialogFragment(R.layout.dialog_insert_field) { ) // setup flows - launchCatchingTask { + launchCatchingViewTask { viewModel.selectedFieldFlow.collect { field -> if (field == null) return@collect parentFragmentManager.setFragmentResult( requestKey, - Bundle().apply { putString(KEY_INSERTED_FIELD, field.renderToTemplateTag()) }, + Bundle().apply { putString(RESULT_INSERTED_FIELD, field.renderToTemplateTag()) }, ) dismiss() } @@ -132,7 +133,7 @@ class InsertFieldDialog : DialogFragment(R.layout.dialog_insert_field) { * * Represents the template tag for the selected field: `{{Front}}` */ - const val KEY_INSERTED_FIELD = "key_inserted_field" + const val RESULT_INSERTED_FIELD = "key_inserted_field" /** * Creates a new instance of [InsertFieldDialog] @@ -149,9 +150,9 @@ class InsertFieldDialog : DialogFragment(R.layout.dialog_insert_field) { InsertFieldDialog().apply { arguments = Bundle().apply { - putStringArrayList(KEY_FIELD_ITEMS, ArrayList(fieldItems)) - putParcelable(KEY_INSERT_FIELD_METADATA, metadata) - putString(KEY_REQUEST_KEY, requestKey) + putStringArrayList(ARG_FIELD_NAMES, ArrayList(fieldItems)) + putParcelable(ARG_INSERT_FIELD_METADATA, metadata) + putString(ARG_REQUEST_KEY, requestKey) } } } @@ -169,7 +170,7 @@ class InsertFieldDialog : DialogFragment(R.layout.dialog_insert_field) { override fun getItemCount() = 2 } - class SelectBasicFieldFragment : Fragment(R.layout.dialog_generic_recycler_view) { + class SelectBasicFieldFragment : Fragment(CommonR.layout.dialog_generic_recycler_view) { val viewModel by viewModels( ownerProducer = { requireParentFragment() as InsertFieldDialog }, ) @@ -207,7 +208,7 @@ class InsertFieldDialog : DialogFragment(R.layout.dialog_insert_field) { } } - class SelectSpecialFieldFragment : Fragment(R.layout.dialog_generic_recycler_view) { + class SelectSpecialFieldFragment : Fragment(CommonR.layout.dialog_generic_recycler_view) { val viewModel by viewModels( ownerProducer = { requireParentFragment() as InsertFieldDialog }, ) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/InsertFieldDialogViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/InsertFieldDialogViewModel.kt index 2279977c85fd..fbc73ca6c1bd 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/InsertFieldDialogViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/InsertFieldDialogViewModel.kt @@ -36,14 +36,14 @@ class InsertFieldDialogViewModel( var currentTab by currentTabFlow.asVar() /** The field names of the note type */ - val fieldNames = savedStateHandle.require>(KEY_FIELD_ITEMS).map(::FieldName) + val fieldNames = savedStateHandle.require>(ARG_FIELD_NAMES).map(::FieldName) /** * State of the selected card when the screen was opened * * Used for providing [special fields][SpecialFields] with the output they'd produce. */ - val metadata = savedStateHandle.require(KEY_INSERT_FIELD_METADATA) + val metadata = savedStateHandle.require(ARG_INSERT_FIELD_METADATA) val selectedFieldFlow = MutableStateFlow(null) @@ -112,9 +112,9 @@ class InsertFieldDialogViewModel( } companion object { - const val KEY_FIELD_ITEMS = "key_field_items" - const val KEY_INSERT_FIELD_METADATA = "key_field_options" - const val KEY_REQUEST_KEY = "key_request_key" + const val ARG_FIELD_NAMES = "key_field_items" + const val ARG_INSERT_FIELD_METADATA = "key_field_options" + const val ARG_REQUEST_KEY = "key_request_key" const val STATE_TAB = "state_tab" } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/IntegerDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/IntegerDialog.kt index 8e39bf13cebc..cd3eca6ca409 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/IntegerDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/IntegerDialog.kt @@ -7,7 +7,6 @@ import android.os.Bundle import android.text.InputType import androidx.appcompat.app.AlertDialog import com.ichi2.anki.CommonString -import com.ichi2.anki.R import com.ichi2.anki.analytics.AnalyticsDialogFragment import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.utils.input @@ -17,6 +16,7 @@ import com.ichi2.utils.show import com.ichi2.utils.title import timber.log.Timber import java.util.function.Consumer +import com.ichi2.anki.common.android.R as CommonR // TODO: Pass optional validation condition i.e. Positive button not enabled if condition is true open class IntegerDialog : AnalyticsDialogFragment() { @@ -52,7 +52,7 @@ open class IntegerDialog : AnalyticsDialogFragment() { positiveButton(CommonString.dialog_ok) negativeButton(CommonString.dialog_cancel) setMessage(requireArguments().getString("content")) - setView(R.layout.dialog_generic_text_input) + setView(CommonR.layout.dialog_generic_text_input) }.input( hint = requireArguments().getString("prompt"), inputType = InputType.TYPE_CLASS_NUMBER, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/LoadingDialogFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/LoadingDialogFragment.kt index 1de223be8fcf..8d7c317e4a4e 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/LoadingDialogFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/LoadingDialogFragment.kt @@ -23,10 +23,10 @@ import com.ichi2.utils.customView class LoadingDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialogView = layoutInflater.inflate(R.layout.fragment_loading, null) - val canBeCancelled = arguments?.getBoolean(KEY_CANCELLABLE) ?: true + val canBeCancelled = arguments?.getBoolean(ARG_CANCELLABLE) ?: true isCancelable = canBeCancelled dialogView.findViewById(R.id.text).text = - arguments?.getString(KEY_MESSAGE) ?: getString(CommonString.dialog_processing) + arguments?.getString(ARG_MESSAGE) ?: getString(CommonString.dialog_processing) return AlertDialog .Builder(requireContext()) .create { @@ -37,8 +37,8 @@ class LoadingDialogFragment : DialogFragment() { companion object { const val TAG = "LoadingDialogFragment" - private const val KEY_MESSAGE = "key_message" - private const val KEY_CANCELLABLE = "key_cancellable" + private const val ARG_MESSAGE = "key_message" + private const val ARG_CANCELLABLE = "key_cancellable" /** * Creates an instance of [LoadingDialogFragment]. @@ -53,8 +53,8 @@ class LoadingDialogFragment : DialogFragment() { ) = LoadingDialogFragment().apply { arguments = Bundle().apply { - putString(KEY_MESSAGE, message) - putBoolean(KEY_CANCELLABLE, cancellable) + putString(ARG_MESSAGE, message) + putBoolean(ARG_CANCELLABLE, cancellable) } isCancelable = cancellable } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/LocaleSelectionDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/LocaleSelectionDialog.kt index 3f9dfb1d318b..96eb5a1dd79f 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/LocaleSelectionDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/LocaleSelectionDialog.kt @@ -87,7 +87,7 @@ class LocaleSelectionDialog : AnalyticsDialogFragment() { private fun sendSelectionResult(locale: Locale? = null) { parentFragmentManager.setFragmentResult( REQUEST_HINT_LOCALE_SELECTION, - Bundle().apply { putSerializable(KEY_SELECTED_LOCALE, locale) }, + Bundle().apply { putSerializable(RESULT_SELECTED_LOCALE, locale) }, ) } @@ -151,7 +151,7 @@ class LocaleSelectionDialog : AnalyticsDialogFragment() { companion object { const val REQUEST_HINT_LOCALE_SELECTION = "request_hint_locale_selection" - const val KEY_SELECTED_LOCALE = "key_selected_locale" + const val RESULT_SELECTED_LOCALE = "key_selected_locale" /** * Language identifier for International Phonetic Alphabet. This isn't available from [Locale.getAvailableLocales], but diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/NoteTypeFieldEditorContextMenu.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/NoteTypeFieldEditorContextMenu.kt index d52a35009ba7..023f4fa3746b 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/NoteTypeFieldEditorContextMenu.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/NoteTypeFieldEditorContextMenu.kt @@ -23,7 +23,7 @@ class NoteTypeFieldEditorContextMenu : AnalyticsDialogFragment() { val availableItems = NoteTypeFieldEditorContextMenuAction.entries.sortedBy { it.order } return AlertDialog.Builder(requireActivity()).create { - setTitle(requireArguments().getString(KEY_LABEL)) + setTitle(requireArguments().getString(ARG_LABEL)) setItems(availableItems.map { resources.getString(it.actionTextId) }.toTypedArray()) { _, index -> (activity as? NoteTypeFieldEditor)?.run { handleAction(availableItems[index]) } ?: Timber.e("ContextMenu used from outside of its target activity!") @@ -44,11 +44,11 @@ class NoteTypeFieldEditorContextMenu : AnalyticsDialogFragment() { companion object { @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - const val KEY_LABEL = "key_label" + const val ARG_LABEL = "key_label" fun newInstance(label: String): NoteTypeFieldEditorContextMenu = NoteTypeFieldEditorContextMenu().apply { - arguments = Bundle().apply { putString(KEY_LABEL, label) } + arguments = Bundle().apply { putString(ARG_LABEL, label) } } } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SaveBrowserSearchDialogFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SaveBrowserSearchDialogFragment.kt index eef776c9af4d..40ebe3aa4527 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SaveBrowserSearchDialogFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SaveBrowserSearchDialogFragment.kt @@ -11,10 +11,9 @@ import androidx.fragment.app.setFragmentResult import com.google.android.material.snackbar.Snackbar import com.ichi2.anki.CardBrowser import com.ichi2.anki.CommonString -import com.ichi2.anki.R import com.ichi2.anki.browser.search.SavedSearch -import com.ichi2.anki.dialogs.SaveBrowserSearchDialogFragment.Companion.ARG_SEARCH_QUERY -import com.ichi2.anki.dialogs.SaveBrowserSearchDialogFragment.Companion.ARG_SEARCH_QUERY_NAME +import com.ichi2.anki.dialogs.SaveBrowserSearchDialogFragment.Companion.RESULT_SEARCH_QUERY +import com.ichi2.anki.dialogs.SaveBrowserSearchDialogFragment.Companion.RESULT_SEARCH_QUERY_NAME import com.ichi2.anki.launchCatchingTask import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.utils.input @@ -23,6 +22,7 @@ import com.ichi2.utils.positiveButton import com.ichi2.utils.show import com.ichi2.utils.title import timber.log.Timber +import com.ichi2.anki.common.android.R as CommonR /** * Dialog that allows the user to save searches made in [CardBrowser] to make them available for @@ -42,7 +42,7 @@ class SaveBrowserSearchDialogFragment : DialogFragment() { title(text = getString(CommonString.card_browser_list_my_searches_save)) positiveButton(CommonString.dialog_ok) negativeButton(CommonString.dialog_cancel) - setView(R.layout.dialog_generic_text_input) + setView(CommonR.layout.dialog_generic_text_input) }.input( hint = getString(CommonString.card_browser_list_my_searches_new_name), allowEmpty = false, @@ -53,8 +53,8 @@ class SaveBrowserSearchDialogFragment : DialogFragment() { setFragmentResult( REQUEST_SAVE_SEARCH, Bundle().apply { - putString(ARG_SEARCH_QUERY, searchQuery) - putCharSequence(ARG_SEARCH_QUERY_NAME, name) + putString(RESULT_SEARCH_QUERY, searchQuery) + putCharSequence(RESULT_SEARCH_QUERY_NAME, name) }, ) dialog.dismiss() @@ -67,12 +67,14 @@ class SaveBrowserSearchDialogFragment : DialogFragment() { /** * The actual search query that the user is saving to use later. */ - const val ARG_SEARCH_QUERY = "arg_search_query" + const val RESULT_SEARCH_QUERY = "arg_search_query" + + private const val ARG_SEARCH_QUERY = "arg_search_query" /** * The name given by the user to the saved search. */ - const val ARG_SEARCH_QUERY_NAME = "arg_search_query_name" + const val RESULT_SEARCH_QUERY_NAME = "arg_search_query_name" fun newInstance(searchQuery: String): SaveBrowserSearchDialogFragment = SaveBrowserSearchDialogFragment().apply { @@ -94,7 +96,7 @@ fun CardBrowser.registerSaveSearchHandler() { this, ) { _, bundle -> val savedSearchName = - bundle.getString(ARG_SEARCH_QUERY_NAME) + bundle.getString(RESULT_SEARCH_QUERY_NAME) if (savedSearchName.isNullOrEmpty()) { showSnackbar( CommonString.card_browser_list_my_searches_new_search_error_empty_name, @@ -105,7 +107,7 @@ fun CardBrowser.registerSaveSearchHandler() { val toSave = SavedSearch( name = savedSearchName, - query = bundle.getString(ARG_SEARCH_QUERY) ?: return@setFragmentResultListener, + query = bundle.getString(RESULT_SEARCH_QUERY) ?: return@setFragmentResultListener, ) launchCatchingTask { @@ -125,7 +127,7 @@ fun Fragment.registerSaveSearchHandler(onSaveSearch: (SavedSearch) -> Unit) { this, ) { _, bundle -> val savedSearchName = - bundle.getString(ARG_SEARCH_QUERY_NAME) + bundle.getString(RESULT_SEARCH_QUERY_NAME) if (savedSearchName.isNullOrEmpty()) { showSnackbar( CommonString.card_browser_list_my_searches_new_search_error_empty_name, @@ -137,7 +139,7 @@ fun Fragment.registerSaveSearchHandler(onSaveSearch: (SavedSearch) -> Unit) { val savedSearch = SavedSearch( name = savedSearchName, - query = bundle.getString(ARG_SEARCH_QUERY) ?: return@setFragmentResultListener, + query = bundle.getString(RESULT_SEARCH_QUERY) ?: return@setFragmentResultListener, ) onSaveSearch(savedSearch) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SavedBrowserSearchesDialogFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SavedBrowserSearchesDialogFragment.kt index bb007d5974b2..0883f6903375 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SavedBrowserSearchesDialogFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SavedBrowserSearchesDialogFragment.kt @@ -16,7 +16,7 @@ import com.ichi2.anki.browser.search.SavedSearches import com.ichi2.anki.browser.search.toMap import com.ichi2.anki.compat.CompatHelper.Companion.getSerializableCompat import com.ichi2.anki.databinding.ItemSavedSearchBinding -import com.ichi2.anki.dialogs.SavedBrowserSearchesDialogFragment.Companion.ARG_SAVED_SEARCH +import com.ichi2.anki.dialogs.SavedBrowserSearchesDialogFragment.Companion.RESULT_SAVED_SEARCH import com.ichi2.anki.dialogs.SavedBrowserSearchesDialogFragment.Companion.TYPE_SEARCH_REMOVED import com.ichi2.anki.dialogs.SavedBrowserSearchesDialogFragment.Companion.TYPE_SEARCH_SELECTED import com.ichi2.anki.launchCatchingTask @@ -51,8 +51,8 @@ class SavedBrowserSearchesDialogFragment : AnalyticsDialogFragment() { parentFragmentManager.setFragmentResult( REQUEST_SAVED_SEARCH_ACTION, Bundle().apply { - putInt(ARG_TYPE, TYPE_SEARCH_SELECTED) - putString(ARG_SAVED_SEARCH, searchName) + putInt(RESULT_SAVED_SEARCH_ACTION, TYPE_SEARCH_SELECTED) + putString(RESULT_SAVED_SEARCH, searchName) }, ) dismiss() @@ -77,8 +77,8 @@ class SavedBrowserSearchesDialogFragment : AnalyticsDialogFragment() { parentFragmentManager.setFragmentResult( REQUEST_SAVED_SEARCH_ACTION, Bundle().apply { - putInt(ARG_TYPE, TYPE_SEARCH_REMOVED) - putString(ARG_SAVED_SEARCH, searchName) + putInt(RESULT_SAVED_SEARCH_ACTION, TYPE_SEARCH_REMOVED) + putString(RESULT_SAVED_SEARCH, searchName) }, ) dialog?.dismiss() // Dismiss the root dialog @@ -127,14 +127,14 @@ class SavedBrowserSearchesDialogFragment : AnalyticsDialogFragment() { /** * The user given name for the saved search that can be used as an identifier. */ - const val ARG_SAVED_SEARCH = "arg_saved_search" + const val RESULT_SAVED_SEARCH = "arg_saved_search" /** * [Int] number identifying the type of action for the saved search specified by - * [ARG_SAVED_SEARCH]. Currently there are just two possible values [TYPE_SEARCH_SELECTED] + * [RESULT_SAVED_SEARCH]. Currently there are just two possible values [TYPE_SEARCH_SELECTED] * and [TYPE_SEARCH_REMOVED]. */ - const val ARG_TYPE = "arg_type" + const val RESULT_SAVED_SEARCH_ACTION = "arg_type" private const val ARG_SAVED_FILTERS = "arg_saved_filters" fun newInstance(savedFilters: List): SavedBrowserSearchesDialogFragment = @@ -156,8 +156,8 @@ fun CardBrowser.registerSavedSearchActionHandler(action: (Int, String?) -> Unit) SavedBrowserSearchesDialogFragment.REQUEST_SAVED_SEARCH_ACTION, this, ) { _, bundle -> - val type = bundle.getInt(SavedBrowserSearchesDialogFragment.ARG_TYPE) - val searchName = bundle.getString(ARG_SAVED_SEARCH) + val type = bundle.getInt(SavedBrowserSearchesDialogFragment.RESULT_SAVED_SEARCH_ACTION) + val searchName = bundle.getString(RESULT_SAVED_SEARCH) Timber.d("On user saved search selection named: %s", searchName) action(type, searchName) } @@ -172,8 +172,8 @@ fun Fragment.registerSavedSearchActionHandler(action: (ManageSavedSearchAction) SavedBrowserSearchesDialogFragment.REQUEST_SAVED_SEARCH_ACTION, this, ) { _, bundle -> - val type = bundle.getInt(SavedBrowserSearchesDialogFragment.ARG_TYPE) - val searchName = bundle.getString(SavedBrowserSearchesDialogFragment.ARG_SAVED_SEARCH) ?: return@setFragmentResultListener + val type = bundle.getInt(SavedBrowserSearchesDialogFragment.RESULT_SAVED_SEARCH_ACTION) + val searchName = bundle.getString(SavedBrowserSearchesDialogFragment.RESULT_SAVED_SEARCH) ?: return@setFragmentResultListener Timber.d("On user saved search selection named: %s", searchName) launchCatchingTask { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SchedulerUpgradeDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SchedulerUpgradeDialog.kt index 69761a278b69..2264b7a1141a 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SchedulerUpgradeDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SchedulerUpgradeDialog.kt @@ -3,9 +3,10 @@ package com.ichi2.anki.dialogs +import android.os.Bundle import android.view.KeyEvent import androidx.appcompat.app.AlertDialog -import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CommonString @@ -19,62 +20,60 @@ import com.ichi2.anki.utils.openUrl * This dialog is intended to be shown when the collection is using an outdated scheduler (v1), * and prevents interaction with the app until the upgrade is acknowledged or canceled. * - * @param activity The host activity used to show the dialog. - * @param onUpgrade Callback invoked when the user confirms the upgrade (via the positive button). - * @param onCancel Callback invoked when the dialog is canceled (via negative button or back press). + * Reports the decision to the current activity without retaining an activity-owned callback. */ -class SchedulerUpgradeDialog( - private val activity: AppCompatActivity, - private val onUpgrade: () -> Unit, - private val onCancel: (() -> Unit)? = null, -) { - fun showDialog() { - val dialog = - MaterialAlertDialogBuilder(activity) - .setTitle(CommonString.scheduler_upgrade_required_dialog_title) - .setMessage(TR.schedulingUpdateRequired()) - .setPositiveButton(CommonString.dialog_ok, null) - .setNegativeButton(CommonString.dialog_cancel, null) - .apply { - if (AdaptionUtil.hasWebBrowser(activity)) { - setNeutralButton(TR.schedulingUpdateMoreInfoButton(), null) - } - }.create() +class SchedulerUpgradeDialog : DialogFragment() { + override fun onCreateDialog(savedInstanceState: Bundle?): AlertDialog { + isCancelable = false + return MaterialAlertDialogBuilder(requireContext()) + .setTitle(CommonString.scheduler_upgrade_required_dialog_title) + .setMessage(TR.schedulingUpdateRequired()) + .setPositiveButton(CommonString.dialog_ok, null) + .setNegativeButton(CommonString.dialog_cancel, null) + .apply { + if (AdaptionUtil.hasWebBrowser(requireActivity())) { + setNeutralButton(TR.schedulingUpdateMoreInfoButton(), null) + } + }.create() + } - dialog.setCancelable(false) + override fun onStart() { + super.onStart() + val dialog = requireDialog() as AlertDialog dialog.setCanceledOnTouchOutside(false) - - fun dismissAndCancel() { - dialog.dismiss() - onCancel?.invoke() + dialog.getButton(AlertDialog.BUTTON_POSITIVE)?.setOnClickListener { + it.isEnabled = false // prevent multiple taps + reportDecision(upgrade = true) } - dialog.setOnShowListener { - dialog.getButton(AlertDialog.BUTTON_POSITIVE)?.setOnClickListener { - it.isEnabled = false // prevent multiple taps - onUpgrade.invoke() - dialog.dismiss() - } + dialog.getButton(AlertDialog.BUTTON_NEGATIVE)?.setOnClickListener { + reportDecision(upgrade = false) + } - dialog.getButton(AlertDialog.BUTTON_NEGATIVE)?.setOnClickListener { - dismissAndCancel() - } + dialog.getButton(AlertDialog.BUTTON_NEUTRAL)?.setOnClickListener { + requireActivity().openUrl(R.string.link_scheduler_upgrade_faq) + } - dialog.getButton(AlertDialog.BUTTON_NEUTRAL)?.setOnClickListener { - activity.openUrl(R.string.link_scheduler_upgrade_faq) + dialog.setOnKeyListener { _, keyCode, event -> + if (keyCode != KeyEvent.KEYCODE_BACK || event.action != KeyEvent.ACTION_UP) { + return@setOnKeyListener false } - dialog.setOnKeyListener { _, keyCode, event -> - if (keyCode != KeyEvent.KEYCODE_BACK || event.action != KeyEvent.ACTION_UP) { - return@setOnKeyListener false - } - - dismissAndCancel() - true - } + reportDecision(upgrade = false) + true } + } + + private fun reportDecision(upgrade: Boolean) { + val manager = parentFragmentManager + dismiss() + manager.setFragmentResult(REQUEST_SCHEDULER_UPGRADE, Bundle().apply { putBoolean(RESULT_UPGRADE, upgrade) }) + } - dialog.show() + companion object { + const val TAG = "schedulerUpgrade" + const val REQUEST_SCHEDULER_UPGRADE = "request_scheduler_upgrade" + const val RESULT_UPGRADE = "upgrade" } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SyncErrorDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SyncErrorDialog.kt index 64af9a440abc..341891a3e3e4 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SyncErrorDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/SyncErrorDialog.kt @@ -61,7 +61,7 @@ class SyncErrorDialog : AsyncDialogFragment() { /** The type of the sync error dialog*/ private val dialogType: Type - get() = Type.fromCode(requireArguments().getInt(SYNC_ERROR_DIALOG_TYPE_KEY)) + get() = Type.fromCode(requireArguments().getInt(ARG_DIALOG_TYPE)) override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = @@ -254,7 +254,7 @@ class SyncErrorDialog : AsyncDialogFragment() { CommonString.sync_conflict_remote_confirm_new, ) DIALOG_SYNC_CORRUPT_COLLECTION -> { - val syncMessage = requireArguments().getString(DIALOG_MESSAGE_KEY) + val syncMessage = requireArguments().getString(ARG_DIALOG_MESSAGE) val repairUrl = res().getString(R.string.repair_deck) val dialogMessage = res().getString(CommonString.sync_corrupt_database, repairUrl) joinSyncMessages(dialogMessage, syncMessage) @@ -262,10 +262,10 @@ class SyncErrorDialog : AsyncDialogFragment() { DIALOG_SYNC_CLOCK_OFF -> res().getString( CommonString.sync_clock_off_with_current_time, - requireArguments().getString(DIALOG_MESSAGE_KEY).orEmpty(), + requireArguments().getString(ARG_DIALOG_MESSAGE).orEmpty(), DateFormat.getDateTimeInstance().format(TimeManager.time.currentDate), ) - else -> requireArguments().getString(DIALOG_MESSAGE_KEY) + else -> requireArguments().getString(ARG_DIALOG_MESSAGE) } private fun joinSyncMessages( @@ -302,7 +302,7 @@ class SyncErrorDialog : AsyncDialogFragment() { override val dialogHandlerMessage: SyncErrorDialogMessageHandler get() { - val dialogMessage = requireArguments().getString(DIALOG_MESSAGE_KEY) + val dialogMessage = requireArguments().getString(ARG_DIALOG_MESSAGE) return SyncErrorDialogMessageHandler(dialogType, dialogMessage) } @@ -341,12 +341,12 @@ class SyncErrorDialog : AsyncDialogFragment() { /** * Key for the ordinal of the sync error in Type */ - const val SYNC_ERROR_DIALOG_TYPE_KEY = "dialogType" + const val ARG_DIALOG_TYPE = "dialogType" /** * Key for the message to display in the dialog */ - const val DIALOG_MESSAGE_KEY = "dialogMessage" + const val ARG_DIALOG_MESSAGE = "dialogMessage" /** * A set of dialogs belonging to AnkiActivity which deal with sync problems @@ -361,8 +361,8 @@ class SyncErrorDialog : AsyncDialogFragment() { ) = SyncErrorDialog().apply { arguments = Bundle().apply { - putInt(SYNC_ERROR_DIALOG_TYPE_KEY, dialogType.code) - putString(DIALOG_MESSAGE_KEY, dialogMessage) + putInt(ARG_DIALOG_TYPE, dialogType.code) + putString(ARG_DIALOG_MESSAGE, dialogMessage) } } } @@ -383,15 +383,15 @@ class SyncErrorDialog : AsyncDialogFragment() { what = this@SyncErrorDialogMessageHandler.what data = Bundle().apply { - putInt(SYNC_ERROR_DIALOG_TYPE_KEY, dialogType.code) - putString(DIALOG_MESSAGE_KEY, dialogMessage) + putInt(ARG_DIALOG_TYPE, dialogType.code) + putString(ARG_DIALOG_MESSAGE, dialogMessage) } } companion object { fun fromMessage(message: Message): SyncErrorDialogMessageHandler { - val dialogType = Type.fromCode(message.data.getInt(SYNC_ERROR_DIALOG_TYPE_KEY)) - val dialogMessage = message.data.getString(DIALOG_MESSAGE_KEY) + val dialogType = Type.fromCode(message.data.getInt(ARG_DIALOG_TYPE)) + val dialogMessage = message.data.getString(ARG_DIALOG_MESSAGE) return SyncErrorDialogMessageHandler(dialogType, dialogMessage) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/TtsPlaybackErrorDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/TtsPlaybackErrorDialog.kt index f9038af6eecc..c421a91904fd 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/TtsPlaybackErrorDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/TtsPlaybackErrorDialog.kt @@ -22,8 +22,9 @@ object TtsPlaybackErrorDialog { fragmentManager: FragmentManager, ttsTag: TTSTag?, ) { - Timber.i("Dialog is shown to guide users correctly to troubleshoot the Tts error: Missing voice error") activity.runOnUiThread { + if (showMissingEngineDialogIfNeeded(activity)) return@runOnUiThread + Timber.i("Displaying TTS Error: 'Language not supported'") AlertDialog.Builder(activity).show { setTitle(activity.getString(CommonString.tts_error_dialog_title)) setMessage(activity.getString(CommonString.tts_error_dialog_reason_text, TtsVoices.ttsEngine, ttsTag?.lang)) @@ -38,6 +39,26 @@ object TtsPlaybackErrorDialog { } } + /** + * Shows installation guidance if no TTS engine is installed. + * + * @return `true` if the dialog is shown or queued on the UI thread; `false` if an engine is installed. + */ + fun showMissingEngineDialogIfNeeded(activity: Activity): Boolean { + if (TtsVoices.hasInstalledEngine(activity)) return false + + Timber.w("no TTS engines installed") + activity.runOnUiThread { + AlertDialog.Builder(activity).show { + setTitle(CommonString.tts_no_engine_title) + setMessage(CommonString.tts_no_engine_message) + setPositiveButton(CommonString.dialog_ok, null) + setNeutralButton(CommonString.help) { _, _ -> activity.openUrl(R.string.link_faq_tts_no_engine) } + } + } + return true + } + private fun openSettings(activity: Activity) { try { Timber.i("Opening TextToSpeech engine settings to change the engine") diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyDialog.kt index b8a2216b11c3..64a2a7c96c21 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyDialog.kt @@ -10,13 +10,13 @@ import android.os.Bundle import android.os.Parcelable import android.text.InputFilter import android.util.TypedValue +import android.view.Gravity +import android.view.LayoutInflater import android.view.WindowManager import android.view.inputmethod.EditorInfo import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.FrameLayout -import android.widget.LinearLayout -import android.widget.ScrollView import android.widget.TextView import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting.Companion.PRIVATE @@ -25,9 +25,9 @@ import androidx.core.content.edit import androidx.core.view.isVisible import androidx.core.view.updatePadding import androidx.core.widget.doAfterTextChanged -import androidx.fragment.app.setFragmentResult import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.withResumed import anki.scheduler.CustomStudyDefaultsResponse import anki.scheduler.CustomStudyRequest.Cram.CramKind import anki.scheduler.copy @@ -44,42 +44,40 @@ import com.ichi2.anki.asyncIO import com.ichi2.anki.browser.search.CardState import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.common.preferences.sharedPrefs -import com.ichi2.anki.common.utils.annotation.KotlinCleanup +import com.ichi2.anki.common.utils.dp +import com.ichi2.anki.databinding.DialogCustomStudyMenuBinding import com.ichi2.anki.databinding.FragmentCustomStudyBinding -import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog.Companion.deferredDefaults import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog.ContextMenuOption.EXTEND_NEW import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog.ContextMenuOption.EXTEND_REV import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog.ContextMenuOption.STUDY_AHEAD import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog.ContextMenuOption.STUDY_FORGOT import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog.ContextMenuOption.STUDY_PREVIEW import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog.ContextMenuOption.STUDY_TAGS -import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog.CustomStudyDefaults.Companion.toDomainModel import com.ichi2.anki.dialogs.tags.TagsDialog -import com.ichi2.anki.dialogs.tags.TagsDialogListener.Companion.ON_SELECTED_TAGS_KEY -import com.ichi2.anki.dialogs.tags.TagsDialogListener.Companion.ON_SELECTED_TAGS__SELECTED_TAGS +import com.ichi2.anki.dialogs.tags.TagsDialogListener.Companion.REQUEST_SELECT_TAGS +import com.ichi2.anki.dialogs.tags.TagsDialogListener.Companion.RESULT_SELECTED_TAGS import com.ichi2.anki.launchCatchingTask +import com.ichi2.anki.libanki.Consts import com.ichi2.anki.libanki.DeckId import com.ichi2.anki.observability.undoableOp +import com.ichi2.anki.requireActivity import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.anki.ui.NonLeadingZeroInputFilter import com.ichi2.anki.ui.internationalization.sentenceCase import com.ichi2.anki.utils.ext.dismissAllDialogFragments import com.ichi2.anki.utils.ext.getIntOrNull -import com.ichi2.anki.utils.ext.sharedPrefs import com.ichi2.anki.utils.ext.showDialogFragment import com.ichi2.anki.withProgress -import com.ichi2.utils.cancelable import com.ichi2.utils.coMeasureTime import com.ichi2.utils.customView -import com.ichi2.utils.dp +import com.ichi2.utils.moveCursorToEnd import com.ichi2.utils.negativeButton import com.ichi2.utils.positiveButton -import com.ichi2.utils.setPaddingRelative import com.ichi2.utils.textAsIntOrNull import com.ichi2.utils.title import kotlinx.coroutines.Deferred import kotlinx.coroutines.Job -import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.launch import kotlinx.parcelize.Parcelize import net.ankiweb.rsdroid.BackendException import timber.log.Timber @@ -114,7 +112,6 @@ import timber.log.Timber * * @see TagLimitFragment */ -@KotlinCleanup("remove 'runBlocking' call'") class CustomStudyDialog : AnalyticsDialogFragment() { @VisibleForTesting(otherwise = PRIVATE) lateinit var binding: FragmentCustomStudyBinding @@ -135,11 +132,17 @@ class CustomStudyDialog : AnalyticsDialogFragment() { /** The search for cards to review ahead. Cancelled when the input changes, so only the latest input counts */ private var searchJob: Job? = null + /** Whether a menu availability check or transition is already in progress. */ + private var menuSelectionInProgress = false + + /** Defaults captured for this input dialog when its main menu finishes loading. */ + private lateinit var defaults: CustomStudyDefaults + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - parentFragmentManager.setFragmentResultListener(ON_SELECTED_TAGS_KEY, this) { _, bundle -> - val tagsToInclude = bundle.getStringArrayList(ON_SELECTED_TAGS__SELECTED_TAGS) ?: emptyList() - val option = selectedSubDialog ?: return@setFragmentResultListener + val option = selectedSubDialog ?: return + parentFragmentManager.setFragmentResultListener(REQUEST_SELECT_TAGS, this) { _, bundle -> + val tagsToInclude = bundle.getStringArrayList(RESULT_SELECTED_TAGS) ?: emptyList() val selectedCardStateIndex = viewModel.selectedCardStateIndex if (selectedCardStateIndex == AdapterView.INVALID_POSITION) return@setFragmentResultListener val kind = viewModel.selectedKind @@ -156,16 +159,36 @@ class CustomStudyDialog : AnalyticsDialogFragment() { tagsToInclude: List = emptyList(), tagsToExclude: List = emptyList(), ) { - requireActivity().launchCatchingTask( + // The activity owns this operation, which can outlive the dialog. + val activity = requireActivity(simpleName = true) + val fragmentManager = parentFragmentManager + val deckId = viewModel.deckId + val preferences = activity.sharedPrefs() + activity.launchCatchingTask( // net.ankiweb.rsdroid.BackendException: No cards matched the criteria you provided. // TODO (Backend#256: make this BackendCustomStudyException) skipCrashReport = { it is BackendException }, ) { - withProgress { + activity.withProgress { try { - customStudy(option, cardsAmount, kind, tagsToInclude, tagsToExclude) + val action = customStudy(deckId, option, cardsAmount, kind, tagsToInclude, tagsToExclude) + fragmentManager.setFragmentResult( + CustomStudyAction.REQUEST_KEY, + Bundle().apply { putInt(CustomStudyAction.RESULT_CUSTOM_STUDY_ACTION, action.ordinal) }, + ) + + // Save the default values (not in upstream). + when (option) { + STUDY_FORGOT -> preferences.edit { putInt("forgottenDays", cardsAmount) } + STUDY_AHEAD -> preferences.edit { putInt("aheadDays", cardsAmount) } + STUDY_PREVIEW -> preferences.edit { putInt("previewDays", cardsAmount) } + STUDY_TAGS -> preferences.edit { putInt("amountOfCards", cardsAmount) } + EXTEND_NEW, EXTEND_REV -> { + // The backend provides the default value. + } + } } finally { - requireActivity().dismissAllDialogFragments() + activity.dismissAllDialogFragments() } } } @@ -173,14 +196,17 @@ class CustomStudyDialog : AnalyticsDialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val option = selectedSubDialog - return if (option == null || !defaultsAreInitialized()) { + val ready = readyInitialization() + return if (option == null || (option.checkAvailability != null && ready?.deckId != viewModel.deckId)) { Timber.i("Showing Custom Study main menu") - deferredDefaults = loadCustomStudyDefaults() - // Select the specified deck - runBlocking { withCol { decks.select(viewModel.deckId) } } - buildContextMenu() + val initialization = loadInitialization() + deferredInitialization = initialization + buildContextMenu(initialization) } else { Timber.i("Showing Custom Study dialog: $option") + if (ready?.deckId == viewModel.deckId) { + defaults = ready.defaults + } buildInputDialog(option) } } @@ -189,53 +215,85 @@ class CustomStudyDialog : AnalyticsDialogFragment() { * Continues the custom study process by showing an input dialog where the user can enter an * amount specific to that type of custom study(eg. cards, days etc). */ - private suspend fun onMenuItemSelected(item: ContextMenuOption) { - // on a slow phone, 'extend limits' may be clicked before we know there's no new/review cards - // show 'no cards due' if this occurs - if (item.checkAvailability != null) { - val defaults = withProgress { deferredDefaults.await() } - if (!item.checkAvailability(defaults)) { - showSnackbar(getString((CommonString.studyoptions_no_cards_due))) + private suspend fun onMenuItemSelected( + menuDialog: Dialog, + item: ContextMenuOption, + defaults: CustomStudyDefaults, + onEmptyDeck: () -> Unit, + ) { + if (menuSelectionInProgress) return + menuSelectionInProgress = true + try { + // The deck may have changed since this menu loaded. + val isUnavailable = withProgress { viewModel.isDeckEmptyOrHidden() } + // The fragment can outlive this dialog and recreate it while the check is queued. + if ( + this.dialog !== menuDialog || + !menuDialog.isShowing || + !isResumed || + requireActivity().isFinishing || + parentFragmentManager.isStateSaved + ) { + return + } + if (isUnavailable) { + onEmptyDeck() + return + } + if (item.checkAvailability?.invoke(defaults) == false) { + showSnackbar(getString(CommonString.studyoptions_no_cards_due)) return } - } - val dialog: CustomStudyDialog = createSubDialog(viewModel.deckId, item) - requireActivity().showDialogFragment(dialog) + val dialog: CustomStudyDialog = createSubDialog(viewModel.deckId, item) + requireActivity().showDialogFragment(dialog) + } finally { + menuSelectionInProgress = false + } } - private fun buildContextMenu(): AlertDialog { - val customMenuView = ScrollView(requireContext()) - val container = - LinearLayout(requireContext()) - .apply { - orientation = LinearLayout.VERTICAL - setPaddingRelative(9.dp.toPx(requireContext())) + private fun buildContextMenu(initialization: Deferred): AlertDialog { + val dialog = + object : AlertDialog(requireActivity()) { + override fun onStop() { + // Native dismissal happens before DialogFragment receives its queued callback. + initialization.cancel() + super.onStop() } - customMenuView.addView( - container, - FrameLayout.LayoutParams( - FrameLayout.LayoutParams.MATCH_PARENT, - FrameLayout.LayoutParams.WRAP_CONTENT, - ), + } + val inflater = LayoutInflater.from(dialog.context) + val menuBinding = DialogCustomStudyMenuBinding.inflate(inflater) + val container = menuBinding.menuItems + dialog.setTitle(TR.sentenceCase.customStudy) + dialog.setCancelable(true) + dialog.setCanceledOnTouchOutside(true) + dialog.setView( + FrameLayout(dialog.context).apply { + addView( + menuBinding.root, + FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.WRAP_CONTENT, + ), + ) + }, ) + val ta = TypedValue() - requireContext().theme.resolveAttribute(android.R.attr.selectableItemBackground, ta, true) + dialog.context.theme.resolveAttribute(android.R.attr.selectableItemBackground, ta, true) - fun buildMenuItems() { + fun buildMenuItems( + defaults: CustomStudyDefaults, + onEmptyDeck: () -> Unit, + ) { ContextMenuOption.entries .map { option -> Pair( option, - // if there's no availability check, it's enabled - option.checkAvailability == null || - // if data hasn't loaded, defer the check and assume it's enabled - !deferredDefaults.isCompleted || - // if unavailable, disable the item - option.checkAvailability(deferredDefaults.getCompleted()), + option.checkAvailability?.invoke(defaults) != false, ) }.forEach { (menuItem, isItemEnabled) -> - (layoutInflater.inflate(android.R.layout.simple_list_item_1, container, false) as TextView) + (inflater.inflate(android.R.layout.simple_list_item_1, container, false) as TextView) .apply { updatePadding( top = 12.dp.toPx(requireContext()), @@ -246,30 +304,41 @@ class CustomStudyDialog : AnalyticsDialogFragment() { setBackgroundResource(ta.resourceId) setTextAppearance(android.R.style.TextAppearance_Material_Body1) setOnClickListener { - launchCatchingTask { onMenuItemSelected(menuItem) } + launchCatchingTask { + onMenuItemSelected(dialog, menuItem, defaults, onEmptyDeck) + } } }.also { container.addView(it) } } } - buildMenuItems() + fun render(state: CustomStudyInitialization) { + container.removeAllViews() + menuBinding.progressBar.isVisible = state is CustomStudyInitialization.Loading + menuBinding.menuItems.isVisible = state is CustomStudyInitialization.Ready + when (state) { + CustomStudyInitialization.Loading -> Unit + CustomStudyInitialization.Empty -> + lifecycleScope.launch { + lifecycle.withResumed { + val host = activity ?: return@withResumed + if (!dialog.isShowing || host.isFinishing || parentFragmentManager.isStateSaved) return@withResumed + dismiss() + host.showSnackbar(CommonString.empty_deck) + } + } + is CustomStudyInitialization.Ready -> buildMenuItems(state.defaults) { render(CustomStudyInitialization.Empty) } + } + } - // add a continuation if 'defaults' was not loaded - if (!deferredDefaults.isCompleted) { + render(CustomStudyInitialization.Loading) + dialog.setOnShowListener { launchCatchingTask { - Timber.d("awaiting 'defaults' continuation") - deferredDefaults.await() - container.removeAllViews() - buildMenuItems() + render(initialization.await()) } } - return AlertDialog - .Builder(requireActivity()) - .title(text = TR.sentenceCase.customStudy) - .cancelable(true) - .customView(customMenuView) - .create() + return dialog } /** @@ -278,7 +347,6 @@ class CustomStudyDialog : AnalyticsDialogFragment() { */ @NeedsTest("17757: fragment not dismissed before result is output") private fun buildInputDialog(contextMenuOption: ContextMenuOption): AlertDialog { - require(deferredDefaults.isCompleted || selectedSubDialog!!.checkAvailability == null) /* TODO: Try to change to a standard input dialog (currently the thing holding us back is having the extra TODO: hint line for the number of cards available, and having the pre-filled text selected by default) @@ -288,10 +356,19 @@ class CustomStudyDialog : AnalyticsDialogFragment() { @SuppressLint("InflateParams") binding = FragmentCustomStudyBinding.inflate(requireActivity().layoutInflater) - binding.detailsText1.text = text1 + val isExtendLimits = contextMenuOption == EXTEND_NEW || contextMenuOption == EXTEND_REV // 'review ahead' has a dialog title, so the empty label would only add a blank line - binding.detailsText1.isVisible = contextMenuOption != STUDY_AHEAD && contextMenuOption != STUDY_PREVIEW + binding.detailsText1.isVisible = + contextMenuOption != STUDY_AHEAD && + contextMenuOption != STUDY_PREVIEW && + !isExtendLimits binding.detailsText2.text = text2 + binding.detailsAvailableCards.text = text1 + binding.detailsAvailableCards.isVisible = isExtendLimits + binding.detailsDecrementButton.isVisible = isExtendLimits + binding.detailsIncrementButton.isVisible = isExtendLimits + binding.detailsDecrementButton.setOnClickListener { stepUserInputValue(-1) } + binding.detailsIncrementButton.setOnClickListener { stepUserInputValue(1) } binding.cardsStateSelectorLayout.isVisible = contextMenuOption == STUDY_TAGS binding.cardsStateSelector.apply { @@ -322,18 +399,19 @@ class CustomStudyDialog : AnalyticsDialogFragment() { setAdapterAndSelection(cardStates, viewModel.selectedCardStateIndex) } binding.detailsEditText2.apply { - setText(defaultValue) + setText(viewModel.userInputText ?: defaultValue) // Give EditText focus and show keyboard setSelectAllOnFocus(true) requestFocus() // a user may enter a negative value when extending limits - if (contextMenuOption == EXTEND_NEW || contextMenuOption == EXTEND_REV) { + if (isExtendLimits) { inputType = EditorInfo.TYPE_CLASS_NUMBER or EditorInfo.TYPE_NUMBER_FLAG_SIGNED + gravity = Gravity.CENTER } if (contextMenuOption == STUDY_AHEAD || contextMenuOption == STUDY_PREVIEW) { inputType = EditorInfo.TYPE_CLASS_NUMBER filters += arrayOf(InputFilter.LengthFilter(5), NonLeadingZeroInputFilter) - setSuffixText(defaultValue.toInt()) + setSuffixText(userInputValue ?: defaultValue.toInt()) } } val positiveBtnLabel = @@ -341,6 +419,8 @@ class CustomStudyDialog : AnalyticsDialogFragment() { TR.sentenceCase.chooseTags } else if (contextMenuOption == STUDY_AHEAD || contextMenuOption == STUDY_PREVIEW) { getString(CommonString.dialog_positive_create) + } else if (isExtendLimits) { + getString(CommonString.custom_study_increase) } else { getString(CommonString.dialog_ok) } @@ -355,6 +435,8 @@ class CustomStudyDialog : AnalyticsDialogFragment() { .apply { if (contextMenuOption == STUDY_AHEAD || contextMenuOption == STUDY_PREVIEW) { title(text = contextMenuOption.getTitle(resources)) + } else if (isExtendLimits) { + title(text = getString(CommonString.custom_study_extend_limits_title)) } }.customView( view = binding.root, @@ -425,21 +507,12 @@ class CustomStudyDialog : AnalyticsDialogFragment() { } launchCustomStudy(contextMenuOption, n) } - if (contextMenuOption == STUDY_AHEAD || contextMenuOption == STUDY_PREVIEW) { - // the stored default may match no cards - searchJob = launchCatchingTask { updateCreateButtonState(dialog, userInputValue) } - } + validateInput(dialog, contextMenuOption) } binding.detailsEditText2.doAfterTextChanged { - val value = userInputValue - if (contextMenuOption != STUDY_AHEAD && contextMenuOption != STUDY_PREVIEW) { - dialog.positiveButton.isEnabled = value != null && value != 0 - return@doAfterTextChanged - } - value?.let { setSuffixText(it) } - searchJob?.cancel() - searchJob = launchCatchingTask { updateCreateButtonState(dialog, value) } + viewModel.userInputText = it?.toString() + validateInput(dialog, contextMenuOption) } // Show soft keyboard @@ -447,15 +520,50 @@ class CustomStudyDialog : AnalyticsDialogFragment() { return dialog } + private fun validateInput( + dialog: AlertDialog, + contextMenuOption: ContextMenuOption, + ) { + val rawText = binding.detailsEditText2.text?.toString() ?: "" + val value = userInputValue + val range = contextMenuOption.validRange + + if (contextMenuOption == STUDY_AHEAD || contextMenuOption == STUDY_PREVIEW) { + value?.let { setSuffixText(it) } + searchJob?.cancel() + searchJob = launchCatchingTask { updateCreateButtonState(dialog, value) } + return + } + + val isValid = value != null && value != 0 && value in range + dialog.positiveButton.isEnabled = isValid + + binding.detailsEditText2Layout.error = + when { + rawText.isEmpty() || rawText == "-" -> null + value == null || value > range.last -> getString(CommonString.maximum_value_is, range.last) + value < range.first -> getString(CommonString.minimum_value_is, range.first) + else -> null + } + } + /** Sets the suffix of the days input: `[1] day`, `[3] days` */ private fun setSuffixText(days: Int) { binding.detailsEditText2Layout.suffixText = resources.getQuantityString(CommonPlurals.set_due_date_label_suffix, days) } + private fun stepUserInputValue(delta: Int) { + val range = selectedSubDialog?.validRange ?: return + val newValue = ((userInputValue ?: 0) + delta).coerceIn(range) + binding.detailsEditText2.setText(newValue.toString()) + binding.detailsEditText2.moveCursorToEnd() + } + /** - * Whether the deck has new cards added in the last [days] days. + * Whether there are new cards added within [days] days in the deck for previewing. * - * Upstream: https://github.com/ankitects/anki/blob/618c1787c83ac9baace0527a2f572631b86b7aee/qt/aqt/customstudy.py + * Mirrors the upstream logic: + * [https://github.com/ankitects/anki/blob/main/qt/aqt/customstudy.py](https://github.com/ankitects/anki/blob/main/qt/aqt/customstudy.py) */ private suspend fun hasPreviewCards(days: Int): Boolean = withCol { @@ -468,13 +576,21 @@ class CustomStudyDialog : AnalyticsDialogFragment() { findCards(buildSearchString(search)).isNotEmpty() } - /** Enables 'Create' only if some cards would be reviewed ahead by [days] */ + /** Enables 'Create' only if some cards would be reviewed ahead/previewed by [days] */ private suspend fun updateCreateButtonState( dialog: AlertDialog, days: Int?, ) { - if (days == null || days == 0) { - binding.detailsEditText2Layout.error = if (days == 0) getString(CommonString.minimum_value_is, 1) else null + val range = selectedSubDialog?.validRange ?: ContextMenuOption.STUDY_AHEAD.validRange + val rawText = binding.detailsEditText2.text?.toString() ?: "" + if (days == null || days !in range) { + binding.detailsEditText2Layout.error = + when { + rawText.isEmpty() -> null + days == null || days > range.last -> getString(CommonString.maximum_value_is, range.last) + days < range.first -> getString(CommonString.minimum_value_is, range.first) + else -> null + } dialog.positiveButton.isEnabled = false return } @@ -502,17 +618,18 @@ class CustomStudyDialog : AnalyticsDialogFragment() { // TODO cram kind and the included/excluded tags lists are only relevant for STUDY_TAGS and // should be included in the option to not leak in the method's api private suspend fun customStudy( + deckId: DeckId, contextMenuOption: ContextMenuOption, userEntry: Int, cramKind: CramKind, tagsSelectedForInclude: List, tagsSelectedForExclude: List, - ) { + ): CustomStudyAction { Timber.i("Custom study: $contextMenuOption; input = $userEntry") val request = customStudyRequest { - deckId = viewModel.deckId + this.deckId = deckId when (contextMenuOption) { EXTEND_NEW -> newLimitDelta = userEntry EXTEND_REV -> reviewLimitDelta = userEntry @@ -533,23 +650,9 @@ class CustomStudyDialog : AnalyticsDialogFragment() { } undoableOp { sched.customStudy(request) } - val action = - when (contextMenuOption) { - EXTEND_NEW, EXTEND_REV -> CustomStudyAction.EXTEND_STUDY_LIMITS - STUDY_FORGOT, STUDY_AHEAD, STUDY_PREVIEW, STUDY_TAGS -> CustomStudyAction.CUSTOM_STUDY_SESSION - } - - setFragmentResult(CustomStudyAction.REQUEST_KEY, Bundle().apply { putInt(CustomStudyAction.BUNDLE_KEY, action.ordinal) }) - - // save the default values (not in upstream) - when (contextMenuOption) { - STUDY_FORGOT -> sharedPrefs().edit { putInt("forgottenDays", userEntry) } - STUDY_AHEAD -> sharedPrefs().edit { putInt("aheadDays", userEntry) } - STUDY_PREVIEW -> sharedPrefs().edit { putInt("previewDays", userEntry) } - EXTEND_NEW, EXTEND_REV -> { - // Nothing to do in ankidroid. The default value is provided by the backend. - } - STUDY_TAGS -> sharedPrefs().edit { putInt("amountOfCards", userEntry) } + return when (contextMenuOption) { + EXTEND_NEW, EXTEND_REV -> CustomStudyAction.EXTEND_STUDY_LIMITS + STUDY_FORGOT, STUDY_AHEAD, STUDY_PREVIEW, STUDY_TAGS -> CustomStudyAction.CUSTOM_STUDY_SESSION } } @@ -558,12 +661,14 @@ class CustomStudyDialog : AnalyticsDialogFragment() { * * This method may be slow (> 1s) */ - private fun loadCustomStudyDefaults() = - lifecycleScope.asyncIO { + private fun loadInitialization(): Deferred { + val host = requireActivity() + return lifecycleScope.asyncIO { coMeasureTime("loadCustomStudyDefaults") { - withCol { sched.customStudyDefaults(viewModel.deckId).toDomainModel() } + viewModel.initialize { !host.isFinishing } } } + } /** * Line 1 of the number entry dialog @@ -575,8 +680,8 @@ class CustomStudyDialog : AnalyticsDialogFragment() { private val text1: String get() = when (selectedSubDialog) { - EXTEND_NEW -> deferredDefaults.getCompleted().labelForNewQueueAvailable() - EXTEND_REV -> deferredDefaults.getCompleted().labelForReviewQueueAvailable() + EXTEND_NEW -> defaults.labelForNewQueueAvailable() + EXTEND_REV -> defaults.labelForReviewQueueAvailable() STUDY_FORGOT, STUDY_AHEAD, STUDY_PREVIEW, @@ -590,8 +695,8 @@ class CustomStudyDialog : AnalyticsDialogFragment() { get() { val res = resources return when (selectedSubDialog) { - EXTEND_NEW -> res.getString(CommonString.custom_study_new_extend) - EXTEND_REV -> res.getString(CommonString.custom_study_rev_extend) + EXTEND_NEW -> TR.customStudyIncreaseTodaysNewCardLimitBy() + EXTEND_REV -> TR.customStudyIncreaseTodaysReviewLimitBy() STUDY_FORGOT -> res.getString(CommonString.custom_study_forgotten) STUDY_AHEAD -> res.getString(CommonString.custom_study_ahead_description) STUDY_PREVIEW -> res.getString(CommonString.custom_study_preview) @@ -609,16 +714,8 @@ class CustomStudyDialog : AnalyticsDialogFragment() { get() { val prefs = requireActivity().sharedPrefs() return when (selectedSubDialog) { - EXTEND_NEW -> - deferredDefaults - .getCompleted() - .extendNew.initialValue - .toString() - EXTEND_REV -> - deferredDefaults - .getCompleted() - .extendReview.initialValue - .toString() + EXTEND_NEW -> defaults.extendNew.initialValue.toString() + EXTEND_REV -> defaults.extendReview.initialValue.toString() STUDY_FORGOT -> prefs.getInt("forgottenDays", 1).toString() STUDY_AHEAD -> prefs.getInt("aheadDays", 1).toString() STUDY_PREVIEW -> prefs.getInt("previewDays", 1).toString() @@ -640,11 +737,11 @@ class CustomStudyDialog : AnalyticsDialogFragment() { companion object { const val REQUEST_KEY = "CustomStudyDialog" - const val BUNDLE_KEY = "action" + const val RESULT_CUSTOM_STUDY_ACTION = "action" /** Extracts a [CustomStudyAction] from a [Bundle] */ fun fromBundle(bundle: Bundle): CustomStudyAction = - bundle.getInt(CustomStudyAction.BUNDLE_KEY).let { actionOrdinal -> + bundle.getInt(CustomStudyAction.RESULT_CUSTOM_STUDY_ACTION).let { actionOrdinal -> entries.first { it.ordinal == actionOrdinal } } } @@ -658,25 +755,34 @@ class CustomStudyDialog : AnalyticsDialogFragment() { @VisibleForTesting(otherwise = PRIVATE) enum class ContextMenuOption( val getTitle: Resources.() -> String, + val validRange: IntRange, val checkAvailability: ((CustomStudyDefaults) -> Boolean)? = null, ) { /** Increase today's new card limit */ - EXTEND_NEW({ TR.customStudyIncreaseTodaysNewCardLimit() }, checkAvailability = { it.extendNew.isUsable }), + EXTEND_NEW( + { TR.customStudyIncreaseTodaysNewCardLimit() }, + validRange = -Consts.DYN_MAX_SIZE..Consts.DYN_MAX_SIZE, + checkAvailability = { it.extendNew.isUsable }, + ), /** Increase today's review card limit */ - EXTEND_REV({ TR.customStudyIncreaseTodaysReviewCardLimit() }, checkAvailability = { it.extendReview.isUsable }), + EXTEND_REV( + { TR.customStudyIncreaseTodaysReviewCardLimit() }, + validRange = -Consts.DYN_MAX_SIZE..Consts.DYN_MAX_SIZE, + checkAvailability = { it.extendReview.isUsable }, + ), /** Review forgotten cards */ - STUDY_FORGOT({ TR.customStudyReviewForgottenCards() }), + STUDY_FORGOT({ TR.customStudyReviewForgottenCards() }, validRange = 1..FORGOT_MAX_DAYS), /** Review ahead */ - STUDY_AHEAD({ TR.customStudyReviewAhead() }), + STUDY_AHEAD({ TR.customStudyReviewAhead() }, validRange = 1..Consts.DYN_MAX_SIZE), /** Preview new cards */ - STUDY_PREVIEW({ TR.customStudyPreviewNewCards() }), + STUDY_PREVIEW({ TR.customStudyPreviewNewCards() }, validRange = 1..Consts.DYN_MAX_SIZE), /** Limit to particular tags */ - STUDY_TAGS({ TR.customStudyStudyByCardStateOrTag() }), + STUDY_TAGS({ TR.customStudyStudyByCardStateOrTag() }, validRange = 1..Consts.DYN_MAX_SIZE), } @Parcelize @@ -804,14 +910,20 @@ class CustomStudyDialog : AnalyticsDialogFragment() { * Singleton; initialized when the main screen is loaded * This exists so we don't need to pass an unbounded object between fragments */ - private lateinit var deferredDefaults: Deferred + private lateinit var deferredInitialization: Deferred /** - * Whether [deferredDefaults] is initialized; false on restoring the dialog from process - * death + * Completed defaults shared with subdialogs. Restore the main menu if the loading + * dialog was cancelled or its process died. */ - // This exists as `isInitialized` can't be checked in an instance of CustomStudyDialog - private fun defaultsAreInitialized(): Boolean = ::deferredDefaults.isInitialized + private fun readyInitialization(): CustomStudyInitialization.Ready? { + if (!::deferredInitialization.isInitialized || !deferredInitialization.isCompleted || + deferredInitialization.isCancelled + ) { + return null + } + return deferredInitialization.getCompleted() as? CustomStudyInitialization.Ready + } /** * Creates an instance of the Custom Study Dialog: a user can select a custom study type @@ -820,7 +932,7 @@ class CustomStudyDialog : AnalyticsDialogFragment() { CustomStudyDialog().apply { arguments = Bundle().apply { - putLong(CustomStudyViewModel.KEY_DID, deckId) + putLong(CustomStudyViewModel.ARG_DECK_ID, deckId) } } @@ -837,11 +949,13 @@ class CustomStudyDialog : AnalyticsDialogFragment() { CustomStudyDialog().apply { arguments = Bundle().apply { - putLong(CustomStudyViewModel.KEY_DID, deckId) + putLong(CustomStudyViewModel.ARG_DECK_ID, deckId) putInt(ARG_SUB_DIALOG_ID, contextMenuAttribute.ordinal) } } + const val FORGOT_MAX_DAYS = 30 + /** * (optional) Key for the ordinal of the [ContextMenuOption] to display. * @see CustomStudyDialog.selectedSubDialog diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyViewModel.kt index 4e84e06cad03..440c77a715d4 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyViewModel.kt @@ -6,9 +6,16 @@ import android.widget.AdapterView import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import anki.scheduler.CustomStudyRequest.Cram.CramKind +import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog.CustomStudyCardState +import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog.CustomStudyDefaults +import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog.CustomStudyDefaults.Companion.toDomainModel +import com.ichi2.anki.libanki.Collection import com.ichi2.anki.libanki.Deck import com.ichi2.anki.libanki.DeckId +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.currentCoroutineContext +import kotlinx.coroutines.ensureActive /** * @see CustomStudyDialog @@ -27,9 +34,43 @@ class CustomStudyViewModel( savedStateHandle[KEY_CARDS_SELECTION_INDEX] = value } + var userInputText: String? + get() = savedStateHandle[KEY_USER_INPUT_TEXT] + set(value) { + savedStateHandle[KEY_USER_INPUT_TEXT] = value + } + /** Required [DeckId] of the [Deck] for which the custom study session is being built. */ val deckId: DeckId - get() = savedStateHandle.get(KEY_DID) ?: error("Deck id was not provided!") + get() = savedStateHandle.get(ARG_DECK_ID) ?: error("Deck id was not provided!") + + /** + * Check the requested deck before loading defaults or changing selection. + * [canSelectDeck] is checked on the collection queue immediately before selecting. + */ + suspend fun initialize(canSelectDeck: () -> Boolean = { true }): CustomStudyInitialization { + val context = currentCoroutineContext() + return withCol { + if (!hasCustomStudyCards()) { + CustomStudyInitialization.Empty + } else { + val defaults = sched.customStudyDefaults(deckId).toDomainModel() + // The dialog may have closed while the backend was loading defaults. + context.ensureActive() + if (!canSelectDeck()) throw CancellationException("Custom Study initialization is no longer needed") + decks.select(deckId) + CustomStudyInitialization.Ready(deckId, defaults) + } + } + } + + suspend fun isDeckEmptyOrHidden(): Boolean = withCol { !hasCustomStudyCards() } + + private fun Collection.hasCustomStudyCards(): Boolean = + // Check listing first: counting child-deck cards requires the deck to exist. + // Default may also be hidden while cardCount still includes its borrowed cards. + sched.deckTree(includeCounts = false).find(deckId) != null && + decks.cardCount(deckId, includeSubdecks = true) > 0 /* * Translates the user's selection into a specific study type. @@ -48,7 +89,19 @@ class CustomStudyViewModel( /** * Required key for a [DeckId] which [CustomStudyDialog] expects to receive as an argument. */ - const val KEY_DID = "key_did" + const val ARG_DECK_ID = "key_did" private const val KEY_CARDS_SELECTION_INDEX = "key_cards_selection_index" + private const val KEY_USER_INPUT_TEXT = "key_user_input_text" } } + +sealed interface CustomStudyInitialization { + data object Loading : CustomStudyInitialization + + data object Empty : CustomStudyInitialization + + data class Ready( + val deckId: DeckId, + val defaults: CustomStudyDefaults, + ) : CustomStudyInitialization +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/TagLimitFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/TagLimitFragment.kt index 3260ebd6f8e8..228b73280737 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/TagLimitFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/TagLimitFragment.kt @@ -98,8 +98,8 @@ class TagLimitFragment : DialogFragment() { setFragmentResult( REQUEST_CUSTOM_STUDY_TAGS, Bundle().apply { - putStringArrayList(KEY_INCLUDED_TAGS, ArrayList(tagsToInclude)) - putStringArrayList(KEY_EXCLUDED_TAGS, ArrayList(tagsToExclude)) + putStringArrayList(RESULT_INCLUDED_TAGS, ArrayList(tagsToInclude)) + putStringArrayList(RESULT_EXCLUDED_TAGS, ArrayList(tagsToExclude)) }, ) dismiss() @@ -133,8 +133,8 @@ class TagLimitFragment : DialogFragment() { companion object { const val TAG = "TagLimitFragment" const val REQUEST_CUSTOM_STUDY_TAGS = "request_custom_study_tags" - const val KEY_INCLUDED_TAGS = "key_included_tags" - const val KEY_EXCLUDED_TAGS = "key_excluded_tags" + const val RESULT_INCLUDED_TAGS = "key_included_tags" + const val RESULT_EXCLUDED_TAGS = "key_excluded_tags" private const val ARG_DECK_ID = "arg_deck_id" fun newInstance(deckId: DeckId) = diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/help/HelpDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/help/HelpDialog.kt index 8e0ad1126150..2a5bca2ebfed 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/help/HelpDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/help/HelpDialog.kt @@ -21,6 +21,7 @@ import com.ichi2.anki.ankiActivity import com.ichi2.anki.common.analytics.Analytics import com.ichi2.anki.common.analytics.AnalyticsEvent.LinkClicked import com.ichi2.anki.common.analytics.LinkAction +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.databinding.DialogHelpBinding import com.ichi2.anki.databinding.FragmentHelpPageBinding import com.ichi2.anki.databinding.ItemHelpEntryBinding @@ -31,9 +32,9 @@ import com.ichi2.anki.dialogs.help.HelpItem.Action.SendReport import com.ichi2.anki.utils.ext.setCompoundDrawablesRelativeWithIntrinsicBoundsKt import com.ichi2.utils.createAndApply import com.ichi2.utils.customView -import com.ichi2.utils.dp import com.ichi2.utils.title import dev.androidbroadcast.vbpd.viewBinding +import com.ichi2.anki.common.android.R as CommonR /** * [DialogFragment] responsible for showing the help/support menus. @@ -82,7 +83,7 @@ class HelpDialog : AnalyticsDialogFragment() { val selectedItem = BundleCompat.getParcelable( from, - ARG_SELECTED_MENU_ITEM, + RESULT_SELECTED_MENU_ITEM, HelpItem::class.java, ) ?: return when (selectedItem.action) { @@ -173,7 +174,7 @@ internal fun Fragment.requireArgsHelpEntries(): Array { internal const val ARG_MENU_ITEMS = "arg_menu_items" internal const val REQUEST_HELP_PAGE = "request_help_page" -internal const val ARG_SELECTED_MENU_ITEM = " selected_menu_item" +internal const val RESULT_SELECTED_MENU_ITEM = " selected_menu_item" /** * This fragment is responsible for showing a list of menu items in the application's [HelpDialog]. @@ -196,7 +197,7 @@ class HelpPageFragment : Fragment(R.layout.fragment_help_page) { Analytics.send(LinkClicked(menuItem.analyticsId)) parentFragmentManager.setFragmentResult( REQUEST_HELP_PAGE, - Bundle().apply { putParcelable(ARG_SELECTED_MENU_ITEM, menuItem) }, + Bundle().apply { putParcelable(RESULT_SELECTED_MENU_ITEM, menuItem) }, ) } binding.pageContent.addView(this) @@ -222,7 +223,7 @@ internal val mainHelpMenuItems = ), HelpItem( titleResId = CommonString.help_title_get_help, - iconResId = R.drawable.ic_help_black_24dp, + iconResId = CommonR.drawable.ic_help_black_24dp, analyticsId = LinkAction.OPENED_GET_HELP, id = 2, ), @@ -274,7 +275,7 @@ internal val supportMenuItems = ), HelpItem( titleResId = CommonString.help_item_support_other_ankidroid, - iconResId = R.drawable.ic_help_black_24dp, + iconResId = CommonR.drawable.ic_help_black_24dp, analyticsId = LinkAction.OPENED_OTHER, id = 9, action = OpenUrlResource(R.string.link_contribution), @@ -310,7 +311,7 @@ internal val childHelpMenuItems = ), HelpItem( titleResId = CommonString.help_item_ankidroid_faq, - iconResId = R.drawable.ic_help_black_24dp, + iconResId = CommonR.drawable.ic_help_black_24dp, analyticsId = LinkAction.OPENED_ANKIDROID_FAQ, id = 102, parentId = 1, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsArrayAdapter.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsArrayAdapter.kt index 83e4d4ada92e..263bc8f55dd1 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsArrayAdapter.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsArrayAdapter.kt @@ -25,6 +25,7 @@ import com.ichi2.utils.TypedFilter import java.util.Locale import java.util.Stack import java.util.TreeSet +import com.ichi2.anki.common.android.R as CommonR /** * @param tags A reference to the [TagsList] @@ -412,7 +413,7 @@ class TagsArrayAdapter( // For example, display some icon if the node is a leaf? (assets required) when (node.isExpanded) { true -> button.setBackgroundResource(R.drawable.ic_expand_more_black_24dp_xml) - false -> button.setBackgroundResource(R.drawable.ic_baseline_chevron_right_24) + false -> button.setBackgroundResource(CommonR.drawable.ic_baseline_chevron_right_24) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsDialog.kt index 9285a7a87666..4684cd0f6de8 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsDialog.kt @@ -332,7 +332,7 @@ class TagsDialog : AnalyticsDialogFragment { val toolbarAddItem = toolbar.menu.findItem(R.id.tags_dialog_action_add) val drawable = ContextCompat.getDrawable(requireContext(), CommonR.drawable.ic_add) - drawable?.setTint(requireContext().getColor(R.color.white)) + drawable?.setTint(requireContext().getColor(CommonR.color.white)) toolbarAddItem.icon = drawable toolbarAddItem.setOnMenuItemClickListener { @@ -399,7 +399,7 @@ class TagsDialog : AnalyticsDialogFragment { title(text = getString(CommonString.add_tag)) positiveButton(CommonString.menu_add) negativeButton(CommonString.dialog_cancel) - setView(R.layout.dialog_generic_text_input) + setView(CommonR.layout.dialog_generic_text_input) }.input( hint = TR.actionsName().dropLastWhile { it == ':' }, inputType = InputType.TYPE_CLASS_TEXT, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsDialogListener.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsDialogListener.kt index 3de706901c52..3c2c2efd8e5c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsDialogListener.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsDialogListener.kt @@ -30,14 +30,14 @@ interface TagsDialogListener { fun F.registerFragmentResultReceiver() where F : Fragment, F : TagsDialogListener { parentFragmentManager.setFragmentResultListener( - ON_SELECTED_TAGS_KEY, + REQUEST_SELECT_TAGS, this, ) { _: String?, bundle: Bundle -> val selectedTags: List = - bundle.getStringArrayList(ON_SELECTED_TAGS__SELECTED_TAGS)!! + bundle.getStringArrayList(RESULT_SELECTED_TAGS)!! val indeterminateTags: List = - bundle.getStringArrayList(ON_SELECTED_TAGS__INDETERMINATE_TAGS)!! - val option = bundle.getSerializableCompat(ON_SELECTED_TAGS__OPTION)!! + bundle.getStringArrayList(RESULT_INDETERMINATE_TAGS)!! + val option = bundle.getSerializableCompat(RESULT_CARD_STATE_FILTER)!! onSelectedTags(selectedTags, indeterminateTags, option) } } @@ -52,17 +52,17 @@ interface TagsDialogListener { ) { val bundle = Bundle().apply { - putStringArrayList(ON_SELECTED_TAGS__SELECTED_TAGS, ArrayList(selectedTags)) - putStringArrayList(ON_SELECTED_TAGS__INDETERMINATE_TAGS, ArrayList(indeterminateTags)) - putSerializable(ON_SELECTED_TAGS__OPTION, stateFilter) + putStringArrayList(RESULT_SELECTED_TAGS, ArrayList(selectedTags)) + putStringArrayList(RESULT_INDETERMINATE_TAGS, ArrayList(indeterminateTags)) + putSerializable(RESULT_CARD_STATE_FILTER, stateFilter) } - fragmentManager.setFragmentResult(ON_SELECTED_TAGS_KEY, bundle) + fragmentManager.setFragmentResult(REQUEST_SELECT_TAGS, bundle) } } - const val ON_SELECTED_TAGS_KEY = "ON_SELECTED_TAGS_KEY" - const val ON_SELECTED_TAGS__SELECTED_TAGS = "SELECTED_TAGS" - const val ON_SELECTED_TAGS__INDETERMINATE_TAGS = "INDETERMINATE_TAGS" - const val ON_SELECTED_TAGS__OPTION = "OPTION" + const val REQUEST_SELECT_TAGS = "ON_SELECTED_TAGS_KEY" + const val RESULT_SELECTED_TAGS = "SELECTED_TAGS" + const val RESULT_INDETERMINATE_TAGS = "INDETERMINATE_TAGS" + const val RESULT_CARD_STATE_FILTER = "OPTION" } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsList.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsList.kt index 07c928de51d4..cc9787ef021c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsList.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsList.kt @@ -55,17 +55,23 @@ class TagsList( indeterminateTags = TreeSet(java.lang.String.CASE_INSENSITIVE_ORDER) if (uncheckedTags != null) { this.allTags.addAll(uncheckedTags) - // intersection between mCheckedTags and uncheckedTags - indeterminateTags.addAll(this.checkedTags) - val uncheckedSet: MutableSet = TreeSet(java.lang.String.CASE_INSENSITIVE_ORDER) - uncheckedSet.addAll(uncheckedTags) - indeterminateTags.retainAll(uncheckedSet) + for (tag in uncheckedTags) { + val checkedTag = findCheckedTagIgnoringCase(tag) ?: continue + indeterminateTags.add(checkedTag) + } this.checkedTags.removeAll(indeterminateTags) } partiallySelectedTags.addAll(indeterminateTags) prepareTagHierarchy() } + /** Returns the matching checked tag with its stored spelling, or `null` if absent. */ + private fun findCheckedTagIgnoringCase(tag: String): String? { + // O(log n); returns "Biology" for a "biology" search or vice versa + val candidate = checkedTags.ceiling(tag) ?: return null + return candidate.takeIf { it.equals(tag, ignoreCase = true) } + } + /** * Return true if a tag is checked given its index in the list * diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/exception/SanitizedReportCollector.kt b/AnkiDroid/src/main/java/com/ichi2/anki/exception/SanitizedReportCollector.kt new file mode 100644 index 000000000000..b79e7dab0087 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/exception/SanitizedReportCollector.kt @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.exception + +import android.content.Context +import org.acra.ReportField +import org.acra.builder.ReportBuilder +import org.acra.collector.Collector +import org.acra.config.CoreConfiguration +import org.acra.data.CrashReportData + +/** + * Filters logcat from sanitized reports due to PII: private messages may have been logged before + * the uncaught exception handler ran. ACRA saves the report after all collectors have finished. + */ +class SanitizedReportCollector : Collector { + // LogCatCollector runs FIRST; filter its output after collection, including in parallel mode. + override val order = Collector.Order.LAST + + override fun collect( + context: Context, + config: CoreConfiguration, + reportBuilder: ReportBuilder, + crashReportData: CrashReportData, + ) { + if (reportBuilder.exception is SanitizedThrowable && crashReportData.containsKey(ReportField.LOGCAT)) { + crashReportData.put( + ReportField.LOGCAT, + "Logcat filtered because it may contain personally identifiable information (PII).", + ) + } + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/exception/SanitizedThrowable.kt b/AnkiDroid/src/main/java/com/ichi2/anki/exception/SanitizedThrowable.kt new file mode 100644 index 000000000000..2e0b58630838 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/exception/SanitizedThrowable.kt @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.exception + +import com.ichi2.utils.ExceptionUtil.causesAndSuppressed +import java.util.IdentityHashMap + +/** + * Wraps an exception, stripping PII. + */ +internal class SanitizedThrowable private constructor( + original: Throwable, +) : Throwable(original.javaClass.name) { + init { + stackTrace = original.stackTrace + } + + // ACRA prints the throwable, so retain the original class name in its stack trace. + override fun toString(): String = message!! + + companion object { + /** Copy causes and suppressed exceptions, breaking cycles for downstream crash reporters. */ + fun from(throwable: Throwable): SanitizedThrowable { + val copies = IdentityHashMap() + // Build from leaves to root, linking only to completed copies to break cycles. + for (original in throwable.causesAndSuppressed().toList().asReversed()) { + val copy = SanitizedThrowable(original) + copy.initCause(copies[original.cause]) + original.suppressed.mapNotNull { copies[it] }.forEach(copy::addSuppressed) + copies[original] = copy + } + return copies.getValue(throwable) + } + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/filtered/FilteredDeckOptionsFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/filtered/FilteredDeckOptionsFragment.kt index c784b782fd04..0fc8098af94c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/filtered/FilteredDeckOptionsFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/filtered/FilteredDeckOptionsFragment.kt @@ -25,9 +25,6 @@ import androidx.core.view.updatePadding import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.lifecycleScope -import androidx.lifecycle.repeatOnLifecycle import com.google.android.material.materialswitch.MaterialSwitch import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout @@ -40,6 +37,7 @@ import com.ichi2.anki.databinding.FragmentFilteredDeckOptionsBinding import com.ichi2.anki.dialogs.DiscardChangesDialog import com.ichi2.anki.libanki.DeckId import com.ichi2.anki.utils.ConfigAwareSingleFragmentActivity +import com.ichi2.anki.utils.ext.launchCollectionInViewLifecycleScope import com.ichi2.anki.utils.ext.window import com.ichi2.anki.utils.openUrl import com.ichi2.utils.cancelable @@ -49,7 +47,6 @@ import com.ichi2.utils.positiveButton import com.ichi2.utils.show import com.ichi2.utils.title import dev.androidbroadcast.vbpd.viewBinding -import kotlinx.coroutines.launch import java.util.Locale.getDefault /** @@ -108,67 +105,66 @@ class FilteredDeckOptionsFragment : Fragment(R.layout.fragment_filtered_deck_opt binding.filterLimitInput.filters = arrayOf(InputFilter.LengthFilter(5)) binding.secondFilterLimitInput.filters = arrayOf(InputFilter.LengthFilter(5)) bindLabels() - bindListeners() requireActivity().onBackPressedDispatcher.addCallback( viewLifecycleOwner, discardBackHandler, ) - viewLifecycleOwner.lifecycleScope.launch { - viewModel.hasUnsavedChanges.collect { status -> - discardBackHandler.isEnabled = status - } + viewModel.hasUnsavedChanges.launchCollectionInViewLifecycleScope { status -> + discardBackHandler.isEnabled = status } - viewLifecycleOwner.lifecycleScope.launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.state.collect { state -> - when (state) { - is Initializing -> { - if (state.throwable != null) { - // we can't recover from an initialization error so just exit - AlertDialog.Builder(requireActivity()).show { - setTitle(CommonString.import_title_error) - message(text = state.throwable.toString()) - cancelable(false) - positiveButton(CommonString.dialog_exit) { requireActivity().finish() } - } - } else { - binding.loadingIndicator.isVisible = true - binding.scrollView.isVisible = false - } + viewModel.state.launchCollectionInViewLifecycleScope { state -> + when (state) { + is Initializing -> { + if (state.throwable != null) { + // we can't recover from an initialization error so just exit + AlertDialog.Builder(requireActivity()).show { + setTitle(CommonString.import_title_error) + message(text = state.throwable.toString()) + cancelable(false) + positiveButton(CommonString.dialog_exit) { requireActivity().finish() } } + } else { + binding.loadingIndicator.isVisible = true + binding.scrollView.isVisible = false + } + } - is DeckBuilt -> { - // TODO desktop doesn't do this but maybe also show a toast here? - // the filtered deck is built/updated so exit the screen - requireActivity().finish() - } + is DeckBuilt -> { + // TODO desktop doesn't do this but maybe also show a toast here? + // the filtered deck is built/updated so exit the screen + requireActivity().finish() + } - is FilteredDeckOptions -> { - setupMenuIfNeeded() - // the button is hidden initially until we load the data - binding.btnBuild.isVisible = true - bindState(state) - // show any errors we might have - if (state.throwable != null) { - AlertDialog.Builder(requireActivity()).show { - title(CommonString.import_title_error) - message(text = state.throwable.message) - positiveButton(CommonString.dialog_ok) - setOnDismissListener { viewModel.clearError() } - } - return@collect - } - if (state.browserQuery != null) { - navigate(BrowserDestination.Search(query = state.browserQuery, allDecks = false)) - viewModel.clearSearchInBrowser() - } + is FilteredDeckOptions -> { + setupMenuIfNeeded() + // the button is hidden initially until we load the data + binding.btnBuild.isVisible = true + bindState(state) + // show any errors we might have + if (state.throwable != null) { + AlertDialog.Builder(requireActivity()).show { + title(CommonString.import_title_error) + message(text = state.throwable.message) + positiveButton(CommonString.dialog_ok) + setOnDismissListener { viewModel.clearError() } } + return@launchCollectionInViewLifecycleScope + } + if (state.browserQuery != null) { + navigate(BrowserDestination.Search(query = state.browserQuery, allDecks = false)) + viewModel.clearSearchInBrowser() } } } } } + override fun onViewStateRestored(savedInstanceState: Bundle?) { + super.onViewStateRestored(savedInstanceState) + // Restored text must not call into the view model before its initialization finishes. + bindListeners() + } + private fun setupMenuIfNeeded() { val helpMenuItem: MenuItem? = binding.toolbar.menu.findItem(R.id.action_help) if (helpMenuItem == null) { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/introduction/SetupCollectionFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/introduction/SetupCollectionFragment.kt index 1398ab3a170e..61f491a2b583 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/introduction/SetupCollectionFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/introduction/SetupCollectionFragment.kt @@ -64,7 +64,7 @@ class SetupCollectionFragment : Fragment(R.layout.fragment_introduction) { } private fun setResult(option: CollectionSetupOption) { - setFragmentResult(FRAGMENT_KEY, Bundle().apply { putParcelable(RESULT_KEY, option) }) + setFragmentResult(REQUEST_COLLECTION_SETUP, Bundle().apply { putParcelable(RESULT_KEY, option) }) } @Parcelize @@ -77,7 +77,7 @@ class SetupCollectionFragment : Fragment(R.layout.fragment_introduction) { } companion object { - const val FRAGMENT_KEY = "collectionSetup" + const val REQUEST_COLLECTION_SETUP = "collectionSetup" const val RESULT_KEY = "result" } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/mediacheck/MediaCheckFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/mediacheck/MediaCheckFragment.kt index c1f8e8a9fab6..e245f22f3197 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/mediacheck/MediaCheckFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/mediacheck/MediaCheckFragment.kt @@ -10,7 +10,8 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View -import android.webkit.WebViewClient +import android.webkit.WebView +import androidx.annotation.CallSuper import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity @@ -19,7 +20,6 @@ import androidx.core.view.MenuProvider import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import androidx.lifecycle.lifecycleScope import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CommonPlurals import com.ichi2.anki.CommonString @@ -30,8 +30,11 @@ import com.ichi2.anki.common.utils.android.getColorFromAttr import com.ichi2.anki.databinding.FragmentMediaCheckBinding import com.ichi2.anki.progress.observeProgress import com.ichi2.anki.ui.internationalization.sentenceCase +import com.ichi2.anki.utils.ext.launchCollectionInViewLifecycleScope import com.ichi2.anki.utils.observeMessages import com.ichi2.anki.utils.showAndAwaitDismissal +import com.ichi2.anki.workarounds.OnWebViewRecreatedListener +import com.ichi2.anki.workarounds.SafeWebViewClient import com.ichi2.utils.cancelable import com.ichi2.utils.message import com.ichi2.utils.negativeButton @@ -40,18 +43,20 @@ import com.ichi2.utils.show import com.ichi2.utils.title import com.ichi2.utils.toRGBHex import dev.androidbroadcast.vbpd.viewBinding -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.launch /** * MediaCheckFragment for displaying a list of media files that are either unused or missing. * It allows users to tag missing media files or delete unused ones. **/ -class MediaCheckFragment : Fragment(R.layout.fragment_media_check) { +class MediaCheckFragment : + Fragment(R.layout.fragment_media_check), + OnWebViewRecreatedListener { private val viewModel: MediaCheckViewModel by viewModels() private val binding by viewBinding(FragmentMediaCheckBinding::bind) + private var lastReport: String? = null + override fun onViewCreated( view: View, savedInstanceState: Bundle?, @@ -70,14 +75,12 @@ class MediaCheckFragment : Fragment(R.layout.fragment_media_check) { observeProgress(viewModel) { progress -> getString(progress.messageRes) } viewModel.checkMedia() - lifecycleScope.launch { - viewModel.mediaCheckResult.collectLatest { result -> - updateWebView(result?.report.orEmpty()) - if (result != null) { - binding.tagMissingMediaButton.isVisible = result.missingCount != 0 - binding.deleteUsedMediaButton.isVisible = result.unusedCount != 0 - if (result.haveTrash) setupMenu() - } + viewModel.mediaCheckResult.launchCollectionInViewLifecycleScope { result -> + updateWebView(result?.report.orEmpty()) + if (result != null) { + binding.tagMissingMediaButton.isVisible = result.missingCount != 0 + binding.deleteUsedMediaButton.isVisible = result.unusedCount != 0 + if (result.haveTrash) setupMenu() } } @@ -123,6 +126,7 @@ class MediaCheckFragment : Fragment(R.layout.fragment_media_check) { } private fun updateWebView(report: String) { + lastReport = report val backgroundColor = getColorFromAttr(requireContext(), android.R.attr.colorBackground) val textColor = getColorFromAttr(requireContext(), android.R.attr.textColorPrimary) @@ -142,10 +146,20 @@ class MediaCheckFragment : Fragment(R.layout.fragment_media_check) { """.trimIndent() - binding.webView.webViewClient = WebViewClient() + binding.webView.setWebViewClient(object : SafeWebViewClient() {}) binding.webView.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null) } + override fun onWebViewRecreated(webView: WebView) { + lastReport?.let { updateWebView(it) } + } + + @CallSuper + override fun onDestroyView() { + binding.webView.safeDestroy() + super.onDestroyView() + } + private fun setupButtonListeners() { binding.tagMissingMediaButton.apply { // mediaCheckAddTag => "Tag Missing" diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/model/SortType.kt b/AnkiDroid/src/main/java/com/ichi2/anki/model/SortType.kt index 9a6f682fff36..bf864be3e6a8 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/model/SortType.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/model/SortType.kt @@ -9,6 +9,10 @@ import com.ichi2.anki.CardBrowser import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.R import com.ichi2.anki.browser.BrowserColumnKey +import com.ichi2.anki.common.utils.ext.browserSortCardsBackwards +import com.ichi2.anki.common.utils.ext.browserSortCardsColumn +import com.ichi2.anki.common.utils.ext.browserSortNotesBackwards +import com.ichi2.anki.common.utils.ext.browserSortNotesColumn import com.ichi2.anki.libanki.BrowserConfig import com.ichi2.anki.libanki.SortOrder import com.ichi2.anki.model.CardsOrNotes.NOTES @@ -50,13 +54,18 @@ sealed class SortType : Parcelable { when (this) { is NoOrdering -> Prefs.cardBrowserNoSorting = true is CollectionOrdering -> { - val isNotesMode = cardsOrNotes == NOTES - - val sortKey = BrowserConfig.sortColumnKey(isNotesMode) - val reverseKey = BrowserConfig.sortBackwardsKey(isNotesMode) - - withCol { config.set(sortKey, this@SortType.key.value) } - withCol { config.set(reverseKey, this@SortType.reverse) } + withCol { + when (cardsOrNotes) { + CardsOrNotes.CARDS -> { + config.browserSortCardsColumn = this@SortType.key.value + config.browserSortCardsBackwards = this@SortType.reverse + } + NOTES -> { + config.browserSortNotesColumn = this@SortType.key.value + config.browserSortNotesBackwards = this@SortType.reverse + } + } + } Prefs.cardBrowserNoSorting = false } @@ -103,16 +112,12 @@ var PrefsRepository.cardBrowserNoSorting: Boolean putBoolean(R.string.pref_browser_no_sorting, value) } -private suspend fun getBrowserColumnKey(cardsOrNotes: CardsOrNotes): String { - val isNotesMode = cardsOrNotes == NOTES - val sortKey = BrowserConfig.sortColumnKey(isNotesMode) - - return withCol { config.get(sortKey) } ?: "noteFld" -} - -private suspend fun getSortBackwards(cardsOrNotes: CardsOrNotes): Boolean { - val isNotesMode = cardsOrNotes == NOTES - val sortBackwardsKey = BrowserConfig.sortBackwardsKey(isNotesMode) +private suspend fun getBrowserColumnKey(cardsOrNotes: CardsOrNotes): String = + withCol { + if (cardsOrNotes == NOTES) config.browserSortNotesColumn else config.browserSortCardsColumn + } - return withCol { config.get(sortBackwardsKey) } ?: false -} +private suspend fun getSortBackwards(cardsOrNotes: CardsOrNotes): Boolean = + withCol { + if (cardsOrNotes == NOTES) config.browserSortNotesBackwards else config.browserSortCardsBackwards + } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/ExternalImageEditor.kt b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/ExternalImageEditor.kt new file mode 100644 index 000000000000..eac55a832e04 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/ExternalImageEditor.kt @@ -0,0 +1,191 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.multimedia + +import android.app.Activity +import android.content.ClipData +import android.content.ContentResolver +import android.content.Context +import android.content.Intent +import android.graphics.BitmapFactory +import android.net.Uri +import android.provider.MediaStore +import android.webkit.MimeTypeMap +import androidx.activity.result.ActivityResult +import androidx.core.content.FileProvider +import com.ichi2.anki.utils.runWithOOMCheck +import com.ichi2.utils.openInputStreamSafe +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.withContext +import org.apache.commons.io.FileUtils +import timber.log.Timber +import java.io.File +import java.io.IOException + +/** File operations for external editing. Only the working copy is writable by the editor. */ +internal class ExternalImageEditor( + private val context: Context, + private val cacheDirectory: File, +) { + /** A writable image copy and the chooser intent used to launch its external editor. */ + data class Prepared( + val file: File, + val intent: Intent, + ) + + /** Return whether the source can be shared with an available external image editor. */ + suspend fun canEdit(source: File): Boolean = + withContext(Dispatchers.IO) { + try { + createEditIntent(source, imageMimeType(source)).resolveActivity(context.packageManager) != null + } catch (e: IllegalArgumentException) { + Timber.w(e, "Unable to share image with an external editor") + false + } + } + + /** Create a writable copy of the source and a chooser intent for editing it externally. */ + suspend fun prepare(source: File): Prepared { + var copy: File? = null + try { + return withContext(Dispatchers.IO) { + val mimeType = imageMimeType(source) + val extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType) ?: source.extension + val file = File.createTempFile("img", ".$extension", cacheDirectory) + copy = file + source.copyTo(file, overwrite = true) + Prepared( + file, + Intent.createChooser(createEditIntent(file, mimeType), null), + ) + } + } catch (e: Exception) { + withContext(NonCancellable + Dispatchers.IO) { copy?.delete() } + if (e is CancellationException) throw e + throw IOException("Unable to prepare image for external editing", e) + } + } + + private fun uriForFile(file: File): Uri = FileProvider.getUriForFile(context, "${context.packageName}.apkgfileprovider", file) + + private fun imageMimeType(file: File): String { + MimeTypeMap + .getSingleton() + .getMimeTypeFromExtension(file.extension.lowercase()) + ?.takeIf { it.startsWith("image/") } + ?.let { return it } + return imageMimeTypeFromHeader(file) ?: "image/*" + } + + /** Read the MIME type from image headers, or return null if reading or decoding fails or runs out of memory. */ + private fun imageMimeTypeFromHeader(file: File): String? = + runWithOOMCheck( + action = { + try { + val options = BitmapFactory.Options().apply { inJustDecodeBounds = true } + file.inputStream().use { BitmapFactory.decodeStream(it, null, options) } + options.outMimeType?.takeIf { options.outWidth > 0 && options.outHeight > 0 } + } catch (e: IOException) { + Timber.w(e, "Unable to read image headers") + null + } + }, + onError = { Timber.w(it, "Unable to read image headers") }, + ) + + private fun createEditIntent( + file: File, + mimeType: String, + ): Intent = + Intent(Intent.ACTION_EDIT).apply { + val uri = uriForFile(file) + setDataAndType(uri, mimeType) + // Google Photos requires an explicit output URI for FileProvider images. + putExtra(MediaStore.EXTRA_OUTPUT, uri) + clipData = ClipData.newRawUri("image", uri) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + } + + /** + * Import into a unique file, or return null on cancellation or unchanged contents. + * + * @param original the unmodified source image used to detect unchanged results. + * @param copy the writable copy shared with the editor. + * @param result the activity result from the editor, optionally containing an output URI. + */ + suspend fun readResult( + original: File, + copy: File, + result: ActivityResult, + ): File? { + // An editor may write before the user cancels; only a successful result applies those changes. + if (result.resultCode != Activity.RESULT_OK) return null + var accepted: File? = null + try { + return withContext(Dispatchers.IO) { + // Some editors modify the supplied URI; others return a new content URI. + val returnedUri = result.data?.data?.takeUnless { it == uriForFile(copy) } + returnedUri?.let(::validateReturnedUri) + // Never trust provider display names as paths or allow them to overwrite an existing image. + val destination = File.createTempFile("img", null, cacheDirectory) + accepted = destination + if (returnedUri == null) { + // Detach the accepted image from the file the external app could still write to. + copy.copyTo(destination, overwrite = true) + } else { + val input = + context.contentResolver.openInputStreamSafe(returnedUri) + ?: throw IOException("Unable to open externally edited image") + input.use { source -> destination.outputStream().use { source.copyTo(it) } } + } + if (destination.length() == 0L) throw IOException("External editor returned an empty image") + if (FileUtils.contentEquals(original, destination)) { + destination.delete() + null + } else { + // Validate the copied bytes; provider MIME types and the working extension can be wrong. + val mimeType = + imageMimeTypeFromHeader(destination)?.takeIf { it.startsWith("image/") } + ?: throw IOException("External editor did not return a decodable image") + val extension = + MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType) + ?: throw IOException("External editor returned an unsupported image type: $mimeType") + val image = File.createTempFile("img", ".$extension", cacheDirectory) + if (!destination.renameTo(image)) { + image.delete() + throw IOException("Unable to rename externally edited image") + } + accepted = image + image + } + } + } catch (e: Exception) { + withContext(NonCancellable + Dispatchers.IO) { accepted?.delete() } + if (e is CancellationException) throw e + throw IOException("Unable to read externally edited image", e) + } + } + + private fun validateReturnedUri(uri: Uri) { + if (uri.scheme != ContentResolver.SCHEME_CONTENT) { + throw IOException("External editor returned an unsupported URI") + } + // Do not use our privileges to read an unshared file from our own providers. + val authority = uri.authority?.substringAfterLast('@') + if (authority != null && context.packageManager.resolveContentProvider(authority, 0)?.packageName == context.packageName) { + throw IOException("External editor returned an unshared internal URI") + } + } + + /** Revoke access even when the owning screen was closed during an operation. */ + suspend fun clear(file: File?) = + withContext(NonCancellable + Dispatchers.IO) { + file?.let { + context.revokeUriPermission(uriForFile(it), Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + it.delete() + } + Unit + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/ExternalImageEditorViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/ExternalImageEditorViewModel.kt new file mode 100644 index 000000000000..36a3576b9621 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/ExternalImageEditorViewModel.kt @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.multimedia + +import android.app.Activity +import android.content.Intent +import android.os.Parcelable +import androidx.activity.result.ActivityResult +import androidx.annotation.StringRes +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.ichi2.anki.CommonString +import com.ichi2.anki.utils.ViewModelSavedStateHandle +import kotlinx.coroutines.CoroutineStart +import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import kotlinx.parcelize.Parcelize +import timber.log.Timber +import java.io.File +import java.io.IOException + +/** Retains only the external-edit operation, including results delivered during recreation. */ +internal class ExternalImageEditorViewModel( + private val savedState: ViewModelSavedStateHandle, + val editor: ExternalImageEditor, +) : ViewModel() { + val state: StateFlow = savedState.getStateFlow("externalEdit", null) + + init { + resumeOperation() + } + + fun prepare(source: File) { + if (state.value != null) return + update(Edit.Preparing(source.absolutePath)) + resumeOperation() + } + + fun launched() { + val ready = state.value as? Edit.Ready ?: return + update(Edit.Editing(ready.originalPath, ready.workingPath)) + } + + fun readResult(result: ActivityResult) { + val edit = state.value as? Edit.Editing ?: return + // Retain only the URI; editor extras can contain bitmaps that exceed saved-state limits. + val pendingResult = ActivityResult(result.resultCode, result.data?.data?.let { Intent().setData(it) }) + update(Edit.Importing(edit.originalPath, edit.workingPath, pendingResult)) + resumeOperation() + } + + fun launchFailed() { + val edit = state.value ?: return + update(Edit.Finished(edit.originalPath, edit.workingPath, error = CommonString.activity_start_failed)) + } + + /** The fragment has displayed the result (or error); release only the editor's working copy. */ + fun consumed() { + val edit = state.value as? Edit.Finished ?: return + update(null) + viewModelScope.launch(start = CoroutineStart.UNDISPATCHED) { editor.clear(edit.workingPath?.let(::File)) } + } + + /** Release files on dismissal; clearing a ViewModel alone can still be followed by restoration. */ + fun discard() { + viewModelScope.cancel() + val edit = state.value + // Fragment destruction can follow ViewModel clearing, so cleanup must also work in a cancelled scope. + viewModelScope.launch(start = CoroutineStart.UNDISPATCHED) { + withContext(NonCancellable) { + editor.clear(edit?.workingPath?.let(::File)) + editor.clear((edit as? Edit.Finished)?.acceptedPath?.let(::File)) + } + } + } + + private fun update(edit: Edit?) { + savedState["externalEdit"] = edit + } + + private fun resumeOperation() { + val edit = state.value ?: return + if (edit !is Edit.Preparing && edit !is Edit.Importing) return + viewModelScope.launch { + try { + update( + when (edit) { + is Edit.Preparing -> { + val prepared = editor.prepare(File(edit.originalPath)) + Edit.Ready(edit.originalPath, prepared.file.absolutePath, prepared.intent) + } + is Edit.Importing -> { + val accepted = editor.readResult(File(edit.originalPath), File(edit.workingPath), edit.result) + Edit.Finished( + edit.originalPath, + edit.workingPath, + accepted?.absolutePath, + unchanged = edit.result.resultCode == Activity.RESULT_OK && accepted == null, + ) + } + }, + ) + } catch (e: IOException) { + Timber.w(e, "External image editing failed") + update(Edit.Finished(edit.originalPath, edit.workingPath, error = CommonString.multimedia_editor_something_wrong)) + } + } + } + + /** Only file paths and the pending Android result are saved, never image contents. */ + @Parcelize + sealed class Edit : Parcelable { + abstract val originalPath: String + open val workingPath: String? get() = null + + data class Preparing( + override val originalPath: String, + ) : Edit() + + data class Ready( + override val originalPath: String, + override val workingPath: String, + val intent: Intent, + ) : Edit() + + data class Editing( + override val originalPath: String, + override val workingPath: String, + ) : Edit() + + data class Importing( + override val originalPath: String, + override val workingPath: String, + val result: ActivityResult, + ) : Edit() + + data class Finished( + override val originalPath: String, + override val workingPath: String?, + val acceptedPath: String? = null, + @StringRes val error: Int? = null, + val unchanged: Boolean = false, + ) : Edit() + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/ImageEditorToolbar.kt b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/ImageEditorToolbar.kt index 871e7c6a9b6e..dd7093865113 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/ImageEditorToolbar.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/ImageEditorToolbar.kt @@ -3,7 +3,6 @@ package com.ichi2.anki.multimedia import androidx.annotation.DrawableRes -import androidx.annotation.StringRes import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -33,6 +32,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.ichi2.anki.CommonString import com.ichi2.anki.R +import com.ichi2.anki.ui.internationalization.tr import com.ichi2.compose.ui.preview.AnkiDroidPreview import com.ichi2.compose.ui.preview.ThemePreviews @@ -41,25 +41,51 @@ import com.ichi2.compose.ui.preview.ThemePreviews * * * Replace * * Crop + * * Edit */ @Composable internal fun ImageEditorToolbar( hasImage: Boolean, + hasExternalEditor: Boolean, @DrawableRes replaceIcon: Int, onReplace: () -> Unit, onCrop: () -> Unit, + onEditExternally: () -> Unit, modifier: Modifier = Modifier, + enabled: Boolean = true, ) { Box(modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 12.dp), contentAlignment = Alignment.Center) { Surface( - modifier = Modifier.widthIn(max = 240.dp).fillMaxWidth(), + modifier = Modifier.widthIn(max = if (hasExternalEditor) 360.dp else 240.dp).fillMaxWidth(), shape = RoundedCornerShape(24.dp), color = MaterialTheme.colorScheme.surfaceContainer, ) { Row(modifier = Modifier.padding(horizontal = 4.dp), verticalAlignment = Alignment.CenterVertically) { - ImageEditorAction(CommonString.dialog_positive_replace, replaceIcon, onReplace, Modifier.weight(1f)) + ImageEditorAction( + stringResource(CommonString.dialog_positive_replace), + replaceIcon, + onReplace, + Modifier.weight(1f), + enabled = enabled, + ) ImageEditorDivider() - ImageEditorAction(CommonString.crop_button, R.drawable.ic_crop, onCrop, Modifier.weight(1f), enabled = hasImage) + ImageEditorAction( + stringResource(CommonString.crop_button), + R.drawable.ic_crop, + onCrop, + Modifier.weight(1f), + enabled = enabled && hasImage, + ) + if (hasExternalEditor) { + ImageEditorDivider() + ImageEditorAction( + tr().studyingEdit(), + R.drawable.ic_round_open_in_new, + onEditExternally, + Modifier.weight(1f), + enabled = enabled && hasImage, + ) + } } } } @@ -67,7 +93,7 @@ internal fun ImageEditorToolbar( @Composable private fun ImageEditorAction( - @StringRes label: Int, + label: String, @DrawableRes icon: Int, onClick: () -> Unit, modifier: Modifier = Modifier, @@ -82,7 +108,7 @@ private fun ImageEditorAction( ) { Column(horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(2.dp)) { Icon(painterResource(icon), contentDescription = null, modifier = Modifier.size(22.dp)) - Text(stringResource(label), style = MaterialTheme.typography.labelMedium, textAlign = TextAlign.Center) + Text(label, style = MaterialTheme.typography.labelMedium, textAlign = TextAlign.Center) } } } @@ -113,6 +139,13 @@ private fun EmptyImageEditorToolbarPreview() { @Composable private fun ImageEditorToolbarPreviewContent(hasImage: Boolean) { AnkiDroidPreview { - ImageEditorToolbar(hasImage = hasImage, replaceIcon = R.drawable.ic_photo_library, onReplace = {}, onCrop = {}) + ImageEditorToolbar( + hasImage = hasImage, + hasExternalEditor = hasImage, + replaceIcon = R.drawable.ic_photo_library, + onReplace = {}, + onCrop = {}, + onEditExternally = {}, + ) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaActivity.kt b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaActivity.kt index 78ddc8436212..c470f94a5770 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaActivity.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaActivity.kt @@ -10,6 +10,9 @@ import android.os.Bundle import android.view.View import androidx.activity.SystemBarStyle import androidx.activity.enableEdgeToEdge +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat @@ -63,6 +66,8 @@ class MultimediaActivity : BaseSnackbarBuilderProvider { private val binding by viewBinding(ActivityMultimediaBinding::bind) + internal var isImageEditorBusy by mutableStateOf(false) + override val analyticsScreenName: String get() = intent.getStringExtra(EXTRA_FRAGMENT_NAME)?.substringAfterLast('.') ?: super.analyticsScreenName @@ -127,7 +132,7 @@ class MultimediaActivity : setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { AnkiDroidTheme { - HeroToolbarActionButton(onClick = { + HeroToolbarActionButton(enabled = !isImageEditorBusy, onClick = { val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as? MultimediaImageFragment fragment?.onDone() }) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaImageFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaImageFragment.kt index 8a6b54c8cc0c..57d242fa301a 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaImageFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/multimedia/MultimediaImageFragment.kt @@ -14,6 +14,7 @@ import android.graphics.drawable.BitmapDrawable import android.net.Uri import android.os.Bundle import android.provider.MediaStore +import android.text.format.Formatter import android.view.View import android.webkit.WebView import androidx.activity.result.contract.ActivityResultContracts @@ -21,13 +22,17 @@ import androidx.annotation.DrawableRes import androidx.annotation.VisibleForTesting import androidx.appcompat.app.AlertDialog import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.core.content.ContextCompat import androidx.core.content.FileProvider import androidx.core.os.BundleCompat import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CommonString import com.ichi2.anki.DrawingFragment @@ -45,12 +50,13 @@ import com.ichi2.anki.multimedia.MultimediaUtils.createNewCacheImageFile import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.anki.utils.ext.convertToString import com.ichi2.anki.utils.ext.toBase64Png +import com.ichi2.anki.utils.savedStateViewModelFactory import com.ichi2.anki.workarounds.OnWebViewRecreatedListener import com.ichi2.anki.workarounds.SafeWebViewClient import com.ichi2.anki.workarounds.SafeWebViewLayout import com.ichi2.compose.theme.AnkiDroidTheme import com.ichi2.imagecropper.ImageCropper -import com.ichi2.imagecropper.ImageCropper.Companion.CROP_IMAGE_RESULT +import com.ichi2.imagecropper.ImageCropper.Companion.EXTRA_CROP_IMAGE_RESULT import com.ichi2.utils.BitmapUtil import com.ichi2.utils.ExifUtil import com.ichi2.utils.FileUtil @@ -62,6 +68,7 @@ import com.ichi2.utils.show import dev.androidbroadcast.vbpd.viewBinding import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import timber.log.Timber @@ -91,6 +98,25 @@ class MultimediaImageFragment : /** Keeps track of the process in case `Don't keep activities` in turned on*/ private var hasStartedImageSelection = false + private val externalEditorViewModel by viewModels { + savedStateViewModelFactory { state -> + ExternalImageEditorViewModel( + state, + ExternalImageEditor(requireContext().applicationContext, File(requireNotNull(ankiCacheDirectory))), + ) + } + } + + private val externalImageEditor get() = externalEditorViewModel.editor + + @VisibleForTesting + internal val isExternalEditPending get() = externalEditorViewModel.state.value != null + + private val externalEditorLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + externalEditorViewModel.readResult(result) + } + /** * Launches an activity to pick an image from the device's gallery. * This launcher is registered using `ActivityResultContracts.StartActivityForResult()`. @@ -164,6 +190,8 @@ class MultimediaImageFragment : else -> { Timber.d("Camera aborted or some interruption, restoring multimedia data") viewModel.restoreMultimedia() + viewModel.currentMultimediaPath.value?.let(::updateAndDisplayImageSize) + viewModel.currentMultimediaUri.value?.let(::previewImage) } } } @@ -177,7 +205,7 @@ class MultimediaImageFragment : Activity.RESULT_OK -> { result.data?.let { val cropResultData = - it.getParcelableExtraCompat(CROP_IMAGE_RESULT) + it.getParcelableExtraCompat(EXTRA_CROP_IMAGE_RESULT) Timber.d("Cropped image data: $cropResultData") if (cropResultData?.uriPath == null || cropResultData.uriContent == null) return@registerForActivityResult @@ -199,8 +227,21 @@ class MultimediaImageFragment : setContent { AnkiDroidTheme { val imageUri by viewModel.currentMultimediaUri.collectAsStateWithLifecycle() + val externalEdit by externalEditorViewModel.state.collectAsStateWithLifecycle() + val editorAvailability = + remember(viewModel, externalImageEditor) { + viewModel.currentMultimediaPath.map { image -> + image?.let { externalImageEditor.canEdit(it) } ?: false + } + } + val hasExternalEditor by editorAvailability.collectAsStateWithLifecycle( + initialValue = false, + minActiveState = Lifecycle.State.RESUMED, + ) ImageEditorToolbar( hasImage = imageUri != null, + hasExternalEditor = hasExternalEditor, + enabled = externalEdit == null, replaceIcon = when (selectedImageOptions) { ImageOptions.GALLERY -> R.drawable.ic_photo_library @@ -215,6 +256,7 @@ class MultimediaImageFragment : ) requestCrop() }, + onEditExternally = ::requestExternalEdit, ) } } @@ -246,6 +288,11 @@ class MultimediaImageFragment : return } + externalEditorViewModel.state.value?.originalPath?.let(::File)?.let { + viewModel.updateCurrentMultimediaPath(it) + viewModel.updateCurrentMultimediaUri(getUriForFile(it)) + } + arguments?.let { selectedImageOptions = it.getSerializableCompat(EXTRA_MEDIA_OPTIONS) as ImageOptions } @@ -257,9 +304,16 @@ class MultimediaImageFragment : ) { super.onViewCreated(view, savedInstanceState) setupImageActions() + observeExternalEdit() setupWebView() - handleImageUri() + val currentImage = viewModel.currentMultimediaPath.value + if (currentImage != null) { + previewImage(getUriForFile(currentImage)) + updateAndDisplayImageSize(currentImage) + } else { + handleImageUri() + } } @NeedsTest("Verify the webview background color is transparent and matches the app theme") @@ -283,8 +337,20 @@ class MultimediaImageFragment : outState.putBoolean("HAS_STARTED_IMAGE_SELECTION", hasStartedImageSelection) } + override fun onDestroy() { + if (isRemoving || activity?.isFinishing == true) { + externalEditorViewModel.discard() + } + super.onDestroy() + } + private fun handleImageUri() { - if (imageUri != null) { + val currentImageUri = viewModel.currentMultimediaUri.value + if (currentImageUri != null) { + // The launch URI is only the initial image; cropping or replacement may have changed it. + previewImage(currentImageUri) + binding.imageFileSize.text = Formatter.formatFileSize(requireContext(), viewModel.selectedMediaFileSize) + } else if (imageUri != null) { // a content:// or a file:// already in our cache; resolveUriToFile handles both handleSelectImageIntent(imageUri) } else { @@ -318,6 +384,7 @@ class MultimediaImageFragment : internal fun onDone() { Timber.d("MultimediaImageFragment:: Done button pressed") + if (isExternalEditPending) return if (viewModel.selectedMediaFileSize == 0L) { Timber.d("Image length is not valid") return @@ -379,7 +446,7 @@ class MultimediaImageFragment : val imageUri = BundleCompat.getParcelable( intent.extras!!, - DrawingFragment.IMAGE_PATH_KEY, + DrawingFragment.EXTRA_IMAGE_PATH, Uri::class.java, ) @@ -605,8 +672,9 @@ class MultimediaImageFragment : Timber.i("Loading non-SVG image using WebView") try { - // read our own cache file directly, internalize anything else - val internalFile = (cachedFileOrNull(imageUri) ?: internalizeUri(imageUri))?.takeIf { it.exists() } + // Reuse the selected file for its FileProvider URI: importing it could copy it onto itself. + val selectedFile = viewModel.currentMultimediaPath.value?.takeIf { getUriForFile(it) == imageUri } + val internalFile = (selectedFile ?: cachedFileOrNull(imageUri) ?: internalizeUri(imageUri))?.takeIf { it.exists() } if (internalFile == null) { Timber.w("loadImage() unable to resolve image from Uri %s", imageUri) showSomethingWentWrong() @@ -658,6 +726,51 @@ class MultimediaImageFragment : binding.multimediaWebView.loadDataWithBaseURL(null, errorHtml, "text/html", "UTF-8", null) } + @VisibleForTesting + internal fun requestExternalEdit() { + viewModel.currentMultimediaPath.value?.let(externalEditorViewModel::prepare) + } + + private fun observeExternalEdit() { + fun handleEditState(edit: ExternalImageEditorViewModel.Edit?) { + (activity as? MultimediaActivity)?.isImageEditorBusy = edit != null + when (edit) { + is ExternalImageEditorViewModel.Edit.Ready -> { + externalEditorViewModel.launched() + hasStartedImageSelection = true + try { + externalEditorLauncher.launch(edit.intent) + } catch (e: ActivityNotFoundException) { + Timber.w(e, "No app found to edit image") + externalEditorViewModel.launchFailed() + } + } + is ExternalImageEditorViewModel.Edit.Finished -> { + edit.acceptedPath?.let(::File)?.let { accepted -> + val uri = getUriForFile(accepted) + viewModel.updateCurrentMultimediaPath(accepted) + viewModel.updateCurrentMultimediaUri(uri) + updateAndDisplayImageSize(accepted) + previewImage(uri) + } + edit.error?.let { showSnackbar(it) } + if (edit.unchanged) { + showSnackbar(CommonString.external_image_editor_no_changes) + } + hasStartedImageSelection = false + externalEditorViewModel.consumed() + } + else -> Unit + } + } + + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) { + externalEditorViewModel.state.collect(::handleEditState) + } + } + } + private fun requestCrop() { val imageUri = viewModel.currentMultimediaUri.value ?: return Timber.i("launching crop") diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/multiprofile/ProfileManager.kt b/AnkiDroid/src/main/java/com/ichi2/anki/multiprofile/ProfileManager.kt index 683525a8d8bc..1ab9b041c851 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/multiprofile/ProfileManager.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/multiprofile/ProfileManager.kt @@ -13,6 +13,7 @@ import androidx.core.content.ContextCompat import androidx.core.content.edit import com.ichi2.anki.common.crashreporting.CrashReportService import com.ichi2.anki.common.preferences.sharedPrefs +import com.ichi2.anki.common.storage.AnkiDroidFolder import com.ichi2.anki.common.storage.CollectionHelper.PREF_COLLECTION_PATH import com.ichi2.anki.common.time.TimeManager import com.ichi2.anki.common.time.getTimestamp @@ -79,16 +80,18 @@ class ProfileManager private constructor( * @param displayName The name to be associated with the new profile. * @return The unique [ProfileId] assigned to the newly created profile. * + * @throws IllegalArgumentException if another profile already uses [displayName], ignoring case. * @throws Exception if profile creation or persistence fails. */ fun createNewProfile(displayName: ProfileName): ProfileId { + require(!isNameTaken(displayName)) { "Profile name is already in use" } val newProfileId = generateUniqueProfileId() val metadata = ProfileMetadata(displayName = displayName) profileRegistry.saveProfile(newProfileId, metadata) - Timber.i("Created new profile: ${displayName.value} (${newProfileId.value})") + Timber.i("Created new profile: ${newProfileId.value}") return newProfileId } @@ -101,6 +104,11 @@ class ProfileManager private constructor( */ fun getAllProfiles(): Map = profileRegistry.getAllProfiles() + private fun isNameTaken( + name: ProfileName, + ignoring: ProfileId? = null, + ): Boolean = name.existsIn(getAllProfiles().filterKeys { it != ignoring }.values.map { it.displayName.value }) + /** * Generates a unique [ProfileId] that does not collide with existing profiles. * @@ -194,7 +202,11 @@ class ProfileManager private constructor( if (prefs.getString(PREF_COLLECTION_PATH, null) != null) return val profileCollectionDir = - getDefaultAnkiDroidDirectory(profileContext, directoryName = profileId.value).apply { mkdirs() } + getDefaultAnkiDroidDirectory( + profileContext, + directoryName = profileId.value, + folder = AnkiDroidFolder.APP_PRIVATE, + ).apply { mkdirs() } prefs.edit { putString(PREF_COLLECTION_PATH, profileCollectionDir.absolutePath) } } @@ -293,7 +305,8 @@ class ProfileManager private constructor( * @param newDisplayName The new user-facing name. * * @throws IllegalArgumentException if [profileId] does not - * exist in the registry. + * exist in the registry, or another profile already uses + * [newDisplayName], ignoring case. */ fun renameProfile( profileId: ProfileId, @@ -310,6 +323,8 @@ class ProfileManager private constructor( return } + require(!isNameTaken(newDisplayName, ignoring = profileId)) { "Profile name is already in use" } + val updated = existing.copy(displayName = newDisplayName) profileRegistry.saveProfile(profileId, updated) @@ -577,7 +592,7 @@ class ProfileManager private constructor( private val globalPrefs: SharedPreferences, ) { fun getLastActiveProfileId(): ProfileId? { - val id = globalPrefs.getString(KEY_LAST_ACTIVE_PROFILE_ID, null) + val id = globalPrefs.getString(PREF_LAST_ACTIVE_PROFILE_ID, null) return id?.let { ProfileId(it) } } @@ -585,16 +600,16 @@ class ProfileManager private constructor( id: ProfileId, commit: Boolean = false, ) { - globalPrefs.edit(commit = commit) { putString(KEY_LAST_ACTIVE_PROFILE_ID, id.value) } + globalPrefs.edit(commit = commit) { putString(PREF_LAST_ACTIVE_PROFILE_ID, id.value) } } fun getWebViewProfileId(): ProfileId? { - val id = globalPrefs.getString(KEY_WEBVIEW_PROFILE_ID, null) + val id = globalPrefs.getString(PREF_WEBVIEW_PROFILE_ID, null) return id?.let { ProfileId(it) } } fun setWebViewProfileId(id: ProfileId) { - globalPrefs.edit { putString(KEY_WEBVIEW_PROFILE_ID, id.value) } + globalPrefs.edit { putString(PREF_WEBVIEW_PROFILE_ID, id.value) } } /** @@ -616,7 +631,7 @@ class ProfileManager private constructor( globalPrefs.edit { putString(id.value, metadata.toJson()) if (isActive) { - putString(KEY_LAST_ACTIVE_PROFILE_ID, id.value) + putString(PREF_LAST_ACTIVE_PROFILE_ID, id.value) } } } @@ -635,7 +650,7 @@ class ProfileManager private constructor( * Retrieves all registered profiles from the global SharedPreferences. * * Iterates over all stored entries, skipping the - * [KEY_LAST_ACTIVE_PROFILE_ID] metadata key, and deserializes each + * [PREF_LAST_ACTIVE_PROFILE_ID] metadata key, and deserializes each * value into a [ProfileMetadata] instance. Entries that fail to parse * are logged and silently skipped. * @@ -690,13 +705,13 @@ class ProfileManager private constructor( companion object { private const val MAX_ATTEMPTS = 10 const val PROFILE_REGISTRY_FILENAME = "profiles_prefs" - const val KEY_LAST_ACTIVE_PROFILE_ID = "last_active_profile_id" + const val PREF_LAST_ACTIVE_PROFILE_ID = "last_active_profile_id" /** Profile whose data the shared WebView storage currently holds. Pre-API 28 only. */ - const val KEY_WEBVIEW_PROFILE_ID = "webview_profile_id" + const val PREF_WEBVIEW_PROFILE_ID = "webview_profile_id" /** Registry keys that are not profile entries. */ - private val BOOKKEEPING_KEYS = setOf(KEY_LAST_ACTIVE_PROFILE_ID, KEY_WEBVIEW_PROFILE_ID) + private val BOOKKEEPING_KEYS = setOf(PREF_LAST_ACTIVE_PROFILE_ID, PREF_WEBVIEW_PROFILE_ID) const val DEFAULT_PROFILE_DISPLAY_NAME = "Default" diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/multiprofile/ProfileName.kt b/AnkiDroid/src/main/java/com/ichi2/anki/multiprofile/ProfileName.kt index 16f1f7865f2f..e694763cfd77 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/multiprofile/ProfileName.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/multiprofile/ProfileName.kt @@ -16,6 +16,15 @@ value class ProfileName private constructor( ) { override fun toString(): String = value + /** + * Whether [names] already contains this name, ignoring case. + * + * Stricter than Anki Desktop, which compares with SQLite's `NOCASE` and only folds ASCII: + * `Ä` and `ä` are two names there but one name here. Profile names are never shared + * with Desktop, so the two checks never have to agree. + */ + fun existsIn(names: Iterable): Boolean = names.any { it.equals(value, ignoreCase = true) } + companion object { const val MAX_LENGTH = 50 diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/navigation/AnkiDroidNavigator.kt b/AnkiDroid/src/main/java/com/ichi2/anki/navigation/AnkiDroidNavigator.kt index 465edb896116..86ac926f4572 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/navigation/AnkiDroidNavigator.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/navigation/AnkiDroidNavigator.kt @@ -18,10 +18,12 @@ import com.ichi2.anki.common.destinations.PreferencesDestination import com.ichi2.anki.common.destinations.ReviewDeckDestination import com.ichi2.anki.common.destinations.StatisticsDestination import com.ichi2.anki.common.destinations.StudyOptionsDestination +import com.ichi2.anki.common.destinations.WidgetConfigDestination import com.ichi2.anki.noteeditor.toIntent import com.ichi2.anki.pages.toIntent import com.ichi2.anki.preferences.toIntent import com.ichi2.anki.toIntent +import com.ichi2.widget.toIntent /** AnkiDroid's [Navigator] implementation. */ object AnkiDroidNavigator : Navigator { @@ -44,6 +46,7 @@ object AnkiDroidNavigator : Navigator { is ReviewDeckDestination -> destination.toIntent(navContext) is StatisticsDestination -> destination.toIntent(navContext) is StudyOptionsDestination -> destination.toIntent(navContext) + is WidgetConfigDestination -> destination.toIntent(navContext) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/AudioRecordingViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/AudioRecordingViewModel.kt index cf11c0fd590d..8b1db2d55ee7 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/AudioRecordingViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/AudioRecordingViewModel.kt @@ -26,7 +26,7 @@ import kotlin.time.Duration.Companion.seconds class AudioRecordingViewModel( audioRecorder: AudioRecorder = AudioRecorder(appContext), createPlayer: () -> Player = { VoicePlayer.createExoPlayer(appContext) }, - recordingsDirectory: File = File(appContext.cacheDir, VoiceRecorder.RECORDINGS_DIRECTORY), + recordingsDirectory: File = VoiceRecorder.recordingsDirectory(appContext), ) : ViewModel() { private val recorder = VoiceRecorder(audioRecorder, recordingsDirectory, viewModelScope) private val player = VoicePlayer(viewModelScope, createPlayer) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/FieldState.kt b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/FieldState.kt index a93a6928dfd8..968d757163fc 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/FieldState.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/FieldState.kt @@ -23,6 +23,13 @@ class FieldState private constructor( ) { private var customViewIds: List? = null + // Values beyond the current type's field count, retained until the draft is saved or discarded. + private var hiddenFieldValues: List = emptyList() + + /** All draft values, including fields temporarily hidden by a smaller note type. */ + val currentFieldValues: List + get() = editor.currentFieldStrings.map { it.orEmpty() } + hiddenFieldValues + fun loadFieldEditLines(type: FieldChangeType): List { val fieldEditLines: List = if (type.type == Type.INIT && customViewIds != null) { @@ -45,10 +52,13 @@ class FieldState private constructor( } } if (type.type == Type.CHANGE_FIELD_COUNT) { - val currentFieldStrings = editor.currentFieldStrings - for (i in 0 until min(currentFieldStrings.size, fieldEditLines.size)) { - fieldEditLines[i].setContent(currentFieldStrings[i], type.replaceNewlines) + val fieldValues = currentFieldValues + for (i in 0 until min(fieldValues.size, fieldEditLines.size)) { + fieldEditLines[i].setContent(fieldValues[i], type.replaceNewlines) } + hiddenFieldValues = fieldValues.drop(fieldEditLines.size) + } else if (type.type != Type.INIT) { + clearHiddenFields() } return fieldEditLines } @@ -84,6 +94,18 @@ class FieldState private constructor( fun setInstanceState(savedInstanceState: Bundle?) { customViewIds = savedInstanceState?.getIntegerArrayList("customViewIds") + hiddenFieldValues = savedInstanceState?.getStringArrayList("hiddenFieldValues").orEmpty() + } + + fun saveInstanceState(outState: Bundle) { + // Visible values are already saved by the field views; only save the hidden tail here. + if (hiddenFieldValues.isNotEmpty()) { + outState.putStringArrayList("hiddenFieldValues", ArrayList(hiddenFieldValues)) + } + } + + fun clearHiddenFields() { + hiddenFieldValues = emptyList() } /** How fields should be changed when the UI is rebuilt */ diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/NoteEditorDestination.kt b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/NoteEditorDestination.kt index fc937d84d9c4..8e88af939210 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/NoteEditorDestination.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/NoteEditorDestination.kt @@ -44,7 +44,7 @@ fun NoteEditorDestination.toIntent(context: Context): Intent = Intent(context, NoteEditorActivity::class.java).also { intent -> intent.putExtra(NoteEditorFragment.EXTRA_CALLER, NoteEditorCaller.CARDBROWSER_ADD.value) intent.putExtra(NoteEditorFragment.EXTRA_TEXT_FROM_SEARCH_VIEW, searchTerms) - intent.putExtra(NoteEditorFragment.IN_CARD_BROWSER_ACTIVITY, false) + intent.putExtra(NoteEditorFragment.EXTRA_IN_CARD_BROWSER_ACTIVITY, false) deckId?.takeIf { it > 0 }?.let { intent.putExtra(NoteEditorFragment.EXTRA_DID, it) } } is NoteEditorDestination.EditSelection -> @@ -55,7 +55,7 @@ fun NoteEditorDestination.toIntent(context: Context): Intent = // To handle multi select and note edit intent.putExtra(NoteEditorFragment.EXTRA_CARD_IDS, cardIds.toLongArray()) intent.putExtra(AnkiActivity.EXTRA_FINISH_ANIMATION, animation as Parcelable) - intent.putExtra(NoteEditorFragment.IN_CARD_BROWSER_ACTIVITY, inCardBrowserActivity) + intent.putExtra(NoteEditorFragment.EXTRA_IN_CARD_BROWSER_ACTIVITY, inCardBrowserActivity) } is NoteEditorDestination.CopyNote -> Intent(context, NoteEditorActivity::class.java).also { intent -> @@ -63,6 +63,7 @@ fun NoteEditorDestination.toIntent(context: Context): Intent = intent.putExtra(NoteEditorFragment.EXTRA_DID, deckId) intent.putExtra(NoteEditorFragment.EXTRA_CONTENTS, fieldsText) intent.putExtra(NoteEditorFragment.EXTRA_TAGS, tags.toTypedArray()) + intent.putExtra(NoteEditorFragment.EXTRA_NOTE_TYPE_ID, noteTypeId) } is NoteEditorDestination.PassArguments -> Intent(context, NoteEditorActivity::class.java).also { intent -> diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/NoteEditorGalleryPicker.kt b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/NoteEditorGalleryPicker.kt new file mode 100644 index 000000000000..07163f372680 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/NoteEditorGalleryPicker.kt @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: 2026 David Allison <62114487+david-allison@users.noreply.github.com> +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.noteeditor + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.provider.MediaStore +import androidx.activity.result.contract.ActivityResultContracts +import androidx.fragment.app.Fragment +import com.ichi2.anki.CommonString +import com.ichi2.anki.multimedia.PickedImage +import com.ichi2.anki.snackbar.showSnackbar +import timber.log.Timber + +/** + * Picks an image before opening the image editor, retaining the target note field across recreation. + * Must be constructed during fragment initialization to register its activity result launcher. + */ +internal class NoteEditorGalleryPicker( + private val fragment: Fragment, + onImagePicked: (fieldIndex: Int, imageUri: Uri) -> Unit, +) { + private var pendingFieldIndex: Int? = null + + private val launcher = + fragment.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val fieldIndex = pendingFieldIndex ?: return@registerForActivityResult + pendingFieldIndex = null + if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult + + val imageUri = result.data?.let { PickedImage(it).trustedUri } + if (imageUri == null) { + fragment.showSnackbar(CommonString.select_image_failed) + return@registerForActivityResult + } + onImagePicked(fieldIndex, imageUri) + } + + fun launch(fieldIndex: Int) { + pendingFieldIndex = fieldIndex + try { + launcher.launch(Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)) + } catch (e: ActivityNotFoundException) { + pendingFieldIndex = null + Timber.w(e, "No app found to select image") + fragment.showSnackbar(CommonString.activity_start_failed) + } + } + + fun onSaveInstanceState(outState: Bundle) { + pendingFieldIndex?.let { outState.putInt(STATE_KEY_FIELD_INDEX, it) } + } + + fun onRestoreInstanceState(state: Bundle) { + pendingFieldIndex = state.getInt(STATE_KEY_FIELD_INDEX, -1).takeIf { it >= 0 } + } + + companion object { + private const val STATE_KEY_FIELD_INDEX = "galleryFieldIndex" + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/NoteEditorMultimediaController.kt b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/NoteEditorMultimediaController.kt index 9ee364fcbf1f..d927485fb0fc 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/NoteEditorMultimediaController.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/NoteEditorMultimediaController.kt @@ -24,6 +24,7 @@ import com.ichi2.anki.multimedia.MultimediaActivityExtra import com.ichi2.anki.multimedia.MultimediaResult import com.ichi2.anki.multimediacard.fields.EFieldType import com.ichi2.anki.multimediacard.fields.IField +import com.ichi2.anki.multimediacard.impl.MultimediaEditableNote import com.ichi2.anki.servicelayer.NoteService import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.utils.ContentResolverUtil @@ -36,9 +37,8 @@ import java.io.File /** * Owns the multimedia capture lifecycle for a [NoteEditorFragment]. * - * The [launcher] must already be registered on the fragment (an - * `ActivityResultLauncher` can only be created during fragment initialisation); - * its callback forwards to [handleActions] / [handleResult]. + * Must be created during fragment initialization to register the Gallery picker. + * The [launcher] must already be registered; its callback forwards to [handleActions] / [handleResult]. */ internal class NoteEditorMultimediaController( private val fragment: NoteEditorFragment, @@ -46,6 +46,15 @@ internal class NoteEditorMultimediaController( ) { private var actionJob: Job? = null + private val galleryPicker = + NoteEditorGalleryPicker(fragment) { fieldIndex, imageUri -> + fragment.launchCatchingTask { + val note = fragment.getCurrentMultimediaEditableNote() + if (note.isEmpty) return@launchCatchingTask + launchEditor(MultimediaActionHandler.ImageFile, fieldIndex, note, imageUri) + } + } + // Use the same HTML if the same image is pasted multiple times. private var pastedImageCache: HashMap = HashMap() @@ -64,18 +73,37 @@ internal class NoteEditorMultimediaController( fragment.multimediaViewModel.multimediaAction.first { action -> Timber.i("Selected multimedia action: %s", action) val handler = MultimediaActionHandler.forAction(action) - val field = handler.createField().also { note.setField(fieldIndex, it) } - val intent = - handler.buildIntent( - fragment.requireContext(), - MultimediaActivityExtra(fieldIndex, field, note), - ) - launcher.launch(intent) + if (handler == MultimediaActionHandler.ImageFile) { + // An empty image editor would be exposed during the picker's back animation. + galleryPicker.launch(fieldIndex) + } else { + launchEditor(handler, fieldIndex, note) + } true } } } + private fun launchEditor( + handler: MultimediaActionHandler, + fieldIndex: Int, + note: MultimediaEditableNote, + imageUri: Uri? = null, + ) { + val field = handler.createField().also { note.setField(fieldIndex, it) } + val intent = + handler.buildIntent( + fragment.requireContext(), + MultimediaActivityExtra(fieldIndex, field, note, imageUri?.toString()), + ) + if (imageUri != null) { + // The URI in the serialized arguments does not carry the picker's read grant. + intent.data = imageUri + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + } + launcher.launch(intent) + } + /** * Handles an image-share intent: extracts the source [Uri], persists URI permission, * copies it into the app's cache, and launches the image picker seeded with the @@ -183,12 +211,14 @@ internal class NoteEditorMultimediaController( fun onSaveInstanceState(outState: Bundle) { outState.putSerializable(STATE_KEY_IMAGE_CACHE, pastedImageCache) + galleryPicker.onSaveInstanceState(outState) } fun onRestoreInstanceState(state: Bundle) { pastedImageCache = state.getSerializableCompat>(STATE_KEY_IMAGE_CACHE) ?: HashMap() + galleryPicker.onRestoreInstanceState(state) } /** diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/Toolbar.kt b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/Toolbar.kt index 1b8393b1c903..8068fea2fa13 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/Toolbar.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/Toolbar.kt @@ -38,20 +38,20 @@ import androidx.core.view.isVisible import androidx.core.view.updatePadding import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat import com.ichi2.anki.CommonString -import com.ichi2.anki.NoteEditorFragment import com.ichi2.anki.R -import com.ichi2.anki.common.android.appContext import com.ichi2.anki.common.preferences.sharedPrefs +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.compat.CompatHelper +import com.ichi2.anki.noteeditor.data.ToolbarPreferences import com.ichi2.utils.AndroidUiUtils.showSoftInput import com.ichi2.utils.ViewGroupUtils import com.ichi2.utils.ViewGroupUtils.getAllChildrenRecursive -import com.ichi2.utils.dp import com.ichi2.utils.show import com.ichi2.utils.title import timber.log.Timber import java.util.Objects import kotlin.math.ceil +import com.ichi2.anki.common.android.R as CommonR /** * Handles the toolbar inside [com.ichi2.anki.NoteEditorFragment] @@ -64,12 +64,13 @@ import kotlin.math.ceil * * Handles generating the 'icon' for these custom buttons: [createDrawableForString] * * Handles CTRL+ the tag of the button: [onKeyUp]. Allows for Ctrl+1..9 shortcuts * * Handles adding a dynamic number of buttons and aligning them into rows: [insertItem] - * * And handles whether these should be stacked or scrollable: [shouldScrollToolbar] + * * And handles whether these should be stacked or scrollable: [ToolbarPreferences.isScrollable] */ class Toolbar : FrameLayout { var formatListener: TextFormatListener? = null private val toolbar: LinearLayout private val toolbarLayout: LinearLayout + private val toolbarPreferences = ToolbarPreferences(context.sharedPrefs()) @VisibleForTesting internal val scrollView: HorizontalScrollView @@ -189,7 +190,7 @@ class Toolbar : FrameLayout { ): AppCompatImageButton { // we use the light theme here to ensure the tint is black on both // A null theme can be passed after colorControlNormal is defined (API 25) - val themeContext: Context = ContextThemeWrapper(context, R.style.Theme_Light) + val themeContext: Context = ContextThemeWrapper(context, CommonR.style.Theme_Light) val d = VectorDrawableCompat.create(context.resources, drawable, themeContext.theme) return insertItem(id, d, block) } @@ -229,11 +230,7 @@ class Toolbar : FrameLayout { val twoDp = ceil((2 / context.resources.displayMetrics.density).toDouble()).toInt() button.setPaddingRelative(twoDp, twoDp, twoDp, twoDp) // end apply style - val shouldScroll = - appContext - .sharedPrefs() - .getBoolean(NoteEditorFragment.PREF_NOTE_EDITOR_SCROLL_TOOLBAR, true) - if (shouldScroll) { + if (toolbarPreferences.isScrollable) { toolbar.addView(button, toolbar.childCount) } else { addViewToToolbar(button) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/ToolbarLayoutDialogHost.kt b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/ToolbarLayoutDialogHost.kt new file mode 100644 index 000000000000..f5c84eb0de69 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/ToolbarLayoutDialogHost.kt @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.noteeditor + +import android.os.Bundle +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.ViewCompositionStrategy +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import com.ichi2.anki.noteeditor.data.ToolbarPreferences +import com.ichi2.anki.noteeditor.presentation.ToolbarLayoutMode +import com.ichi2.anki.settings.enums.DayTheme +import com.ichi2.anki.settings.enums.Theme +import com.ichi2.compose.theme.AnkiDroidTheme +import com.ichi2.compose.ui.preview.AnkiDroidPreview +import com.ichi2.compose.ui.preview.AnkiDroidThemeProvider +import com.ichi2.themes.Themes + +private const val STATE_TOOLBAR_LAYOUT_DIALOG = "toolbarLayoutDialog" + +/** + * Hosts the 'Toolbar layout' dialog and restores its visibility after recreation. + * + * @see ToolbarLayoutDialog + */ +internal class ToolbarLayoutDialogHost { + private var isShowing by mutableStateOf(false) + + fun bind( + view: ComposeView, + preferences: ToolbarPreferences, + savedInstanceState: Bundle?, + onChanged: () -> Unit, + ) { + isShowing = savedInstanceState?.getBoolean(STATE_TOOLBAR_LAYOUT_DIALOG) ?: false + view.setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + view.setContent { + AnkiDroidTheme { + if (isShowing) { + ToolbarLayoutDialog( + selected = preferences.layout, + onSelect = { layout -> + preferences.layout = layout + isShowing = false + onChanged() + }, + onDismiss = { isShowing = false }, + showSelectionBackground = Themes.currentTheme != DayTheme.EINK, + ) + } + } + } + } + + fun show() { + isShowing = true + } + + fun onSaveInstanceState(outState: Bundle) { + outState.putBoolean(STATE_TOOLBAR_LAYOUT_DIALOG, isShowing) + } +} + +// TODO: Move these previews to ToolbarLayoutDialog.kt once theming is available in :common:android. +// https://github.com/ankidroid/Anki-Android/issues/22694 +@Preview(name = "Scroll") +@Composable +private fun ToolbarLayoutDialogPreview( + @PreviewParameter(AnkiDroidThemeProvider::class) theme: Theme, +) { + AnkiDroidPreview(theme = theme) { + ToolbarLayoutDialog( + selected = ToolbarLayoutMode.SCROLL, + onSelect = {}, + onDismiss = {}, + showSelectionBackground = theme != DayTheme.EINK, + ) + } +} + +@Preview(name = "Stack") +@Composable +private fun ToolbarLayoutDialogStackPreview( + @PreviewParameter(AnkiDroidThemeProvider::class) theme: Theme, +) { + AnkiDroidPreview(theme = theme) { + ToolbarLayoutDialog( + selected = ToolbarLayoutMode.STACK, + onSelect = {}, + onDismiss = {}, + showSelectionBackground = theme != DayTheme.EINK, + ) + } +} + +@Preview(name = "Hidden") +@Composable +private fun ToolbarLayoutDialogHiddenPreview( + @PreviewParameter(AnkiDroidThemeProvider::class) theme: Theme, +) { + AnkiDroidPreview(theme = theme) { + ToolbarLayoutDialog( + selected = ToolbarLayoutMode.HIDDEN, + onSelect = {}, + onDismiss = {}, + showSelectionBackground = theme != DayTheme.EINK, + ) + } +} + +@Preview(name = "Large text - short window", widthDp = 320, heightDp = 240, fontScale = 2f) +@Composable +private fun ToolbarLayoutDialogLargeTextPreview( + @PreviewParameter(AnkiDroidThemeProvider::class) theme: Theme, +) { + AnkiDroidPreview(theme = theme) { + ToolbarLayoutDialog( + selected = ToolbarLayoutMode.HIDDEN, + onSelect = {}, + onDismiss = {}, + showSelectionBackground = theme != DayTheme.EINK, + ) + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/AddNewNotesType.kt b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/AddNewNotesType.kt index e684bfbc8d16..896e1a8c2243 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/AddNewNotesType.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/AddNewNotesType.kt @@ -16,6 +16,7 @@ import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.CommonString import com.ichi2.anki.common.time.TimeManager +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.databinding.DialogNewNoteTypeBinding import com.ichi2.anki.launchCatchingTask import com.ichi2.anki.libanki.Utils @@ -28,7 +29,6 @@ import com.ichi2.anki.libanki.getStockNotetype import com.ichi2.anki.ui.internationalization.sentenceCase import com.ichi2.anki.withProgress import com.ichi2.utils.customView -import com.ichi2.utils.dp import com.ichi2.utils.moveCursorToEnd import com.ichi2.utils.negativeButton import com.ichi2.utils.positiveButton diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/ManageNoteTypesState.kt b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/ManageNoteTypesState.kt index 345764127f64..1d87cb41cce4 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/ManageNoteTypesState.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/ManageNoteTypesState.kt @@ -16,8 +16,6 @@ import com.ichi2.anki.utils.Destination /** Encapsulates the entire state for [ManageNotetypes] */ data class ManageNoteTypesState( - /** Indicator if the UI should show a "loading" view to the user */ - val isLoading: Boolean = true, /** List of [Notetype] to show */ val noteTypes: List = emptyList(), /** User entered string to use for filtering the [noteTypes] list */ diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/ManageNoteTypesViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/ManageNoteTypesViewModel.kt index 22fee2a794b5..0ea8ce636fcb 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/ManageNoteTypesViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/ManageNoteTypesViewModel.kt @@ -23,6 +23,8 @@ import com.ichi2.anki.notetype.ManageNoteTypesState.FieldsEditor import com.ichi2.anki.notetype.ManageNoteTypesState.UserMessage import com.ichi2.anki.notetype.NoteTypeItemState.Companion.asModel import com.ichi2.anki.observability.undoableOp +import com.ichi2.anki.progress.HasProgress +import com.ichi2.anki.progress.ProgressManager import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update @@ -30,7 +32,11 @@ import kotlinx.coroutines.launch import net.ankiweb.rsdroid.BackendException import timber.log.Timber -class ManageNoteTypesViewModel : ViewModel() { +class ManageNoteTypesViewModel : + ViewModel(), + HasProgress { + override val progressManager = ProgressManager() + val state: StateFlow field = MutableStateFlow(ManageNoteTypesState()) @@ -40,18 +46,19 @@ class ManageNoteTypesViewModel : ViewModel() { fun refreshNoteTypes() { Timber.i("Refreshing list of notetypes") - state.update { oldState -> oldState.copy(isLoading = true) } viewModelScope.launch { - withCol { safeGetNotetypeNameIdUseCount() } - .onFailure { - state.update { oldState -> - oldState.copy(isLoading = false, error = ReportableException(it)) - } - }.onSuccess { - state.update { oldState -> - oldState.copy(isLoading = false, noteTypes = it) + progressManager.withProgress { + withCol { safeGetNotetypeNameIdUseCount() } + .onFailure { + state.update { oldState -> + oldState.copy(error = ReportableException(it)) + } + }.onSuccess { + state.update { oldState -> + oldState.copy(noteTypes = it) + } } - } + } } } @@ -62,7 +69,7 @@ class ManageNoteTypesViewModel : ViewModel() { oldState.noteTypes.map { it.copy(shouldBeDisplayed = it.name.contains(query, ignoreCase = true)) } - oldState.copy(isLoading = false, noteTypes = matchedNoteTypes, searchQuery = query) + oldState.copy(noteTypes = matchedNoteTypes, searchQuery = query) } } @@ -71,30 +78,30 @@ class ManageNoteTypesViewModel : ViewModel() { name: String, ) { Timber.i("Renaming notetype with id $ntid") - state.update { oldState -> oldState.copy(isLoading = true) } viewModelScope.launch { - undoableOp { - safeRenameNoteType(ntid, name) - .onSuccess { changes -> - state.update { oldState -> - val updatedNoteTypes = - oldState.noteTypes.withUpdatedItem(ntid) { old -> old.copy(name = name) } - oldState.copy(isLoading = false, noteTypes = updatedNoteTypes) - } - return@undoableOp changes - }.onFailure { - // TODO: Change to CardTypeException: https://github.com/ankidroid/Anki-Android-Backend/issues/537 - // Card template 1 in note type 'character' has a problem. - // Expected to find a field replacement on the front of the card template. - state.update { oldState -> - oldState.copy( - isLoading = false, - error = ReportableException(it, it !is BackendException), - ) + progressManager.withProgress { + undoableOp { + safeRenameNoteType(ntid, name) + .onSuccess { changes -> + state.update { oldState -> + val updatedNoteTypes = + oldState.noteTypes.withUpdatedItem(ntid) { old -> old.copy(name = name) } + oldState.copy(noteTypes = updatedNoteTypes) + } + return@undoableOp changes + }.onFailure { + // TODO: Change to CardTypeException: https://github.com/ankidroid/Anki-Android-Backend/issues/537 + // Card template 1 in note type 'character' has a problem. + // Expected to find a field replacement on the front of the card template. + state.update { oldState -> + oldState.copy( + error = ReportableException(it, it !is BackendException), + ) + } + OpChanges.getDefaultInstance() } - OpChanges.getDefaultInstance() - } - OpChanges.getDefaultInstance() + OpChanges.getDefaultInstance() + } } } } @@ -102,34 +109,31 @@ class ManageNoteTypesViewModel : ViewModel() { /** Deletes the note type with [ntid] and also updates the multi select mode status if needed */ fun delete(ntid: NoteTypeId) { Timber.i("Deleting notetype with id $ntid") - state.update { oldState -> oldState.copy(isLoading = true) } - val noteTypesCount = state.value.noteTypes.size + if (state.value.noteTypes.size <= 1) { + state.update { oldState -> oldState.copy(message = UserMessage.DeletingLastModel) } + return + } viewModelScope.launch { - undoableOp { - if (noteTypesCount <= 1) { - state.update { oldState -> - oldState.copy(isLoading = false, message = UserMessage.DeletingLastModel) - } - return@undoableOp OpChanges.getDefaultInstance() - } - safeRemoveNoteType(ntid) - .onSuccess { changes -> - state.update { oldState -> - val updatedNoteTypes = oldState.noteTypes.filterNot { it.id == ntid } - oldState.copy( - isLoading = false, - noteTypes = updatedNoteTypes, - isInMultiSelectMode = updatedNoteTypes.multiSelectModeStatus, - ) - } - return@undoableOp changes - }.onFailure { - state.update { oldState -> - oldState.copy(isLoading = false, error = ReportableException(it)) + progressManager.withProgress { + undoableOp { + safeRemoveNoteType(ntid) + .onSuccess { changes -> + state.update { oldState -> + val updatedNoteTypes = oldState.noteTypes.filterNot { it.id == ntid } + oldState.copy( + noteTypes = updatedNoteTypes, + isInMultiSelectMode = updatedNoteTypes.multiSelectModeStatus, + ) + } + return@undoableOp changes + }.onFailure { + state.update { oldState -> + oldState.copy(error = ReportableException(it)) + } + return@undoableOp OpChanges.getDefaultInstance() } - return@undoableOp OpChanges.getDefaultInstance() - } - OpChanges.getDefaultInstance() + OpChanges.getDefaultInstance() + } } } } @@ -225,39 +229,39 @@ class ManageNoteTypesViewModel : ViewModel() { noteType.copy(isSelected = false) } oldState.copy( - isLoading = true, noteTypes = updateNotetypes, isInMultiSelectMode = false, ) } viewModelScope.launch { - val errors = mutableMapOf() - noteTypesToDelete.forEach { noteType -> - undoableOp { - safeRemoveNoteType(noteType.id) - .onFailure { exception -> - errors[noteType] = exception - OpChanges.getDefaultInstance() - }.onSuccess { return@undoableOp it } - OpChanges.getDefaultInstance() + progressManager.withProgress { + val errors = mutableMapOf() + noteTypesToDelete.forEach { noteType -> + undoableOp { + safeRemoveNoteType(noteType.id) + .onFailure { exception -> + errors[noteType] = exception + OpChanges.getDefaultInstance() + }.onSuccess { return@undoableOp it } + OpChanges.getDefaultInstance() + } + } + // look through any errors we might have and remove from our list of note types the ones + // that were in noteTypesToDelete but not in errors map(which presumably weren't deleted) + val removedIds = noteTypesToDelete.map { it.id } - errors.keys.map { it.id }.toSet() + val updatedNoteTypes = state.value.noteTypes.filterNot { it.id in removedIds } + val combinedException = + CombinedException.from( + errors.map { (state, throwable) -> + "${state.name} - $throwable" to throwable + }, + ) + state.update { oldState -> + oldState.copy( + noteTypes = updatedNoteTypes, + error = combinedException?.let { throwable -> ReportableException(throwable) }, + ) } - } - // look through any errors we might have and remove from our list of note types the ones - // that were in noteTypesToDelete but not in errors map(which presumably weren't deleted) - val removedIds = noteTypesToDelete.map { it.id } - errors.keys.map { it.id }.toSet() - val updatedNoteTypes = state.value.noteTypes.filterNot { it.id in removedIds } - val combinedException = - CombinedException.from( - errors.map { (state, throwable) -> - "${state.name} - $throwable" to throwable - }, - ) - state.update { oldState -> - oldState.copy( - isLoading = false, - noteTypes = updatedNoteTypes, - error = combinedException?.let { throwable -> ReportableException(throwable) }, - ) } } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/ManageNotetypes.kt b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/ManageNotetypes.kt index 681ca558fe51..8d1b39942cf6 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/ManageNotetypes.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/ManageNotetypes.kt @@ -8,7 +8,6 @@ import android.content.Intent import android.os.Bundle import android.view.Menu import android.view.MenuItem -import android.view.View import android.view.ViewGroup import androidx.activity.OnBackPressedCallback import androidx.activity.enableEdgeToEdge @@ -20,38 +19,36 @@ import androidx.annotation.VisibleForTesting import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.Toolbar -import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat.Type.displayCutout import androidx.core.view.WindowInsetsCompat.Type.ime import androidx.core.view.WindowInsetsCompat.Type.systemBars import androidx.core.view.isVisible +import androidx.core.view.marginBottom import androidx.core.view.updateMargins import androidx.core.view.updateMarginsRelative import androidx.core.view.updatePadding import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle -import com.google.android.material.behavior.HideViewOnScrollBehavior import com.ichi2.anki.AnkiActivity import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CommonPlurals import com.ichi2.anki.CommonString import com.ichi2.anki.R import com.ichi2.anki.common.crashreporting.CrashReportService +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.databinding.ActivityManageNoteTypesBinding -import com.ichi2.anki.dialogs.dismissLoadingDialog -import com.ichi2.anki.dialogs.showLoadingDialog import com.ichi2.anki.launchCatchingTask import com.ichi2.anki.notetype.ManageNoteTypesState.UserMessage +import com.ichi2.anki.progress.observeProgress import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.anki.startup.ensureStorageIsReady import com.ichi2.anki.sync.userAcceptsSchemaChange import com.ichi2.anki.utils.Destination import com.ichi2.themes.setTransparentStatusBar import com.ichi2.ui.AccessibleSearchView -import com.ichi2.utils.dp import com.ichi2.utils.getInputField import com.ichi2.utils.getInputTextLayout import com.ichi2.utils.input @@ -63,6 +60,7 @@ import com.ichi2.utils.title import dev.androidbroadcast.vbpd.viewBinding import kotlinx.coroutines.launch import timber.log.Timber +import com.ichi2.anki.common.android.R as CommonR class ManageNotetypes : AnkiActivity(R.layout.activity_manage_note_types) { @VisibleForTesting @@ -107,13 +105,12 @@ class ManageNotetypes : AnkiActivity(R.layout.activity_manage_note_types) { setTransparentStatusBar() enableToolbar() binding.noteTypesList.adapter = notetypesAdapter + observeProgress(viewModel) { it } binding.floatingActionButton.apply { setOnClickListener { val addNewNotesType = AddNewNotesType(this@ManageNotetypes) launchCatchingTask { addNewNotesType.showAddNewNotetypeDialog() } } - val params = (layoutParams as? CoordinatorLayout.LayoutParams) - (params?.behavior as? HideViewOnScrollBehavior)?.setViewEdge(HideViewOnScrollBehavior.EDGE_BOTTOM) } binding.btnClearSelection.setOnClickListener { viewModel.clearSelection() } @@ -169,15 +166,23 @@ class ManageNotetypes : AnkiActivity(R.layout.activity_manage_note_types) { } private fun applyInsets() { + // Material 3 supplies the FAB size before layout. + val fabSize = binding.floatingActionButton.customSize + val fabBottomMargin = binding.floatingActionButton.marginBottom ViewCompat.setOnApplyWindowInsetsListener(binding.rootLayout) { _, insets -> val constraints = insets.getInsets(systemBars() or displayCutout() or ime()) Timber.d("Applying insets: $constraints") binding.appBarLayout.updatePadding(left = constraints.left, top = constraints.top, right = constraints.right) - binding.noteTypesList.updatePadding(left = constraints.left, right = constraints.right, bottom = constraints.bottom) + binding.noteTypesList.updatePadding( + left = constraints.left, + right = constraints.right, + // FAB size + its layout margin + a 16dp gap. + bottom = constraints.bottom + fabSize + fabBottomMargin + 16.dp.toPx(this), + ) val fabLayoutParams = binding.floatingActionButton.layoutParams as ViewGroup.MarginLayoutParams // also applies the 32dp bottom/end margin to not sit right on top of navigation bar fabLayoutParams.updateMarginsRelative( - bottom = constraints.bottom + 32.dp.toPx(this), + bottom = constraints.bottom + fabBottomMargin, end = constraints.right + 32.dp.toPx(this), ) // needed otherwise the updated relative margins are not seen @@ -205,11 +210,6 @@ class ManageNotetypes : AnkiActivity(R.layout.activity_manage_note_types) { viewModel.clearError() return } - if (state.isLoading) { - showLoadingDialog() - } else { - dismissLoadingDialog() - } // send only the items that should be displayed notetypesAdapter.submitList(state.noteTypes.filter { it.shouldBeDisplayed }) notetypesAdapter.isInMultiSelectMode = state.isInMultiSelectMode @@ -292,7 +292,7 @@ class ManageNotetypes : AnkiActivity(R.layout.activity_manage_note_types) { viewModel.rename(state.id, userInput) } negativeButton(CommonString.dialog_cancel) - setView(R.layout.dialog_generic_text_input) + setView(CommonR.layout.dialog_generic_text_input) }.input( hint = TR.deckConfigNamePrompt(), prefill = state.name, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/NoteTypesAdapter.kt b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/NoteTypesAdapter.kt index 5dbed590b9d7..a8c11019ae77 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/NoteTypesAdapter.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/NoteTypesAdapter.kt @@ -15,6 +15,7 @@ import com.ichi2.anki.R import com.ichi2.anki.databinding.ItemManageNoteTypeBinding import com.ichi2.anki.notetype.NoteTypesAdapter.NoteTypeViewHolder import com.ichi2.anki.utils.ext.usingStyledAttributes +import com.ichi2.anki.common.android.R as CommonR private val notetypeNamesAndCountDiff = object : DiffUtil.ItemCallback() { @@ -91,7 +92,7 @@ internal class NoteTypesAdapter( getResourceId(0, 0) } private val selectedNoteTypeBackground: Int = - context.usingStyledAttributes(null, intArrayOf(R.attr.currentDeckBackground)) { + context.usingStyledAttributes(null, intArrayOf(CommonR.attr.currentDeckBackground)) { getResourceId(0, 0) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/RenameCardTypeDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/RenameCardTypeDialog.kt index 8e5721498b82..e8b6a485bed2 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/RenameCardTypeDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/RenameCardTypeDialog.kt @@ -6,13 +6,13 @@ import android.content.Context import androidx.appcompat.app.AlertDialog import com.ichi2.anki.CollectionManager import com.ichi2.anki.CommonString -import com.ichi2.anki.R import com.ichi2.utils.ValidationResult import com.ichi2.utils.input import com.ichi2.utils.negativeButton import com.ichi2.utils.positiveButton import com.ichi2.utils.show import com.ichi2.utils.title +import com.ichi2.anki.common.android.R as CommonR class RenameCardTypeDialog { companion object { @@ -35,7 +35,7 @@ class RenameCardTypeDialog { title(CommonString.rename_card_type) positiveButton(CommonString.rename) { } negativeButton(CommonString.dialog_cancel) - setView(R.layout.dialog_generic_text_input) + setView(CommonR.layout.dialog_generic_text_input) }.input( hint = CollectionManager.TR.actionsNewName().removeSuffix(":"), displayKeyboard = true, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/RepositionCardTemplateDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/RepositionCardTemplateDialog.kt index c4f54bfcb272..f1bd4e2ed705 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/notetype/RepositionCardTemplateDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/notetype/RepositionCardTemplateDialog.kt @@ -7,12 +7,12 @@ import android.text.InputType import androidx.appcompat.app.AlertDialog import com.ichi2.anki.CollectionManager import com.ichi2.anki.CommonString -import com.ichi2.anki.R import com.ichi2.utils.getInputField import com.ichi2.utils.input import com.ichi2.utils.negativeButton import com.ichi2.utils.positiveButton import com.ichi2.utils.show +import com.ichi2.anki.common.android.R as CommonR class RepositionCardTemplateDialog { companion object { @@ -38,7 +38,7 @@ class RepositionCardTemplateDialog { } negativeButton(CommonString.dialog_cancel) setMessage(CollectionManager.TR.cardTemplatesEnterNewCardPosition1(numberOfTemplates)) - setView(R.layout.dialog_generic_text_input) + setView(CommonR.layout.dialog_generic_text_input) }.input( inputType = InputType.TYPE_CLASS_NUMBER, displayKeyboard = true, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/pages/AnkiPackageImporterFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/pages/AnkiPackageImporterFragment.kt index 470f8cec5825..56bd6f6077fe 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/pages/AnkiPackageImporterFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/pages/AnkiPackageImporterFragment.kt @@ -19,7 +19,7 @@ import com.ichi2.utils.WebViewVersion class AnkiPackageImporterFragment : PageFragment() { override val pagePath: String by lazy { - val filePath = requireArguments().getString(KEY_FILE_PATH) + val filePath = requireArguments().getString(ARG_FILE_PATH) "import-anki-package$filePath" } @@ -85,13 +85,13 @@ class AnkiPackageImporterFragment : PageFragment() { } companion object { - private const val KEY_FILE_PATH = "filePath" + private const val ARG_FILE_PATH = "filePath" fun getIntent( context: Context, filePath: String, ): Intent { - val arguments = Bundle().apply { putString(KEY_FILE_PATH, filePath) } + val arguments = Bundle().apply { putString(ARG_FILE_PATH, filePath) } return SingleFragmentActivity.getIntent(context, AnkiPackageImporterFragment::class, arguments) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/pages/CardInfoDestination.kt b/AnkiDroid/src/main/java/com/ichi2/anki/pages/CardInfoDestination.kt index 9a465e6c4244..c58b5f626ba2 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/pages/CardInfoDestination.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/pages/CardInfoDestination.kt @@ -17,8 +17,8 @@ fun CardInfoDestination.toIntent(context: Context): Intent { val title = entryPoint.toCardInfoTitle(context) val arguments = Bundle().apply { - putString(CardInfoFragment.KEY_TITLE, title) - putLong(CardInfoFragment.KEY_CARD_ID, cardId) + putString(CardInfoFragment.ARG_TITLE, title) + putLong(CardInfoFragment.ARG_CARD_ID, cardId) } return SingleFragmentActivity.getIntent( context, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/pages/CardInfoFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/pages/CardInfoFragment.kt index 58cb6d70e61b..149558c54e69 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/pages/CardInfoFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/pages/CardInfoFragment.kt @@ -9,7 +9,7 @@ import com.ichi2.anki.R class CardInfoFragment : PageFragment() { override val pagePath: String by lazy { - val cardId = requireArguments().getLong(KEY_CARD_ID) + val cardId = requireArguments().getLong(ARG_CARD_ID) "card-info/$cardId" } @@ -18,14 +18,14 @@ class CardInfoFragment : PageFragment() { savedInstanceState: Bundle?, ) { super.onViewCreated(view, savedInstanceState) - val title = requireArguments().getString(KEY_TITLE) + val title = requireArguments().getString(ARG_TITLE) if (title != null) { view.findViewById(R.id.toolbar)?.setTitle(title) } } companion object { - const val KEY_CARD_ID = "cardId" - const val KEY_TITLE = "title" + const val ARG_CARD_ID = "cardId" + const val ARG_TITLE = "title" } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/pages/CongratsPage.kt b/AnkiDroid/src/main/java/com/ichi2/anki/pages/CongratsPage.kt index 3231227bdd5e..110922dfa428 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/pages/CongratsPage.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/pages/CongratsPage.kt @@ -7,7 +7,6 @@ import android.content.Intent import android.os.Bundle import android.view.View import androidx.appcompat.app.AlertDialog -import androidx.fragment.app.FragmentActivity import androidx.fragment.app.setFragmentResultListener import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle @@ -21,26 +20,22 @@ import com.google.android.material.appbar.MaterialToolbar import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.CommonString -import com.ichi2.anki.DeckPicker import com.ichi2.anki.OnErrorListener import com.ichi2.anki.R import com.ichi2.anki.SingleFragmentActivity import com.ichi2.anki.common.destinations.DeckOptionsDestination import com.ichi2.anki.common.destinations.StudyOptionsDestination import com.ichi2.anki.common.destinations.navigate -import com.ichi2.anki.common.preferences.sharedPrefs -import com.ichi2.anki.common.time.SECONDS_PER_DAY -import com.ichi2.anki.common.time.TIME_HOUR -import com.ichi2.anki.common.time.TIME_MINUTE -import com.ichi2.anki.common.utils.android.showThemedToast import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog.CustomStudyAction import com.ichi2.anki.launchCatchingIO import com.ichi2.anki.launchCatchingTask import com.ichi2.anki.observability.ChangeManager import com.ichi2.anki.observability.undoableOp -import com.ichi2.anki.snackbar.showSnackbar +import com.ichi2.anki.study.StudyAvailability +import com.ichi2.anki.study.currentDeckStudyState import com.ichi2.anki.ui.internationalization.sentenceCase +import com.ichi2.anki.utils.ext.showDialogFragment import com.ichi2.utils.listItems import com.ichi2.utils.negativeButton import com.ichi2.utils.show @@ -49,7 +44,6 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import timber.log.Timber -import kotlin.math.round class CongratsPage : PageFragment(), @@ -185,71 +179,12 @@ class CongratsPage : private fun onStudyMore() { launchCatchingTask { val customStudy = CustomStudyDialog.createInstance(deckId = withCol { decks.selected() }) - customStudy.show(childFragmentManager, null) + requireActivity().showDialogFragment(customStudy) } } companion object { fun getIntent(context: Context): Intent = SingleFragmentActivity.getIntent(context, fragmentClass = CongratsPage::class) - - private fun displayNewCongratsScreen(context: Context): Boolean = context.sharedPrefs().getBoolean("new_congrats_screen", false) - - fun display(activity: FragmentActivity) { - if (displayNewCongratsScreen(activity)) { - activity.startActivity(getIntent(activity)) - } else { - activity.launchCatchingTask { - val message = getDeckFinishedMessage(activity) - showThemedToast(activity, message, false) - } - } - } - - fun onReviewsCompleted( - activity: FragmentActivity, - cardsInDeck: Boolean, - ) { - if (displayNewCongratsScreen(activity)) { - activity.startActivity(getIntent(activity)) - return - } - - // Show a message when reviewing has finished - if (cardsInDeck) { - activity.launchCatchingTask { - val message = getDeckFinishedMessage(activity) - activity.showSnackbar(message) - } - } else { - activity.showSnackbar(CommonString.studyoptions_no_cards_due) - } - } - - // based in https://github.com/ankitects/anki/blob/9b4dd54312de8798a3f2bee07892bb3a488d1f9b/ts/routes/congrats/lib.ts#L8C17-L8C34 - private suspend fun getDeckFinishedMessage(activity: FragmentActivity): String { - val info = withCol { sched.congratulationsInfo() } - val secsUntilNextLearn = info.secsUntilNextLearn - if (secsUntilNextLearn >= SECONDS_PER_DAY) { - return activity.getString(CommonString.studyoptions_congrats_finished) - } - // https://github.com/ankitects/anki/blob/9b4dd54312de8798a3f2bee07892bb3a488d1f9b/ts/lib/tslib/time.ts#L22 - val (unit, amount) = - if (secsUntilNextLearn < TIME_MINUTE) { - "seconds" to secsUntilNextLearn.toDouble() - } else if (secsUntilNextLearn < TIME_HOUR) { - "minutes" to secsUntilNextLearn / TIME_MINUTE - } else { - "hours" to secsUntilNextLearn / TIME_HOUR - } - - val nextLearnDue = TR.schedulingNextLearnDue(unit, round(amount).toInt()) - return activity.getString(CommonString.studyoptions_congrats_next_due_in, nextLearnDue) - } - - fun DeckPicker.onDeckCompleted() { - Timber.i("Opening CongratsPage") - startActivity(getIntent(this)) - } } } @@ -310,8 +245,8 @@ class CongratsViewModel : } } - /** Called every time the screen becomes STARTED. [isDeckFinished] is cheap so it's always - * run, but the (latency-sensitive) reload/navigation only happens if something was actually + /** Called every time the screen becomes STARTED. [isDeckFinished] is always checked, + * but reload/navigation only happens if something was actually * missed while unwatched, or the deck no longer needs the congrats page. */ suspend fun refreshIfNeeded() { // desktop's Overview re-checks sched._is_finished() on every refresh instead of @@ -332,7 +267,7 @@ class CongratsViewModel : ) } - private suspend fun isDeckFinished(): Boolean = withCol { sched.counts().count() == 0 } + private suspend fun isDeckFinished(): Boolean = withCol { currentDeckStudyState().availability == StudyAvailability.NoCardsAvailable } } sealed class UnburyState { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/pages/CsvImporter.kt b/AnkiDroid/src/main/java/com/ichi2/anki/pages/CsvImporter.kt index 0bdf0f94eb28..649aa083f921 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/pages/CsvImporter.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/pages/CsvImporter.kt @@ -23,7 +23,7 @@ import com.ichi2.utils.WebViewVersion */ class CsvImporter : PageFragment() { override val pagePath: String by lazy { - val filePath = requireArguments().getString(KEY_FILE_PATH) + val filePath = requireArguments().getString(ARG_FILE_PATH) "import-csv$filePath" } @@ -90,7 +90,7 @@ class CsvImporter : PageFragment() { } companion object { - private const val KEY_FILE_PATH = "filePath" + private const val ARG_FILE_PATH = "filePath" /** * @param filePath path of the csv file that will be imported, which should be accessible by AnkiDroid @@ -100,7 +100,7 @@ class CsvImporter : PageFragment() { context: Context, filePath: String, ): Intent { - val arguments = Bundle().apply { putString(KEY_FILE_PATH, filePath) } + val arguments = Bundle().apply { putString(ARG_FILE_PATH, filePath) } return SingleFragmentActivity.getIntent(context, fragmentClass = CsvImporter::class, arguments) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/pages/DeckOptions.kt b/AnkiDroid/src/main/java/com/ichi2/anki/pages/DeckOptions.kt index 7bc8b3ae0623..af6ef7f961c2 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/pages/DeckOptions.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/pages/DeckOptions.kt @@ -39,10 +39,10 @@ import java.util.concurrent.atomic.AtomicInteger @NeedsTest("15130: pressing back: icon + button should return to options if the manual is open") @NeedsTest("17905: pressing back before the webpage is ready closes the screen") class DeckOptions : PageFragment() { - private val deckId: DeckId by lazy { requireArguments().getLong(KEY_DECK_ID) } + private val deckId: DeckId by lazy { requireArguments().getLong(ARG_DECK_ID) } override val pagePath: String by lazy { - val deckId = requireArguments().getLong(KEY_DECK_ID) + val deckId = requireArguments().getLong(ARG_DECK_ID) "deck-options/$deckId" } private var webViewIsReady = false @@ -433,7 +433,7 @@ class DeckOptions : PageFragment() { } companion object { - private const val KEY_DECK_ID = "deckId" + private const val ARG_DECK_ID = "deckId" fun getIntent( context: Context, @@ -442,7 +442,7 @@ class DeckOptions : PageFragment() { SingleFragmentActivity.getIntent( context, fragmentClass = DeckOptions::class, - arguments = Bundle().apply { putLong(KEY_DECK_ID, deckId) }, + arguments = Bundle().apply { putLong(ARG_DECK_ID, deckId) }, ) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/pages/Statistics.kt b/AnkiDroid/src/main/java/com/ichi2/anki/pages/Statistics.kt index 0ccdbc002a96..403face772c1 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/pages/Statistics.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/pages/Statistics.kt @@ -7,6 +7,7 @@ import android.print.PrintAttributes import android.print.PrintJob import android.print.PrintManager import android.view.View +import androidx.annotation.VisibleForTesting import androidx.core.content.ContextCompat.getSystemService import com.ichi2.anki.CollectionManager import com.ichi2.anki.CollectionManager.withCol @@ -20,6 +21,7 @@ import com.ichi2.anki.dialogs.startDeckSelection import com.ichi2.anki.launchCatchingTask import com.ichi2.anki.model.SelectableDeck import com.ichi2.anki.snackbar.showSnackbar +import com.ichi2.anki.updateBottomNavOnScroll import com.ichi2.anki.withProgress import dev.androidbroadcast.vbpd.viewBinding import timber.log.Timber @@ -60,12 +62,22 @@ class Statistics : PageFragment(R.layout.page_statistics) { requireActivity().launchCatchingTask { withProgress { val deckName = - savedInstanceState?.getString(KEY_DECK_NAME, null) ?: withCol { decks.current().name } + savedInstanceState?.getString(STATE_DECK_NAME, null) ?: withCol { decks.current().name } changeDeck(deckName) } } } + override fun onWebViewCreated() { + // Also called when the WebView is recreated after a renderer crash, so the listener is re-attached. + webViewLayout.setOnScrollChangeListener { webView, _, scrollY, _, oldScrollY -> + val dy = scrollY - oldScrollY + // Hiding the bar makes the page taller, which pulls a scroll at the bottom back up. + // That scroll comes from the resize, not the user: reacting to it would show the bar again. + if (!webView.scrolledUpToBottom(dy)) updateBottomNavOnScroll(dy) + } + } + /** Prepares and initiates a printing task for the content(stats) displayed in the WebView. * It uses the Android PrintManager service to create a print job, based on the content of the WebView. * The resulting output is a PDF document. **/ @@ -100,7 +112,7 @@ class Statistics : PageFragment(R.layout.page_statistics) { override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - outState.putString(KEY_DECK_NAME, binding.deckName.text.toString()) + outState.putString(STATE_DECK_NAME, binding.deckName.text.toString()) } /** @@ -124,9 +136,18 @@ class Statistics : PageFragment(R.layout.page_statistics) { companion object { const val ARG_HIDE_BACK_BUTTON = "hideBackButton" - private const val KEY_DECK_NAME = "key_deck_name" + private const val STATE_DECK_NAME = "key_deck_name" } } private val PrintJob.isActive: Boolean get() = !isCompleted && !isFailed && !isCancelled + +/** + * Whether scrolling up by [dy] left this view at the bottom of its scrollable content. + * + * Scrolling up moves away from the bottom, so this only happens when the view grew and scrolled + * itself back into range. + */ +@VisibleForTesting +internal fun View.scrolledUpToBottom(dy: Int) = dy < 0 && canScrollVertically(-1) && !canScrollVertically(1) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/AppearanceSettingsFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/AppearanceSettingsFragment.kt index b737c620a86a..eb7d278ad53e 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/AppearanceSettingsFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/AppearanceSettingsFragment.kt @@ -31,6 +31,7 @@ import com.ichi2.utils.positiveButton import com.ichi2.utils.show import com.ichi2.utils.title import timber.log.Timber +import com.ichi2.anki.common.android.R as CommonR class AppearanceSettingsFragment : SettingsFragment() { private var backgroundImage: Preference? = null @@ -131,7 +132,7 @@ class AppearanceSettingsFragment : SettingsFragment() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { // Drop "Follow system" option (the first one) appThemePref.entries = resources.getStringArray(R.array.app_theme_labels).drop(1).toTypedArray() - appThemePref.entryValues = resources.getStringArray(R.array.app_theme_values).drop(1).toTypedArray() + appThemePref.entryValues = resources.getStringArray(CommonR.array.app_theme_values).drop(1).toTypedArray() if (appTheme == AppTheme.FOLLOW_SYSTEM) { appThemePref.value = getString(Themes.currentTheme.entryResId) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/CustomSyncServerSettingsFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/CustomSyncServerSettingsFragment.kt index 4c6c3da7cd1f..a335cfd07c27 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/CustomSyncServerSettingsFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/CustomSyncServerSettingsFragment.kt @@ -69,7 +69,7 @@ class CustomSyncServerSettingsFragment : SettingsFragment() { key == SyncPreferences.CUSTOM_SYNC_ENABLED ) { prefs.edit { - remove(SyncPreferences.CURRENT_SYNC_URI) + remove(SyncPreferences.PREF_CURRENT_SYNC_URI) } } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/DeveloperOptionsFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/DeveloperOptionsFragment.kt index c879fc2a4517..1f2111311d30 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/DeveloperOptionsFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/DeveloperOptionsFragment.kt @@ -10,6 +10,7 @@ import androidx.preference.SwitchPreferenceCompat import com.ichi2.anki.AnkiDroidApp import com.ichi2.anki.BuildConfig import com.ichi2.anki.CollectionManager.withCol +import com.ichi2.anki.CommonPreferenceKey import com.ichi2.anki.CommonString import com.ichi2.anki.R import com.ichi2.anki.analytics.AnkiDroidUsageAnalytics @@ -173,7 +174,7 @@ class DeveloperOptionsFragment : SettingsFragment() { * with a "Review reminders" button, so we need to immediately reload the settings activity * to make this change show up. */ - requirePreference(R.string.pref_new_review_reminders).setOnPreferenceChangeListener { _, _ -> + requirePreference(CommonPreferenceKey.pref_new_review_reminders).setOnPreferenceChangeListener { _, _ -> ActivityCompat.recreate(requireActivity()) true } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/HeaderFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/HeaderFragment.kt index 2863e31edd7f..2c0186e42cf3 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/HeaderFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/HeaderFragment.kt @@ -240,7 +240,7 @@ class HeaderFragment : SettingsFragment() { fun getHeaderKeyForFragment(fragment: Fragment): Int? = when (fragment) { is GeneralSettingsFragment -> R.string.pref_general_screen_key - is ReviewingSettingsFragment -> R.string.pref_reviewing_screen_key + is ReviewingSettingsFragment, is TimeboxSettingsFragment -> R.string.pref_reviewing_screen_key is SyncSettingsFragment, is CustomSyncServerSettingsFragment -> R.string.pref_sync_screen_key is NotificationsSettingsFragment -> R.string.pref_notifications_screen_key is ScheduleRemindersFragment -> R.string.pref_review_reminders_screen_key diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/NotificationsSettingsFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/NotificationsSettingsFragment.kt index 0fa56bebdcbe..e52c9eda0b02 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/NotificationsSettingsFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/NotificationsSettingsFragment.kt @@ -8,6 +8,7 @@ import android.content.Intent import androidx.core.app.PendingIntentCompat import androidx.preference.ListPreference import androidx.preference.SwitchPreferenceCompat +import com.ichi2.anki.CommonPreferenceKey import com.ichi2.anki.R import com.ichi2.anki.common.android.AdaptionUtil import com.ichi2.anki.common.time.TimeManager @@ -32,7 +33,7 @@ class NotificationsSettingsFragment : SettingsFragment() { } // Minimum cards due // The number of cards that should be due today in a deck to justify adding a notification. - requirePreference(R.string.pref_notifications_minimum_cards_due_key).apply { + requirePreference(CommonPreferenceKey.pref_notifications_minimum_cards_due_key).apply { updateNotificationPreference(this) setOnPreferenceChangeListener { preference, newValue -> updateNotificationPreference(preference as ListPreference) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/Preferences.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/Preferences.kt index 8fb8165f8656..a96bac253477 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/Preferences.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/Preferences.kt @@ -120,6 +120,12 @@ class PreferencesFragment : return } + if (result.key == getString(R.string.time_limit_preference)) { + Timber.i("Preferences:: Opening timebox settings from search result") + openPreferencesFragmentFromSearch(TimeboxSettingsFragment()) + return + } + val fragment = getFragmentFromXmlRes(result.resourceFile) ?: return openPreferencesFragmentFromSearch(fragment) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/ReviewingSettingsFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/ReviewingSettingsFragment.kt index 99d011d9333e..8ff4fcedc666 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/ReviewingSettingsFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/ReviewingSettingsFragment.kt @@ -6,6 +6,8 @@ import android.content.Context import androidx.annotation.VisibleForTesting import anki.config.copy import com.ichi2.anki.CollectionManager.withCol +import com.ichi2.anki.CommonPlurals +import com.ichi2.anki.CommonString import com.ichi2.anki.R import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.common.time.TimeManager @@ -41,14 +43,9 @@ class ReviewingSettingsFragment : SettingsFragment() { } // Timebox time limit // Represents in Android preferences the collections configuration "timeLim": i.e. - // the duration of a review timebox in minute. Each TIME_LIMIT minutes, a message appear suggesting to halt and giving the number of card reviewed - // Note that "timeLim" is in seconds while TIME_LIMIT is in minutes. - requirePreference(R.string.time_limit_preference).apply { - launchCatchingTask { setValue(CollectionPreferences.getTimeboxTimeLimit().toInt(DurationUnit.MINUTES)) } - setOnPreferenceChangeListener { newValue -> - launchCatchingTask { CollectionPreferences.setTimeboxTimeLimit(newValue.toDuration(DurationUnit.MINUTES)) } - } - } + // the duration of a review timebox in minute. Each TIME_LIMIT minutes, a message appears suggesting to halt and giving the number of cards reviewed. + // Managed in TimeboxSettingsFragment. + updateTimeboxSummary() // Start of next day // Represents the collection pref "rollover" // in sched v2, and crt in sched v1. I.e. at which time of the day does the scheduler reset @@ -59,6 +56,25 @@ class ReviewingSettingsFragment : SettingsFragment() { } } } + + override fun onResume() { + super.onResume() + updateTimeboxSummary() + } + + private fun updateTimeboxSummary() { + launchCatchingTask { + val minutes = CollectionPreferences.getTimeboxTimeLimit().toInt(DurationUnit.MINUTES) + val pref = + findPreference(getString(R.string.time_limit_preference)) ?: return@launchCatchingTask + pref.summary = + if (minutes > 0) { + resources.getQuantityString(CommonPlurals.pref_summ_minutes, minutes, minutes) + } else { + getString(CommonString.disabled) + } + } + } } /** Sets the hour that the collection rolls over to the next day */ diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/SettingsFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/SettingsFragment.kt index e9da4fd0f242..c1e000437884 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/SettingsFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/SettingsFragment.kt @@ -125,7 +125,7 @@ abstract class SettingsFragment : (preference as? DialogFragmentProvider)?.makeDialogFragment() ?: return super.onDisplayPreferenceDialog(preference) Timber.d("displaying custom preference: ${dialogFragment::class.simpleName}") - dialogFragment.arguments = Bundle().apply { putString(PREF_DIALOG_KEY, preference.key) } + dialogFragment.arguments = Bundle().apply { putString(ARG_PREFERENCE_KEY, preference.key) } dialogFragment.setTargetFragment(this, 0) dialogFragment.show(parentFragmentManager, "androidx.preference.PreferenceFragment.DIALOG") } @@ -145,7 +145,7 @@ abstract class SettingsFragment : } companion object { - const val PREF_DIALOG_KEY = "key" + const val ARG_PREFERENCE_KEY = "key" /** * Converts a preference value to a numeric number that diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/TimeboxSettingsFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/TimeboxSettingsFragment.kt new file mode 100644 index 000000000000..27433c83f901 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/TimeboxSettingsFragment.kt @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.preferences + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.runtime.getValue +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.ViewCompositionStrategy +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.ichi2.compose.theme.AnkiDroidTheme + +/** + * Screen allowing users to enable/disable and configure the review timebox time limit. + * + * Hosts the Compose [TimeboxSettingsScreen]. + */ +class TimeboxSettingsFragment : Fragment() { + private val viewModel: TimeboxSettingsViewModel by viewModels() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View = + ComposeView(requireContext()).apply { + setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + setContent { + AnkiDroidTheme { + val state by viewModel.uiState.collectAsStateWithLifecycle() + TimeboxSettingsScreen( + isLoading = state.isLoading, + isEnabled = state.isEnabled, + minutes = state.minutes, + onToggleEnabled = viewModel::toggleEnabled, + onIncrement = viewModel::increment, + onDecrement = viewModel::decrement, + onSetMinutes = viewModel::setMinutes, + onNavigateUp = { requireActivity().onBackPressedDispatcher.onBackPressed() }, + ) + } + } + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/TimeboxSettingsScreen.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/TimeboxSettingsScreen.kt new file mode 100644 index 000000000000..31a35d360ebf --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/TimeboxSettingsScreen.kt @@ -0,0 +1,475 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.preferences + +import android.content.res.Configuration +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.expandVertically +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.shrinkVertically +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.consumeWindowInsets +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.IconButtonDefaults +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedIconButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.OutlinedTextFieldDefaults +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.pluralStringResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.ichi2.anki.CommonPlurals +import com.ichi2.anki.CommonString +import com.ichi2.anki.R +import com.ichi2.compose.theme.AnkiDroidTheme +import com.ichi2.compose.theme.widgetBorder +import com.ichi2.compose.ui.preview.ThemePreviews +import androidx.appcompat.R as AppCompatR +import com.ichi2.anki.common.android.R as CommonR + +/** + * Screen allowing users to enable/disable and configure the review timebox time limit. + * + * Uses the modern Material 3 main switch card styling from Android Settings. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TimeboxSettingsScreen( + isLoading: Boolean, + isEnabled: Boolean, + minutes: Int, + onToggleEnabled: (Boolean) -> Unit, + onIncrement: () -> Unit, + onDecrement: () -> Unit, + onSetMinutes: (Int) -> Unit, + onNavigateUp: () -> Unit, + modifier: Modifier = Modifier, +) { + val isLandscape = LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE + val verticalSpacing = if (isLandscape) 8.dp else 16.dp + + Scaffold( + modifier = modifier, + topBar = { + TopAppBar( + title = { Text(stringResource(CommonString.timeboxing)) }, + navigationIcon = { + IconButton(onClick = onNavigateUp) { + Icon( + painter = painterResource(R.drawable.ic_baseline_arrow_back_24), + contentDescription = stringResource(AppCompatR.string.abc_action_bar_up_description), + ) + } + }, + ) + }, + ) { contentPadding -> + if (isLoading) { + Box( + modifier = + Modifier + .fillMaxSize() + .padding(contentPadding), + contentAlignment = Alignment.Center, + ) { + CircularProgressIndicator() + } + } else { + Column( + modifier = + Modifier + .fillMaxSize() + .padding(contentPadding) + .consumeWindowInsets(contentPadding) + .navigationBarsPadding() + .imePadding() + .verticalScroll(rememberScrollState()) + .padding(horizontal = 16.dp, vertical = if (isLandscape) 4.dp else 8.dp) + .padding(bottom = 32.dp), + ) { + TimeboxMainSwitch( + isEnabled = isEnabled, + onToggleEnabled = onToggleEnabled, + ) + + Spacer(modifier = Modifier.height(verticalSpacing)) + + AnimatedVisibility( + visible = isEnabled, + enter = fadeIn() + expandVertically(), + exit = fadeOut() + shrinkVertically(), + ) { + Column { + TimeboxDurationCard( + minutes = minutes, + onSetMinutes = onSetMinutes, + ) + Spacer(modifier = Modifier.height(verticalSpacing)) + } + } + + TimeboxHelpSection() + } + } + } +} + +/** + * Modern Material 3 main switch card matching Google Android Settings. + */ +@Composable +private fun TimeboxMainSwitch( + isEnabled: Boolean, + onToggleEnabled: (Boolean) -> Unit, + modifier: Modifier = Modifier, +) { + val isLandscape = LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE + val containerColor = MaterialTheme.colorScheme.surfaceVariant + val contentColor = timeboxContentColor() + + Surface( + modifier = + modifier + .fillMaxWidth() + .clip(RoundedCornerShape(28.dp)) + .clickable { onToggleEnabled(!isEnabled) }, + shape = RoundedCornerShape(28.dp), + color = containerColor, + ) { + val switchLabel = stringResource(CommonString.use_timebox) + Row( + modifier = + Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp, vertical = if (isLandscape) 12.dp else 20.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Text( + text = switchLabel, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + color = contentColor, + modifier = Modifier.weight(1f), + ) + Switch( + checked = isEnabled, + onCheckedChange = onToggleEnabled, + modifier = + Modifier.semantics { + contentDescription = switchLabel + }, + ) + } + } +} + +/** + * Stepper card allowing users to increment/decrement or directly edit the timebox duration inline. + */ +@Composable +private fun TimeboxDurationCard( + minutes: Int, + onSetMinutes: (Int) -> Unit, + modifier: Modifier = Modifier, +) { + val isLandscape = LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE + var textValue by rememberSaveable { mutableStateOf(minutes.toString()) } + val focusManager = LocalFocusManager.current + + LaunchedEffect(minutes) { + if (textValue.toIntOrNull() != minutes) { + textValue = minutes.toString() + } + } + + val validRange = TimeboxSettingsViewModel.MIN_TIMEBOX_MINUTES..TimeboxSettingsViewModel.MAX_TIMEBOX_MINUTES + val count = textValue.toIntOrNull() ?: minutes + val safeCount = if (count in validRange) count else minutes + val unitSuffix = pluralStringResource(CommonPlurals.timebox_minutes_suffix, safeCount) + + val parsed = textValue.toIntOrNull() + val isValid = parsed != null && parsed in validRange + val isError = textValue.isNotEmpty() && !isValid + val controlBorder = MaterialTheme.widgetBorder + val inputBorder = + controlBorder?.let { + if (isError) BorderStroke(it.width, MaterialTheme.colorScheme.error) else it + } + val inputContainerColor = if (controlBorder != null) MaterialTheme.colorScheme.surface else Color.Transparent + val buttonColors = + if (controlBorder != null) { + IconButtonDefaults.outlinedIconButtonColors( + containerColor = MaterialTheme.colorScheme.surface, + contentColor = MaterialTheme.colorScheme.onSurface, + disabledContainerColor = MaterialTheme.colorScheme.surface, + ) + } else { + IconButtonDefaults.filledTonalIconButtonColors() + } + + Surface( + modifier = modifier.fillMaxWidth(), + shape = RoundedCornerShape(16.dp), + color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.05f), + ) { + Column( + modifier = + Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp, vertical = if (isLandscape) 10.dp else 16.dp), + verticalArrangement = Arrangement.spacedBy(12.dp), + ) { + Text( + text = stringResource(CommonString.time_limit_label), + style = MaterialTheme.typography.titleSmall, + color = timeboxContentColor(), + ) + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + OutlinedIconButton( + onClick = { + val currentVal = textValue.toIntOrNull() ?: minutes + val prevVal = (currentVal - 1).coerceIn(validRange) + textValue = prevVal.toString() + onSetMinutes(prevVal) + focusManager.clearFocus() + }, + modifier = Modifier.size(56.dp), + shape = RoundedCornerShape(16.dp), + colors = buttonColors, + border = controlBorder, + enabled = (textValue.toIntOrNull() ?: minutes) > TimeboxSettingsViewModel.MIN_TIMEBOX_MINUTES, + ) { + Icon( + painter = painterResource(R.drawable.ic_remove), + contentDescription = stringResource(CommonString.minus_sign), + ) + } + + OutlinedTextField( + value = textValue, + onValueChange = { input -> + val digits = input.filter { it.isDigit() } + val noLeadingZeros = + if (digits.length > 1 && digits.startsWith("0")) { + digits.trimStart('0').ifEmpty { "0" } + } else { + digits + } + val filtered = noLeadingZeros.take(3) + textValue = filtered + val p = filtered.toIntOrNull() + if (p != null && p in validRange) { + onSetMinutes(p) + } + }, + modifier = + Modifier + .width(136.dp) + .then( + if (inputBorder != null) { + Modifier.border(inputBorder, RoundedCornerShape(12.dp)) + } else { + Modifier + }, + ).onFocusChanged { focusState -> + if (!focusState.isFocused) { + val p = textValue.toIntOrNull() + if (p != null && p in validRange) { + onSetMinutes(p) + } else { + textValue = minutes.toString() + } + } + }, + suffix = { + Text( + text = unitSuffix, + style = MaterialTheme.typography.bodyMedium, + color = timeboxContentColor(), + ) + }, + shape = RoundedCornerShape(12.dp), + colors = + OutlinedTextFieldDefaults.colors( + focusedContainerColor = inputContainerColor, + unfocusedContainerColor = inputContainerColor, + errorContainerColor = inputContainerColor, + ), + textStyle = + LocalTextStyle.current.copy( + textAlign = TextAlign.Start, + fontWeight = FontWeight.Bold, + fontSize = 18.sp, + ), + singleLine = true, + isError = isError, + keyboardOptions = + KeyboardOptions( + keyboardType = KeyboardType.Number, + imeAction = ImeAction.Done, + ), + keyboardActions = + KeyboardActions( + onDone = { + val p = textValue.toIntOrNull() + if (p != null && p in validRange) { + onSetMinutes(p) + } else { + textValue = minutes.toString() + } + focusManager.clearFocus() + }, + ), + ) + + OutlinedIconButton( + onClick = { + val currentVal = textValue.toIntOrNull() ?: minutes + val nextVal = (currentVal + 1).coerceIn(validRange) + textValue = nextVal.toString() + onSetMinutes(nextVal) + focusManager.clearFocus() + }, + modifier = Modifier.size(56.dp), + shape = RoundedCornerShape(16.dp), + colors = buttonColors, + border = controlBorder, + enabled = (textValue.toIntOrNull() ?: minutes) < TimeboxSettingsViewModel.MAX_TIMEBOX_MINUTES, + ) { + Icon( + painter = painterResource(CommonR.drawable.ic_add), + contentDescription = stringResource(CommonString.plus_sign), + ) + } + } + } + } +} + +/** + * Explanatory help section citing the official Anki manual. + */ +@Composable +private fun TimeboxHelpSection(modifier: Modifier = Modifier) { + Row( + modifier = + modifier + .fillMaxWidth() + .padding(horizontal = 8.dp, vertical = 4.dp), + verticalAlignment = Alignment.Top, + ) { + Icon( + painter = painterResource(R.drawable.ic_outline_info_24), + contentDescription = null, + tint = timeboxContentColor(), + modifier = + Modifier + .padding(top = 2.dp, end = 12.dp) + .size(20.dp), + ) + Text( + text = stringResource(CommonString.pref_timebox_help_summary), + style = MaterialTheme.typography.bodyMedium, + color = timeboxContentColor(), + lineHeight = 20.sp, + ) + } +} + +@Composable +private fun timeboxContentColor(): Color = + if (MaterialTheme.widgetBorder != null) { + MaterialTheme.colorScheme.onSurface + } else { + MaterialTheme.colorScheme.onSurfaceVariant + } + +@ThemePreviews +@Composable +private fun TimeboxSettingsScreenEnabledPreview() { + AnkiDroidTheme { + TimeboxSettingsScreen( + isLoading = false, + isEnabled = true, + minutes = 20, + onToggleEnabled = {}, + onIncrement = {}, + onDecrement = {}, + onSetMinutes = {}, + onNavigateUp = {}, + ) + } +} + +@ThemePreviews +@Composable +private fun TimeboxSettingsScreenDisabledPreview() { + AnkiDroidTheme { + TimeboxSettingsScreen( + isLoading = false, + isEnabled = false, + minutes = 20, + onToggleEnabled = {}, + onIncrement = {}, + onDecrement = {}, + onSetMinutes = {}, + onNavigateUp = {}, + ) + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/TimeboxSettingsViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/TimeboxSettingsViewModel.kt new file mode 100644 index 000000000000..b2173ed0ee1a --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/TimeboxSettingsViewModel.kt @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.preferences + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.ichi2.anki.utils.CollectionPreferences +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import kotlin.time.DurationUnit +import kotlin.time.toDuration + +data class TimeboxUiState( + val isLoading: Boolean = true, + val isEnabled: Boolean = false, + val minutes: Int = TimeboxSettingsViewModel.DEFAULT_TIMEBOX_MINUTES, +) + +/** + * State holder for [TimeboxSettingsFragment] and [TimeboxSettingsScreen]. + */ +class TimeboxSettingsViewModel : ViewModel() { + private val _uiState = MutableStateFlow(TimeboxUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + init { + loadSettings() + } + + private fun loadSettings() { + viewModelScope.launch { + val limitMinutes = CollectionPreferences.getTimeboxTimeLimit().toInt(DurationUnit.MINUTES) + val isEnabled = limitMinutes > 0 + val minutes = if (isEnabled) limitMinutes else DEFAULT_TIMEBOX_MINUTES + _uiState.value = + TimeboxUiState( + isLoading = false, + isEnabled = isEnabled, + minutes = minutes, + ) + } + } + + fun toggleEnabled(enabled: Boolean) { + _uiState.update { it.copy(isEnabled = enabled) } + viewModelScope.launch { + // TODO: Follow-up issue: persist the old non-zero time limit in Android storage when disabled so the value is restored on re-enabling + val minutesToSave = if (enabled) _uiState.value.minutes else 0 + CollectionPreferences.setTimeboxTimeLimit(minutesToSave.toDuration(DurationUnit.MINUTES)) + } + } + + fun setMinutes(newMinutes: Int) { + val clamped = newMinutes.coerceIn(MIN_TIMEBOX_MINUTES, MAX_TIMEBOX_MINUTES) + _uiState.update { it.copy(minutes = clamped) } + if (_uiState.value.isEnabled) { + viewModelScope.launch { + CollectionPreferences.setTimeboxTimeLimit(clamped.toDuration(DurationUnit.MINUTES)) + } + } + } + + fun increment() = setMinutes(_uiState.value.minutes + 1) + + fun decrement() = setMinutes(_uiState.value.minutes - 1) + + companion object { + const val DEFAULT_TIMEBOX_MINUTES = 20 + const val MIN_TIMEBOX_MINUTES = 1 + const val MAX_TIMEBOX_MINUTES = 999 + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/AddProfileDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/ProfileNameDialog.kt similarity index 52% rename from AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/AddProfileDialog.kt rename to AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/ProfileNameDialog.kt index e1b2270088d1..366aa9e373d4 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/AddProfileDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/ProfileNameDialog.kt @@ -11,7 +11,7 @@ import com.ichi2.anki.multiprofile.ProfileName import com.ichi2.anki.multiprofile.ProfileName.ValidationResult import com.ichi2.compose.theme.AnkiDroidTheme import com.ichi2.compose.ui.dialogs.TextInputDialog -import com.ichi2.compose.ui.preview.ThemePreviews +import com.ichi2.compose.ui.preview.DialogPreviews /** * Dialog asking for the display name of a new profile. @@ -21,25 +21,65 @@ import com.ichi2.compose.ui.preview.ThemePreviews */ @Composable fun AddProfileDialog( + existingNames: List, + onDismissRequest: () -> Unit, + onConfirm: (ProfileName) -> Unit, +) { + ProfileNameDialog( + title = stringResource(CommonString.add_profile), + confirmText = stringResource(CommonString.dialog_add), + initialText = "", + existingNames = existingNames, + onDismissRequest = onDismissRequest, + onConfirm = onConfirm, + ) +} + +@Composable +fun RenameProfileDialog( + currentName: String, + existingNames: List, + onDismissRequest: () -> Unit, + onConfirm: (ProfileName) -> Unit, +) { + ProfileNameDialog( + title = stringResource(CommonString.rename_profile), + confirmText = stringResource(CommonString.rename), + initialText = currentName, + existingNames = existingNames, + onDismissRequest = onDismissRequest, + onConfirm = onConfirm, + ) +} + +@Composable +private fun ProfileNameDialog( + title: String, + confirmText: String, + initialText: String, + existingNames: List, onDismissRequest: () -> Unit, onConfirm: (ProfileName) -> Unit, ) { val emptyError = stringResource(CommonString.profile_name_empty_error) val tooLongError = stringResource(CommonString.profile_name_too_long_error, ProfileName.MAX_LENGTH) + val nameExistsError = stringResource(CommonString.error_name_exists) TextInputDialog( - title = stringResource(CommonString.add_profile), + title = title, label = stringResource(CommonString.profile_name), - confirmText = stringResource(CommonString.dialog_add), + confirmText = confirmText, onConfirm = { text -> (ProfileName.validate(text) as? ValidationResult.Valid)?.let { onConfirm(it.name) } }, onDismissRequest = onDismissRequest, + initialText = initialText, maxLengthCounter = ProfileName.MAX_LENGTH, + lengthOf = { it.trim().length }, capitalization = KeyboardCapitalization.Words, errorMessageFor = { text -> - when (ProfileName.validate(text)) { - is ValidationResult.Valid -> null + when (val result = ProfileName.validate(text)) { + is ValidationResult.Valid -> nameExistsError.takeIf { result.name.existsIn(existingNames) } is ValidationResult.Empty -> emptyError is ValidationResult.TooLong -> tooLongError } @@ -47,10 +87,18 @@ fun AddProfileDialog( ) } -@ThemePreviews +@DialogPreviews @Composable private fun AddProfileDialogPreview() { AnkiDroidTheme { - AddProfileDialog(onDismissRequest = {}, onConfirm = {}) + AddProfileDialog(existingNames = emptyList(), onDismissRequest = {}, onConfirm = {}) + } +} + +@DialogPreviews +@Composable +private fun RenameProfileDialogPreview() { + AnkiDroidTheme { + RenameProfileDialog(currentName = "Work", existingNames = emptyList(), onDismissRequest = {}, onConfirm = {}) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/SwitchProfilesFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/SwitchProfilesFragment.kt index ece7653126f5..e84ccc100a90 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/SwitchProfilesFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/SwitchProfilesFragment.kt @@ -49,14 +49,18 @@ class SwitchProfilesFragment : Fragment() { AnkiDroidTheme { val profiles by viewModel.profiles.collectAsStateWithLifecycle() val isAddProfileDialogVisible by viewModel.isAddProfileDialogVisible.collectAsStateWithLifecycle() + val profileBeingRenamed by viewModel.profileBeingRenamed.collectAsStateWithLifecycle() SwitchProfilesScreen( profiles = profiles, isAddProfileDialogVisible = isAddProfileDialogVisible, + profileBeingRenamed = profileBeingRenamed, onNavigateUp = { requireActivity().onBackPressedDispatcher.onBackPressed() }, onAddProfileClick = viewModel::showAddProfileDialog, onAddProfileConfirm = viewModel::addProfile, onAddProfileDismiss = viewModel::dismissAddProfileDialog, - onEditProfile = viewModel::editProfile, + onEditProfile = viewModel::showRenameProfileDialog, + onRenameProfileConfirm = viewModel::renameProfile, + onRenameProfileDismiss = viewModel::dismissRenameProfileDialog, onDeleteProfile = viewModel::deleteProfile, ) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/SwitchProfilesScreen.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/SwitchProfilesScreen.kt index 9df62ce27221..71d2425ddc07 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/SwitchProfilesScreen.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/SwitchProfilesScreen.kt @@ -48,11 +48,14 @@ import androidx.appcompat.R as AppCompatR fun SwitchProfilesScreen( profiles: List, isAddProfileDialogVisible: Boolean, + profileBeingRenamed: ProfileItem?, onNavigateUp: () -> Unit, onAddProfileClick: () -> Unit, onAddProfileConfirm: (ProfileName) -> Unit, onAddProfileDismiss: () -> Unit, onEditProfile: (ProfileItem) -> Unit, + onRenameProfileConfirm: (ProfileName) -> Unit, + onRenameProfileDismiss: () -> Unit, onDeleteProfile: (ProfileItem) -> Unit, modifier: Modifier = Modifier, ) { @@ -97,10 +100,20 @@ fun SwitchProfilesScreen( if (isAddProfileDialogVisible) { AddProfileDialog( + existingNames = profiles.map { it.name }, onDismissRequest = onAddProfileDismiss, onConfirm = onAddProfileConfirm, ) } + + profileBeingRenamed?.let { profile -> + RenameProfileDialog( + currentName = profile.name, + existingNames = profiles.filter { it.id != profile.id }.map { it.name }, + onDismissRequest = onRenameProfileDismiss, + onConfirm = onRenameProfileConfirm, + ) + } } private val AvatarSize = 40.dp @@ -176,11 +189,14 @@ private fun SwitchProfilesScreenPreview() { ProfileItem(id = ProfileId("p_work"), name = "Work"), ), isAddProfileDialogVisible = false, + profileBeingRenamed = null, onNavigateUp = {}, onAddProfileClick = {}, onAddProfileConfirm = {}, onAddProfileDismiss = {}, onEditProfile = {}, + onRenameProfileConfirm = {}, + onRenameProfileDismiss = {}, onDeleteProfile = {}, ) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/SwitchProfilesViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/SwitchProfilesViewModel.kt index 681f1282de5a..6d961146d03e 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/SwitchProfilesViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/profiles/SwitchProfilesViewModel.kt @@ -27,6 +27,9 @@ class SwitchProfilesViewModel( val isAddProfileDialogVisible: StateFlow field = MutableStateFlow(false) + val profileBeingRenamed: StateFlow + field = MutableStateFlow(null) + fun showAddProfileDialog() { isAddProfileDialogVisible.value = true } @@ -39,12 +42,24 @@ class SwitchProfilesViewModel( fun addProfile(name: ProfileName) { isAddProfileDialogVisible.value = false Timber.i("Add profile confirmed (%d chars)", name.value.length) - // TODO: handle profile creation via ProfileManager.createNewProfile + profileManager.createNewProfile(name) + refresh() + } + + fun showRenameProfileDialog(profile: ProfileItem) { + profileBeingRenamed.value = profile + } + + fun dismissRenameProfileDialog() { + profileBeingRenamed.value = null } - fun editProfile(profile: ProfileItem) { - Timber.i("Edit profile requested: %s", profile.id) - // TODO: implement profile rename via ProfileManager + fun renameProfile(name: ProfileName) { + val profile = profileBeingRenamed.value ?: return + profileBeingRenamed.value = null + Timber.i("Rename profile confirmed: %s", profile.id) + profileManager.renameProfile(profile.id, name) + refresh() } fun deleteProfile(profile: ProfileItem) { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/reviewer/ViewerAction.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/reviewer/ViewerAction.kt index d19849561f62..b0100fb67249 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/reviewer/ViewerAction.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/reviewer/ViewerAction.kt @@ -16,9 +16,11 @@ import com.ichi2.anki.preferences.reviewer.MenuDisplayType.DISABLED import com.ichi2.anki.preferences.reviewer.MenuDisplayType.MENU_ONLY import com.ichi2.anki.reviewer.Binding import com.ichi2.anki.reviewer.Binding.AppDefinedModifierKeys +import com.ichi2.anki.reviewer.Binding.KeyCode import com.ichi2.anki.reviewer.Binding.ModifierKeys import com.ichi2.anki.reviewer.Binding.ModifierKeys.Companion.ctrl import com.ichi2.anki.reviewer.Binding.ModifierKeys.Companion.shift +import com.ichi2.anki.reviewer.BindingUnicodeCharacter import com.ichi2.anki.reviewer.CardSide import com.ichi2.anki.reviewer.MappableAction import com.ichi2.anki.reviewer.ReviewerBinding @@ -120,13 +122,13 @@ enum class ViewerAction( when (this) { UNDO -> listOf(keycode(KeyEvent.KEYCODE_Z, ctrl())) REDO -> listOf(keycode(KeyEvent.KEYCODE_Z, ModifierKeys(shift = true, ctrl = true))) - MARK -> listOf(unicode('*')) + MARK -> listOf(unicode(BindingUnicodeCharacter('*'))) EDIT -> listOf(keycode(KeyEvent.KEYCODE_E)) ADD_NOTE -> listOf(keycode(KeyEvent.KEYCODE_A)) - BURY_NOTE -> listOf(unicode('=')) - BURY_CARD -> listOf(unicode('-')) - SUSPEND_NOTE -> listOf(unicode('!')) - SUSPEND_CARD -> listOf(unicode('@')) + BURY_NOTE -> listOf(unicode(BindingUnicodeCharacter('='))) + BURY_CARD -> listOf(unicode(BindingUnicodeCharacter('-'))) + SUSPEND_NOTE -> listOf(unicode(BindingUnicodeCharacter('!'))) + SUSPEND_CARD -> listOf(unicode(BindingUnicodeCharacter('@'))) TOGGLE_AUTO_ADVANCE -> listOf(keycode(KeyEvent.KEYCODE_A, shift())) SHOW_HINT -> listOf(keycode(KeyEvent.KEYCODE_H)) SHOW_ALL_HINTS -> listOf(keycode(KeyEvent.KEYCODE_G)) @@ -316,12 +318,12 @@ enum class ViewerAction( keys: ModifierKeys = ModifierKeys.none(), side: CardSide = CardSide.BOTH, ): ReviewerBinding { - val binding = Binding.keyCode(keycode, keys) + val binding = KeyCode(keycode, keys) return ReviewerBinding(binding = binding, side = side) } private fun unicode( - unicodeChar: Char, + unicodeChar: BindingUnicodeCharacter, keys: ModifierKeys = AppDefinedModifierKeys.allowShift(), side: CardSide = CardSide.BOTH, ): ReviewerBinding { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/previewer/CardViewerFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/previewer/CardViewerFragment.kt index b6b381339832..a5255a09f487 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/previewer/CardViewerFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/previewer/CardViewerFragment.kt @@ -312,15 +312,22 @@ abstract class CardViewerFragment( Timber.w("URL blocked") return true } - if (!appPermission.checkCanLaunchExternalApps()) { + val intent = appPermission.createUrlIntent(url) + if (intent == null) { Timber.w("URL blocked: canLaunchExternalApps") return true } try { - openUrl(url) - } catch (_: Throwable) { - Timber.w("Could not open url") - return false + if (intent.hasCategory(Intent.CATEGORY_BROWSABLE)) { + startActivity(intent) + } else { + // Preserve the existing browser check for custom schemes. + openUrl(url) + } + } catch (e: Exception) { + Timber.w(e, "Could not open url") + showSnackbar(CommonString.activity_start_failed) + // Consume failed launches: external pages must not load inside the card. } } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/previewer/CardViewerViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/previewer/CardViewerViewModel.kt index 26af26daee03..4c86c9ab1a1d 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/previewer/CardViewerViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/previewer/CardViewerViewModel.kt @@ -43,7 +43,8 @@ abstract class CardViewerViewModel( val showingAnswer = savedStateHandle.getMutableStateFlow(KEY_SHOWING_ANSWER, false) - protected val cardMediaPlayer = + @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) + val cardMediaPlayer = CardMediaPlayer( javascriptEvaluator = { launchCatchingIO { eval.emit(it) } }, mediaErrorListener = mediaErrorHandler, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerAction.kt b/AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerAction.kt index 01657da992fc..bcd599a90083 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerAction.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerAction.kt @@ -4,9 +4,10 @@ package com.ichi2.anki.previewer import android.content.SharedPreferences import android.view.KeyEvent -import com.ichi2.anki.reviewer.Binding.Companion.keyCode import com.ichi2.anki.reviewer.Binding.Companion.unicode +import com.ichi2.anki.reviewer.Binding.KeyCode import com.ichi2.anki.reviewer.Binding.ModifierKeys.Companion.ctrl +import com.ichi2.anki.reviewer.BindingUnicodeCharacter import com.ichi2.anki.reviewer.MappableAction import com.ichi2.anki.reviewer.MappableBinding @@ -39,19 +40,19 @@ enum class PreviewerAction : MappableAction { private val defaultBindings: List get() { val binding = when (this) { - BACK -> keyCode(KeyEvent.KEYCODE_DPAD_LEFT) - NEXT -> keyCode(KeyEvent.KEYCODE_DPAD_RIGHT) - MARK -> unicode('*') - REPLAY_AUDIO -> keyCode(KeyEvent.KEYCODE_R) - EDIT -> keyCode(KeyEvent.KEYCODE_E) - TOGGLE_BACKSIDE_ONLY -> keyCode(KeyEvent.KEYCODE_B) - TOGGLE_FLAG_RED -> keyCode(KeyEvent.KEYCODE_1, ctrl()) - TOGGLE_FLAG_ORANGE -> keyCode(KeyEvent.KEYCODE_2, ctrl()) - TOGGLE_FLAG_GREEN -> keyCode(KeyEvent.KEYCODE_3, ctrl()) - TOGGLE_FLAG_BLUE -> keyCode(KeyEvent.KEYCODE_4, ctrl()) - TOGGLE_FLAG_PINK -> keyCode(KeyEvent.KEYCODE_5, ctrl()) - TOGGLE_FLAG_TURQUOISE -> keyCode(KeyEvent.KEYCODE_6, ctrl()) - TOGGLE_FLAG_PURPLE -> keyCode(KeyEvent.KEYCODE_7, ctrl()) + BACK -> KeyCode(KeyEvent.KEYCODE_DPAD_LEFT) + NEXT -> KeyCode(KeyEvent.KEYCODE_DPAD_RIGHT) + MARK -> unicode(BindingUnicodeCharacter('*')) + REPLAY_AUDIO -> KeyCode(KeyEvent.KEYCODE_R) + EDIT -> KeyCode(KeyEvent.KEYCODE_E) + TOGGLE_BACKSIDE_ONLY -> KeyCode(KeyEvent.KEYCODE_B) + TOGGLE_FLAG_RED -> KeyCode(KeyEvent.KEYCODE_1, ctrl()) + TOGGLE_FLAG_ORANGE -> KeyCode(KeyEvent.KEYCODE_2, ctrl()) + TOGGLE_FLAG_GREEN -> KeyCode(KeyEvent.KEYCODE_3, ctrl()) + TOGGLE_FLAG_BLUE -> KeyCode(KeyEvent.KEYCODE_4, ctrl()) + TOGGLE_FLAG_PINK -> KeyCode(KeyEvent.KEYCODE_5, ctrl()) + TOGGLE_FLAG_TURQUOISE -> KeyCode(KeyEvent.KEYCODE_6, ctrl()) + TOGGLE_FLAG_PURPLE -> KeyCode(KeyEvent.KEYCODE_7, ctrl()) UNSET_FLAG -> return emptyList() } return listOf(MappableBinding(binding)) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerFragment.kt index 2b46b8fd5f6b..d5d3bdcb528d 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerFragment.kt @@ -29,7 +29,7 @@ import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.common.destinations.navigate import com.ichi2.anki.common.utils.android.showThemedToast import com.ichi2.anki.databinding.FragmentPreviewerBinding -import com.ichi2.anki.previewer.PreviewerFragment.Companion.CARD_IDS_FILE_ARG +import com.ichi2.anki.previewer.PreviewerFragment.Companion.ARG_CARD_IDS_FILE import com.ichi2.anki.reviewer.BindingMap import com.ichi2.anki.reviewer.BindingProcessor import com.ichi2.anki.reviewer.MappableBinding @@ -62,12 +62,12 @@ class PreviewerFragment : // Read before constructing the ViewModel, which immediately loads the first card. val ids = try { - arguments.requireParcelable(CARD_IDS_FILE_ARG).getIds() + arguments.requireParcelable(ARG_CARD_IDS_FILE).getIds() } catch (e: IOException) { throw UnavailableSelectionException(e) } if (ids.isEmpty()) throw UnavailableSelectionException() - PreviewerViewModel(handle, ids, requireNotNull(arguments.getIntOrNull(CURRENT_INDEX_ARG))) + PreviewerViewModel(handle, ids, requireNotNull(arguments.getIntOrNull(ARG_CURRENT_INDEX))) } } @@ -308,11 +308,11 @@ class PreviewerFragment : ) : Exception("Unable to load preview selection", cause) companion object { - /** Index of the card to be first displayed among the IDs provided by [CARD_IDS_FILE_ARG] */ - const val CURRENT_INDEX_ARG = "currentIndex" + /** Index of the card to be first displayed among the IDs provided by [ARG_CARD_IDS_FILE] */ + const val ARG_CURRENT_INDEX = "currentIndex" /** Argument key to a [IdsFile] with the IDs of the cards to be displayed */ - const val CARD_IDS_FILE_ARG = "cardIdsFile" + const val ARG_CARD_IDS_FILE = "cardIdsFile" fun getIntent( context: Context, @@ -321,8 +321,8 @@ class PreviewerFragment : ): Intent { val arguments = Bundle().apply { - putInt(CURRENT_INDEX_ARG, currentIndex) - putParcelable(CARD_IDS_FILE_ARG, idsFile) + putInt(ARG_CURRENT_INDEX, currentIndex) + putParcelable(ARG_CARD_IDS_FILE, idsFile) } return CardViewerActivity.getIntent(context, PreviewerFragment::class, arguments) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerViewModel.kt index 1665e4f862a3..cf4cf14737ab 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerViewModel.kt @@ -69,7 +69,6 @@ class PreviewerViewModel( /** Call this after the webView has finished loading the page */ @NeedsTest("16302 - a sound-only card on the back/flipped with 'don't keep activities'") - @NeedsTest("16302 - on config changes, sound continues to play") override fun onPageFinished(isAfterRecreation: Boolean) { launchCatchingIO { if (isAfterRecreation) { @@ -92,9 +91,11 @@ class PreviewerViewModel( launchCatchingIO { backSideOnly.emit(!backSideOnly.value) if (!backSideOnly.value && showingAnswer.value) { + cardMediaPlayer.stop() showQuestion() cardMediaPlayer.autoplayAllForSide(CardSide.QUESTION) } else if (backSideOnly.value && !showingAnswer.value) { + cardMediaPlayer.stop() showAnswer() cardMediaPlayer.autoplayAllForSide(CardSide.ANSWER) } @@ -135,6 +136,7 @@ class PreviewerViewModel( fun onNextButtonClick() { launchCatchingIO { if (!showingAnswer.value && !backSideOnly.value) { + cardMediaPlayer.stop() showAnswer() cardMediaPlayer.autoplayAllForSide(CardSide.ANSWER) } else { @@ -152,6 +154,7 @@ class PreviewerViewModel( if (currentIndex.value > 0) { updateCurrentIndex { it - 1 } } else if (showingAnswer.value && !backSideOnly.value) { + cardMediaPlayer.stop() showQuestion() } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/previewer/TypeAnswer.kt b/AnkiDroid/src/main/java/com/ichi2/anki/previewer/TypeAnswer.kt index 86ea68b09870..e783909a25e4 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/previewer/TypeAnswer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/previewer/TypeAnswer.kt @@ -5,7 +5,6 @@ package com.ichi2.anki.previewer import android.os.LocaleList import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.cardviewer.TypeAnswerModifiers -import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.libanki.Card import com.ichi2.anki.libanki.Field import com.ichi2.anki.servicelayer.LanguageHintService @@ -20,13 +19,11 @@ import org.jetbrains.annotations.VisibleForTesting * @see [imeHintLocales] * @see [noSuggest] * */ -@NeedsTest("combining and non combining answers are properly parsed") -@NeedsTest("nosuggest modifier is parsed and composes with nc/cloze") class TypeAnswer private constructor( private val text: String, /** whether combining characters should be compared. Defined by the presence of the * `nc:` specifier in the type answer tag */ - private val combining: Boolean, + val combining: Boolean, /** * Whether keyboard suggestions, swiping and autocorrect should be disabled (#10352). * @@ -88,7 +85,6 @@ class TypeAnswer private constructor( * @param isCloze whether the placeholder was a `cloze:` type filter * @param fieldName the name of the field in the card template */ - @NeedsTest("cloze type-in-answer are properly parsed") private suspend fun getExpectedTypeInAnswer( card: Card, isCloze: Boolean, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/progress/ProgressObserver.kt b/AnkiDroid/src/main/java/com/ichi2/anki/progress/ProgressObserver.kt index 3d20f930496b..0780405ac327 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/progress/ProgressObserver.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/progress/ProgressObserver.kt @@ -6,16 +6,23 @@ package com.ichi2.anki.progress import android.content.Context import android.view.Window import android.view.WindowManager +import androidx.activity.OnBackPressedCallback +import androidx.activity.addCallback +import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager import androidx.lifecycle.Lifecycle -import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.coroutineScope import androidx.lifecycle.repeatOnLifecycle import com.ichi2.anki.AnkiActivity import com.ichi2.anki.dialogs.LoadingDialogFragment -import com.ichi2.anki.dialogs.dismissLoadingDialog import com.ichi2.anki.dialogs.showLoadingDialog +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.launch import timber.log.Timber import java.util.WeakHashMap @@ -23,7 +30,7 @@ import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds /** - * Blocks touches and shows/dismisses a loading dialog driven by [viewModel]'s progress flow. + * Blocks touches and back, and shows/dismisses a loading dialog driven by [viewModel]'s progress flow. * [delayMillis] defers the initial show so quick operations don't flash a dialog. * [resolveMessage] maps the ViewModel's message to the text shown in the dialog. */ @@ -31,65 +38,142 @@ fun AnkiActivity.observeProgress( viewModel: HasProgress, delayMillis: Duration = 600.milliseconds, resolveMessage: Context.(M) -> String, +) = observeProgressFor(this, viewModel, delayMillis, resolveMessage) + +private fun AnkiActivity.observeProgressFor( + owner: LifecycleOwner, + viewModel: HasProgress, + delayMillis: Duration, + resolveMessage: Context.(M) -> String, ) { val dialogTag = "${LoadingDialogFragment.TAG}:${viewModel.javaClass.name}" - var dialogVisible = supportFragmentManager.findFragmentByTag(dialogTag) != null - var blockingTouches = false - - lifecycleScope.launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - // Pending "show after delay" job survives subsequent Active emissions so the - // anti-flash delay isn't restarted on every progress update. Kept inside the - // block: a job cancelled on stop must not linger into the next start. - var pendingShow: Job? = null - viewModel.progressManager.progress.collect { state -> - when (state) { - is ViewModelProgress.Idle -> { - pendingShow?.cancel() - pendingShow = null - dialogVisible = false - dismissLoadingDialog(dialogTag) - if (blockingTouches) { - blockingTouches = false - window.unblockTouches() - } - } - is ViewModelProgress.Active -> { - if (!blockingTouches) { - blockingTouches = true - window.blockTouches() - } - if (dialogVisible) { + var holdingDialog = false + var reshowDialog: (() -> Unit)? = null + val dialogHolder: () -> Unit = { reshowDialog?.invoke() } + val ownerLifecycle = owner.lifecycle + var backBlock: OnBackPressedCallback? = null + + fun blockInput() { + if (backBlock != null) return + window.blockTouches() + backBlock = onBackPressedDispatcher.addCallback(this) { Timber.i("Ignoring back while an operation runs") } + } + + fun unblockInput() { + val block = backBlock ?: return + backBlock = null + block.remove() + window.unblockTouches() + } + + fun holdDialog() { + if (holdingDialog) return + holdingDialog = true + supportFragmentManager.addDialogHolder(dialogTag, dialogHolder) + } + + fun releaseDialog() { + if (!holdingDialog) return + holdingDialog = false + supportFragmentManager.removeDialogHolder(dialogTag, dialogHolder) + } + + val restoringDialog = + !lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED) && + supportFragmentManager.findFragmentByTag(dialogTag) != null + if (restoringDialog) holdDialog() + + val releaseIfOwnerStopped = + LifecycleEventObserver { _, event -> + if (event == Lifecycle.Event.ON_START && !ownerLifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) releaseDialog() + } + lifecycle.addObserver(releaseIfOwnerStopped) + + ownerLifecycle.coroutineScope.launch { + try { + ownerLifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { + // Pending "show after delay" job survives subsequent Active emissions so the + // anti-flash delay isn't restarted on every progress update. Kept inside the + // block: a job cancelled on stop must not linger into the next start. + var pendingShow: Job? = null + + fun showDialogAfter(wait: Duration) = + ownerLifecycle.coroutineScope.launch(Dispatchers.Main) { + delay(wait) + val latest = viewModel.progressManager.progress.value + if (latest is ViewModelProgress.Active) { + holdDialog() showLoadingDialog( - message = formatMessage(state, resolveMessage), - cancellable = state.cancellable, + message = formatMessage(latest, resolveMessage), + cancellable = latest.cancellable, tag = dialogTag, ) - if (state.cancellable) wireCancelListener(viewModel, dialogTag) - } else if (pendingShow == null) { - pendingShow = - launch { - delay(delayMillis) - val latest = viewModel.progressManager.progress.value - if (latest is ViewModelProgress.Active) { - dialogVisible = true - showLoadingDialog( - message = formatMessage(latest, resolveMessage), - cancellable = latest.cancellable, - tag = dialogTag, - ) - if (latest.cancellable) wireCancelListener(viewModel, dialogTag) - } - pendingShow = null - } + if (latest.cancellable) wireCancelListener(viewModel, dialogTag) + } + pendingShow = null + } + + reshowDialog = { + pendingShow?.cancel() + pendingShow = showDialogAfter(Duration.ZERO) + } + val progress = + viewModel.progressManager.progress.onCompletion { + reshowDialog = null + pendingShow?.cancel() + unblockInput() + if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) releaseDialog() + } + progress.collect { state -> + when (state) { + is ViewModelProgress.Idle -> { + pendingShow?.cancel() + pendingShow = null + releaseDialog() + unblockInput() + } + is ViewModelProgress.Active -> { + blockInput() + if (holdingDialog) { + pendingShow?.cancel() + pendingShow = showDialogAfter(Duration.ZERO) + } else if (pendingShow == null) { + pendingShow = showDialogAfter(delayMillis) + } } } } } + } finally { + lifecycle.removeObserver(releaseIfOwnerStopped) + releaseDialog() } } } +private val dialogHolders = WeakHashMap Unit>>>() + +private fun FragmentManager.addDialogHolder( + tag: String, + reshow: () -> Unit, +) { + dialogHolders.getOrPut(this) { mutableMapOf() }.getOrPut(tag) { mutableListOf() }.add(reshow) +} + +private fun FragmentManager.removeDialogHolder( + tag: String, + reshow: () -> Unit, +) { + val holders = dialogHolders[this]?.get(tag) ?: return + holders.remove(reshow) + if (holders.isNotEmpty()) { + holders.last().invoke() + return + } + dialogHolders[this]?.remove(tag) + (findFragmentByTag(tag) as? DialogFragment)?.dismissAllowingStateLoss() +} + private val touchBlockCounts = WeakHashMap() internal fun Window.blockTouches() { @@ -122,7 +206,7 @@ private fun AnkiActivity.wireCancelListener( } /** - * Fragment wrapper that delegates to the host activity. + * Follows this fragment's lifecycle, showing the dialog and blocking touches and back on the host activity. * * If the host is not an [AnkiActivity], logs a warning and returns — no observer is set up. * @@ -145,7 +229,7 @@ fun Fragment.observeProgress( ) return } - activity.observeProgress(viewModel, delayMillis, resolveMessage) + activity.observeProgressFor(this, viewModel, delayMillis, resolveMessage) } private fun Context.formatMessage( diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/provider/CardContentProvider.kt b/AnkiDroid/src/main/java/com/ichi2/anki/provider/CardContentProvider.kt index fccd2f992dbe..ff105be96b6c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/provider/CardContentProvider.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/provider/CardContentProvider.kt @@ -180,11 +180,14 @@ class CardContentProvider : ContentProvider() { return sanitized.toTypedArray() } + private val AUTHORITY = FlashCardsContract.getAuthority(BuildConfig.APPLICATION_ID) + private val PERMISSION = FlashCardsContract.getPermission(BuildConfig.APPLICATION_ID) + init { fun addUri( path: String, code: Int, - ) = uriMatcher.addURI(FlashCardsContract.AUTHORITY, path, code) + ) = uriMatcher.addURI(AUTHORITY, path, code) // Here you can see all the URIs at a glance addUri("notes", NOTES) addUri("notes_v2", NOTES_V2) @@ -979,7 +982,7 @@ class CardContentProvider : ContentProvider() { // Add to collection col.addNote(newNote, newNote.notetype.did) - Uri.withAppendedPath(FlashCardsContract.Note.CONTENT_URI, newNote.id.toString()) + Uri.withAppendedPath(uri, newNote.id.toString()) } NOTES_ID -> throw IllegalArgumentException("Not possible to insert note with specific ID") NOTES_ID_CARDS, NOTES_ID_CARDS_ORD -> throw IllegalArgumentException( @@ -1050,7 +1053,7 @@ class CardContentProvider : ContentProvider() { // Get the mid and return a URI val noteTypeId = newNoteType.id.toString() - Uri.withAppendedPath(FlashCardsContract.Model.CONTENT_URI, noteTypeId) + Uri.withAppendedPath(uri, noteTypeId) } catch (e: JSONException) { Timber.e(e, "Could not set a field of new note type %s", noteTypeName) null @@ -1132,7 +1135,7 @@ class CardContentProvider : ContentProvider() { deck.description = deckDesc col.decks.save(deck) } - Uri.withAppendedPath(FlashCardsContract.Deck.CONTENT_ALL_URI, did.toString()) + Uri.withAppendedPath(uri, did.toString()) } DECK_SELECTED -> throw IllegalArgumentException("Selected deck can only be queried and updated") DECKS_ID -> throw IllegalArgumentException("Not possible to insert deck with specific ID") @@ -1483,15 +1486,14 @@ class CardContentProvider : ContentProvider() { private fun hasReadWritePermission(): Boolean = if (BuildConfig.DEBUG) { // Allow self-calling of the provider only in debug builds (e.g. for unit tests) - context!!.checkCallingOrSelfPermission(FlashCardsContract.READ_WRITE_PERMISSION) == PackageManager.PERMISSION_GRANTED + context!!.checkCallingOrSelfPermission(PERMISSION) == PackageManager.PERMISSION_GRANTED } else { - context!!.checkCallingPermission(FlashCardsContract.READ_WRITE_PERMISSION) == PackageManager.PERMISSION_GRANTED + context!!.checkCallingPermission(PERMISSION) == PackageManager.PERMISSION_GRANTED } /** Returns true if the calling package is known to be "rogue" and should be blocked. * Calling package might be rogue if it has not declared #READ_WRITE_PERMISSION in its manifest */ - private fun knownRogueClient(): Boolean = - !context!!.arePermissionsDefinedInManifest(callingPackage!!, FlashCardsContract.READ_WRITE_PERMISSION) + private fun knownRogueClient(): Boolean = !context!!.arePermissionsDefinedInManifest(callingPackage!!, PERMISSION) } /** replaces [anki:play...] with [sound:] */ diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/receiver/SdCardReceiver.kt b/AnkiDroid/src/main/java/com/ichi2/anki/receiver/SdCardReceiver.kt index b38ae52c60fd..29f13484f5af 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/receiver/SdCardReceiver.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/receiver/SdCardReceiver.kt @@ -22,7 +22,7 @@ class SdCardReceiver : AnkiBroadcastReceiver() { if (intent.action == Intent.ACTION_MEDIA_EJECT) { Timber.i("media eject detected - closing collection and sending broadcast") val i = Intent() - i.action = MEDIA_EJECT + i.action = ACTION_MEDIA_EJECT context.sendBroadcast(i) try { val col = CollectionManager.getColUnsafe() @@ -33,13 +33,13 @@ class SdCardReceiver : AnkiBroadcastReceiver() { } else if (intent.action == Intent.ACTION_MEDIA_MOUNTED) { Timber.i("media mount detected - sending broadcast") val i = Intent() - i.action = MEDIA_MOUNT + i.action = ACTION_MEDIA_MOUNT context.sendBroadcast(i) } } companion object { - const val MEDIA_EJECT = "com.ichi2.anki.action.MEDIA_EJECT" - const val MEDIA_MOUNT = "com.ichi2.anki.action.MEDIA_MOUNT" + const val ACTION_MEDIA_EJECT = "com.ichi2.anki.action.MEDIA_EJECT" + const val ACTION_MEDIA_MOUNT = "com.ichi2.anki.action.MEDIA_MOUNT" } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/recorder/VoiceRecorder.kt b/AnkiDroid/src/main/java/com/ichi2/anki/recorder/VoiceRecorder.kt index 62ec5c768230..3932c04a1537 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/recorder/VoiceRecorder.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/recorder/VoiceRecorder.kt @@ -3,7 +3,9 @@ package com.ichi2.anki.recorder +import android.content.Context import androidx.annotation.MainThread +import com.ichi2.anki.common.time.TimeManager import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.MutableSharedFlow @@ -15,6 +17,7 @@ import java.io.Closeable import java.io.File import java.io.IOException import kotlin.time.Duration +import kotlin.time.Duration.Companion.days import kotlin.time.TimeSource sealed interface RecorderState { @@ -183,5 +186,23 @@ class VoiceRecorder( const val RECORDINGS_DIRECTORY = "recordings" private const val FILE_PREFIX = "ankidroid_audiorec" private const val FILE_SUFFIX = ".3gp" + private val RECORDING_RETENTION = 7.days + + fun recordingsDirectory(context: Context): File = File(context.noBackupFilesDir, RECORDINGS_DIRECTORY) + + fun removeExpiredRecordings( + directory: File, + now: Long = TimeManager.time.intTimeMS(), + ) { + val cutoff = now - RECORDING_RETENTION.inWholeMilliseconds + directory + .listFiles { _, name -> name.startsWith(FILE_PREFIX) && name.endsWith(FILE_SUFFIX) } + ?.forEach { file -> + val modified = file.lastModified() + if (file.isFile && modified > 0 && modified < cutoff && !file.delete()) { + Timber.w("Could not delete %s", file) + } + } + } } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/AnswerButtons.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/AnswerButtons.kt index f6cb5787d22b..acaea2b5cc93 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/AnswerButtons.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/AnswerButtons.kt @@ -4,11 +4,11 @@ package com.ichi2.anki.reviewer import android.content.Context import com.ichi2.anki.AnkiActivity -import com.ichi2.anki.R import com.ichi2.anki.cardviewer.ViewerCommand import com.ichi2.anki.common.android.animationEnabled import com.ichi2.anki.common.utils.android.getColorsFromAttrs import com.ichi2.anki.common.utils.android.getResFromAttr +import com.ichi2.anki.common.android.R as CommonR /** * Handles mapping from an answer button to its position. @@ -72,17 +72,17 @@ enum class AnswerButtons { val backgroundIds: IntArray = if (ctx.animationEnabled()) { intArrayOf( - R.attr.againButtonRippleRef, - R.attr.hardButtonRippleRef, - R.attr.goodButtonRippleRef, - R.attr.easyButtonRippleRef, + CommonR.attr.againButtonRippleRef, + CommonR.attr.hardButtonRippleRef, + CommonR.attr.goodButtonRippleRef, + CommonR.attr.easyButtonRippleRef, ) } else { intArrayOf( - R.attr.againButtonRef, - R.attr.hardButtonRef, - R.attr.goodButtonRef, - R.attr.easyButtonRef, + CommonR.attr.againButtonRef, + CommonR.attr.hardButtonRef, + CommonR.attr.goodButtonRef, + CommonR.attr.easyButtonRef, ) } return getResFromAttr(ctx, backgroundIds) @@ -92,10 +92,10 @@ enum class AnswerButtons { getColorsFromAttrs( ctx, intArrayOf( - R.attr.againButtonTextColor, - R.attr.hardButtonTextColor, - R.attr.goodButtonTextColor, - R.attr.easyButtonTextColor, + CommonR.attr.againButtonTextColor, + CommonR.attr.hardButtonTextColor, + CommonR.attr.goodButtonTextColor, + CommonR.attr.easyButtonTextColor, ), ) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/AnswerTimer.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/AnswerTimer.kt index a87570446eb9..c7b911f50018 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/AnswerTimer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/AnswerTimer.kt @@ -11,11 +11,11 @@ import androidx.annotation.VisibleForTesting import androidx.core.view.isInvisible import com.google.android.material.color.MaterialColors import com.ichi2.anki.CollectionManager.withCol -import com.ichi2.anki.R import com.ichi2.anki.libanki.Card import com.ichi2.anki.libanki.Collection import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import com.ichi2.anki.common.android.R as CommonR /** * Responsible for pause/resume of the card timer and the UI element displaying the amount of time to answer a card @@ -83,7 +83,7 @@ class AnswerTimer( cardTimer.setOnChronometerTickListener { chronometer: Chronometer -> val elapsed: Long = elapsedRealTime - chronometer.base if (elapsed >= limit) { - chronometer.setTextColor(MaterialColors.getColor(context, R.attr.maxTimerColor, 0)) + chronometer.setTextColor(MaterialColors.getColor(context, CommonR.attr.maxTimerColor, 0)) chronometer.stop() } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/Binding.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/Binding.kt index d7cacd83ed28..1a6a913a3bba 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/Binding.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/Binding.kt @@ -4,7 +4,6 @@ package com.ichi2.anki.reviewer import android.content.Context import android.view.KeyEvent -import androidx.annotation.VisibleForTesting import com.ichi2.anki.cardviewer.Gesture import com.ichi2.anki.common.utils.StringUtils import com.ichi2.anki.common.utils.ext.ifNotZero @@ -95,9 +94,14 @@ sealed interface Binding { override fun hashCode(): Int = Objects.hash(keycode) } + /** + * A keyboard shortcut matched by the character produced by a key press. + * + * [KeyCode] is insufficient: e.g. `@` doesn't have a consistent keypress across keyboards. + */ @Suppress("EqualsOrHashCode") data class UnicodeCharacter( - val unicodeCharacter: Char, + val unicodeCharacter: BindingUnicodeCharacter, override val modifierKeys: ModifierKeys = AppDefinedModifierKeys.allowShift(), ) : KeyBinding { override fun toDisplayString(context: Context): String = @@ -105,27 +109,18 @@ sealed interface Binding { append(KEY_PREFIX) append(' ') append(modifierKeys.toString()) - append(unicodeCharacter) + append(unicodeCharacter.value) } override fun toString(): String = buildString { append(UNICODE_PREFIX) append(modifierKeys.toString()) - append(unicodeCharacter) + append(unicodeCharacter.value) } // don't include the modifierKeys - override fun hashCode(): Int = Objects.hash(unicodeCharacter) - } - - data object UnknownBinding : Binding { - override fun toDisplayString(context: Context): String = "" - - override fun toString(): String = "" - - override val isValid: Boolean - get() = false + override fun hashCode(): Int = Objects.hash(unicodeCharacter.value) } fun toDisplayString(context: Context): String @@ -190,7 +185,8 @@ sealed interface Binding { * @return The [ModifierKeys], and the remainder of the string */ fun parse(s: String): Pair { - val plusIndex = s.lastIndexOfOrNull('+') ?: return Pair(none(), s) + // A trailing '+' is the bound character, not a modifier separator. + val plusIndex = s.lastIndexOfOrNull('+', startIndex = s.lastIndex - 1) ?: return Pair(none(), s) val modifiers = fromString(s.take(plusIndex + 1)) return Pair(modifiers, s.substring(plusIndex + 1)) } @@ -220,8 +216,6 @@ sealed interface Binding { } companion object { - const val FORBIDDEN_UNICODE_CHAR = MappableBinding.PREF_SEPARATOR - /** * https://www.fileformat.info/info/unicode/char/2328/index.htm (Keyboard) */ @@ -249,45 +243,43 @@ sealed interface Binding { fun possibleKeyBindings(event: KeyEvent): List { val modifiers = ModifierKeys(event.isShiftPressed, event.isCtrlPressed, event.isAltPressed) val ret: MutableList = ArrayList() - event.keyCode.ifNotZero { keyCode -> ret.add(keyCode(keyCode, modifiers)) } + event.keyCode.ifNotZero { keyCode -> ret.add(KeyCode(keyCode, modifiers)) } // passing in metaState: 0 means that Ctrl+1 returns '1' instead of '\0' // NOTE: We do not differentiate on upper/lower case via KeyEvent.META_CAPS_LOCK_ON event .getUnicodeChar(event.metaState and (KeyEvent.META_SHIFT_ON or KeyEvent.META_NUM_LOCK_ON)) .ifNotZero { unicodeChar -> - try { - ret.add(unicode(unicodeChar.toChar(), modifiers) as KeyBinding) - } catch (e: Exception) { - // very slight chance it returns unknown() - Timber.w(e) + BindingUnicodeCharacter.fromCharOrNull(unicodeChar.toChar())?.let { character -> + ret.add(unicode(character, modifiers)) } } return ret } - fun fromString(from: String): Binding { - if (from.isEmpty()) return UnknownBinding + fun fromString(from: String): Binding? { + if (from.isEmpty()) return null try { return when (from[0]) { JOYSTICK_CHAR_PREFIX -> AxisButtonBinding.from(from.substring(1)) GESTURE_PREFIX -> GestureInput(Gesture.valueOf(from.substring(1))) UNICODE_PREFIX -> { val (modifierKeys, char) = ModifierKeys.parse(from.substring(1)) - UnicodeCharacter(char[0], modifierKeys) + val unicodeChar = BindingUnicodeCharacter.fromCharOrNull(char[0]) ?: return null + UnicodeCharacter(unicodeChar, modifierKeys) } KEY_PREFIX -> { val (modifierKeys, keyCodeAsString) = ModifierKeys.parse(from.substring(1)) val keyCode = keyCodeAsString.toInt() KeyCode(keyCode, modifierKeys) } - else -> UnknownBinding + else -> null } } catch (ex: Exception) { Timber.w(ex) } - return UnknownBinding + return null } /** @@ -295,21 +287,10 @@ sealed interface Binding { * See [AppDefinedModifierKeys] */ fun unicode( - unicodeChar: Char, + unicodeChar: BindingUnicodeCharacter, modifierKeys: ModifierKeys = AppDefinedModifierKeys.allowShift(), - ): Binding { - if (unicodeChar == FORBIDDEN_UNICODE_CHAR) return unknown() - return UnicodeCharacter(unicodeChar, modifierKeys) - } - - fun keyCode( - keyCode: Int, - modifiers: ModifierKeys = ModifierKeys.none(), - ) = KeyCode(keyCode, modifiers) + ): KeyBinding = UnicodeCharacter(unicodeChar, modifierKeys) fun gesture(gesture: Gesture) = GestureInput(gesture) - - @VisibleForTesting - fun unknown() = UnknownBinding } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/BindingMap.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/BindingMap.kt index 8b4af224cf1e..157f81158052 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/BindingMap.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/BindingMap.kt @@ -49,7 +49,6 @@ class BindingMap>( gestureMap[binding.gesture] = mutableListOf(action to mappableBinding) } } - else -> {} } } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/BindingUnicodeCharacter.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/BindingUnicodeCharacter.kt new file mode 100644 index 000000000000..b08e4e5dcfc2 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/BindingUnicodeCharacter.kt @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.reviewer + +/** @see Binding.UnicodeCharacter */ +@JvmInline +value class BindingUnicodeCharacter( + val value: Char, +) { + init { + require(value != FORBIDDEN_UNICODE_CHAR) { "The preference separator cannot be bound" } + } + + companion object { + /** Separates bindings in preferences; using it as a key would split the binding during deserialization. */ + private const val FORBIDDEN_UNICODE_CHAR = MappableBinding.PREF_SEPARATOR + + /** Returns null for the preference separator, which cannot be stored as a binding. */ + fun fromCharOrNull(value: Char): BindingUnicodeCharacter? = + if (value == FORBIDDEN_UNICODE_CHAR) null else BindingUnicodeCharacter(value) + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/MappableBinding.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/MappableBinding.kt index 239bc840d48f..6931186da6d5 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/MappableBinding.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/MappableBinding.kt @@ -52,9 +52,10 @@ open class MappableBinding( @CheckResult fun fromPreferenceString(string: String?): List { if (string.isNullOrEmpty()) return emptyList() - return getPreferenceSubstrings(string).map { - val binding = Binding.fromString(it) - MappableBinding(binding) + return getPreferenceSubstrings(string).mapNotNull { substring -> + Binding.fromString(substring)?.let { binding -> + MappableBinding(binding) + } } } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ReviewerBinding.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ReviewerBinding.kt index 9baca34f25e9..4af2724df680 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ReviewerBinding.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ReviewerBinding.kt @@ -69,7 +69,7 @@ class ReviewerBinding( StringBuilder(string) .substring(0, string.length - 1) .removePrefix(PREFIX.toString()) - val binding = Binding.fromString(bindingString) + val binding = Binding.fromString(bindingString) ?: return null val side = when (string.last()) { QUESTION_SUFFIX -> CardSide.QUESTION @@ -79,8 +79,7 @@ class ReviewerBinding( return ReviewerBinding(binding, side) } - val strings = getPreferenceSubstrings(prefString) - return strings.mapNotNull { fromString(it) } + return getPreferenceSubstrings(prefString).mapNotNull { fromString(it) } } @CheckResult diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/AddEditReminderDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/AddEditReminderDialog.kt index e5a5c558642a..9d3695fb9775 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/AddEditReminderDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/AddEditReminderDialog.kt @@ -7,6 +7,7 @@ import android.app.Dialog import android.os.Bundle import android.os.Parcelable import android.text.format.DateFormat +import androidx.annotation.AttrRes import androidx.annotation.VisibleForTesting import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible @@ -15,6 +16,9 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment import androidx.fragment.app.setFragmentResult import androidx.fragment.app.viewModels +import androidx.lifecycle.LiveData +import com.google.android.material.chip.Chip +import com.google.android.material.color.MaterialColors import com.google.android.material.timepicker.MaterialTimePicker import com.google.android.material.timepicker.TimeFormat import com.ichi2.anki.CollectionManager.TR @@ -47,6 +51,7 @@ import com.ichi2.utils.neutralButton import com.ichi2.utils.positiveButton import kotlinx.parcelize.Parcelize import timber.log.Timber +import com.ichi2.anki.common.android.R as CommonR class AddEditReminderDialog : DialogFragment() { /** @@ -123,6 +128,7 @@ class AddEditReminderDialog : DialogFragment() { setInitialDeckSelection() setUpAdvancedDropdown() setUpCardThresholdInput() + setUpCountChips() setUpOnlyNotifyIfNoReviewsCheckbox() setDialogKeyboardResize(dialog) @@ -245,6 +251,55 @@ class AddEditReminderDialog : DialogFragment() { } } + /** + * Convenience data class for setting up the chips for whether to count new, learning, and review cards + * when considering the card trigger threshold. + * @see setUpCountChips + */ + private data class CountViewsAndActions( + val chip: Chip, + val label: String, + @AttrRes val colorAttr: Int, + val actionOnClick: () -> Unit, + val state: LiveData, + ) + + private fun setUpCountChips() { + val countViewsAndActionsItems = + listOf( + CountViewsAndActions( + chip = binding.addEditReminderCountNewChip, + label = TR.actionsNew(), + colorAttr = CommonR.attr.newCountColor, + actionOnClick = viewModel::toggleCountNew, + state = viewModel.countNew, + ), + CountViewsAndActions( + chip = binding.addEditReminderCountLrnChip, + label = TR.schedulingLearning(), + colorAttr = CommonR.attr.learnCountColor, + actionOnClick = viewModel::toggleCountLrn, + state = viewModel.countLrn, + ), + CountViewsAndActions( + chip = binding.addEditReminderCountRevChip, + label = TR.studyingToReview(), + colorAttr = CommonR.attr.reviewCountColor, + actionOnClick = viewModel::toggleCountRev, + state = viewModel.countRev, + ), + ) + + countViewsAndActionsItems.forEach { item -> + item.chip.text = item.label + item.chip.setTextColor(MaterialColors.getColor(requireContext(), item.colorAttr, 0)) + item.chip.setOnClickListener { item.actionOnClick() } + item.state.observe(this) { value -> + item.chip.isChecked = value + } + } + } + private fun setUpOnlyNotifyIfNoReviewsCheckbox() { binding.addEditReminderOnlyNotifyIfNoReviewsSection.setOnClickListener { viewModel.toggleOnlyNotifyIfNoReviews() @@ -359,7 +414,7 @@ class AddEditReminderDialog : DialogFragment() { /** * Icon that shows next to the advanced settings section when the dropdown is closed. */ - private val DROPDOWN_COLLAPSED_CHEVRON = R.drawable.ic_baseline_chevron_right_24 + private val DROPDOWN_COLLAPSED_CHEVRON = CommonR.drawable.ic_baseline_chevron_right_24 /** * Arguments key for the dialog mode to open this dialog in. diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/AddEditReminderDialogViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/AddEditReminderDialogViewModel.kt index 6f627f1344c0..089a5c3542bc 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/AddEditReminderDialogViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/AddEditReminderDialogViewModel.kt @@ -29,22 +29,25 @@ class AddEditReminderDialogViewModel( savedStateHandle.get(AddEditReminderDialog.ARG_DIALOG_MODE), ) { "dialogMode is required" } - private val _time = + val time: LiveData + field = MutableLiveData( when (dialogMode) { is AddEditReminderDialog.DialogMode.Add -> ReviewReminderTime.getCurrentTime() is AddEditReminderDialog.DialogMode.Edit -> dialogMode.reminderToBeEdited.time }, ) - val time: LiveData = _time /** * Here, we set an immediate default value for the deck selected based on the dialog mode. * However, it is possible that the deck with this deck ID does not currently exist in the collection * (ex. due to a deleted deck, changed collection folder, etc.). Since checking for this case requires * accessing the collection, we handle it in [AddEditReminderDialog.setInitialDeckSelection]. + * + * [ALL_DECKS_ID] is used to represent All Decks (i.e. [ReviewReminderScope.Global]) being selected. */ - private val _deckSelected = + val deckSelected: LiveData + field = MutableLiveData( when (dialogMode) { is AddEditReminderDialog.DialogMode.Add -> { @@ -62,55 +65,92 @@ class AddEditReminderDialogViewModel( }, ) - /** - * [ALL_DECKS_ID] is used to represent All Decks (i.e. [ReviewReminderScope.Global]) being selected. - */ - val deckSelected: LiveData = _deckSelected - - private val _cardTriggerThreshold = + val cardTriggerThreshold: LiveData + field = MutableLiveData( when (dialogMode) { is AddEditReminderDialog.DialogMode.Add -> INITIAL_CARD_THRESHOLD is AddEditReminderDialog.DialogMode.Edit -> dialogMode.reminderToBeEdited.cardTriggerThreshold.threshold }, ) - val cardTriggerThreshold: LiveData = _cardTriggerThreshold - private val _onlyNotifyIfNoReviews = + val countNew: LiveData + field = + MutableLiveData( + when (dialogMode) { + is AddEditReminderDialog.DialogMode.Add -> INITIAL_COUNT_NEW + is AddEditReminderDialog.DialogMode.Edit -> dialogMode.reminderToBeEdited.thresholdFilter.countNew + }, + ) + + val countLrn: LiveData + field = + MutableLiveData( + when (dialogMode) { + is AddEditReminderDialog.DialogMode.Add -> INITIAL_COUNT_LRN + is AddEditReminderDialog.DialogMode.Edit -> dialogMode.reminderToBeEdited.thresholdFilter.countLrn + }, + ) + + val countRev: LiveData + field = + MutableLiveData( + when (dialogMode) { + is AddEditReminderDialog.DialogMode.Add -> INITIAL_COUNT_REV + is AddEditReminderDialog.DialogMode.Edit -> dialogMode.reminderToBeEdited.thresholdFilter.countRev + }, + ) + + val onlyNotifyIfNoReviews: LiveData + field = MutableLiveData( when (dialogMode) { is AddEditReminderDialog.DialogMode.Add -> INITIAL_ONLY_NOTIFY_IF_NO_REVIEWS is AddEditReminderDialog.DialogMode.Edit -> dialogMode.reminderToBeEdited.onlyNotifyIfNoReviews }, ) - val onlyNotifyIfNoReviews: LiveData = _onlyNotifyIfNoReviews - private val _advancedSettingsOpen = MutableLiveData(INITIAL_ADVANCED_SETTINGS_OPEN) - val advancedSettingsOpen: LiveData = _advancedSettingsOpen + val advancedSettingsOpen: LiveData + field = MutableLiveData(INITIAL_ADVANCED_SETTINGS_OPEN) - fun setTime(time: ReviewReminderTime) { - Timber.i("Updated time to %s", time) - _time.value = time + fun setTime(newTime: ReviewReminderTime) { + Timber.i("Updated time to %s", newTime) + time.value = newTime } fun setDeckSelected(deckId: DeckId) { Timber.i("Updated deck selected to %s", deckId) - _deckSelected.value = deckId + deckSelected.value = deckId } fun setCardTriggerThreshold(threshold: Int) { Timber.i("Updated card trigger threshold to %s", threshold) - _cardTriggerThreshold.value = threshold + cardTriggerThreshold.value = threshold + } + + fun toggleCountNew() { + Timber.i("Toggled count new from %s", countNew.value) + countNew.value = !(countNew.value ?: false) + } + + fun toggleCountLrn() { + Timber.i("Toggled count lrn from %s", countLrn.value) + countLrn.value = !(countLrn.value ?: false) + } + + fun toggleCountRev() { + Timber.i("Toggled count rev from %s", countRev.value) + countRev.value = !(countRev.value ?: false) } fun toggleOnlyNotifyIfNoReviews() { - Timber.i("Toggled onlyNotifyIfNoReviews from %s", _onlyNotifyIfNoReviews.value) - _onlyNotifyIfNoReviews.value = !(_onlyNotifyIfNoReviews.value ?: false) + Timber.i("Toggled onlyNotifyIfNoReviews from %s", onlyNotifyIfNoReviews.value) + onlyNotifyIfNoReviews.value = !(onlyNotifyIfNoReviews.value ?: false) } fun toggleAdvancedSettingsOpen() { - Timber.i("Toggled advanced settings open from %s", _advancedSettingsOpen.value) - _advancedSettingsOpen.value = !(_advancedSettingsOpen.value ?: false) + Timber.i("Toggled advanced settings open from %s", advancedSettingsOpen.value) + advancedSettingsOpen.value = !(advancedSettingsOpen.value ?: false) } /** @@ -138,6 +178,12 @@ class AddEditReminderDialogViewModel( is AddEditReminderDialog.DialogMode.Edit -> dialogMode.reminderToBeEdited.enabled }, onlyNotifyIfNoReviews = onlyNotifyIfNoReviews.value ?: INITIAL_ONLY_NOTIFY_IF_NO_REVIEWS, + thresholdFilter = + ReviewReminderThresholdFilter( + countNew = countNew.value ?: INITIAL_COUNT_NEW, + countLrn = countLrn.value ?: INITIAL_COUNT_LRN, + countRev = countRev.value ?: INITIAL_COUNT_REV, + ), ) companion object { @@ -150,6 +196,26 @@ class AddEditReminderDialogViewModel( */ private const val INITIAL_CARD_THRESHOLD: Int = 1 + /** + * The default setting for whether new cards are counted when checking the card trigger threshold. + * This value, and the other default settings for whether certain kinds of cards are counted + * when checking the card trigger threshold, are all set to true, as removing some card types + * from card trigger threshold consideration is a form of advanced review reminder customization. + */ + private const val INITIAL_COUNT_NEW = true + + /** + * The default setting for whether cards in learning are counted when checking the card trigger threshold. + * @see INITIAL_COUNT_NEW + */ + private const val INITIAL_COUNT_LRN = true + + /** + * The default setting for whether cards in review are counted when checking the card trigger threshold. + * @see INITIAL_COUNT_NEW + */ + private const val INITIAL_COUNT_REV = true + /** * The default value for whether a notification should only be fired if no reviews have been done today * for the corresponding deck / all decks. Since this is set to false, the default behaviour is that diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReminderTroubleshootingFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReminderTroubleshootingFragment.kt index 3db774bd2118..34167d3a946e 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReminderTroubleshootingFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReminderTroubleshootingFragment.kt @@ -36,6 +36,7 @@ import com.ichi2.anki.CommonString import com.ichi2.anki.NotificationChannel import com.ichi2.anki.R import com.ichi2.anki.common.utils.android.getColorFromAttr +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.databinding.FragmentReminderTroubleshootingBinding import com.ichi2.anki.databinding.ItemTroubleshootingCheckBinding import com.ichi2.anki.requireAnkiActivity @@ -49,10 +50,10 @@ import com.ichi2.utils.Permissions.attemptToEnableNotifications import com.ichi2.utils.Permissions.openAppNotificationsSettingsScreen import com.ichi2.utils.TruncatedString import com.ichi2.utils.copyToClipboard -import com.ichi2.utils.dp import dev.androidbroadcast.vbpd.viewBinding import kotlinx.coroutines.launch import timber.log.Timber +import com.ichi2.anki.common.android.R as CommonR /** * An action which a user can take to resolve a [check][TroubleshootingCheck]. @@ -170,14 +171,14 @@ class ReminderTroubleshootingFragment : Fragment(R.layout.fragment_reminder_trou SummaryStatus.Warning -> Triple( R.drawable.ic_warning_24, - getColorFromAttr(context, R.attr.reminderTroubleshootingWarning), + getColorFromAttr(context, CommonR.attr.reminderTroubleshootingWarning), context.getString(CommonString.reminder_troubleshooting_summary_warning), ) SummaryStatus.Ok -> Triple( R.drawable.ic_check_circle_24, - getColorFromAttr(context, R.attr.reminderTroubleshootingOk), + getColorFromAttr(context, CommonR.attr.reminderTroubleshootingOk), context.getString(CommonString.reminder_troubleshooting_summary_ok), ) } @@ -430,8 +431,8 @@ private fun CheckResult.iconRes(): Int = private fun CheckResult.tintColor(context: Context): Int = when (this) { - is CheckResult.Passed -> getColorFromAttr(context, R.attr.reminderTroubleshootingOk) - is CheckResult.Warning -> getColorFromAttr(context, R.attr.reminderTroubleshootingWarning) + is CheckResult.Passed -> getColorFromAttr(context, CommonR.attr.reminderTroubleshootingOk) + is CheckResult.Warning -> getColorFromAttr(context, CommonR.attr.reminderTroubleshootingWarning) is CheckResult.Failed -> context.getColor(android.R.color.holo_red_dark) is CheckResult.Loading -> context.getColor(android.R.color.darker_gray) is CheckResult.Unavailable -> context.getColor(android.R.color.darker_gray) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReviewReminder.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReviewReminder.kt index 233fffd2fac7..d00f648a2912 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReviewReminder.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReviewReminder.kt @@ -10,10 +10,12 @@ import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.common.time.TimeManager import com.ichi2.anki.libanki.DeckId import com.ichi2.anki.libanki.EpochMilliseconds +import com.ichi2.anki.libanki.sched.Counts import com.ichi2.anki.settings.Prefs import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import timber.log.Timber import java.util.Calendar import kotlin.time.Duration.Companion.hours @@ -96,6 +98,31 @@ value class ReviewReminderCardTriggerThreshold( } } +/** + * A filter specifying which types of cards to count towards the [ReviewReminderCardTriggerThreshold]. + * + * @param countNew Whether new cards are counted when checking the threshold. + * @param countLrn Whether learning cards are counted when checking the threshold. + * @param countRev Whether review cards are counted when checking the threshold. + */ +@Serializable +@Parcelize +data class ReviewReminderThresholdFilter( + val countNew: Boolean = true, + val countLrn: Boolean = true, + val countRev: Boolean = true, +) : Parcelable { + /** + * Filters the given [inputCounts] according to this filter's settings and returns the resulting [Counts]. + */ + fun filterCounts(inputCounts: Counts): Counts = + Counts( + new = if (countNew) inputCounts.new else 0, + lrn = if (countLrn) inputCounts.lrn else 0, + rev = if (countRev) inputCounts.rev else 0, + ) +} + /** * An indicator of whether a review reminders feature is associated with every deck in the user's * collection or if it is associated with a single deck. For example, the [ScheduleRemindersFragment] fragment @@ -122,6 +149,7 @@ sealed class ReviewReminderScope : Parcelable { val did: DeckId, ) : ReviewReminderScope() { @IgnoredOnParcel + @Transient private var cachedDeckName: String? = null /** @@ -193,6 +221,7 @@ data class ReviewReminder private constructor( var latestNotifTime: EpochMilliseconds, val profileID: String, val onlyNotifyIfNoReviews: Boolean, + val thresholdFilter: ReviewReminderThresholdFilter, ) : Parcelable, ReviewReminderSchema { companion object { @@ -208,6 +237,7 @@ data class ReviewReminder private constructor( enabled: Boolean = true, profileID: String = "", onlyNotifyIfNoReviews: Boolean = false, + thresholdFilter: ReviewReminderThresholdFilter = ReviewReminderThresholdFilter(), ) = ReviewReminder( id = ReviewReminderId.getAndIncrementNextFreeReminderId(), time, @@ -217,7 +247,30 @@ data class ReviewReminder private constructor( latestNotifTime = TimeManager.time.calendar().timeInMillis, profileID, onlyNotifyIfNoReviews, + thresholdFilter, ) + + /** + * Creates a review reminder from the latest outdated schema. Should only be used for migration. + * Must be changed when the schema is updated. + * + * This method is necessary for schema migration because migrated review reminders should retain + * their original ID. Otherwise, review reminder alarms associated with the old ID will remain active + * and become orphaned. Note that this method must be located here because the constructor of [ReviewReminder] + * (and hence access to the [id] field) is private. + */ + fun createViaMigration(latestOutdatedSchema: ReviewReminderSchemaV4) = + ReviewReminder( + id = latestOutdatedSchema.id, + time = latestOutdatedSchema.time, + cardTriggerThreshold = latestOutdatedSchema.cardTriggerThreshold, + scope = latestOutdatedSchema.scope, + enabled = latestOutdatedSchema.enabled, + latestNotifTime = latestOutdatedSchema.latestNotifTime, + profileID = latestOutdatedSchema.profileID, + onlyNotifyIfNoReviews = latestOutdatedSchema.onlyNotifyIfNoReviews, + thresholdFilter = ReviewReminderThresholdFilter(), + ) } /** diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReviewReminderSchema.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReviewReminderSchema.kt index ae1cb3874ccd..f1e0c8b790d4 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReviewReminderSchema.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReviewReminderSchema.kt @@ -3,8 +3,11 @@ package com.ichi2.anki.reviewreminders +import com.ichi2.anki.common.time.TimeManager import com.ichi2.anki.libanki.DeckId +import com.ichi2.anki.libanki.EpochMilliseconds import com.ichi2.anki.reviewreminders.ReviewRemindersDatabase.StoredReviewReminderGroup +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable /** @@ -28,7 +31,7 @@ value class ReviewReminderSchemaVersion( * has the same fields as the old version of [ReviewReminder], then implement the [migrate] method which * transforms old [ReviewReminder]s to new [ReviewReminder]s. Also ensure that the previous [ReviewReminderSchema] * in the migration version chain ([ReviewRemindersDatabase.oldReviewReminderSchemasForMigration]) has its [migrate] method - * edited to return instances of the newly-created [ReviewReminderSchema]. Then, increment [ReviewRemindersDatabase.schemaVersion]. + * edited to return instances of the newly-created schema. Then, increment [ReviewRemindersDatabase.schemaVersion]. * * Data classes implementing this interface should be marked as @Serializable. Any new types defined for ReviewReminderSchemas * should also be marked as @Serializable. @@ -45,11 +48,46 @@ sealed interface ReviewReminderSchema { val id: ReviewReminderId /** - * Transforms this [ReviewReminderSchema] to the next version of the [ReviewReminderSchema]. + * Transforms this [ReviewReminderSchema] to the next version of the [ReviewReminderSchema]. For example, if an old schema used `did` + * to define its scope, but the new schema uses a scope data class, the field might have an override like the following: + * + * ```kotlin + * scope = if (this.did == -1L) ReviewReminderScope.Global else ReviewReminderScope.DeckSpecific(this.did) + * ``` */ fun migrate(): ReviewReminderSchema } +/** + * The Version 3 -> Version 4 migration fixed a bug where the cachedDeckName field of [ReviewReminderScope.DeckSpecific] + * was being serialized and persisted to SharedPreferences. However, since this involves a change to an existing data class, + * we must still maintain a namespaced version of the old data class so that the serializer can distinguish between the old and new data classes. + * To ensure these classes interact with serialization like they did in old versions, the up-to-date SerialName is specified. + */ +object ReviewReminderPreV4Classes { + @Serializable + sealed class ReviewReminderScope { + @Serializable + @SerialName("com.ichi2.anki.reviewreminders.ReviewReminderScope.Global") + data object Global : ReviewReminderScope() + + /** + * This class will be serialized into "DeckSpecific(did=#, cachedDeckName=#)", and is nested because it will otherwise conflict + * with the updated definition of [ReviewReminderScope.DeckSpecific], which is serialized as "DeckSpecific(did=#)". + * When we read the outdated schema from the disk, we need to tell the deserializer that it is reading a + * ReviewReminderPreV4Classes.DeckSpecific rather than a [ReviewReminderScope.DeckSpecific], even though the class names are the same. + */ + @Serializable + @SerialName("com.ichi2.anki.reviewreminders.ReviewReminderScope.DeckSpecific") + data class DeckSpecific( + val did: DeckId, + ) : ReviewReminderScope() { + @Suppress("unused") // Only used for migration serialization. + private var cachedDeckName: String? = null + } + } +} + /** * Version 1 of [ReviewReminderSchema]. Updated to Version 2 by adding [ReviewReminder.onlyNotifyIfNoReviews]. */ @@ -58,12 +96,12 @@ data class ReviewReminderSchemaV1( override val id: ReviewReminderId, val time: ReviewReminderTime, val cardTriggerThreshold: ReviewReminderCardTriggerThreshold, - val scope: ReviewReminderScope, + val scope: ReviewReminderPreV4Classes.ReviewReminderScope, var enabled: Boolean, val profileID: String, val onlyNotifyIfNoReviews: Boolean = false, ) : ReviewReminderSchema { - override fun migrate(): ReviewReminderSchema = + override fun migrate(): ReviewReminderSchemaV2 = ReviewReminderSchemaV2( id = id, time = time, @@ -83,92 +121,69 @@ data class ReviewReminderSchemaV2( override val id: ReviewReminderId, val time: ReviewReminderTime, val cardTriggerThreshold: ReviewReminderCardTriggerThreshold, - val scope: ReviewReminderScope, + val scope: ReviewReminderPreV4Classes.ReviewReminderScope, var enabled: Boolean, val profileID: String, val onlyNotifyIfNoReviews: Boolean, ) : ReviewReminderSchema { - override fun migrate(): ReviewReminderSchema = - ReviewReminder.createReviewReminder( + override fun migrate(): ReviewReminderSchemaV3 = + ReviewReminderSchemaV3( + id = id, time = time, cardTriggerThreshold = cardTriggerThreshold, scope = scope, enabled = enabled, + latestNotifTime = TimeManager.time.calendar().timeInMillis, profileID = profileID, onlyNotifyIfNoReviews = onlyNotifyIfNoReviews, ) } /** - * Schema migration settings for testing purposes. - * Consult this as an example of how to save old schemas and define their [ReviewReminderSchema.migrate] methods. - * Also see the unit tests for [ReviewRemindersDatabase], where these classes are exercised. - * These classes cannot be moved directly to the test file because [ReviewReminderSchema] is a sealed interface, - * meaning all implementations of it must be within the same module. + * Version 3 of [ReviewReminderSchema]. Updated to Version 4 by fixing a bug where the [ReviewReminderScope.DeckSpecific.cachedDeckName] + * field was persisted to SharedPreferences, which is not necessary and can cause issues if the deck name changes. */ -object TestingReviewReminderMigrationSettings { - /** - * A sample old review reminder schema. Perhaps this was how the [ReviewReminder] data class was originally implemented. - * We would like to test the code that checks if review reminders stored on the device adhere to an old, outdated schema. - * In particular, does the code correctly migrate the serialized data class strings to the updated, current version of [ReviewReminder]? - */ - @Serializable - data class ReviewReminderTestSchemaVersionOne( - override val id: ReviewReminderId, - val hour: Int, - val minute: Int, - val cardTriggerThreshold: Int, - val did: DeckId, - val enabled: Boolean = true, - ) : ReviewReminderSchema { - override fun migrate(): ReviewReminderSchema = - ReviewReminderTestSchemaVersionTwo( - id = this.id, - time = VersionTwoDataClasses.ReviewReminderTime(hour, minute), - snoozeAmount = 1, - cardTriggerThreshold = this.cardTriggerThreshold, - did = this.did, - enabled = enabled, - ) - } - - /** - * Here's an example of how you can handle renamed fields in a data class stored as part of a [ReviewReminder]. - * Otherwise, there's a namespace collision with [ReviewReminderTime]. - * - * This class will be serialized into "ReviewReminderTime(timeHour=#, timeMinute=#)", which otherwise might conflict - * with the updated definition of [ReviewReminderTime], which is serialized as "ReviewReminderTime(hour=#, minute=#)". - * When we read the outdated schema from the disk, we need to tell the deserializer that it is reading a - * [VersionTwoDataClasses.ReviewReminderTime] rather than a [ReviewReminderTime], even though the names are the same. - * - * @see ReviewReminderTestSchemaVersionTwo - */ - object VersionTwoDataClasses { - @Serializable - data class ReviewReminderTime( - val timeHour: Int, - val timeMinute: Int, +@Serializable +data class ReviewReminderSchemaV3( + override val id: ReviewReminderId, + val time: ReviewReminderTime, + val cardTriggerThreshold: ReviewReminderCardTriggerThreshold, + val scope: ReviewReminderPreV4Classes.ReviewReminderScope, + var enabled: Boolean, + var latestNotifTime: EpochMilliseconds, + val profileID: String, + val onlyNotifyIfNoReviews: Boolean, +) : ReviewReminderSchema { + override fun migrate(): ReviewReminderSchemaV4 = + ReviewReminderSchemaV4( + id = id, + time = time, + cardTriggerThreshold = cardTriggerThreshold, + scope = + when (scope) { + is ReviewReminderPreV4Classes.ReviewReminderScope.Global -> ReviewReminderScope.Global + is ReviewReminderPreV4Classes.ReviewReminderScope.DeckSpecific -> ReviewReminderScope.DeckSpecific(scope.did) + }, + enabled = enabled, + latestNotifTime = latestNotifTime, + profileID = profileID, + onlyNotifyIfNoReviews = onlyNotifyIfNoReviews, ) - } +} - /** - * Another example of an old review reminder schema. See [ReviewReminderTestSchemaVersionOne] for more details. - */ - @Serializable - data class ReviewReminderTestSchemaVersionTwo( - override val id: ReviewReminderId, - val time: VersionTwoDataClasses.ReviewReminderTime, - val snoozeAmount: Int, - val cardTriggerThreshold: Int, - val did: DeckId, - val enabled: Boolean = true, - ) : ReviewReminderSchema { - override fun migrate(): ReviewReminder = - ReviewReminder.createReviewReminder( - time = ReviewReminderTime(this.time.timeHour, this.time.timeMinute), - cardTriggerThreshold = ReviewReminderCardTriggerThreshold(this.cardTriggerThreshold), - scope = if (this.did == -1L) ReviewReminderScope.Global else ReviewReminderScope.DeckSpecific(this.did), - enabled = enabled, - ) - } +/** + * Version 4 of [ReviewReminderSchema]. Updated to Version 5 by adding [ReviewReminder.thresholdFilter]. + */ +@Serializable +data class ReviewReminderSchemaV4( + override val id: ReviewReminderId, + val time: ReviewReminderTime, + val cardTriggerThreshold: ReviewReminderCardTriggerThreshold, + val scope: ReviewReminderScope, + var enabled: Boolean, + var latestNotifTime: EpochMilliseconds, + val profileID: String, + val onlyNotifyIfNoReviews: Boolean, +) : ReviewReminderSchema { + override fun migrate(): ReviewReminder = ReviewReminder.createViaMigration(this) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReviewRemindersDatabase.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReviewRemindersDatabase.kt index a2b2ff7909f6..791a599d1dfe 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReviewRemindersDatabase.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ReviewRemindersDatabase.kt @@ -64,14 +64,14 @@ object ReviewRemindersDatabase { * Its value is a [ReviewReminderGroup] serialized as a JSON String. */ @VisibleForTesting - const val DECK_SPECIFIC_KEY = "deck_" + const val PREF_DECK_SPECIFIC_REMINDERS = "deck_" /** * Key in SharedPreferences for retrieving app-wide reminders. * Its value is a [ReviewReminderGroup] serialized as a JSON String. */ @VisibleForTesting - const val APP_WIDE_KEY = "app_wide" + const val PREF_APP_WIDE_REMINDERS = "app_wide" /** * The form in which [ReviewReminderGroup] are actually written to SharedPreferences. @@ -98,13 +98,15 @@ object ReviewRemindersDatabase { * * - Version 1: [ReviewReminderSchemaV1]: 3 August 2025 - Initial version * - Version 2: [ReviewReminderSchemaV2]: 25 January 2026 - Added [ReviewReminder.onlyNotifyIfNoReviews] - * - Version 3: [ReviewReminder]: 8 February 2026 - Added [ReviewReminder.latestNotifTime] + * - Version 3: [ReviewReminderSchemaV3]: 8 February 2026 - Added [ReviewReminder.latestNotifTime] + * - Version 4: [ReviewReminderSchemaV4]: 4 October 2026 - Fixed having [ReviewReminderScope.DeckSpecific.cachedDeckName] serialized + * - Version 5: [ReviewReminder]: 4 October 2026 - Added [ReviewReminder.thresholdFilter] * * @see [oldReviewReminderSchemasForMigration] * @see [ReviewReminder] */ @VisibleForTesting - var schemaVersion = ReviewReminderSchemaVersion(3) + var schemaVersion = ReviewReminderSchemaVersion(5) /** * A map of all old [ReviewReminderSchema]s that [ReviewRemindersDatabase.performSchemaMigration] will attempt to migrate old @@ -123,7 +125,9 @@ object ReviewRemindersDatabase { mapOf( ReviewReminderSchemaVersion(1) to ReviewReminderSchemaV1::class, ReviewReminderSchemaVersion(2) to ReviewReminderSchemaV2::class, - ReviewReminderSchemaVersion(3) to ReviewReminder::class, // Most up to date version + ReviewReminderSchemaVersion(3) to ReviewReminderSchemaV3::class, + ReviewReminderSchemaVersion(4) to ReviewReminderSchemaV4::class, + ReviewReminderSchemaVersion(5) to ReviewReminder::class, // Most up-to-date version ) /** @@ -279,8 +283,8 @@ object ReviewRemindersDatabase { suspend fun getRemindersForScope(scope: ReviewReminderScope): ReviewReminderGroup = mutex.withLock { when (scope) { - is ReviewReminderScope.DeckSpecific -> getRemindersForKey(DECK_SPECIFIC_KEY + scope.did) - is ReviewReminderScope.Global -> getRemindersForKey(APP_WIDE_KEY) + is ReviewReminderScope.DeckSpecific -> getRemindersForKey(PREF_DECK_SPECIFIC_REMINDERS + scope.did) + is ReviewReminderScope.Global -> getRemindersForKey(PREF_APP_WIDE_REMINDERS) } } @@ -340,8 +344,8 @@ object ReviewRemindersDatabase { editor: ReviewReminderGroupEditor, ) { when (scope) { - is ReviewReminderScope.DeckSpecific -> editRemindersForKey(DECK_SPECIFIC_KEY + scope.did, editor) - is ReviewReminderScope.Global -> editRemindersForKey(APP_WIDE_KEY, editor) + is ReviewReminderScope.DeckSpecific -> editRemindersForKey(PREF_DECK_SPECIFIC_REMINDERS + scope.did, editor) + is ReviewReminderScope.Global -> editRemindersForKey(PREF_APP_WIDE_REMINDERS, editor) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ScheduleRemindersFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ScheduleRemindersFragment.kt index 7f6e8223263a..f17d555a0a64 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ScheduleRemindersFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/ScheduleRemindersFragment.kt @@ -27,6 +27,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.commit import androidx.lifecycle.Lifecycle +import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.snackbar.Snackbar @@ -36,17 +37,17 @@ import com.ichi2.anki.R import com.ichi2.anki.canUserAccessDeck import com.ichi2.anki.databinding.FragmentScheduleRemindersBinding import com.ichi2.anki.launchCatchingTask +import com.ichi2.anki.launchCatchingViewTask import com.ichi2.anki.libanki.DeckId import com.ichi2.anki.requireAnkiActivity import com.ichi2.anki.reviewreminders.AddEditReminderDialog.Companion.registerAddEditReminderHandler -import com.ichi2.anki.runCatching import com.ichi2.anki.snackbar.BaseSnackbarBuilderProvider import com.ichi2.anki.snackbar.SnackbarBuilder import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.anki.utils.ConfigAwareSingleFragmentActivity import com.ichi2.anki.utils.doOnApplyWindowInsets import com.ichi2.anki.utils.ext.getParcelableCompat -import com.ichi2.anki.utils.ext.launchCollectionInLifecycleScope +import com.ichi2.anki.utils.ext.launchCollectionInViewLifecycleScope import com.ichi2.anki.utils.showDialogFragment import com.ichi2.anki.withProgress import com.ichi2.utils.Permissions.openAppNotificationsSettingsScreen @@ -56,7 +57,6 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch import kotlinx.parcelize.Parcelize import timber.log.Timber @@ -188,7 +188,7 @@ class ScheduleRemindersFragment : private val flowOfShowTroubleshooting: StateFlow by lazy { combine(troubleshootingViewModel.state, flowOfHasReminders) { state, hasReminders -> hasReminders && state.summaryStatus == SummaryStatus.Error - }.stateIn(lifecycleScope, SharingStarted.Eagerly, initialValue = false) + }.flowWithLifecycle(lifecycle).stateIn(lifecycleScope, SharingStarted.Eagerly, initialValue = false) } override val baseSnackbarBuilder: SnackbarBuilder = { @@ -235,7 +235,7 @@ class ScheduleRemindersFragment : setContentInsets() binding.floatingActionButtonAdd.setOnClickListener { addReminder() } - flowOfShowTroubleshooting.launchCollectionInLifecycleScope(::renderTroubleshootingSnackbar) + flowOfShowTroubleshooting.launchCollectionInViewLifecycleScope(::renderTroubleshootingSnackbar) // Set up recycler view binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) @@ -249,7 +249,7 @@ class ScheduleRemindersFragment : binding.recyclerView.adapter = adapter // Retrieve reminders based on the editing scope - launchCatchingTask { loadDatabaseRemindersIntoUI() } + launchCatchingViewTask { loadDatabaseRemindersIntoUI() } // If the user creates or edits a review reminder, the dialog for doing so opens // Once their changes are complete, the dialog closes and this fragment is reloaded @@ -396,15 +396,13 @@ class ScheduleRemindersFragment : } private fun retrieveSubtitle(setSubtitle: (String?) -> Unit) { - viewLifecycleOwner.lifecycleScope.launch { - requireActivity().runCatching { - val subtitle = - when (val scope = scheduleRemindersScope) { - is ReviewReminderScope.Global -> null - is ReviewReminderScope.DeckSpecific -> scope.getDeckName() - } - setSubtitle(subtitle) - } + launchCatchingViewTask { + val subtitle = + when (val scope = scheduleRemindersScope) { + is ReviewReminderScope.Global -> null + is ReviewReminderScope.DeckSpecific -> scope.getDeckName() + } + setSubtitle(subtitle) } } @@ -553,7 +551,7 @@ class ScheduleRemindersFragment : did: DeckId, callback: (deckName: String) -> Unit, ) { - launchCatchingTask { + launchCatchingViewTask { val deckName = cachedDeckNames.getOrPut(did) { withCol { decks.name(did) } } callback(deckName) } @@ -568,7 +566,7 @@ class ScheduleRemindersFragment : did: DeckId, callback: (isDeckAccessible: Boolean) -> Unit, ) { - launchCatchingTask { + launchCatchingViewTask { val isDeckAccessible = canUserAccessDeck(did) Timber.d("Checked for whether deck with id %s can be accessed: %s", did, isDeckAccessible) callback(isDeckAccessible) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/scheduling/ForgetCardsDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/scheduling/ForgetCardsDialog.kt index 4817c673c5d3..24ce4aee31a8 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/scheduling/ForgetCardsDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/scheduling/ForgetCardsDialog.kt @@ -74,13 +74,13 @@ class ForgetCardsDialog : AnalyticsDialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val sharedPrefs = requireContext().sharedPrefs() if (savedInstanceState != null) { - restoreOriginalPositionIfPossible = savedInstanceState.getBoolean(ARG_RESTORE_ORIGINAL, true) - resetRepetitionAndLapseCounts = savedInstanceState.getBoolean(ARG_RESET_REPETITION, false) + restoreOriginalPositionIfPossible = savedInstanceState.getBoolean(STATE_RESTORE_ORIGINAL, true) + resetRepetitionAndLapseCounts = savedInstanceState.getBoolean(STATE_RESET_REPETITION, false) } else { // If no saved instance state, load the last saved preferences for restore position and reset counts. with(sharedPrefs) { - restoreOriginalPositionIfPossible = getBoolean(ARG_RESTORE_ORIGINAL, true) - resetRepetitionAndLapseCounts = getBoolean(ARG_RESET_REPETITION, false) + restoreOriginalPositionIfPossible = getBoolean(PREF_RESTORE_ORIGINAL, true) + resetRepetitionAndLapseCounts = getBoolean(PREF_RESET_REPETITION, false) } } val binding = DialogForgetCardsBinding.inflate(layoutInflater) @@ -108,14 +108,14 @@ class ForgetCardsDialog : AnalyticsDialogFragment() { } positiveButton(CommonString.reset) { sharedPrefs.edit { - putBoolean(ARG_RESTORE_ORIGINAL, restoreOriginalPositionIfPossible) - putBoolean(ARG_RESET_REPETITION, resetRepetitionAndLapseCounts) + putBoolean(PREF_RESTORE_ORIGINAL, restoreOriginalPositionIfPossible) + putBoolean(PREF_RESET_REPETITION, resetRepetitionAndLapseCounts) } parentFragmentManager.setFragmentResult( REQUEST_KEY_FORGET, Bundle().apply { - putBoolean(ARG_RESTORE_ORIGINAL, restoreOriginalPositionIfPossible) - putBoolean(ARG_RESET_REPETITION, resetRepetitionAndLapseCounts) + putBoolean(RESULT_RESTORE_ORIGINAL, restoreOriginalPositionIfPossible) + putBoolean(RESULT_RESET_REPETITION, resetRepetitionAndLapseCounts) }, ) } @@ -126,14 +126,19 @@ class ForgetCardsDialog : AnalyticsDialogFragment() { override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - outState.putBoolean(ARG_RESTORE_ORIGINAL, restoreOriginalPositionIfPossible) - outState.putBoolean(ARG_RESET_REPETITION, resetRepetitionAndLapseCounts) + outState.putBoolean(STATE_RESTORE_ORIGINAL, restoreOriginalPositionIfPossible) + outState.putBoolean(STATE_RESET_REPETITION, resetRepetitionAndLapseCounts) } companion object { const val REQUEST_KEY_FORGET = "request_key_forget_cards" - const val ARG_RESTORE_ORIGINAL = "key_restore_original" - const val ARG_RESET_REPETITION = "key_reset_repetition" + const val RESULT_RESTORE_ORIGINAL = "key_restore_original" + const val RESULT_RESET_REPETITION = "key_reset_repetition" + + private const val STATE_RESTORE_ORIGINAL = "key_restore_original" + private const val STATE_RESET_REPETITION = "key_reset_repetition" + private const val PREF_RESTORE_ORIGINAL = "key_restore_original" + private const val PREF_RESET_REPETITION = "key_reset_repetition" } } @@ -147,8 +152,8 @@ internal fun FragmentActivity.registerOnForgetHandler(cardsIdsProducer: suspend setFragmentResultListener(ForgetCardsDialog.REQUEST_KEY_FORGET) { _, bundle -> forgetCards( cardsIdsProducer = cardsIdsProducer, - restoreOriginalPositionIfPossible = bundle.getBoolean(ForgetCardsDialog.ARG_RESTORE_ORIGINAL), - resetRepetitionAndLapseCounts = bundle.getBoolean(ForgetCardsDialog.ARG_RESET_REPETITION), + restoreOriginalPositionIfPossible = bundle.getBoolean(ForgetCardsDialog.RESULT_RESTORE_ORIGINAL), + resetRepetitionAndLapseCounts = bundle.getBoolean(ForgetCardsDialog.RESULT_RESET_REPETITION), ) } } @@ -163,8 +168,8 @@ internal fun Fragment.registerOnForgetHandler(cardsIdsProducer: suspend () -> Li setFragmentResultListener(ForgetCardsDialog.REQUEST_KEY_FORGET) { _, bundle -> activity?.forgetCards( cardsIdsProducer = cardsIdsProducer, - restoreOriginalPositionIfPossible = bundle.getBoolean(ForgetCardsDialog.ARG_RESTORE_ORIGINAL), - resetRepetitionAndLapseCounts = bundle.getBoolean(ForgetCardsDialog.ARG_RESET_REPETITION), + restoreOriginalPositionIfPossible = bundle.getBoolean(ForgetCardsDialog.RESULT_RESTORE_ORIGINAL), + resetRepetitionAndLapseCounts = bundle.getBoolean(ForgetCardsDialog.RESULT_RESET_REPETITION), ) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/scheduling/SetDueDateDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/scheduling/SetDueDateDialog.kt index 4298b0897805..a8c71d294dc2 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/scheduling/SetDueDateDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/scheduling/SetDueDateDialog.kt @@ -40,6 +40,7 @@ import com.ichi2.anki.asyncCatching import com.ichi2.anki.browser.IdsFile import com.ichi2.anki.browser.removeSafely import com.ichi2.anki.common.utils.android.showThemedToast +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.databinding.DialogSetDueDateBinding import com.ichi2.anki.databinding.FragmentSetDueDateRangeBinding import com.ichi2.anki.databinding.FragmentSetDueDateSingleBinding @@ -58,7 +59,6 @@ import com.ichi2.anki.utils.openUrl import com.ichi2.anki.withProgress import com.ichi2.utils.AndroidUiUtils import com.ichi2.utils.create -import com.ichi2.utils.dp import com.ichi2.utils.negativeButton import com.ichi2.utils.positiveButton import com.ichi2.utils.title @@ -113,8 +113,8 @@ class SetDueDateDialog : AnalyticsDialogFragment() { Timber.d("Set due date dialog: %d card(s)", cardIds.size) this.initialRotation = getScreenRotation() - childFragmentManager.setFragmentResultListener(RESULT_SUBMIT_DUE_DATE, this) { _, _ -> - Timber.i(RESULT_SUBMIT_DUE_DATE) + childFragmentManager.setFragmentResultListener(REQUEST_SUBMIT_DUE_DATE, this) { _, _ -> + Timber.i(REQUEST_SUBMIT_DUE_DATE) requireActivity().launchCatchingTask { if (launchUpdateDueDate(showError = false).await() == null) { Timber.w("unsuccessful updating dates; not dismissing dialog") @@ -266,7 +266,7 @@ class SetDueDateDialog : AnalyticsDialogFragment() { const val ARG_IDS_FILE = "ARGS_IDS_FILE" const val MAX_WIDTH_DP = 450f - private const val RESULT_SUBMIT_DUE_DATE = "SubmitDueDate" + private const val REQUEST_SUBMIT_DUE_DATE = "SubmitDueDate" /** Keeps the existing dialog and its input when another request arrives. */ @MainThread @@ -348,7 +348,7 @@ class SetDueDateDialog : AnalyticsDialogFragment() { event?.keyCode == KeyEvent.KEYCODE_ENTER ) { parentFragmentManager.setFragmentResult( - RESULT_SUBMIT_DUE_DATE, + REQUEST_SUBMIT_DUE_DATE, Bundle(), ) true @@ -423,7 +423,7 @@ class SetDueDateDialog : AnalyticsDialogFragment() { event?.keyCode == KeyEvent.KEYCODE_ENTER ) { parentFragmentManager.setFragmentResult( - RESULT_SUBMIT_DUE_DATE, + REQUEST_SUBMIT_DUE_DATE, Bundle(), ) true diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/security/AppPermissions.kt b/AnkiDroid/src/main/java/com/ichi2/anki/security/AppPermissions.kt index 2d44b55f6866..aa865a99ac75 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/security/AppPermissions.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/security/AppPermissions.kt @@ -3,6 +3,8 @@ package com.ichi2.anki.security import android.content.Context +import android.content.Intent +import android.net.Uri import androidx.annotation.VisibleForTesting import com.ichi2.anki.CommonString import com.ichi2.anki.R @@ -34,6 +36,20 @@ class AppPermissions( private val context: Context, private val showSnackbar: (String) -> Unit = {}, ) { + /** + * Creates a new URL navigation intent, or `null` when permission is denied. + * + * HTTP(S) links do not require external app launches to be enabled and are returned with + * `CATEGORY_BROWSABLE`. + * + * Other URL schemes require [external app launches][checkCanLaunchExternalApps] to be enabled. + */ + fun createUrlIntent(url: Uri): Intent? = + when (url.scheme) { + "http", "https" -> Intent(Intent.ACTION_VIEW, url).addCategory(Intent.CATEGORY_BROWSABLE) + else -> if (checkCanLaunchExternalApps()) Intent(Intent.ACTION_VIEW, url) else null + } + /** * Returns true if cards may launch external apps; * shows a rate-limited snackbar on denial. diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/DebugInfoService.kt b/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/DebugInfoService.kt index 3cfaae2301aa..5ef11217fc58 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/DebugInfoService.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/DebugInfoService.kt @@ -8,7 +8,9 @@ import com.ichi2.anki.BuildConfig import com.ichi2.anki.CollectionManager import com.ichi2.anki.common.crashreporting.CrashReportService import com.ichi2.anki.common.utils.ext.fsrsEnabled +import com.ichi2.utils.LanguageUtil import com.ichi2.utils.VersionUtils.pkgVersionName +import com.ichi2.utils.getLanguageDebugInfo import com.ichi2.utils.getWebViewInfo import org.acra.util.Installation import timber.log.Timber @@ -24,6 +26,13 @@ object DebugInfoService { val webviewInfo = getWebViewInfo(info) // isFSRSEnabled is null on startup val isFSRSEnabled = getFSRSStatus() + val languageInfo = getLanguageDebugInfo(info) + val appLocale = + when (languageInfo.appLocale) { + LanguageUtil.SYSTEM_LANGUAGE_TAG -> "System language" + null -> "Error" + else -> languageInfo.appLocale + } return """ AnkiDroid Version = $pkgVersionName (${BuildConfig.GIT_COMMIT_HASH}) Backend Version = ${BuildConfig.BACKEND_VERSION} (${BackendBuildConfig.ANKI_DESKTOP_VERSION} ${BackendBuildConfig.ANKI_COMMIT_HASH}) @@ -34,6 +43,7 @@ object DebugInfoService { ACRA UUID = ${Installation.id(info)} FSRS = ${BackendBuildConfig.FSRS_VERSION} (Enabled: $isFSRSEnabled) Crash Reports Enabled = ${isSendingCrashReports(info)} + Language = System: ${languageInfo.systemLocale} | App: $appLocale | Backend: ${languageInfo.backendLocales?.joinToString()} """.trimIndent() // A Markdown newline is two spaces followed by '\n', this avoids the need for // code fences diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/PreferenceUpgradeService.kt b/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/PreferenceUpgradeService.kt index 69ae4e8a66a1..0ed4f4ad688c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/PreferenceUpgradeService.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/PreferenceUpgradeService.kt @@ -27,7 +27,6 @@ import com.ichi2.anki.browser.CardBrowserColumn.REVIEWS import com.ichi2.anki.browser.CardBrowserColumn.SFLD import com.ichi2.anki.browser.CardBrowserColumn.TAGS import com.ichi2.anki.cardviewer.Gesture -import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.common.preferences.sharedPrefs import com.ichi2.anki.common.utils.HashUtil.hashSetInit import com.ichi2.anki.libanki.Consts @@ -36,7 +35,7 @@ import com.ichi2.anki.model.CardsOrNotes import com.ichi2.anki.noteeditor.CustomToolbarButton import com.ichi2.anki.preferences.reviewer.ViewerAction import com.ichi2.anki.reviewer.Binding -import com.ichi2.anki.reviewer.Binding.Companion.keyCode +import com.ichi2.anki.reviewer.Binding.KeyCode import com.ichi2.anki.reviewer.CardSide import com.ichi2.anki.reviewer.FullScreenMode import com.ichi2.anki.reviewer.MappableBinding @@ -95,7 +94,7 @@ object PreferenceUpgradeService { companion object { /** A version code where the value doesn't matter as we're not using the result */ private const val IGNORED_LEGACY_VERSION_CODE = 0L - const val UPGRADE_VERSION_PREF_KEY = "preferenceUpgradeVersion" + const val PREF_PREFERENCE_UPGRADE_VERSION = "preferenceUpgradeVersion" /** Returns all instances of preference upgrade classes */ private fun getAllInstances(legacyPreviousVersionCode: LegacyVersionIdentifier) = @@ -146,14 +145,14 @@ object PreferenceUpgradeService { setPreferenceVersion(preferences, versionWhichRequiresNoUpgrades) } - internal fun getPreferenceVersion(preferences: SharedPreferences) = preferences.getInt(UPGRADE_VERSION_PREF_KEY, 0) + internal fun getPreferenceVersion(preferences: SharedPreferences) = preferences.getInt(PREF_PREFERENCE_UPGRADE_VERSION, 0) internal fun setPreferenceVersion( preferences: SharedPreferences, versionIdentifier: VersionIdentifier, ) { Timber.i("upgrading preference version to '$versionIdentifier'") - preferences.edit { putInt(UPGRADE_VERSION_PREF_KEY, versionIdentifier) } + preferences.edit { putInt(PREF_PREFERENCE_UPGRADE_VERSION, versionIdentifier) } } /** Returns the collection of all preference version numbers */ @@ -364,7 +363,7 @@ object PreferenceUpgradeService { oldGesturePreferenceKey: String, volumeKeyCode: Int, ) { - upgradeBinding(preferences, oldGesturePreferenceKey, keyCode(volumeKeyCode)) + upgradeBinding(preferences, oldGesturePreferenceKey, KeyCode(volumeKeyCode)) } private fun upgradeGestureToBinding( @@ -454,10 +453,10 @@ object PreferenceUpgradeService { internal class UpgradeFetchMedia : PreferenceUpgrade(9) { override fun upgrade(preferences: SharedPreferences) { - val fetchMediaSwitch = preferences.getBoolean(RemovedPreferences.SYNC_FETCHES_MEDIA, true) + val fetchMediaSwitch = preferences.getBoolean(RemovedPreferences.PREF_SYNC_FETCHES_MEDIA, true) val status = if (fetchMediaSwitch) "always" else "never" preferences.edit { - remove(RemovedPreferences.SYNC_FETCHES_MEDIA) + remove(RemovedPreferences.PREF_SYNC_FETCHES_MEDIA) putString("syncFetchMedia", status) } } @@ -617,13 +616,13 @@ object PreferenceUpgradeService { fun clearLegacyKeys() { Timber.d("removing legacy keys") preferences.edit { - remove(DISPLAY_COLUMN_1_KEY) - remove(DISPLAY_COLUMN_2_KEY) + remove(PREF_DISPLAY_COLUMN_1) + remove(PREF_DISPLAY_COLUMN_2) } } - val currentColumn1Index = preferences.getInt(DISPLAY_COLUMN_1_KEY, -1) - val currentColumn2Index = preferences.getInt(DISPLAY_COLUMN_2_KEY, -1) + val currentColumn1Index = preferences.getInt(PREF_DISPLAY_COLUMN_1, -1) + val currentColumn2Index = preferences.getInt(PREF_DISPLAY_COLUMN_2, -1) if (currentColumn1Index == -1 || currentColumn2Index == -1) { Timber.d("no update needed") @@ -654,8 +653,8 @@ object PreferenceUpgradeService { } companion object { - private const val DISPLAY_COLUMN_1_KEY = "cardBrowserColumn1" - private const val DISPLAY_COLUMN_2_KEY = "cardBrowserColumn2" + private const val PREF_DISPLAY_COLUMN_1 = "cardBrowserColumn1" + private const val PREF_DISPLAY_COLUMN_2 = "cardBrowserColumn2" @VisibleForTesting internal val LEGACY_COLUMN1_KEYS = arrayOf(QUESTION, SFLD) @@ -675,7 +674,6 @@ object PreferenceUpgradeService { } } - @NeedsTest("long touch gesture is removed from preferences") internal class RemoveLongTouchGesture : PreferenceUpgrade(21) { private val keys = listOf( @@ -734,15 +732,20 @@ object PreferenceUpgradeService { override fun upgrade(preferences: SharedPreferences) { for (key in keys) { val value = preferences.getString(key, null) ?: continue - val bindings = fromPreferenceString(value) - val unknown = bindings.filter { it.binding is Binding.UnknownBinding } - if (unknown.isEmpty()) continue - val newBindings = bindings - unknown + val (newBindings, error) = parseBindingsAndError(value) + if (!error) continue preferences.edit { putString(key, newBindings.toPreferenceString()) } } } + + /** The list of bindings, and whether there are bindings that could not be interpreted. */ + private fun parseBindingsAndError(prefString: String): Pair, Boolean> { + val substringCount = MappableBinding.getPreferenceSubstrings(prefString).size + val bindings = ReviewerBinding.fromPreferenceString(prefString) + return bindings to (substringCount != bindings.size) + } } internal class UpgradeDoubleTapTimeout : PreferenceUpgrade(22) { @@ -797,9 +800,9 @@ object PreferenceUpgradeService { internal class UpgradeThemes : PreferenceUpgrade(26) { companion object { - const val KEY_APP_THEME = "appTheme" - const val KEY_DAY_THEME = "dayTheme" - const val KEY_NIGHT_THEME = "nightTheme" + const val PREF_APP_THEME = "appTheme" + const val PREF_DAY_THEME = "dayTheme" + const val PREF_NIGHT_THEME = "nightTheme" const val THEME_FOLLOW_SYSTEM = "0" const val THEME_LIGHT = "1" @@ -813,20 +816,20 @@ object PreferenceUpgradeService { @Suppress("MoveVariableDeclarationIntoWhen") override fun upgrade(preferences: SharedPreferences) { - val appTheme = preferences.getString(KEY_APP_THEME, THEME_FOLLOW_SYSTEM) + val appTheme = preferences.getString(PREF_APP_THEME, THEME_FOLLOW_SYSTEM) when (appTheme) { THEME_FOLLOW_SYSTEM -> return THEME_LIGHT, THEME_PLAIN -> { preferences.edit { - putString(KEY_APP_THEME, THEME_DAY) - putString(KEY_DAY_THEME, appTheme) + putString(PREF_APP_THEME, THEME_DAY) + putString(PREF_DAY_THEME, appTheme) } } THEME_BLACK, THEME_DARK -> { preferences.edit { - putString(KEY_APP_THEME, THEME_NIGHT) - putString(KEY_NIGHT_THEME, appTheme) + putString(PREF_APP_THEME, THEME_NIGHT) + putString(PREF_NIGHT_THEME, appTheme) } } } @@ -898,7 +901,7 @@ object PreferenceUpgradeService { /** * Removes the legacy "analytics_opt_in" key so all users are re-prompted * to opt in under the new GA4-backed analytics implementation, which - * stores the opt-in under [AnkiDroidUsageAnalytics.ANALYTICS_OPTIN_KEY]. + * stores the opt-in under [AnkiDroidUsageAnalytics.PREF_ANALYTICS_OPTIN]. */ internal class ResetAnalyticsOptIn2 : PreferenceUpgrade(29) { override fun upgrade(preferences: SharedPreferences) = preferences.edit { remove("analytics_opt_in") } @@ -907,7 +910,7 @@ object PreferenceUpgradeService { } object RemovedPreferences { - const val SYNC_FETCHES_MEDIA = "syncFetchesMedia" + const val PREF_SYNC_FETCHES_MEDIA = "syncFetchesMedia" } fun bindingFromPreference( diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/ThrowableFilterService.kt b/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/ThrowableFilterService.kt index 8b479484308b..84c7a6532518 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/ThrowableFilterService.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/ThrowableFilterService.kt @@ -5,12 +5,17 @@ package com.ichi2.anki.servicelayer import androidx.annotation.VisibleForTesting +import com.ichi2.anki.exception.SanitizedThrowable import com.ichi2.anki.exception.StorageAccessException +import com.ichi2.utils.ExceptionUtil.causeChain +import com.ichi2.utils.ExceptionUtil.causesAndSuppressed import net.ankiweb.rsdroid.BackendException.BackendSchedulerUpgradeRequiredException import net.ankiweb.rsdroid.exceptions.BackendNetworkException import net.ankiweb.rsdroid.exceptions.BackendSyncException import net.ankiweb.rsdroid.exceptions.BackendSyncException.BackendSyncServerMessageException import timber.log.Timber +import java.util.Collections +import java.util.IdentityHashMap object ThrowableFilterService { @FunctionalInterface @@ -25,11 +30,15 @@ object ThrowableFilterService { Timber.w("unexpected: thread was null") return@FilteringExceptionHandler } - if (shouldDiscardThrowable(throwable)) { - Timber.i("discarding throwable") - return@FilteringExceptionHandler - } - originalUncaughtExceptionHandler?.uncaughtException(thread, throwable) + val reportable = + if (shouldDiscardThrowable(throwable)) { + // Retain diagnostic class names and frames without exposing private messages. + Timber.i("sanitizing uncaught throwable") + SanitizedThrowable.from(throwable) + } else { + throwable + } + originalUncaughtExceptionHandler?.uncaughtException(thread, reportable) } fun initialize() { @@ -38,7 +47,7 @@ object ThrowableFilterService { } /** - * We want to filter any exceptions with PII, then chain to other handlers + * Sanitize filtered uncaught exceptions before delegating to the reporting handlers. */ @Synchronized @VisibleForTesting @@ -69,14 +78,18 @@ object ThrowableFilterService { initialize() } + /** + * Whether a handled report should be discarded. Uncaught errors are sanitized instead, so they + * can still reach the reporting handlers. + */ fun shouldDiscardThrowable(t: Throwable): Boolean { - // Note that an exception may have a nested BackendSyncException, - // so we check if it is safe from PII despite also filtering by type - return exceptionIsUnwanted(t) || !t.safeFromPII() + // PII-bearing exceptions may be nested or suppressed. ACRA's stack-trace hashing also + // assumes the main cause chain is acyclic, so circular causes cannot be reported as-is. + return exceptionIsUnwanted(t) || !t.safeFromPII() || t.hasCyclicCause() } - // There are few exception types that are common, but are unwanted in - // our analytics or crash report service because they are not actionable + // These common types are noise in handled reports. Uncaught instances still indicate crashes + // and must reach reporting after sanitization. fun exceptionIsUnwanted(t: Throwable): Boolean { Timber.v("exceptionIsUnwanted - examining %s", t.javaClass.simpleName) when (t) { @@ -90,12 +103,14 @@ object ThrowableFilterService { } /** - * Checks if the [Throwable] is safe from Personally Identifiable Information (PII) + * Checks this throwable, its causes and suppressed exceptions for known PII-bearing types. * @return `false` if the [Throwable] contains PII, otherwise `true` */ - fun Throwable.safeFromPII(): Boolean { - if (this.containsPIINonRecursive()) return false - return this.cause?.safeFromPII() != false + fun Throwable.safeFromPII(): Boolean = causesAndSuppressed().none { it.containsPIINonRecursive() } + + private fun Throwable.hasCyclicCause(): Boolean { + val seen = Collections.newSetFromMap(IdentityHashMap()) + return causeChain.any { !seen.add(it) } } private fun Throwable.containsPIINonRecursive(): Boolean { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/services/BootService.kt b/AnkiDroid/src/main/java/com/ichi2/anki/services/BootService.kt index 9e31c80617a8..626772b0caf4 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/services/BootService.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/services/BootService.kt @@ -9,13 +9,13 @@ import android.content.Context import android.content.Intent import androidx.core.app.PendingIntentCompat import com.ichi2.anki.CollectionManager +import com.ichi2.anki.CommonPreferenceKey import com.ichi2.anki.CommonString -import com.ichi2.anki.IntentHandler.Companion.grantedStoragePermissions -import com.ichi2.anki.R import com.ichi2.anki.common.android.AnkiBroadcastReceiver import com.ichi2.anki.common.annotations.LegacyNotifications import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.common.preferences.sharedPrefs +import com.ichi2.anki.common.storage.grantedStoragePermissions import com.ichi2.anki.common.time.Time import com.ichi2.anki.common.time.TimeManager import com.ichi2.anki.common.utils.android.showThemedToast @@ -149,7 +149,7 @@ class BootService : AnkiBroadcastReceiver() { // Don't schedule a notification if the due reminders setting is not enabled if (sp .getString( - context.getString(R.string.pref_notifications_minimum_cards_due_key), + context.getString(CommonPreferenceKey.pref_notifications_minimum_cards_due_key), PENDING_NOTIFICATIONS_ONLY.toString(), )!! .toInt() >= PENDING_NOTIFICATIONS_ONLY diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/services/NotificationService.kt b/AnkiDroid/src/main/java/com/ichi2/anki/services/NotificationService.kt index ff5683440a44..4aa9b47f14cf 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/services/NotificationService.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/services/NotificationService.kt @@ -13,6 +13,7 @@ import androidx.core.app.PendingIntentCompat import androidx.core.content.getSystemService import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.CommonPlurals +import com.ichi2.anki.CommonPreferenceKey import com.ichi2.anki.CommonString import com.ichi2.anki.DeckPicker import com.ichi2.anki.IntentHandler @@ -205,10 +206,13 @@ class NotificationService : AnkiBroadcastReceiver() { } } val dueCardsTotal = dueCardsCount.count() - if (dueCardsTotal < reviewReminder.cardTriggerThreshold.threshold) { + val consideredCardsCount = reviewReminder.thresholdFilter.filterCounts(dueCardsCount) + val consideredCardsTotal = consideredCardsCount.count() + + if (consideredCardsTotal < reviewReminder.cardTriggerThreshold.threshold) { Timber.i( "${reminderLogPrefix(reviewReminder.id)} skip: Aborting notification due to cardTriggerThreshold " + - "(due: $dueCardsTotal, threshold: ${reviewReminder.cardTriggerThreshold.threshold})", + "(due: $dueCardsCount, considered: $consideredCardsCount, threshold: ${reviewReminder.cardTriggerThreshold.threshold})", ) return } @@ -362,7 +366,7 @@ class NotificationService : AnkiBroadcastReceiver() { val minCardsDue = preferences .getString( - context.getString(R.string.pref_notifications_minimum_cards_due_key), + context.getString(CommonPreferenceKey.pref_notifications_minimum_cards_due_key), PENDING_NOTIFICATIONS_ONLY.toString(), )!! .toInt() diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/settings/Prefs.kt b/AnkiDroid/src/main/java/com/ichi2/anki/settings/Prefs.kt index 3b2a89ebf967..1be09801f0ba 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/settings/Prefs.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/settings/Prefs.kt @@ -10,11 +10,14 @@ import androidx.annotation.VisibleForTesting import androidx.core.content.edit import com.ichi2.anki.AnkiDroidApp import com.ichi2.anki.BuildConfig +import com.ichi2.anki.CommonPreferenceKey import com.ichi2.anki.R import com.ichi2.anki.cardviewer.TapGestureMode import com.ichi2.anki.common.preferences.AnimationPreferences +import com.ichi2.anki.common.preferences.NotificationPreferences import com.ichi2.anki.common.preferences.sharedPrefs import com.ichi2.anki.common.utils.isRunningAsUnitTest +import com.ichi2.anki.libanki.DeckId import com.ichi2.anki.preferences.SharedPreferencesProvider import com.ichi2.anki.settings.enums.AppTheme import com.ichi2.anki.settings.enums.DayTheme @@ -36,7 +39,8 @@ object Prefs : PrefsRepository(AnkiDroidApp.sharedPreferencesProvider, AnkiDroid open class PrefsRepository protected constructor( private val preferences: SharedPreferencesProvider, private val resources: Resources, -) : AnimationPreferences { +) : AnimationPreferences, + NotificationPreferences { constructor(sharedPrefs: SharedPreferences, resources: Resources) : this(SharedPreferencesProvider { sharedPrefs }, resources) constructor(context: Context) : this(context.sharedPrefs(), context.resources) @@ -236,6 +240,14 @@ open class PrefsRepository protected constructor( val exitViaDoubleTapBack by booleanPref(R.string.exit_via_double_tap_back_key, false) + // ****************************************** Editing ****************************************** // + + /** + * Last deck successfully used when saving note data from a 'share' intent, + * or zero if no destination has been saved. + */ + var lastSharedDeckId: DeckId by longPref(R.string.last_shared_deck_id_key, defaultValue = 0L) + // ****************************************** Sync ****************************************** // val isAutoSyncEnabled by booleanPref(R.string.automatic_sync_choice_key, false) @@ -246,6 +258,13 @@ open class PrefsRepository protected constructor( var hkey by stringPref(R.string.hkey_key) var currentSyncUri by stringPref(R.string.current_sync_uri_key) + /** + * End time of the last manual or automatic sync attempt, in epoch milliseconds. + * Rate-limits foreground auto-sync and sync intents, including failed, canceled and no-change attempts. + * + * If a request is blocked before starting (rate limit; metered connection etc...) do not update it, + * so it can try again once the block is lifted. + */ var lastSyncTime by longPref(R.string.last_sync_time_key, defaultValue = 0L) val shouldFetchMedia: ShouldFetchMedia @@ -276,7 +295,12 @@ open class PrefsRepository protected constructor( /** * Whether to enable the new review reminders notification system. */ - var newReviewRemindersEnabled by booleanPref(R.string.pref_new_review_reminders, false) + override var newReviewRemindersEnabled by booleanPref(CommonPreferenceKey.pref_new_review_reminders, defaultValue = false) + + private val minimumCardsDueForNotification by stringPref(CommonPreferenceKey.pref_notifications_minimum_cards_due_key, "1000000") + + override val legacyNotificationsEnabled: Boolean + get() = minimumCardsDueForNotification!!.toInt() < 1000000 /** * Review reminder IDs are unique, starting at 0 and climbing upwards by one each time a new one is created. diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/shareddeck/SharedDecksActivity.kt b/AnkiDroid/src/main/java/com/ichi2/anki/shareddeck/SharedDecksActivity.kt index 7f084abab01a..6bfa07aacda4 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/shareddeck/SharedDecksActivity.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/shareddeck/SharedDecksActivity.kt @@ -11,6 +11,7 @@ import android.view.MenuItem import android.view.ViewGroup.MarginLayoutParams import android.webkit.CookieManager import android.webkit.URLUtil +import android.webkit.WebBackForwardList import android.webkit.WebResourceError import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse @@ -20,25 +21,32 @@ import androidx.activity.OnBackPressedCallback import androidx.activity.SystemBarStyle import androidx.activity.enableEdgeToEdge import androidx.annotation.VisibleForTesting +import androidx.appcompat.app.AlertDialog import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.fragment.app.commit -import com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_INDEFINITE import com.ichi2.anki.AnkiActivity +import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CommonString import com.ichi2.anki.R import com.ichi2.anki.common.utils.ext.requireSystemService import com.ichi2.anki.databinding.ActivitySharedDecksBinding -import com.ichi2.anki.isLoggedIn -import com.ichi2.anki.snackbar.showSnackbar +import com.ichi2.anki.ui.internationalization.sentenceCase import com.ichi2.anki.workarounds.SafeWebViewLayout import com.ichi2.utils.FileNameAndExtension +import com.ichi2.utils.message +import com.ichi2.utils.negativeButton +import com.ichi2.utils.neutralButton +import com.ichi2.utils.positiveButton +import com.ichi2.utils.show +import com.ichi2.utils.title import dev.androidbroadcast.vbpd.viewBinding import timber.log.Timber import java.io.Serializable import kotlin.random.Random +import com.ichi2.anki.common.android.R as CommonR /** * Browse AnkiWeb shared decks with the functionality to download and import them. @@ -51,11 +59,22 @@ class SharedDecksActivity : AnkiActivity(R.layout.activity_shared_decks) { private var shouldHistoryBeCleared = false + private var isReturningAfterLogin = false + + private val pagesBeforeLogin = mutableListOf() + + private var loginRequiredDialog: AlertDialog? = null + private val allowedHosts = listOf(Regex("""^(?:.*\.)?ankiweb\.net$"""), Regex("""^ankiuser\.net$"""), Regex("""^ankisrs\.net$""")) private val onBackPressedCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { - if (binding.webView.canGoBack()) binding.webView.goBack() + if (isReturningAfterLogin) return + if (binding.webView.canGoBack()) { + binding.webView.goBack() + } else { + pagesBeforeLogin.removeLastOrNull()?.let { returnTo(it) } + } } } @@ -68,15 +87,20 @@ class SharedDecksActivity : AnkiActivity(R.layout.activity_shared_decks) { */ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal inner class SharedDeckWebViewClient : WebViewClient() { - private var redirectTimes = 0 - override fun doUpdateVisitedHistory( view: WebView?, url: String?, isReload: Boolean, ) { super.doUpdateVisitedHistory(view, url, isReload) - onBackPressedCallback.isEnabled = binding.webView.canGoBack() + if (isReturningAfterLogin && url?.startsWith(SHARED_PAGES_PREFIX) == true) { + binding.webView.clearHistory() + isReturningAfterLogin = false + } + updateBackPressedCallback() + if (url?.startsWith(AFTER_LOGIN_URL) == true && isLoggedInToAnkiWeb()) { + returnToSharedDecks() + } } override fun onPageFinished( @@ -87,6 +111,7 @@ class SharedDecksActivity : AnkiActivity(R.layout.activity_shared_decks) { if (shouldHistoryBeCleared) { binding.webView.clearHistory() shouldHistoryBeCleared = false + updateBackPressedCallback() } super.onPageFinished(view, url) } @@ -113,10 +138,6 @@ class SharedDecksActivity : AnkiActivity(R.layout.activity_shared_decks) { return true } - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - internal val isLoggedInToAnkiWeb: Boolean - get() = isLoggedInToAnkiWeb() - override fun onReceivedHttpError( view: WebView?, request: WebResourceRequest?, @@ -128,12 +149,12 @@ class SharedDecksActivity : AnkiActivity(R.layout.activity_shared_decks) { // If a user is logged in, they see: "Daily limit exceeded; please try again tomorrow." // We have nothing we can do here - if (isLoggedInToAnkiWeb) return + if (isLoggedInToAnkiWeb()) return // The following cases are handled below: // "Please log in to download more decks." - on clicking "Download" // "Please log in to perform more searches" - on searching - redirectUserToSignUpOrLogin() + showLoginRequiredDialog() } override fun onReceivedError( @@ -145,59 +166,67 @@ class SharedDecksActivity : AnkiActivity(R.layout.activity_shared_decks) { shouldHistoryBeCleared = false super.onReceivedError(view, request, error) } - - /** - * Redirects the user to a login page - * - * The redirect is not performed if [redirectTimes] is 3 or more - */ - private fun redirectUserToSignUpOrLogin() { - showLoginRequiredSnackbar() - - // redirect user to /account/login - // TODO: the result of login is typically redirecting the user to their decks - // this should be improved - - if (redirectTimes++ < 3) { - redirectToLogin() - } else { - // Ensure that we do not have an infinite redirect - Timber.w("HTTP 429 redirect limit exceeded, only displaying message") - } - } } - /** - * Tells the user they need to log in to download more decks, with a sign-up action for - * users without an AnkiDroid login. - */ - internal fun showLoginRequiredSnackbar() { - showSnackbar(CommonString.shared_decks_login_required, LENGTH_INDEFINITE) { - if (isLoggedIn()) return@showSnackbar - - // If a user is not logged in inside AnkiDroid, assume they have no AnkiWeb account - // and give them the option to sign up - setAction(CommonString.sign_up) { - binding.webView.loadUrl(getString(R.string.shared_decks_sign_up_url)) + internal fun showLoginRequiredDialog() { + if (loginRequiredDialog?.isShowing == true) return + Timber.i("HTTP 429, asking the user to log in") + loginRequiredDialog = + AlertDialog.Builder(this).show { + title(CommonString.not_logged_in_title) + message(CommonString.shared_decks_ankiweb_login_limit) + positiveButton(text = TR.sentenceCase.logIn) { redirectToLogin() } + neutralButton(CommonString.sign_up) { redirectToSignUp() } + negativeButton(CommonString.dialog_cancel) } - } } /** Loads the AnkiWeb login page in the WebView, where the user can log in. */ - internal fun redirectToLogin() { + private fun redirectToLogin() { val url = getString(R.string.shared_decks_login_url) Timber.i("HTTP 429, redirecting to login: '$url'") binding.webView.loadUrl(url) } + private fun redirectToSignUp() { + val url = getString(R.string.shared_decks_sign_up_url) + Timber.i("HTTP 429, redirecting to sign up: '$url'") + binding.webView.loadUrl(url) + } + + private fun returnToSharedDecks() { + if (isReturningAfterLogin) return + val history = binding.webView.copyBackForwardList() + val sharedPages = + history.urlsBeforeCurrent + .filter { it.startsWith(SHARED_PAGES_PREFIX) } + .toList() + val url = sharedPages.lastOrNull() ?: return + Timber.d("Logged in to AnkiWeb, returning to '$url'") + pagesBeforeLogin += sharedPages.dropLast(1) + returnTo(url) + } + + private fun returnTo(url: String) { + isReturningAfterLogin = true + binding.webView.loadUrl(url) + } + + private fun updateBackPressedCallback() { + onBackPressedCallback.isEnabled = binding.webView.canGoBack() || pagesBeforeLogin.isNotEmpty() + } + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal val webViewClient = SharedDeckWebViewClient() companion object { const val SHARED_DECKS_DOWNLOAD_FRAGMENT = "SharedDecksDownloadFragment" - const val DOWNLOAD_FILE = "DownloadFile" + const val ARG_DOWNLOAD_FILE = "DownloadFile" const val HTTP_STATUS_TOO_MANY_REQUESTS = 429 + + private const val AFTER_LOGIN_URL = "https://ankiweb.net/account/login?afterAuth=1" + private const val SHARED_PAGES_PREFIX = "https://ankiweb.net/shared/" } // Show WebView with AnkiWeb shared decks with the functionality to capture downloads and import decks. @@ -216,7 +245,7 @@ class SharedDecksActivity : AnkiActivity(R.layout.activity_shared_decks) { setTitle(CommonString.download_deck) setupEdgeToEdge() - binding.webviewToolbar.setTitleTextColor(getColor(R.color.white)) + binding.webviewToolbar.setTitleTextColor(getColor(CommonR.color.white)) setSupportActionBar(binding.webviewToolbar) supportActionBar?.setDisplayHomeAsUpEnabled(true) @@ -239,7 +268,7 @@ class SharedDecksActivity : AnkiActivity(R.layout.activity_shared_decks) { val sharedDecksDownloadFragment = SharedDecksDownloadFragment() sharedDecksDownloadFragment.arguments = Bundle().apply { - putSerializable(DOWNLOAD_FILE, DownloadFile(url, userAgent, contentDisposition, mimetype)) + putSerializable(ARG_DOWNLOAD_FILE, DownloadFile(url, userAgent, contentDisposition, mimetype)) } supportFragmentManager.commit { add( @@ -292,6 +321,7 @@ class SharedDecksActivity : AnkiActivity(R.layout.activity_shared_decks) { if (item.itemId == R.id.home) { // R.id.home refers to a custom 'home' menu item defined in your app resources (res/menu/...). shouldHistoryBeCleared = true + pagesBeforeLogin.clear() binding.webView.loadUrl(resources.getString(R.string.shared_decks_url)) } else if (item.itemId == android.R.id.home) { // android.R.id.home refers to the system-provided "up" button in the app toolbar @@ -301,6 +331,7 @@ class SharedDecksActivity : AnkiActivity(R.layout.activity_shared_decks) { } override fun onDestroy() { + loginRequiredDialog?.dismiss() SafeWebViewLayout.destroyWebView(binding.webView) super.onDestroy() } @@ -352,3 +383,6 @@ internal fun isLoggedInToAnkiWeb(): Boolean = Timber.w(e, "Could not determine login status") false } + +private val WebBackForwardList.urlsBeforeCurrent: Sequence + get() = (0 until currentIndex).asSequence().map { getItemAtIndex(it).url } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/shareddeck/SharedDecksDownloadFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/shareddeck/SharedDecksDownloadFragment.kt index 085fbbb6d228..caa7e26be636 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/shareddeck/SharedDecksDownloadFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/shareddeck/SharedDecksDownloadFragment.kt @@ -6,10 +6,12 @@ package com.ichi2.anki.shareddeck import android.app.DownloadManager import android.content.ActivityNotFoundException import android.content.BroadcastReceiver +import android.content.ContentResolver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.database.Cursor +import android.net.Uri import android.os.Bundle import android.os.Handler import android.os.Looper @@ -42,7 +44,7 @@ import com.ichi2.anki.common.time.TimeManager import com.ichi2.anki.common.utils.android.showThemedToast import com.ichi2.anki.compat.CompatHelper.Companion.getSerializableCompat import com.ichi2.anki.compat.CompatHelper.Companion.registerReceiverCompat -import com.ichi2.anki.shareddeck.SharedDecksActivity.Companion.DOWNLOAD_FILE +import com.ichi2.anki.shareddeck.SharedDecksActivity.Companion.ARG_DOWNLOAD_FILE import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.anki.utils.ext.launchCollectionInLifecycleScope import com.ichi2.anki.utils.openUrl @@ -64,13 +66,13 @@ import com.ichi2.anki.common.android.R as CommonR class SharedDecksDownloadFragment : Fragment() { private val viewModel: SharedDecksDownloadViewModel by viewModels() - private val fileToBeDownloaded by lazy { arguments?.getSerializableCompat(DOWNLOAD_FILE)!! } + private val fileToBeDownloaded by lazy { arguments?.getSerializableCompat(ARG_DOWNLOAD_FILE)!! } private var downloadId: Long = 0 private var fileName: String? = null - private var completedFile: File? = null + private var completedDeck: Uri? = null private var handler: Handler = Handler(Looper.getMainLooper()) private var isProgressCheckerRunning = false @@ -160,7 +162,7 @@ class SharedDecksDownloadFragment : Fragment() { }, onImportClick = { Timber.i("Import deck button clicked") - completedFile?.let { openDownloadedDeck(requireContext(), it) } + completedDeck?.let { openDownloadedDeck(requireContext(), it) } }, onTryAgainClick = ::retryDownload, onOpenInBrowserClick = ::openInBrowser, @@ -182,8 +184,7 @@ class SharedDecksDownloadFragment : Fragment() { /** * Handles the [DownloadPhase.LoginRequired] phase: shows the login prompt and returns to - * the shared decks WebView, opened on its login page, so the prompt is actionable even - * without a sign-up action. + * the shared decks WebView. * * Handled in this collector rather than in the broadcast receiver which records the * state: the receiver can fire while the activity is backgrounded, where @@ -193,9 +194,7 @@ class SharedDecksDownloadFragment : Fragment() { viewModel.uiState.launchCollectionInLifecycleScope { state -> if (state.phase == DownloadPhase.LoginRequired) { Timber.i("Download requires login, returning to shared decks") - val sharedDecksActivity = activity as SharedDecksActivity - sharedDecksActivity.showLoginRequiredSnackbar() - sharedDecksActivity.redirectToLogin() + (activity as SharedDecksActivity).showLoginRequiredDialog() parentFragmentManager.popBackStack() } } @@ -257,11 +256,17 @@ class SharedDecksDownloadFragment : Fragment() { } val currentFileName = fileToBeDownloaded.toFileName(extension = "apkg") - val downloadRequest = generateDeckDownloadRequest(fileToBeDownloaded, currentFileName) - - completedFile = null + completedDeck = null // Store unique download ID to be used when onReceiveBroadcast() of AnkiBroadcastReceiver gets executed. - downloadId = downloadManager.enqueue(downloadRequest) + downloadId = + try { + enqueueDownload(fileToBeDownloaded, currentFileName) + } catch (e: SecurityException) { + CrashReportService.sendExceptionReport(e, "SharedDecksDownloadFragment::downloadFile") + viewModel.onDownloadStarted(currentFileName) + onDownloadFinished(DownloadOutcome.Failed) + return + } fileName = currentFileName isDownloadInProgress = true onBackPressedCallback.isEnabled = isDownloadInProgress @@ -271,6 +276,24 @@ class SharedDecksDownloadFragment : Fragment() { startDownloadProgressChecker() } + private fun enqueueDownload( + fileToBeDownloaded: DownloadFile, + currentFileName: String, + ): Long { + val request = + generateDeckDownloadRequest(fileToBeDownloaded, currentFileName).setDestinationInExternalFilesDir( + context, + null, + "$SHARED_DECKS_DOWNLOAD_FOLDER/$currentFileName", + ) + return try { + downloadManager.enqueue(request) + } catch (_: SecurityException) { + Timber.w("DownloadManager rejected the app folder, downloading into its own storage") + downloadManager.enqueue(generateDeckDownloadRequest(fileToBeDownloaded, currentFileName)) + } + } + private fun generateDeckDownloadRequest( fileToBeDownloaded: DownloadFile, currentFileName: String, @@ -286,11 +309,6 @@ class SharedDecksDownloadFragment : Fragment() { request.setTitle(currentFileName) request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) - request.setDestinationInExternalFilesDir( - context, - null, - "$SHARED_DECKS_DOWNLOAD_FOLDER/$currentFileName", - ) return request } @@ -309,9 +327,9 @@ class SharedDecksDownloadFragment : Fragment() { Timber.i("Download might be complete now, verify and continue with import") /** - * @return The completed download's file, or null if it cannot be imported. + * @return The completed download's location, or null if it cannot be imported. */ - fun getImportableDeck(): File? { + fun getImportableDeck(): Uri? { if (fileName == null) { // Send ACRA report CrashReportService.sendExceptionReport( @@ -376,11 +394,11 @@ class SharedDecksDownloadFragment : Fragment() { onDownloadFinished(DownloadOutcome.Failed) return null } - return localUri.toUri().toFile() + return localUri.toUri() } } - val downloadedFile = + val downloadedDeck = try { getImportableDeck() } catch (exception: Exception) { @@ -389,20 +407,20 @@ class SharedDecksDownloadFragment : Fragment() { return } - if (downloadedFile == null) { + if (downloadedDeck == null) { // Could be a retryable fault (we received notification of another file) // Otherwise, onDownloadFinished should have been called // to update the UI return } - completedFile = downloadedFile + completedDeck = downloadedDeck // the progress checker can stop before it sees 100%, so complete it here viewModel.onDownloadComplete() Timber.i("Opening downloaded deck for import") - openDownloadedDeck(context, downloadedFile) + openDownloadedDeck(context, downloadedDeck) Timber.d("Download finished") onDownloadFinished(DownloadOutcome.Success) @@ -515,25 +533,30 @@ class SharedDecksDownloadFragment : Fragment() { */ private fun openDownloadedDeck( context: Context, - downloadedFile: File, + downloadedDeck: Uri, ) { - // A successful DownloadManager entry can outlive its file, e.g. after another import. - if (!downloadedFile.isFile) { - Timber.w("Downloaded shared deck no longer exists") - onDownloadFinished(DownloadOutcome.Failed) - return - } + val fileUri = + if (downloadedDeck.scheme == ContentResolver.SCHEME_FILE) { + val downloadedFile = downloadedDeck.toFile() + // A successful DownloadManager entry can outlive its file, e.g. after another import. + if (!downloadedFile.isFile) { + Timber.w("Downloaded shared deck no longer exists") + onDownloadFinished(DownloadOutcome.Failed) + return + } + FileProvider.getUriForFile( + context, + context.packageName + ".apkgfileprovider", + downloadedFile, + ) + } else { + downloadedDeck + } - val mimeType = URLConnection.guessContentTypeFromName(downloadedFile.name) + val mimeType = URLConnection.guessContentTypeFromName(fileName) val fileIntent = Intent(context, IntentHandler::class.java) fileIntent.action = Intent.ACTION_VIEW - val fileUri = - FileProvider.getUriForFile( - context, - context.packageName + ".apkgfileprovider", - downloadedFile, - ) Timber.d("File URI -> $fileUri") fileIntent.setDataAndType(fileUri, mimeType) fileIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/shareddeck/SharedDecksDownloadScreen.kt b/AnkiDroid/src/main/java/com/ichi2/anki/shareddeck/SharedDecksDownloadScreen.kt index e95bf48da145..f3e9dfba3b59 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/shareddeck/SharedDecksDownloadScreen.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/shareddeck/SharedDecksDownloadScreen.kt @@ -45,6 +45,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.drawWithContent +import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -63,6 +65,7 @@ import com.ichi2.anki.CommonString import com.ichi2.anki.R import com.ichi2.compose.theme.AnkiDroidTheme import com.ichi2.compose.theme.dimensions +import com.ichi2.compose.theme.widgetBorder import com.ichi2.compose.ui.preview.ThemePreviews private val MaxContentWidth = 600.dp @@ -137,20 +140,36 @@ private fun ProgressRing( state: SharedDecksDownloadUiState, modifier: Modifier = Modifier, ) { + val border = MaterialTheme.widgetBorder + val colors = MaterialTheme.colorScheme + val trackColor = if (border != null) colors.surface else colors.surfaceVariant + val sizeTextColor = if (border != null) colors.onSurface else colors.onSurfaceVariant + val indicatorModifier = + Modifier.size(ProgressRingSize).drawWithContent { + drawContent() + if (border != null) { + // The thin outline distinguishes the track from the thicker progress arc. + drawCircle( + brush = border.brush, + radius = (size.minDimension - ProgressRingStroke.toPx()) / 2, + style = Stroke(width = border.width.toPx()), + ) + } + } Box(modifier = modifier.fillMaxWidth(), contentAlignment = Alignment.Center) { val percent = state.percent if (percent == null) { CircularProgressIndicator( - modifier = Modifier.size(ProgressRingSize), + modifier = indicatorModifier, strokeWidth = ProgressRingStroke, - trackColor = MaterialTheme.colorScheme.surfaceVariant, + trackColor = trackColor, ) } else { CircularProgressIndicator( progress = { (percent / 100f).coerceIn(0f, 1f) }, - modifier = Modifier.size(ProgressRingSize), + modifier = indicatorModifier, strokeWidth = ProgressRingStroke, - trackColor = MaterialTheme.colorScheme.surfaceVariant, + trackColor = trackColor, ) } Column(horizontalAlignment = Alignment.CenterHorizontally) { @@ -163,7 +182,7 @@ private fun ProgressRing( Text( text = it, style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, + color = sizeTextColor, modifier = Modifier.padding(top = MaterialTheme.dimensions.space50), ) } @@ -329,12 +348,29 @@ private fun TonalCard( modifier: Modifier = Modifier, content: @Composable ColumnScope.() -> Unit, ) { - Card( - colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceVariant), - elevation = CardDefaults.cardElevation(defaultElevation = 0.dp), - modifier = modifier, - content = content, - ) + val border = MaterialTheme.widgetBorder + val colors = MaterialTheme.colorScheme + // Outlined e-ink cards use white surfaces and black content without changing the app palette. + val cardColors = + if (border != null) { + colors.copy( + surfaceVariant = colors.surface, + onSurfaceVariant = colors.onSurface, + tertiary = colors.onSurface, + onTertiary = colors.surface, + ) + } else { + colors + } + MaterialTheme(colorScheme = cardColors) { + Card( + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceVariant), + elevation = CardDefaults.cardElevation(defaultElevation = 0.dp), + border = border, + modifier = modifier, + content = content, + ) + } } /** Warning shown while the download waits for a network connection. */ diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/startup/SetupStorage.kt b/AnkiDroid/src/main/java/com/ichi2/anki/startup/SetupStorage.kt index efc8bd50a647..9526acf561b5 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/startup/SetupStorage.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/startup/SetupStorage.kt @@ -29,12 +29,11 @@ import java.io.File * in [CollectionHelper.systemStorageFailure] so reads report it rather than * [StorageNotConfiguredException] */ -fun ensureCollectionPathSet(context: Context) { +fun maybeSetDefaultCollectionPath(context: Context) { val preferences = context.sharedPrefs() if (preferences.contains(CollectionHelper.PREF_COLLECTION_PATH)) return val folder = selectStoragePermissions(context).folderToPersist(context) if (folder == null) { - // unreachable until 13574 is fixed. Timber.i("deferring the storage decision to the user") return } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/startup/StoragePolicy.kt b/AnkiDroid/src/main/java/com/ichi2/anki/startup/StoragePolicy.kt index c7146be65925..cefe625a9c5c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/startup/StoragePolicy.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/startup/StoragePolicy.kt @@ -10,7 +10,7 @@ import com.ichi2.anki.common.storage.StorageDecision * Who chooses the [AnkiDroidFolder] on a fresh install. * * Declared per [StoragePermissionSet] ([StoragePermissionSet.storagePolicy]) and applied by - * [ensureCollectionPathSet]. + * [maybeSetDefaultCollectionPath]. */ sealed interface StoragePolicy { /** Only one folder is possible, so it is persisted on startup. */ diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/study/DeckStudyState.kt b/AnkiDroid/src/main/java/com/ichi2/anki/study/DeckStudyState.kt new file mode 100644 index 000000000000..ae27cedbc06d --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/study/DeckStudyState.kt @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.study + +import anki.scheduler.CongratsInfoResponse +import com.ichi2.anki.common.time.SECONDS_PER_DAY +import com.ichi2.anki.libanki.Collection +import com.ichi2.anki.libanki.DeckId +import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds + +/** + * Collection facts about the selected deck, independent of the screen displaying them. + * + * Contents and availability are separate: cards can be buried, limited, scheduled for later, + * or temporarily borrowed by a filtered deck. Completion details retain those distinctions. + */ +data class DeckStudyState( + val deckId: DeckId, + val kind: DeckKind, + /** Includes subdecks and cards temporarily borrowed by filtered decks. */ + val cardCount: Int, + val newCardsAvailable: Int, + val learningCardsAvailable: Int, + val reviewCardsAvailable: Int, + val congratulations: CongratsInfoResponse, +) { + val availability: StudyAvailability + get() = + if (newCardsAvailable + learningCardsAvailable + reviewCardsAvailable > 0) { + StudyAvailability.CardsAvailable + } else { + StudyAvailability.NoCardsAvailable + } + + val isEmptyRegularDeck: Boolean get() = kind == DeckKind.Regular && cardCount == 0 + + /** Time until learning becomes available, accounting for the learn-ahead limit. */ + val nextLearningIn: Duration? + get() = congratulations.secsUntilNextLearn.takeIf { it < SECONDS_PER_DAY }?.seconds +} + +enum class DeckKind { + Regular, + Filtered, +} + +enum class StudyAvailability { + CardsAvailable, + NoCardsAvailable, +} + +/** Read under the collection lock so identity, contents and scheduling refer to the same deck. */ +fun Collection.currentDeckStudyState(): DeckStudyState { + val deck = decks.current() + val counts = sched.counts() + return DeckStudyState( + deckId = deck.id, + kind = if (deck.isFiltered) DeckKind.Filtered else DeckKind.Regular, + cardCount = decks.cardCount(deck.id, includeSubdecks = true), + newCardsAvailable = counts.new, + learningCardsAvailable = counts.lrn, + reviewCardsAvailable = counts.rev, + congratulations = sched.congratulationsInfo(), + ) +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/study/StudyCompletionUi.kt b/AnkiDroid/src/main/java/com/ichi2/anki/study/StudyCompletionUi.kt new file mode 100644 index 000000000000..1dc4c5fdd303 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/study/StudyCompletionUi.kt @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.study + +import android.content.Context +import androidx.fragment.app.FragmentActivity +import com.ichi2.anki.CollectionManager.TR +import com.ichi2.anki.CollectionManager.withCol +import com.ichi2.anki.CommonString +import com.ichi2.anki.common.preferences.sharedPrefs +import com.ichi2.anki.common.time.TIME_HOUR +import com.ichi2.anki.common.time.TIME_MINUTE +import com.ichi2.anki.common.utils.android.showThemedToast +import com.ichi2.anki.launchCatchingTask +import com.ichi2.anki.pages.CongratsPage +import com.ichi2.anki.snackbar.showSnackbar +import kotlin.math.round + +/** Presents the end of a review session in the activity that owns its result. */ +object StudyCompletionUi { + fun openCongratsPage(activity: FragmentActivity) { + activity.startActivity(CongratsPage.getIntent(activity)) + } + + fun displayFromShortcut(activity: FragmentActivity) { + if (displayNewCongratsScreen(activity)) { + openCongratsPage(activity) + } else { + activity.launchCatchingTask { + val state = withCol { currentDeckStudyState() } + showThemedToast(activity, finishedMessage(activity, state), false) + } + } + } + + fun onReviewsCompleted( + activity: FragmentActivity, + state: DeckStudyState, + ) { + if (displayNewCongratsScreen(activity)) { + openCongratsPage(activity) + return + } + when (state.availability) { + StudyAvailability.NoCardsAvailable -> activity.showSnackbar(finishedMessage(activity, state)) + StudyAvailability.CardsAvailable -> activity.showSnackbar(CommonString.studyoptions_no_cards_due) + } + } + + private fun displayNewCongratsScreen(context: Context) = context.sharedPrefs().getBoolean("new_congrats_screen", false) + + private fun finishedMessage( + context: Context, + state: DeckStudyState, + ): String { + val seconds = state.nextLearningIn?.inWholeSeconds ?: return context.getString(CommonString.studyoptions_congrats_finished) + val (unit, amount) = + if (seconds < TIME_MINUTE) { + "seconds" to seconds.toDouble() + } else if (seconds < TIME_HOUR) { + "minutes" to seconds / TIME_MINUTE + } else { + "hours" to seconds / TIME_HOUR + } + val nextLearnDue = TR.schedulingNextLearnDue(unit, round(amount).toInt()) + return context.getString(CommonString.studyoptions_congrats_next_due_in, nextLearnDue) + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/tags/ManageTagsViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/tags/ManageTagsViewModel.kt index 31d528a4b9a4..79a513faf39c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/tags/ManageTagsViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/tags/ManageTagsViewModel.kt @@ -10,6 +10,7 @@ import com.ichi2.anki.libanki.Tags import com.ichi2.anki.observability.undoableOp import com.ichi2.anki.tags.ManageTagsState.Error import com.ichi2.anki.tags.UserMessage.ClearedUnusedTags +import com.ichi2.anki.tags.UserMessage.TagMoved import com.ichi2.anki.tags.UserMessage.TagRemoved import com.ichi2.anki.tags.UserMessage.TagRenamed import com.ichi2.anki.utils.MessageQueue @@ -83,6 +84,9 @@ class ManageTagsViewModel : ViewModel() { /** Acknowledges that the UI has finished displaying a message. */ fun messageShown(id: MessageId) = messageQueue.acknowledge(id) + /** Checks the complete tag tree, including tags hidden by search or collapsed ancestors. */ + fun tagExists(tag: TagName): Boolean = tagList.any { it.fullTag == tag } + /** Returns the visible node for [tag], or null with a warning if not found or not loaded */ private fun findVisibleNode(tag: TagName): TagListItemState? { val loaded = state.value as? ManageTagsState.Content @@ -113,7 +117,7 @@ class ManageTagsViewModel : ViewModel() { return@launchTagOperation } val newCollapsed = !node.collapsed - withCol { tags.setCollapsed(tag, newCollapsed) } + withCol { tags.setCollapsed(node.fullTag, newCollapsed) } // Update the in-memory list with the new collapsed state tagList = tagList.map { @@ -133,14 +137,14 @@ class ManageTagsViewModel : ViewModel() { } /** - * Renames [oldName] to [newName], updating all notes and child tags. + * Renames [oldName] to [newName] on notes, including matching child tags. * @see Tags.rename */ fun renameTag( oldName: TagName, newName: TagName, ) = launchTagOpAndRefresh { - val result = undoableOp { tags.rename(oldName, newName) } + val result = undoableOp { renameTagTree(oldName, newName) } messageQueue.enqueue(TagRenamed(result.count)) } @@ -155,12 +159,27 @@ class ManageTagsViewModel : ViewModel() { messageQueue.enqueue(ClearedUnusedTags(result.count)) } + /** + * Reparents [tag] and its descendants on notes under [newParent]. An empty [newParent] moves + * [tag] to the top level. + * @see moveTagTree + */ + fun moveTag( + tag: TagName, + newParent: TagName?, + ) = launchTagOpAndRefresh { + Timber.i("Moving tag") + val result = undoableOp { moveTagTree(tag, newParent) } + messageQueue.enqueue(TagMoved(result.count)) + } + private suspend fun loadTags() { Timber.i("Loading tags from collection") tagList = flattenTree(withCol { tags.tree() }) state.value = ManageTagsState.Content( visibleNodes = computeVisibleNodes(searchQuery.value), + totalTagCount = tagList.size, ) } @@ -349,12 +368,16 @@ data class TagListItemState( sealed class ManageTagsState { data object Loading : ManageTagsState() + /** + * @param totalTagCount every tag in the collection, unaffected by search/collapse + */ data class Content( val visibleNodes: List, /** `true` while a tag operation runs, allowing the UI to show progress without hiding the list. */ val isWorking: Boolean = false, /** Most recent operation failure, cleared when the next operation starts. */ val error: Throwable? = null, + val totalTagCount: Int = 0, ) : ManageTagsState() data class Error( @@ -373,6 +396,11 @@ sealed interface UserMessage { val notesAffected: Int, ) : UserMessage + /** @param notesAffected number of notes whose tags were reparented */ + data class TagMoved( + val notesAffected: Int, + ) : UserMessage + /** @param count number of unused tags removed from the collection */ data class ClearedUnusedTags( val count: Int, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/tags/TagName.kt b/AnkiDroid/src/main/java/com/ichi2/anki/tags/TagName.kt index b4962bb3674f..49c72c78bc03 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/tags/TagName.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/tags/TagName.kt @@ -2,20 +2,31 @@ package com.ichi2.anki.tags +import android.icu.lang.UCharacter import anki.collection.OpChanges import anki.collection.OpChangesWithCount import com.ichi2.anki.libanki.Tags +import com.ichi2.anki.libanki.utils.RustCompat import timber.log.Timber +import java.text.Normalizer /** * A tag name, e.g. "science::biology". * + * Equality, hashing and hierarchy checks mirror backend tag identity, including normalization + * and the case-folding bug in Anki's pinned unicase version. [value] retains the name's spelling + * for display and case-only renames; compare it explicitly when checking whether the spelling changed. + * * Tag names should not be logged using `Timber.i` or above to avoid leaking PII to crash reports. */ -@JvmInline -value class TagName private constructor( +class TagName private constructor( val value: String, ) { + private val identity = foldCase(normalize(value)) + + /** Includes [root] itself; `a::b` is a descendant of `a`, but `ab` is not. */ + fun isSameOrDescendantOf(root: TagName): Boolean = identity == root.identity || identity.startsWith("${root.identity}::") + /** Ancestor tags, e.g. `TagName.build("a::b::c").ancestors` returns `["a", "a::b"]` */ val ancestors: List get() { @@ -32,6 +43,10 @@ value class TagName private constructor( } } + override fun equals(other: Any?): Boolean = other is TagName && identity == other.identity + + override fun hashCode(): Int = identity.hashCode() + override fun toString(): String = value companion object { @@ -41,6 +56,44 @@ value class TagName private constructor( // But "_" is converted to " " in some visual displays return TagName(tagName.replace(" ", "_")) } + + /** + * Match the backend's three-character case-folding bug in unicase 2.6.0. + * + * Anki pins this version because collation changes can invalidate SQLite indexes. + * The bug is fixed in unicase 2.10.0 by + * [afc3c16219c9](https://github.com/seanmonstar/unicase/commit/afc3c16219c9720839f2f4c16a3ede52274df7d7). + * Remove the rotation when the backend adopts that fix. + */ + private fun foldCase(spelling: String): String = + buildString { + var offset = 0 + while (offset < spelling.length) { + val codePoint = spelling.codePointAt(offset) + val folded = UCharacter.foldCase(String(Character.toChars(codePoint)), true) + // Reproduce unicase 2.6.0's bug per input character: "ffi" folds to "iff", + // while the three literal characters in "ffi" keep their order. + if (folded.codePointCount(0, folded.length) == 3) { + val last = folded.offsetByCodePoints(0, 2) + append(folded, last, folded.length) + append(folded, 0, last) + } else { + append(folded) + } + offset += Character.charCount(codePoint) + } + } + + // Mirror tags/register.rs for identity only. Preserve the supplied spelling + // and leave mutation validation (e.g. forbidden separators) to the backend. + private fun normalize(spelling: String): String = + spelling.split("::").joinToString("::") { component -> + Normalizer + .normalize(component, Normalizer.Form.NFC) + .filterNot { it <= '\u001f' || it == '\u007f' || it == '\u3000' } + .trim(RustCompat::isWhitespace) + .ifEmpty { "blank" } + } } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/tags/TagTreeOperations.kt b/AnkiDroid/src/main/java/com/ichi2/anki/tags/TagTreeOperations.kt new file mode 100644 index 000000000000..51158409f324 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/tags/TagTreeOperations.kt @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.tags + +import anki.collection.OpChangesWithCount +import anki.collection.copy +import anki.collection.opChangesWithCount +import com.ichi2.anki.libanki.Collection + +/** + * Renames tags on notes, repairing duplicates when subtrees merge. + * + * Works around [Anki issue 5857](https://github.com/ankitects/anki/issues/5857). + * + * Follows Anki's backend behavior: an entirely unused subtree is left unchanged. When + * renaming a subtree used by notes, unused cached descendants are removed, not renamed. + * See https://github.com/ankitects/anki/blob/main/rslib/src/tags/rename.rs. + */ +internal fun Collection.renameTagTree( + oldName: TagName, + newName: TagName, +): OpChangesWithCount { + val affectedNotes = findNotes(oldName.literalSubtreeSearch()) + val result = tags.rename(oldName, newName) + if (result.count == 0) return result + + // Renaming into an existing tag can leave duplicate tags on a note. Use the backend's + // tag identity to deduplicate: its pinned unicase 2.6.0 has a folding bug that equates + // "ffi" with "iff", but keeps "ffi" distinct. Standard Unicode folding disagrees, so + // client-side cleanup can remove valid tags or miss duplicates. + // The rename already marked these notes modified; no card generation is needed. + val undoStep = undoStatus().lastStep + afterNoteUpdates(affectedNotes, markModified = false, generateCards = false) + return result.copy { changes = mergeUndoEntries(undoStep) } +} + +/** Move tags on notes, merging overlapping subtrees with the same semantics as [renameTagTree]. */ +internal fun Collection.moveTagTree( + tag: TagName, + newParent: TagName?, +): OpChangesWithCount { + require(newParent == null || !newParent.isSameOrDescendantOf(tag)) { "A tag cannot be moved under itself" } + val leaf = tag.value.substringAfterLast("::") + val destination = TagName.build(newParent?.let { "${it.value}::$leaf" } ?: leaf)!! + if (destination == tag) return opChangesWithCount { } + // Moving one subtree is a prefix rename. The backend reparent operation also rejects + // valid sibling prefixes (e.g. parent::a beneath parent::ab). + return renameTagTree(tag, destination) +} + +/** A literal regex avoids tag-search wildcards and reserved names such as "none". */ +private fun TagName.literalSubtreeSearch(): String { + val escaped = + buildString { + for (char in value) { + if (char in "\\.^$|?*+()[]{}") append('\\') + append(char) + } + }.replace("\"", "\\\"") + return "\"tag:re:^$escaped(?:::|$)\"" +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/RecyclerFastScroller.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/RecyclerFastScroller.kt index 6837ad870d09..d13a45d5b31f 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/RecyclerFastScroller.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/RecyclerFastScroller.kt @@ -62,9 +62,9 @@ import androidx.interpolator.view.animation.LinearOutSlowInInterpolator import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.color.MaterialColors +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.utils.ext.wholeAndFraction import com.ichi2.anki.utils.postDelayed -import com.ichi2.utils.dp import com.ichi2.utils.isRtl import timber.log.Timber import kotlin.time.Duration @@ -396,11 +396,12 @@ class RecyclerFastScroller true } MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { - handle.isSelected = false + handle.isPressed = false if (recyclerView != null) { recyclerView?.let { removeCallbacks(scrollTask) } scrollTask.run() } + postAutoHide() false } else -> super.onTouchEvent(event) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/ResizablePaneLayout.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/ResizablePaneLayout.kt new file mode 100644 index 000000000000..6793ea3c293a --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/ResizablePaneLayout.kt @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.ui + +import android.content.Context +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.View +import android.view.ViewConfiguration +import android.widget.LinearLayout +import androidx.core.view.children +import androidx.core.view.isVisible +import kotlin.math.abs + +class ResizablePaneLayout + @JvmOverloads + constructor( + context: Context, + attrs: AttributeSet? = null, + ) : LinearLayout(context, attrs) { + private val grabDistance = 24 * resources.displayMetrics.density + private val touchSlop = ViewConfiguration.get(context).scaledTouchSlop + private var downX = 0f + private var downY = 0f + private var nearDivider = false + private var dragging = false + + private val divider: View? + get() = children.firstOrNull { it is ResizingDivider && it.isVisible } + + override fun onInterceptTouchEvent(ev: MotionEvent): Boolean = startsDrag(ev) + + override fun onTouchEvent(event: MotionEvent): Boolean { + if (dragging) { + divider?.dispatchTouchEvent(event) + if (event.actionMasked == MotionEvent.ACTION_UP || event.actionMasked == MotionEvent.ACTION_CANCEL) { + dragging = false + } + return true + } + return startsDrag(event) || nearDivider || super.onTouchEvent(event) + } + + private fun startsDrag(event: MotionEvent): Boolean { + val divider = divider ?: return false + when (event.actionMasked) { + MotionEvent.ACTION_DOWN -> { + downX = event.x + downY = event.y + nearDivider = abs(event.x - (divider.left + divider.right) / 2f) <= grabDistance + if (nearDivider) parent?.requestDisallowInterceptTouchEvent(true) + } + MotionEvent.ACTION_MOVE -> { + val dx = abs(event.x - downX) + if (nearDivider && dx > touchSlop && dx > abs(event.y - downY)) { + nearDivider = false + dragging = true + val down = MotionEvent.obtain(event).apply { action = MotionEvent.ACTION_DOWN } + divider.dispatchTouchEvent(down) + down.recycle() + return true + } + } + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> nearDivider = false + } + return false + } + } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/ResizablePaneManager.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/ResizablePaneManager.kt index cabe100ae948..5d20e9d4bcc3 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/ResizablePaneManager.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/ResizablePaneManager.kt @@ -9,7 +9,9 @@ import android.view.PointerIcon import android.view.View import android.widget.LinearLayout import androidx.core.content.edit +import androidx.core.view.doOnPreDraw import com.ichi2.anki.R +import com.ichi2.anki.common.utils.dp import timber.log.Timber /** @@ -24,7 +26,6 @@ class ResizablePaneManager( private val sharedPrefs: SharedPreferences, private val startPaneWeightKey: String, private val endPaneWeightKey: String, - private val minWeight: Float = 0.5f, // Minimum weight for each pane private val dragColor: Int = divider.context.getColor(R.color.drag_divider_color), private val idleColor: Int = divider.context.getColor(R.color.idle_divider_color), private val onResizingChanged: (Boolean) -> Unit = {}, @@ -36,6 +37,10 @@ class ResizablePaneManager( private fun setupResizableDivider() { // Load saved weights if available loadSavedWeights() + parentLayout.doOnPreDraw { clampWeights() } + parentLayout.addOnLayoutChangeListener { _, left, _, right, _, oldLeft, _, oldRight, _ -> + if (right - left != oldRight - oldLeft) parentLayout.doOnPreDraw { clampWeights() } + } var initialTouchX = 0f var initialStartWeight = 0f @@ -97,6 +102,7 @@ class ResizablePaneManager( // Clamp the new weight for the start pane // Ensures it's not too small and not too large (leaving space for the other pane's minWeight) + val minWeight = minWeight(sumOfInitialWeights) newStartWeight = newStartWeight.coerceIn(minWeight, sumOfInitialWeights - minWeight) val newEndWeight = sumOfInitialWeights - newStartWeight @@ -151,6 +157,33 @@ class ResizablePaneManager( Timber.w(e, "Failed to load saved pane weights") } } + + /** The weight that keeps a pane [MIN_PANE_WIDTH] wide, or half of [totalWeight] if two of those don't fit */ + private fun minWeight(totalWeight: Float): Float { + val paneSpace = parentLayout.width - divider.width + if (paneSpace <= 0) return 0f + val minPaneWidth = MIN_PANE_WIDTH.toPx(parentLayout.context) * parentLayout.resources.configuration.fontScale + return (totalWeight * minPaneWidth / paneSpace).coerceAtMost(totalWeight / 2) + } + + /** Moves the divider back within the limits when a saved split or a narrower screen leaves a pane too small */ + private fun clampWeights() { + val startParams = startPane.layoutParams as LinearLayout.LayoutParams + val endParams = endPane.layoutParams as LinearLayout.LayoutParams + val totalWeight = startParams.weight + endParams.weight + val minWeight = minWeight(totalWeight) + val clampedStartWeight = startParams.weight.coerceIn(minWeight, totalWeight - minWeight) + if (clampedStartWeight == startParams.weight) return + startParams.weight = clampedStartWeight + endParams.weight = totalWeight - clampedStartWeight + startPane.layoutParams = startParams + endPane.layoutParams = endParams + } + + companion object { + /** Narrowest a pane can be, times the font scale: the panes hold text, which needs more room at a larger font size */ + private val MIN_PANE_WIDTH = 240.dp + } } private fun Float.invertIfRtl(view: View): Float = if (view.layoutDirection == View.LAYOUT_DIRECTION_RTL) -this else this diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/animations/ViewAnimations.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/animations/ViewAnimations.kt index 55108002276b..0414c48f8be2 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/animations/ViewAnimations.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/animations/ViewAnimations.kt @@ -4,7 +4,7 @@ package com.ichi2.anki.ui.animations import android.view.View import android.view.ViewPropertyAnimator -import com.ichi2.utils.dp +import com.ichi2.anki.common.utils.dp fun View.fadeIn( duration: Int, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/managespace/ManageSpaceFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/managespace/ManageSpaceFragment.kt index f9eeaebcb09c..9e3e8cca2648 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/managespace/ManageSpaceFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/managespace/ManageSpaceFragment.kt @@ -12,7 +12,6 @@ import androidx.annotation.StringRes import androidx.core.content.ContextCompat.getSystemService import androidx.fragment.app.viewModels import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewModelScope import androidx.preference.Preference import com.ichi2.anki.BackupManager @@ -32,6 +31,7 @@ import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.anki.ui.dialogs.tools.AsyncDialogBuilder.CheckedItems import com.ichi2.anki.ui.dialogs.tools.DialogResult import com.ichi2.anki.ui.dialogs.tools.awaitDialog +import com.ichi2.anki.utils.ext.launchCollectionInViewLifecycleScope import com.ichi2.anki.utils.getUserFriendlyErrorText import com.ichi2.preferences.TextWidgetPreference import kotlinx.coroutines.CoroutineScope @@ -233,15 +233,6 @@ class ManageSpaceFragment : SettingsFragment() { adjustDeleteEverythingStringsDependingOnCollectionLocation(deleteEverythingPreference) - listOf( - viewModel.flowOfDeleteUnusedMediaSize to deleteUnusedMediaPreference, - viewModel.flowOfDeleteCollectionSize to deleteCollectionPreference, - viewModel.flowOfDeleteEverythingSize to deleteEverythingPreference, - viewModel.flowOfDeleteBackupsSize to deleteBackupsPreference, - ).forEach { (flowOfSize, preference) -> - lifecycleScope.launch { flowOfSize.collect { size -> preference.setWidgetTextBy(size) } } - } - observeProgress(viewModel) { progress -> getString(progress.messageRes) } } @@ -253,6 +244,16 @@ class ManageSpaceFragment : SettingsFragment() { binding.toolbar.apply { title = getString(CommonString.pref__manage_space__screen_title) } + + listOf( + viewModel.flowOfDeleteUnusedMediaSize to R.string.pref_delete_media_key, + viewModel.flowOfDeleteCollectionSize to R.string.pref_delete_collection_key, + viewModel.flowOfDeleteEverythingSize to R.string.pref_delete_everything_key, + viewModel.flowOfDeleteBackupsSize to R.string.pref_delete_backups_key, + ).forEach { (flowOfSize, key) -> + val preference = requirePreference(key) + flowOfSize.launchCollectionInViewLifecycleScope { size -> preference.setWidgetTextBy(size) } + } } /************************************ Delete unused media *************************************/ diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/LegacyNotificationsPermissionFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/LegacyNotificationsPermissionFragment.kt index b036fa9f1a4c..4cd2d9c86e4c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/LegacyNotificationsPermissionFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/LegacyNotificationsPermissionFragment.kt @@ -35,7 +35,7 @@ class LegacyNotificationsPermissionFragment : PermissionsFragment(R.layout.fragm // onResume is called after returning from the OS settings if (canPostNotifications(requireContext())) { // Post a fragment result to indicate that the bottom sheet can be dismissed - setFragmentResult(PermissionsBottomSheet.RESULT_DISMISS, Bundle()) + setFragmentResult(PermissionsBottomSheet.REQUEST_DISMISS_PERMISSIONS_SHEET, Bundle()) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/NotificationsPermissionFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/NotificationsPermissionFragment.kt index b92018e72a56..de783617e6de 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/NotificationsPermissionFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/NotificationsPermissionFragment.kt @@ -45,7 +45,7 @@ class NotificationsPermissionFragment : PermissionsFragment(R.layout.fragment_no // onResume is called after returning from both the OS settings and the OS permission request dialog if (canPostNotifications(requireContext())) { // Post a fragment result to indicate that the bottom sheet can be dismissed - setFragmentResult(PermissionsBottomSheet.RESULT_DISMISS, Bundle()) + setFragmentResult(PermissionsBottomSheet.REQUEST_DISMISS_PERMISSIONS_SHEET, Bundle()) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsActivity.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsActivity.kt index af0be0f60549..bfe0ca4a58cd 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsActivity.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsActivity.kt @@ -17,8 +17,8 @@ import com.ichi2.anki.StoragePermissionSet import com.ichi2.anki.common.utils.android.showThemedToast import com.ichi2.anki.common.utils.ext.getParcelableExtraCompat import com.ichi2.anki.databinding.ActivityPermissionsBinding -import com.ichi2.anki.ui.windows.permissions.PermissionsFragment.Companion.HAS_ALL_PERMISSIONS_KEY -import com.ichi2.anki.ui.windows.permissions.PermissionsFragment.Companion.PERMISSIONS_FRAGMENT_RESULT_KEY +import com.ichi2.anki.ui.windows.permissions.PermissionsFragment.Companion.REQUEST_PERMISSIONS +import com.ichi2.anki.ui.windows.permissions.PermissionsFragment.Companion.RESULT_HAS_ALL_PERMISSIONS import com.ichi2.anki.utils.ext.setFragmentResultListener import dev.androidbroadcast.vbpd.viewBinding import timber.log.Timber @@ -37,7 +37,7 @@ import timber.log.Timber * To request optional permissions from the user, prefer [PermissionsBottomSheet]. */ class PermissionsActivity : AnkiActivity(R.layout.activity_permissions) { - private val binding by viewBinding(ActivityPermissionsBinding::bind) + internal val binding by viewBinding(ActivityPermissionsBinding::bind) override fun onCreate(savedInstanceState: Bundle?) { if (showedActivityFailedScreen(savedInstanceState)) { @@ -58,21 +58,29 @@ class PermissionsActivity : AnkiActivity(R.layout.activity_permissions) { finish() return } - val permissionsFragment = permissionSet.permissionsFragment.getDeclaredConstructor().newInstance() - setFragmentResultListener(PERMISSIONS_FRAGMENT_RESULT_KEY) { _, bundle -> - val hasAllPermissions = bundle.getBoolean(HAS_ALL_PERMISSIONS_KEY) + configurePermissions(permissionSet) + // only close the activity by tapping the continue button + onBackPressedDispatcher.addCallback {} + } + + private fun configurePermissions(permissionSet: StoragePermissionSet) { + setFragmentResultListener(REQUEST_PERMISSIONS) { _, bundle -> + val hasAllPermissions = bundle.getBoolean(RESULT_HAS_ALL_PERMISSIONS) setContinueButtonEnabled(hasAllPermissions) } - setFragmentResultListener(RESULT_COMPLETE) { _, _ -> decideStorageAndFinish() } + setFragmentResultListener(REQUEST_PERMISSIONS_GRANTED) { _, _ -> decideStorageAndFinish() } + showPermissionsFragment(permissionSet) + } + + private fun showPermissionsFragment(permissionSet: StoragePermissionSet) { + val permissionsFragment = permissionSet.permissionsFragment.getDeclaredConstructor().newInstance() supportFragmentManager.commit { replace(R.id.fragment_container, permissionsFragment) } - // only close the activity by tapping the continue button - onBackPressedDispatcher.addCallback {} } - fun setContinueButtonEnabled(isEnabled: Boolean) { + private fun setContinueButtonEnabled(isEnabled: Boolean) { binding.continueButton.isEnabled = isEnabled } @@ -80,7 +88,7 @@ class PermissionsActivity : AnkiActivity(R.layout.activity_permissions) { * Records the storage decision and closes the screen: the granted permissions * determine the default collection path. * - * Called on 'Continue', or when the fragment reports [RESULT_COMPLETE]. + * Called on 'Continue', or when the fragment reports [REQUEST_PERMISSIONS_GRANTED]. * Preserves an existing collection path. * * @see InitialActivity.decideStorageIfUndecided @@ -99,7 +107,7 @@ class PermissionsActivity : AnkiActivity(R.layout.activity_permissions) { * Signals the activity to persist the * [storage decision][com.ichi2.anki.common.storage.StorageDecision], and then close. */ - const val RESULT_COMPLETE = "result_complete" + const val REQUEST_PERMISSIONS_GRANTED = "result_complete" fun getIntent( context: Context, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsBottomSheet.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsBottomSheet.kt index cdeb5a437f67..0c281fd7e468 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsBottomSheet.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsBottomSheet.kt @@ -47,7 +47,7 @@ class PermissionsBottomSheet : BottomSheetDialogFragment() { } binding.closeButton.setOnClickListener { dismiss() } - childFragmentManager.setFragmentResultListener(RESULT_DISMISS, this) { _, _ -> + childFragmentManager.setFragmentResultListener(REQUEST_DISMISS_PERMISSIONS_SHEET, this) { _, _ -> dismiss() } @@ -75,7 +75,7 @@ class PermissionsBottomSheet : BottomSheetDialogFragment() { * Fragment result request key for dismissing this BottomSheet. * Public so that child fragments can set it. */ - const val RESULT_DISMISS = "result_dismiss" + const val REQUEST_DISMISS_PERMISSIONS_SHEET = "result_dismiss" /** * Starts this BottomSheet with the provided [OptionalPermissionSet]. diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsFragment.kt index bb3cade2921f..899b59d38a33 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsFragment.kt @@ -61,8 +61,8 @@ abstract class PermissionsFragment( super.onResume() permissionsItems.forEach { it.updateSwitchCheckedStatus() } setFragmentResult( - PERMISSIONS_FRAGMENT_RESULT_KEY, - Bundle().apply { putBoolean(HAS_ALL_PERMISSIONS_KEY, hasAllPermissions()) }, + REQUEST_PERMISSIONS, + Bundle().apply { putBoolean(RESULT_HAS_ALL_PERMISSIONS, hasAllPermissions()) }, ) } @@ -135,7 +135,7 @@ abstract class PermissionsFragment( } companion object { - const val PERMISSIONS_FRAGMENT_RESULT_KEY = "PERMISSION_FRAGMENT_RESULT" - const val HAS_ALL_PERMISSIONS_KEY = "HAS_ALL_PERMISSIONS" + const val REQUEST_PERMISSIONS = "PERMISSION_FRAGMENT_RESULT" + const val RESULT_HAS_ALL_PERMISSIONS = "HAS_ALL_PERMISSIONS" } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsStartingAt30Fragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsStartingAt30Fragment.kt index 53b1c927c064..8b8700b373f3 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsStartingAt30Fragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/permissions/PermissionsStartingAt30Fragment.kt @@ -31,7 +31,7 @@ class PermissionsStartingAt30Fragment : PermissionsFragment(R.layout.fragment_pe ) { if (hasAllPermissions()) { // the activity records the storage decision and finishes - setFragmentResult(PermissionsActivity.RESULT_COMPLETE, Bundle()) + setFragmentResult(PermissionsActivity.REQUEST_PERMISSIONS_GRANTED, Bundle()) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/AnswerFeedbackView.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/AnswerFeedbackView.kt index f1c2ff0b0267..8001e6120e0e 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/AnswerFeedbackView.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/AnswerFeedbackView.kt @@ -79,6 +79,8 @@ class AnswerFeedbackView : AppCompatImageView { override fun onAnimationRepeat(animation: Animation) {} }, ) + // The animation may be delayed if the row is not expanded before the first frame. + visibility = VISIBLE startAnimation(fadeIn) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/AnswerTimerView.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/AnswerTimerView.kt index fcdcafd94021..c3448d054162 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/AnswerTimerView.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/AnswerTimerView.kt @@ -8,7 +8,7 @@ import android.util.AttributeSet import android.widget.Chronometer import androidx.appcompat.widget.ThemeUtils import androidx.core.view.isVisible -import com.ichi2.anki.R +import com.ichi2.anki.common.android.R as CommonR class AnswerTimerView( context: Context, @@ -81,7 +81,7 @@ class AnswerTimerView( } private fun updateTextColor(isOverLimit: Boolean) { - val colorAttr = if (isOverLimit) R.attr.maxTimerColor else android.R.attr.textColor + val colorAttr = if (isOverLimit) CommonR.attr.maxTimerColor else android.R.attr.textColor setTextColor(ThemeUtils.getThemeAttrColor(context, colorAttr)) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerFragment.kt index 690fd7f110a5..76712b6c4823 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerFragment.kt @@ -47,6 +47,7 @@ import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.common.destinations.DeckOptionsDestination import com.ichi2.anki.common.destinations.navigate import com.ichi2.anki.common.utils.android.isRobolectric +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.databinding.FragmentReviewerBinding import com.ichi2.anki.dialogs.showDeckOptionsSelectionDialog import com.ichi2.anki.dialogs.tags.TagsDialogFactory @@ -83,7 +84,6 @@ import com.ichi2.anki.workarounds.SafeWebViewLayout import com.ichi2.themes.Themes import com.ichi2.ui.TypeAnswerEditText import com.ichi2.utils.ViewGroupUtils.setRenderWorkaround -import com.ichi2.utils.dp import com.ichi2.utils.show import com.squareup.seismic.ShakeDetector import dev.androidbroadcast.vbpd.viewBinding @@ -133,7 +133,7 @@ class ReviewerFragment : override fun onLoadInitialHtml(): String = stdHtml( context = requireContext(), - extraJsAssets = listOf("scripts/ankidroid-reviewer.js"), + extraJsAssets = listOf("scripts/ankidroid-reviewer.js", "scripts/type-answer.js"), nightMode = Themes.isNightTheme, ) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerViewModel.kt index 3329fd0eda9f..49f2295a632c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerViewModel.kt @@ -15,6 +15,7 @@ import com.ichi2.anki.Flag import com.ichi2.anki.Reviewer import com.ichi2.anki.asyncIO import com.ichi2.anki.cardviewer.SingleCardSide +import com.ichi2.anki.cardviewer.appendNoSuggestAttributes import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.common.destinations.BrowserDestination import com.ichi2.anki.common.destinations.CardInfoDestination @@ -631,12 +632,18 @@ class ReviewerViewModel( text: String, typeAnswer: TypeAnswer, ): String { + val keyboardAttributes = + buildString { + if (typeAnswer.noSuggest) appendNoSuggestAttributes() + } + @Suppress("XmlDeprecatedElement") // upstream uses `
    ` @Language("HTML") val repl = """
    """.trimIndent() diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/StudyScreenRepository.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/StudyScreenRepository.kt index 89bfe645627b..d7be2134994b 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/StudyScreenRepository.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/StudyScreenRepository.kt @@ -21,8 +21,8 @@ class StudyScreenRepository( ) { val isMarkShownInToolbar: Boolean val isFlagShownInToolbar: Boolean - var isWhiteboardEnabled by prefs.booleanPref(KEY_WHITEBOARD_ENABLED, false) - var isRecordVoiceEnabled by prefs.booleanPref(KEY_RECORD_VOICE_ENABLED, false) + var isWhiteboardEnabled by prefs.booleanPref(PREF_WHITEBOARD_ENABLED, false) + var isRecordVoiceEnabled by prefs.booleanPref(PREF_RECORD_VOICE_ENABLED, false) val isHtmlTypeAnswerEnabled get() = prefs.isHtmlTypeAnswerEnabled init { @@ -61,7 +61,7 @@ class StudyScreenRepository( suspend fun getShouldShowNextTimes(): Boolean = CollectionPreferences.getShowIntervalOnButtons() companion object { - private const val KEY_WHITEBOARD_ENABLED = "whiteboardEnabled" - private const val KEY_RECORD_VOICE_ENABLED = "recordVoiceEnabled" + private const val PREF_WHITEBOARD_ENABLED = "whiteboardEnabled" + private const val PREF_RECORD_VOICE_ENABLED = "recordVoiceEnabled" } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/audiorecord/AudioRecordView.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/audiorecord/AudioRecordView.kt index 079a3c127654..0d84ae95d516 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/audiorecord/AudioRecordView.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/audiorecord/AudioRecordView.kt @@ -67,7 +67,7 @@ class AudioRecordView : ConstraintLayout { private var stopTrackingAction = false private var chronometerBase: Long = 0 private val recordEnabledColor = context.getColor(CommonR.color.material_red_600) - private val recordDisabledColor = ThemeUtils.getThemeAttrColor(context, R.attr.editTextDisabled) + private val recordDisabledColor = ThemeUtils.getThemeAttrColor(context, CommonR.attr.editTextDisabled) private var firstX = 0f private var firstY = 0f diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/audiorecord/CheckPronunciationViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/audiorecord/CheckPronunciationViewModel.kt index 7e839ba4ac3c..2c3c22724bf3 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/audiorecord/CheckPronunciationViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/audiorecord/CheckPronunciationViewModel.kt @@ -23,7 +23,7 @@ import kotlin.time.Duration class CheckPronunciationViewModel( audioRecorder: AudioRecorder = AudioRecorder(appContext), createPlayer: () -> Player = { VoicePlayer.createExoPlayer(appContext) }, - recordingsDirectory: File = File(appContext.cacheDir, VoiceRecorder.RECORDINGS_DIRECTORY), + recordingsDirectory: File = VoiceRecorder.recordingsDirectory(appContext), ) : ViewModel() { private val recorder = VoiceRecorder(audioRecorder, recordingsDirectory, viewModelScope) private val player = VoicePlayer(viewModelScope, createPlayer) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/ColorPickerDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/ColorPickerDialog.kt index 57d69c09bd2b..08180b8c1aee 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/ColorPickerDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/ColorPickerDialog.kt @@ -13,8 +13,8 @@ import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import com.ichi2.anki.CommonString import com.ichi2.anki.R -import com.ichi2.utils.Dp -import com.ichi2.utils.dp +import com.ichi2.anki.common.utils.Dp +import com.ichi2.anki.common.utils.dp import com.ichi2.utils.negativeButton import com.ichi2.utils.show import com.skydoves.colorpickerview.AlphaTileView diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardFragment.kt index 7cfd081c45b8..e3c92571b416 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardFragment.kt @@ -33,6 +33,7 @@ import com.ichi2.anki.R import com.ichi2.anki.android.back.doubleBackPressCallback import com.ichi2.anki.cardviewer.Gesture import com.ichi2.anki.common.utils.android.systemIsInNightMode +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.compat.CompatHelper.Companion.compat import com.ichi2.anki.databinding.FragmentWhiteboardBinding import com.ichi2.anki.databinding.PopupBrushOptionsBinding @@ -42,7 +43,6 @@ import com.ichi2.anki.reviewer.BindingMap import com.ichi2.anki.reviewer.ReviewerBinding import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.anki.utils.ext.sharedPrefs -import com.ichi2.utils.dp import com.ichi2.utils.increaseHorizontalPaddingOfMenuIcons import com.ichi2.utils.toRGBAHex import dev.androidbroadcast.vbpd.viewBinding @@ -52,6 +52,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import timber.log.Timber import kotlin.math.roundToInt +import com.ichi2.anki.common.android.R as CommonR /** * Fragment that displays a whiteboard and its controls. @@ -353,7 +354,7 @@ class WhiteboardFragment : PopupWindow(popupBrushBinding.root, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true) val typedValue = TypedValue() - val hasAttr = requireContext().theme.resolveAttribute(R.attr.studyScreenElevation, typedValue, true) + val hasAttr = requireContext().theme.resolveAttribute(CommonR.attr.studyScreenElevation, typedValue, true) brushConfigPopup?.elevation = if (hasAttr && typedValue.type == TypedValue.TYPE_DIMENSION) { typedValue.getDimension(resources.displayMetrics) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardRepository.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardRepository.kt index d809a06c41fb..7611d29e8c78 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardRepository.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardRepository.kt @@ -17,12 +17,12 @@ class WhiteboardRepository( brushes: List, isDarkMode: Boolean, ) { - val key = if (isDarkMode) KEY_BRUSHES_DARK else KEY_BRUSHES_LIGHT + val key = if (isDarkMode) PREF_BRUSHES_DARK else PREF_BRUSHES_LIGHT sharedPreferences.edit { putString(key, brushes.toPreferenceString()) } } fun loadBrushes(isDarkMode: Boolean): List { - val key = if (isDarkMode) KEY_BRUSHES_DARK else KEY_BRUSHES_LIGHT + val key = if (isDarkMode) PREF_BRUSHES_DARK else PREF_BRUSHES_LIGHT val saved = sharedPreferences.getString(key, null) return if (saved.isNullOrEmpty()) { getDefaultBrushes(isDarkMode) @@ -35,44 +35,44 @@ class WhiteboardRepository( index: Int, isDarkMode: Boolean, ) { - val key = if (isDarkMode) KEY_LAST_ACTIVE_BRUSH_INDEX_DARK else KEY_LAST_ACTIVE_BRUSH_INDEX_LIGHT + val key = if (isDarkMode) PREF_LAST_ACTIVE_BRUSH_INDEX_DARK else PREF_LAST_ACTIVE_BRUSH_INDEX_LIGHT sharedPreferences.edit { putInt(key, index) } } fun loadLastActiveBrushIndex(isDarkMode: Boolean): Int { - val key = if (isDarkMode) KEY_LAST_ACTIVE_BRUSH_INDEX_DARK else KEY_LAST_ACTIVE_BRUSH_INDEX_LIGHT + val key = if (isDarkMode) PREF_LAST_ACTIVE_BRUSH_INDEX_DARK else PREF_LAST_ACTIVE_BRUSH_INDEX_LIGHT return sharedPreferences.getInt(key, 0) } var inkEraserWidth: Float - get() = sharedPreferences.getFloat(KEY_INK_ERASER_WIDTH, DEFAULT_ERASER_WIDTH) - set(value) = sharedPreferences.edit { putFloat(KEY_INK_ERASER_WIDTH, value) } + get() = sharedPreferences.getFloat(PREF_INK_ERASER_WIDTH, DEFAULT_ERASER_WIDTH) + set(value) = sharedPreferences.edit { putFloat(PREF_INK_ERASER_WIDTH, value) } var strokeEraserWidth: Float - get() = sharedPreferences.getFloat(KEY_STROKE_ERASER_WIDTH, DEFAULT_ERASER_WIDTH) - set(value) = sharedPreferences.edit { putFloat(KEY_STROKE_ERASER_WIDTH, value) } + get() = sharedPreferences.getFloat(PREF_STROKE_ERASER_WIDTH, DEFAULT_ERASER_WIDTH) + set(value) = sharedPreferences.edit { putFloat(PREF_STROKE_ERASER_WIDTH, value) } var eraserMode: EraserMode get() { - val value = sharedPreferences.getString(KEY_ERASER_MODE, EraserMode.INK.name) ?: EraserMode.INK.name + val value = sharedPreferences.getString(PREF_ERASER_MODE, EraserMode.INK.name) ?: EraserMode.INK.name return EraserMode.entries.firstOrNull { it.name == value } ?: EraserMode.INK } - set(value) = sharedPreferences.edit { putString(KEY_ERASER_MODE, value.name) } + set(value) = sharedPreferences.edit { putString(PREF_ERASER_MODE, value.name) } var stylusOnlyMode: Boolean - get() = sharedPreferences.getBoolean(KEY_STYLUS_ONLY_MODE, false) - set(value) = sharedPreferences.edit { putBoolean(KEY_STYLUS_ONLY_MODE, value) } + get() = sharedPreferences.getBoolean(PREF_STYLUS_ONLY_MODE, false) + set(value) = sharedPreferences.edit { putBoolean(PREF_STYLUS_ONLY_MODE, value) } var toolbarAlignment: ToolbarAlignment get() { - val value = sharedPreferences.getString(KEY_TOOLBAR_ALIGNMENT, ToolbarAlignment.BOTTOM.name) ?: ToolbarAlignment.BOTTOM.name + val value = sharedPreferences.getString(PREF_TOOLBAR_ALIGNMENT, ToolbarAlignment.BOTTOM.name) ?: ToolbarAlignment.BOTTOM.name return ToolbarAlignment.entries.firstOrNull { it.name == value } ?: ToolbarAlignment.BOTTOM } - set(value) = sharedPreferences.edit { putString(KEY_TOOLBAR_ALIGNMENT, value.name) } + set(value) = sharedPreferences.edit { putString(PREF_TOOLBAR_ALIGNMENT, value.name) } var isToolbarShown: Boolean - get() = sharedPreferences.getBoolean(KEY_IS_TOOLBAR_SHOWN, true) - set(value) = sharedPreferences.edit { putBoolean(KEY_IS_TOOLBAR_SHOWN, value) } + get() = sharedPreferences.getBoolean(PREF_IS_TOOLBAR_SHOWN, true) + set(value) = sharedPreferences.edit { putBoolean(PREF_IS_TOOLBAR_SHOWN, value) } private fun List.toPreferenceString(): String = this.joinToString(",") { "${it.color}|${it.width}" } @@ -91,16 +91,16 @@ class WhiteboardRepository( } companion object { - private const val KEY_BRUSHES_LIGHT = "brushes_light" - private const val KEY_LAST_ACTIVE_BRUSH_INDEX_LIGHT = "last_active_brush_index_light" - private const val KEY_BRUSHES_DARK = "brushes_dark" - private const val KEY_LAST_ACTIVE_BRUSH_INDEX_DARK = "last_active_brush_index_dark" - private const val KEY_INK_ERASER_WIDTH = "ink_eraser_width" - private const val KEY_STROKE_ERASER_WIDTH = "stroke_eraser_width" - private const val KEY_ERASER_MODE = "eraser_mode" - private const val KEY_STYLUS_ONLY_MODE = "stylus_only_mode" - private const val KEY_TOOLBAR_ALIGNMENT = "toolbar_alignment" - private const val KEY_IS_TOOLBAR_SHOWN = "is_toolbar_shown" + private const val PREF_BRUSHES_LIGHT = "brushes_light" + private const val PREF_LAST_ACTIVE_BRUSH_INDEX_LIGHT = "last_active_brush_index_light" + private const val PREF_BRUSHES_DARK = "brushes_dark" + private const val PREF_LAST_ACTIVE_BRUSH_INDEX_DARK = "last_active_brush_index_dark" + private const val PREF_INK_ERASER_WIDTH = "ink_eraser_width" + private const val PREF_STROKE_ERASER_WIDTH = "stroke_eraser_width" + private const val PREF_ERASER_MODE = "eraser_mode" + private const val PREF_STYLUS_ONLY_MODE = "stylus_only_mode" + private const val PREF_TOOLBAR_ALIGNMENT = "toolbar_alignment" + private const val PREF_IS_TOOLBAR_SHOWN = "is_toolbar_shown" const val DEFAULT_STROKE_WIDTH = 10f const val DEFAULT_ERASER_WIDTH = 30f diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardToolbar.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardToolbar.kt index 042d2d7eaf16..5869bf8a20bf 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardToolbar.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardToolbar.kt @@ -16,9 +16,9 @@ import androidx.core.view.marginLeft import androidx.core.view.marginRight import androidx.core.view.updateLayoutParams import androidx.recyclerview.widget.LinearLayoutManager +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.databinding.ViewWhiteboardToolbarBinding import com.ichi2.anki.utils.ext.setDuration -import com.ichi2.utils.dp import kotlin.math.abs import kotlin.time.Duration.Companion.milliseconds diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/utils/ErrorMessage.kt b/AnkiDroid/src/main/java/com/ichi2/anki/utils/ErrorMessage.kt new file mode 100644 index 000000000000..64e0fb1c9bf9 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/utils/ErrorMessage.kt @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki.utils + +import android.content.Context +import android.text.Spanned +import android.text.style.TypefaceSpan +import androidx.core.text.buildSpannedString +import androidx.core.text.inSpans +import androidx.core.text.toSpanned +import com.ichi2.anki.showError + +/** Search errors have a formatting contract that does not apply to arbitrary exceptions. */ +internal fun Context.showSearchError(message: String) = showError(formatSearchError(message), crashReportData = null) + +/** + * Formats the backend's search errors: single-backtick code spans, or an entire regex diagnostic + * wrapped in `
    `. Unsupported code delimiters leave the entire message literal.
    + *
    + * Desktop converts search-syntax errors with Python-Markdown, whose code spans trim edge whitespace:
    + * https://github.com/Python-Markdown/markdown/blob/3.10.3/markdown/inlinepatterns.py#L394-L413
    + * Regex diagnostics contain raw user input, so remove only the outer wrapper, without parsing HTML:
    + * https://github.com/ankitects/anki/blob/fe4f9e039a4e283b71e611fc1ffb87029b1cdc05/rslib/src/error/mod.rs#L161
    + */
    +internal fun formatSearchError(message: String): Spanned {
    +    if (message.startsWith("
    ") && message.endsWith("
    ")) { + return buildSpannedString { + inSpans(TypefaceSpan("monospace")) { + append(message.removeSurrounding("
    ", "
    ")) + } + } + } + + val parts = message.split('`') + if (!supportsInlineCode(message, parts)) return message.toSpanned() + + return buildSpannedString { + parts.forEachIndexed { index, part -> + if (index % 2 == 1) { + inSpans(TypefaceSpan("monospace")) { append(part.trim()) } + } else { + append(part) + } + } + } +} + +private fun supportsInlineCode( + message: String, + parts: List, +): Boolean { + if (parts.size % 2 == 0 || "``" in message) return false + + // Splitting on backticks alternates prose and code, starting and ending with prose. + for (codeIndex in 1 until parts.size step 2) { + val code = parts[codeIndex] + if (code.isBlank() || '\n' in code || '\r' in code) return false + + val precedingText = parts[codeIndex - 1] + if (precedingText.endsWith('\\')) return false + } + return true +} diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/utils/ext/Flow.kt b/AnkiDroid/src/main/java/com/ichi2/anki/utils/ext/Flow.kt index 5dcd982c60a8..33b471acaf44 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/utils/ext/Flow.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/utils/ext/Flow.kt @@ -49,6 +49,20 @@ fun Flow.launchCollectionInLifecycleScope(block: suspend (T) -> Unit) { } } +/** + * Collects while the fragment's current view is started. Call from [Fragment.onViewCreated]. + */ +context(fragment: Fragment) +fun Flow.launchCollectionInViewLifecycleScope(block: suspend (T) -> Unit): Job { + // Capture the owner before launching: the view may be destroyed or recreated before the job starts. + val owner = fragment.viewLifecycleOwner + return owner.lifecycleScope.launch { + owner.repeatOnLifecycle(Lifecycle.State.STARTED) { + this@launchCollectionInViewLifecycleScope.collect(block) + } + } +} + // Workaround a bug in overload resolution. Replace with the following when the compiler is fixed: // state: Lifecycle.State = Lifecycle.State.STARTED context(activity: AnkiActivity) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/widgets/DeckAdapter.kt b/AnkiDroid/src/main/java/com/ichi2/anki/widgets/DeckAdapter.kt index 146cfa5f5e20..5c892e650e13 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/widgets/DeckAdapter.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/widgets/DeckAdapter.kt @@ -19,10 +19,10 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.ichi2.anki.CommonString import com.ichi2.anki.R +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.databinding.ItemDeckBinding import com.ichi2.anki.deckpicker.DisplayDeckNode import com.ichi2.anki.libanki.DeckId -import com.ichi2.utils.dp import kotlinx.coroutines.runBlocking import net.ankiweb.rsdroid.RustCleanup import com.ichi2.anki.common.android.R as CommonR @@ -233,23 +233,23 @@ class DeckAdapter( // Get the colors from the theme attributes val attrs = intArrayOf( - R.attr.zeroCountColor, - R.attr.newCountColor, - R.attr.learnCountColor, - R.attr.reviewCountColor, - R.attr.currentDeckBackground, + CommonR.attr.zeroCountColor, + CommonR.attr.newCountColor, + CommonR.attr.learnCountColor, + CommonR.attr.reviewCountColor, + CommonR.attr.currentDeckBackground, android.R.attr.textColor, - R.attr.dynDeckColor, - R.attr.expandRef, - R.attr.collapseRef, + CommonR.attr.dynDeckColor, + CommonR.attr.expandRef, + CommonR.attr.collapseRef, ) val ta = context.obtainStyledAttributes(attrs) - zeroCountColor = ta.getColor(0, context.getColor(R.color.black)) - newCountColor = ta.getColor(1, context.getColor(R.color.black)) - learnCountColor = ta.getColor(2, context.getColor(R.color.black)) - reviewCountColor = ta.getColor(3, context.getColor(R.color.black)) + zeroCountColor = ta.getColor(0, context.getColor(CommonR.color.black)) + newCountColor = ta.getColor(1, context.getColor(CommonR.color.black)) + learnCountColor = ta.getColor(2, context.getColor(CommonR.color.black)) + reviewCountColor = ta.getColor(3, context.getColor(CommonR.color.black)) rowCurrentDrawable = ta.getResourceId(4, 0) - deckNameDefaultColor = ta.getColor(5, context.getColor(R.color.black)) + deckNameDefaultColor = ta.getColor(5, context.getColor(CommonR.color.black)) deckNameDynColor = ta.getColor(6, context.getColor(CommonR.color.material_blue_A700)) expandImage = ta.getDrawableOrThrow(7) expandImage.isAutoMirrored = true diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/widgets/DeckHierarchyLinesDecoration.kt b/AnkiDroid/src/main/java/com/ichi2/anki/widgets/DeckHierarchyLinesDecoration.kt index 3e94f7da4668..83edd9f2c23b 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/widgets/DeckHierarchyLinesDecoration.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/widgets/DeckHierarchyLinesDecoration.kt @@ -12,7 +12,7 @@ import androidx.core.view.children import androidx.recyclerview.widget.RecyclerView import com.ichi2.anki.R import com.ichi2.anki.common.utils.android.systemIsInNightMode -import com.ichi2.utils.dp +import com.ichi2.anki.common.utils.dp @JvmInline private value class DepthBitSet( diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/workarounds/SafeWebViewLayout.kt b/AnkiDroid/src/main/java/com/ichi2/anki/workarounds/SafeWebViewLayout.kt index 60b839172e5f..3729772b0033 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/workarounds/SafeWebViewLayout.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/workarounds/SafeWebViewLayout.kt @@ -128,6 +128,12 @@ open class SafeWebViewLayout : webView.goBack() } + @MainThread + fun canGoBack(): Boolean { + if (warnIfNotActive("canGoBack")) return false + return webView.canGoBack() + } + @MainThread fun pageUp(): Boolean { if (warnIfNotActive("pageUp")) return false @@ -205,29 +211,64 @@ open class SafeWebViewLayout : removeView(webView) webView.destroy() - val fragment = - try { - findFragment() - } catch (e: IllegalStateException) { - Timber.w(e, "skipping WebView recreation; layout is not attached to a Fragment") - webViewState = WebViewState.DESTROYED_RECOVERABLE - return - } - if (fragment.view == null) { - Timber.w("skipping WebView recreation; fragment view is gone") + if (!isAttachedToWindow) { + Timber.w("skipping WebView recreation; layout is not attached to a window") webViewState = WebViewState.DESTROYED_RECOVERABLE return } - if (!isAttachedToWindow) { - Timber.w("skipping WebView recreation; layout is not attached to a window") + + val listener = findListener() + if (listener == null) { + Timber.w("skipping WebView recreation; no OnWebViewRecreatedListener found") webViewState = WebViewState.DESTROYED_RECOVERABLE return } - recreateInnerWebView(fragment) + recreateInnerWebView(listener) } - private fun recreateInnerWebView(fragment: Fragment) { + /** Finds the [OnWebViewRecreatedListener] from the host Fragment, falling back to the host Activity. */ + private fun findListener(): OnWebViewRecreatedListener? { + val fragment = + try { + findFragment() + } catch (e: IllegalStateException) { + null + } + + if (fragment != null) { + if (fragment.view == null) { + Timber.w("skipping WebView recreation; fragment view is gone") + return null + } + return (fragment as? OnWebViewRecreatedListener).also { + if (it == null) { + if (BuildConfig.DEBUG && !isInEditMode) { + throw IllegalStateException( + "Fragment '${fragment::class.simpleName}' must implement OnWebViewRecreatedListener", + ) + } else { + Timber.w("Fragment does not implement OnWebViewRecreatedListener. WebView recreation may not be handled") + } + } + } + } + + return (context as? OnWebViewRecreatedListener).also { + if (it == null) { + val hostName = context.javaClass.simpleName + if (BuildConfig.DEBUG && !isInEditMode) { + throw IllegalStateException( + "'$hostName' must implement OnWebViewRecreatedListener", + ) + } else { + Timber.w("'$hostName' does not implement OnWebViewRecreatedListener. WebView recreation may not be handled") + } + } + } + } + + private fun recreateInnerWebView(listener: OnWebViewRecreatedListener) { val previousWebView = this.webView if (previousWebView.parent == this) { removeView(previousWebView) @@ -235,17 +276,26 @@ open class SafeWebViewLayout : this.webView = createWebView() webViewState = WebViewState.ACTIVE addView(this.webView, webViewLayoutParams) - (fragment as? OnWebViewRecreatedListener)?.onWebViewRecreated(this.webView) + listener.onWebViewRecreated(this.webView) } - private fun tryRecoverDestroyedWebViewIfNeeded(fragment: Fragment) { + private fun tryRecoverDestroyedWebViewIfNeeded(listener: OnWebViewRecreatedListener) { if (webViewState != WebViewState.DESTROYED_RECOVERABLE) return - val fragmentView = fragment.view ?: return - if (this === fragmentView || ancestors.any { it === fragmentView }) { - recreateInnerWebView(fragment) - } else { - Timber.w("skipping WebView recovery; layout is not in the fragment's current view hierarchy") + // For Fragment hosts, ensure the layout is still in the fragment's current view hierarchy. + val fragment = + try { + findFragment() + } catch (e: IllegalStateException) { + null + } + if (fragment != null) { + val fragmentView = fragment.view ?: return + if (this !== fragmentView && ancestors.none { it === fragmentView }) { + Timber.w("skipping WebView recovery; layout is not in the fragment's current view hierarchy") + return + } } + recreateInnerWebView(listener) } private fun warnIfNotActive(methodName: String): Boolean { @@ -258,41 +308,8 @@ open class SafeWebViewLayout : override fun onAttachedToWindow() { super.onAttachedToWindow() - - val fragment = - try { - findFragment() - } catch (e: IllegalStateException) { - // findFragment throws if the View is not attached to a Fragment. - // This can happen in scenarios like Android Studio previews - // or if the view is added directly to an Activity. - if (webViewState == WebViewState.DESTROYED_RECOVERABLE) { - Timber.w(e, "SafeWebViewLayout not attached to a Fragment; skipping WebView recovery") - return - } - if (BuildConfig.DEBUG && !isInEditMode) { - throw IllegalStateException( - "SafeWebViewLayout must be used within a Fragment", - e, - ) - } else { - Timber.w(e, "SafeWebViewLayout not attached to a Fragment") - } - return - } - - if (fragment !is OnWebViewRecreatedListener) { - if (BuildConfig.DEBUG && !isInEditMode) { - throw IllegalStateException( - "Fragment '${fragment::class.simpleName}' must implement OnWebViewRecreatedListener", - ) - } else { - Timber.w("Fragment does not implement OnWebViewRecreatedListener. WebView recreation may not be handled") - } - return - } - - tryRecoverDestroyedWebViewIfNeeded(fragment) + val listener = findListener() ?: return + tryRecoverDestroyedWebViewIfNeeded(listener) } /** diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/worker/SyncWorker.kt b/AnkiDroid/src/main/java/com/ichi2/anki/worker/SyncWorker.kt index 2247b215e391..31d638e8508b 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/worker/SyncWorker.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/worker/SyncWorker.kt @@ -19,6 +19,7 @@ import androidx.work.WorkManager import androidx.work.WorkerParameters import anki.collection.Progress import anki.sync.SyncCollectionResponse +import com.ichi2.anki.BackupManager import com.ichi2.anki.CollectionManager import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CollectionManager.withCol @@ -27,11 +28,15 @@ import com.ichi2.anki.NotificationChannel import com.ichi2.anki.R import com.ichi2.anki.cancelSync import com.ichi2.anki.common.permissions.canPostNotifications +import com.ichi2.anki.libanki.Collection import com.ichi2.anki.notifications.NotificationId +import com.ichi2.anki.reopen import com.ichi2.anki.setLastSyncTimeToNow import com.ichi2.anki.settings.Prefs +import com.ichi2.anki.sync.MediaSync import com.ichi2.anki.sync.MeteredSyncPolicy import com.ichi2.anki.sync.SyncAuth +import com.ichi2.anki.sync.fullUploadOrDownload import com.ichi2.anki.sync.syncCollection import com.ichi2.anki.utils.ext.trySetForeground import kotlinx.coroutines.Dispatchers @@ -56,7 +61,8 @@ val syncLock = Mutex() * * Media is synced by enqueueing a [SyncMediaWorker] work, which doesn't block the collection. * - * Note that one-way syncs will be ignored, since they require user input. + * Full uploads and downloads run when the server specifies the direction. + * Conflicts requiring the user to choose a direction are ignored. * * That is useful when the user isn't interacting with * the app, like when doing an automatic sync after leaving the app. @@ -102,12 +108,13 @@ class SyncWorker( } Timber.d("SyncWorker: showing failure notification") return Result.failure() + } finally { + setLastSyncTimeToNow() } Timber.d("SyncWorker: cancelling progress notification (sync completed)") notificationManager?.cancel(NotificationId.SYNC) Timber.d("SyncWorker: success") - setLastSyncTimeToNow() return Result.success() } @@ -116,7 +123,7 @@ class SyncWorker( syncMedia: Boolean, ) { Timber.v("SyncWorker::syncCollection") - val response = + val syncAuth = coroutineScope { val monitor = launch(Dispatchers.IO) { @@ -134,41 +141,64 @@ class SyncWorker( } try { withCol { - syncCollection(auth, syncMedia = false) + val response = syncCollection(auth, syncMedia = false) + val syncAuth = + if (response.hasNewEndpoint() && response.newEndpoint.isNotEmpty()) { + Prefs.currentSyncUri = response.newEndpoint + auth.withEndpoint(response.newEndpoint) + } else { + auth + } + Timber.i("Sync required: %s", response.required) + // Keep the direction decision and transfer on the queue so the collection + // cannot change between checking whether it is empty and replacing it. + when (response.required) { + SyncCollectionResponse.ChangesRequired.NO_CHANGES -> _loadScheduler() + SyncCollectionResponse.ChangesRequired.FULL_DOWNLOAD -> fullSync(syncAuth, upload = false) + SyncCollectionResponse.ChangesRequired.FULL_UPLOAD -> fullSync(syncAuth, upload = true) + SyncCollectionResponse.ChangesRequired.FULL_SYNC -> { + Timber.d("Sync direction required: Skipping background sync") + return@withCol null + } + SyncCollectionResponse.ChangesRequired.UNRECOGNIZED, + SyncCollectionResponse.ChangesRequired.NORMAL_SYNC, + null, + -> TODO("should never happen") + } + syncAuth } } finally { Timber.d("Collection sync completed. Cancelling monitor...") // this doesn't wait for completion; the outer `coroutineScope` does. monitor.cancel() } + } ?: return + if (syncMedia) syncMedia(syncAuth) + } + + private fun Collection.fullSync( + auth: SyncAuth, + upload: Boolean, + ) { + val title = if (upload) TR.syncUploadingToAnkiweb() else TR.syncDownloadingFromAnkiweb() + notify(getProgressNotification(title)) + if (!upload) { + val created = + createBackup( + BackupManager.getBackupDirectoryFromCollection(colDb), + force = true, + waitForCompletion = true, + ) + if (!created) { + Timber.i("SyncWorker: Backup skipped before full download: collection unchanged") } - Timber.i("Sync required: %s", response.required) - when (response.required) { - // a successful sync returns this value - SyncCollectionResponse.ChangesRequired.NO_CHANGES -> { - withCol { _loadScheduler() } // scheduler version may have changed - if (!syncMedia) return - val syncAuth = - if (response.hasNewEndpoint() && response.newEndpoint.isNotEmpty()) { - Prefs.currentSyncUri = response.newEndpoint - auth.withEndpoint(response.newEndpoint) - } else { - auth - } - syncMedia(syncAuth) - } - SyncCollectionResponse.ChangesRequired.FULL_SYNC, - SyncCollectionResponse.ChangesRequired.FULL_DOWNLOAD, - SyncCollectionResponse.ChangesRequired.FULL_UPLOAD, - -> { - Timber.d("One-way sync required: Skipping background sync") - } - SyncCollectionResponse.ChangesRequired.UNRECOGNIZED, - SyncCollectionResponse.ChangesRequired.NORMAL_SYNC, - null, - -> { - TODO("should never happen") - } + } + close(downgrade = false, forFullSync = true) + try { + // Media starts separately so WorkManager can enforce its network constraints. + fullUploadOrDownload(auth, upload = upload, mediaSync = MediaSync.Skip) + } finally { + reopen(afterFullSync = true) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/compose/theme/Borders.kt b/AnkiDroid/src/main/java/com/ichi2/compose/theme/Borders.kt new file mode 100644 index 000000000000..766f8faeb6f7 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/compose/theme/Borders.kt @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.compose.theme + +import androidx.compose.foundation.BorderStroke +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.dp +import androidx.core.content.withStyledAttributes +import com.ichi2.anki.common.android.R as CommonR + +/** The XML theme's widget outline; e-ink uses it to distinguish white surfaces. */ +val MaterialTheme.widgetBorder: BorderStroke? + @Composable + get() { + val context = LocalContext.current + val density = LocalDensity.current + return remember(context, density) { + var border: BorderStroke? = null + context.withStyledAttributes(attrs = intArrayOf(CommonR.attr.widgetStrokeWidth, CommonR.attr.widgetStrokeColor)) { + val width = with(density) { getDimension(0, 0f).toDp() } + if (width > 0.dp) { + border = BorderStroke(width, Color(getColor(1, android.graphics.Color.TRANSPARENT))) + } + } + border + } + } diff --git a/AnkiDroid/src/main/java/com/ichi2/compose/ui/components/HeroToolbarActionButton.kt b/AnkiDroid/src/main/java/com/ichi2/compose/ui/components/HeroToolbarActionButton.kt index b690b9ed2c1b..7b66b4bac909 100644 --- a/AnkiDroid/src/main/java/com/ichi2/compose/ui/components/HeroToolbarActionButton.kt +++ b/AnkiDroid/src/main/java/com/ichi2/compose/ui/components/HeroToolbarActionButton.kt @@ -20,10 +20,11 @@ import com.ichi2.compose.ui.preview.ThemePreviews fun HeroToolbarActionButton( modifier: Modifier = Modifier, label: String = stringResource(CommonString.multimedia_editor_field_editing_done), + enabled: Boolean = true, onClick: () -> Unit = {}, ) { Box(modifier.padding(horizontal = 8.dp)) { - Button(onClick = onClick, modifier = Modifier.heightIn(min = 48.dp)) { + Button(onClick = onClick, modifier = Modifier.heightIn(min = 48.dp), enabled = enabled) { Text(text = label) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/compose/ui/dialogs/TextInputDialog.kt b/AnkiDroid/src/main/java/com/ichi2/compose/ui/dialogs/TextInputDialog.kt index 640337092f62..66ad37575c75 100644 --- a/AnkiDroid/src/main/java/com/ichi2/compose/ui/dialogs/TextInputDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/compose/ui/dialogs/TextInputDialog.kt @@ -13,8 +13,6 @@ import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.AlertDialogDefaults -import androidx.compose.material3.BasicAlertDialog -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Surface @@ -31,26 +29,21 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.unit.dp import com.ichi2.anki.CommonString -import com.ichi2.compose.theme.AnkiDroidTheme -import com.ichi2.compose.ui.preview.ThemePreviews +import com.ichi2.compose.ui.preview.AnkiDroidPreview +import com.ichi2.compose.ui.preview.DialogPreviews /** * Dialog asking the user for a single line of text. Compose counterpart of * the View based `AlertDialog.input(...)` helper. * - * In previews the card renders inline, because dialog windows don't show up - * in the static preview pane. - * * @param onConfirm called with the text, but only while it is valid * @param errorMessageFor error to show for the current input, null when valid */ -@OptIn(ExperimentalMaterial3Api::class) @Composable fun TextInputDialog( title: String, @@ -61,10 +54,11 @@ fun TextInputDialog( dismissText: String = stringResource(CommonString.dialog_cancel), initialText: String = "", maxLengthCounter: Int? = null, + lengthOf: (String) -> Int = { it.length }, capitalization: KeyboardCapitalization = KeyboardCapitalization.Sentences, errorMessageFor: (String) -> String? = { null }, ) { - if (LocalInspectionMode.current) { + AnkiDroidDialog(onDismissRequest = onDismissRequest) { TextInputDialogCard( title = title, label = label, @@ -74,24 +68,10 @@ fun TextInputDialog( dismissText = dismissText, initialText = initialText, maxLengthCounter = maxLengthCounter, + lengthOf = lengthOf, capitalization = capitalization, errorMessageFor = errorMessageFor, ) - } else { - BasicAlertDialog(onDismissRequest = onDismissRequest) { - TextInputDialogCard( - title = title, - label = label, - confirmText = confirmText, - onConfirm = onConfirm, - onDismissRequest = onDismissRequest, - dismissText = dismissText, - initialText = initialText, - maxLengthCounter = maxLengthCounter, - capitalization = capitalization, - errorMessageFor = errorMessageFor, - ) - } } } @@ -106,6 +86,7 @@ private fun TextInputDialogCard( dismissText: String, initialText: String, maxLengthCounter: Int?, + lengthOf: (String) -> Int, capitalization: KeyboardCapitalization, errorMessageFor: (String) -> String?, ) { @@ -157,7 +138,7 @@ private fun TextInputDialogCard( Spacer(modifier = Modifier.weight(1f)) } if (maxLengthCounter != null) { - Text("${text.length}/$maxLengthCounter") + Text("${lengthOf(text)}/$maxLengthCounter") } } } @@ -192,10 +173,10 @@ private fun TextInputDialogCard( } } -@ThemePreviews +@DialogPreviews @Composable private fun TextInputDialogPreview() { - AnkiDroidTheme { + AnkiDroidPreview { TextInputDialog( title = "Rename deck", label = "Deck name", diff --git a/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/AnkiDroidPreview.kt b/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/AnkiDroidPreview.kt index 55dd0abba7c5..581ec6247f3a 100644 --- a/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/AnkiDroidPreview.kt +++ b/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/AnkiDroidPreview.kt @@ -8,20 +8,24 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext -import com.ichi2.anki.R +import com.ichi2.anki.settings.enums.DayTheme +import com.ichi2.anki.settings.enums.NightTheme +import com.ichi2.anki.settings.enums.Theme import com.ichi2.compose.theme.AnkiDroidTheme /** - * Applies the AnkiDroid theme matching the preview's light or dark UI mode. + * Applies [theme] to preview content, defaulting to the preview's light or dark UI mode. * - * Use this wrapper with [ThemePreviews]. + * Use [AnkiDroidThemeProvider] to preview every app theme, or [ThemePreviews] for light and dark. */ @Composable -fun AnkiDroidPreview(content: @Composable () -> Unit) { +fun AnkiDroidPreview( + theme: Theme = if (isSystemInDarkTheme()) NightTheme.DARK else DayTheme.LIGHT, + content: @Composable () -> Unit, +) { // AnkiDroidTheme reads XML attributes, so changing only the preview's UI mode is insufficient. val context = LocalContext.current - val theme = if (isSystemInDarkTheme()) R.style.Theme_Dark else R.style.Theme_Light - val themedContext = remember(context, theme) { ContextThemeWrapper(context, theme) } + val themedContext = remember(context, theme) { ContextThemeWrapper(context, theme.styleResId) } CompositionLocalProvider(LocalContext provides themedContext) { AnkiDroidTheme(content = content) } diff --git a/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/AnkiDroidThemeProvider.kt b/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/AnkiDroidThemeProvider.kt new file mode 100644 index 000000000000..b90acf3c0a41 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/AnkiDroidThemeProvider.kt @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.compose.ui.preview + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import com.ichi2.anki.settings.enums.DayTheme +import com.ichi2.anki.settings.enums.NightTheme +import com.ichi2.anki.settings.enums.Theme + +/** Supplies every app theme to a preview wrapped in [AnkiDroidPreview]. */ +class AnkiDroidThemeProvider : PreviewParameterProvider { + override val values: Sequence = DayTheme.entries.asSequence() + NightTheme.entries.asSequence() + + override fun getDisplayName(index: Int): String = + when (val theme = values.elementAt(index)) { + DayTheme.EINK -> "E-ink" + else -> theme.toString().lowercase().replaceFirstChar(Char::titlecase) + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/DialogPreviews.kt b/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/DialogPreviews.kt new file mode 100644 index 000000000000..cb3bb3627a95 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/DialogPreviews.kt @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.compose.ui.preview + +import android.content.res.Configuration +import androidx.compose.ui.tooling.preview.Preview + +/** Light and dark dialog previews with a transparent canvas around the dialog's outline. */ +@Preview( + name = "Light", + group = "dialog", + showBackground = false, + uiMode = Configuration.UI_MODE_NIGHT_NO, +) +@Preview( + name = "Dark", + group = "dialog", + showBackground = false, + uiMode = Configuration.UI_MODE_NIGHT_YES, +) +annotation class DialogPreviews diff --git a/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/ThemePreviews.kt b/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/ThemePreviews.kt index c93f2c14f0c6..86148330a60d 100644 --- a/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/ThemePreviews.kt +++ b/AnkiDroid/src/main/java/com/ichi2/compose/ui/preview/ThemePreviews.kt @@ -14,17 +14,16 @@ import androidx.compose.ui.tooling.preview.Preview * * Apply to any private `*Preview` function in a composable file so the IDE * shows both variants side-by-side without duplicating @Preview blocks. + * Use [DialogPreviews] for dialogs that need a transparent preview background. */ @Preview( name = "Light", group = "theme", uiMode = Configuration.UI_MODE_NIGHT_NO, - showBackground = true, ) @Preview( name = "Dark", group = "theme", uiMode = Configuration.UI_MODE_NIGHT_YES, - showBackground = true, ) annotation class ThemePreviews diff --git a/AnkiDroid/src/main/java/com/ichi2/imagecropper/ImageCropper.kt b/AnkiDroid/src/main/java/com/ichi2/imagecropper/ImageCropper.kt index cf8e5e2ced30..7a4c78027a43 100644 --- a/AnkiDroid/src/main/java/com/ichi2/imagecropper/ImageCropper.kt +++ b/AnkiDroid/src/main/java/com/ichi2/imagecropper/ImageCropper.kt @@ -68,7 +68,7 @@ class ImageCropper : cropRect = Rect(100, 300, 500, 1200) } val originalImageUri = - BundleCompat.getParcelable(requireArguments(), CROP_IMAGE_URI, Uri::class.java) + BundleCompat.getParcelable(requireArguments(), ARG_IMAGE_URI, Uri::class.java) ?: error("No image identifier was provided for cropping") viewLifecycleOwner.lifecycleScope.launch { withProgress { @@ -194,7 +194,7 @@ class ImageCropper : if (result.error == null) { val resultIntent = Intent() resultIntent.putExtra( - CROP_IMAGE_RESULT, + EXTRA_CROP_IMAGE_RESULT, CropResultData( uriContent = result.uriContent, uriPath = context?.let { result.getUriFilePath(it) }, @@ -220,12 +220,12 @@ class ImageCropper : /** * The key for the original image URI passed as an argument. */ - const val CROP_IMAGE_URI = "image_uri" + const val ARG_IMAGE_URI = "image_uri" /** * The key for the cropped image path sent back in the result Intent. */ - const val CROP_IMAGE_RESULT = "crop_image_result" + const val EXTRA_CROP_IMAGE_RESULT = "crop_image_result" } @Parcelize diff --git a/AnkiDroid/src/main/java/com/ichi2/imagecropper/ImageCropperLauncher.kt b/AnkiDroid/src/main/java/com/ichi2/imagecropper/ImageCropperLauncher.kt index 1a0165fd1b86..f0079869ea3f 100644 --- a/AnkiDroid/src/main/java/com/ichi2/imagecropper/ImageCropperLauncher.kt +++ b/AnkiDroid/src/main/java/com/ichi2/imagecropper/ImageCropperLauncher.kt @@ -36,7 +36,7 @@ sealed interface ImageCropperLauncher { ) : ImageCropperLauncher { override fun toBundle(): Bundle = Bundle().apply { - putParcelable(ImageCropper.CROP_IMAGE_URI, imageUri) + putParcelable(ImageCropper.ARG_IMAGE_URI, imageUri) } } } diff --git a/AnkiDroid/src/main/java/com/ichi2/preferences/ControlPreference.kt b/AnkiDroid/src/main/java/com/ichi2/preferences/ControlPreference.kt index 8c33d7626ca8..d6ca3ab24b0d 100644 --- a/AnkiDroid/src/main/java/com/ichi2/preferences/ControlPreference.kt +++ b/AnkiDroid/src/main/java/com/ichi2/preferences/ControlPreference.kt @@ -14,6 +14,7 @@ import androidx.preference.DialogPreference import androidx.preference.PreferenceFragmentCompat import com.ichi2.anki.CommonString import com.ichi2.anki.R +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.databinding.DialogControlPreferenceBinding import com.ichi2.anki.dialogs.GestureSelectionDialogUtils import com.ichi2.anki.dialogs.GestureSelectionDialogUtils.onGestureChanged @@ -31,7 +32,6 @@ import com.ichi2.ui.GesturePicker import com.ichi2.ui.KeyPicker import com.ichi2.utils.create import com.ichi2.utils.customView -import com.ichi2.utils.dp import com.ichi2.utils.negativeButton import com.ichi2.utils.positiveButton import com.ichi2.utils.show @@ -71,17 +71,11 @@ open class ControlPreference : protected open fun onGestureSelected(binding: Binding) = Unit - /** @return whether the binding is used in another action */ - open fun warnIfUsed( - binding: Binding, - warningDisplay: WarningDisplay, - ): Boolean { - val bindingPreference = getPreferenceAssignedTo(binding) ?: return false - if (bindingPreference == this) return false - val actionTitle = bindingPreference.title ?: "" - val warning = context.getString(CommonString.bindings_already_bound, actionTitle) - warningDisplay.setWarning(warning) - return true + /** @return the title of the other action using [binding], or null if there is no conflict */ + open fun otherActionTitleForBinding(binding: Binding): CharSequence? { + val bindingPreference = getPreferenceAssignedTo(binding) ?: return null + if (bindingPreference == this) return null + return bindingPreference.title ?: "" } var value: String? @@ -172,7 +166,11 @@ open class ControlPreference : binding: Binding, warningDisplay: WarningDisplay, ) { - if (!warnIfUsed(binding, warningDisplay)) { + val otherActionTitle = otherActionTitleForBinding(binding) + if (otherActionTitle != null) { + val warning = context.getString(CommonString.bindings_already_bound, otherActionTitle) + warningDisplay.setWarning(warning) + } else { warningDisplay.clearWarning() } } @@ -221,7 +219,7 @@ open class ControlPreferenceDialogFragment : DialogFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val key = requireArguments().requireString(SettingsFragment.PREF_DIALOG_KEY) + val key = requireArguments().requireString(SettingsFragment.ARG_PREFERENCE_KEY) preference = (targetFragment as PreferenceFragmentCompat).requirePreference(key) } diff --git a/AnkiDroid/src/main/java/com/ichi2/preferences/ExternalDirectorySelectionPreference.kt b/AnkiDroid/src/main/java/com/ichi2/preferences/ExternalDirectorySelectionPreference.kt index 2b004719075c..7fa190d219ed 100644 --- a/AnkiDroid/src/main/java/com/ichi2/preferences/ExternalDirectorySelectionPreference.kt +++ b/AnkiDroid/src/main/java/com/ichi2/preferences/ExternalDirectorySelectionPreference.kt @@ -16,7 +16,6 @@ import androidx.fragment.app.DialogFragment import androidx.preference.ListPreference import androidx.preference.ListPreferenceDialogFragmentCompat import com.ichi2.anki.CommonString -import com.ichi2.anki.R import com.ichi2.anki.common.crashreporting.runCatchingWithLog import com.ichi2.anki.common.utils.android.showThemedToast import com.ichi2.anki.startup.getDefaultAnkiDroidDirectory @@ -29,6 +28,7 @@ import timber.log.Timber import java.io.File import java.nio.file.Files import java.nio.file.Paths +import com.ichi2.anki.common.android.R as CommonR /** * Lets the user pick the AnkiDroid directory from a list of detected storage @@ -148,7 +148,7 @@ class FullWidthListPreferenceDialogFragment : ListPreferenceDialogFragmentCompat .Builder(context) .show { setTitle(CommonString.pref_enter_custom_path) - setView(R.layout.dialog_generic_text_input) + setView(CommonR.layout.dialog_generic_text_input) positiveButton(android.R.string.ok) negativeButton(android.R.string.cancel) }.input( diff --git a/AnkiDroid/src/main/java/com/ichi2/preferences/HeaderPreference.kt b/AnkiDroid/src/main/java/com/ichi2/preferences/HeaderPreference.kt index 1b1e0c75abf9..668e53f0b051 100644 --- a/AnkiDroid/src/main/java/com/ichi2/preferences/HeaderPreference.kt +++ b/AnkiDroid/src/main/java/com/ichi2/preferences/HeaderPreference.kt @@ -10,6 +10,7 @@ import androidx.preference.Preference import androidx.preference.PreferenceViewHolder import com.ichi2.anki.LanguageUtils import com.ichi2.anki.R +import com.ichi2.anki.common.android.R as CommonR /** * Preference used on the headers of [com.ichi2.anki.preferences.HeaderFragment] @@ -41,7 +42,7 @@ class HeaderPreference : Preference { override fun onBindViewHolder(holder: PreferenceViewHolder) { super.onBindViewHolder(holder) if (isHighlighted) { - val color = ThemeUtils.getThemeAttrColor(context, R.attr.currentDeckBackgroundColor) + val color = ThemeUtils.getThemeAttrColor(context, CommonR.attr.currentDeckBackgroundColor) holder.itemView.setBackgroundColor(color) } } diff --git a/AnkiDroid/src/main/java/com/ichi2/preferences/ListPreferenceTrait.kt b/AnkiDroid/src/main/java/com/ichi2/preferences/ListPreferenceTrait.kt index 73c38d4e162c..7f9a0fcdf75a 100644 --- a/AnkiDroid/src/main/java/com/ichi2/preferences/ListPreferenceTrait.kt +++ b/AnkiDroid/src/main/java/com/ichi2/preferences/ListPreferenceTrait.kt @@ -95,17 +95,17 @@ class ListPreferenceDialogFragment : PreferenceDialogFragmentCompat() { entries = preference.entryKeys.toTypedArray() entryValues = preference.entryValues.toTypedArray() } else { - clickedDialogEntryIndex = savedInstanceState.getInt(SAVE_STATE_INDEX, 0) - entries = savedInstanceState.getCharSequenceArray(SAVE_STATE_ENTRIES)!! - entryValues = savedInstanceState.getCharSequenceArray(SAVE_STATE_ENTRY_VALUES)!! + clickedDialogEntryIndex = savedInstanceState.getInt(STATE_INDEX, 0) + entries = savedInstanceState.getCharSequenceArray(STATE_ENTRIES)!! + entryValues = savedInstanceState.getCharSequenceArray(STATE_ENTRY_VALUES)!! } } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - outState.putInt(SAVE_STATE_INDEX, clickedDialogEntryIndex) - outState.putCharSequenceArray(SAVE_STATE_ENTRIES, entries) - outState.putCharSequenceArray(SAVE_STATE_ENTRY_VALUES, entryValues) + outState.putInt(STATE_INDEX, clickedDialogEntryIndex) + outState.putCharSequenceArray(STATE_ENTRIES, entries) + outState.putCharSequenceArray(STATE_ENTRY_VALUES, entryValues) } private val listPreference get() = preference as ListPreferenceTrait @@ -142,9 +142,9 @@ class ListPreferenceDialogFragment : PreferenceDialogFragmentCompat() { } companion object { - private const val SAVE_STATE_INDEX = "ListPreferenceDialogFragment.index" - private const val SAVE_STATE_ENTRIES = "ListPreferenceDialogFragment.entries" - private const val SAVE_STATE_ENTRY_VALUES = "ListPreferenceDialogFragment.entryValues" + private const val STATE_INDEX = "ListPreferenceDialogFragment.index" + private const val STATE_ENTRIES = "ListPreferenceDialogFragment.entries" + private const val STATE_ENTRY_VALUES = "ListPreferenceDialogFragment.entryValues" fun newInstance(key: String?): ListPreferenceDialogFragment = ListPreferenceDialogFragment().apply { diff --git a/AnkiDroid/src/main/java/com/ichi2/preferences/NumberRangePreferenceCompat.kt b/AnkiDroid/src/main/java/com/ichi2/preferences/NumberRangePreferenceCompat.kt index 0c09037c08e6..ea172d1a4753 100644 --- a/AnkiDroid/src/main/java/com/ichi2/preferences/NumberRangePreferenceCompat.kt +++ b/AnkiDroid/src/main/java/com/ichi2/preferences/NumberRangePreferenceCompat.kt @@ -16,8 +16,8 @@ import androidx.preference.EditTextPreference import androidx.preference.EditTextPreferenceDialogFragmentCompat import com.google.android.material.textview.MaterialTextView import com.ichi2.anki.R +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.utils.getFormattedStringOrPlurals -import com.ichi2.utils.dp import com.ichi2.utils.setPaddingRelative import timber.log.Timber import com.google.android.material.R as MaterialR diff --git a/AnkiDroid/src/main/java/com/ichi2/ui/AxisValueDisplay.kt b/AnkiDroid/src/main/java/com/ichi2/ui/AxisValueDisplay.kt index 75c22c0ee4dd..c477755b776e 100644 --- a/AnkiDroid/src/main/java/com/ichi2/ui/AxisValueDisplay.kt +++ b/AnkiDroid/src/main/java/com/ichi2/ui/AxisValueDisplay.kt @@ -10,7 +10,7 @@ import android.graphics.Rect import android.util.AttributeSet import android.view.View import com.google.android.material.color.MaterialColors -import com.ichi2.utils.dp +import com.ichi2.anki.common.utils.dp import java.util.Locale import kotlin.math.abs import kotlin.math.max diff --git a/AnkiDroid/src/main/java/com/ichi2/ui/FixedEditText.kt b/AnkiDroid/src/main/java/com/ichi2/ui/FixedEditText.kt index 3a26b6754bbe..85121ea1eaef 100644 --- a/AnkiDroid/src/main/java/com/ichi2/ui/FixedEditText.kt +++ b/AnkiDroid/src/main/java/com/ichi2/ui/FixedEditText.kt @@ -45,9 +45,9 @@ import android.view.inputmethod.InputMethodManager import androidx.appcompat.widget.AppCompatEditText import androidx.core.graphics.toColorInt import com.google.android.material.color.MaterialColors -import com.ichi2.anki.R import com.ichi2.utils.AndroidUiUtils.setFocusAndOpenKeyboard import timber.log.Timber +import com.ichi2.anki.common.android.R as CommonR open class FixedEditText : AppCompatEditText { constructor(context: Context) : super(context) @@ -71,7 +71,7 @@ open class FixedEditText : AppCompatEditText { val highlightColor = MaterialColors.getColor( context, - R.attr.editTextHighlightColor, + CommonR.attr.editTextHighlightColor, "#99CCFF".toColorInt(), // light blue color for fallback just-in-case ) setHighlightColor(highlightColor) diff --git a/AnkiDroid/src/main/java/com/ichi2/utils/AndroidUiUtils.kt b/AnkiDroid/src/main/java/com/ichi2/utils/AndroidUiUtils.kt index 90d92c57f103..9cffc158de47 100644 --- a/AnkiDroid/src/main/java/com/ichi2/utils/AndroidUiUtils.kt +++ b/AnkiDroid/src/main/java/com/ichi2/utils/AndroidUiUtils.kt @@ -5,8 +5,6 @@ package com.ichi2.utils import android.app.Activity import android.content.Context import android.view.View -import android.view.Window -import android.view.WindowManager import android.view.inputmethod.InputMethodManager import com.ichi2.anki.compat.showSoftInput @@ -22,20 +20,6 @@ object AndroidUiUtils { currentFocus.showSoftInput() } - /** - * This method is used for setting the focus on an EditText which is used in a dialog - * and for opening the keyboard. - * @param view The EditText which requires the focus to be set. - * @param window The window where the view is present. - */ - fun setFocusAndOpenKeyboard( - view: View, - window: Window, - ) { - view.requestFocus() - window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) - } - /** * Focuses on View and opens the soft keyboard. * @param view The View which requires the focus to be set (typically an EditText). diff --git a/AnkiDroid/src/main/java/com/ichi2/utils/ExceptionUtil.kt b/AnkiDroid/src/main/java/com/ichi2/utils/ExceptionUtil.kt index f62214ff7a5a..524043f48838 100644 --- a/AnkiDroid/src/main/java/com/ichi2/utils/ExceptionUtil.kt +++ b/AnkiDroid/src/main/java/com/ichi2/utils/ExceptionUtil.kt @@ -9,8 +9,33 @@ import com.ichi2.anki.common.crashreporting.CrashReportService import com.ichi2.anki.common.utils.android.showThemedToast import java.io.PrintWriter import java.io.StringWriter +import java.util.Collections +import java.util.IdentityHashMap object ExceptionUtil { + /** This throwable followed lazily by its causes. Cyclic chains repeat instances indefinitely. */ + internal val Throwable.causeChain: Sequence + get() = generateSequence(this) { it.cause } + + /** + * Produces a sequence of this throwable and all throwables reachable through + * [Throwable.cause] or [Throwable.getSuppressed]. + */ + internal fun Throwable.causesAndSuppressed(): Sequence = + sequence { + val seen = Collections.newSetFromMap(IdentityHashMap()) + val pending = ArrayDeque() + pending.add(this@causesAndSuppressed) + while (pending.isNotEmpty()) { + val throwable = pending.removeLast() + if (!seen.add(throwable)) continue + yield(throwable) + // Visit causes first so shared suppressed references cannot truncate the cause chain. + pending.addAll(throwable.suppressed) + throwable.cause?.let { pending.add(it) } + } + } + @CheckResult fun getExceptionMessage(e: Throwable?): String = getExceptionMessage(e, "\n") diff --git a/AnkiDroid/src/main/java/com/ichi2/utils/ImportUtils.kt b/AnkiDroid/src/main/java/com/ichi2/utils/ImportUtils.kt index b5443720bb4c..3ebe6750d569 100644 --- a/AnkiDroid/src/main/java/com/ichi2/utils/ImportUtils.kt +++ b/AnkiDroid/src/main/java/com/ichi2/utils/ImportUtils.kt @@ -20,16 +20,14 @@ import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CommonString import com.ichi2.anki.R import com.ichi2.anki.common.android.appContext -import com.ichi2.anki.common.annotations.NeedsTest import com.ichi2.anki.common.coroutines.applicationScope import com.ichi2.anki.common.crashreporting.CrashReportService import com.ichi2.anki.common.exception.ManuallyReportedException import com.ichi2.anki.common.time.TimeManager import com.ichi2.anki.compat.CompatHelper -import com.ichi2.anki.dialogs.DialogHandler import com.ichi2.anki.dialogs.DialogHandlerMessage import com.ichi2.anki.dialogs.ImportDialog -import com.ichi2.anki.onSelectedCsvForImport +import com.ichi2.anki.openImport import com.ichi2.anki.servicelayer.DebugInfoService import com.ichi2.anki.showImportDialog import com.ichi2.anki.ui.internationalization.sentenceCase @@ -49,6 +47,20 @@ object ImportUtils { // A filename should be shortened if over this threshold private const val FILE_NAME_SHORTENING_THRESHOLD = 100 + /** + * Resolve and cache the source, then start the text importer or store a package confirmation. + * + * Text importer launch happens before this method returns. Package confirmations must be + * dispatched by the caller or by DeckPicker when it resumes. + * + * @return The resolved source metadata and cached path, or details of a preparation or launch + * failure. Success does not mean that the file's contents have been imported. + */ + fun handleFileImport( + activity: Activity, + intent: Intent, + ): ImportResult = FileImporter().handleFileImport(activity, intent) + /** Resolve the source and select its importer without copying files or starting UI. */ fun resolveImport( context: Context, @@ -56,16 +68,15 @@ object ImportUtils { ): ImportResolution = FileImporter().resolveImport(context, intent) /** - * This code is used in multiple places to handle package imports + * Resolve the source and copy it to the cache synchronously on the calling thread. + * Does not launch UI or store a package confirmation. * - * @param context for use in resource resolution and path finding - * @param intent contains the file to import - * @return null if successful, otherwise error message + * @return The resolved source metadata and cached path, or details of a preparation failure. */ - fun handleFileImport( + fun prepareImport( context: Context, intent: Intent, - ): ImportResult = FileImporter().handleFileImport(context, intent) + ): ImportResult = FileImporter().prepareImport(context, intent) /** * Makes a cached copy of the file selected on [intent] and returns its path @@ -115,6 +126,62 @@ object ImportUtils { @SuppressWarnings("WeakerAccess") open class FileImporter { + /** See [ImportUtils.handleFileImport] for the UI and error handling contract. */ + fun handleFileImport( + activity: Activity, + intent: Intent, + ): ImportResult { + Timber.i("IntentHandler/ User requested to view a file") + val extras = if (intent.extras == null) "none" else intent.extras!!.keySet().joinToString(", ") + Timber.i("Intent: %s. Data: %s", intent, extras) + return try { + val uri = getDataUri(intent) + if (uri == null) { + ImportResult.Failure(activity.getString(CommonString.import_error_handle_exception)) + } else { + handleContentProviderFile(activity, uri, intent) + } + } catch (e: Exception) { + CrashReportService.sendExceptionReport(e, "handleFileImport") + Timber.e(e, "failed to handle import intent") + ImportResult.Failure( + humanReadableMessage = activity.getString(CommonString.import_error_handle_exception, e.localizedMessage), + exception = e, + ) + } + } + + /** + * Prepare the source, then start the text importer or store a package confirmation. + * Uses [intent] when supplied, otherwise creates an intent from [importPathUri]. + * + * Preparation failures are returned. Exceptions from starting the importer or storing a + * confirmation propagate to the caller; [handleFileImport] converts them into [ImportResult.Failure]. + */ + fun handleContentProviderFile( + activity: Activity, + importPathUri: Uri, + intent: Intent? = null, + ): ImportResult = + prepareImport(activity, intent ?: Intent().setData(importPathUri)).also { result -> + if (result is ImportResult.Success) { + activity.openImport(result) + } + } + + fun isValidImportType( + context: Context, + importPathUri: Uri, + ): Boolean { + val fileName = getFileNameFromContentProvider(context, importPathUri) + return when { + isDeckPackage(fileName) -> true + isCollectionPackage(fileName) -> true + isValidTextOrDataFile(context, importPathUri) -> true + else -> false + } + } + fun resolveImport( context: Context, intent: Intent, @@ -165,45 +232,23 @@ object ImportUtils { } } - /** - * This code is used in multiple places to handle package imports - * - * @param context for use in resource resolution and path finding - * @param intent contains the file to import - * @return null if successful, otherwise error message - */ - fun handleFileImport( + /** See [ImportUtils.prepareImport] for the preparation and result contract. */ + fun prepareImport( context: Context, intent: Intent, - ): ImportResult { - // This intent is used for opening apkg package files - // We want to go immediately to DeckPicker, clearing any history in the process - Timber.i("IntentHandler/ User requested to view a file") - val extras = if (intent.extras == null) "none" else intent.extras!!.keySet().joinToString(", ") - Timber.i("Intent: %s. Data: %s", intent, extras) - return try { - handleFileImportInternal(context, intent) + ): ImportResult = + try { + when (val resolution = resolveImport(context, intent)) { + is ImportResolution.Failure -> resolution.error + is ImportResolution.ResolvedFile -> cacheImport(context, resolution) + } } catch (e: Exception) { - CrashReportService.sendExceptionReport(e, "handleFileImport") - Timber.e(e, "failed to handle import intent") + CrashReportService.sendExceptionReport(e, "prepareImport") ImportResult.Failure( humanReadableMessage = context.getString(CommonString.import_error_handle_exception, e.localizedMessage), exception = e, ) } - } - - private fun handleFileImportInternal( - context: Context, - intent: Intent, - ): ImportResult { - val importPathUri = getDataUri(intent) - return if (importPathUri != null) { - handleContentProviderFile(context, importPathUri, intent) - } else { - ImportResult.Failure(context.getString(CommonString.import_error_handle_exception)) - } - } fun getFileCachedCopy( context: Context, @@ -239,35 +284,29 @@ object ImportUtils { return getFileCachedCopy(context, uri) } - fun handleContentProviderFile( + private fun cacheImport( context: Context, - importPathUri: Uri, - intent: Intent? = null, + file: ImportResolution.ResolvedFile, ): ImportResult { - val file = - when (val resolution = resolveImport(context, intent ?: Intent().setData(importPathUri))) { - is ImportResolution.Failure -> return resolution.error - is ImportResolution.ResolvedFile -> resolution - } - if (file is ImportResolution.Text) { - (context as Activity).onSelectedCsvForImport(intent ?: Intent().setData(importPathUri)) - return ImportResult.Success - } - // Copy to temporary file val checkFile = try { context.cacheDir.withFileNameSafe(file.source.fileName) } catch (_: SecurityException) { // Do not log the exception: it may interpolate attacker-controlled paths (PII). - Timber.e("Path traversal detected in handleContentProviderFile") + Timber.e("Path traversal detected in cacheImport") return ImportResult.Failure(context.getString(CommonString.import_error_handle_exception, "Invalid path")) } catch (_: IllegalArgumentException) { // Do not log the exception: it may interpolate attacker-controlled paths (PII). - Timber.e("Path traversal detected in handleContentProviderFile") + Timber.e("Path traversal detected in cacheImport") return ImportResult.Failure(context.getString(CommonString.import_error_handle_exception, "Invalid path")) } - val tempOutDir: String = Uri.fromFile(checkFile).encodedPath!! + // The package WebView/backend route expects encoded filenames on disk; CSV uses a raw path. + val tempOutDir = + when (file) { + is ImportResolution.Text -> checkFile.absolutePath + is ImportResolution.DeckPackage, is ImportResolution.CollectionPackage -> Uri.fromFile(checkFile).encodedPath!! + } copyFileToCache(context, file.source.uri, tempOutDir).asErrorDetails()?.let { details -> details.exceptionForReport?.let { CrashReportService.sendExceptionReport(it, "ImportUtils") } @@ -277,21 +316,7 @@ object ImportUtils { exception = details.userFacingException, ) } - sendShowImportFileDialogMsg(tempOutDir) - return ImportResult.Success - } - - fun isValidImportType( - context: Context, - importPathUri: Uri, - ): Boolean { - val fileName = getFileNameFromContentProvider(context, importPathUri) - return when { - isDeckPackage(fileName) -> true - isCollectionPackage(fileName) -> true - isValidTextOrDataFile(context, importPathUri) -> true - else -> false - } + return ImportResult.Success(file, tempOutDir) } private fun isAnkiDatabase(filename: String?): Boolean = filename != null && hasExtension(filename, "anki2") @@ -311,7 +336,6 @@ object ImportUtils { } } - @NeedsTest("Add test for the fallback, ensure the fallback filename \"file_.\" is produced when decoding fails") private fun validateFileName(fileName: String): String { // #6137 - filenames can be too long when URLEncoded val sanitized = sanitizeFileName(fileName) @@ -432,6 +456,14 @@ object ImportUtils { // The selected file may have been deleted since the provider returned its URI. Timber.w(e, "Import source file is unavailable") CacheFileResult.SourceFileUnavailable(e) + } catch (e: IllegalStateException) { + if (e.message?.contains("pending/trashed") == true) { + Timber.w(e, "Import source file is pending or trashed") + CacheFileResult.SourceFileUnavailable(e) + } else { + Timber.w("Could not open import source") + CacheFileResult.Error(e) + } } catch (e: Exception) { Timber.w("Could not open import source") CacheFileResult.Error(e) @@ -462,7 +494,7 @@ object ImportUtils { ) : CacheFileResult() data class SourceFileUnavailable( - val exception: FileNotFoundException, + val exception: Exception, ) : CacheFileResult() data object ContentProviderCrashed : CacheFileResult() @@ -539,24 +571,6 @@ object ImportUtils { } } - /** - * Send a Message to AnkiDroidApp so that the DialogMessageHandler shows the Import apkg dialog. - * @param importPath path of to apkg file which will be imported - */ - private fun sendShowImportFileDialogMsg(importPath: String) { - // Get the filename from the path - val filename = File(importPath).name - - val dialogMessage = - if (isCollectionPackage(filename)) { - CollectionImportReplace(importPath) - } else { - CollectionImportAdd(importPath) - } - // Store the message in AnkiDroidApp message holder, which is loaded later in AnkiActivity.onResume - DialogHandler.storeMessage(dialogMessage.toMessage()) - } - @SuppressLint("LocaleRootUsage") internal fun isDeckPackage(filename: String?): Boolean = filename != null && filename.lowercase(Locale.ROOT).endsWith(".apkg") && "collection.apkg" != filename @@ -626,7 +640,10 @@ object ImportUtils { } sealed class ImportResult { - data object Success : ImportResult() + data class Success( + val file: ImportResolution.ResolvedFile, + val path: String, + ) : ImportResult() data class Failure( val humanReadableMessage: String, diff --git a/AnkiDroid/src/main/java/com/ichi2/utils/LanguageUtil.kt b/AnkiDroid/src/main/java/com/ichi2/utils/LanguageUtil.kt index 591755dcc02a..b86a2a39a7fc 100644 --- a/AnkiDroid/src/main/java/com/ichi2/utils/LanguageUtil.kt +++ b/AnkiDroid/src/main/java/com/ichi2/utils/LanguageUtil.kt @@ -8,8 +8,10 @@ import android.content.res.Resources import androidx.annotation.StringRes import androidx.core.os.ConfigurationCompat import androidx.fragment.app.Fragment +import com.ichi2.anki.CollectionManager import com.ichi2.anki.CommonString import com.ichi2.anki.backend.AnkiBackendLanguage +import com.ichi2.anki.backend.getLocales import com.ichi2.anki.common.android.appContext import com.ichi2.anki.common.preferences.sharedPrefs import com.ichi2.anki.compat.CompatHelper @@ -369,3 +371,16 @@ object LanguageUtil { */ fun withUnicodeIsolation(s: String): String = "\u2068$s\u2069" } + +data class LanguageDebugInfo( + val systemLocale: String?, + val appLocale: String?, + val backendLocales: List?, +) + +fun getLanguageDebugInfo(context: Context): LanguageDebugInfo = + LanguageDebugInfo( + systemLocale = runCatching { LanguageUtil.getSystemLocale().toLanguageTag() }.getOrNull(), + appLocale = runCatching { context.sharedPrefs().getString("language", LanguageUtil.SYSTEM_LANGUAGE_TAG) }.getOrNull(), + backendLocales = runCatching { CollectionManager.getBackend().getLocales().all }.getOrNull(), + ) diff --git a/AnkiDroid/src/main/java/com/ichi2/utils/MenuUtils.kt b/AnkiDroid/src/main/java/com/ichi2/utils/MenuUtils.kt index 191e9e47b1b3..0343de74cf64 100644 --- a/AnkiDroid/src/main/java/com/ichi2/utils/MenuUtils.kt +++ b/AnkiDroid/src/main/java/com/ichi2/utils/MenuUtils.kt @@ -11,7 +11,8 @@ import androidx.appcompat.view.menu.MenuBuilder import androidx.appcompat.view.menu.MenuItemImpl import androidx.core.view.forEach import com.google.android.material.color.MaterialColors -import com.ichi2.anki.R +import com.ichi2.anki.common.utils.dp +import com.ichi2.anki.common.android.R as CommonR private const val DEFAULT_HORIZONTAL_PADDING = 4F @@ -90,14 +91,14 @@ fun Context.increaseHorizontalPaddingOfMenuIcons( /** * Recursively mutates and tints the icons of the items of the given overflow or popup menu - * with the color [R.attr.overflowAndPopupMenuIconColor] that is specified in the theme. + * with the color [CommonR.attr.overflowAndPopupMenuIconColor] that is specified in the theme. * Has no effect for items that have no icon. */ fun Context.tintOverflowMenuIcons( menu: Menu, skipIf: ((MenuItem) -> Boolean)? = null, ) { - val iconColor = MaterialColors.getColor(this, R.attr.overflowAndPopupMenuIconColor, 0) + val iconColor = MaterialColors.getColor(this, CommonR.attr.overflowAndPopupMenuIconColor, 0) menu.overflowItemsRecursive().forEach { item -> if (skipIf == null || !skipIf(item)) { diff --git a/AnkiDroid/src/main/java/com/ichi2/utils/ViewUtils.kt b/AnkiDroid/src/main/java/com/ichi2/utils/ViewUtils.kt index 52e139852c22..6c88483685f9 100644 --- a/AnkiDroid/src/main/java/com/ichi2/utils/ViewUtils.kt +++ b/AnkiDroid/src/main/java/com/ichi2/utils/ViewUtils.kt @@ -3,37 +3,17 @@ package com.ichi2.utils import android.app.Activity -import android.content.Context import android.content.res.Resources -import android.graphics.Rect -import android.view.MotionEvent import android.view.View import androidx.core.view.OnReceiveContentListener import androidx.draganddrop.DropHelper +import com.ichi2.anki.common.utils.Dp /** @see View.performClick */ fun View.performClickIfEnabled() { if (isEnabled) performClick() } -/** - * Performs a hit test using the raw coordinates of the provided [MotionEvent] - */ -fun View.rawHitTest(event: MotionEvent): Boolean { - val location = IntArray(2) - getLocationOnScreen(location) - - val rect = Rect() - getHitRect(rect) - - rect.left += location[0] - rect.top += location[1] - rect.right += location[0] - rect.bottom += location[1] - - return rect.contains(event.rawX.toInt(), event.rawY.toInt()) -} - /** * If possible, configures a [View] for drag and drop operations, including highlighting that * indicates the view is a drop target. Sets a listener that enables the view to handle dropped data. @@ -113,33 +93,6 @@ fun View.updatePaddingRelative( ) } -/** Returns a [Dp] instance equal to this [Int] number of display pixels. */ -val Int.dp - get() = Dp(dp = this.toFloat()) - -val Float.dp - get() = Dp(dp = this) - -val Double.dp - get() = Dp(dp = this.toFloat()) - -/** - * Helper for 'display pixels' to 'pixels' conversions - */ -@JvmInline -value class Dp( - val dp: Float, -) : Comparable { - // TODO: improve once we have context parameters - fun toPx(context: Context) = dp.dpToPx(context) - - operator fun plus(other: Dp) = Dp(dp = dp + other.dp) - - override fun compareTo(other: Dp) = dp.compareTo(other.dp) -} - -private fun Float.dpToPx(context: Context): Int = (this * context.resources.displayMetrics.density + 0.5f).toInt() - fun View.isRtl() = isRtl(resources) fun isRtl(res: Resources): Boolean = res.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL diff --git a/AnkiDroid/src/main/java/com/ichi2/widget/WidgetConfigDestination.kt b/AnkiDroid/src/main/java/com/ichi2/widget/WidgetConfigDestination.kt new file mode 100644 index 000000000000..deb5cfb1d287 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/widget/WidgetConfigDestination.kt @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.widget + +import android.appwidget.AppWidgetManager +import android.content.Context +import android.content.Intent +import com.ichi2.anki.common.destinations.WidgetConfigDestination +import com.ichi2.widget.cardanalysis.CardAnalysisWidgetConfig +import com.ichi2.widget.deckpicker.DeckPickerWidgetConfig + +fun WidgetConfigDestination.toIntent(context: Context): Intent { + val activity = + when (this) { + is WidgetConfigDestination.CardAnalysis -> CardAnalysisWidgetConfig::class.java + is WidgetConfigDestination.DeckPicker -> DeckPickerWidgetConfig::class.java + } + return Intent(context, activity).apply { + putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/widget/cardanalysis/CardAnalysisWidgetConfig.kt b/AnkiDroid/src/main/java/com/ichi2/widget/cardanalysis/CardAnalysisWidgetConfig.kt index 735464be36df..5e8320f7c2df 100644 --- a/AnkiDroid/src/main/java/com/ichi2/widget/cardanalysis/CardAnalysisWidgetConfig.kt +++ b/AnkiDroid/src/main/java/com/ichi2/widget/cardanalysis/CardAnalysisWidgetConfig.kt @@ -90,7 +90,7 @@ class CardAnalysisWidgetConfig : AnkiActivity(R.layout.activity_card_analysis_wi deck = BundleCompat.getParcelable( savedInstanceState, - KEY_DECK, + STATE_DECK, SelectableDeck.Deck::class.java, ) binding.deckName.text = deck?.name @@ -109,7 +109,7 @@ class CardAnalysisWidgetConfig : AnkiActivity(R.layout.activity_card_analysis_wi override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - outState.putParcelable(KEY_DECK, deck) + outState.putParcelable(STATE_DECK, deck) } override fun onDestroy() { @@ -209,6 +209,6 @@ class CardAnalysisWidgetConfig : AnkiActivity(R.layout.activity_card_analysis_wi } companion object { - private const val KEY_DECK = "key_deck" + private const val STATE_DECK = "key_deck" } } diff --git a/AnkiDroid/src/main/java/com/ichi2/widget/deckpicker/DeckPickerWidgetConfig.kt b/AnkiDroid/src/main/java/com/ichi2/widget/deckpicker/DeckPickerWidgetConfig.kt index f12999bf1f4f..fe7ea0706244 100644 --- a/AnkiDroid/src/main/java/com/ichi2/widget/deckpicker/DeckPickerWidgetConfig.kt +++ b/AnkiDroid/src/main/java/com/ichi2/widget/deckpicker/DeckPickerWidgetConfig.kt @@ -31,6 +31,7 @@ import com.ichi2.anki.CommonPlurals import com.ichi2.anki.CommonString import com.ichi2.anki.common.android.AnkiBroadcastReceiver import com.ichi2.anki.common.utils.android.showThemedToast +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.common.utils.ext.unregisterReceiverSilently import com.ichi2.anki.dialogs.DeckSelectionDialog import com.ichi2.anki.dialogs.DiscardChangesDialog @@ -45,7 +46,6 @@ import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.anki.startup.ensureStorageIsReady import com.ichi2.anki.widgets.R import com.ichi2.anki.widgets.databinding.WidgetDeckPickerConfigBinding -import com.ichi2.utils.dp import com.ichi2.widget.AppWidgetId.Companion.INVALID_APPWIDGET_ID import com.ichi2.widget.AppWidgetId.Companion.getAppWidgetId import com.ichi2.widget.AppWidgetId.Companion.updateWidget diff --git a/AnkiDroid/src/main/res/color/chip_stroke_color_checked_primary.xml b/AnkiDroid/src/main/res/color/chip_stroke_color_checked_primary.xml new file mode 100644 index 000000000000..e231dc0c67ae --- /dev/null +++ b/AnkiDroid/src/main/res/color/chip_stroke_color_checked_primary.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/AnkiDroid/src/main/res/drawable-ldrtl/shadow_left.xml b/AnkiDroid/src/main/res/drawable-ldrtl/shadow_left.xml new file mode 100644 index 000000000000..e98211140362 --- /dev/null +++ b/AnkiDroid/src/main/res/drawable-ldrtl/shadow_left.xml @@ -0,0 +1,8 @@ + + + + diff --git a/AnkiDroid/src/main/res/drawable/calendar_date_range.xml b/AnkiDroid/src/main/res/drawable/calendar_date_range.xml index d8f2936ada7d..01c8b32d04aa 100644 --- a/AnkiDroid/src/main/res/drawable/calendar_date_range.xml +++ b/AnkiDroid/src/main/res/drawable/calendar_date_range.xml @@ -1,4 +1,9 @@ diff --git a/AnkiDroid/src/main/res/drawable/ic_add_bell.xml b/AnkiDroid/src/main/res/drawable/ic_add_bell.xml index cc0d8aa062bd..d28167651a4d 100644 --- a/AnkiDroid/src/main/res/drawable/ic_add_bell.xml +++ b/AnkiDroid/src/main/res/drawable/ic_add_bell.xml @@ -1,3 +1,10 @@ + + SPDX-License-Identifier: Apache-2.0 + SPDX-FileCopyrightText: Google LLC + SPDX-FileComment: Style: Filled + SPDX-FileComment: Derived from bar_chart. + SPDX-FileComment: Modified (David Allison, 2021): left bar top moved from 9.2 to 13.2; right bar top moved from 13 to 9. + Source: https://fonts.gstatic.com/s/i/materialicons/bar_chart/v1/24px.xml +--> - + diff --git a/AnkiDroid/src/main/res/drawable/ic_card_state_learning.xml b/AnkiDroid/src/main/res/drawable/ic_card_state_learning.xml deleted file mode 100644 index 175cb40916ca..000000000000 --- a/AnkiDroid/src/main/res/drawable/ic_card_state_learning.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/AnkiDroid/src/main/res/drawable/ic_card_state_new.xml b/AnkiDroid/src/main/res/drawable/ic_card_state_new.xml deleted file mode 100644 index 419a80c930b4..000000000000 --- a/AnkiDroid/src/main/res/drawable/ic_card_state_new.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/AnkiDroid/src/main/res/drawable/ic_card_state_review.xml b/AnkiDroid/src/main/res/drawable/ic_card_state_review.xml deleted file mode 100644 index 0a48a8c49228..000000000000 --- a/AnkiDroid/src/main/res/drawable/ic_card_state_review.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/AnkiDroid/src/main/res/drawable/ic_card_state_suspended.xml b/AnkiDroid/src/main/res/drawable/ic_card_state_suspended.xml deleted file mode 100644 index 7179f5c0f8f7..000000000000 --- a/AnkiDroid/src/main/res/drawable/ic_card_state_suspended.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/AnkiDroid/src/main/res/drawable/ic_cards_star.xml b/AnkiDroid/src/main/res/drawable/ic_cards_star.xml index 664ce357feca..58007b06a263 100644 --- a/AnkiDroid/src/main/res/drawable/ic_cards_star.xml +++ b/AnkiDroid/src/main/res/drawable/ic_cards_star.xml @@ -1,3 +1,10 @@ + - + SPDX-License-Identifier: Apache-2.0 + SPDX-FileCopyrightText: Google LLC + SPDX-FileCopyrightText: Copyright (C) 2026 The Android Open Source Project + SPDX-FileComment: Style: Outlined + SPDX-FileComment: Material Symbols; FILL=0, wght=400, GRAD=0, opsz=24 + Source: https://raw.githubusercontent.com/google/material-design-icons/10ecc14790612ca8fd164e3f4ffe9c16fc50d5b7/symbols/android/input/materialsymbolsoutlined/input_24px.xml +--> diff --git a/AnkiDroid/src/main/res/drawable/ic_color_lens_white_24dp.xml b/AnkiDroid/src/main/res/drawable/ic_color_lens_white_24dp.xml index 2829565abd19..47b7b4283e59 100644 --- a/AnkiDroid/src/main/res/drawable/ic_color_lens_white_24dp.xml +++ b/AnkiDroid/src/main/res/drawable/ic_color_lens_white_24dp.xml @@ -1,4 +1,10 @@ + + SPDX-License-Identifier: Apache-2.0 + SPDX-FileCopyrightText: Google LLC + SPDX-FileCopyrightText: Copyright 2025, Google Material Design Icons + SPDX-FileComment: Style: Outlined + SPDX-FileComment: Material Symbols; FILL=0, wght=400, GRAD=0, opsz=24 + Source: https://raw.githubusercontent.com/google/material-design-icons/10ecc14790612ca8fd164e3f4ffe9c16fc50d5b7/symbols/android/deselect/materialsymbolsoutlined/deselect_24px.xml +--> diff --git a/AnkiDroid/src/main/res/drawable/ic_draw_filled.xml b/AnkiDroid/src/main/res/drawable/ic_draw_filled.xml index c4265b0174d2..dc6a209aa0e8 100644 --- a/AnkiDroid/src/main/res/drawable/ic_draw_filled.xml +++ b/AnkiDroid/src/main/res/drawable/ic_draw_filled.xml @@ -1,3 +1,10 @@ + diff --git a/AnkiDroid/src/main/res/drawable/ic_edit_off.xml b/AnkiDroid/src/main/res/drawable/ic_edit_off.xml index 1ea20ab1b7dd..c4f6ce0097d2 100644 --- a/AnkiDroid/src/main/res/drawable/ic_edit_off.xml +++ b/AnkiDroid/src/main/res/drawable/ic_edit_off.xml @@ -1,3 +1,10 @@ + diff --git a/AnkiDroid/src/main/res/drawable/ic_export_notes.xml b/AnkiDroid/src/main/res/drawable/ic_export_notes.xml index 0e01a1ff3eb0..d64a4d12b1c1 100644 --- a/AnkiDroid/src/main/res/drawable/ic_export_notes.xml +++ b/AnkiDroid/src/main/res/drawable/ic_export_notes.xml @@ -1,8 +1,11 @@ - + SPDX-License-Identifier: Apache-2.0 + SPDX-FileCopyrightText: Google LLC + SPDX-FileCopyrightText: Copyright (C) 2026 The Android Open Source Project + SPDX-FileComment: Style: Outlined + SPDX-FileComment: Material Symbols; FILL=0, wght=400, GRAD=0, opsz=24 + Source: https://raw.githubusercontent.com/google/material-design-icons/10ecc14790612ca8fd164e3f4ffe9c16fc50d5b7/symbols/android/export_notes/materialsymbolsoutlined/export_notes_24px.xml +--> - + SPDX-License-Identifier: Apache-2.0 + SPDX-FileCopyrightText: Google LLC + SPDX-FileCopyrightText: Copyright (C) 2026 The Android Open Source Project + SPDX-FileComment: Style: Outlined + SPDX-FileComment: Material Symbols; FILL=0, wght=400, GRAD=0, opsz=24 + Source: https://raw.githubusercontent.com/google/material-design-icons/10ecc14790612ca8fd164e3f4ffe9c16fc50d5b7/symbols/android/find_replace/materialsymbolsoutlined/find_replace_24px.xml +--> + SPDX-License-Identifier: Apache-2.0 + SPDX-FileCopyrightText: Google LLC + SPDX-FileComment: Style: Outlined + SPDX-FileComment: Derived from payments. + SPDX-FileComment: Modified (joshakaw, 2021): removed the central money circle and rounded the rear card corners. + Source: https://raw.githubusercontent.com/google/material-design-icons/10ecc14790612ca8fd164e3f4ffe9c16fc50d5b7/android/navigation/payments/materialiconsoutlined/black/res/drawable/outline_payments_24.xml +--> - \ No newline at end of file + diff --git a/AnkiDroid/src/main/res/drawable/ic_forum_black_24dp.xml b/AnkiDroid/src/main/res/drawable/ic_forum_black_24dp.xml index 4bc25443127f..5f96d1dc52d1 100644 --- a/AnkiDroid/src/main/res/drawable/ic_forum_black_24dp.xml +++ b/AnkiDroid/src/main/res/drawable/ic_forum_black_24dp.xml @@ -1,3 +1,9 @@ + - + SPDX-License-Identifier: Apache-2.0 + SPDX-FileCopyrightText: Google LLC + SPDX-FileCopyrightText: Copyright (C) 2026 The Android Open Source Project + SPDX-FileComment: Style: Outlined + SPDX-FileComment: Material Symbols; FILL=0, wght=400, GRAD=0, opsz=24 + Source: https://raw.githubusercontent.com/google/material-design-icons/10ecc14790612ca8fd164e3f4ffe9c16fc50d5b7/symbols/android/rule/materialsymbolsoutlined/rule_24px.xml +--> + \ No newline at end of file diff --git a/AnkiDroid/src/main/res/drawable/ic_horizontal_rule_black_24dp.xml b/AnkiDroid/src/main/res/drawable/ic_horizontal_rule_black_24dp.xml deleted file mode 100644 index 6d9458dd36a3..000000000000 --- a/AnkiDroid/src/main/res/drawable/ic_horizontal_rule_black_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - \ No newline at end of file diff --git a/AnkiDroid/src/main/res/drawable/ic_image.xml b/AnkiDroid/src/main/res/drawable/ic_image.xml index 3a70e029d65c..8e6ff22dd45e 100644 --- a/AnkiDroid/src/main/res/drawable/ic_image.xml +++ b/AnkiDroid/src/main/res/drawable/ic_image.xml @@ -1,8 +1,10 @@ + SPDX-License-Identifier: Apache-2.0 + SPDX-FileCopyrightText: Copyright (c) Google LLC + SPDX-FileComment: Style: Outlined + SPDX-FileComment: Material Symbols; FILL=0, wght=400, GRAD=0, opsz=24 + Source: https://raw.githubusercontent.com/google/material-design-icons/10ecc14790612ca8fd164e3f4ffe9c16fc50d5b7/symbols/android/image/materialsymbolsoutlined/image_24px.xml +--> diff --git a/AnkiDroid/src/main/res/drawable/ic_menu_24.xml b/AnkiDroid/src/main/res/drawable/ic_menu_24.xml index 7a5ff605a821..071de95668f4 100644 --- a/AnkiDroid/src/main/res/drawable/ic_menu_24.xml +++ b/AnkiDroid/src/main/res/drawable/ic_menu_24.xml @@ -1,10 +1,10 @@ - + SPDX-License-Identifier: Apache-2.0 + SPDX-FileCopyrightText: Google LLC + SPDX-FileComment: Style: Outlined + SPDX-FileComment: Material Symbols; FILL=0, wght=400, GRAD=0, opsz=24 + Source: https://raw.githubusercontent.com/google/material-design-icons/10ecc14790612ca8fd164e3f4ffe9c16fc50d5b7/symbols/android/menu/materialsymbolsoutlined/menu_24px.xml +--> diff --git a/AnkiDroid/src/main/res/drawable/ic_mic_outlined.xml b/AnkiDroid/src/main/res/drawable/ic_mic_outlined.xml index 38c78a5c9b37..0920d45b9954 100644 --- a/AnkiDroid/src/main/res/drawable/ic_mic_outlined.xml +++ b/AnkiDroid/src/main/res/drawable/ic_mic_outlined.xml @@ -1,3 +1,10 @@ + diff --git a/AnkiDroid/src/main/res/drawable/ic_notes.xml b/AnkiDroid/src/main/res/drawable/ic_notes.xml index f43b9066b7ca..81f7e9ce5e4b 100644 --- a/AnkiDroid/src/main/res/drawable/ic_notes.xml +++ b/AnkiDroid/src/main/res/drawable/ic_notes.xml @@ -1,3 +1,10 @@ + diff --git a/AnkiDroid/src/main/res/drawable/ic_paste.xml b/AnkiDroid/src/main/res/drawable/ic_paste.xml index ccfa8e28f8af..dbb9105e030d 100644 --- a/AnkiDroid/src/main/res/drawable/ic_paste.xml +++ b/AnkiDroid/src/main/res/drawable/ic_paste.xml @@ -1,3 +1,10 @@ + + SPDX-License-Identifier: Apache-2.0 + SPDX-FileCopyrightText: Copyright (c) Google LLC + SPDX-FileComment: Style: Outlined + SPDX-FileComment: Material Symbols; FILL=0, wght=400, GRAD=0, opsz=24 + Source: https://raw.githubusercontent.com/google/material-design-icons/10ecc14790612ca8fd164e3f4ffe9c16fc50d5b7/symbols/android/photo_library/materialsymbolsoutlined/photo_library_24px.xml +--> diff --git a/AnkiDroid/src/main/res/drawable/ic_replace_audio.xml b/AnkiDroid/src/main/res/drawable/ic_replace_audio.xml index 6238f4e702f9..44e9f113525e 100644 --- a/AnkiDroid/src/main/res/drawable/ic_replace_audio.xml +++ b/AnkiDroid/src/main/res/drawable/ic_replace_audio.xml @@ -1,3 +1,10 @@ + - + SPDX-License-Identifier: Apache-2.0 + SPDX-FileCopyrightText: Google LLC + SPDX-FileCopyrightText: Copyright (C) 2026 The Android Open Source Project + SPDX-FileComment: Style: Outlined + SPDX-FileComment: Material Symbols; FILL=0, wght=400, GRAD=0, opsz=24 + Source: https://raw.githubusercontent.com/google/material-design-icons/10ecc14790612ca8fd164e3f4ffe9c16fc50d5b7/symbols/android/low_priority/materialsymbolsoutlined/low_priority_24px.xml +--> - \ No newline at end of file + diff --git a/AnkiDroid/src/main/res/drawable/ic_round_favorite_outline.xml b/AnkiDroid/src/main/res/drawable/ic_round_favorite_outline.xml index 4f11b15563f3..4b901be70faa 100644 --- a/AnkiDroid/src/main/res/drawable/ic_round_favorite_outline.xml +++ b/AnkiDroid/src/main/res/drawable/ic_round_favorite_outline.xml @@ -1,3 +1,10 @@ + diff --git a/AnkiDroid/src/main/res/drawable/ic_running_clock.xml b/AnkiDroid/src/main/res/drawable/ic_running_clock.xml index a6091c1551e6..6f4cf3fa1fa4 100644 --- a/AnkiDroid/src/main/res/drawable/ic_running_clock.xml +++ b/AnkiDroid/src/main/res/drawable/ic_running_clock.xml @@ -1,3 +1,10 @@ + diff --git a/AnkiDroid/src/main/res/drawable/ic_star.xml b/AnkiDroid/src/main/res/drawable/ic_star.xml index 8ecb6a11546a..48da9b6eea92 100644 --- a/AnkiDroid/src/main/res/drawable/ic_star.xml +++ b/AnkiDroid/src/main/res/drawable/ic_star.xml @@ -1,3 +1,9 @@ + diff --git a/AnkiDroid/src/main/res/drawable/ic_star_black_24.xml b/AnkiDroid/src/main/res/drawable/ic_star_black_24.xml index 33832947ef11..64943827ea0b 100644 --- a/AnkiDroid/src/main/res/drawable/ic_star_black_24.xml +++ b/AnkiDroid/src/main/res/drawable/ic_star_black_24.xml @@ -1,3 +1,9 @@ + diff --git a/AnkiDroid/src/main/res/drawable/ic_star_white_bordered_24dp.xml b/AnkiDroid/src/main/res/drawable/ic_star_white_bordered_24dp.xml index ef9ba6654ce9..877aadc85792 100644 --- a/AnkiDroid/src/main/res/drawable/ic_star_white_bordered_24dp.xml +++ b/AnkiDroid/src/main/res/drawable/ic_star_white_bordered_24dp.xml @@ -1,3 +1,10 @@ + diff --git a/AnkiDroid/src/main/res/drawable/ic_switch_profile.xml b/AnkiDroid/src/main/res/drawable/ic_switch_profile.xml index 345bff7b737d..c106f665e258 100644 --- a/AnkiDroid/src/main/res/drawable/ic_switch_profile.xml +++ b/AnkiDroid/src/main/res/drawable/ic_switch_profile.xml @@ -1,3 +1,10 @@ + diff --git a/AnkiDroid/src/main/res/drawable/ic_warning_24.xml b/AnkiDroid/src/main/res/drawable/ic_warning_24.xml index 74fcc6f74720..f5eab40d8822 100644 --- a/AnkiDroid/src/main/res/drawable/ic_warning_24.xml +++ b/AnkiDroid/src/main/res/drawable/ic_warning_24.xml @@ -1,3 +1,9 @@ + + - \ No newline at end of file + diff --git a/AnkiDroid/src/main/res/drawable/outline_arrow_downward_alt_24.xml b/AnkiDroid/src/main/res/drawable/outline_arrow_downward_alt_24.xml index 64f4d2adf853..19a7cfb80591 100644 --- a/AnkiDroid/src/main/res/drawable/outline_arrow_downward_alt_24.xml +++ b/AnkiDroid/src/main/res/drawable/outline_arrow_downward_alt_24.xml @@ -1,3 +1,10 @@ + diff --git a/AnkiDroid/src/main/res/drawable/outline_arrow_insert_24.xml b/AnkiDroid/src/main/res/drawable/outline_arrow_insert_24.xml index cc4e2d51d8f1..be7976d4e6ba 100644 --- a/AnkiDroid/src/main/res/drawable/outline_arrow_insert_24.xml +++ b/AnkiDroid/src/main/res/drawable/outline_arrow_insert_24.xml @@ -1,3 +1,10 @@ + diff --git a/AnkiDroid/src/main/res/drawable/outline_arrow_upward_alt_24.xml b/AnkiDroid/src/main/res/drawable/outline_arrow_upward_alt_24.xml index 7e05aa4a2f58..7d28264bfbb4 100644 --- a/AnkiDroid/src/main/res/drawable/outline_arrow_upward_alt_24.xml +++ b/AnkiDroid/src/main/res/drawable/outline_arrow_upward_alt_24.xml @@ -1,3 +1,10 @@ + diff --git a/AnkiDroid/src/main/res/drawable/wallpaper_icon.xml b/AnkiDroid/src/main/res/drawable/wallpaper_icon.xml index 08cbe44dcb4f..0dd1a539c14f 100644 --- a/AnkiDroid/src/main/res/drawable/wallpaper_icon.xml +++ b/AnkiDroid/src/main/res/drawable/wallpaper_icon.xml @@ -1,3 +1,9 @@ + diff --git a/AnkiDroid/src/main/res/layout-sw600dp/activity_card_browser.xml b/AnkiDroid/src/main/res/layout-sw600dp/activity_card_browser.xml index 4a4525f0f83e..8a1260c612b3 100644 --- a/AnkiDroid/src/main/res/layout-sw600dp/activity_card_browser.xml +++ b/AnkiDroid/src/main/res/layout-sw600dp/activity_card_browser.xml @@ -7,7 +7,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - + \ No newline at end of file diff --git a/AnkiDroid/src/main/res/layout-sw600dp/activity_card_template_editor.xml b/AnkiDroid/src/main/res/layout-sw600dp/activity_card_template_editor.xml index 5685a364eec2..a2470e175671 100644 --- a/AnkiDroid/src/main/res/layout-sw600dp/activity_card_template_editor.xml +++ b/AnkiDroid/src/main/res/layout-sw600dp/activity_card_template_editor.xml @@ -14,7 +14,7 @@ - - + diff --git a/AnkiDroid/src/main/res/layout-sw600dp/activity_homescreen.xml b/AnkiDroid/src/main/res/layout-sw600dp/activity_homescreen.xml index 7e9aea8235ae..0aeb98ef0e13 100644 --- a/AnkiDroid/src/main/res/layout-sw600dp/activity_homescreen.xml +++ b/AnkiDroid/src/main/res/layout-sw600dp/activity_homescreen.xml @@ -17,7 +17,7 @@ - - + diff --git a/AnkiDroid/src/main/res/layout-sw600dp/activity_note_editor.xml b/AnkiDroid/src/main/res/layout-sw600dp/activity_note_editor.xml index 621224425abf..d238deb02a54 100644 --- a/AnkiDroid/src/main/res/layout-sw600dp/activity_note_editor.xml +++ b/AnkiDroid/src/main/res/layout-sw600dp/activity_note_editor.xml @@ -15,7 +15,7 @@ - - + \ No newline at end of file diff --git a/AnkiDroid/src/main/res/layout/activity_homescreen.xml b/AnkiDroid/src/main/res/layout/activity_homescreen.xml index 3fba44ff39fb..fce38a179925 100644 --- a/AnkiDroid/src/main/res/layout/activity_homescreen.xml +++ b/AnkiDroid/src/main/res/layout/activity_homescreen.xml @@ -38,6 +38,7 @@ android:layout_gravity="bottom" android:background="?attr/colorSurface" android:visibility="gone" + app:layout_behavior="com.google.android.material.behavior.HideViewOnScrollBehavior" app:labelVisibilityMode="labeled" app:menu="@menu/bottom_nav_menu" /> diff --git a/AnkiDroid/src/main/res/layout/activity_info.xml b/AnkiDroid/src/main/res/layout/activity_info.xml index 782ff94bb64a..c6112a89e608 100644 --- a/AnkiDroid/src/main/res/layout/activity_info.xml +++ b/AnkiDroid/src/main/res/layout/activity_info.xml @@ -40,11 +40,10 @@ android:layout_weight="1" android:fadingEdge="vertical" android:gravity="center"> - + android:layout_width="match_parent" + android:layout_height="match_parent" /> @@ -59,7 +59,7 @@ android:layout_height="wrap_content" app:icon="@drawable/ic_delete" style="@style/Widget.Material3.Button.IconButton" - app:iconTint="@color/white"/> + app:iconTint="?attr/actionBarTextColor"/> + app:iconTint="?attr/actionBarTextColor"/> + app:backgroundTint="?attr/fab_normal"/> \ No newline at end of file diff --git a/AnkiDroid/src/main/res/layout/dialog_add_edit_reminder.xml b/AnkiDroid/src/main/res/layout/dialog_add_edit_reminder.xml index c2f9e0fddb11..e6dee7822987 100644 --- a/AnkiDroid/src/main/res/layout/dialog_add_edit_reminder.xml +++ b/AnkiDroid/src/main/res/layout/dialog_add_edit_reminder.xml @@ -137,8 +137,7 @@ android:id="@+id/add_edit_reminder_card_threshold_section" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal" - tools:ignore="UselessParent"> + android:orientation="horizontal"> + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AnkiDroid/src/main/res/layout/fragment_custom_study.xml b/AnkiDroid/src/main/res/layout/fragment_custom_study.xml index f6a647f921cb..cd8d4eefc014 100644 --- a/AnkiDroid/src/main/res/layout/fragment_custom_study.xml +++ b/AnkiDroid/src/main/res/layout/fragment_custom_study.xml @@ -39,21 +39,83 @@ android:text="" android:textSize="16sp" /> - + android:orientation="horizontal"> - + + - + android:layout_weight="1" + app:errorEnabled="true" + app:suffixTextAppearance="@style/TextAppearance.MaterialComponents.Body1"> + + + + + + + + - - + @@ -339,5 +341,5 @@ - + diff --git a/AnkiDroid/src/main/res/layout/fragment_note_editor.xml b/AnkiDroid/src/main/res/layout/fragment_note_editor.xml index cf016ac66b3a..0489cdef747c 100644 --- a/AnkiDroid/src/main/res/layout/fragment_note_editor.xml +++ b/AnkiDroid/src/main/res/layout/fragment_note_editor.xml @@ -177,4 +177,8 @@ android:id="@+id/editor_toolbar" android:layout_width="match_parent" android:layout_height="wrap_content"/> + diff --git a/AnkiDroid/src/main/res/layout/fragment_reviewer.xml b/AnkiDroid/src/main/res/layout/fragment_reviewer.xml index a13c0bd006c2..1cae4d926f45 100644 --- a/AnkiDroid/src/main/res/layout/fragment_reviewer.xml +++ b/AnkiDroid/src/main/res/layout/fragment_reviewer.xml @@ -91,7 +91,7 @@ android:layout_weight="1" android:layout_marginHorizontal="@dimen/reviewer_side_margin"> - - \ No newline at end of file + diff --git a/AnkiDroid/src/main/res/layout/fragment_study_options.xml b/AnkiDroid/src/main/res/layout/fragment_study_options.xml index 024a49dc0809..33706fa4bca7 100644 --- a/AnkiDroid/src/main/res/layout/fragment_study_options.xml +++ b/AnkiDroid/src/main/res/layout/fragment_study_options.xml @@ -13,6 +13,7 @@ android:layout_width="15dp" android:layout_height="0dp" app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" android:background="@drawable/shadow_left" android:visibility="gone"/> @@ -217,7 +218,7 @@ diff --git a/AnkiDroid/src/main/res/layout/view_permissions_item.xml b/AnkiDroid/src/main/res/layout/view_permissions_item.xml index 6510ed9422b6..17507400c305 100644 --- a/AnkiDroid/src/main/res/layout/view_permissions_item.xml +++ b/AnkiDroid/src/main/res/layout/view_permissions_item.xml @@ -15,12 +15,11 @@ android:id="@+id/icon" android:layout_width="24dp" android:layout_height="24dp" - android:layout_marginTop="20dp" android:layout_marginEnd="8dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/guideline_front" - app:layout_constraintBottom_toBottomOf="@id/title" - app:layout_constraintTop_toTopOf="@id/title" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toTopOf="parent" tools:src="@drawable/ic_action_mic" tools:tint="?attr/colorControlNormal"/> @@ -65,4 +64,4 @@ android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_begin="56dp" /> - \ No newline at end of file + diff --git a/AnkiDroid/src/main/res/menu/card_template_editor.xml b/AnkiDroid/src/main/res/menu/card_template_editor.xml index ee6a3f62c118..aeaddeabdecb 100644 --- a/AnkiDroid/src/main/res/menu/card_template_editor.xml +++ b/AnkiDroid/src/main/res/menu/card_template_editor.xml @@ -20,11 +20,9 @@ android:id="@+id/action_add" android:title="@string/add_card_type" ankidroid:showAsAction="never"/> - - - - - - @@ -54,8 +48,6 @@ - - @@ -97,102 +89,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -202,27 +98,4 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/AnkiDroid/src/main/res/values/colors.xml b/AnkiDroid/src/main/res/values/colors.xml index f4412725a513..94d64c86bfe3 100644 --- a/AnkiDroid/src/main/res/values/colors.xml +++ b/AnkiDroid/src/main/res/values/colors.xml @@ -7,23 +7,8 @@ #B00000FF #0099FF - #00000000 - #ffffff - #000000 - #80000000 - - #66FFFFFF #80808080 - - - - #81c995 - #388E3C - - #fdd633 - #DE4900 - #D1D0CE #000000 @@ -44,19 +29,11 @@ #ff757575 - #E8E8E8 - #434343 - #252525 - #FF4747 #6FF06F #444444 - - #858585 - #fcfcfc - #C7C7C7 #1A90FF diff --git a/AnkiDroid/src/main/res/values/constants.xml b/AnkiDroid/src/main/res/values/constants.xml index cc987959152d..c772b39856ee 100644 --- a/AnkiDroid/src/main/res/values/constants.xml +++ b/AnkiDroid/src/main/res/values/constants.xml @@ -109,6 +109,7 @@ https://docs.ankidroid.org/#AnkiWebConflicts https://docs.ankidroid.org/#userActions https://github.com/ankidroid/Anki-Android/wiki/FAQ#tts--text-to-speech-is-not-speaking + https://github.com/ankidroid/Anki-Android/wiki/FAQ#no-text-to-speech-engine-installed https://github.com/ankidroid/Anki-Android/wiki/FAQ#why-doesnt-my-sound-or-image-work-on-ankidroid https://github.com/ankidroid/Anki-Android/wiki/Third-Party-Apps https://ankiweb.net/shared/decks/ @@ -165,31 +166,6 @@ @string/theme_night - 0 - 1 - 2 - 3 - - 1 - 2 - 3 - 4 - - - @string/theme_follow_system_value - @string/theme_day_scheme_value - @string/theme_night_scheme_value - - - @string/theme_light_value - @string/theme_plain_value - @string/theme_eink_scheme_value - - - @string/theme_black_value - @string/theme_dark_value - - @string/sync_media_always @string/sync_media_only_unmetered @@ -327,12 +303,6 @@ @string/fragment_accessibility_preferences - - English - Español - 日本語 - answerButtonPosition top diff --git a/AnkiDroid/src/main/res/values/dimens.xml b/AnkiDroid/src/main/res/values/dimens.xml index 413f673d1478..6f80cf8214f0 100644 --- a/AnkiDroid/src/main/res/values/dimens.xml +++ b/AnkiDroid/src/main/res/values/dimens.xml @@ -1,7 +1,5 @@ - - 16dp 56dp 16dp 8dp @@ -16,13 +14,11 @@ 24dp 16dp - 8dp 8dp 16dp 20sp - 18sp 0dp @@ -30,10 +26,6 @@ 4dp 52dp - 8dp - 4dp - 8dp - 8dp 3dp 12dp diff --git a/AnkiDroid/src/main/res/values/ids.xml b/AnkiDroid/src/main/res/values/ids.xml index e2d4feb53b21..f70272303cae 100644 --- a/AnkiDroid/src/main/res/values/ids.xml +++ b/AnkiDroid/src/main/res/values/ids.xml @@ -43,6 +43,4 @@ - - \ No newline at end of file diff --git a/AnkiDroid/src/main/res/values/preferences.xml b/AnkiDroid/src/main/res/values/preferences.xml index 9d79985089ed..51aa2333e8d9 100644 --- a/AnkiDroid/src/main/res/values/preferences.xml +++ b/AnkiDroid/src/main/res/values/preferences.xml @@ -33,6 +33,7 @@ backupLimitsScreen pastePNG + lastSharedDeckId switchProfileScreen enableSwitchProfile @@ -212,7 +213,6 @@ resetLanguages notificationsScreen - minimumCardsDueForNotification widgetVibrate widgetBlink @@ -233,7 +233,6 @@ debug_corrupt_fsrs_params new_congrats_screen newReviewerOptions - newReviewReminders devOptionsEnabledByUser workInProgressDevOptions reviewerPort diff --git a/AnkiDroid/src/main/res/values/styles.xml b/AnkiDroid/src/main/res/values/styles.xml index f5ba1bb96faa..94d6d5949f88 100644 --- a/AnkiDroid/src/main/res/values/styles.xml +++ b/AnkiDroid/src/main/res/values/styles.xml @@ -15,18 +15,6 @@ @dimen/nav_drawer_margin_offset - - - - - - - - - - - - - - - - - - - - - - @@ -258,10 +205,6 @@ @style/AlertDialogStyle - - - - - - - - - diff --git a/AnkiDroid/src/main/res/xml/preferences_reviewing.xml b/AnkiDroid/src/main/res/xml/preferences_reviewing.xml index 074a25cfa864..42ca53a588d3 100644 --- a/AnkiDroid/src/main/res/xml/preferences_reviewing.xml +++ b/AnkiDroid/src/main/res/xml/preferences_reviewing.xml @@ -29,12 +29,11 @@ app:max="999" app:min="0" app:summaryFormat="@plurals/pref_summ_minutes"/> - + android:summary="@string/disabled" + android:fragment="com.ichi2.anki.preferences.TimeboxSettingsFragment" /> = + class ActivityLauncherProvider : TestParameterValuesProvider() { + override fun provideValues(context: Context?): List = ActivityList .allActivitiesAndIntents() .filterNot { handled.contains(it.activity) } .map { ActivityConfig(it) } + } + companion object { /** * Activities which finish on the way up given what this test provides: an empty * collection, no card to review, no notetype and no widget id. diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/AllActivitiesScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/AllActivitiesScreenshotTest.kt index 755c1dca23bb..f39c83f1960e 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/AllActivitiesScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/AllActivitiesScreenshotTest.kt @@ -13,6 +13,7 @@ import androidx.core.view.WindowInsetsCompat import com.google.testing.junit.testparameterinjector.TestParameter import com.google.testing.junit.testparameterinjector.TestParameterValuesProvider import com.ichi2.anki.account.AccountActivity +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.instantnoteeditor.InstantNoteEditorActivity import com.ichi2.anki.multimedia.MultimediaActivity import com.ichi2.anki.notetype.ManageNotetypes @@ -21,12 +22,12 @@ import com.ichi2.anki.previewer.CardViewerActivity import com.ichi2.anki.shareddeck.SharedDecksActivity import com.ichi2.anki.ui.windows.managespace.ManageSpaceActivity import com.ichi2.anki.ui.windows.permissions.AllPermissionsExplanationActivity +import com.ichi2.anki.ui.windows.permissions.PermissionsActivity import com.ichi2.anki.utils.ConfigAwareSingleFragmentActivity import com.ichi2.testutils.ActivityList import com.ichi2.testutils.ActivityList.ActivityLaunchParam import com.ichi2.testutils.BackupManagerTestUtilities import com.ichi2.testutils.skipTest -import com.ichi2.utils.dp import org.junit.After import org.junit.Before import org.junit.Test @@ -111,6 +112,8 @@ class AllActivitiesScreenshotTest : ScreenshotTest() { AccountActivity::class.java, // AllPermissionsExplanationScreenshotTest AllPermissionsExplanationActivity::class.java, + // PermissionsActivityScreenshotTest + PermissionsActivity::class.java, // CardTemplateEditorScreenshotTest CardTemplateEditor::class.java, // DeckPickerScreenshotTest diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/AllPermissionsExplanationScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/AllPermissionsExplanationScreenshotTest.kt index 074c15c5f718..4209eca63b5e 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/AllPermissionsExplanationScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/AllPermissionsExplanationScreenshotTest.kt @@ -12,9 +12,9 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat.Type.displayCutout import androidx.core.view.WindowInsetsCompat.Type.navigationBars import androidx.core.view.WindowInsetsCompat.Type.statusBars +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.ui.windows.permissions.AllPermissionsExplanationActivity import com.ichi2.testutils.insetsOf -import com.ichi2.utils.dp import org.junit.Test import org.robolectric.RuntimeEnvironment diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/AndroidTtsPlayerTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/AndroidTtsPlayerTest.kt index 15bc8c8540c5..d8e0676097aa 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/AndroidTtsPlayerTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/AndroidTtsPlayerTest.kt @@ -33,6 +33,59 @@ import kotlin.time.Duration.Companion.seconds /** Test for [AndroidTtsPlayer] */ @RunWith(AndroidJUnit4::class) class AndroidTtsPlayerTest { + @Test + fun `locale fallback respects engine preference order`() { + val first = AndroidTtsVoice(fakeVoice("first", Locale.FRANCE), ENGINE_A) + val second = AndroidTtsVoice(fakeVoice("second", Locale.FRANCE), ENGINE_B) + + for (voices in listOf(listOf(first, second), listOf(second, first))) { + val player = AndroidTtsPlayer(voices) + assertThat(player.voiceForTag(frenchTag()), equalTo(TtsVoiceMatch(voices.first(), rank = -100))) + } + } + + @Test + fun `unavailable voices follow installed voices with engine order preserved in both groups`() { + val installedB = AndroidTtsVoice(fakeVoice("installed-b", Locale.FRANCE), ENGINE_B) + val unavailableB = AndroidTtsVoice(fakeVoice("unavailable-b", Locale.FRANCE, installed = false), ENGINE_B) + val installedA = AndroidTtsVoice(fakeVoice("installed-a", Locale.FRANCE), ENGINE_A) + val unavailableA = AndroidTtsVoice(fakeVoice("unavailable-a", Locale.FRANCE, installed = false), ENGINE_A) + val installedC = AndroidTtsVoice(fakeVoice("installed-c", Locale.FRANCE), ENGINE_C) + val unavailableC = AndroidTtsVoice(fakeVoice("unavailable-c", Locale.FRANCE, installed = false), ENGINE_C) + val player = AndroidTtsPlayer(listOf(unavailableB, installedB, unavailableA, installedA, unavailableC, installedC)) + + assertThat(player.voices(), equalTo(listOf(installedB, installedA, installedC, unavailableB, unavailableA, unavailableC))) + assertThat(player.voiceForTag(frenchTag()), equalTo(TtsVoiceMatch(installedB, rank = -100))) + } + + @Test + fun `locale fallback uses another engine when the default lacks the language`() { + val french = AndroidTtsVoice(fakeVoice("french", Locale.FRANCE), ENGINE_A) + val english = AndroidTtsVoice(fakeVoice("english", Locale.US), ENGINE_B) + val player = AndroidTtsPlayer(listOf(english, french)) + + assertThat(player.voiceForTag(frenchTag()), equalTo(TtsVoiceMatch(french, rank = -100))) + } + + @Test + fun `installed voice from another engine precedes unavailable default engine voice`() { + val installed = AndroidTtsVoice(fakeVoice("installed", Locale.FRANCE), ENGINE_A) + val unavailable = AndroidTtsVoice(fakeVoice("unavailable", Locale.FRANCE, installed = false), ENGINE_B) + val player = AndroidTtsPlayer(listOf(unavailable, installed)) + + assertThat(player.voiceForTag(frenchTag()), equalTo(TtsVoiceMatch(installed, rank = -100))) + } + + @Test + fun `explicit voice from another engine takes precedence over the default engine`() { + val requested = AndroidTtsVoice(fakeVoice("requested", Locale.FRANCE), ENGINE_A) + val preferred = AndroidTtsVoice(fakeVoice("preferred", Locale.FRANCE), ENGINE_B) + val player = AndroidTtsPlayer(listOf(preferred, requested)) + + assertThat(player.voiceForTag(frenchTag(requested.name)), equalTo(TtsVoiceMatch(requested, rank = 0))) + assertThat(player.voiceForTag(frenchTag("missing")), equalTo(TtsVoiceMatch(preferred, rank = -100))) + } + @Test fun `network timeout is reported with its specific error code`() { val error = AndroidTtsError.fromErrorCode(TextToSpeech.ERROR_NETWORK_TIMEOUT) @@ -265,6 +318,7 @@ class AndroidTtsPlayerTest { companion object { private const val ENGINE_A = "com.example.engine.a" private const val ENGINE_B = "com.example.engine.b" + private const val ENGINE_C = "com.example.engine.c" private const val ENGINE_FAILING = "com.example.engine.failing" private val PLAYBACK_TIMEOUT = 5.seconds } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/AnkiDroidAppTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/AnkiDroidAppTest.kt index 77f982d1034e..e0d7fa1b8b56 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/AnkiDroidAppTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/AnkiDroidAppTest.kt @@ -13,7 +13,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.ichi2.anki.common.crashreporting.CrashReportService.sendExceptionReport import com.ichi2.anki.multiprofile.ProfileManager -import com.ichi2.anki.multiprofile.ProfileManager.Companion.KEY_LAST_ACTIVE_PROFILE_ID +import com.ichi2.anki.multiprofile.ProfileManager.Companion.PREF_LAST_ACTIVE_PROFILE_ID import com.ichi2.anki.multiprofile.ProfileManager.Companion.PROFILE_REGISTRY_FILENAME import com.ichi2.anki.multiprofile.isPhoenixProcess import io.mockk.every @@ -95,7 +95,7 @@ class AnkiDroidAppTest { @Test fun `storage follows a non-default profile`() { - profileRegistry.edit(commit = true) { putString(KEY_LAST_ACTIVE_PROFILE_ID, "p_routed") } + profileRegistry.edit(commit = true) { putString(PREF_LAST_ACTIVE_PROFILE_ID, "p_routed") } val app = startApplication() app.getSharedPreferences("settings", Context.MODE_PRIVATE).edit(commit = true) { @@ -122,7 +122,7 @@ class AnkiDroidAppTest { val app = startApplication() - assertNull(profileRegistry.getString(KEY_LAST_ACTIVE_PROFILE_ID, null)) + assertNull(profileRegistry.getString(PREF_LAST_ACTIVE_PROFILE_ID, null)) assertEquals(frameworkBase.filesDir, app.filesDir) } @@ -134,7 +134,7 @@ class AnkiDroidAppTest { val app = startApplication() - assertNull(profileRegistry.getString(KEY_LAST_ACTIVE_PROFILE_ID, null)) + assertNull(profileRegistry.getString(PREF_LAST_ACTIVE_PROFILE_ID, null)) assertEquals(frameworkBase.filesDir, app.filesDir) } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/BaselineProfileTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/BaselineProfileTest.kt index abcdd50d6a5d..6fb0375dbe15 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/BaselineProfileTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/BaselineProfileTest.kt @@ -13,6 +13,51 @@ import kotlin.test.assertTrue * Ensures a manual run of the baseline profile won't drop rules. */ class BaselineProfileTest { + /** A populated deck list needs both row inflation and binding on a cold launch. */ + @Test + fun `baseline profile covers creating and binding deck rows`() { + val rules = readProfile("baseline-prof.txt") + val recordedMethods = + rules + .filterIsInstance() + .filter { it.className == "com.ichi2.anki.widgets.DeckAdapter" } + .map { it.methodSignature } + .toSet() + val requiredMethods = + setOf( + "onCreateViewHolder(Landroid/view/ViewGroup;I)Lcom/ichi2/anki/widgets/DeckAdapter\$ViewHolder;", + "onBindViewHolder(Lcom/ichi2/anki/widgets/DeckAdapter\$ViewHolder;I)V", + ) + val missing = requiredMethods - recordedMethods + + assertTrue( + missing.isEmpty(), + "baseline-prof.txt does not cover rendering a populated deck list. Missing DeckAdapter methods: " + + "${missing.joinToString()}. Seed a collection before capture, wait for a deck row, " + + "then regenerate the profiles (baselineprofile/README.md).", + ) + } + + /** R8 needs the row classes as well as the activity to optimize a populated deck list's startup. */ + @Test + fun `startup profile includes deck row rendering classes`() { + // A method rule also identifies its declaring class for startup layout optimization. + val recordedClasses = readProfile("startup-prof.txt").map { it.className }.toSet() + val requiredClasses = + setOf( + "com.ichi2.anki.widgets.DeckAdapter\$ViewHolder", + "com.ichi2.anki.databinding.ItemDeckBinding", + ) + val missing = requiredClasses - recordedClasses + + assertTrue( + missing.isEmpty(), + "startup-prof.txt does not cover rendering a populated deck list. Missing classes: " + + "${missing.joinToString()}. Record a cold launch with a populated collection " + + "and wait for a deck row before ending capture, then regenerate the profiles.", + ) + } + /** * [DeckPicker.onResume] runs on every launch before the deck list is * usable, so it must stay ahead-of-time compiled. @@ -43,4 +88,10 @@ class BaselineProfileTest { "journey, then regenerate (baselineprofile/README.md).", ) } + + private fun readProfile(name: String): List { + val profile = File("src/main/generated/baselineProfiles/$name") + assertTrue(profile.isFile, "profile not found at ${profile.absolutePath}") + return BaselineProfileEntry.parseProfile(profile.readLines()) + } } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/BottomNavigationScrollTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/BottomNavigationScrollTest.kt new file mode 100644 index 000000000000..ec1194f04518 --- /dev/null +++ b/AnkiDroid/src/test/java/com/ichi2/anki/BottomNavigationScrollTest.kt @@ -0,0 +1,367 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2026 Shaan Narendran + +package com.ichi2.anki + +import android.content.Intent +import android.os.SystemClock +import android.view.MotionEvent +import android.view.View +import android.view.ViewGroup +import android.webkit.WebView +import android.widget.ScrollView +import android.widget.TextView +import androidx.core.view.ViewCompat +import androidx.recyclerview.widget.RecyclerView +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.android.material.behavior.HideViewOnScrollBehavior +import com.google.android.material.bottomnavigation.BottomNavigationView +import com.ichi2.anki.BottomNavController.NavigationItem +import com.ichi2.anki.common.utils.dp +import com.ichi2.anki.databinding.FragmentMoreBinding +import com.ichi2.anki.databinding.PageStatisticsBinding +import com.ichi2.anki.pages.scrolledUpToBottom +import com.ichi2.testutils.dispatchInsets +import com.ichi2.testutils.withBooleanPreference +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.Matchers.equalTo +import org.hamcrest.Matchers.lessThanOrEqualTo +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class BottomNavigationScrollTest : RobolectricTest() { + @Test + fun `scrolling down hides the bar and scrolling up restores it`() = + withBottomNavigation { deckPicker -> + val nav = deckPicker.bottomNav + val behavior = HideViewOnScrollBehavior.from(nav) + val deckList = deckPicker.deckPickerBinding.decks + + assertThat(behavior.isScrolledIn, equalTo(true)) + deckPicker.scrollFrom(deckList, 40) + assertThat(behavior.isScrolledOut, equalTo(true)) + deckPicker.scrollFrom(deckList, -40) + assertThat(behavior.isScrolledIn, equalTo(true)) + } + + @Test + fun `switching tabs restores a hidden bar`() = + withBottomNavigation { deckPicker -> + val nav = deckPicker.bottomNav + val behavior = HideViewOnScrollBehavior.from(nav) + + deckPicker.scrollFrom(deckPicker.deckPickerBinding.decks, 40) + assertThat(behavior.isScrolledOut, equalTo(true)) + + nav.selectedItemId = NavigationItem.BROWSER.id + advanceRobolectricLooper() + assertThat(behavior.isScrolledIn, equalTo(true)) + } + + @Test + fun `scrolling up in the browser restores the hidden bar`() = + withBottomNavigation { deckPicker -> + val nav = deckPicker.bottomNav + nav.selectedItemId = NavigationItem.BROWSER.id + advanceRobolectricLooper() + val list = deckPicker.findViewById(R.id.card_browser_list) + list.adapter = + object : RecyclerView.Adapter() { + override fun getItemCount() = 80 + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int, + ) = object : RecyclerView.ViewHolder( + TextView(parent.context).apply { + layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100) + }, + ) {} + + override fun onBindViewHolder( + holder: RecyclerView.ViewHolder, + position: Int, + ) = Unit + } + list.scrollToPosition(40) + deckPicker.scrollFrom(list, 40) + assertThat(HideViewOnScrollBehavior.from(nav).isScrolledOut, equalTo(true)) + + list.scrollBy(0, -100) + assertThat(HideViewOnScrollBehavior.from(nav).isScrolledIn, equalTo(true)) + } + + @Test + fun `scrolling More content hides the bar and scrolling back restores it`() = + withBottomNavigation { deckPicker -> + val nav = deckPicker.bottomNav + nav.selectedItemId = NavigationItem.MORE.id + advanceRobolectricLooper() + val scrollView = deckPicker.moreBinding.moreScrollView + val behavior = HideViewOnScrollBehavior.from(nav) + + deckPicker.scrollFrom(scrollView, 40) + assertThat(behavior.isScrolledOut, equalTo(true)) + deckPicker.scrollFrom(scrollView, -40) + assertThat(behavior.isScrolledIn, equalTo(true)) + } + + /** The hidden bar gives More extra height, which pulls a bottom scroll position back up */ + @Test + fun `More stays at the bottom with the bar hidden after the content grows`() = + withBottomNavigation { deckPicker -> + val nav = deckPicker.bottomNav + nav.selectedItemId = NavigationItem.MORE.id + advanceRobolectricLooper() + val scrollView = deckPicker.moreBinding.moreScrollView + val behavior = HideViewOnScrollBehavior.from(nav) + scrollView.scrollTo(0, scrollView.getChildAt(0).height) + + deckPicker.scrollFrom(scrollView, 40) + assertThat(behavior.isScrolledOut, equalTo(true)) + // the container grows into the bar's space + deckPicker.binding.root.requestLayout() + advanceRobolectricLooper() + + assertThat("the bar must not come back without an upward scroll", behavior.isScrolledOut, equalTo(true)) + } + + /** Content which fits once the bar is hidden cannot scroll, so only the gesture can restore the bar */ + @Test + fun `dragging down restores the hidden bar when the content cannot scroll`() = + withBottomNavigation { deckPicker -> + val nav = deckPicker.bottomNav + nav.selectedItemId = NavigationItem.MORE.id + advanceRobolectricLooper() + val behavior = HideViewOnScrollBehavior.from(nav) + behavior.slideOut(nav) + assertThat(behavior.isScrolledOut, equalTo(true)) + + // More is at the top: dragging the finger down cannot scroll it any further + deckPicker.dragFinger(fromY = 200f, toY = 400f) + + assertThat(behavior.isScrolledIn, equalTo(true)) + } + + @Test + fun `upward reversal does not repeatedly restore the bar in More`() = + withBottomNavigation { activity -> + val nav = activity.bottomNav + nav.selectedItemId = NavigationItem.MORE.id + advanceRobolectricLooper() + val scroll = activity.moreBinding.moreScrollView + scroll.scrollTo(0, 200) + advanceRobolectricLooper() + assertThat("More must be scrolled away from the top", scroll.scrollY > 70, equalTo(true)) + val behavior = HideViewOnScrollBehavior.from(nav) + val states = mutableListOf() + behavior.addOnScrollStateChangedListener { _, state -> states.add(state) } + val origin = IntArray(2).also(scroll::getLocationInWindow) + val start = SystemClock.uptimeMillis() + + fun touch( + action: Int, + offset: Float, + delta: Long, + ) { + val event = MotionEvent.obtain(start, start + delta, action, 100f, origin[1] + offset, 0) + activity.dispatchTouchEvent(event) + event.recycle() + advanceRobolectricLooper() + } + // Keep the finger down throughout the reversal. Vertical coordinates are relative to More. + touch(MotionEvent.ACTION_DOWN, 60f, 0) + touch(MotionEvent.ACTION_MOVE, 130f, 100) + touch(MotionEvent.ACTION_MOVE, 110f, 200) + assertThat("Reversing upwards must hide the bar", behavior.isScrolledOut, equalTo(true)) + // Continue upwards while still below the initial touch position. + states.clear() + touch(MotionEvent.ACTION_MOVE, 90f, 300) + touch(MotionEvent.ACTION_UP, 90f, 400) + assertThat( + "Continuing upwards must not show the bar; observed states: $states", + states.contains(HideViewOnScrollBehavior.STATE_SCROLLED_IN), + equalTo(false), + ) + assertThat(behavior.isScrolledOut, equalTo(true)) + } + + @Test + fun `scrolling Statistics content hides the bar`() = + withBottomNavigation { deckPicker -> + val nav = deckPicker.bottomNav + nav.selectedItemId = NavigationItem.STATS.id + advanceRobolectricLooper() + val webView = deckPicker.statisticsWebView + + val behavior = HideViewOnScrollBehavior.from(nav) + webView.scrollTo(0, 100) + assertThat(behavior.isScrolledOut, equalTo(true)) + webView.scrollTo(0, 0) + assertThat(behavior.isScrolledIn, equalTo(true)) + } + + @Test + fun `first upward Statistics scroll after layout restores the bar`() = + withBottomNavigation { deckPicker -> + val nav = deckPicker.bottomNav + nav.selectedItemId = NavigationItem.STATS.id + advanceRobolectricLooper() + val webView = deckPicker.statisticsWebView + val behavior = HideViewOnScrollBehavior.from(nav) + + webView.scrollTo(0, 1000) + assertThat(behavior.isScrolledOut, equalTo(true)) + advanceRobolectricLooper() + + // Away from the bottom, resizing need not scroll the page. The next scroll is user input. + webView.scrollTo(0, 950) + assertThat("an upward non-touch scroll must restore the bar", behavior.isScrolledIn, equalTo(true)) + } + + /** + * The hidden bar makes Statistics taller, so a page at the bottom scrolls itself up to stay in + * range. Robolectric's WebView has no scroll range, so the rule is checked on a [ScrollView]. + */ + @Test + fun `an upward scroll which ends at the bottom is not user input`() { + val scrollView = + ScrollView(targetContext).apply { + addView(View(targetContext).apply { minimumHeight = 1000 }) + measure( + View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY), + ) + layout(0, 0, 100, 100) + } + + scrollView.scrollTo(0, 900) + assertThat("pulled back to the bottom by a resize", scrollView.scrolledUpToBottom(dy = -50), equalTo(true)) + assertThat("scrolling down is always user input", scrollView.scrolledUpToBottom(dy = 50), equalTo(false)) + + scrollView.scrollTo(0, 500) + assertThat("the user scrolled up, away from the bottom", scrollView.scrolledUpToBottom(dy = -50), equalTo(false)) + } + + @Test + fun `Studied summary sits above the visible nav bar`() = + withBottomNavigation { deckPicker -> + val summary = deckPicker.deckPickerBinding.reviewSummaryTextView + val nav = deckPicker.bottomNav + deckPicker.deckPickerBinding.deckPickerContent.visibility = View.VISIBLE + summary.text = "Studied 10 cards today" + summary.visibility = View.VISIBLE + deckPicker.binding.root.requestLayout() + advanceRobolectricLooper() + + assertThat(summary.height > 0, equalTo(true)) + assertThat(summary.contentBottomOnScreen, lessThanOrEqualTo(nav.topOnScreen)) + } + + @Test + fun `Studied summary stays visible above the system navigation bar when the bar hides`() = + withBottomNavigation { deckPicker -> + val summary = deckPicker.deckPickerBinding.reviewSummaryTextView + val nav = deckPicker.bottomNav + deckPicker.deckPickerBinding.deckPickerContent.visibility = View.VISIBLE + summary.text = "Studied 10 cards today" + summary.visibility = View.VISIBLE + deckPicker.binding.root.requestLayout() + advanceRobolectricLooper() + + assertThat(summary.height > 0, equalTo(true)) + deckPicker.scrollFrom(deckPicker.deckPickerBinding.decks, 40) + advanceRobolectricLooper() + // Robolectric re-dispatches zero insets when the bar's state changes: apply a real nav bar after + deckPicker.dispatchInsets(navBarBottom = 48.dp) + deckPicker.binding.root.requestLayout() + advanceRobolectricLooper() + + assertThat(HideViewOnScrollBehavior.from(nav).isScrolledOut, equalTo(true)) + assertThat(summary.alpha, equalTo(1f)) + // back at its resting position, which pads it above the system navigation bar + assertThat(summary.translationY, equalTo(0f)) + assertThat(summary.paddingBottom, equalTo(48.dp.toPx(deckPicker))) + + deckPicker.scrollFrom(deckPicker.deckPickerBinding.decks, -40) + advanceRobolectricLooper() + assertThat(summary.alpha, equalTo(1f)) + assertThat(summary.contentBottomOnScreen, lessThanOrEqualTo(nav.topOnScreen)) + } + + @Test + fun `deck list fade stays anchored to the summary while the bottom bar is hidden`() = + withBottomNavigation { deckPicker -> + val deckList = deckPicker.deckPickerBinding.decks + val fade = deckPicker.deckPickerBinding.decksFadeWrapper + val summary = deckPicker.deckPickerBinding.reviewSummaryTextView + + assertThat(fade.anchorView, equalTo(summary)) + deckPicker.scrollFrom(deckList, 40) + assertThat(fade.anchorView, equalTo(summary)) + deckPicker.scrollFrom(deckList, -40) + assertThat(fade.anchorView, equalTo(summary)) + } + + @Test + fun `hidden bar releases space for fragment content`() = + withBottomNavigation { deckPicker -> + val nav = deckPicker.bottomNav + val container = deckPicker.binding.bottomNavFragmentContainer!! + deckPicker.scrollFrom(deckPicker.deckPickerBinding.decks, 40) + + assertThat(HideViewOnScrollBehavior.from(nav).isScrolledOut, equalTo(true)) + assertThat((container.layoutParams as ViewGroup.MarginLayoutParams).bottomMargin < nav.height, equalTo(true)) + } + + private fun withBottomNavigation(test: (DeckPicker) -> Unit) = + withBooleanPreference(R.string.dev_bottom_nav_key, true) { + setIntroductionSlidesShown(true) + test(startActivityControllerNormallyOpenCollectionWithIntent(DeckPicker::class.java, Intent()).get()) + } + + private fun DeckPicker.scrollFrom( + source: View, + dy: Int, + ) { + val root = binding.root + if (root.onStartNestedScroll(source, source, ViewCompat.SCROLL_AXIS_VERTICAL, ViewCompat.TYPE_TOUCH)) { + root.onNestedScroll(source, 0, dy, 0, 0, ViewCompat.TYPE_TOUCH) + root.onStopNestedScroll(source, ViewCompat.TYPE_TOUCH) + } + } + + private fun DeckPicker.dragFinger( + fromY: Float, + toY: Float, + ) { + val time = SystemClock.uptimeMillis() + val steps = listOf(MotionEvent.ACTION_DOWN to fromY, MotionEvent.ACTION_MOVE to toY, MotionEvent.ACTION_UP to toY) + for ((action, y) in steps) { + val event = MotionEvent.obtain(time, time, action, 100f, y, 0) + dispatchTouchEvent(event) + event.recycle() + } + advanceRobolectricLooper() + } + + private val View.topOnScreen: Int + get() = IntArray(2).also { getLocationOnScreen(it) }[1] + + private val View.contentBottomOnScreen: Int + get() = topOnScreen + height - paddingBottom + + private val DeckPicker.moreBinding: FragmentMoreBinding + get() = FragmentMoreBinding.bind(supportFragmentManager.findFragmentByTag(NavigationItem.MORE.tag)!!.requireView()) + + private val DeckPicker.statisticsBinding: PageStatisticsBinding + get() = PageStatisticsBinding.bind(supportFragmentManager.findFragmentByTag(NavigationItem.STATS.tag)!!.requireView()) + + /** The [WebView] wrapped by the Statistics page's [com.ichi2.anki.workarounds.SafeWebViewLayout] */ + private val DeckPicker.statisticsWebView: WebView + get() = statisticsBinding.webviewLayout.getChildAt(0) as WebView + + private val DeckPicker.bottomNav: BottomNavigationView + get() = binding.bottomNavigation!! +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserInsetsTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserInsetsTest.kt index 2203207dcec9..508c4c302b03 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserInsetsTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserInsetsTest.kt @@ -6,11 +6,11 @@ import android.view.View import android.view.View.MeasureSpec import androidx.recyclerview.widget.RecyclerView import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.ui.RecyclerFastScroller import com.ichi2.testutils.dispatchInsets import com.ichi2.testutils.lastItemView import com.ichi2.testutils.scrollToLastPosition -import com.ichi2.utils.dp import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.allOf import org.hamcrest.Matchers.equalTo diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserScreenshotTest.kt index 0f2443ba43fa..b093d5cf8e76 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserScreenshotTest.kt @@ -13,13 +13,13 @@ import androidx.core.view.WindowInsetsCompat.Type.displayCutout import androidx.core.view.WindowInsetsCompat.Type.navigationBars import androidx.core.view.WindowInsetsCompat.Type.statusBars import androidx.recyclerview.widget.RecyclerView +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.ui.RecyclerFastScroller import com.ichi2.testutils.HIDDEN_GESTURE_BAR import com.ichi2.testutils.insetsOf import com.ichi2.testutils.scrollToEnd import com.ichi2.testutils.simulateKeyboard import com.ichi2.testutils.simulateSystemBars -import com.ichi2.utils.dp import org.junit.Test import org.robolectric.RuntimeEnvironment diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserTest.kt index f58abe595ff7..496cede618a1 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserTest.kt @@ -5,9 +5,12 @@ package com.ichi2.anki import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle +import android.os.SystemClock import android.text.TextUtils import android.view.Menu +import android.view.MotionEvent import android.view.View +import android.widget.LinearLayout import android.widget.Spinner import android.widget.SpinnerAdapter import android.widget.TextView @@ -41,12 +44,12 @@ import anki.search.BrowserRow import anki.search.BrowserRow.Color import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.CollectionManager.withCol -import com.ichi2.anki.IntentHandler.Companion.grantedStoragePermissions import com.ichi2.anki.RobolectricTest.Companion.advanceRobolectricLooper import com.ichi2.anki.RobolectricTest.Companion.advanceRobolectricLooperUntil import com.ichi2.anki.browser.BrowserColumnKey import com.ichi2.anki.browser.BrowserMultiColumnAdapter import com.ichi2.anki.browser.BrowserMultiColumnAdapter.Companion.LINES_VISIBLE_WHEN_COLLAPSED +import com.ichi2.anki.browser.BrowserSearchFeedbackMode import com.ichi2.anki.browser.CardBrowserColumn import com.ichi2.anki.browser.CardBrowserColumn.DECK import com.ichi2.anki.browser.CardBrowserColumn.QUESTION @@ -57,13 +60,13 @@ import com.ichi2.anki.browser.CardBrowserViewModelTest import com.ichi2.anki.browser.CardOrNoteId import com.ichi2.anki.browser.FindAndReplaceDialogFragment import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.ALL_FIELDS_AS_FIELD -import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.ARG_FIELD -import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.ARG_MATCH_CASE -import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.ARG_ONLY_SELECTED_NOTES -import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.ARG_REGEX -import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.ARG_REPLACEMENT -import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.ARG_SEARCH import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.REQUEST_FIND_AND_REPLACE +import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.RESULT_FIELD +import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.RESULT_MATCH_CASE +import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.RESULT_ONLY_SELECTED_NOTES +import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.RESULT_REGEX +import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.RESULT_REPLACEMENT +import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.RESULT_SEARCH import com.ichi2.anki.browser.FindAndReplaceDialogFragment.Companion.TAGS_AS_FIELD import com.ichi2.anki.browser.IdsFile import com.ichi2.anki.browser.column1 @@ -71,6 +74,8 @@ import com.ichi2.anki.browser.selectRowAtPosition import com.ichi2.anki.browser.setColumn import com.ichi2.anki.browser.setSelectedDeck import com.ichi2.anki.browser.toRowSelection +import com.ichi2.anki.common.destinations.NoteEditorDestination +import com.ichi2.anki.common.storage.grantedStoragePermissions import com.ichi2.anki.common.time.TimeManager import com.ichi2.anki.common.utils.isRunningAsUnitTest import com.ichi2.anki.dialogs.DeckSelectionDialog @@ -102,12 +107,11 @@ import com.ichi2.testutils.ext.snackbarText import com.ichi2.testutils.getSharedPrefs import com.ichi2.testutils.parcelledCopy import com.ichi2.testutils.saveState +import com.ichi2.testutils.withSplitPaneUi import com.ichi2.testutils.withSplitPaneUiAsync import com.ichi2.utils.LanguageUtil import io.mockk.every -import io.mockk.mockkObject import io.mockk.mockkStatic -import io.mockk.unmockkObject import io.mockk.unmockkStatic import kotlinx.coroutines.runBlocking import org.hamcrest.CoreMatchers.allOf @@ -473,7 +477,7 @@ class CardBrowserTest : RobolectricTest() { fun startupFromCardBrowserActionItemShouldEndActivityIfNoPermissions() { try { mockkStatic(::isRunningAsUnitTest) - mockkObject(IntentHandler) + mockkStatic("com.ichi2.anki.common.storage.LegacyStorageKt") every { grantedStoragePermissions(any(), any()) } returns false every { isRunningAsUnitTest } returns false @@ -485,7 +489,7 @@ class CardBrowserTest : RobolectricTest() { assertThat("Activity should be finishing", cardBrowser.isFinishing) } finally { unmockkStatic(::isRunningAsUnitTest) - unmockkObject(IntentHandler) + unmockkStatic("com.ichi2.anki.common.storage.LegacyStorageKt") } } @@ -526,7 +530,8 @@ class CardBrowserTest : RobolectricTest() { CardBrowserViewModel.SearchState.Completed( rowCount = count, cardsOrNotes = mode, - resultMessage = CardBrowserViewModel.SearchResultMessage.CardCount(includeSearchAllDecksAction = false), + feedbackMode = BrowserSearchFeedbackMode.SEARCH_RESULTS, + allDecksSelected = true, ) assertThat(search.formatCardCount(targetContext.resources), equalTo(expected)) } @@ -832,8 +837,8 @@ class CardBrowserTest : RobolectricTest() { b.supportFragmentManager.setFragmentResult( ForgetCardsDialog.REQUEST_KEY_FORGET, Bundle().apply { - putBoolean(ForgetCardsDialog.ARG_RESTORE_ORIGINAL, true) - putBoolean(ForgetCardsDialog.ARG_RESET_REPETITION, false) + putBoolean(ForgetCardsDialog.RESULT_RESTORE_ORIGINAL, true) + putBoolean(ForgetCardsDialog.RESULT_RESET_REPETITION, false) }, ) @@ -1296,15 +1301,8 @@ class CardBrowserTest : RobolectricTest() { } @Test - @Ignore("Issue 22065: search task starts while activity is finishing") fun `deck id is remembered - issue 15072`() = runTest { - // WARN: This doesn't mirror reality due to the use of coroutines - // in the issue, selectDeckAndSave() was called AFTER the search had been performed - // due to this being called immediately in a test-based context - - // We're going to move this functionality entirely to the ViewModel over the next few weeks - // so this test should be updated and working after the refactorings are completed addBasicNote().moveToDeck("First") addBasicNote().moveToDeck("Second") @@ -1314,6 +1312,8 @@ class CardBrowserTest : RobolectricTest() { viewModel.setSelectedDeck(secondDeckId) assertThat(viewModel.deckId, equalTo(secondDeckId)) finish() + // Pending search updates must not start tasks for the finishing browser. + advanceRobolectricLooper() } browserWithNoNewCards.apply { @@ -1878,8 +1878,7 @@ class CardBrowserTest : RobolectricTest() { R.id.action_copy_note to true, R.id.action_font_size to true, R.id.action_capitalize to true, - R.id.action_show_toolbar to true, - R.id.action_scroll_toolbar to true, + R.id.action_toolbar_layout to true, R.id.action_toggle_previewer to false, ) @@ -1922,8 +1921,7 @@ class CardBrowserTest : RobolectricTest() { R.id.action_copy_note to true, R.id.action_font_size to true, R.id.action_capitalize to true, - R.id.action_show_toolbar to true, - R.id.action_scroll_toolbar to true, + R.id.action_toolbar_layout to true, R.id.action_toggle_previewer to false, ) @@ -1967,6 +1965,29 @@ class CardBrowserTest : RobolectricTest() { ) } + @Test + @Config(qualifiers = "w1024dp-h768dp") + fun `resizing the note editor's panes does not resize the split browser`() { + withSplitPaneUi { + val noteEditor = + startActivityNormallyOpenCollectionWithIntent( + NoteEditorActivity::class.java, + NoteEditorDestination.AddNote().toIntent(targetContext), + ) + advanceRobolectricLooper() + noteEditor.findViewById(R.id.note_editor_resizing_divider).dragBy(-100f) + } + + withBrowser(noteCount = 1, fragmented = true) { + val editorPane = findViewById(R.id.note_editor_frame) + assertThat( + "the browser's editor pane keeps its default weight", + (editorPane.layoutParams as LinearLayout.LayoutParams).weight, + equalTo(2f), + ) + } + } + @Test fun `deck chip performs a search`() { // The deck chip uses `DeckSelectionListener`, which uses a different code path @@ -2112,13 +2133,13 @@ class CardBrowserTest : RobolectricTest() { supportFragmentManager.setFragmentResult( REQUEST_FIND_AND_REPLACE, Bundle().apply { - putString(ARG_SEARCH, search) - putString(ARG_REPLACEMENT, replacement) - putString(ARG_FIELD, field) - putBoolean(ARG_ONLY_SELECTED_NOTES, onlyInSelectedNotes) + putString(RESULT_SEARCH, search) + putString(RESULT_REPLACEMENT, replacement) + putString(RESULT_FIELD, field) + putBoolean(RESULT_ONLY_SELECTED_NOTES, onlyInSelectedNotes) // "Ignore case" checkbox text => when it's checked we pass false to the backend - putBoolean(ARG_MATCH_CASE, matchCase) - putBoolean(ARG_REGEX, regex) + putBoolean(RESULT_MATCH_CASE, matchCase) + putBoolean(RESULT_REGEX, regex) }, ) } @@ -2204,6 +2225,18 @@ fun setCardBrowserFragmented(value: Boolean) = Prefs.putBoolean(R.string.dev_car fun setUsingSearchView(value: Boolean) = Prefs.putBoolean(R.string.dev_card_browser_search_view, value) +private fun View.dragBy(dx: Float) { + val downTime = SystemClock.uptimeMillis() + for ((action, x) in listOf(MotionEvent.ACTION_DOWN to 0f, MotionEvent.ACTION_MOVE to dx, MotionEvent.ACTION_UP to dx)) { + val event = MotionEvent.obtain(downTime, downTime, action, x, 0f, 0) + try { + dispatchTouchEvent(event) + } finally { + event.recycle() + } + } +} + private fun CardBrowser.rerenderAllCards() { cardBrowserFragment.cardsAdapter.notifyDataSetChanged() advanceRobolectricLooper() diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateEditorScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateEditorScreenshotTest.kt index 91d54f0489ef..1e9b7f2bcdad 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateEditorScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateEditorScreenshotTest.kt @@ -6,6 +6,7 @@ import android.view.Gravity import android.view.View import android.view.ViewGroup import android.widget.FrameLayout +import androidx.appcompat.app.AlertDialog import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat.Type.displayCutout @@ -13,13 +14,17 @@ import androidx.core.view.WindowInsetsCompat.Type.navigationBars import androidx.core.view.WindowInsetsCompat.Type.statusBars import androidx.test.core.app.ActivityScenario import com.google.testing.junit.testparameterinjector.TestParameter +import com.ichi2.anki.common.utils.dp import com.ichi2.testutils.dispatchInsets import com.ichi2.testutils.insetsOf import com.ichi2.testutils.simulateKeyboard -import com.ichi2.utils.dp +import com.ichi2.utils.getInputField +import com.ichi2.utils.positiveButton import org.junit.Assert.assertFalse import org.junit.Test import org.robolectric.RuntimeEnvironment +import org.robolectric.Shadows.shadowOf +import org.robolectric.shadows.ShadowDialog /** * Screenshot tests for [CardTemplateEditor] @@ -27,6 +32,37 @@ import org.robolectric.RuntimeEnvironment * `./gradlew :AnkiDroid:recordRoborazziPlayDebug -Pscreenshot --tests "com.ichi2.anki.CardTemplateEditorScreenshotTest"` */ class CardTemplateEditorScreenshotTest : ScreenshotTest() { + @Test + fun repositionFullSyncConfirmation() = + withCardTemplateEditor(col.notetypes.basicAndReversed) { + col.setSchemaModified() + col.db.execute("update col set ls = scm") + shadowOf(this).clickMenuItem(R.id.action_reposition) + advanceRobolectricLooper() + val dialog = ShadowDialog.getLatestDialog() as AlertDialog + dialog.getInputField().setText("2") + dialog.positiveButton.performClick() + advanceRobolectricLooper() + captureScreen("reposition_full_sync_confirmation") + } + + @Test + fun reposition() = + withCardTemplateEditor(col.notetypes.basicAndReversed) { + openOptionsMenu() + advanceRobolectricLooper() + captureScreen("reposition_menu") + closeOptionsMenu() + shadowOf(this).clickMenuItem(R.id.action_reposition) + advanceRobolectricLooper() + val dialog = ShadowDialog.getLatestDialog() as AlertDialog + dialog.getInputField().setText("2") + captureScreen("reposition_dialog") + dialog.positiveButton.performClick() + advanceRobolectricLooper() + captureScreen("reposition_result") + } + @Test fun basic() { val collectionBasicNoteTypeOriginal = getCurrentDatabaseNoteTypeCopy("Basic") diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateEditorTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateEditorTest.kt index ab14fc41ff5d..19ae5f006546 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateEditorTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateEditorTest.kt @@ -10,14 +10,18 @@ import android.os.Looper import android.view.KeyEvent import android.view.View import android.widget.EditText +import androidx.lifecycle.ViewModelProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.ichi2.anki.CardTemplateEditor.CardTemplateFragment import com.ichi2.anki.CardTemplateEditor.CardTemplateFragment.CardTemplate import com.ichi2.anki.CollectionManager.withCol +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.common.utils.ext.deepClonedInto import com.ichi2.anki.dialogs.InsertFieldDialog +import com.ichi2.anki.dialogs.InsertFieldDialogViewModel import com.ichi2.anki.libanki.CardOrdinal import com.ichi2.anki.libanki.NotetypeJson +import com.ichi2.anki.libanki.Notetypes import com.ichi2.anki.libanki.testutils.ext.addNote import com.ichi2.anki.model.SelectableDeck import com.ichi2.anki.notetype.ManageNoteTypesState.CardEditor @@ -27,7 +31,6 @@ import com.ichi2.anki.scheduling.selectTab import com.ichi2.testutils.assertFalse import com.ichi2.testutils.dispatchInsets import com.ichi2.testutils.withSplitPaneUi -import com.ichi2.utils.dp import com.ichi2.utils.negativeButton import com.ichi2.utils.positiveButton import org.hamcrest.CoreMatchers.equalTo @@ -47,9 +50,55 @@ import kotlin.test.junit5.JUnit5Asserter.assertNotEquals import kotlin.test.junit5.JUnit5Asserter.assertNotNull import kotlin.test.junit5.JUnit5Asserter.assertNull import kotlin.test.junit5.JUnit5Asserter.assertTrue +import kotlin.time.Duration @RunWith(AndroidJUnit4::class) class CardTemplateEditorTest : RobolectricTest() { + @Test + fun `field insertion previews the original card after an unsaved deletion`() { + val note = addBasicAndReversedNote() + val reverseCardId = note.cards().single { it.ord == 1 }.id + val intent = CardTemplateEditor.getIntent(targetContext, col.notetypes.basicAndReversed.id, note.id) + val editor = startActivityNormallyOpenCollectionWithIntent(CardTemplateEditor::class.java, intent) + + with(editor) { + deleteSelectedCardType() + currentFragment!!.showInsertFieldDialog() + advanceRobolectricLooper() + val dialog = supportFragmentManager.fragments.filterIsInstance().single() + val metadata = ViewModelProvider(dialog)[InsertFieldDialogViewModel::class.java].metadata + + assertEquals("The preview should use the surviving card", reverseCardId, metadata.cardId) + } + } + + @Test + fun `deletion confirmation counts the original card type after an unsaved deletion`() { + val noteType = col.notetypes.basicAndReversed + val spare = + Notetypes.newTemplate("Spare").apply { + qfmt = "{{Front}} spare" + afmt = "{{Back}}" + } + col.notetypes.addTemplate(noteType, spare) + addBasicAndReversedNote("one", "back") + addBasicAndReversedNote("two", "") + + withCardTemplateEditor(noteType) { + deleteSelectedCardType() + selectTab(0) + advanceRobolectricLooper() + assertTrue("Unable to delete the card type", shadowOf(this).clickMenuItem(R.id.action_delete)) + advanceRobolectricLooper() + + assertEquals( + "The remaining reverse card type has one card in the database", + getQuantityString(CommonPlurals.card_template_editor_confirm_delete, 1, 1, "Card 2"), + getAlertDialogText(true), + ) + } + } + @Test fun `change detection does not serialize the note type - Issue 21912`() { val original = col.notetypes.basic @@ -275,7 +324,7 @@ class CardTemplateEditorTest : RobolectricTest() { // Assert.assertEquals("Wrong dialog shown?", "This will create NN cards. Proceed?", getDialogText()); // clickDialogButton(WhichButton.POSITIVE); assertTrue("Note type should have changed", testEditor.noteTypeHasChanged()) - assertEquals("Change not pending add?", 1, CardTemplateNotetype.getAdjustedAddOrdinalAtChangeIndex(testEditor.tempNoteType!!, 0)) + assertNull("New templates have no database ordinal", testEditor.tempNoteType!!.getOriginalOrdinal(1)) assertFalse("Ordinal pending add?", testEditor.tempNoteType.isOrdinalPendingAdd(0)) assertTrue("Ordinal not pending add?", testEditor.tempNoteType.isOrdinalPendingAdd(1)) assertEquals("Note type should have 2 templates now", 2, testEditor.tempNoteType!!.templateCount) @@ -389,7 +438,7 @@ class CardTemplateEditorTest : RobolectricTest() { getCurrentDatabaseNoteTypeCopy(noteTypeName).toString().trim(), ) assertFalse("Ordinal pending add?", testEditor.tempNoteType.isOrdinalPendingAdd(0)) - assertEquals("Change incorrectly added to list?", 0, testEditor.templateChangeCount) + assertFalse("A blocked deletion must not change the note type", testEditor.noteTypeHasChanged()) // Assert can delete 'Card 2' assertNotNull("Cannot delete unused template?", collectionBasicNoteTypeOriginal.getCardIds(1)) @@ -480,11 +529,7 @@ class CardTemplateEditorTest : RobolectricTest() { // the templates must be different testEditor.tempNoteType!!.getTemplate(2).qfmt += "different_template" assertTrue("Note type should have changed", testEditor.noteTypeHasChanged()) - assertEquals( - "Change added but not adjusted correctly?", - 2, - CardTemplateNotetype.getAdjustedAddOrdinalAtChangeIndex(testEditor.tempNoteType!!, 0), - ) + assertNull("New templates have no database ordinal", testEditor.tempNoteType!!.getOriginalOrdinal(2)) assertFalse("Ordinal pending add?", testEditor.tempNoteType.isOrdinalPendingAdd(0)) assertFalse("Ordinal pending add?", testEditor.tempNoteType.isOrdinalPendingAdd(1)) assertTrue("Ordinal not pending add?", testEditor.tempNoteType.isOrdinalPendingAdd(2)) @@ -516,22 +561,14 @@ class CardTemplateEditorTest : RobolectricTest() { // Add another template - but we work in memory for a while before saving addCardType(testEditor, shadowTestEditor) - assertEquals( - "Change added but not adjusted correctly?", - 3, - CardTemplateNotetype.getAdjustedAddOrdinalAtChangeIndex(testEditor.tempNoteType!!, 0), - ) + assertNull("New templates have no database ordinal", testEditor.tempNoteType!!.getOriginalOrdinal(3)) assertTrue("Note type should have changed", testEditor.noteTypeHasChanged()) assertEquals("Note type should have 4 templates now", 4, testEditor.tempNoteType?.templateCount) assertFalse("Ordinal pending add?", testEditor.tempNoteType.isOrdinalPendingAdd(0)) assertFalse("Ordinal pending add?", testEditor.tempNoteType.isOrdinalPendingAdd(1)) assertFalse("Ordinal pending add?", testEditor.tempNoteType.isOrdinalPendingAdd(2)) assertTrue("Ordinal not pending add?", testEditor.tempNoteType.isOrdinalPendingAdd(3)) - assertEquals( - "Change added but not adjusted correctly?", - 3, - CardTemplateNotetype.getAdjustedAddOrdinalAtChangeIndex(testEditor.tempNoteType!!, 0), - ) + assertNull("New templates have no database ordinal", testEditor.tempNoteType!!.getOriginalOrdinal(3)) // Delete two pre-existing templates for real now - but still without saving it out, should work fine advanceRobolectricLooper() @@ -570,21 +607,7 @@ class CardTemplateEditorTest : RobolectricTest() { collectionBasicNoteTypeOriginal.toString().trim(), getCurrentDatabaseNoteTypeCopy(noteTypeName).toString().trim(), ) - assertEquals( - "Change added but not adjusted correctly?", - 1, - CardTemplateNotetype.getAdjustedAddOrdinalAtChangeIndex(testEditor.tempNoteType!!, 0), - ) - assertEquals( - "Change incorrectly pending add?", - -1, - CardTemplateNotetype.getAdjustedAddOrdinalAtChangeIndex(testEditor.tempNoteType!!, 1), - ) - assertEquals( - "Change incorrectly pending add?", - -1, - CardTemplateNotetype.getAdjustedAddOrdinalAtChangeIndex(testEditor.tempNoteType!!, 2), - ) + assertNull("New templates have no database ordinal", testEditor.tempNoteType!!.getOriginalOrdinal(1)) // Now confirm everything to persist it to the database assertTrue("Unable to click?", shadowTestEditor.clickMenuItem(R.id.action_confirm)) @@ -661,11 +684,7 @@ class CardTemplateEditorTest : RobolectricTest() { // Add a template - click add, click confirm for card add, click confirm again for full sync addCardType(testEditor, shadowTestEditor) assertTrue("Note type should have changed", testEditor.noteTypeHasChanged()) - assertEquals( - "Change added but not adjusted correctly?", - 1, - CardTemplateNotetype.getAdjustedAddOrdinalAtChangeIndex(testEditor.tempNoteType!!, 1), - ) + assertNull("New templates have no database ordinal", testEditor.tempNoteType!!.getOriginalOrdinal(1)) assertFalse("Ordinal pending add?", testEditor.tempNoteType.isOrdinalPendingAdd(0)) assertTrue("Ordinal not pending add?", testEditor.tempNoteType.isOrdinalPendingAdd(1)) assertEquals("Note type should have 2 templates", 2, testEditor.tempNoteType?.templateCount) @@ -908,8 +927,8 @@ class CardTemplateEditorTest : RobolectricTest() { shadowEditor.nextStartedActivity, Activity.RESULT_OK, Intent() - .putExtra(CardTemplateBrowserAppearanceEditor.INTENT_QUESTION_FORMAT, "q") - .putExtra(CardTemplateBrowserAppearanceEditor.INTENT_ANSWER_FORMAT, "a"), + .putExtra(CardTemplateBrowserAppearanceEditor.EXTRA_QUESTION_FORMAT, "q") + .putExtra(CardTemplateBrowserAppearanceEditor.EXTRA_ANSWER_FORMAT, "a"), ) assertDiscardChangesDialogShown(shadowEditor) } @@ -1069,7 +1088,7 @@ class CardTemplateEditorTest : RobolectricTest() { advanceRobolectricLooper() val resultBundle = Bundle() - resultBundle.putString(InsertFieldDialog.KEY_INSERTED_FIELD, expectedFieldText) + resultBundle.putString(InsertFieldDialog.RESULT_INSERTED_FIELD, expectedFieldText) testEditor.supportFragmentManager.setFragmentResult(firstFragmentAgain.insertFieldRequestKey, resultBundle) advanceRobolectricLooper() @@ -1142,6 +1161,251 @@ class CardTemplateEditorTest : RobolectricTest() { } } + @Test + fun `adding a second card type still counts the notes`() { + addBasicNote() + val intent = Intent(Intent.ACTION_VIEW).putExtra("noteTypeId", col.notetypes.byName("Basic")!!.id) + val controller = + Robolectric + .buildActivity(CardTemplateEditor::class.java, intent) + .create() + .start() + .resume() + .visible() + saveControllerForCleanup(controller) + val editor = controller.get() + + addCardType(editor, shadowOf(editor)) + assertTrue("Unable to click?", shadowOf(editor).clickMenuItem(R.id.action_add)) + advanceRobolectricLooper() + assertEquals( + "Adding from a new card type should count the notes", + getQuantityString(CommonPlurals.card_template_editor_confirm_add, 1, 1), + getAlertDialogText(true), + ) + } + + @Test + fun `adding an optional reverse template with an empty condition creates no cards`() { + val noteType = col.notetypes.byName("Basic (optional reversed card)")!! + val note = col.newNote(noteType) + note.setField(0, "Front") + note.setField(1, "Back") + note.setField(2, "") + col.addNote(note) + assertEquals("Only the forward card should exist", 1, getNoteTypeCardCount(noteType)) + + withCardTemplateEditor(noteType) { + selectTab(1) + advanceRobolectricLooper() + assertEquals("The optional reverse template should be selected", 1, selectedTabPosition) + + assertTrue("Unable to add a card type", shadowOf(this).clickMenuItem(R.id.action_add)) + advanceRobolectricLooper() + val confirmation = getAlertDialogText(true) + clickAlertDialogButton { positiveButton } + assertEquals("The duplicate template should be added", 3, tempNoteType!!.templateCount) + + // Saving rejects identical fronts. Keep the empty condition while making the new front distinct. + advanceRobolectricLooper() + templateFragment(2).binding.editText.setText("{{#Add Reverse}}{{Front}} {{Back}}{{/Add Reverse}}") + + assertTrue("Unable to save the templates", shadowOf(this).clickMenuItem(R.id.action_confirm)) + advanceRobolectricLooper() + val savedNoteType = col.notetypes.get(noteType.id)!! + assertEquals("The duplicate template should be saved", 3, savedNoteType.templates.length()) + assertEquals("An empty Add Reverse field should prevent generating another card", 1, getNoteTypeCardCount(noteType)) + assertEquals( + "The confirmation must not promise a card that will not be generated", + getQuantityString(CommonPlurals.card_template_editor_confirm_add, 0, 0), + confirmation, + ) + } + } + + @Test + fun `adding from an unsaved optional reverse template creates no cards`() { + val noteType = col.notetypes.byName("Basic (optional reversed card)")!! + val note = col.newNote(noteType) + note.setField(0, "Front") + note.setField(1, "Back") + note.setField(2, "") + col.addNote(note) + assertEquals("Only the forward card should exist", 1, getNoteTypeCardCount(noteType)) + + withCardTemplateEditor(noteType) { + selectTab(1) + advanceRobolectricLooper() + addCardType(this, shadowOf(this)) + advanceRobolectricLooper() + assertEquals("The first duplicate should be selected", 2, selectedTabPosition) + assertTrue( + "The selected template must be unsaved", + CardTemplateNotetype.isOrdinalPendingAdd(tempNoteType!!, selectedTabPosition), + ) + + // Keep the empty condition, but make each front distinct so saving succeeds. + templateFragment(2).binding.editText.setText("{{#Add Reverse}}{{Front}} {{Back}}{{/Add Reverse}}") + assertTrue("Unable to add a card type", shadowOf(this).clickMenuItem(R.id.action_add)) + advanceRobolectricLooper() + val confirmation = getAlertDialogText(true) + clickAlertDialogButton { positiveButton } + advanceRobolectricLooper() + assertEquals("The second duplicate should be selected", 3, selectedTabPosition) + templateFragment(3).binding.editText.setText("{{#Add Reverse}}{{Back}} {{Front}}{{/Add Reverse}}") + + assertTrue("Unable to save the templates", shadowOf(this).clickMenuItem(R.id.action_confirm)) + advanceRobolectricLooper() + assertEquals( + "Both new templates should be saved", + 4, + col.notetypes + .get(noteType.id)!! + .templates + .length(), + ) + assertEquals("Neither conditional template should generate cards", 1, getNoteTypeCardCount(noteType)) + assertEquals( + "Adding from an unsaved conditional template must not promise a card that will not be generated", + getQuantityString(CommonPlurals.card_template_editor_confirm_add, 0, 0), + confirmation, + ) + } + } + + @Test + fun `adding from a broken template does not crash`() { + addBasicAndReversedNote() + withCardTemplateEditor(col.notetypes.basicAndReversed) { + templateFragment(0).binding.editText.setText("{{#Front}}") + assertTrue("Unable to add a card type", shadowOf(this).clickMenuItem(R.id.action_add)) + advanceRobolectricLooper() + assertEquals( + "A broken template should not create cards", + getQuantityString(CommonPlurals.card_template_editor_confirm_add, 0, 0), + getAlertDialogText(true), + ) + } + } + + @Test + fun `adding a template with a card number condition counts generated cards`() { + addBasicAndReversedNote() + val noteType = col.notetypes.basicAndReversed + val initialCardCount = getNoteTypeCardCount(noteType) + assertEquals("Both original cards should exist", 2, initialCardCount) + + withCardTemplateEditor(noteType) { + // Preview supplies c3 for the new template, but card generation does not. + templateFragment(0).binding.editText.setText("{{#c3}}{{Front}}{{/c3}}") + assertTrue("Unable to add a card type", shadowOf(this).clickMenuItem(R.id.action_add)) + advanceRobolectricLooper() + val confirmation = getAlertDialogText(true) + clickAlertDialogButton { positiveButton } + advanceRobolectricLooper() + assertEquals("The new template should be selected", 2, selectedTabPosition) + + // Avoid identical fronts without changing the condition or field requirements. + templateFragment(2).binding.editText.setText("{{#c3}}{{Front}} extra{{/c3}}") + assertTrue("Unable to save the templates", shadowOf(this).clickMenuItem(R.id.action_confirm)) + advanceRobolectricLooper() + assertEquals( + "The new template should be saved", + 3, + col.notetypes + .get(noteType.id)!! + .templates + .length(), + ) + val createdCards = getNoteTypeCardCount(noteType) - initialCardCount + assertEquals("The card number condition should prevent generation", 0, createdCards) + assertEquals( + "The confirmation must count generated cards, not nonempty previews", + getQuantityString(CommonPlurals.card_template_editor_confirm_add, createdCards, createdCards), + confirmation, + ) + } + } + + @Test + fun `counting falls back to the note count when it times out`() { + val noteType = col.notetypes.byName("Basic (optional reversed card)")!! + val note = col.newNote(noteType) + note.setField(0, "Front") + note.setField(1, "Back") + col.addNote(note) + val reverseTemplate = noteType.templates[1] + + assertEquals("No reverse card is created", 0, col.countCardsCreatedBy(noteType, reverseTemplate)) + assertEquals("A timeout counts every note", 1, col.countCardsCreatedBy(noteType, reverseTemplate, timeout = Duration.ZERO)) + } + + @Test + fun `a failed save does not add card types - Issue 19953`() { + addBasicNote() + val noteType = col.notetypes.basic + val savedNames = noteType.templatesNames + + withCardTemplateEditor(noteType) { + repeat(2) { + assertTrue("Unable to add a card type", shadowOf(this).clickMenuItem(R.id.action_add)) + advanceRobolectricLooper() + clickAlertDialogButton { positiveButton } + advanceRobolectricLooper() + } + assertEquals("The new card types should share a front", tempNoteType!!.getTemplate(1).qfmt, tempNoteType!!.getTemplate(2).qfmt) + + throwOnShowError = false + saveChanges() + assertEquals("A failed save must not add card types", savedNames, col.notetypes.get(noteType.id)!!.templatesNames) + + templateFragment(2).binding.editText.setText("{{Back}} {{Front}}") + val editedNames = tempNoteType!!.notetype.templatesNames + saveChanges() + assertEquals("Saving again should add each card type once", editedNames, col.notetypes.get(noteType.id)!!.templatesNames) + } + } + + @Test + fun `deleting the first card type keeps the cards of the second`() { + val note = addBasicAndReversedNote() + val reverseCardId = note.cards().single { it.ord == 1 }.id + + withCardTemplateEditor(col.notetypes.basicAndReversed) { + deleteSelectedCardType() + saveChanges() + } + + assertEquals("Only the deleted card type's card should be removed", listOf(reverseCardId), note.cids()) + } + + @Test + fun `deleting the first card type keeps the cards of the second after recreation`() { + val note = addBasicAndReversedNote() + val reverseCardId = note.cards().single { it.ord == 1 }.id + val intent = CardEditor(ntid = col.notetypes.basicAndReversed.id).toIntent(targetContext) + val controller = startActivityControllerNormallyOpenCollectionWithIntent(CardTemplateEditor::class.java, intent) + + controller.get().deleteSelectedCardType() + controller.recreate() + advanceRobolectricLooper() + controller.get().saveChanges() + + assertEquals("Only the deleted card type's card should be removed", listOf(reverseCardId), note.cids()) + } + + private fun CardTemplateEditor.deleteSelectedCardType() { + assertTrue("Unable to delete the card type", shadowOf(this).clickMenuItem(R.id.action_delete)) + advanceRobolectricLooper() + clickAlertDialogButton { positiveButton } + advanceRobolectricLooper() + } + + private fun CardTemplateEditor.saveChanges() { + assertTrue("Unable to save", shadowOf(this).clickMenuItem(R.id.action_confirm)) + advanceRobolectricLooper() + } + private fun CardTemplateEditor.templateFragment(ord: Int) = supportFragmentManager.findFragmentByTag("f$ord") as CardTemplateFragment private fun addCardType( @@ -1214,9 +1478,6 @@ Hello World{{Front}} return CardTemplateNotetype.isOrdinalPendingAdd(this, ordinal) } - private val CardTemplateEditor.templateChangeCount - get() = tempNoteType?.templateChanges?.size - private suspend fun NotetypeJson.getCardIds(vararg ords: Int): List? = withCol { notetypes.getCardIdsForNoteType(id, ords) } } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateNotetypeTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateNotetypeTest.kt index 6201f6aa4ea1..6bc4c2c4b8f0 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateNotetypeTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateNotetypeTest.kt @@ -4,26 +4,45 @@ package com.ichi2.anki import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.ichi2.anki.CardTemplateNotetype.ChangeType.ADD -import com.ichi2.anki.CardTemplateNotetype.ChangeType.DELETE -import com.ichi2.anki.CardTemplateNotetype.TemplateChange -import com.ichi2.anki.compat.CompatHelper.Companion.getSerializableCompat import com.ichi2.anki.libanki.NotetypeJson +import com.ichi2.anki.libanki.Notetypes +import com.ichi2.anki.libanki.utils.append +import com.ichi2.anki.libanki.utils.remove +import net.ankiweb.rsdroid.BackendException import org.json.JSONObject import org.junit.Assert import org.junit.Test import org.junit.runner.RunWith import timber.log.Timber -import java.io.ByteArrayInputStream -import java.io.ByteArrayOutputStream import java.io.IOException -import java.io.ObjectInputStream -import java.io.ObjectOutputStream -import java.io.Serializable import kotlin.test.junit5.JUnit5Asserter.assertNotNull +import kotlin.test.junit5.JUnit5Asserter.assertNull @RunWith(AndroidJUnit4::class) class CardTemplateNotetypeTest : RobolectricTest() { + @Test + fun `failed validation preserves a bundle saved before the save attempt`() = + runTest { + val original = col.notetypes.basicAndReversed + val edited = CardTemplateNotetype(original.deepClone()) + edited.getTemplate(0).qfmt = "{{Missing}}" + val state = edited.toBundle() + + try { + edited.saveToDatabase() + Assert.fail("An unknown field must fail validation") + } catch (_: BackendException) { + // The saved bundle must remain usable after validation fails. + } + + val restored = CardTemplateNotetype.fromBundle(state) + assertNotNull("Failed validation must preserve the saved editor state", restored) + Assert.assertEquals(edited.notetype.toString(), restored!!.notetype.toString()) + restored.getTemplate(0).qfmt = original.templates[0].qfmt + restored.saveToDatabase() + assertNull("A successful save should clear the temporary file", CardTemplateNotetype.fromBundle(state)) + } + @Test @Throws(Exception::class) fun testTempNoteTypeStorage() { @@ -55,146 +74,117 @@ class CardTemplateNotetypeTest : RobolectricTest() { } @Test - fun testTemplateChangeSerialization() { - // Create a list of changes with both ADD and DELETE types - val original = - arrayListOf( - TemplateChange(0, ADD), - TemplateChange(1, DELETE), - TemplateChange(2, ADD), - ) + fun `deletion checks preserve database ordinals across additions and deletions`() { + val edited = CardTemplateNotetype(col.notetypes.basicAndReversed.deepClone()) + edited.appendTemplate("Third") + edited.appendTemplate("Fourth") + edited.deleteTemplate(1) + edited.deleteTemplate(1) + + Assert.assertArrayEquals(intArrayOf(1, 0), edited.getDeleteDbOrds(0)) + Assert.assertEquals(0, edited.getOriginalOrdinal(0)) + assertNull("An unsaved addition must have no database ordinal", edited.getOriginalOrdinal(1)) + Assert.assertTrue(CardTemplateNotetype.isOrdinalPendingAdd(edited, 1)) + + val restored = CardTemplateNotetype.fromBundle(edited.toBundle())!! + Assert.assertArrayEquals(intArrayOf(1), restored.getDeleteDbOrds(1)) + restored.deleteTemplate(1) + restored.appendTemplate("Replacement") + Assert.assertArrayEquals(intArrayOf(1, 0), restored.getDeleteDbOrds(0)) + Assert.assertTrue(CardTemplateNotetype.isOrdinalPendingAdd(restored, 1)) + } - // Serialize the list to bytes (this is what Bundle.putSerializable does) - val byteOutput = ByteArrayOutputStream() - ObjectOutputStream(byteOutput).use { - it.writeObject(original) - } - val bytes = byteOutput.toByteArray() - - // Deserialize back from bytes (this is what Bundle.getSerializable does) - @Suppress("UNCHECKED_CAST") - val deserialized = - ObjectInputStream(ByteArrayInputStream(bytes)).use { - it.readObject() - } as ArrayList - - // Verify the deserialized data matches the original - Assert.assertEquals("list size should match", original.size, deserialized.size) - for (i in original.indices) { - Assert.assertEquals("ordinal at $i", original[i].ordinal, deserialized[i].ordinal) - Assert.assertEquals("type at $i", original[i].type, deserialized[i].type) + @Test + fun `deletion checks retain the order of multiple original deletions`() { + val notetype = col.notetypes.basicAndReversed.deepClone() + for (name in listOf("Third", "Fourth")) { + notetype.templates.append(Notetypes.newTemplate(name)) } + Notetypes._updateTemplOrds(notetype) + val edited = CardTemplateNotetype(notetype) + edited.deleteTemplate(1) + edited.deleteTemplate(0) + + Assert.assertArrayEquals(intArrayOf(1, 0, 2), edited.getDeleteDbOrds(0)) + Assert.assertEquals(2, edited.getOriginalOrdinal(0)) + Assert.assertEquals(3, edited.getOriginalOrdinal(1)) } @Test - fun testAddDeleteTracking() { - // Assume you start with a 2 template model (like "Basic (and reversed)") - // Add a 3rd new template, remove the 2nd, remove the 1st, add a new now-2nd, remove 1st again - // ...and it should reduce to just removing the original 1st/2nd and adding the final as first - val tempNotetype = CardTemplateNotetype(NotetypeJson("{ \"foo\": \"bar\" }")) - - tempNotetype.addTemplateChange(ADD, 3) - val expected1 = arrayOf(TemplateChange(3, ADD)) - // 3 templates and one change now - assertTemplateChangesEqual(expected1, tempNotetype.templateChanges) - assertTemplateChangesEqual(expected1, tempNotetype.adjustedTemplateChanges) - Assert.assertArrayEquals(intArrayOf(3), tempNotetype.getDeleteDbOrds(3)) - - tempNotetype.addTemplateChange(DELETE, 2) - // 2 templates and two changes now - val expected2 = arrayOf(TemplateChange(3, ADD), TemplateChange(2, DELETE)) - val adjExpected2 = arrayOf(TemplateChange(2, ADD), TemplateChange(2, DELETE)) - assertTemplateChangesEqual(expected2, tempNotetype.templateChanges) - assertTemplateChangesEqual(adjExpected2, tempNotetype.adjustedTemplateChanges) - Assert.assertArrayEquals(intArrayOf(2, 4), tempNotetype.getDeleteDbOrds(3)) - - tempNotetype.addTemplateChange(DELETE, 1) - // 1 template and three changes now - Assert.assertArrayEquals(intArrayOf(2, 1, 5), tempNotetype.getDeleteDbOrds(3)) - val expected3 = arrayOf(TemplateChange(3, ADD), TemplateChange(2, DELETE), TemplateChange(1, DELETE)) - val adjExpected3 = arrayOf(TemplateChange(1, ADD), TemplateChange(2, DELETE), TemplateChange(1, DELETE)) - assertTemplateChangesEqual(expected3, tempNotetype.templateChanges) - assertTemplateChangesEqual(adjExpected3, tempNotetype.adjustedTemplateChanges) - - tempNotetype.addTemplateChange(ADD, 2) - // 2 templates and 4 changes now - Assert.assertArrayEquals(intArrayOf(2, 1, 5), tempNotetype.getDeleteDbOrds(3)) - val expected4 = arrayOf(TemplateChange(3, ADD), TemplateChange(2, DELETE), TemplateChange(1, DELETE), TemplateChange(2, ADD)) - val adjExpected4 = arrayOf(TemplateChange(1, ADD), TemplateChange(2, DELETE), TemplateChange(1, DELETE), TemplateChange(2, ADD)) - assertTemplateChangesEqual(expected4, tempNotetype.templateChanges) - assertTemplateChangesEqual(adjExpected4, tempNotetype.adjustedTemplateChanges) - - // Make sure we can resurrect these changes across lifecycle - val outBundle = tempNotetype.toBundle() - assertTemplateChangesEqual(expected4, outBundle.getSerializableCompat("mTemplateChanges")) - - // This is the hard part. We will delete a template we added so everything shifts. - // The template currently at ordinal 1 was added as template 3 at the start before it slid down on the deletes - // So the first template add should be negated by this delete, and the second template add should slide down to 1 - tempNotetype.addTemplateChange(DELETE, 1) - // 1 template and 3 changes now (the delete just cancelled out one of the adds) - Assert.assertArrayEquals(intArrayOf(2, 1, 5), tempNotetype.getDeleteDbOrds(3)) - val expected5 = arrayOf(TemplateChange(2, DELETE), TemplateChange(1, DELETE), TemplateChange(1, ADD)) - val adjExpected5 = arrayOf(TemplateChange(2, DELETE), TemplateChange(1, DELETE), TemplateChange(1, ADD)) - assertTemplateChangesEqual(expected5, tempNotetype.templateChanges) - assertTemplateChangesEqual(adjExpected5, tempNotetype.adjustedTemplateChanges) - - tempNotetype.addTemplateChange(ADD, 2) - // 2 template and 4 changes now (the delete just cancelled out one of the adds) - Assert.assertArrayEquals(intArrayOf(2, 1, 5), tempNotetype.getDeleteDbOrds(3)) - val expected6 = arrayOf(TemplateChange(2, DELETE), TemplateChange(1, DELETE), TemplateChange(1, ADD), TemplateChange(2, ADD)) - val adjExpected6 = arrayOf(TemplateChange(2, DELETE), TemplateChange(1, DELETE), TemplateChange(1, ADD), TemplateChange(2, ADD)) - assertTemplateChangesEqual(expected6, tempNotetype.templateChanges) - assertTemplateChangesEqual(adjExpected6, tempNotetype.adjustedTemplateChanges) - - tempNotetype.addTemplateChange(ADD, 3) - // 2 template and 4 changes now (the delete just cancelled out one of the adds) - Assert.assertArrayEquals(intArrayOf(2, 1, 5), tempNotetype.getDeleteDbOrds(3)) - val expected7 = - arrayOf( - TemplateChange(2, DELETE), - TemplateChange(1, DELETE), - TemplateChange(1, ADD), - TemplateChange(2, ADD), - TemplateChange(3, ADD), - ) - val adjExpected7 = - arrayOf( - TemplateChange(2, DELETE), - TemplateChange(1, DELETE), - TemplateChange(1, ADD), - TemplateChange(2, ADD), - TemplateChange(3, ADD), + fun `all reposition destinations preserve the cards belonging to each template`() = + runTest { + val original = col.notetypes.basicAndReversed + col.notetypes.addTemplate( + original, + Notetypes.newTemplate("Third").apply { + qfmt = "{{Front}} third" + afmt = "{{Back}}" + }, ) - assertTemplateChangesEqual(expected7, tempNotetype.templateChanges) - assertTemplateChangesEqual(adjExpected7, tempNotetype.adjustedTemplateChanges) - - tempNotetype.addTemplateChange(DELETE, 3) - // 1 template and 3 changes now (two deletes cancelled out adds) - Assert.assertArrayEquals(intArrayOf(2, 1, 5), tempNotetype.getDeleteDbOrds(3)) - val expected8 = arrayOf(TemplateChange(2, DELETE), TemplateChange(1, DELETE), TemplateChange(1, ADD), TemplateChange(2, ADD)) - val adjExpected8 = arrayOf(TemplateChange(2, DELETE), TemplateChange(1, DELETE), TemplateChange(1, ADD), TemplateChange(2, ADD)) - assertTemplateChangesEqual(expected8, tempNotetype.templateChanges) - assertTemplateChangesEqual(adjExpected8, tempNotetype.adjustedTemplateChanges) - } - - @Suppress("UNCHECKED_CAST") - private fun assertTemplateChangesEqual( - expected: Array, - actual: Serializable?, - ) { - if (actual !is ArrayList<*>) { - Assert.fail("actual array null or not the correct type") + val note = addBasicAndReversedNote() + val originalCards = note.cards().associate { it.id to it.template().name } + for (from in 0..2) { + for (to in 0..2) { + if (from == to) continue + val edited = CardTemplateNotetype(col.notetypes.get(original.id)!!.deepClone()) + val expectedNames = original.templatesNames.toMutableList() + expectedNames.add(to, expectedNames.removeAt(from)) + edited.repositionTemplate(from, to) + edited.saveToDatabase() + + Assert.assertEquals(expectedNames, col.notetypes.get(original.id)!!.templatesNames) + Assert.assertEquals(originalCards, note.cards().associate { it.id to it.template().name }) + col.undo() + } + } } - Assert.assertEquals( - "arrays didn't have the same length?", - expected.size.toLong(), - (actual as ArrayList).size.toLong(), - ) - for (i in expected.indices) { - val actualChange = actual[i] - Assert.assertEquals("ordinal at $i not correct?", expected[i].ordinal, actualChange.ordinal) - Assert.assertEquals("changeType at $i not correct?", expected[i].type, actualChange.type) + + @Test + fun `mixed moves additions and deletions survive recreation and a failed save`() = + runTest { + val original = col.notetypes.basicAndReversed + val note = addBasicAndReversedNote() + val originalCards = note.cards().sortedBy { it.ord } + val edited = CardTemplateNotetype(original.deepClone()) + edited.appendTemplate("New") + edited.getTemplate(2).apply { + qfmt = "{{Front}} new" + afmt = "{{Back}}" + } + edited.repositionTemplate(2, 0) + edited.deleteTemplate(2) + edited.repositionTemplate(1, 0) + Assert.assertArrayEquals(intArrayOf(1, 0), edited.getDeleteDbOrds(0)) + Assert.assertTrue(CardTemplateNotetype.isOrdinalPendingAdd(edited, 1)) + edited.getTemplate(0).qfmt = "{{Missing}}" + + val restored = CardTemplateNotetype.fromBundle(edited.toBundle())!! + try { + restored.saveToDatabase() + Assert.fail("An unknown field must fail validation") + } catch (_: BackendException) { + Assert.assertEquals(originalCards.map { it.id }.toSet(), note.cids().toSet()) + } + restored.getTemplate(0).qfmt = original.templates[0].qfmt + restored.saveToDatabase() + + Assert.assertEquals(listOf("Card 1", "New"), col.notetypes.get(original.id)!!.templatesNames) + Assert.assertEquals(originalCards[0].id, note.cards().single { it.ord == 0 }.id) + Assert.assertFalse(note.cids().contains(originalCards[1].id)) + Assert.assertEquals(2, note.cids().size) + col.undo() + Assert.assertEquals(originalCards.map { it.id }.toSet(), note.cids().toSet()) } + + private fun CardTemplateNotetype.appendTemplate(name: String) { + notetype.templates.append(Notetypes.newTemplate(name)) + Notetypes._updateTemplOrds(notetype) + addNewTemplate() + } + + private fun CardTemplateNotetype.deleteTemplate(ordinal: Int) { + removeTemplate(ordinal) + notetype.templates.remove(getTemplate(ordinal)) + Notetypes._updateTemplOrds(notetype) } } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateRepositionTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateRepositionTest.kt new file mode 100644 index 000000000000..8c77f4f3d4dd --- /dev/null +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateRepositionTest.kt @@ -0,0 +1,312 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki + +import androidx.appcompat.app.AlertDialog +import androidx.lifecycle.ViewModelProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.ichi2.anki.dialogs.InsertFieldDialog +import com.ichi2.anki.dialogs.InsertFieldDialogViewModel +import com.ichi2.anki.libanki.Notetypes +import com.ichi2.anki.libanki.testutils.ext.addNote +import com.ichi2.testutils.withSplitPaneUi +import com.ichi2.utils.getInputField +import com.ichi2.utils.negativeButton +import com.ichi2.utils.positiveButton +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.Shadows.shadowOf +import org.robolectric.shadows.ShadowDialog + +@RunWith(AndroidJUnit4::class) +class CardTemplateRepositionTest : RobolectricTest() { + @Test + fun `reposition keeps edits and editor selection with the moved template`() { + withCardTemplateEditor(col.notetypes.basicAndReversed) { + val expectedFront = tempNoteType!!.getTemplate(0).qfmt + " unsaved edit" + currentFragment!!.binding.editText.setText(expectedFront) + currentFragment!!.binding.bottomNavigation.selectedItemId = R.id.back_edit + val expectedBack = + currentFragment!! + .binding.editText.text + .toString() + currentFragment!!.binding.editText.setSelection(4) + + moveSelectedTemplateTo(2) + + assertEquals(listOf("Card 2", "Card 1"), tempNoteType!!.notetype.templatesNames) + assertEquals(1, selectedTabPosition) + assertEquals( + "Card 1", + topBinding.slidingTabs + .getTabAt(1)!! + .text + .toString(), + ) + assertEquals(R.id.back_edit, currentFragment!!.binding.bottomNavigation.selectedItemId) + assertEquals( + expectedBack, + currentFragment!! + .binding.editText.text + .toString(), + ) + assertEquals(4, currentFragment!!.binding.editText.selectionStart) + assertEquals(expectedFront, tempNoteType!!.getTemplate(1).qfmt) + assertEquals(0, tempNoteType!!.getOriginalOrdinal(1)) + assertTrue(noteTypeHasChanged()) + assertTrue(displayDiscardChangesCallback.isEnabled) + + // Edits after the move must write to the new position, without changing the other template. + currentFragment!!.binding.editText.append(" moved back") + assertEquals(expectedBack + " moved back", tempNoteType!!.getTemplate(1).afmt) + assertEquals( + col.notetypes.basicAndReversed.templates[1] + .afmt, + tempNoteType!!.getTemplate(0).afmt, + ) + + moveSelectedTemplateTo(1) + assertEquals(0, selectedTabPosition) + assertEquals( + expectedBack + " moved back", + currentFragment!! + .binding.editText.text + .toString(), + ) + } + } + + @Test + fun `saving a reposition preserves card identities and scheduling and supports undo`() = + runTest { + val note = addBasicAndReversedNote() + val originalCards = note.cards().sortedBy { it.ord } + val scheduledCard = + originalCards.first().apply { + due = 123 + ivl = 7 + } + col.updateCard(scheduledCard) + + withCardTemplateEditor(col.notetypes.basicAndReversed) { + moveSelectedTemplateTo(2) + assertEquals(listOf("Card 1", "Card 2"), col.notetypes.basicAndReversed.templatesNames) + assertEquals(listOf(0, 1), originalCards.map { col.getCard(it.id).ord }) + saveChanges() + } + + assertEquals(listOf("Card 2", "Card 1"), col.notetypes.basicAndReversed.templatesNames) + assertEquals(listOf(1, 0), originalCards.map { col.getCard(it.id).ord }) + assertEquals(123, col.getCard(scheduledCard.id).due) + assertEquals(7, col.getCard(scheduledCard.id).ivl) + assertEquals(originalCards.map { it.id }.toSet(), note.cids().toSet()) + + col.undo() + assertEquals(listOf("Card 1", "Card 2"), col.notetypes.basicAndReversed.templatesNames) + assertEquals(listOf(0, 1), originalCards.map { col.getCard(it.id).ord }) + col.redo() + assertEquals(listOf(1, 0), originalCards.map { col.getCard(it.id).ord }) + } + + @Test + fun `deleting a moved template after recreation deletes only its cards`() { + val note = addBasicAndReversedNote() + val reverseCardId = note.cards().single { it.ord == 1 }.id + val intent = CardTemplateEditor.getIntent(targetContext, col.notetypes.basicAndReversed.id, note.id, ord = 0) + val controller = startActivityControllerNormallyOpenCollectionWithIntent(CardTemplateEditor::class.java, intent) + + controller.get().moveSelectedTemplateTo(2) + controller.recreate() + advanceRobolectricLooper() + with(controller.get()) { + assertEquals(1, selectedTabPosition) + deleteSelectedTemplate() + saveChanges() + } + + assertEquals(listOf(reverseCardId), note.cids()) + assertEquals(listOf("Card 2"), col.notetypes.basicAndReversed.templatesNames) + } + + @Test + fun `moving and deleting an unsaved addition preserves the original cards`() { + val note = addBasicAndReversedNote() + val originalIds = note.cids().toSet() + withCardTemplateEditor(col.notetypes.basicAndReversed) { + assertTrue(shadowOf(this).clickMenuItem(R.id.action_add)) + advanceRobolectricLooper() + clickAlertDialogButton { positiveButton } + advanceRobolectricLooper() + assertEquals(2, selectedTabPosition) + + moveSelectedTemplateTo(1) + assertTrue(CardTemplateNotetype.isOrdinalPendingAdd(tempNoteType!!, 0)) + deleteSelectedTemplate() + assertEquals(listOf("Card 1", "Card 2"), tempNoteType!!.notetype.templatesNames) + assertFalse(noteTypeHasChanged()) + saveChanges() + } + assertEquals(originalIds, note.cids().toSet()) + } + + @Test + fun `deletion checks after a move use the original ordinal`() { + val noteType = col.notetypes.byName("Basic (optional reversed card)")!! + col.addNote( + col.newNote(noteType).apply { + setField(0, "Front") + setField(1, "Back") + }, + ) + withCardTemplateEditor(noteType) { + moveSelectedTemplateTo(2) + assertTrue(shadowOf(this).clickMenuItem(R.id.action_delete)) + advanceRobolectricLooper() + assertEquals(getResourceString(CommonString.orphan_note_message), getAlertDialogText(true)) + clickAlertDialogButton { positiveButton } + assertEquals(2, tempNoteType!!.templateCount) + } + } + + @Test + fun `deletion confirmation counts the moved card type`() { + val noteType = col.notetypes.basicAndReversed + val spare = + Notetypes.newTemplate("Spare").apply { + qfmt = "{{Front}} spare" + afmt = "{{Back}}" + } + col.notetypes.addTemplate(noteType, spare) + addBasicAndReversedNote("one", "back") + addBasicAndReversedNote("two", "") + + withCardTemplateEditor(noteType) { + selectTab(1) + advanceRobolectricLooper() + moveSelectedTemplateTo(1) + assertTrue(shadowOf(this).clickMenuItem(R.id.action_delete)) + advanceRobolectricLooper() + assertEquals( + getQuantityString(CommonPlurals.card_template_editor_confirm_delete, 1, 1, "Card 2"), + getAlertDialogText(true), + ) + } + } + + @Test + fun `field insertion after a move previews the original card`() { + val note = addBasicAndReversedNote() + val forwardCardId = note.cards().single { it.ord == 0 }.id + val intent = CardTemplateEditor.getIntent(targetContext, col.notetypes.basicAndReversed.id, note.id) + val editor = startActivityNormallyOpenCollectionWithIntent(CardTemplateEditor::class.java, intent) + with(editor) { + moveSelectedTemplateTo(2) + currentFragment!!.showInsertFieldDialog() + advanceRobolectricLooper() + val dialog = supportFragmentManager.fragments.filterIsInstance().single() + val metadata = ViewModelProvider(dialog)[InsertFieldDialogViewModel::class.java].metadata + assertEquals(forwardCardId, metadata.cardId) + } + } + + @Test + fun `split preview follows the moved template`() = + withSplitPaneUi { + withCardTemplateEditor(col.notetypes.basicAndReversed) { + moveSelectedTemplateTo(2) + assertEquals(1, previewer.ord) + assertEquals(1, selectedTabPosition) + } + } + + @Test + fun `cancel and the current position leave the note type unchanged`() { + withCardTemplateEditor(col.notetypes.basicAndReversed) { + assertTrue(shadowOf(this).clickMenuItem(R.id.action_reposition)) + advanceRobolectricLooper() + clickAlertDialogButton { negativeButton } + assertFalse(noteTypeHasChanged()) + moveSelectedTemplateTo(1) + assertFalse(noteTypeHasChanged()) + assertFalse(displayDiscardChangesCallback.isEnabled) + assertEquals(0, selectedTabPosition) + } + } + + @Test + fun `a synced collection requires confirmation before repositioning`() { + val note = addBasicAndReversedNote() + val originalIds = note.cids().toSet() + // Align the schema timestamp with the mock clock before simulating a completed sync. + col.setSchemaModified() + col.db.execute("update col set ls = scm") + assertFalse(col.schemaChanged()) + withCardTemplateEditor(col.notetypes.basicAndReversed) { + moveSelectedTemplateTo(2) + assertEquals(getResourceString(CommonString.full_sync_confirmation), getAlertDialogText(true)) + assertFalse(noteTypeHasChanged()) + clickAlertDialogButton { negativeButton } + advanceRobolectricLooper() + assertFalse(noteTypeHasChanged()) + assertFalse(col.schemaChanged()) + assertEquals(0, selectedTabPosition) + + moveSelectedTemplateTo(2) + clickAlertDialogButton { positiveButton } + advanceRobolectricLooper() + assertEquals(listOf("Card 2", "Card 1"), tempNoteType!!.notetype.templatesNames) + assertTrue(col.schemaChanged()) + saveChanges() + } + assertEquals(originalIds, note.cids().toSet()) + } + + @Test + fun `the current position does not require a full sync`() { + col.setSchemaModified() + col.db.execute("update col set ls = scm") + withCardTemplateEditor(col.notetypes.basicAndReversed) { + moveSelectedTemplateTo(1) + assertFalse(noteTypeHasChanged()) + assertFalse(col.schemaChanged()) + assertFalse(ShadowDialog.getLatestDialog().isShowing) + } + } + + @Test + fun `reposition is available only for standard note types with multiple templates`() { + for (noteType in listOf(col.notetypes.basic, col.notetypes.cloze, col.notetypes.byName("Image Occlusion")!!)) { + withCardTemplateEditor(noteType) { + assertFalse(shadowOf(this).optionsMenu!!.findItem(R.id.action_reposition).isVisible) + } + } + withCardTemplateEditor(col.notetypes.basicAndReversed) { + assertTrue(shadowOf(this).optionsMenu!!.findItem(R.id.action_reposition).isVisible) + } + } + + private fun CardTemplateEditor.moveSelectedTemplateTo(position: Int) { + assertTrue(shadowOf(this).clickMenuItem(R.id.action_reposition)) + advanceRobolectricLooper() + val dialog = ShadowDialog.getLatestDialog() as AlertDialog + dialog.getInputField().setText(position.toString()) + assertTrue(dialog.positiveButton.isEnabled) + dialog.positiveButton.performClick() + advanceRobolectricLooper() + } + + private fun CardTemplateEditor.deleteSelectedTemplate() { + assertTrue(shadowOf(this).clickMenuItem(R.id.action_delete)) + advanceRobolectricLooper() + clickAlertDialogButton { positiveButton } + advanceRobolectricLooper() + } + + private fun CardTemplateEditor.saveChanges() { + assertTrue(shadowOf(this).clickMenuItem(R.id.action_confirm)) + advanceRobolectricLooper() + } +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CardUtilsTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CardUtilsTest.kt index 8a9aa58831c2..c3b74a73f6db 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/CardUtilsTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CardUtilsTest.kt @@ -3,14 +3,12 @@ package com.ichi2.anki -import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.ichi2.testutils.JvmTest import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.equalTo import org.junit.Test -import org.junit.runner.RunWith -@RunWith(AndroidJUnit4::class) -class CardUtilsTest : RobolectricTest() { +class CardUtilsTest : JvmTest() { @Test fun getDeckIdForCard_regularDeck_returnsDid() { val note = addBasicNote("Front", "Back") diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CollectionLeaseTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CollectionLeaseTest.kt index 8c56fa4b4368..bdf4f1550c65 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/CollectionLeaseTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CollectionLeaseTest.kt @@ -11,6 +11,7 @@ import com.ichi2.anki.CollectionManager.withLeaseForTest import com.ichi2.anki.exception.CollectionLockedException import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.async @@ -144,6 +145,7 @@ class CollectionLeaseTest : RobolectricTest() { fun `a lease cannot overtake brief work paused before queue dispatch`() = runTest { val queue = StandardTestDispatcher(testScheduler) + val pausedBrief = CoroutineName("paused brief") var dispatchBrief: (() -> Unit)? = null val pausedQueue = object : CoroutineDispatcher() { @@ -151,8 +153,10 @@ class CollectionLeaseTest : RobolectricTest() { context: CoroutineContext, block: Runnable, ) { - if (dispatchBrief == null) { + if (context[CoroutineName] === pausedBrief) { // Pause after admission but before submitting to the serial queue. + // Only this coroutine may save dispatchBrief: application background + // work can dispatch concurrently and must not overwrite the saved task. dispatchBrief = { queue.dispatch(context, block) } } else { queue.dispatch(context, block) @@ -161,8 +165,11 @@ class CollectionLeaseTest : RobolectricTest() { } withCollectionQueue(pausedQueue) { val events = mutableListOf() + // Application startup can submit unrelated work (for example, the rollover alarm). + // It must not steal the pause intended for the brief call below. + launch(start = CoroutineStart.UNDISPATCHED) { withCol { } } val brief = - async(start = CoroutineStart.UNDISPATCHED) { + async(pausedBrief, start = CoroutineStart.UNDISPATCHED) { tryWithCol { events.add("brief") } } val otherBrief = diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CollectionManagerStackTraceTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CollectionManagerStackTraceTest.kt index 7c3c407fa678..3a7d786e4ba1 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/CollectionManagerStackTraceTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CollectionManagerStackTraceTest.kt @@ -2,19 +2,17 @@ package com.ichi2.anki -import androidx.test.ext.junit.runners.AndroidJUnit4 import com.ichi2.anki.exception.CollectionLockedException +import com.ichi2.testutils.JvmTest import kotlinx.coroutines.test.StandardTestDispatcher import net.ankiweb.rsdroid.BackendException.BackendDbException.BackendDbLockedException import org.junit.Test -import org.junit.runner.RunWith import kotlin.test.assertFailsWith import kotlin.test.assertFalse import kotlin.test.assertIs import kotlin.test.assertTrue -@RunWith(AndroidJUnit4::class) -class CollectionManagerStackTraceTest : RobolectricTest() { +class CollectionManagerStackTraceTest : JvmTest() { @Test fun `opening failure records the withCol caller`() = runTest { diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ComposeScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ComposeScreenshotTest.kt new file mode 100644 index 000000000000..06538161aa7a --- /dev/null +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ComposeScreenshotTest.kt @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki + +import androidx.compose.runtime.Composable +import androidx.compose.ui.test.SemanticsMatcher +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.isRoot +import androidx.compose.ui.test.junit4.v2.createComposeRule +import com.github.takahirom.roborazzi.ExperimentalRoborazziApi +import com.github.takahirom.roborazzi.captureRoboImage +import com.github.takahirom.roborazzi.provideRoborazziContext +import com.google.testing.junit.testparameterinjector.TestParameterValuesProvider +import com.ichi2.anki.settings.enums.DayTheme +import com.ichi2.anki.settings.enums.NightTheme +import com.ichi2.anki.settings.enums.Theme +import com.ichi2.compose.ui.preview.AnkiDroidPreview +import com.ichi2.compose.ui.preview.AnkiDroidThemeProvider +import com.ichi2.testutils.EmptyApplication +import org.junit.Rule +import org.junit.experimental.categories.Category +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestParameterInjector +import org.robolectric.RuntimeEnvironment +import org.robolectric.annotation.Config +import org.robolectric.annotation.GraphicsMode + +/** + * Captures Compose content with an AnkiDroid XML theme, without starting an app screen. + * + * Subclasses call [capture] with their content. For a dialog, pass `node = isDialog()`. + * Parameterize a test method with [ThemeProvider] to cover every theme. + * Use [capture]'s `beforeCapture` callback to interact with the content before capturing it. + * Screenshots participate in the root `recordScreenshots`, `compareScreenshots` and + * `verifyScreenshots` tasks with `-Pscreenshot`. + */ +@RunWith(RobolectricTestParameterInjector::class) +@Category(ScreenshotTestCategory::class, EmptyApplicationCategory::class) +@Config(application = EmptyApplication::class, sdk = [36], qualifiers = "w411dp-h891dp-xxhdpi") +@GraphicsMode(GraphicsMode.Mode.NATIVE) +abstract class ComposeScreenshotTest { + @get:Rule + val composeRule = createComposeRule() + + @OptIn(ExperimentalRoborazziApi::class) + protected fun capture( + name: String, + node: SemanticsMatcher = isRoot(), + fontScale: Float = 1f, + theme: Theme = DayTheme.LIGHT, + beforeCapture: () -> Unit = {}, + content: @Composable () -> Unit, + ) { + if (theme is NightTheme) RuntimeEnvironment.setQualifiers("+night") + RuntimeEnvironment.setFontScale(fontScale) + composeRule.setContent { + AnkiDroidPreview(theme = theme, content = content) + } + composeRule.waitForIdle() + beforeCapture() + composeRule.waitForIdle() + val classDir = "build/outputs/roborazzi/${javaClass.simpleName}" + val options = provideRoborazziContext().options + composeRule.onNode(node).assertIsDisplayed().captureRoboImage( + filePath = "$classDir/${name}_${theme.toString().lowercase()}.png", + roborazziOptions = options.copy(compareOptions = options.compareOptions.copy(outputDirectoryPath = "$classDir/diffs")), + ) + } + + class ThemeProvider : TestParameterValuesProvider() { + override fun provideValues(context: Context?): List = AnkiDroidThemeProvider().values.toList() + } +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CoroutineHelpersRobolectricTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CoroutineHelpersRobolectricTest.kt index a62291e9bde4..fc9ae6452dca 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/CoroutineHelpersRobolectricTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CoroutineHelpersRobolectricTest.kt @@ -17,6 +17,9 @@ import com.ichi2.anki.exception.CollectionLockedException import com.ichi2.anki.exception.StorageNotConfiguredException import com.ichi2.anki.preferences.PreferencesActivity import com.ichi2.testutils.BackendEmulatingOpenConflict +import com.ichi2.testutils.FragmentCoroutineTracker +import kotlinx.coroutines.Job +import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.launch import kotlinx.coroutines.test.runTest import org.hamcrest.CoreMatchers.containsString @@ -38,7 +41,11 @@ import kotlin.test.assertEquals import kotlin.test.assertFailsWith import kotlin.test.assertFalse import kotlin.test.assertNotNull +import kotlin.test.assertNotSame +import kotlin.test.assertNull +import kotlin.test.assertSame import kotlin.test.assertTrue +import com.ichi2.anki.common.android.R as CommonR @RunWith(AndroidJUnit4::class) class CoroutineHelpersRobolectricTest : RobolectricTest() { @@ -70,24 +77,63 @@ class CoroutineHelpersRobolectricTest : RobolectricTest() { verify(crashReporter, never()).sendExceptionReport(any(), anyOrNull(), anyOrNull(), any()) } - /** Issue 22348: removal can precede lifecycle scope registration and the queued task. */ + /** Issue 22348/22065: removal can precede lifecycle scope registration and the queued task. */ @Test - fun `fragment removed before catching task starts fails under Robolectric`() = - assertLifecycleFailure("not attached to an activity") { - val controller = Robolectric.buildActivity(FragmentActivity::class.java).setup() - saveControllerForCleanup(controller) - val activity = controller.get() + fun `fragment removed before catching task starts skips the task`() { + val controller = Robolectric.buildActivity(FragmentActivity::class.java).setup() + saveControllerForCleanup(controller) + val activity = controller.get() + val manager = activity.supportFragmentManager + FragmentCoroutineTracker(manager).use { tracker -> var ran = false + lateinit var task: Job val job = activity.lifecycleScope.launch { val fragment = Fragment() - activity.supportFragmentManager.commitNow { add(fragment, "task") } - fragment.launchCatchingTask { ran = true } - activity.supportFragmentManager.commitNow { remove(fragment) } + manager.commitNow { add(fragment, "task") } + task = fragment.launchCatchingTask { ran = true } + manager.commitNow { remove(fragment) } } advanceRobolectricLooper() assertTrue(job.isCompleted) + assertTrue(task.isCompleted) assertFalse(ran) + tracker.assertDestroyedLifecyclesAreIdle() + } + verify(crashReporter, never()).sendExceptionReport(any(), anyOrNull(), anyOrNull(), any()) + } + + @Test + fun `readded fragment only runs tasks for its new lifecycle`() { + val controller = Robolectric.buildActivity(FragmentActivity::class.java).setup() + saveControllerForCleanup(controller) + val activity = controller.get() + val manager = activity.supportFragmentManager + FragmentCoroutineTracker(manager).use { tracker -> + val tasksRun = mutableListOf() + val job = + activity.lifecycleScope.launch { + val fragment = Fragment() + manager.commitNow { add(fragment, "task") } + val oldLifecycle = fragment.lifecycle + fragment.launchCatchingTask { tasksRun.add("old") } + manager.commitNow { remove(fragment) } + manager.commitNow { add(fragment, "task") } + assertNotSame(oldLifecycle, fragment.lifecycle) + fragment.launchCatchingTask { tasksRun.add("new") } + } + advanceRobolectricLooper() + assertTrue(job.isCompleted) + assertEquals(listOf("new"), tasksRun) + tracker.assertDestroyedLifecyclesAreIdle() + } + } + + @Test + fun `unattached fragment task fails under Robolectric`() = + assertLifecycleFailure("not attached to an activity") { + Fragment().launchCatchingTask { error("Unattached fragment task must not run") } + advanceRobolectricLooper() } @Test @@ -137,6 +183,56 @@ class CoroutineHelpersRobolectricTest : RobolectricTest() { verify(crashReporter, never()).sendExceptionReport(any(), anyOrNull(), anyOrNull(), any()) } + @Test + fun `view task is cancelled when the view is destroyed but the fragment remains attached`() { + val controller = Robolectric.buildActivity(FragmentActivity::class.java).setup() + saveControllerForCleanup(controller) + val activity = controller.get() + val fragment = Fragment(android.R.layout.simple_list_item_1) + activity.supportFragmentManager.commitNow { add(android.R.id.content, fragment) } + + var cancelled = false + val job = + assertNotNull( + fragment.launchCatchingViewTask { + try { + awaitCancellation() + } finally { + cancelled = true + } + }, + ) + assertTrue(job.isActive) + + activity.supportFragmentManager.commitNow { detach(fragment) } + advanceRobolectricLooper() + + assertNull(fragment.view) + assertSame(activity, fragment.activity) + assertTrue(job.isCancelled) + assertTrue(cancelled) + } + + @Test + fun `finishing activity fails view task under Robolectric`() = + assertLifecycleFailure("activity is finishing") { + val controller = Robolectric.buildActivity(FragmentActivity::class.java).setup() + saveControllerForCleanup(controller) + val activity = controller.get() + val fragment = Fragment(android.R.layout.simple_list_item_1) + activity.supportFragmentManager.commitNow { add(android.R.id.content, fragment) } + var ran = false + + activity.lifecycleScope.launch { + fragment.launchCatchingViewTask { ran = true } + activity.finish() + } + advanceRobolectricLooper() + + assertTrue(activity.isFinishing) + assertFalse(ran) + } + /** * A [StorageNotConfiguredException] escaping a coroutine means an activity raced or * outlived its [ensureStorageIsReady][com.ichi2.anki.startup.ensureStorageIsReady] check: @@ -169,7 +265,7 @@ class CoroutineHelpersRobolectricTest : RobolectricTest() { throwOnShowError = false val controller = Robolectric.buildActivity(FragmentActivity::class.java).also(::saveControllerForCleanup) val activity = controller.create().get() - activity.setTheme(R.style.Theme_Light) + activity.setTheme(CommonR.style.Theme_Light) activity.launchCatchingTask { withCol { } } advanceRobolectricLooper() @@ -200,7 +296,7 @@ class CoroutineHelpersRobolectricTest : RobolectricTest() { throwOnShowError = false val controller = Robolectric.buildActivity(FragmentActivity::class.java).also(::saveControllerForCleanup) val activity = controller.create().get() - activity.setTheme(R.style.Theme_Light) + activity.setTheme(CommonR.style.Theme_Light) activity.launchCatchingTask { withCol { } } advanceRobolectricLooper() diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CrashReportDataTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CrashReportDataTest.kt index c3a9bd958eca..33e37327d4ad 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/CrashReportDataTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CrashReportDataTest.kt @@ -2,19 +2,14 @@ package com.ichi2.anki -import androidx.test.ext.junit.runners.AndroidJUnit4 import com.ichi2.anki.CrashReportData.Companion.isDeckNotFoundInLimitsMapException -import com.ichi2.testutils.EmptyApplication +import com.ichi2.testutils.JvmTest import com.ichi2.testutils.ext.triggerDeckNotFoundInLimitsMap import org.junit.Test -import org.junit.runner.RunWith -import org.robolectric.annotation.Config import kotlin.test.assertFailsWith import kotlin.test.assertTrue -@RunWith(AndroidJUnit4::class) -@Config(application = EmptyApplication::class) -class CrashReportDataTest : RobolectricTest() { +class CrashReportDataTest : JvmTest() { /** #15195: corrupt deck hierarchy raises 'deck not found in limits map' */ @Test fun `deck not found in limits map regression test`() { diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/DeckAdapterFilterTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/DeckAdapterFilterTest.kt index a96ccd1dc353..0aedf9157a7a 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/DeckAdapterFilterTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/DeckAdapterFilterTest.kt @@ -3,16 +3,14 @@ package com.ichi2.anki -import androidx.test.ext.junit.runners.AndroidJUnit4 import com.ichi2.anki.deckpicker.addVisibleToList import com.ichi2.anki.libanki.filterAndFlatten import com.ichi2.anki.libanki.sched.DeckNode +import com.ichi2.testutils.JvmTest import org.junit.Assert import org.junit.Test -import org.junit.runner.RunWith -@RunWith(AndroidJUnit4::class) -class DeckAdapterFilterTest : RobolectricTest() { +class DeckAdapterFilterTest : JvmTest() { @Test fun verifyFilterResultsReturnsCorrectList() { val pattern = "Math" diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerImportTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerImportTest.kt index 5c8c9039a222..990b9f7c29db 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerImportTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerImportTest.kt @@ -2,18 +2,215 @@ package com.ichi2.anki +import android.content.ContentProvider import android.content.Intent -import androidx.test.ext.junit.runners.AndroidJUnit4 +import android.database.MatrixCursor +import android.net.Uri +import android.os.Looper +import android.provider.OpenableColumns +import androidx.appcompat.app.AlertDialog +import androidx.core.content.edit +import androidx.core.net.toUri +import androidx.lifecycle.ViewModelProvider +import com.ichi2.anki.deckpicker.DeckPickerViewModel +import com.ichi2.anki.deckpicker.DeckPickerViewModel.AnkiDroidEnvironment import com.ichi2.anki.dialogs.AsyncDialogFragment +import com.ichi2.anki.dialogs.DialogHandler import com.ichi2.anki.dialogs.ImportDialog +import com.ichi2.anki.testutils.SingleViewModelFactory +import com.ichi2.anki.utils.ext.DIALOG_FRAGMENT_TAG +import com.ichi2.testutils.BackupManagerTestUtilities +import com.ichi2.utils.ImportResolution +import com.ichi2.utils.ImportResult +import com.ichi2.utils.ImportUtils import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers +import org.junit.After import org.junit.Assert.fail +import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.kotlin.any +import org.mockito.kotlin.doAnswer +import org.mockito.kotlin.doCallRealMethod +import org.mockito.kotlin.mock +import org.mockito.kotlin.spy +import org.mockito.kotlin.whenever +import org.robolectric.ParameterizedRobolectricTestRunner +import org.robolectric.Robolectric +import org.robolectric.RuntimeEnvironment +import org.robolectric.Shadows.shadowOf +import org.robolectric.shadows.ShadowContentResolver +import java.io.File +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit +import kotlin.test.assertEquals +import kotlin.test.assertNotNull +import kotlin.test.assertTrue -@RunWith(AndroidJUnit4::class) +@RunWith(ParameterizedRobolectricTestRunner::class) class DeckPickerImportTest : RobolectricTest() { + @ParameterizedRobolectricTestRunner.Parameter + @JvmField + var qualifiers: String? = null + + companion object { + @ParameterizedRobolectricTestRunner.Parameters + @JvmStatic + fun configurations(): Collection = listOf("normal", "xlarge") + } + + @Before + fun configureScreen() { + RuntimeEnvironment.setQualifiers(qualifiers) + setIntroductionSlidesShown(true) + InitialActivity.setUpgradedToLatestVersion(getPreferences()) + getPreferences().edit { putBoolean("backupPromptDisabled", true) } + BackupManagerTestUtilities.setupSpaceForBackup(targetContext) + } + + @After + fun resetBackupSpace() { + BackupManagerTestUtilities.reset() + } + + @Test + fun `selected package displays one confirmation with its cached path`() { + val activity = startActivityNormallyOpenCollectionWithIntent(DeckPickerImport::class.java, Intent()) + val fileName = "deck name.apkg" + val uri = "content://import/document/123".toUri() + // FileProvider's Android path handling depends on the host filesystem. + val provider = mock() + whenever(provider.query(uri, arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null)).thenAnswer { + MatrixCursor(arrayOf(OpenableColumns.DISPLAY_NAME)).apply { addRow(arrayOf(fileName)) } + } + ShadowContentResolver.registerProviderInternal("import", provider) + shadowOf(activity.contentResolver).registerInputStreamSupplier(uri) { "package contents".byteInputStream() } + val cachedPath = Uri.fromFile(File(activity.cacheDir, fileName)).encodedPath!! + val executor = Executors.newSingleThreadExecutor() + try { + executor.submit { activity.onSelectedPackageToImport(Intent(Intent.ACTION_VIEW, uri)) }.get(10, TimeUnit.SECONDS) + advanceRobolectricLooper() + activity.assertSingleImportConfirmation(ImportDialog.Type.DIALOG_IMPORT_ADD_CONFIRM, cachedPath) + } finally { + executor.shutdownNow() + File(cachedPath).delete() + } + } + + @Test + fun `prepared deck waits for resume and selects Add from its resolved type`() { + assertPreparedConfirmation( + ImportResult.Success( + ImportResolution.DeckPackage(ImportResolution.Source("content://unavailable/deck.apkg".toUri(), "deck.apkg")), + "/cache/cached.colpkg", + ), + ImportDialog.Type.DIALOG_IMPORT_ADD_CONFIRM, + ) + } + + @Test + fun `prepared collection waits for resume and selects Replace from its resolved type`() { + assertPreparedConfirmation( + ImportResult.Success( + ImportResolution.CollectionPackage(ImportResolution.Source("content://unavailable/backup.colpkg".toUri(), "backup.colpkg")), + "/cache/cached.apkg", + ), + ImportDialog.Type.DIALOG_IMPORT_REPLACE_CONFIRM, + ) + } + + private fun assertPreparedConfirmation( + result: ImportResult.Success, + type: ImportDialog.Type, + ) { + val controller = startActivityControllerNormallyOpenCollectionWithIntent(DeckPickerImport::class.java, Intent()) + val activity = controller.get() + + activity.openImport(result) + advanceRobolectricLooper() + assertTrue(activity.importConfirmations.isEmpty(), "The caller or onResume must dispatch the stored confirmation") + + controller + .pause() + .stop() + .start() + .resume() + .visible() + advanceRobolectricLooper() + + activity.assertSingleImportConfirmation(type, result.path) + } + + private fun DeckPickerImport.assertSingleImportConfirmation( + type: ImportDialog.Type, + path: String, + ) { + assertEquals(1, importConfirmations.size, "One import must display exactly one confirmation") + val (thread, fragment) = importConfirmations.single() + assertEquals(Looper.getMainLooper().thread, thread) + assertEquals(type.code, fragment.requireArguments().getInt(ImportDialog.ARG_DIALOG_TYPE)) + assertEquals(path, fragment.requireArguments().getString(ImportDialog.ARG_PACKAGE_PATH)) + assertTrue(assertNotNull(fragment.dialog as? AlertDialog).isShowing) + } + + @Test + fun `import confirmation survives delayed startup`() { + val viewModel = spy(DeckPickerViewModel()) + lateinit var startupEnvironment: AnkiDroidEnvironment + doAnswer { invocation -> + startupEnvironment = invocation.getArgument(0) + null + }.whenever(viewModel).handleStartup(any()) + + DialogHandler.storeMessage(ImportUtils.CollectionImportAdd("deck.apkg").toMessage()) + val controller = Robolectric.buildActivity(DeckPicker::class.java) + saveControllerForCleanup(controller) + val activity = controller.get() + ViewModelProvider(activity, SingleViewModelFactory.create(viewModel))[DeckPickerViewModel::class.java] + controller + .create() + .start() + .resume() + .visible() + advanceRobolectricLooper() + activity.assertImportConfirmationVisible() + + // Opening the collection at startup can finish after the pending import dialog is shown. + doCallRealMethod().whenever(viewModel).handleStartup(any()) + viewModel.handleStartup(startupEnvironment) + viewModel.awaitStartup() + advanceRobolectricLooper() + + activity.assertImportConfirmationVisible() + } + + @Test + fun `import confirmation survives startup`() { + DialogHandler.storeMessage(ImportUtils.CollectionImportAdd("deck.apkg").toMessage()) + + deckPicker { + assertImportConfirmationVisible() + } + } + + @Test + fun `import confirmation survives returning from file picker`() { + val controller = startActivityControllerNormallyOpenCollectionWithIntent(DeckPicker::class.java, Intent()) + controller.pause().stop() + DialogHandler.storeMessage(ImportUtils.CollectionImportAdd("deck.apkg").toMessage()) + + controller.start().resume().visible() + advanceRobolectricLooper() + + controller.get().assertImportConfirmationVisible() + } + + private fun DeckPicker.assertImportConfirmationVisible() { + val fragment = assertNotNull(supportFragmentManager.findFragmentByTag(DIALOG_FRAGMENT_TAG) as? ImportDialog) + assertTrue(assertNotNull(fragment.dialog as? AlertDialog).isShowing) + } + @Test fun importAddShowsImportDialog() { val deckPicker = super.startActivityNormallyOpenCollectionWithIntent(DeckPickerImport::class.java, Intent()) @@ -34,6 +231,7 @@ class DeckPickerImportTest : RobolectricTest() { private class DeckPickerImport : DeckPicker() { private var dialogFragment: AsyncDialogFragment? = null + val importConfirmations = mutableListOf>() fun getAsyncDialogFragmentClass(): Class<*> { if (dialogFragment == null) { @@ -44,6 +242,9 @@ class DeckPickerImportTest : RobolectricTest() { override fun showAsyncDialogFragment(newFragment: AsyncDialogFragment) { dialogFragment = newFragment + if (newFragment is ImportDialog) { + importConfirmations.add(Thread.currentThread() to newFragment) + } super.showAsyncDialogFragment(newFragment) } } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerInsetsTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerInsetsTest.kt index 3c887b6bf074..963d0fc20e1f 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerInsetsTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerInsetsTest.kt @@ -11,9 +11,9 @@ import androidx.core.view.isVisible import androidx.test.ext.junit.runners.AndroidJUnit4 import com.ichi2.anki.android.view.locationInWindow import com.ichi2.anki.common.preferences.sharedPrefs +import com.ichi2.anki.common.utils.dp import com.ichi2.testutils.BackupManagerTestUtilities import com.ichi2.testutils.dispatchInsets -import com.ichi2.utils.dp import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.equalTo import org.hamcrest.Matchers.greaterThan @@ -37,10 +37,14 @@ class DeckPickerInsetsTest : RobolectricTest() { addDeck("Test Deck") val controller = startActivityControllerNormallyOpenCollectionWithIntent(DeckPicker::class.java, Intent()) val deckPicker = controller.get() + advanceRobolectricLooperUntil(lazyMessage = { "the deck list should be shown" }) { + deckPicker.deckPickerBinding.deckPickerContent.isVisible + } deckPicker.dispatchInsets(navBarBottom = 48.dp) deckPicker.layoutForTest() val list = deckPicker.deckPickerBinding.decks val observer = deckPicker.deckPickerBinding.root.viewTreeObserver + check(list.height > 0) { "the deck list must be laid out, or the layout listener is a no-op" } val padding = list.paddingBottom check(padding > 0) @@ -191,6 +195,10 @@ class DeckPickerInsetsTest : RobolectricTest() { // delete every deck: the deck picker enters the initial state col.decks.remove(listOf("Test Deck 0", "Test Deck 1").map { col.decks.id(it) }) deckPicker.updateDeckList() + // Refreshing the decks runs on IO: draining the main looper alone may finish first. + advanceRobolectricLooperUntil(lazyMessage = { "the empty collection placeholder should be shown" }) { + deckPicker.deckPickerBinding.noDecksPlaceholder.isVisible + } deckPicker.layoutForTest() check(deckPicker.fabBottomMargin == 0) { "the FAB should be unraised initially" } @@ -198,6 +206,9 @@ class DeckPickerInsetsTest : RobolectricTest() { // so no layout pass fires on it addDeck("A Deck") deckPicker.updateDeckList() + advanceRobolectricLooperUntil(lazyMessage = { "the deck list should be shown again" }) { + deckPicker.deckPickerBinding.deckPickerContent.isVisible + } deckPicker.layoutForTest() assertThat( diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerOnDiskTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerOnDiskTest.kt index 1846daddefbc..38825e49a18e 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerOnDiskTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerOnDiskTest.kt @@ -45,7 +45,7 @@ class DeckPickerOnDiskTest : RobolectricTest() { fun before() { RuntimeEnvironment.setQualifiers(qualifiers) getPreferences().edit { - putBoolean(IntroductionActivity.INTRODUCTION_SLIDES_SHOWN, true) + putBoolean(IntroductionActivity.PREF_INTRODUCTION_SLIDES_SHOWN, true) } } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerSchedulerUpgradeTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerSchedulerUpgradeTest.kt new file mode 100644 index 000000000000..dc1f2d4f6846 --- /dev/null +++ b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerSchedulerUpgradeTest.kt @@ -0,0 +1,167 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki + +import android.content.Intent +import android.view.KeyEvent +import androidx.activity.OnBackPressedCallback +import androidx.appcompat.app.AlertDialog +import androidx.core.content.edit +import com.ichi2.anki.CollectionManager.TR +import com.ichi2.anki.common.preferences.sharedPrefs +import com.ichi2.anki.common.utils.ext.schedulerVersion +import com.ichi2.anki.dialogs.utils.message +import com.ichi2.anki.dialogs.utils.title +import com.ichi2.testutils.BackupManagerTestUtilities +import kotlinx.coroutines.runBlocking +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.ParameterizedRobolectricTestRunner +import org.robolectric.RuntimeEnvironment +import org.robolectric.android.controller.ActivityController +import org.robolectric.shadows.ShadowDialog +import org.robolectric.shadows.ShadowToast +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertNotSame +import kotlin.test.assertSame +import kotlin.test.assertTrue + +@RunWith(ParameterizedRobolectricTestRunner::class) +class DeckPickerSchedulerUpgradeTest : RobolectricTest() { + @ParameterizedRobolectricTestRunner.Parameter + @JvmField + var qualifiers: String = "" + + @Before + fun prepareCollection() { + RuntimeEnvironment.setQualifiers(qualifiers) + setIntroductionSlidesShown(true) + addBasicNote() + BackupManagerTestUtilities.setupSpaceForBackup(targetContext) + InitialActivity.setUpgradedToLatestVersion(targetContext.sharedPrefs()) + getPreferences().edit { putBoolean("backupPromptDisabled", true) } + } + + @After + fun resetBackupSpace() = BackupManagerTestUtilities.reset() + + @Test + fun `required prompt survives repeated recreation and collection refresh`() { + val controller = launchWithPrompt() + val viewModel = controller.get().viewModel + val original = upgradeDialog(controller.get()) + + repeat(2) { + recreate(controller) + assertSame(viewModel, controller.get().viewModel) + refresh(controller.get()) + val restored = upgradeDialog(controller.get()) + assertNotSame(original, restored) + assertEquals(original.title, restored.title) + assertEquals(original.message, restored.message) + assertEquals(1L, col.config.schedulerVersion) + } + } + + @Test + fun `confirming the restored prompt upgrades once`() { + val controller = launchWithPrompt() + recreate(controller) + val dialog = upgradeDialog(controller.get()) + ShadowToast.reset() + + dialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick() + advanceRobolectricLooperUntil { col.config.schedulerVersion == 2L } + advanceRobolectricLooper() + + assertFalse(dialog.isShowing) + assertEquals(1, ShadowToast.shownToastCount()) + assertEquals(TR.schedulingUpdateDone(), ShadowToast.getTextOfLatestToast()) + recreate(controller) + refresh(controller.get()) + assertNoUpgradePrompt() + assertEquals(1, ShadowToast.shownToastCount()) + } + + @Test + fun `Cancel on the restored prompt uses the current activity`() = cancelRestoredPrompt(back = false) + + @Test + fun `Back on the restored prompt uses the current activity`() = cancelRestoredPrompt(back = true) + + private fun cancelRestoredPrompt(back: Boolean) { + val controller = launchWithPrompt() + recreate(controller) + val activity = controller.get() + var cancellations = 0 + activity.onBackPressedDispatcher.addCallback( + activity, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + cancellations++ + } + }, + ) + val dialog = upgradeDialog(activity) + + if (back) { + dialog.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)) + dialog.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)) + } else { + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).performClick() + } + advanceRobolectricLooper() + + assertEquals(1, cancellations) + assertEquals(1L, col.config.schedulerVersion) + assertFalse(dialog.isShowing) + recreate(controller) + refresh(controller.get()) + assertNoUpgradePrompt() + } + + private fun launchWithPrompt(): ActivityController { + val controller = startActivityControllerNormallyOpenCollectionWithIntent(DeckPicker::class.java, Intent()) + col.config.set("schedVer", 1L) + col.modSchema(check = false) + refresh(controller.get()) + upgradeDialog(controller.get()) + return controller + } + + private fun refresh(activity: DeckPicker) { + runBlocking { activity.viewModel.reloadDeckCounts().join() } + advanceRobolectricLooper() + } + + private fun recreate(controller: ActivityController) { + val original = controller.get() + controller.recreate() + controller.get().viewModel.awaitStartup() + advanceRobolectricLooper() + assertNotSame(original, controller.get()) + } + + private fun upgradeDialog(activity: DeckPicker): AlertDialog { + val dialogs = ShadowDialog.getShownDialogs().filterIsInstance().filter { it.isShowing } + assertEquals(1, dialogs.size) + return dialogs.single().also { + assertTrue(it.isShowing) + assertSame(activity, it.context.findAnkiActivity()) + assertEquals(activity.getString(CommonString.scheduler_upgrade_required_dialog_title), it.title) + } + } + + private fun assertNoUpgradePrompt() { + assertFalse(ShadowDialog.getShownDialogs().any { it.isShowing }) + } + + companion object { + @ParameterizedRobolectricTestRunner.Parameters(name = "{0}") + @JvmStatic + fun configurations() = listOf("normal", "xlarge") + } +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerScreenshotTest.kt index 6f974f066c01..e313d056a10d 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerScreenshotTest.kt @@ -10,6 +10,7 @@ import com.google.android.material.snackbar.Snackbar import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.android.view.locationInWindow import com.ichi2.anki.common.preferences.sharedPrefs +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.libanki.DeckId import com.ichi2.anki.settings.Prefs import com.ichi2.anki.snackbar.showSnackbar @@ -19,7 +20,6 @@ import com.ichi2.testutils.dispatchInsets import com.ichi2.testutils.lastItemView import com.ichi2.testutils.scrollToEnd import com.ichi2.testutils.simulateKeyboard -import com.ichi2.utils.dp import kotlinx.coroutines.flow.first import org.junit.After import org.junit.Before @@ -119,6 +119,18 @@ class DeckPickerScreenshotTest : ScreenshotTest() { captureScreen("keyboard_open_scrolled_to_bottom") } + /** The studied summary and final deck must remain above the keyboard with bottom navigation enabled. */ + @Test + fun bottom_navigation_keyboard_open_scrolled_to_bottom() { + enableBottomNavigation() + withDeckPicker(deckCount = 30) { deckPicker -> + deckPicker.searchWithKeyboard() + deckPicker.deckPickerBinding.decks.scrollToEnd() + + captureScreen("bottom_navigation_keyboard_open_scrolled_to_bottom") + } + } + @Test fun hierarchy_lines() = runTest { diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTabletScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTabletScreenshotTest.kt index ad4704e00362..2ba63b856bec 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTabletScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTabletScreenshotTest.kt @@ -7,6 +7,7 @@ import com.ichi2.testutils.simulateKeyboard import org.junit.After import org.junit.Before import org.junit.Test +import org.robolectric.RuntimeEnvironment /** * Screenshot tests for [DeckPicker] in fragmented mode. @@ -36,10 +37,16 @@ class DeckPickerTabletScreenshotTest : ScreenshotTest() { fun deckPickerWith30Decks() = withDeckPicker(deckCount = 30, withCards = true) { deckPicker -> deckPicker.simulateEdgeToEdge() - // Allow tryShowStudyOptionsPanel()'s async fragment commit to finalize - // before capturing, otherwise the right pane is empty. - advanceRobolectricLooper() - advanceRobolectricLooper() captureScreen("30_decks_tablet") } + + @Test + fun deckPickerWith30DecksRtl() = + runTest { + RuntimeEnvironment.setQualifiers("+ar") + withDeckPicker(deckCount = 30, withCards = true) { deckPicker -> + deckPicker.simulateEdgeToEdge() + captureScreen("30_decks_tablet_rtl") + } + } } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTest.kt index ee059f4d911e..785ff4380dd4 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTest.kt @@ -8,6 +8,7 @@ import android.content.DialogInterface import android.content.Intent import android.content.SharedPreferences import android.content.pm.PackageManager +import android.content.res.Configuration import android.database.sqlite.SQLiteDatabaseCorruptException import android.os.Bundle import android.os.SystemClock @@ -17,6 +18,7 @@ import android.view.Menu import android.view.MotionEvent import android.view.View import android.view.View.MeasureSpec +import android.widget.LinearLayout import android.widget.ScrollView import android.widget.TextView import androidx.appcompat.app.AlertDialog @@ -33,6 +35,8 @@ import androidx.core.view.size import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.commitNow +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver import androidx.test.core.app.ActivityScenario import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click @@ -44,6 +48,8 @@ import anki.scheduler.CardAnswer.Rating import app.cash.turbine.test import com.google.android.material.bottomnavigation.BottomNavigationView import com.ichi2.anki.CollectionManager.TR +import com.ichi2.anki.CollectionManager.withCol +import com.ichi2.anki.DeckPickerFloatingActionMenu.CloseAnimation import com.ichi2.anki.browser.CardBrowserFragment import com.ichi2.anki.browser.CardBrowserViewModel.RowSelection import com.ichi2.anki.common.preferences.sharedPrefs @@ -52,8 +58,10 @@ import com.ichi2.anki.common.utils.android.getResFromAttr import com.ichi2.anki.common.utils.annotation.KotlinCleanup import com.ichi2.anki.common.utils.ext.getParcelableExtraCompat import com.ichi2.anki.databinding.ActivityHomescreenBinding +import com.ichi2.anki.deckpicker.DeckFilters import com.ichi2.anki.deckpicker.DeckPickerViewModel import com.ichi2.anki.deckpicker.SyncIconState +import com.ichi2.anki.deckpicker.filterAndFlattenDisplay import com.ichi2.anki.dialogs.DatabaseErrorDialog import com.ichi2.anki.dialogs.DatabaseErrorDialog.DatabaseErrorDialogType import com.ichi2.anki.dialogs.DeckPickerConfirmDeleteDeckDialog @@ -66,10 +74,12 @@ import com.ichi2.anki.dialogs.utils.input import com.ichi2.anki.dialogs.utils.message import com.ichi2.anki.dialogs.utils.performPositiveClick import com.ichi2.anki.dialogs.utils.title +import com.ichi2.anki.libanki.Consts.DEFAULT_DECK_ID import com.ichi2.anki.libanki.DeckId import com.ichi2.anki.model.SelectableDeck import com.ichi2.anki.navigation.AnkiDroidNavigator import com.ichi2.anki.observability.ChangeManager +import com.ichi2.anki.pages.CongratsPage import com.ichi2.anki.preferences.PreferencesActivity import com.ichi2.anki.reviewreminders.ScheduleRemindersFragment import com.ichi2.anki.settings.Prefs @@ -89,6 +99,7 @@ import com.ichi2.testutils.common.OS import com.ichi2.testutils.dispatchTouch import com.ichi2.testutils.ext.addBasicNoteWithOp import com.ichi2.testutils.ext.menu +import com.ichi2.testutils.ext.snackbarText import com.ichi2.testutils.ext.text import com.ichi2.testutils.grantWritePermissions import com.ichi2.testutils.revokeWritePermissions @@ -106,6 +117,7 @@ import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.containsInAnyOrder import org.hamcrest.Matchers.containsString import org.hamcrest.Matchers.equalTo +import org.hamcrest.Matchers.greaterThan import org.hamcrest.Matchers.not import org.hamcrest.Matchers.notNullValue import org.hamcrest.Matchers.nullValue @@ -137,6 +149,7 @@ import kotlin.test.assertNotSame import kotlin.test.assertSame import kotlin.test.assertTrue import kotlin.time.Duration.Companion.seconds +import com.ichi2.anki.common.android.R as CommonR typealias ContextMenuOption = DeckPickerContextMenuOption @@ -159,6 +172,43 @@ class DeckPickerTest : RobolectricTest() { setIntroductionSlidesShown(true) } + @Test + fun `study shortcut on hidden Default shows the empty deck message`() { + val other = addDeck("Other") + col.setDeck(listOf(addBasicNote().firstCard().id), other) + assertEquals(DEFAULT_DECK_ID, col.decks.selected()) + assertThat(col.sched.deckDueTree().find(DEFAULT_DECK_ID), nullValue()) + + deckPicker { + advanceRobolectricLooperUntil { deckPickerBinding.decks.adapter?.itemCount == 1 } + shadowOf(this).clearNextStartedActivities() + + assertTrue(onKeyUp(KeyEvent.KEYCODE_S, KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_S))) + advanceRobolectricLooperUntil { snackbarText == getString(CommonString.empty_deck) } + + assertEquals(DEFAULT_DECK_ID, col.decks.selected()) + assertThat(shadowOf(this).nextStartedActivity, nullValue()) + } + } + + @Test + fun `study shortcut on an empty filtered deck opens the finished screen`() { + addBasicNote() + val filtered = col.decks.newFiltered("Filtered") + + deckPicker { + advanceRobolectricLooperUntil { deckPickerBinding.decks.adapter?.itemCount == 2 } + shadowOf(this).clearNextStartedActivities() + + assertTrue(onKeyUp(KeyEvent.KEYCODE_S, KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_S))) + advanceRobolectricLooperUntil { shadowOf(this).peekNextStartedActivity() != null } + + val intent = assertNotNull(shadowOf(this).nextStartedActivity) + assertEquals(CongratsPage::class.java.name, intent.getStringExtra(SingleFragmentActivity.EXTRA_FRAGMENT_NAME)) + assertEquals(filtered, col.decks.selected()) + } + } + @Test fun `receiving opExecuted call doesn't crash if ViewModel is not yet initialized`() { // Instantiate DeckPicker directly to simulate a state where the object exists, @@ -173,16 +223,16 @@ class DeckPickerTest : RobolectricTest() { fun getPreviousVersionUpgradeFrom201to292() { val newVersion = 20900302 // 2.9.2 val preferences = mock(SharedPreferences::class.java) - whenever(preferences.getLong(DeckPickerViewModel.UPGRADE_VERSION_KEY, newVersion.toLong())) + whenever(preferences.getLong(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION, newVersion.toLong())) .thenThrow(ClassCastException::class.java) - whenever(preferences.getInt(DeckPickerViewModel.UPGRADE_VERSION_KEY, newVersion)) + whenever(preferences.getInt(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION, newVersion)) .thenThrow(ClassCastException::class.java) - whenever(preferences.getString(DeckPickerViewModel.UPGRADE_VERSION_KEY, "")) + whenever(preferences.getString(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION, "")) .thenReturn("2.0.1") val editor = mock(SharedPreferences.Editor::class.java) whenever(preferences.edit()).thenReturn(editor) val updated = mock(SharedPreferences.Editor::class.java) - whenever(editor.remove(DeckPickerViewModel.UPGRADE_VERSION_KEY)).thenReturn(updated) + whenever(editor.remove(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION)).thenReturn(updated) ActivityScenario.launch(DeckPicker::class.java).use { scenario -> scenario.onActivity { deckPicker: DeckPicker -> val previousVersion = @@ -190,7 +240,7 @@ class DeckPickerTest : RobolectricTest() { assertEquals(0, previousVersion) } } - verify(editor, times(1)).remove(DeckPickerViewModel.UPGRADE_VERSION_KEY) + verify(editor, times(1)).remove(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION) verify(updated, times(1)).apply() } @@ -199,23 +249,23 @@ class DeckPickerTest : RobolectricTest() { fun getPreviousVersionUpgradeFrom202to292() { val newVersion: Long = 20900302 // 2.9.2 val preferences = mock(SharedPreferences::class.java) - whenever(preferences.getLong(DeckPickerViewModel.UPGRADE_VERSION_KEY, newVersion)) + whenever(preferences.getLong(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION, newVersion)) .thenThrow(ClassCastException::class.java) - whenever(preferences.getInt(DeckPickerViewModel.UPGRADE_VERSION_KEY, 20900203)) + whenever(preferences.getInt(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION, 20900203)) .thenThrow(ClassCastException::class.java) - whenever(preferences.getString(DeckPickerViewModel.UPGRADE_VERSION_KEY, "")) + whenever(preferences.getString(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION, "")) .thenReturn("2.0.2") val editor = mock(SharedPreferences.Editor::class.java) whenever(preferences.edit()).thenReturn(editor) val updated = mock(SharedPreferences.Editor::class.java) - whenever(editor.remove(DeckPickerViewModel.UPGRADE_VERSION_KEY)).thenReturn(updated) + whenever(editor.remove(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION)).thenReturn(updated) ActivityScenario.launch(DeckPicker::class.java).use { scenario -> scenario.onActivity { deckPicker: DeckPicker -> val previousVersion = deckPicker.viewModel.getPreviousVersion(preferences, newVersion) assertEquals(40, previousVersion) } } - verify(editor, times(1)).remove(DeckPickerViewModel.UPGRADE_VERSION_KEY) + verify(editor, times(1)).remove(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION) verify(updated, times(1)).apply() } @@ -225,21 +275,21 @@ class DeckPickerTest : RobolectricTest() { val prevVersion = 20800301 // 2.8.1 val newVersion: Long = 20900301 // 2.9.1 val preferences = mock(SharedPreferences::class.java) - whenever(preferences.getLong(DeckPickerViewModel.UPGRADE_VERSION_KEY, newVersion)) + whenever(preferences.getLong(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION, newVersion)) .thenThrow(ClassCastException::class.java) - whenever(preferences.getInt(DeckPickerViewModel.UPGRADE_VERSION_KEY, 20900203)) + whenever(preferences.getInt(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION, 20900203)) .thenReturn(prevVersion) val editor = mock(SharedPreferences.Editor::class.java) whenever(preferences.edit()).thenReturn(editor) val updated = mock(SharedPreferences.Editor::class.java) - whenever(editor.remove(DeckPickerViewModel.UPGRADE_VERSION_KEY)).thenReturn(updated) + whenever(editor.remove(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION)).thenReturn(updated) ActivityScenario.launch(DeckPicker::class.java).use { scenario -> scenario.onActivity { deckPicker: DeckPicker -> val previousVersion = deckPicker.viewModel.getPreviousVersion(preferences, newVersion) assertEquals(prevVersion.toLong(), previousVersion) } } - verify(editor, times(1)).remove(DeckPickerViewModel.UPGRADE_VERSION_KEY) + verify(editor, times(1)).remove(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION) verify(updated, times(1)).apply() } @@ -248,7 +298,7 @@ class DeckPickerTest : RobolectricTest() { val prevVersion: Long = 20900301 // 2.9.1 val newVersion: Long = 20900302 // 2.9.2 val preferences = mock(SharedPreferences::class.java) - whenever(preferences.getLong(DeckPickerViewModel.UPGRADE_VERSION_KEY, newVersion)) + whenever(preferences.getLong(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION, newVersion)) .thenReturn(prevVersion) val editor = mock(SharedPreferences.Editor::class.java) whenever(preferences.edit()).thenReturn(editor) @@ -258,7 +308,7 @@ class DeckPickerTest : RobolectricTest() { assertEquals(prevVersion, previousVersion) } } - verify(editor, never()).remove(DeckPickerViewModel.UPGRADE_VERSION_KEY) + verify(editor, never()).remove(DeckPickerViewModel.PREF_LAST_UPGRADE_VERSION) } @Test @@ -689,26 +739,23 @@ class DeckPickerTest : RobolectricTest() { } @Test - fun `ContextMenu testDynRebuildAndEmpty`() = - deckPicker { - val cardIds = - (0..3) - .map { addBasicNote("$it", "").firstCard().id } - assertTrue(allCardsInSameDeck(cardIds, 1)) - val deckId = addDynamicDeck("Deck 1") - getColUnsafe.sched.rebuildFilteredDeck(deckId) - assertTrue(allCardsInSameDeck(cardIds, deckId)) - updateDeckList() - assertEquals(1, visibleDeckCount) - - selectContextMenuOption(ContextMenuOption.CUSTOM_STUDY_EMPTY, deckId) + fun `ContextMenu testDynRebuildAndEmpty`() { + val cardIds = (0..3).map { addBasicNote("$it", "").firstCard().id } + assertTrue(allCardsInSameDeck(cardIds, 1)) + val deckId = addDynamicDeck("Deck 1") + col.sched.rebuildFilteredDeck(deckId) + assertTrue(allCardsInSameDeck(cardIds, deckId)) - assertTrue(allCardsInSameDeck(cardIds, 1)) - - selectContextMenuOption(ContextMenuOption.CUSTOM_STUDY_REBUILD, deckId) + deckPicker(expectedDeckIds = listOf(deckId)) { + selectContextMenuOptionAndAwait(ContextMenuOption.CUSTOM_STUDY_EMPTY, deckId) { + allCardsInSameDeck(cardIds, 1) + } - assertTrue(allCardsInSameDeck(cardIds, deckId)) + selectContextMenuOptionAndAwait(ContextMenuOption.CUSTOM_STUDY_REBUILD, deckId) { + allCardsInSameDeck(cardIds, deckId) + } } + } private suspend fun TestScope.withQueuedCollectionAccess(block: suspend () -> T): T { val previousQueue = CollectionManager.setTestDispatcher(StandardTestDispatcher(testScheduler), useReentrantLock = false) @@ -746,26 +793,54 @@ class DeckPickerTest : RobolectricTest() { ) } + // Menu invalidation can replace the action view, so resolve it on each access. + private val DeckPicker.searchView: AccessibleSearchView + get() = menu().findItem(R.id.deck_picker_action_filter).actionView as AccessibleSearchView + + @Test + fun `dragging next to the tablet divider resizes the panes`() { + assumeTrue("We are running on a tablet", qualifiers!!.contains("xlarge")) + addBasicNote() + val deckPicker = super.startActivityNormallyOpenCollectionWithIntent(DeckPickerEx::class.java, Intent()) + advanceRobolectricLooper() + val divider = deckPicker.findViewById(R.id.resizing_divider) + val deckPickerPane = deckPicker.findViewById(R.id.deck_picker_pane) + val weightBefore = (deckPickerPane.layoutParams as LinearLayout.LayoutParams).weight + val location = IntArray(2).also { divider.getLocationInWindow(it) } + val startX = location[0] + divider.width / 2f - 16 * divider.resources.displayMetrics.density + val y = location[1] + divider.height / 2f + val window = deckPicker.window.decorView + val downTime = SystemClock.uptimeMillis() + + window.dispatchTouchEvent(MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, startX, y, 0)) + for (step in 1..10) { + window.dispatchTouchEvent( + MotionEvent.obtain(downTime, downTime + step * 10L, MotionEvent.ACTION_MOVE, startX + step * 10f, y, 0), + ) + } + window.dispatchTouchEvent(MotionEvent.obtain(downTime, downTime + 200, MotionEvent.ACTION_UP, startX + 100f, y, 0)) + + val weightAfter = (deckPickerPane.layoutParams as LinearLayout.LayoutParams).weight + assertThat("the deck list grows when dragged towards the end", weightAfter, greaterThan(weightBefore)) + } + @Test fun `deck search stays open while filtering`() { addBasicNote() repeat(10) { addDeck("Test Deck $it") } deckPicker { - advanceRobolectricLooper() val searchItem = menu().findItem(R.id.deck_picker_action_filter) assertTrue(searchItem.isVisible) assertTrue(searchItem.expandActionView()) - val searchView = searchItem.actionView as AccessibleSearchView for ((query, expectedCount) in listOf("s" to 10, "Test Deck 1" to 1, "missing" to 0, "" to 11)) { searchView.setQuery(query, false) - advanceRobolectricLooper() + advanceRobolectricLooperUntil { visibleDeckCount == expectedCount } val currentSearchItem = menu().findItem(R.id.deck_picker_action_filter) assertTrue(currentSearchItem.isActionViewExpanded, "Search should stay open for '$query'") - assertEquals(query, (currentSearchItem.actionView as AccessibleSearchView).query.toString()) - advanceRobolectricLooperUntil { visibleDeckCount == expectedCount } + assertEquals(query, searchView.query.toString()) } } } @@ -782,7 +857,7 @@ class DeckPickerTest : RobolectricTest() { retainedViewModel = deckPicker.viewModel val searchItem = deckPicker.menu().findItem(R.id.deck_picker_action_filter) assertTrue(searchItem.expandActionView()) - (searchItem.actionView as AccessibleSearchView).setQuery("Test Deck 1", false) + deckPicker.searchView.setQuery("Test Deck 1", false) advanceRobolectricLooperUntil { deckPicker.visibleDeckCount == 1 } } @@ -794,7 +869,7 @@ class DeckPickerTest : RobolectricTest() { assertEquals("Test Deck 1", deckPicker.viewModel.deckSearchQuery) val searchItem = deckPicker.menu().findItem(R.id.deck_picker_action_filter) assertTrue(searchItem.isActionViewExpanded) - assertEquals("Test Deck 1", (searchItem.actionView as AccessibleSearchView).query.toString()) + assertEquals("Test Deck 1", deckPicker.searchView.query.toString()) advanceRobolectricLooperUntil { deckPicker.visibleDeckCount == 1 } deckPicker.invalidateOptionsMenu() } @@ -803,7 +878,7 @@ class DeckPickerTest : RobolectricTest() { scenario.onActivity { deckPicker -> val searchItem = deckPicker.menu().findItem(R.id.deck_picker_action_filter) assertTrue(searchItem.isActionViewExpanded) - assertEquals("Test Deck 1", (searchItem.actionView as AccessibleSearchView).query.toString()) + assertEquals("Test Deck 1", deckPicker.searchView.query.toString()) assertEquals(1, deckPicker.visibleDeckCount) assertTrue(searchItem.collapseActionView()) assertFalse(deckPicker.viewModel.isDeckSearchExpanded) @@ -823,7 +898,7 @@ class DeckPickerTest : RobolectricTest() { val menu = deckPicker.menu() val searchItem = menu.findItem(R.id.deck_picker_action_filter) assertTrue(searchItem.expandActionView()) - (searchItem.actionView as AccessibleSearchView).setQuery("Test Deck 1", false) + deckPicker.searchView.setQuery("Test Deck 1", false) advanceRobolectricLooperUntil { deckPicker.visibleDeckCount == 1 } // A synchronous collection refresh restores the query a second time, masking @@ -836,7 +911,7 @@ class DeckPickerTest : RobolectricTest() { val restoredSearchItem = menu.findItem(R.id.deck_picker_action_filter) assertTrue(restoredSearchItem.isActionViewExpanded) - assertEquals("Test Deck 1", (restoredSearchItem.actionView as AccessibleSearchView).query.toString()) + assertEquals("Test Deck 1", deckPicker.searchView.query.toString()) advanceRobolectricLooper() assertEquals("Test Deck 1", deckPicker.viewModel.deckSearchQuery) @@ -864,7 +939,7 @@ class DeckPickerTest : RobolectricTest() { scenario.onActivity { deckPicker -> val searchItem = deckPicker.menu().findItem(R.id.deck_picker_action_filter) assertTrue(searchItem.isActionViewExpanded) - assertEquals("", (searchItem.actionView as AccessibleSearchView).query.toString()) + assertEquals("", deckPicker.searchView.query.toString()) assertTrue(searchItem.collapseActionView()) } @@ -874,7 +949,7 @@ class DeckPickerTest : RobolectricTest() { scenario.onActivity { deckPicker -> val searchItem = deckPicker.menu().findItem(R.id.deck_picker_action_filter) assertFalse(searchItem.isActionViewExpanded) - assertEquals(11, deckPicker.visibleDeckCount) + advanceRobolectricLooperUntil { deckPicker.visibleDeckCount == 11 } } } } @@ -1260,7 +1335,7 @@ class DeckPickerTest : RobolectricTest() { assertThat( shadowOf(selectedDeck.background).createdFromResId, - equalTo(getResFromAttr(this, R.attr.currentDeckBackground)), + equalTo(getResFromAttr(this, CommonR.attr.currentDeckBackground)), ) } } @@ -1369,12 +1444,12 @@ class DeckPickerTest : RobolectricTest() { } @Test - fun `adding a note by single tap closes the FAB menu`() = assertAddingNoteByTouchClosesMenu(doubleTap = false) + fun `adding a note by single tap preserves the visible FAB menu`() = assertAddingNoteByTouchPreservesMenu(doubleTap = false) @Test - fun `adding a note by double tap closes the FAB menu`() = assertAddingNoteByTouchClosesMenu(doubleTap = true) + fun `adding a note by double tap preserves the visible FAB menu`() = assertAddingNoteByTouchPreservesMenu(doubleTap = true) - private fun assertAddingNoteByTouchClosesMenu(doubleTap: Boolean) = + private fun assertAddingNoteByTouchPreservesMenu(doubleTap: Boolean) = deckPicker { val fab = floatingActionButtonBinding.fabMain val startTime = SystemClock.uptimeMillis() @@ -1401,11 +1476,75 @@ class DeckPickerTest : RobolectricTest() { tap(100) val intent = AnkiDroidNavigator.toIntent(awaitItem()) assertEquals("com.ichi2.anki.NoteEditorActivity", intent.component!!.className) - assertFalse(floatingActionMenu.isFABOpen, "Adding a note must close the FAB menu") - assertEquals(View.GONE, floatingActionButtonBinding.fabBGLayout.visibility) + assertFalse(floatingActionMenu.isFABOpen, "Adding a note must save a closed menu state") + assertTrue(floatingActionButtonBinding.fabMain.isExtended) + assertEquals(View.VISIBLE, floatingActionButtonBinding.fabBGLayout.visibility) } } + @Test + fun `selecting Add during FAB reopening keeps menu buttons visible`() = + deckPicker { + floatingActionMenu.showFloatingActionMenu() + shadowOf(mainLooper).idleFor(java.time.Duration.ofMillis(200)) + floatingActionMenu.closeFloatingActionMenu(style = CloseAnimation.SHORT) + shadowOf(mainLooper).idleFor(java.time.Duration.ofMillis(200)) + assertEquals(View.GONE, floatingActionButtonBinding.addDeckButton.visibility) + + floatingActionMenu.showFloatingActionMenu() + // Select Add before the opening animations have finished. + floatingActionButtonBinding.fabMain.performClick() + shadowOf(mainLooper).idleFor(java.time.Duration.ofMillis(200)) + + with(floatingActionButtonBinding) { + assertTrue(fabMain.isExtended) + assertEquals(View.VISIBLE, addDeckButton.visibility) + assertEquals(View.VISIBLE, addFilteredDeckButton.visibility) + assertEquals(View.VISIBLE, addSharedButton.visibility) + } + } + + @Test + fun `Add menu resets on resume without stopping in multi-window`() { + ActivityScenario.launch(DeckPicker::class.java).use { scenario -> + val events = mutableListOf() + scenario.onActivity { deckPicker -> + deckPicker.lifecycle.addObserver(LifecycleEventObserver { _, event -> events.add(event) }) + deckPicker.floatingActionMenu.showFloatingActionMenu() + advanceRobolectricLooper() + with(deckPicker.floatingActionButtonBinding) { + val expandedColor = fabMain.backgroundTintList + fabMain.performClick() + assertTrue(fabMain.isExtended) + assertEquals(expandedColor, fabMain.backgroundTintList) + assertEquals(View.VISIBLE, fabBGLayout.visibility) + } + } + + // A visible activity can be paused without being stopped in multi-window mode. + scenario.moveToState(Lifecycle.State.STARTED) + scenario.onActivity { deckPicker -> + assertTrue(deckPicker.floatingActionButtonBinding.fabMain.isExtended) + } + scenario.moveToState(Lifecycle.State.RESUMED) + + scenario.onActivity { deckPicker -> + assertTrue(Lifecycle.Event.ON_PAUSE in events) + assertFalse(Lifecycle.Event.ON_STOP in events) + with(deckPicker.floatingActionButtonBinding) { + assertFalse(fabMain.isExtended) + assertEquals(View.GONE, fabBGLayout.visibility) + assertEquals(View.GONE, addDeckButton.visibility) + assertEquals(View.GONE, addFilteredDeckButton.visibility) + assertEquals(View.GONE, addSharedButton.visibility) + fabMain.performClick() + assertTrue(deckPicker.floatingActionMenu.isFABOpen) + assertEquals(View.VISIBLE, fabBGLayout.visibility) + } + } + } + } + @Test fun `FAB menu opens on ENTER key`() = deckPicker { @@ -1434,6 +1573,24 @@ class DeckPickerTest : RobolectricTest() { ) } + @Test + fun `FAB menu closes when clicking background inside menu container`() = + deckPicker { + floatingActionMenu.showFloatingActionMenu() + assertThat("menu is open", floatingActionMenu.isFABOpen, equalTo(true)) + + // Click the background inside the FAB menu container + // (simulating, for example, tapping to the left of narrower buttons such as the "Add" button) + val linearLayout = floatingActionButtonBinding.fabLinearLayout + linearLayout.performClick() + + assertThat( + "clicking the background inside the FAB menu container closes the menu", + floatingActionMenu.isFABOpen, + equalTo(false), + ) + } + @Test fun `expanded FAB menu is restored after recreation`() { ActivityScenario.launch(DeckPicker::class.java).use { scenario -> @@ -1663,7 +1820,7 @@ class DeckPickerTest : RobolectricTest() { browser.childFragmentManager.setFragmentResult( DeckSelectionDialog.REQUEST_SELECT_DECK, Bundle().apply { - putParcelable(DeckSelectionDialog.ARG_SELECTED_DECK, SelectableDeck.AllDecks) + putParcelable(DeckSelectionDialog.RESULT_SELECTED_DECK, SelectableDeck.AllDecks) }, ) } @@ -1716,6 +1873,24 @@ class DeckPickerTest : RobolectricTest() { ) } + @Test + fun `rotating while finishing to show the App Intro does not crash`() { + setIntroductionSlidesShown(false) + val controller = Robolectric.buildActivity(DeckPicker::class.java, Intent()).create() + saveControllerForCleanup(controller) + val deckPicker = controller.get() + assertTrue(deckPicker.isFinishing, "DeckPicker should finish to show the App Intro") + + val current = deckPicker.resources.configuration + val rotated = + Configuration(current).apply { + orientation = Configuration.ORIENTATION_LANDSCAPE + screenWidthDp = current.screenHeightDp + screenHeightDp = current.screenWidthDp + } + assertDoesNotThrow { controller.configurationChange(rotated, deckPicker.resources.displayMetrics) } + } + @Test fun `startup response is cleared after handling so it does not re-run on resume`() = deckPicker { @@ -1923,13 +2098,19 @@ class DeckPickerTest : RobolectricTest() { fun RobolectricTest.setIntroductionSlidesShown(shown: Boolean) { getPreferences().edit { - putBoolean(IntroductionActivity.INTRODUCTION_SLIDES_SHOWN, shown) + putBoolean(IntroductionActivity.PREF_INTRODUCTION_SLIDES_SHOWN, shown) } } +/** + * Launches the deck picker, waiting for the initial deck list after successful startup. + * When supplied, also waits for [expectedDeckIds] in adapter order before running [function]. + * Prepare collection data before calling this helper. + */ fun RobolectricTest.deckPicker( exposeTestData: Boolean = false, skipIntroduction: Boolean = true, + expectedDeckIds: List? = null, function: suspend DeckPicker.() -> Unit, ) = runTest { setIntroductionSlidesShown(skipIntroduction) @@ -1938,6 +2119,18 @@ fun RobolectricTest.deckPicker( if (exposeTestData) DeckPickerTest.DeckPickerEx::class.java else DeckPicker::class.java, Intent(), ) + val viewModel = deckPicker.viewModel + // Startup can stop at permissions, an error dialog, or the app introduction. + if (!deckPicker.isFinishing && viewModel.startupJob?.isCompleted == true && viewModel.flowOfStartupResponse.value == null) { + val expectedCount = + withCol { + sched.deckDueTree().filterAndFlattenDisplay(DeckFilters.create(viewModel.deckSearchQuery), decks.selected()).size + } + RobolectricTest.advanceRobolectricLooperUntil( + lazyMessage = { "Expected $expectedCount visible decks, got ${deckPicker.visibleDeckCount}" }, + ) { deckPicker.visibleDeckCount == expectedCount } + } + expectedDeckIds?.let { deckPicker.awaitVisibleDecks(it) } function(deckPicker) } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTestFixture.kt b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTestFixture.kt index 88f3b2fdc0bf..e93116f563c7 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTestFixture.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTestFixture.kt @@ -4,11 +4,16 @@ package com.ichi2.anki import android.content.Intent import androidx.core.content.edit -import com.ichi2.anki.RobolectricTest.Companion.advanceRobolectricLooper +import androidx.core.view.isVisible import com.ichi2.anki.RobolectricTest.Companion.advanceRobolectricLooperUntil import com.ichi2.anki.common.preferences.sharedPrefs import com.ichi2.anki.deckpicker.DeckPickerViewModel import com.ichi2.anki.deckpicker.DeckPickerViewModel.StartupResponse +import com.ichi2.anki.dialogs.DeckPickerContextMenu.DeckPickerContextMenuOption +import com.ichi2.anki.dialogs.DeckPickerContextMenuResult +import com.ichi2.anki.dialogs.setDeckPickerContextMenuResult +import com.ichi2.anki.libanki.DeckId +import com.ichi2.anki.widgets.DeckAdapter import com.ichi2.testutils.BackupManagerTestUtilities // TODO: move to testFixtures once RobolectricTest is moved @@ -32,7 +37,10 @@ fun withDeckPicker( } val deckPicker = test.startActivityNormallyOpenCollectionWithIntent(DeckPicker::class.java, Intent()).also { - advanceRobolectricLooper() // may be a fix for flaky tests + // Deck refreshes run on IO, so draining the main looper alone may finish first. + advanceRobolectricLooperUntil(lazyMessage = { "the deck list or empty collection placeholder should be shown" }) { + it.deckPickerBinding.deckPickerContent.isVisible || it.deckPickerBinding.noDecksPlaceholder.isVisible + } } block(deckPicker) } @@ -41,3 +49,26 @@ fun DeckPickerViewModel.awaitStartup() = advanceRobolectricLooperUntil { startupJob?.isActive != true && flowOfStartupResponse.value !is StartupResponse.Success } + +/** Waits for the adapter to display the expected decks, including background list diffs. */ +fun DeckPicker.awaitVisibleDecks(expectedDeckIds: List) { + val adapter = deckPickerBinding.decks.adapter as DeckAdapter + advanceRobolectricLooperUntil( + lazyMessage = { "Expected visible decks $expectedDeckIds, but found ${adapter.currentList.map { it.did }}" }, + ) { + adapter.currentList.map { it.did } == expectedDeckIds + } +} + +/** Selects a context-menu action and waits for its observable result before returning. */ +fun DeckPicker.selectContextMenuOptionAndAwait( + option: DeckPickerContextMenuOption, + deckId: DeckId, + condition: () -> Boolean, +) { + supportFragmentManager.setDeckPickerContextMenuResult(DeckPickerContextMenuResult(deckId = deckId, option = option)) + advanceRobolectricLooperUntil( + lazyMessage = { "Context-menu action $option on deck $deckId did not reach its expected state" }, + condition = condition, + ) +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ErrorMessageTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ErrorMessageTest.kt new file mode 100644 index 000000000000..70648ac25014 --- /dev/null +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ErrorMessageTest.kt @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki + +import android.text.Spanned +import android.text.style.TypefaceSpan +import android.widget.TextView +import androidx.appcompat.app.AlertDialog +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.ichi2.anki.utils.formatSearchError +import com.ichi2.anki.utils.showSearchError +import com.ichi2.testutils.EmptyAnkiActivity +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.shadows.ShadowDialog +import kotlin.test.assertContains +import kotlin.test.assertEquals +import kotlin.test.assertIs + +@RunWith(AndroidJUnit4::class) +class ErrorMessageTest : RobolectricTest() { + @Test + fun `inline code is rendered in monospace`() { + val message = showMessage("Invalid search: an `and` was found. Try `\"and\"`.") + assertEquals("Invalid search: an and was found. Try \"and\".", message.toString()) + assertEquals(listOf("and", "\"and\""), codeSpans(message)) + } + + @Test + fun `preformatted errors preserve whitespace and literal code`() { + val code = "regex parse error:\n (?i)b[<>&`\n ^\nerror: unclosed character class" + val message = showMessage("
    $code
    ") + assertEquals(code, message.toString()) + assertEquals(listOf(code), codeSpans(message)) + } + + @Test + fun `ordinary text and unmatched delimiters are preserved`() { + val text = "Error: & a_b *c*\n `unfinished
    "
    +        assertEquals(text, showMessage(text).toString())
    +    }
    +
    +    @Test
    +    fun `regex diagnostics preserve embedded closing tags`() {
    +        val code = "regex parse error:\n    (?i)
    [&`\n ^\nerror: unclosed character class" + val message = formatSearchError("
    $code
    ") + assertEquals(code, message.toString()) + assertEquals(listOf(code), codeSpans(message)) + } + + @Test + fun `malformed or unsupported code delimiters remain literal`() { + val messages = + listOf( + "an `unclosed", + "`a` and `unclosed", + "``a``", + "`a``b`", + "`a` then ` `", + "`a\nb`", + "`a\rb`", + "\\`a\\`", + ) + for (text in messages) { + val message = formatSearchError(text) + assertEquals(text, message.toString()) + assertEquals(emptyList(), codeSpans(message)) + } + } + + @Test + fun `inline code trims edge whitespace like Python Markdown`() { + val message = formatSearchError("Use ` and ` or ` & `.") + assertEquals("Use and or &.", message.toString()) + assertEquals(listOf("and", "&"), codeSpans(message)) + } + + @Test + fun `generic errors keep code delimiters literal`() { + val text = "File `name` failed:
      diagnostic
    " + assertEquals(text, showMessage(text, searchError = false).toString()) + } + + @Test + fun `browser formats actual backend search errors`() = + runTest { + throwOnShowError = false + addBasicNote() + val browser = startRegularActivity() + browser.searchCardsSync("and") + advanceRobolectricLooper() + assertEquals(listOf("and", "\"and\""), codeSpans(latestMessage())) + ShadowDialog.getLatestDialog().dismiss() + + for (regex in listOf("b[", "
    [")) { + browser.searchCardsSync("re:$regex") + advanceRobolectricLooper() + val diagnostic = latestMessage() + assertContains(diagnostic.toString(), "(?i)$regex") + assertEquals(listOf(diagnostic.toString()), codeSpans(diagnostic)) + ShadowDialog.getLatestDialog().dismiss() + } + } + + private fun showMessage( + message: String, + searchError: Boolean = true, + ): CharSequence { + throwOnShowError = false + val activity = startRegularActivity() + if (searchError) activity.showSearchError(message) else activity.showError(message, crashReportData = null) + return latestMessage() + } + + private fun latestMessage(): CharSequence { + val dialog = ShadowDialog.getLatestDialog() as AlertDialog + return requireNotNull(dialog.findViewById(android.R.id.message)).text + } + + private fun codeSpans(message: CharSequence): List { + val spanned = assertIs(message) + return spanned.getSpans(0, spanned.length, TypefaceSpan::class.java).map { + assertEquals("monospace", it.family) + spanned.subSequence(spanned.getSpanStart(it), spanned.getSpanEnd(it)).toString() + } + } +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/FlagTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/FlagTest.kt index 2a2067d75dc7..31dafaabe4e8 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/FlagTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/FlagTest.kt @@ -2,23 +2,15 @@ package com.ichi2.anki -import androidx.test.ext.junit.runners.AndroidJUnit4 import com.ichi2.anki.libanki.testutils.AnkiTest import com.ichi2.anki.utils.ext.flag -import com.ichi2.testutils.EmptyApplication import com.ichi2.testutils.JvmTest import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.hasSize import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.experimental.categories.Category -import org.junit.runner.RunWith -import org.robolectric.annotation.Config /** Tests for [Flag] */ -@RunWith(AndroidJUnit4::class) -@Config(application = EmptyApplication::class) -@Category(EmptyApplicationCategory::class) class FlagTest : JvmTest() { @Test fun `search node conversion integration test`() { diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ForegroundMediaNetworkTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ForegroundMediaNetworkTest.kt index 1b0ead8b4aeb..fc26f3fe7956 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ForegroundMediaNetworkTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ForegroundMediaNetworkTest.kt @@ -8,6 +8,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.work.NetworkType import androidx.work.WorkInfo import androidx.work.WorkManager +import anki.sync.FullUploadOrDownloadRequest import anki.sync.SyncCollectionResponse import anki.sync.syncCollectionResponse import com.ichi2.anki.dialogs.SyncErrorDialog @@ -15,6 +16,7 @@ import com.ichi2.anki.settings.Prefs import com.ichi2.anki.settings.enums.ShouldFetchMedia import com.ichi2.anki.utils.ext.DIALOG_FRAGMENT_TAG import com.ichi2.anki.worker.UniqueWorkNames +import com.ichi2.testutils.BackupManagerTestUtilities import com.ichi2.utils.NetworkUtils import io.mockk.every import io.mockk.mockkObject @@ -38,6 +40,9 @@ import kotlin.test.assertNotNull class ForegroundMediaNetworkTest : RobolectricTest() { private var metered = false private var syncRequired = SyncCollectionResponse.ChangesRequired.NO_CHANGES + private var fullSyncRequest: FullUploadOrDownloadRequest? = null + + override fun getCollectionStorageMode() = CollectionStorageMode.ON_DISK override fun setupTestDispatcher(dispatcher: TestDispatcher) { super.setupTestDispatcher(dispatcher) @@ -47,6 +52,7 @@ class ForegroundMediaNetworkTest : RobolectricTest() { @Before fun prepareSync() { + BackupManagerTestUtilities.setupSpaceForBackup(targetContext) Prefs.hkey = "test" Prefs.lastSyncTime = 0 Prefs.allowSyncOnMeteredConnections = false @@ -65,13 +71,16 @@ class ForegroundMediaNetworkTest : RobolectricTest() { return syncCollectionResponse { required = syncRequired } } - override fun fullUploadOrDownload(input: anki.sync.FullUploadOrDownloadRequest) = Unit + override fun fullUploadOrDownload(input: FullUploadOrDownloadRequest) { + fullSyncRequest = input + } } } } @After fun resetSync() { + BackupManagerTestUtilities.reset() BackendFactory.setOverride(null) unmockkObject(NetworkUtils) } @@ -127,9 +136,10 @@ class ForegroundMediaNetworkTest : RobolectricTest() { deckPicker { syncRequired = SyncCollectionResponse.ChangesRequired.FULL_SYNC - val request = syncAndGetMediaWork(resolveConflict = true) + val request = syncAndGetMediaWork(resolveConflict = ConflictResolution.FULL_UPLOAD) assertThat(request.constraints.requiredNetworkType, equalTo(NetworkType.UNMETERED)) + assertFullSyncDoesNotStartMedia(upload = true) } @Test @@ -138,15 +148,56 @@ class ForegroundMediaNetworkTest : RobolectricTest() { metered = true syncRequired = SyncCollectionResponse.ChangesRequired.FULL_SYNC - val request = syncAndGetMediaWork(confirmWarning = true, resolveConflict = true) + val request = syncAndGetMediaWork(confirmWarning = true, resolveConflict = ConflictResolution.FULL_UPLOAD) assertThat(Prefs.allowSyncOnMeteredConnections, equalTo(false)) assertThat(request.constraints.requiredNetworkType, equalTo(NetworkType.CONNECTED)) + assertFullSyncDoesNotStartMedia(upload = true) + } + + @Test + fun `conflict download leaves media startup to the constrained worker`() = + deckPicker { + syncRequired = SyncCollectionResponse.ChangesRequired.FULL_SYNC + + val request = syncAndGetMediaWork(resolveConflict = ConflictResolution.FULL_DOWNLOAD) + + assertThat(request.constraints.requiredNetworkType, equalTo(NetworkType.UNMETERED)) + assertFullSyncDoesNotStartMedia(upload = false) + } + + @Test + fun `direct full upload leaves media startup to the constrained worker`() = + deckPicker { + syncRequired = SyncCollectionResponse.ChangesRequired.FULL_UPLOAD + + val request = syncAndGetMediaWork() + + assertThat(request.constraints.requiredNetworkType, equalTo(NetworkType.UNMETERED)) + assertFullSyncDoesNotStartMedia(upload = true) } + @Test + fun `direct full download leaves media startup to the constrained worker`() = + deckPicker { + syncRequired = SyncCollectionResponse.ChangesRequired.FULL_DOWNLOAD + + val request = syncAndGetMediaWork() + + assertThat(request.constraints.requiredNetworkType, equalTo(NetworkType.UNMETERED)) + assertFullSyncDoesNotStartMedia(upload = false) + } + + private fun assertFullSyncDoesNotStartMedia(upload: Boolean) { + val request = requireNotNull(fullSyncRequest) + assertThat(request.upload, equalTo(upload)) + // Supplying serverUsn makes the Rust backend start media before WorkManager can gate it. + assertThat("the full sync must not start native media sync", request.hasServerUsn(), equalTo(false)) + } + private fun DeckPicker.syncAndGetMediaWork( confirmWarning: Boolean = false, - resolveConflict: Boolean = false, + resolveConflict: ConflictResolution? = null, ): WorkInfo { val manager = WorkManager.getInstance(this) sync() @@ -154,10 +205,14 @@ class ForegroundMediaNetworkTest : RobolectricTest() { (ShadowDialog.getLatestDialog() as AlertDialog).getButton(DialogInterface.BUTTON_POSITIVE).performClick() } advanceRobolectricLooperUntil { Prefs.lastSyncTime != 0L } - if (resolveConflict) { + if (resolveConflict != null) { Prefs.lastSyncTime = 0 - // Choose "Keep AnkiDroid" and confirm replacing the server collection. - conflictDialog().getButton(DialogInterface.BUTTON_POSITIVE).performClick() + val button = + when (resolveConflict) { + ConflictResolution.FULL_UPLOAD -> DialogInterface.BUTTON_POSITIVE + ConflictResolution.FULL_DOWNLOAD -> DialogInterface.BUTTON_NEGATIVE + } + conflictDialog().getButton(button).performClick() advanceRobolectricLooper() conflictDialog().getButton(DialogInterface.BUTTON_POSITIVE).performClick() advanceRobolectricLooperUntil { Prefs.lastSyncTime != 0L } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/FragmentCoroutineLifecycleTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/FragmentCoroutineLifecycleTest.kt index 7d78a6fd3a68..a034a695999c 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/FragmentCoroutineLifecycleTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/FragmentCoroutineLifecycleTest.kt @@ -15,7 +15,6 @@ import com.ichi2.anki.FragmentLifecycleFixture.Transition.REMOVE import com.ichi2.testutils.FragmentCoroutineTracker import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher -import org.junit.Assume.assumeFalse import org.junit.Assume.assumeTrue import org.junit.Test import org.junit.runner.RunWith @@ -111,7 +110,6 @@ class FragmentCoroutineLifecycleTest( if (transition != REMOVE) { assumeTrue("$fixture has no fragment view", fixture.hasFragmentView) } - assumeFalse("Known startup failure: $fixture during $transition (Issue 22065)", transition in fixture.knownFailures) withHost { activity, fragment -> // Main.immediate queues nested launches until this outer coroutine finishes. // This lets the test destroy the fragment/view before its startup work runs. diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/FragmentLifecycleFixture.kt b/AnkiDroid/src/test/java/com/ichi2/anki/FragmentLifecycleFixture.kt index 6935ec49a536..62377a2f8e7b 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/FragmentLifecycleFixture.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/FragmentLifecycleFixture.kt @@ -3,9 +3,6 @@ package com.ichi2.anki import androidx.fragment.app.Fragment -import com.ichi2.anki.FragmentLifecycleFixture.Transition.DESTROY_VIEW -import com.ichi2.anki.FragmentLifecycleFixture.Transition.RECREATE_VIEW -import com.ichi2.anki.FragmentLifecycleFixture.Transition.REMOVE import com.ichi2.anki.browser.BrowserColumnSelectionFragment import com.ichi2.anki.cardviewer.SingleCardSide import com.ichi2.anki.dialogs.ChangeNoteTypeDialog @@ -33,8 +30,6 @@ class FragmentLifecycleFixture( private val name: String, val host: Class = AnkiActivity::class.java, val hasFragmentView: Boolean = true, - // Confirmed failures in the startup stress test. Remove each entry when its failure is fixed. - val knownFailures: Set = emptySet(), val create: RobolectricTest.() -> Fragment, ) { enum class Transition { REMOVE, DESTROY_VIEW, RECREATE_VIEW } @@ -44,36 +39,40 @@ class FragmentLifecycleFixture( fun fragmentLifecycleFixtures(): List = listOf( - FragmentLifecycleFixture("StudyOptions", knownFailures = setOf(REMOVE)) { StudyOptionsFragment() }, - FragmentLifecycleFixture("AppearanceSettings", knownFailures = setOf(REMOVE)) { AppearanceSettingsFragment() }, - FragmentLifecycleFixture("GeneralSettings", knownFailures = setOf(REMOVE)) { GeneralSettingsFragment() }, - FragmentLifecycleFixture("ReviewerOptions", knownFailures = setOf(REMOVE)) { ReviewerOptionsFragment() }, - FragmentLifecycleFixture("ReviewingSettings", knownFailures = setOf(REMOVE)) { ReviewingSettingsFragment() }, + FragmentLifecycleFixture("StudyOptions") { StudyOptionsFragment() }, + FragmentLifecycleFixture("AppearanceSettings") { AppearanceSettingsFragment() }, + FragmentLifecycleFixture("GeneralSettings") { GeneralSettingsFragment() }, + FragmentLifecycleFixture("ReviewerOptions") { ReviewerOptionsFragment() }, + FragmentLifecycleFixture("ReviewingSettings") { ReviewingSettingsFragment() }, FragmentLifecycleFixture("AdvancedSettings") { AdvancedSettingsFragment() }, FragmentLifecycleFixture("DeveloperOptions") { DeveloperOptionsFragment() }, FragmentLifecycleFixture("SyncSettings") { SyncSettingsFragment() }, FragmentLifecycleFixture("About") { AboutFragment() }, - FragmentLifecycleFixture("ScheduleReminders", knownFailures = setOf(REMOVE, DESTROY_VIEW)) { ScheduleRemindersFragment() }, - FragmentLifecycleFixture("FilteredDeckOptions", knownFailures = setOf(REMOVE, DESTROY_VIEW, RECREATE_VIEW)) { + FragmentLifecycleFixture("ScheduleReminders") { ScheduleRemindersFragment() }, + FragmentLifecycleFixture("FilteredDeckOptions") { FilteredDeckOptionsFragment() }, - FragmentLifecycleFixture("MediaCheck", knownFailures = setOf(REMOVE, DESTROY_VIEW)) { MediaCheckFragment() }, - FragmentLifecycleFixture("ManageSpace", knownFailures = setOf(REMOVE)) { ManageSpaceFragment() }, - FragmentLifecycleFixture("ChangeNoteType", knownFailures = setOf(REMOVE)) { + FragmentLifecycleFixture("MediaCheck") { MediaCheckFragment() }, + FragmentLifecycleFixture("ManageSpace") { ManageSpaceFragment() }, + FragmentLifecycleFixture("ChangeNoteType") { ChangeNoteTypeDialog.newInstance(listOf(addBasicNote().id)) }, - FragmentLifecycleFixture("CustomStudy", hasFragmentView = false) { CustomStudyDialog.createInstance(col.decks.selected()) }, - FragmentLifecycleFixture("AddReminder", hasFragmentView = false, knownFailures = setOf(REMOVE)) { + FragmentLifecycleFixture("CustomStudy", hasFragmentView = false) { + // Empty decks dismiss the dialog instead of remaining resumed. + addBasicNote() + CustomStudyDialog.createInstance(col.decks.selected()) + }, + FragmentLifecycleFixture("AddReminder", hasFragmentView = false) { AddEditReminderDialog.getInstance(AddEditReminderDialog.DialogMode.Add(ReviewReminderScope.Global)) }, - FragmentLifecycleFixture("InsertField", knownFailures = setOf(REMOVE)) { + FragmentLifecycleFixture("InsertField") { InsertFieldDialog.newInstance( fieldItems = listOf("Front", "Back"), metadata = InsertFieldMetadata(SingleCardSide.FRONT, "Card 1", "Basic", null, null, null, "Default"), requestKey = "insert-field-test", ) }, - FragmentLifecycleFixture("BrowserColumns", host = CardBrowser::class.java, knownFailures = setOf(REMOVE, DESTROY_VIEW)) { + FragmentLifecycleFixture("BrowserColumns", host = CardBrowser::class.java) { BrowserColumnSelectionFragment.createInstance(CardsOrNotes.CARDS) }, ) diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ImportAdapterTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ImportAdapterTest.kt new file mode 100644 index 000000000000..07477479211d --- /dev/null +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ImportAdapterTest.kt @@ -0,0 +1,162 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.ContentProvider +import android.content.Intent +import android.database.MatrixCursor +import android.net.Uri +import android.provider.OpenableColumns +import androidx.core.net.toUri +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.ichi2.anki.common.crashreporting.CrashReportService +import com.ichi2.anki.common.crashreporting.CrashReporter +import com.ichi2.anki.pages.CsvImporter +import com.ichi2.utils.ImportResult +import com.ichi2.utils.ImportUtils +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.any +import org.mockito.kotlin.anyOrNull +import org.mockito.kotlin.doThrow +import org.mockito.kotlin.mock +import org.mockito.kotlin.spy +import org.mockito.kotlin.verify +import org.mockito.kotlin.verifyNoInteractions +import org.mockito.kotlin.whenever +import org.robolectric.Robolectric +import org.robolectric.Shadows.shadowOf +import org.robolectric.shadows.ShadowContentResolver +import java.io.File +import java.io.FileNotFoundException +import java.io.IOException +import java.io.InputStream +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.test.assertNotNull +import kotlin.test.assertNull + +/** The legacy adapter must report both preparation and launch failures to its caller. */ +@RunWith(AndroidJUnit4::class) +class ImportAdapterTest : RobolectricTest() { + private lateinit var originalCrashReporter: CrashReporter + private val crashReporter = mock() + + @Before + fun captureCrashReports() { + originalCrashReporter = CrashReportService.getReporter() + CrashReportService.setReporter(crashReporter) + } + + @After + fun restoreCrashReporter() { + CrashReportService.setReporter(originalCrashReporter) + } + + @Test + fun `missing text source returns failure without opening the importer`() { + val activity = importActivity() + val missingFile = File(tempFolder.root, "deleted.csv") + val uri = textSource("deleted.csv") { missingFile.inputStream() } + + val result = ImportUtils.handleFileImport(activity, Intent(Intent.ACTION_VIEW, uri)) + + val failure = assertIs(result) + assertIs(failure.exception) + assertEquals(activity.getString(CommonString.import_error_copy_to_cache_title), failure.title) + assertNull(shadowOf(activity).nextStartedActivity) + verifyNoInteractions(crashReporter) + } + + @Test + fun `unreadable text source returns failure and reports the copy error`() { + val activity = importActivity() + val exception = IOException("Could not read selected text file") + val uri = + textSource("unreadable.tsv") { + object : InputStream() { + override fun read(): Int = throw exception + } + } + + val result = ImportUtils.handleFileImport(activity, Intent(Intent.ACTION_VIEW, uri)) + + val failure = assertIs(result) + assertEquals(exception, failure.exception) + assertEquals(activity.getString(CommonString.import_error_copy_to_cache_title), failure.title) + assertNull(shadowOf(activity).nextStartedActivity) + verify(crashReporter).sendExceptionReport(exception, "ImportUtils", null, false) + } + + @Test + fun `text import copies bytes and opens the raw cached path before returning`() { + val activity = importActivity() + val fileName = "notes 好 + %.csv" + val contents = "front,back\nhello,world\n" + val uri = textSource(fileName) { contents.byteInputStream() } + + val result = ImportUtils.handleFileImport(activity, Intent(Intent.ACTION_VIEW, uri)) + + assertIs(result) + val cachedFile = File(activity.cacheDir, fileName) + assertEquals(contents, cachedFile.readText()) + val intent = assertNotNull(shadowOf(activity).nextStartedActivity) + assertEquals(SingleFragmentActivity::class.java.name, intent.component?.className) + assertEquals(CsvImporter::class.java.name, intent.getStringExtra(SingleFragmentActivity.EXTRA_FRAGMENT_NAME)) + assertEquals(cachedFile.absolutePath, intent.getBundleExtra(SingleFragmentActivity.EXTRA_FRAGMENT_ARGS)?.getString("filePath")) + assertEquals(DeckPicker::class.java.name, shadowOf(activity).nextStartedActivity?.component?.className) + assertNull(shadowOf(activity).nextStartedActivity) + } + + @Test + fun `preparation copies text without opening the importer`() { + val activity = importActivity() + val contents = "front,back" + val uri = textSource("notes.csv") { contents.byteInputStream() } + + val result = assertIs(ImportUtils.prepareImport(activity, Intent(Intent.ACTION_VIEW, uri))) + + assertEquals(uri, result.file.source.uri) + assertEquals(File(activity.cacheDir, "notes.csv").absolutePath, result.path) + assertEquals(contents, File(result.path).readText()) + assertNull(shadowOf(activity).nextStartedActivity) + } + + @Test + fun `failure to launch text importer is returned to the caller`() { + val activity = spy(importActivity()) + val exception = ActivityNotFoundException("Importer could not be opened") + doThrow(exception).whenever(activity).startActivities(any(), anyOrNull()) + val uri = textSource("notes.csv") { "front,back".byteInputStream() } + + val result = ImportUtils.handleFileImport(activity, Intent(Intent.ACTION_VIEW, uri)) + + assertEquals(exception, assertIs(result).exception) + verify(crashReporter).sendExceptionReport(exception, "handleFileImport", null, false) + } + + private fun importActivity(): Activity { + val controller = Robolectric.buildActivity(Activity::class.java).create() + saveControllerForCleanup(controller) + return controller.get() + } + + private fun textSource( + fileName: String, + open: () -> InputStream, + ): Uri { + val uri = "content://import/document/123".toUri() + val provider = mock() + whenever(provider.query(any(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull())).thenAnswer { + MatrixCursor(arrayOf(OpenableColumns.DISPLAY_NAME)).apply { addRow(arrayOf(fileName)) } + } + whenever(provider.getType(uri)).thenReturn("text/csv") + ShadowContentResolver.registerProviderInternal("import", provider) + shadowOf(targetContext.contentResolver).registerInputStreamSupplier(uri) { open() } + return uri + } +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/InfoInsetsTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/InfoInsetsTest.kt index 23a3953319ca..9af48667d532 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/InfoInsetsTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/InfoInsetsTest.kt @@ -5,8 +5,8 @@ package com.ichi2.anki import android.content.Intent import android.view.View import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.ichi2.anki.common.utils.dp import com.ichi2.testutils.dispatchInsets -import com.ichi2.utils.dp import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.equalTo import org.junit.Test diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/InfoScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/InfoScreenshotTest.kt index 8237b529b674..c76aa702e7f5 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/InfoScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/InfoScreenshotTest.kt @@ -13,8 +13,8 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat.Type.displayCutout import androidx.core.view.WindowInsetsCompat.Type.navigationBars import androidx.core.view.WindowInsetsCompat.Type.statusBars +import com.ichi2.anki.common.utils.dp import com.ichi2.testutils.insetsOf -import com.ichi2.utils.dp import org.junit.Test import org.robolectric.RuntimeEnvironment diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/InfoTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/InfoTest.kt new file mode 100644 index 000000000000..fdc0e3081ac4 --- /dev/null +++ b/AnkiDroid/src/test/java/com/ichi2/anki/InfoTest.kt @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki + +import android.content.Intent +import android.webkit.WebView +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.ichi2.anki.workarounds.SafeWebViewLayout +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.Matchers.equalTo +import org.hamcrest.Matchers.not +import org.hamcrest.Matchers.sameInstance +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.Shadows.shadowOf + +@RunWith(AndroidJUnit4::class) +class InfoTest : RobolectricTest() { + private fun launchInfo(): Info = + startActivityNormallyOpenCollectionWithIntent( + Info::class.java, + Intent(targetContext, Info::class.java), + ) + + private fun Info.webViewLayout(): SafeWebViewLayout = findViewById(R.id.web_view) + + @Test + fun `onRenderProcessGone recovers by recreating the inner WebView`() { + val activity = launchInfo() + val webViewLayout = activity.webViewLayout() + val initialInnerWebView = webViewLayout.getChildAt(0) as WebView + + webViewLayout.onRenderProcessGone(initialInnerWebView) + + assertThat("crashed WebView is destroyed", shadowOf(initialInnerWebView).wasDestroyCalled(), equalTo(true)) + assertThat("a fresh WebView replaces it", webViewLayout.childCount, equalTo(1)) + val recoveredInnerWebView = webViewLayout.getChildAt(0) as WebView + assertThat("recovered WebView is a new instance", recoveredInnerWebView, not(sameInstance(initialInnerWebView))) + assertThat("recovered WebView is not destroyed", shadowOf(recoveredInnerWebView).wasDestroyCalled(), equalTo(false)) + } + + @Test + fun `onRenderProcessGone does not finish the activity`() { + val activity = launchInfo() + val webViewLayout = activity.webViewLayout() + val innerWebView = webViewLayout.getChildAt(0) as WebView + + webViewLayout.onRenderProcessGone(innerWebView) + + assertThat("activity stays alive after render-process crash", activity.isFinishing, equalTo(false)) + } + + @Test + fun `safeDestroy tears down the inner WebView`() { + val controller = + startActivityControllerNormallyOpenCollectionWithIntent( + Info::class.java, + Intent(targetContext, Info::class.java), + ) + val innerWebView = controller.get().webViewLayout().getChildAt(0) as WebView + controller.pause().stop().destroy() + assertThat("WebView.destroy() called on teardown", shadowOf(innerWebView).wasDestroyCalled(), equalTo(true)) + } + + @Test + fun `safeDestroy after render-process crash does not call destroy twice`() { + val activity = launchInfo() + val webViewLayout = activity.webViewLayout() + val crashedWebView = webViewLayout.getChildAt(0) as WebView + + webViewLayout.onRenderProcessGone(crashedWebView) + assertThat(shadowOf(crashedWebView).wasDestroyCalled(), equalTo(true)) + + val recoveredWebView = webViewLayout.getChildAt(0) as WebView + webViewLayout.safeDestroy() + assertThat("recovered WebView is destroyed on teardown", shadowOf(recoveredWebView).wasDestroyCalled(), equalTo(true)) + } +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/IntentHandlerImportTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/IntentHandlerImportTest.kt index cfc1b0a53973..6ce5407b81b6 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/IntentHandlerImportTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/IntentHandlerImportTest.kt @@ -8,6 +8,7 @@ import androidx.appcompat.app.AlertDialog import androidx.core.net.toUri import androidx.test.ext.junit.runners.AndroidJUnit4 import com.ichi2.anki.dialogs.utils.message +import com.ichi2.utils.ImportResolution import com.ichi2.utils.ImportResult import com.ichi2.utils.ImportUtils import io.mockk.every @@ -58,7 +59,11 @@ class IntentHandlerImportTest : RobolectricTest() { @Test fun `successful import finishes the intent handler`() { - every { ImportUtils.handleFileImport(any(), any()) } returns ImportResult.Success + every { ImportUtils.handleFileImport(any(), any()) } returns + ImportResult.Success( + ImportResolution.DeckPackage(ImportResolution.Source("content://import/deck.apkg".toUri(), "deck.apkg")), + "/cache/deck.apkg", + ) assertTrue(launchImport().isFinishing) } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/IntentSyncTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/IntentSyncTest.kt new file mode 100644 index 000000000000..4e0a08988fb9 --- /dev/null +++ b/AnkiDroid/src/test/java/com/ichi2/anki/IntentSyncTest.kt @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.ichi2.anki.settings.Prefs +import com.ichi2.anki.settings.enums.ShouldFetchMedia +import com.ichi2.anki.sync.MeteredSyncPolicy +import com.ichi2.anki.worker.SyncWorker +import com.ichi2.utils.NetworkUtils +import io.mockk.every +import io.mockk.justRun +import io.mockk.mockkObject +import io.mockk.unmockkAll +import io.mockk.verify +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.Matchers.equalTo +import org.hamcrest.Matchers.sameInstance +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.shadows.ShadowDialog + +@RunWith(AndroidJUnit4::class) +class IntentSyncTest : RobolectricTest() { + @Before + fun setUpSync() { + mockkObject(NetworkUtils, MeteredSyncPolicy, SyncWorker.Companion) + every { NetworkUtils.isOnline } returns true + every { MeteredSyncPolicy.shouldBlock() } returns false + justRun { SyncWorker.start(any(), any(), any()) } + } + + @After + fun resetMocks() { + unmockkAll() + } + + @Test + fun `sync intent schedules collection and media independently of the finishing activity`() = + deckPicker { + Prefs.hkey = "test" + Prefs.lastSyncTime = 0 + Prefs.putEnum(R.string.sync_fetch_media_key, ShouldFetchMedia.ALWAYS) + + IntentHandler.Companion.DoSync().handleAsyncMessage(this) + + assertThat(isFinishing, equalTo(true)) + verify(exactly = 1) { SyncWorker.start(this@deckPicker, match { it.hkey == "test" }, true) } + } + + @Test + fun `sync intent respects disabled media sync`() = + deckPicker { + Prefs.hkey = "test" + Prefs.lastSyncTime = 0 + Prefs.putEnum(R.string.sync_fetch_media_key, ShouldFetchMedia.NEVER) + + IntentHandler.Companion.DoSync().handleAsyncMessage(this) + + verify(exactly = 1) { SyncWorker.start(this@deckPicker, any(), false) } + } + + @Test + fun `sync intent respects metered connection policy`() = + deckPicker { + Prefs.hkey = "test" + val previousSyncTime = 1_000L + Prefs.lastSyncTime = previousSyncTime + every { MeteredSyncPolicy.shouldBlock() } returns true + val previousDialog = ShadowDialog.getLatestDialog() + + IntentHandler.Companion.DoSync().handleAsyncMessage(this) + + verify(exactly = 0) { SyncWorker.start(any(), any(), any()) } + assertThat("sync must not open a confirmation dialog", ShadowDialog.getLatestDialog(), sameInstance(previousDialog)) + assertThat(isFinishing, equalTo(true)) + assertThat("blocked sync must not count as a sync attempt", Prefs.lastSyncTime, equalTo(previousSyncTime)) + } + + @Test + fun `sync intent respects rate limit`() = + deckPicker { + Prefs.hkey = "test" + setLastSyncTimeToNow() + + IntentHandler.Companion.DoSync().handleAsyncMessage(this) + + verify(exactly = 0) { SyncWorker.start(any(), any(), any()) } + } + + @Test + fun `sync intent does not sync when offline`() = + deckPicker { + Prefs.hkey = "test" + Prefs.lastSyncTime = 0 + every { NetworkUtils.isOnline } returns false + + IntentHandler.Companion.DoSync().handleAsyncMessage(this) + + verify(exactly = 0) { SyncWorker.start(any(), any(), any()) } + } + + @Test + fun `sync intent does not sync when logged out`() = + deckPicker { + Prefs.hkey = "" + Prefs.lastSyncTime = 0 + + IntentHandler.Companion.DoSync().handleAsyncMessage(this) + + verify(exactly = 0) { SyncWorker.start(any(), any(), any()) } + } +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/IntentSyncWorkTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/IntentSyncWorkTest.kt new file mode 100644 index 000000000000..1f4d58d949ab --- /dev/null +++ b/AnkiDroid/src/test/java/com/ichi2/anki/IntentSyncWorkTest.kt @@ -0,0 +1,167 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki + +import android.content.Intent +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkInfo +import androidx.work.WorkManager +import com.ichi2.anki.CollectionManager.withLeaseForTest +import com.ichi2.anki.worker.SyncWorker +import com.ichi2.anki.worker.UniqueWorkNames +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkObject +import io.mockk.unmockkObject +import kotlinx.coroutines.flow.MutableSharedFlow +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.Matchers.equalTo +import org.hamcrest.Matchers.nullValue +import org.hamcrest.Matchers.sameInstance +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.Robolectric +import org.robolectric.Shadows.shadowOf +import java.util.UUID +import java.util.concurrent.TimeUnit + +@RunWith(AndroidJUnit4::class) +class IntentSyncWorkTest : RobolectricTest() { + @Test + fun `sync intent leaves pending background sync intact`() { + val workId = enqueueSync() + + val activity = launchIntent("com.ichi2.anki.DO_SYNC") + + assertThat(workManager.getWorkInfoById(workId).get()!!.state, equalTo(WorkInfo.State.ENQUEUED)) + assertThat("a duplicate sync must not open the collection in DeckPicker", shadowOf(activity).nextStartedActivity, nullValue()) + } + + @Test + fun `sync intent leaves foreground collection sync intact`() = + runTest { + for (operation in listOf(CollectionOperation.SYNC, CollectionOperation.FULL_UPLOAD, CollectionOperation.FULL_DOWNLOAD)) { + withLeaseForTest(operation) { + val lease = CollectionManager.collectionLease + + val activity = launchIntent("com.ichi2.anki.DO_SYNC") + + assertThat( + "a duplicate $operation intent must not open DeckPicker", + shadowOf(activity).nextStartedActivity, + nullValue(), + ) + assertThat("the existing $operation must retain its lease", CollectionManager.collectionLease, sameInstance(lease)) + } + } + } + + @Test + fun `sync intent checks foreground sync after the work query completes`() = + runTest { + withPendingSyncQuery { results -> + Robolectric.buildActivity(IntentHandler::class.java, Intent("com.ichi2.anki.DO_SYNC")).use { controller -> + controller.create().start().resume() + val activity = controller.get() + assertThat(results.subscriptionCount.value, equalTo(1)) + + withLeaseForTest(CollectionOperation.SYNC) { + results.emit(emptyList()) + + assertThat(activity.isFinishing, equalTo(true)) + assertThat("a new foreground sync must prevent navigation", shadowOf(activity).nextStartedActivity, nullValue()) + } + } + } + } + + @Test + fun `opening the app still cancels background collection sync`() { + val workId = enqueueSync() + + launchIntent(Intent.ACTION_MAIN) + + assertThat(workManager.getWorkInfoById(workId).get()!!.state, equalTo(WorkInfo.State.CANCELLED)) + } + + @Test + fun `sync intent opens DeckPicker when no sync is pending`() { + val activity = launchIntent("com.ichi2.anki.DO_SYNC") + val intent = shadowOf(activity).nextStartedActivity + + assertThat(intent.component!!.className, equalTo(DeckPicker::class.java.name)) + assertThat(intent.action, equalTo("com.ichi2.anki.DO_SYNC")) + } + + @Test + fun `finishing the handler before the work query completes prevents navigation`() = + runTest { + withPendingSyncQuery { results -> + Robolectric.buildActivity(IntentHandler::class.java, Intent("com.ichi2.anki.DO_SYNC")).use { controller -> + controller.create().start().resume() + val activity = controller.get() + assertThat(results.subscriptionCount.value, equalTo(1)) + + activity.finish() + results.emit(emptyList()) + + assertThat("a finishing handler must not launch DeckPicker", shadowOf(activity).nextStartedActivity, nullValue()) + } + } + } + + @Test + fun `destroying the handler cancels its pending work query`() = + runTest { + withPendingSyncQuery { results -> + Robolectric.buildActivity(IntentHandler::class.java, Intent("com.ichi2.anki.DO_SYNC")).use { controller -> + controller.create().start().resume() + val activity = controller.get() + assertThat(results.subscriptionCount.value, equalTo(1)) + + activity.finish() + controller.pause().stop().destroy() + assertThat(results.subscriptionCount.value, equalTo(0)) + results.emit(emptyList()) + + assertThat("a destroyed handler must not launch DeckPicker", shadowOf(activity).nextStartedActivity, nullValue()) + } + } + } + + private suspend fun withPendingSyncQuery(block: suspend (MutableSharedFlow>) -> Unit) { + val results = MutableSharedFlow>() + val manager = mockk() + mockkObject(WorkManager.Companion) + try { + every { WorkManager.getInstance(any()) } returns manager + every { manager.getWorkInfosForUniqueWorkFlow(UniqueWorkNames.SYNC) } returns results + block(results) + } finally { + unmockkObject(WorkManager.Companion) + } + } + + private val workManager get() = WorkManager.getInstance(targetContext) + + private fun enqueueSync(): UUID { + // Keep the real worker queued without starting a network request. + val work = + OneTimeWorkRequestBuilder() + .setInitialDelay(1, TimeUnit.HOURS) + .build() + workManager.enqueueUniqueWork(UniqueWorkNames.SYNC, ExistingWorkPolicy.KEEP, work).result.get() + assertThat(workManager.getWorkInfoById(work.id).get()!!.state, equalTo(WorkInfo.State.ENQUEUED)) + return work.id + } + + private fun launchIntent(action: String): IntentHandler { + val controller = Robolectric.buildActivity(IntentHandler::class.java, Intent(action)) + saveControllerForCleanup(controller) + val activity = controller.create().get() + advanceRobolectricLooperUntil { activity.isFinishing } + return activity + } +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/IntroductionActivityTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/IntroductionActivityTest.kt index 80e798d484de..07c07dea004e 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/IntroductionActivityTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/IntroductionActivityTest.kt @@ -72,7 +72,7 @@ class IntroductionActivityTest : RobolectricTest() { val activity = startRegularActivity(Intent()) activity.supportFragmentManager.setFragmentResult( - SetupCollectionFragment.FRAGMENT_KEY, + SetupCollectionFragment.REQUEST_COLLECTION_SETUP, Bundle().apply { putParcelable(SetupCollectionFragment.RESULT_KEY, DeckPickerWithNewCollection) }, ) @@ -83,19 +83,19 @@ class IntroductionActivityTest : RobolectricTest() { ) assertThat( "DeckPicker isn't asked to sync (Get Started, not Sync)", - intent.getBooleanExtra(DeckPicker.INTENT_SYNC_FROM_LOGIN, false), + intent.getBooleanExtra(DeckPicker.EXTRA_SYNC_FROM_LOGIN, false), equalTo(false), ) assertThat( "intro is marked as shown so it doesn't reappear", - getPreferences().getBoolean(IntroductionActivity.INTRODUCTION_SLIDES_SHOWN, false), + getPreferences().getBoolean(IntroductionActivity.PREF_INTRODUCTION_SLIDES_SHOWN, false), equalTo(true), ) } private fun IntroductionActivity.clickSync() { supportFragmentManager.setFragmentResult( - SetupCollectionFragment.FRAGMENT_KEY, + SetupCollectionFragment.REQUEST_COLLECTION_SETUP, Bundle().apply { putParcelable(SetupCollectionFragment.RESULT_KEY, SyncFromExistingAccount) }, ) } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/IntroductionInsetsTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/IntroductionInsetsTest.kt index bc7e3f69b25d..e1acae5534a3 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/IntroductionInsetsTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/IntroductionInsetsTest.kt @@ -5,9 +5,9 @@ package com.ichi2.anki import android.content.Intent import android.view.View import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.introduction.SetupCollectionFragment import com.ichi2.testutils.dispatchInsets -import com.ichi2.utils.dp import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.equalTo import org.junit.Test diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/IntroductionScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/IntroductionScreenshotTest.kt index 4d7c17388559..2fed3139e6c9 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/IntroductionScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/IntroductionScreenshotTest.kt @@ -13,8 +13,8 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat.Type.displayCutout import androidx.core.view.WindowInsetsCompat.Type.navigationBars import androidx.core.view.WindowInsetsCompat.Type.statusBars +import com.ichi2.anki.common.utils.dp import com.ichi2.testutils.insetsOf -import com.ichi2.utils.dp import org.junit.Test import org.robolectric.RuntimeEnvironment diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ManifestThemeTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ManifestThemeTest.kt index 680d088ceff8..894c45fbe79e 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ManifestThemeTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ManifestThemeTest.kt @@ -6,11 +6,16 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import com.ichi2.anki.compat.CompatHelper.Companion.getPackageInfoCompat import com.ichi2.anki.compat.GET_ACTIVITIES_L import com.ichi2.anki.compat.PackageInfoFlagsCompat +import com.ichi2.testutils.AndroidTest +import com.ichi2.testutils.EmptyApplication +import com.ichi2.testutils.targetContext import com.ichi2.themes.Themes import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.empty import org.junit.Test +import org.junit.experimental.categories.Category import org.junit.runner.RunWith +import org.robolectric.annotation.Config /** * [Themes.setTheme] applies the user's theme in `onCreate`, so activities should not set @@ -21,7 +26,9 @@ import org.junit.runner.RunWith * the stale background is then visible behind transparent content */ @RunWith(AndroidJUnit4::class) -class ManifestThemeTest : RobolectricTest() { +@Config(application = EmptyApplication::class) +@Category(EmptyApplicationCategory::class) +class ManifestThemeTest : AndroidTest { /** * Manifest themes which are intentional. Additions to this list should explain why the * activity cannot use the application theme. diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/MediaRegistrationTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/MediaRegistrationTest.kt new file mode 100644 index 000000000000..7cd991b386d8 --- /dev/null +++ b/AnkiDroid/src/test/java/com/ichi2/anki/MediaRegistrationTest.kt @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki + +import android.content.ClipDescription +import android.content.ContentProvider +import android.database.MatrixCursor +import android.net.Uri +import android.provider.OpenableColumns +import androidx.core.net.toUri +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import org.robolectric.Shadows.shadowOf +import org.robolectric.shadows.ShadowContentResolver +import kotlin.test.assertContentEquals +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +@RunWith(AndroidJUnit4::class) +class MediaRegistrationTest : RobolectricTest() { + override fun getCollectionStorageMode() = CollectionStorageMode.ON_DISK + + @Test + fun `pasted image references the normalized media filename`() { + assertPastedMedia("image.png", "image/png", """""") + } + + @Test + fun `pasted audio references the normalized media filename`() { + assertPastedMedia("audio.mp3", "audio/mpeg", "[sound:%s]") + } + + private fun assertPastedMedia( + filename: String, + mimeType: String, + expectedTag: String, + ) { + val data = "pasted media".toByteArray() + // Exceed the backend's filename length limit using characters valid on every OS. + val originalFilename = "a".repeat(120) + filename + val uri = stubClipboardMedia(originalFilename, data) + + val html = + MediaRegistration.loadMediaIntoCollection( + targetContext, + uri, + ClipDescription("media", arrayOf(mimeType)), + pasteAsPng = false, + showError = { error("Unexpected paste error: $it") }, + ) + + val importedFile = + col.media.dir + .listFiles()!! + .single() + assertTrue(importedFile.name.length < originalFilename.length, "Expected the backend to shorten the filename") + assertContentEquals(data, importedFile.readBytes()) + assertEquals(expectedTag.format(importedFile.name), html) + } + + private fun stubClipboardMedia( + filename: String, + data: ByteArray, + ): Uri { + val uri = "content://clipboard/media".toUri() + val cursor = MatrixCursor(arrayOf(OpenableColumns.DISPLAY_NAME)).apply { addRow(arrayOf(filename)) } + val provider = mock() + whenever(provider.query(uri, null, null, null, null)).thenReturn(cursor) + ShadowContentResolver.registerProviderInternal("clipboard", provider) + shadowOf(targetContext.contentResolver).registerInputStreamSupplier(uri) { data.inputStream() } + return uri + } +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/NavigationDrawerScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/NavigationDrawerScreenshotTest.kt index 7efc3ffa2d74..236e664897b5 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/NavigationDrawerScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/NavigationDrawerScreenshotTest.kt @@ -12,10 +12,11 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat.Type.navigationBars import androidx.core.view.WindowInsetsCompat.Type.statusBars +import com.ichi2.anki.common.utils.dp import com.ichi2.testutils.insetsOf -import com.ichi2.utils.dp import org.junit.Test import org.robolectric.RuntimeEnvironment +import com.ichi2.anki.common.android.R as CommonR /** * Screenshot tests for the navigation drawer of [NavigationDrawerActivity] @@ -73,7 +74,7 @@ class NavigationDrawerScreenshotTest : ScreenshotTest() { val navBarOverlay = View(this).apply { // the navigationBarColor of the app's themes - setBackgroundResource(R.color.semi_transparent_black) + setBackgroundResource(CommonR.color.semi_transparent_black) } decor.addView( navBarOverlay, diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorDeckSelectionTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorDeckSelectionTest.kt index bb8e809a8c68..99b616af9d17 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorDeckSelectionTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorDeckSelectionTest.kt @@ -13,11 +13,11 @@ import com.ichi2.anki.libanki.DeckId import com.ichi2.anki.model.SelectableDeck import com.ichi2.anki.noteeditor.getNoteEditorFragment import com.ichi2.anki.noteeditor.openNoteEditorWithArgs -import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith import kotlin.test.assertEquals import kotlin.test.assertFalse +import kotlin.test.assertNotNull import kotlin.test.assertNull import kotlin.test.assertTrue @@ -31,24 +31,29 @@ class NoteEditorDeckSelectionTest : RobolectricTest() { col.config.addingDefaultsMode = mode } - private fun share(text: String) = - openNoteEditorWithArgs( - Bundle().apply { putString(Intent.EXTRA_TEXT, text) }, - Intent.ACTION_SEND, - ) + private fun share( + text: String, + deckId: DeckId? = null, + ) = openNoteEditorWithArgs( + Bundle().apply { + putString(Intent.EXTRA_TEXT, text) + deckId?.let { putLong(NoteEditorFragment.EXTRA_DID, it) } + }, + Intent.ACTION_SEND, + ) private fun NoteEditorFragment.select(did: DeckId) { onDeckSelected(SelectableDeck.Deck(did, col.decks.name(did))) } @Test - @Ignore("Issue 22065: save task starts while activity is finishing") - fun `successive shares use the study deck in current-deck mode`() = + fun `successive shares remember the destination without changing the study deck`() = runTest { useAddingDefaults(AddingDefaultsMode.USE_CURRENT_DECK) val a = addDeck("Study A", setAsSelected = true) val b = addDeck("Add B") val first = share("first share") + assertEquals(a, first.deckId) val activity = first.requireActivity() first.select(b) first.saveNote() @@ -56,11 +61,11 @@ class NoteEditorDeckSelectionTest : RobolectricTest() { assertTrue(activity.isFinishing) assertEquals(listOf(b), col.findCards("").map { col.getCard(it).did }) assertEquals(a, col.decks.selected()) - assertEquals(a, share("second share").deckId) + assertEquals(b, share("second share").deckId) + assertEquals(a, openAdd().deckId) } @Test - @Ignore("Issue 22065: save task starts while activity is finishing") fun `successive shares remember the destination in note-type mode`() = runTest { useAddingDefaults(AddingDefaultsMode.DECIDE_BY_NOTE_TYPE) @@ -80,6 +85,127 @@ class NoteEditorDeckSelectionTest : RobolectricTest() { assertEquals(b, second.deckId) } + private suspend fun saveSharedNote(deckId: DeckId) { + val editor = share("saved share") + val activity = editor.requireActivity() + editor.select(deckId) + editor.saveNote() + advanceRobolectricLooper() + assertTrue(activity.isFinishing) + } + + @Test + fun `in-app additions do not replace the shared destination`() = + runTest { + useAddingDefaults(AddingDefaultsMode.USE_CURRENT_DECK) + val study = addDeck("Study", setAsSelected = true) + val shared = addDeck("Shared") + val inApp = addDeck("In app") + saveSharedNote(shared) + + val editor = openAdd(inApp) + editor.setFieldValueFromUi(0, "added in app") + editor.saveNote() + advanceRobolectricLooper() + + assertEquals(2, col.noteCount()) + assertEquals(shared, share("next share").deckId) + assertEquals(study, col.decks.selected()) + } + + @Test + fun `canceling a share does not replace the saved destination`() = + runTest { + useAddingDefaults(AddingDefaultsMode.USE_CURRENT_DECK) + addDeck("Study", setAsSelected = true) + val saved = addDeck("Saved") + val canceled = addDeck("Canceled") + saveSharedNote(saved) + + val editor = share("canceled share") + editor.select(canceled) + editor.requireActivity().finish() + + assertEquals(1, col.noteCount()) + assertEquals(saved, share("next share").deckId) + } + + @Test + fun `a failed share does not replace the saved destination`() = + runTest { + useAddingDefaults(AddingDefaultsMode.USE_CURRENT_DECK) + addDeck("Study", setAsSelected = true) + val saved = addDeck("Saved") + val failed = addDeck("Failed") + saveSharedNote(saved) + + val editor = share("") + editor.select(failed) + editor.saveNote() + advanceRobolectricLooper() + assertNotNull(editor.addNoteErrorMessage) + assertFalse(editor.requireActivity().isFinishing) + editor.requireActivity().finish() + + assertEquals(1, col.noteCount()) + assertEquals(saved, share("next share").deckId) + } + + @Test + fun `a deleted shared destination falls back to the study deck`() = + runTest { + useAddingDefaults(AddingDefaultsMode.USE_CURRENT_DECK) + val study = addDeck("Study", setAsSelected = true) + val deleted = addDeck("Deleted") + saveSharedNote(deleted) + col.decks.remove(listOf(deleted)) + + assertEquals(study, share("next share").deckId) + } + + @Test + fun `note-type defaults take precedence over the last shared destination`() = + runTest { + useAddingDefaults(AddingDefaultsMode.USE_CURRENT_DECK) + addDeck("Study", setAsSelected = true) + val shared = addDeck("Shared") + val remembered = addDeck("Remembered") + saveSharedNote(shared) + col.config.addingDefaultsMode = AddingDefaultsMode.DECIDE_BY_NOTE_TYPE + val reversed = col.notetypes.basicAndReversed + col.addNote(col.newNote(reversed).apply { fields[0] = "saved reversed" }, remembered) + + val editor = share("next share") + assertEquals(reversed.id, editor.editorNote!!.noteTypeId) + assertEquals(remembered, editor.deckId) + } + + @Test + fun `an explicit share destination takes precedence over the last shared deck`() = + runTest { + useAddingDefaults(AddingDefaultsMode.USE_CURRENT_DECK) + addDeck("Study", setAsSelected = true) + saveSharedNote(addDeck("Shared")) + + assertEquals(1L, share("explicit share", deckId = 1L).deckId) + } + + @Test + fun `selected text uses the last shared destination`() = + runTest { + useAddingDefaults(AddingDefaultsMode.USE_CURRENT_DECK) + addDeck("Study", setAsSelected = true) + val shared = addDeck("Shared") + saveSharedNote(shared) + + val editor = + openNoteEditorWithArgs( + Bundle().apply { putString(Intent.EXTRA_PROCESS_TEXT, "selected text") }, + Intent.ACTION_PROCESS_TEXT, + ) + assertEquals(shared, editor.deckId) + } + @Test fun `explicit Default deck takes precedence over the remembered deck`() = runTest { @@ -310,4 +436,21 @@ class NoteEditorDeckSelectionTest : RobolectricTest() { assertEquals(basic.id, col.defaultsForAdding().notetypeId) assertEquals(1, col.noteCount()) } + + @Test + fun `restored selection takes precedence over the original destination`() = + runTest { + useAddingDefaults(AddingDefaultsMode.USE_CURRENT_DECK) + val a = addDeck("Original A", setAsSelected = true) + val b = addDeck("Chosen B") + val controller = + startActivityControllerNormallyOpenCollectionWithIntent( + NoteEditorActivity::class.java, + NoteEditorDestination.AddNote(a).toIntent(), + ) + controller.get().getNoteEditorFragment().select(b) + controller.recreate() + advanceRobolectricLooper() + assertEquals(b, controller.get().getNoteEditorFragment().deckId) + } } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorInsetsTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorInsetsTest.kt index 722d334b6fb9..64fe6ca2eca1 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorInsetsTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorInsetsTest.kt @@ -10,11 +10,11 @@ import androidx.core.content.edit import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SdkSuppress import com.ichi2.anki.common.destinations.NoteEditorDestination +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.noteeditor.getNoteEditorFragment import com.ichi2.anki.noteeditor.toIntent import com.ichi2.testutils.dispatchInsets import com.ichi2.testutils.withSplitPaneUi -import com.ichi2.utils.dp import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.equalTo import org.junit.Test diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorScreenshotTest.kt index e6832022ea46..5c1b4340920c 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorScreenshotTest.kt @@ -12,11 +12,11 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat.Type.navigationBars import androidx.core.view.WindowInsetsCompat.Type.statusBars import com.ichi2.anki.common.destinations.NoteEditorDestination +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.noteeditor.toIntent import com.ichi2.testutils.dispatchInsets import com.ichi2.testutils.insetsOf import com.ichi2.testutils.simulateKeyboard -import com.ichi2.utils.dp import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.equalTo import org.junit.Test diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorTest.kt index 0c6a5cbe01b3..3ed2913cf0e0 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorTest.kt @@ -365,6 +365,299 @@ class NoteEditorTest : RobolectricTest() { assertThat("Deck ID in the new note should be the ID provided in the intent", newNoteEditor.deckId, equalTo(currentDid)) } + @Test + fun copyNoteCopiesNoteType() { + val originalNote = addBasicAndReversedNote() + + addBasicNote() + + val editor = + openNoteEditorWithArgs(NoteEditorDestination.EditSelection(listOf(originalNote.firstCard().id), DEFAULT).toBundle()) + val copyNoteBundle = getCopyNoteIntent(editor) + val newNoteEditor = openNoteEditorWithArgs(copyNoteBundle) + + assertThat( + "the note type of the copied note should match the original", + newNoteEditor.editorNote!!.notetype.name, + equalTo(col.notetypes.basicAndReversed.name), + ) + } + + @Test + fun copyNoteAllowsChangingNoteType() = + withRealSpinnerSelection { + val originalNote = addBasicNote("front", "back") + val editor = + openNoteEditorWithArgs(NoteEditorDestination.EditSelection(listOf(originalNote.firstCard().id), DEFAULT).toBundle()) + val copiedEditor = openNoteEditorWithArgs(getCopyNoteIntent(editor)) + advanceRobolectricLooper() + + val requestedType = col.notetypes.basicAndReversed + copiedEditor.setCurrentlySelectedNoteType(requestedType.id) + advanceRobolectricLooper() + + assertEquals( + requestedType.name, + copiedEditor.noteTypeSpinner!!.selectedItem.toString(), + "Changing the copied note's type should not reselect the original type", + ) + assertEquals(requestedType.id, copiedEditor.editorNote!!.noteTypeId) + assertEquals(listOf("front", "back"), copiedEditor.currentFieldStrings.toList()) + } + + @Test + fun copyNoteOverridesDeckNoteTypeAndPreservesAllFields() = + withRealSpinnerSelection { + val name = addStandardNoteType("Three Fields", arrayOf("Front", "Back", "Extra"), "{{Front}}", "{{Back}}{{Extra}}") + val originalNote = addNoteUsingNoteTypeName(name, "front value", "back value", "third value") + addBasicNote() + + // Selecting a note type in the add editor also stores it on the current deck. + val currentDeck = col.decks.current() + currentDeck.noteTypeId = col.notetypes.basic.id + col.decks.save(currentDeck) + + val editor = + openNoteEditorWithArgs(NoteEditorDestination.EditSelection(listOf(originalNote.firstCard().id), DEFAULT).toBundle()) + val copiedEditor = openNoteEditorWithArgs(getCopyNoteIntent(editor)) + advanceRobolectricLooper() + + assertEquals( + originalNote.noteTypeId, + copiedEditor.editorNote!!.noteTypeId, + "The copied note's type should take precedence over the deck's remembered type", + ) + assertEquals( + listOf("front value", "back value", "third value"), + copiedEditor.currentFieldStrings.toList(), + "All fields should be copied even when the deck's remembered note type has fewer fields", + ) + } + + @Test + fun copyNotePreservesChangedTypeAndFieldsAcrossRecreation() = + withRealSpinnerSelection { + ensureCollectionLoadIsSynchronous() + val originalNote = addBasicNote("front", "back") + val editor = + openNoteEditorWithArgs( + NoteEditorDestination.EditSelection(listOf(originalNote.firstCard().id), DEFAULT).toBundle(), + ) + val args = getCopyNoteIntent(editor) + val typeName = + addStandardNoteType("Recreation Three Fields", arrayOf("Front", "Back", "Extra"), "{{Front}}", "{{Back}}{{Extra}}") + val requestedType = col.notetypes.byName(typeName)!! + ActivityScenario.launch(NoteEditorDestination.PassArguments(args).toIntent()).use { scenario -> + scenario.onNoteEditor { copied -> + copied.setCurrentlySelectedNoteType(requestedType.id) + advanceRobolectricLooper() + assertEquals(requestedType.id, copied.editorNote!!.noteTypeId) + copied.setField(2, "extra after change") + } + scenario.recreate() + scenario.onNoteEditor { recreated -> + advanceRobolectricLooper() + assertEquals(requestedType.id, recreated.editorNote!!.noteTypeId, "Changed type survives recreation") + assertEquals(listOf("front", "back", "extra after change"), recreated.currentFieldStrings.toList()) + } + } + } + + @Test + fun copyNotePreservesHiddenFieldsAcrossTypeChanges() = + withRealSpinnerSelection { + val name = addStandardNoteType("Three Fields", arrayOf("Front", "Back", "Extra"), "{{Front}}", "{{Back}}{{Extra}}") + val original = addNoteUsingNoteTypeName(name, "front", "back", "extra") + val editor = + openNoteEditorWithArgs( + NoteEditorDestination.EditSelection(listOf(original.firstCard().id), DEFAULT).toBundle(), + ) + val copied = openNoteEditorWithArgs(getCopyNoteIntent(editor)) + advanceRobolectricLooper() + copied.setCurrentlySelectedNoteType(col.notetypes.basic.id) + advanceRobolectricLooper() + copied.setField(0, "edited front") + copied.setField(1, "") + copied.setCurrentlySelectedNoteType(original.noteTypeId) + advanceRobolectricLooper() + assertEquals(listOf("edited front", "", "extra"), copied.currentFieldStrings.toList()) + } + + @Test + fun copyNotePreservesHiddenFieldsAcrossRecreation() = + withRealSpinnerSelection { + ensureCollectionLoadIsSynchronous() + val name = addStandardNoteType("Three Fields", arrayOf("Front", "Back", "Extra"), "{{Front}}", "{{Back}}{{Extra}}") + val original = addNoteUsingNoteTypeName(name, "front", "back", "extra") + val editor = + openNoteEditorWithArgs( + NoteEditorDestination.EditSelection(listOf(original.firstCard().id), DEFAULT).toBundle(), + ) + val args = getCopyNoteIntent(editor) + ActivityScenario.launch(NoteEditorDestination.PassArguments(args).toIntent()).use { scenario -> + scenario.onNoteEditor { copied -> + copied.setCurrentlySelectedNoteType(col.notetypes.basic.id) + advanceRobolectricLooper() + } + scenario.recreate() + scenario.onNoteEditor { recreated -> + advanceRobolectricLooper() + recreated.setCurrentlySelectedNoteType(original.noteTypeId) + advanceRobolectricLooper() + assertEquals(listOf("front", "back", "extra"), recreated.currentFieldStrings.toList()) + } + } + } + + @Test + fun hiddenFieldsDoNotCarryOverAfterSaving() = + withRealSpinnerSelection { + runTest { + val name = addStandardNoteType("Three Fields", arrayOf("Front", "Back", "Extra"), "{{Front}}", "{{Back}}{{Extra}}") + val typeId = col.notetypes.byName(name)!!.id + val editor = openNoteEditorWithArgs(NoteEditorDestination.AddNote().toBundle()) + editor.setCurrentlySelectedNoteType(typeId) + advanceRobolectricLooper() + editor.setField(0, "front") + editor.setField(1, "back") + editor.setField(2, "must not leak") + editor.setCurrentlySelectedNoteType(col.notetypes.basic.id) + advanceRobolectricLooper() + val previousCardCount = cardCount + editor.saveNote() + advanceRobolectricLooper() + assertEquals(previousCardCount + 1, cardCount) + editor.setCurrentlySelectedNoteType(typeId) + advanceRobolectricLooper() + assertEquals(listOf("", "", ""), editor.currentFieldStrings.toList()) + } + } + + @Test + fun hiddenStickyBaselineSurvivesRoundTrip() = + withRealSpinnerSelection { + runTest { + val name = addStandardNoteType("Sticky Three Fields", arrayOf("Front", "Back", "Extra"), "{{Front}}", "{{Back}}{{Extra}}") + val type = col.notetypes.byName(name)!! + type.markFieldAsSticky(2) + val editor = openNoteEditorWithArgs(NoteEditorDestination.AddNote().toBundle()) + editor.setCurrentlySelectedNoteType(type.id) + advanceRobolectricLooper() + editor.setField(0, "front") + editor.setField(2, "sticky text") + editor.saveNote() + advanceRobolectricLooper() + assertEquals(listOf("", "", "sticky text"), editor.currentFieldStrings.toList()) + assertFalse(editor.hasUnsavedChanges()) + editor.setFieldValueFromUi(0, "temporary edit") + editor.setFieldValueFromUi(0, "") + assertFalse(editor.hasUnsavedChanges()) + editor.setCurrentlySelectedNoteType(col.notetypes.basic.id) + advanceRobolectricLooper() + editor.setCurrentlySelectedNoteType(type.id) + advanceRobolectricLooper() + assertEquals(listOf("", "", "sticky text"), editor.currentFieldStrings.toList()) + assertFalse(editor.hasUnsavedChanges(), "Only unchanged sticky content remains") + } + } + + @Test + fun hiddenDraftStillRequiresDiscardConfirmation() = + withRealSpinnerSelection { + val name = addStandardNoteType("Hidden Draft", arrayOf("Front", "Back", "Extra"), "{{Front}}", "{{Back}}{{Extra}}") + val typeId = col.notetypes.byName(name)!!.id + val editor = openNoteEditorWithArgs(NoteEditorDestination.AddNote().toBundle()) + editor.setCurrentlySelectedNoteType(typeId) + advanceRobolectricLooper() + editor.setField(2, "unsaved draft text") + assertTrue(editor.hasUnsavedChanges()) + editor.setCurrentlySelectedNoteType(col.notetypes.basic.id) + advanceRobolectricLooper() + assertEquals(listOf("", ""), editor.currentFieldStrings.toList()) + assertTrue(editor.hasUnsavedChanges(), "Hidden draft text must still trigger the discard confirmation") + } + + @Test + fun hiddenDraftRequiresConfirmationAfterRecreation() = assertHiddenFieldStateAfterRecreation(sticky = false) + + @Test + fun unchangedHiddenStickyFieldDoesNotRequireConfirmationAfterRecreation() = assertHiddenFieldStateAfterRecreation(sticky = true) + + private fun assertHiddenFieldStateAfterRecreation(sticky: Boolean) = + withRealSpinnerSelection { + runTest { + ensureCollectionLoadIsSynchronous() + val name = addStandardNoteType("Draft Three Fields", arrayOf("Front", "Back", "Extra"), "{{Front}}", "{{Back}}{{Extra}}") + val type = col.notetypes.byName(name)!! + if (sticky) type.markFieldAsSticky(2) + ActivityScenario.launch(NoteEditorDestination.AddNote().toIntent()).use { scenario -> + lateinit var editor: NoteEditorFragment + scenario.onNoteEditor { editor = it } + editor.setCurrentlySelectedNoteType(type.id) + advanceRobolectricLooper() + editor.setField(2, "third field") + if (sticky) { + editor.setField(0, "saved note") + editor.saveNote() + advanceRobolectricLooper() + assertEquals(listOf("", "", "third field"), editor.currentFieldStrings.toList()) + editor.setFieldValueFromUi(0, "reverted edit") + editor.setFieldValueFromUi(0, "") + } + editor.setCurrentlySelectedNoteType(col.notetypes.basic.id) + advanceRobolectricLooper() + assertEquals(!sticky, editor.hasUnsavedChanges()) + scenario.recreate() + scenario.onNoteEditor { restored -> + advanceRobolectricLooper() + assertEquals(!sticky, restored.hasUnsavedChanges(), "Hidden edits and their baseline survive recreation") + restored.setCurrentlySelectedNoteType(type.id) + advanceRobolectricLooper() + assertEquals(listOf("", "", "third field"), restored.currentFieldStrings.toList()) + assertEquals(!sticky, restored.hasUnsavedChanges()) + } + } + } + } + + @Test + fun copyNoteCopiesAllFieldsWhenNoteTypeChanges() { + val name = addStandardNoteType("Three Fields", arrayOf("Front", "Back", "Extra"), "{{Front}}", "{{Back}}{{Extra}}") + val originalNote = addNoteUsingNoteTypeName(name, "front value", "back value", "third value") + + // The last-added note type has fewer fields than the note being copied. + addBasicNote() + + val editor = + openNoteEditorWithArgs(NoteEditorDestination.EditSelection(listOf(originalNote.firstCard().id), DEFAULT).toBundle()) + val copiedEditor = openNoteEditorWithArgs(getCopyNoteIntent(editor)) + advanceRobolectricLooper() + + assertEquals(originalNote.noteTypeId, copiedEditor.editorNote!!.noteTypeId) + assertEquals( + listOf("front value", "back value", "third value"), + copiedEditor.currentFieldStrings.toList(), + "All copied field contents should survive the note type change", + ) + } + + @Test + fun copyNoteCopiesDeckIdWhenDecidingDeckByNoteType() { + col.config.setBool(ConfigKey.Bool.ADDING_DEFAULTS_TO_CURRENT_DECK, false) + val sourceDeckId = addDeck("Source deck") + // Moving the cards leaves the note type's remembered deck unchanged. + val originalNote = addBasicAndReversedNote().updateCards { did = sourceDeckId } + addBasicNote() + + val editor = + openNoteEditorWithArgs(NoteEditorDestination.EditSelection(listOf(originalNote.firstCard().id), DEFAULT).toBundle()) + assertEquals(sourceDeckId, editor.deckId) + val copiedEditor = openNoteEditorWithArgs(getCopyNoteIntent(editor)) + advanceRobolectricLooper() + + assertEquals(sourceDeckId, copiedEditor.deckId, "The copied deck should take precedence over the note type's remembered deck") + } + @Test fun stickyFieldsAreUnchangedAfterAdd() = runTest { @@ -1015,6 +1308,22 @@ class NoteEditorTest : RobolectricTest() { } } + private fun withRealSpinnerSelection(block: () -> Unit) { + // Robolectric's legacy spinner shadow invokes callbacks immediately, which can hide + // selection changes made by the callback. Android dispatches them during layout instead. + val key = "robolectric.useRealSpinnerSelection" + val previousValue = System.setProperty(key, "true") + try { + block() + } finally { + if (previousValue == null) { + System.clearProperty(key) + } else { + System.setProperty(key, previousValue) + } + } + } + private fun getCopyNoteIntent(editor: NoteEditorFragment): Bundle { val editorShadow = shadowOf(editor.requireActivity()) editor.copyNote() diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorToolbarLayoutTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorToolbarLayoutTest.kt new file mode 100644 index 000000000000..ab27ecf1fdd2 --- /dev/null +++ b/AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorToolbarLayoutTest.kt @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki + +import androidx.appcompat.widget.PopupMenu +import androidx.compose.ui.test.assertIsSelected +import androidx.compose.ui.test.junit4.v2.createEmptyComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.core.content.edit +import androidx.core.view.isVisible +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.ichi2.anki.common.destinations.NoteEditorDestination +import com.ichi2.anki.noteeditor.getNoteEditorFragment +import com.ichi2.anki.noteeditor.label +import com.ichi2.anki.noteeditor.presentation.ToolbarLayoutMode +import com.ichi2.anki.noteeditor.toIntent +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class NoteEditorToolbarLayoutTest : RobolectricTest() { + @get:Rule + val composeRule = createEmptyComposeRule() + + @Test + fun `chooser reads existing stack preference and applies scroll and hidden`() { + getPreferences().edit { + putBoolean("noteEditorShowToolbar", true) + putBoolean("noteEditorScrollToolbar", false) + } + val activity = startEditor() + openChooser(activity) + option(ToolbarLayoutMode.STACK).assertIsSelected() + option(ToolbarLayoutMode.SCROLL).performClick() + option(ToolbarLayoutMode.SCROLL).assertDoesNotExist() + assertTrue(getPreferences().getBoolean("noteEditorScrollToolbar", false)) + assertTrue( + activity + .getNoteEditorFragment() + .binding.editorToolbar.isVisible, + ) + openChooser(activity) + option(ToolbarLayoutMode.SCROLL).assertIsSelected() + option(ToolbarLayoutMode.HIDDEN).performClick() + option(ToolbarLayoutMode.HIDDEN).assertDoesNotExist() + assertFalse(getPreferences().getBoolean("noteEditorShowToolbar", true)) + assertFalse( + activity + .getNoteEditorFragment() + .binding.editorToolbar.isVisible, + ) + openChooser(activity) + option(ToolbarLayoutMode.HIDDEN).assertIsSelected() + option(ToolbarLayoutMode.STACK).performClick() + option(ToolbarLayoutMode.STACK).assertDoesNotExist() + assertTrue(getPreferences().getBoolean("noteEditorShowToolbar", false)) + assertFalse(getPreferences().getBoolean("noteEditorScrollToolbar", true)) + assertTrue( + activity + .getNoteEditorFragment() + .binding.editorToolbar.isVisible, + ) + } + + @Test + fun `chooser survives recreation and updates the recreated toolbar`() { + getPreferences().edit { + putBoolean("noteEditorShowToolbar", true) + putBoolean("noteEditorScrollToolbar", false) + } + val controller = + startActivityControllerNormallyOpenCollectionWithIntent( + NoteEditorActivity::class.java, + NoteEditorDestination.AddNote().toIntent(targetContext), + ) + advanceRobolectricLooper() + openChooser(controller.get()) + option(ToolbarLayoutMode.STACK).assertIsSelected() + + controller.recreate() + advanceRobolectricLooper() + + option(ToolbarLayoutMode.STACK).assertIsSelected() + option(ToolbarLayoutMode.HIDDEN).performClick() + option(ToolbarLayoutMode.HIDDEN).assertDoesNotExist() + assertFalse( + controller + .get() + .getNoteEditorFragment() + .binding.editorToolbar.isVisible, + ) + } + + private fun option(layout: ToolbarLayoutMode) = composeRule.onNodeWithText(targetContext.getString(layout.label())) + + private fun startEditor(): NoteEditorActivity = + startActivityNormallyOpenCollectionWithIntent( + NoteEditorActivity::class.java, + NoteEditorDestination.AddNote().toIntent(targetContext), + ).also { advanceRobolectricLooper() } + + private fun openChooser(activity: NoteEditorActivity) { + composeRule.runOnIdle { + val fragment = activity.getNoteEditorFragment() + val menu = PopupMenu(activity, fragment.requireView()).menu + activity.menuInflater.inflate(R.menu.note_editor, menu) + assertTrue(fragment.onMenuItemSelected(menu.findItem(R.id.action_toolbar_layout))) + } + } +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/NoteTypeFieldEditorTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/NoteTypeFieldEditorTest.kt index d68100985752..f32f6e1069dd 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/NoteTypeFieldEditorTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/NoteTypeFieldEditorTest.kt @@ -16,6 +16,7 @@ import org.hamcrest.Matchers import org.junit.Test import org.junit.runner.RunWith import org.robolectric.ParameterizedRobolectricTestRunner +import com.ichi2.anki.common.android.R as CommonR @RunWith(ParameterizedRobolectricTestRunner::class) class NoteTypeFieldEditorTest( @@ -88,7 +89,7 @@ class NoteTypeFieldEditorTest( fieldNameInput: EditText, fieldOperationType: FieldOperationType, ): AlertDialog = - AlertDialog.Builder(ContextThemeWrapper(targetContext, R.style.Theme_Light)).show { + AlertDialog.Builder(ContextThemeWrapper(targetContext, CommonR.style.Theme_Light)).show { positiveButton(text = "") { try { val noteTypeName = "Basic" diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ReadTextTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ReadTextTest.kt index b3796277c8fe..b273d8febc98 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ReadTextTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ReadTextTest.kt @@ -2,8 +2,12 @@ package com.ichi2.anki +import android.content.ComponentName import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.speech.tts.TextToSpeech +import androidx.appcompat.app.AlertDialog import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -11,6 +15,7 @@ import com.ichi2.anki.ReadText.closeForTests import com.ichi2.anki.ReadText.initializeTts import com.ichi2.anki.ReadText.releaseTts import com.ichi2.anki.ReadText.textToSpeech +import com.ichi2.anki.dialogs.utils.title import com.ichi2.anki.reviewer.CardSide import io.mockk.coEvery import io.mockk.coVerify @@ -26,13 +31,18 @@ import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.Mockito.`when` +import org.robolectric.Robolectric.buildActivity import org.robolectric.Shadows.shadowOf import org.robolectric.annotation.Config import org.robolectric.annotation.Implementation import org.robolectric.annotation.Implements +import org.robolectric.shadows.ShadowDialog import org.robolectric.shadows.ShadowTextToSpeech +import org.robolectric.shadows.ShadowToast import java.util.Locale +import kotlin.test.assertEquals import kotlin.test.assertFalse +import kotlin.test.assertNull @RunWith(AndroidJUnit4::class) class ReadTextTest : RobolectricTest() { @@ -92,6 +102,33 @@ class ReadTextTest : RobolectricTest() { assertThat(isTextToSpeechShutdown, equalTo(false)) } + @Test + fun `legacy TTS initialization failure explains missing engines`() = + withTtsActivity { activity -> + initializeTextToSpeech(activity) + shadowOf(textToSpeech).onInitListener.onInit(TextToSpeech.ERROR) + val dialog = ShadowDialog.getLatestDialog() as AlertDialog + assertEquals("No text-to-speech engine installed", dialog.title) + } + + @Test + fun `legacy TTS initialization failure with an installed engine shows a toast instead of installation guidance`() = + withTtsActivity { activity -> + shadowOf(activity.packageManager).apply { + val engine = ComponentName("test.tts", "TestTtsService") + addServiceIfNotPresent(engine) + addIntentFilterForService( + engine, + IntentFilter(TextToSpeech.Engine.INTENT_ACTION_TTS_SERVICE).apply { addCategory(Intent.CATEGORY_DEFAULT) }, + ) + } + initializeTextToSpeech(activity) + shadowOf(textToSpeech).onInitListener.onInit(TextToSpeech.ERROR) + + assertEquals(activity.getString(CommonString.no_tts_available_message), ShadowToast.getTextOfLatestToast()) + assertNull(ShadowDialog.getLatestDialog()) + } + @Test @Config(shadows = [NoLanguageQueryTextToSpeech::class]) fun `reviewer TTS waits for cached languages without blocking the callback`() = @@ -195,6 +232,17 @@ class ReadTextTest : RobolectricTest() { private val isTextToSpeechShutdown: Boolean get() = shadowOf(textToSpeech).isShutdown + private fun withTtsActivity(block: (AnkiActivity) -> Unit) { + buildActivity(AnkiActivity::class.java).use { controller -> + val activity = controller.setup().get() + try { + block(activity) + } finally { + releaseTts(activity) + } + } + } + private fun initializeTextToSpeech(context: Context) { initializeTts(context, mock(AbstractFlashcardViewer.ReadTextListener::class.java)) } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ReviewCompletionTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewCompletionTest.kt new file mode 100644 index 000000000000..6507475c38f2 --- /dev/null +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewCompletionTest.kt @@ -0,0 +1,169 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package com.ichi2.anki + +import android.content.Context +import android.content.Intent +import android.view.KeyEvent +import androidx.core.content.edit +import anki.scheduler.CardAnswer.Rating +import com.ichi2.anki.AbstractFlashcardViewer.Companion.RESULT_NO_MORE_CARDS +import com.ichi2.anki.CollectionManager.TR +import com.ichi2.anki.NavigationDrawerActivity.Companion.EXTRA_STARTED_WITH_SHORTCUT +import com.ichi2.anki.libanki.Consts.DEFAULT_DECK_ID +import com.ichi2.anki.pages.CongratsPage +import com.ichi2.testutils.ext.snackbarText +import org.json.JSONArray +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.ParameterizedRobolectricTestRunner +import org.robolectric.Shadows.shadowOf +import org.robolectric.shadows.ShadowToast +import kotlin.test.assertEquals +import kotlin.test.assertNotNull +import kotlin.test.assertNull +import kotlin.test.assertTrue + +@RunWith(ParameterizedRobolectricTestRunner::class) +class ReviewCompletionTest : RobolectricTest() { + @ParameterizedRobolectricTestRunner.Parameter(0) + @JvmField + var newCongratsScreen = false + + @ParameterizedRobolectricTestRunner.Parameter(1) + @JvmField + var fromShortcut = false + + override fun getCollectionStorageMode() = CollectionStorageMode.IN_MEMORY_WITH_MEDIA + + @Before + fun configureCompletionScreen() { + getPreferences().edit { putBoolean("new_congrats_screen", newCongratsScreen) } + ShadowToast.reset() + } + + @Test + fun `finished parent with cards only in its child still shows completion`() { + val child = addDeck("Parent::Child") + col.setDeck(listOf(addBasicNote().firstCard().id), child) + col.decks.select(col.decks.id("Parent")) + + completeReview(expectEmpty = false) { + col.sched.answerCard(assertNotNull(col.sched.card), Rating.EASY) + assertEquals(0, col.sched.totalCount()) + assertEquals(1, col.decks.cardCount(child, includeSubdecks = true)) + } + } + + @Test + fun `filtered deck emptied by the final review still shows completion`() { + addBasicNote() + val filtered = addDynamicDeck("Filtered", "") + + completeReview(expectEmpty = false) { + col.sched.answerCard(assertNotNull(col.sched.card), Rating.EASY) + assertEquals(0, col.decks.cardCount(filtered, includeSubdecks = true)) + } + } + + @Test + fun `learning later still shows completion with the next available time`() { + col.config.set("collapseTime", 0) + val config = col.decks.configDictForDeckId(DEFAULT_DECK_ID) + config.new.delays = JSONArray(listOf(1)) + col.decks.save(config) + addBasicNote() + + completeReview( + expectEmpty = false, + expectedMessage = { + it.getString( + CommonString.studyoptions_congrats_next_due_in, + TR.schedulingNextLearnDue("minutes", 1), + ) + }, + ) { + col.sched.answerCard(assertNotNull(col.sched.card), Rating.AGAIN) + assertNull(col.sched.card) + } + } + + private fun completeReview( + expectEmpty: Boolean, + expectedMessage: (Context) -> String = { + it.getString(if (expectEmpty) CommonString.empty_deck else CommonString.studyoptions_congrats_finished) + }, + finishCards: () -> Unit, + ) { + if (fromShortcut) { + runTest { + val reviewer = + startActivityNormallyOpenCollectionWithIntent( + Reviewer::class.java, + Intent().putExtra(EXTRA_STARTED_WITH_SHORTCUT, true), + ) + advanceRobolectricLooper() + assertNotNull(reviewer.currentCardId) + finishCards() + val selected = col.decks.selected() + val undoStatus = col.undoStatus() + + reviewer.updateCardAndRedraw() + advanceRobolectricLooper() + + assertTrue(reviewer.isFinishing) + assertEquals(RESULT_NO_MORE_CARDS, shadowOf(reviewer).resultCode) + if (newCongratsScreen && !expectEmpty) { + assertCongratsIntent(shadowOf(reviewer).nextStartedActivity) + } else { + assertNull(shadowOf(reviewer).nextStartedActivity) + assertEquals(expectedMessage(reviewer), ShadowToast.getTextOfLatestToast()) + } + assertEquals(selected, col.decks.selected()) + assertEquals(undoStatus, col.undoStatus()) + } + } else { + deckPicker { + advanceRobolectricLooper() + val shadow = shadowOf(this) + shadow.clearNextStartedActivities() + assertTrue(onKeyUp(KeyEvent.KEYCODE_S, KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_S))) + advanceRobolectricLooperUntil { shadow.peekNextStartedActivity() != null } + val review = assertNotNull(shadow.nextStartedActivityForResult) + assertEquals(Reviewer::class.java.name, review.intent.component?.className) + shadow.clearNextStartedActivities() + finishCards() + val selected = col.decks.selected() + val undoStatus = col.undoStatus() + + activityResultRegistry.dispatchResult(review.requestCode, RESULT_NO_MORE_CARDS, null) + + if (newCongratsScreen && !expectEmpty) { + advanceRobolectricLooperUntil { shadow.peekNextStartedActivity() != null } + assertCongratsIntent(shadow.nextStartedActivity) + } else { + advanceRobolectricLooperUntil { snackbarText == expectedMessage(this) } + assertNull(shadow.nextStartedActivity) + } + assertEquals(selected, col.decks.selected()) + assertEquals(undoStatus, col.undoStatus()) + } + } + } + + private fun assertCongratsIntent(intent: Intent?) { + assertEquals( + CongratsPage::class.java.name, + assertNotNull(intent).getStringExtra(SingleFragmentActivity.EXTRA_FRAGMENT_NAME), + ) + } + + companion object { + @ParameterizedRobolectricTestRunner.Parameters(name = "new screen = {0}, shortcut = {1}") + @JvmStatic + fun configurations() = + listOf(false, true).flatMap { newScreen -> + listOf(false, true).map { shortcut -> arrayOf(newScreen, shortcut) } + } + } +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerInsetsTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerInsetsTest.kt index 62a55b5b9ec4..54260e47558b 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerInsetsTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerInsetsTest.kt @@ -16,13 +16,14 @@ import androidx.core.view.marginBottom import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SdkSuppress import com.ichi2.anki.common.preferences.sharedPrefs +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.reviewer.FullScreenMode import com.ichi2.testutils.dispatchInsets -import com.ichi2.utils.dp import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.equalTo import org.junit.Test import org.junit.runner.RunWith +import com.ichi2.anki.common.android.R as CommonR /** * Edge-to-edge inset handling for the legacy [Reviewer]. @@ -72,7 +73,7 @@ class ReviewerInsetsTest : RobolectricTest() { equalTo(48.dp.toPx(targetContext)), ) - val sideMargin = targetContext.resources.getDimensionPixelSize(R.dimen.side_margin) + val sideMargin = targetContext.resources.getDimensionPixelSize(CommonR.dimen.side_margin) assertThat( "the counts bar keeps its side margin past the cutout", reviewer.countsBar.paddingLeft, diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerKeyboardInputTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerKeyboardInputTest.kt index 8db9d895d5c1..8cb943e15935 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerKeyboardInputTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerKeyboardInputTest.kt @@ -22,7 +22,7 @@ import com.ichi2.anki.AnkiDroidApp.Companion.sharedPrefs import com.ichi2.anki.cardviewer.Gesture import com.ichi2.anki.cardviewer.ViewerCommand import com.ichi2.anki.libanki.Card -import com.ichi2.anki.reviewer.Binding.Companion.keyCode +import com.ichi2.anki.reviewer.Binding.KeyCode import com.ichi2.anki.reviewer.Binding.ModifierKeys import com.ichi2.anki.reviewer.BindingMap import com.ichi2.anki.reviewer.CardSide @@ -143,7 +143,7 @@ class ReviewerKeyboardInputTest : RobolectricTest() { fun pressingZShouldUndoIfAvailable() { ViewerCommand.UNDO.addBinding( sharedPrefs(), - ReviewerBinding(keyCode(KEYCODE_Z, ModifierKeys.none()), CardSide.BOTH), + ReviewerBinding(KeyCode(KEYCODE_Z, ModifierKeys.none()), CardSide.BOTH), ) val underTest = KeyboardInputTestReviewer.displayingAnswer().withUndoAvailable(true) underTest.handleAndroidKeyPress(KEYCODE_Z) @@ -154,7 +154,7 @@ class ReviewerKeyboardInputTest : RobolectricTest() { fun pressingZShouldNotUndoIfNotAvailable() { ViewerCommand.UNDO.addBinding( sharedPrefs(), - ReviewerBinding(keyCode(KEYCODE_Z, ModifierKeys.none()), CardSide.BOTH), + ReviewerBinding(KeyCode(KEYCODE_Z, ModifierKeys.none()), CardSide.BOTH), ) val underTest = KeyboardInputTestReviewer.displayingAnswer().withUndoAvailable(false) underTest.handleUnicodeKeyPress('z') diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerNoParamTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerNoParamTest.kt index 71f6b945e441..b4c1e7f74c1b 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerNoParamTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerNoParamTest.kt @@ -3,18 +3,22 @@ package com.ichi2.anki import android.content.Intent +import android.content.SharedPreferences import android.graphics.Color import androidx.annotation.CheckResult import androidx.core.content.edit +import androidx.preference.PreferenceManager import androidx.test.ext.junit.runners.AndroidJUnit4 import anki.scheduler.CardAnswer.Rating +import com.github.ivanshafran.sharedpreferencesmock.SPMockBuilder +import com.ichi2.anki.AnkiDroidApp.Companion.sharedPrefs import com.ichi2.anki.cardviewer.Gesture import com.ichi2.anki.cardviewer.Gesture.SWIPE_DOWN import com.ichi2.anki.cardviewer.Gesture.SWIPE_RIGHT import com.ichi2.anki.cardviewer.Gesture.SWIPE_UP import com.ichi2.anki.cardviewer.GestureProcessor import com.ichi2.anki.cardviewer.ViewerCommand -import com.ichi2.anki.common.preferences.sharedPrefs +import com.ichi2.anki.common.preferences.SharedPreferencesTestHook import com.ichi2.anki.libanki.Consts import com.ichi2.anki.libanki.DeckId import com.ichi2.anki.model.WhiteboardPenColor @@ -168,81 +172,87 @@ class ReviewerNoParamTest : RobolectricTest() { } @Test - @Flaky(OS.ALL, "hasDrawerSwipeConflicts was false") - fun defaultDrawerConflictIsTrueIfGesturesEnabled() { - enableGestureSetting() - enableGesture(SWIPE_RIGHT) - val reviewer = startReviewerFullScreen() - - assertThat(reviewer.hasDrawerSwipeConflicts(), equalTo(true)) - } + fun defaultDrawerConflictIsTrueIfGesturesEnabled() = + withIsolatedGesturePreferences { + enableGestureSetting() + enableGesture(SWIPE_RIGHT) + val reviewer = startReviewerFullScreen() + advanceRobolectricLooper() + assertThat(reviewer.hasDrawerSwipeConflicts(), equalTo(true)) + } @Test - fun noDrawerConflictsBeforeOnCreate() { - enableGestureSetting() - val controller = Robolectric.buildActivity(Reviewer::class.java, Intent()) - saveControllerForCleanup(controller) - try { - assertThat("no conflicts before onCreate", controller.get().hasDrawerSwipeConflicts(), equalTo(false)) - } finally { + fun noDrawerConflictsBeforeOnCreate() = + withIsolatedGesturePreferences { + enableGestureSetting() + val controller = Robolectric.buildActivity(Reviewer::class.java, Intent()) + saveControllerForCleanup(controller) try { - enableGesture(SWIPE_UP) - } catch (e: Exception) { - // ignore + assertThat("no conflicts before onCreate", controller.get().hasDrawerSwipeConflicts(), equalTo(false)) + } finally { + try { + enableGesture(SWIPE_UP) + } catch (e: Exception) { + // ignore + } } } - } @Test - fun noDrawerConflictsIfGesturesDisabled() { - disableGestureSetting() - enableGesture(SWIPE_UP) - val reviewer = startReviewerFullScreen() - assertThat("gestures should be disabled", gestureProcessor.isEnabled, equalTo(false)) - assertThat(reviewer.hasDrawerSwipeConflicts(), equalTo(false)) - } + fun noDrawerConflictsIfGesturesDisabled() = + withIsolatedGesturePreferences { + disableGestureSetting() + enableGesture(SWIPE_UP) + val reviewer = startReviewerFullScreen() + assertThat("gestures should be disabled", gestureProcessor.isEnabled, equalTo(false)) + assertThat(reviewer.hasDrawerSwipeConflicts(), equalTo(false)) + } @Test - fun noDrawerConflictsIfNoGestures() { - enableGestureSetting() - disableConflictGestures() - val reviewer = startReviewerFullScreen() - assertThat("gestures should be enabled", gestureProcessor.isEnabled, equalTo(true)) - assertThat("no conflicts, so no conflicts detected", reviewer.hasDrawerSwipeConflicts(), equalTo(false)) - } + fun noDrawerConflictsIfNoGestures() = + withIsolatedGesturePreferences { + enableGestureSetting() + disableConflictGestures() + val reviewer = startReviewerFullScreen() + assertThat("gestures should be enabled", gestureProcessor.isEnabled, equalTo(true)) + assertThat("no conflicts, so no conflicts detected", reviewer.hasDrawerSwipeConflicts(), equalTo(false)) + } @Test - @Flaky(os = OS.ALL, "final assertion is false") - fun drawerConflictsIfUp() { - enableGestureSetting() - disableConflictGestures() - enableGesture(SWIPE_UP) - val reviewer = startReviewerFullScreen() - assertThat("gestures should be enabled", gestureProcessor.isEnabled, equalTo(true)) - assertThat(reviewer.hasDrawerSwipeConflicts(), equalTo(true)) - } + fun drawerConflictsIfUp() = + withIsolatedGesturePreferences { + enableGestureSetting() + disableConflictGestures() + enableGesture(SWIPE_UP) + val reviewer = startReviewerFullScreen() + assertThat("gestures should be enabled", gestureProcessor.isEnabled, equalTo(true)) + advanceRobolectricLooper() + assertThat(reviewer.hasDrawerSwipeConflicts(), equalTo(true)) + } @Test - @Flaky(os = OS.ALL, "final assertion is false") - fun drawerConflictsIfDown() { - enableGestureSetting() - disableConflictGestures() - enableGesture(SWIPE_DOWN) - val reviewer = startReviewerFullScreen() - assertThat("gestures should be enabled", gestureProcessor.isEnabled, equalTo(true)) - assertThat(reviewer.hasDrawerSwipeConflicts(), equalTo(true)) - } + fun drawerConflictsIfDown() = + withIsolatedGesturePreferences { + enableGestureSetting() + disableConflictGestures() + enableGesture(SWIPE_DOWN) + val reviewer = startReviewerFullScreen() + assertThat("gestures should be enabled", gestureProcessor.isEnabled, equalTo(true)) + advanceRobolectricLooper() + assertThat(reviewer.hasDrawerSwipeConflicts(), equalTo(true)) + } @Test - @Flaky(os = OS.ALL, "final assertion is false") - fun drawerConflictsIfRight() { - enableGestureSetting() - disableConflictGestures() - enableGesture(SWIPE_RIGHT) - val reviewer = startReviewerFullScreen() - assertThat("gestures should be enabled", gestureProcessor.isEnabled, equalTo(true)) - assertThat(reviewer.hasDrawerSwipeConflicts(), equalTo(true)) - } + fun drawerConflictsIfRight() = + withIsolatedGesturePreferences { + enableGestureSetting() + disableConflictGestures() + enableGesture(SWIPE_RIGHT) + val reviewer = startReviewerFullScreen() + assertThat("gestures should be enabled", gestureProcessor.isEnabled, equalTo(true)) + advanceRobolectricLooper() + assertThat(reviewer.hasDrawerSwipeConflicts(), equalTo(true)) + } @Test fun normalReviewerDoesNotFitSystemWindows() { @@ -260,7 +270,7 @@ class ReviewerNoParamTest : RobolectricTest() { private val gestureProcessor: GestureProcessor get() { val gestureProcessor = GestureProcessor(null) - gestureProcessor.init(targetContext.sharedPrefs()) + gestureProcessor.init(sharedPrefs()) return gestureProcessor } @@ -277,13 +287,13 @@ class ReviewerNoParamTest : RobolectricTest() { } private fun setGestureSetting(value: Boolean) { - targetContext.sharedPrefs().edit { + sharedPrefs().edit { putBoolean(GestureProcessor.PREF_KEY, value) } } private fun disableGestures(vararg gestures: Gesture) { - val prefs = targetContext.sharedPrefs() + val prefs = sharedPrefs() for (command in ViewerCommand.entries) { for (mappableBinding in ReviewerBinding.fromPreference(prefs, command)) { val gestureBinding = mappableBinding.binding as? Binding.GestureInput? ?: continue @@ -300,16 +310,56 @@ class ReviewerNoParamTest : RobolectricTest() { /** Enables a gesture (without changing the overall setting of whether gestures are allowed) */ private fun enableGesture(gesture: Gesture) { - val prefs = targetContext.sharedPrefs() + val prefs = sharedPrefs() ViewerCommand.ANSWER_AGAIN.addBinding( prefs, ReviewerBinding.fromGesture(gesture), ) } + private fun withIsolatedGesturePreferences(block: () -> Unit) { + val previousOverride = AnkiDroidApp.sharedPreferencesTestingOverride + val previousHook = SharedPreferencesTestHook.override + val isolated = cloneDefaultSharedPreferences() + AnkiDroidApp.sharedPreferencesTestingOverride = isolated + SharedPreferencesTestHook.override = { sharedPrefs() } + try { + block() + } finally { + SharedPreferencesTestHook.override = previousHook + AnkiDroidApp.sharedPreferencesTestingOverride = previousOverride + } + } + + private fun cloneDefaultSharedPreferences(): SharedPreferences { + val previousHook = SharedPreferencesTestHook.override + SharedPreferencesTestHook.override = null + try { + val source = PreferenceManager.getDefaultSharedPreferences(targetContext) + val target = SPMockBuilder().createSharedPreferences() + target.edit { + for ((key, value) in source.all) { + when (value) { + is String -> putString(key, value) + is Int -> putInt(key, value) + is Long -> putLong(key, value) + is Float -> putFloat(key, value) + is Boolean -> putBoolean(key, value) + is Set<*> -> putStringSet(key, value.filterIsInstance().toSet()) + else -> throw IllegalArgumentException("Unsupported preference type for $key") + } + } + } + return target + } finally { + SharedPreferencesTestHook.override = previousHook + } + } + private fun startReviewerFullScreen(): ReviewerExt { - val sharedPrefs = targetContext.sharedPrefs() - setPreference(sharedPrefs, FullScreenMode.BUTTONS_ONLY) + CollectionManager.getColUnsafe() + val preferences = sharedPrefs() + setPreference(preferences, FullScreenMode.BUTTONS_ONLY) return ReviewerTest.startReviewer(this, ReviewerExt::class.java) } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerScreenshotTest.kt index 5a3d544d6a95..b6ea2e5a6383 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerScreenshotTest.kt @@ -16,9 +16,9 @@ import androidx.core.view.WindowInsetsCompat.Type.displayCutout import androidx.core.view.WindowInsetsCompat.Type.navigationBars import androidx.core.view.WindowInsetsCompat.Type.statusBars import com.ichi2.anki.common.preferences.sharedPrefs +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.reviewer.FullScreenMode import com.ichi2.testutils.insetsOf -import com.ichi2.utils.dp import org.junit.Test import org.robolectric.RuntimeEnvironment diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerTest.kt index 0c8d226fce43..4e70ff531bc9 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerTest.kt @@ -30,6 +30,7 @@ import com.ichi2.anki.cardviewer.ViewerCommand.ANSWER_EASY import com.ichi2.anki.cardviewer.ViewerCommand.MARK import com.ichi2.anki.cardviewer.ViewerCommand.SHOW_ANSWER import com.ichi2.anki.common.preferences.sharedPrefs +import com.ichi2.anki.common.storage.CollectionHelper.getMediaDirectory import com.ichi2.anki.common.time.MockTime import com.ichi2.anki.common.time.TimeManager import com.ichi2.anki.common.ui.TransitionDirection @@ -48,12 +49,14 @@ import com.ichi2.anki.model.CardStateFilter import com.ichi2.anki.observability.undoableOp import com.ichi2.anki.preferences.PreferenceTestUtils import com.ichi2.anki.reviewer.ActionButtonStatus +import com.ichi2.anki.snackbar.SnackbarBuilder import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.testutils.RecordingInputMethodManager import com.ichi2.testutils.common.Flaky import com.ichi2.testutils.common.OS import com.ichi2.testutils.ext.addNoSuggestNote import com.ichi2.testutils.ext.createInputConnection +import com.ichi2.testutils.ext.text import com.ichi2.testutils.withBooleanPreference import junit.framework.TestCase.assertEquals import junit.framework.TestCase.assertFalse @@ -73,7 +76,12 @@ import org.robolectric.RuntimeEnvironment import org.robolectric.Shadows import org.robolectric.annotation.Config import org.robolectric.shadow.api.Shadow +import org.robolectric.shadows.ShadowMediaPlayer +import org.robolectric.shadows.util.DataSource import timber.log.Timber +import java.io.File +import java.io.IOException +import java.util.concurrent.ConcurrentLinkedQueue import kotlin.test.assertContains import kotlin.test.assertNotEquals import kotlin.test.junit5.JUnit5Asserter.assertNotNull @@ -261,15 +269,31 @@ class ReviewerTest : RobolectricTest() { } @Test - fun noErrorShouldOccurIfSoundFileNotPresent() { - addBasicNote("[[sound:not_on_file_system.mp3]]", "World") + fun `missing sound is reported without interrupting review`() { + val filename = "not_on_file_system.mp3" + addBasicNote("[sound:$filename]", "World") .firstCard() .moveToReviewQueue() - val reviewer = startReviewer() + val reviewer = startReviewer(ReviewerWithSnackbarRecording::class.java) + val mediaDirectory = getMediaDirectory(reviewer) + assertFalse(File(mediaDirectory, filename).exists()) + // The default media shadow accepts every file, including missing ones. + ShadowMediaPlayer.addException( + DataSource.toDataSource(AbstractFlashcardViewer.getMediaBaseUrl(mediaDirectory) + filename), + IOException("Missing sound file"), + ) reviewer.displayCardQuestion() - assertThat("If the sound file with given name is not present, then no error occurs", true) + // Playback runs on Dispatchers.IO; draining the main looper alone can miss it. + advanceRobolectricLooperUntil { reviewer.snackbarMessages.isNotEmpty() && !reviewer.cardMediaPlayer.isPlaying } + assertThat( + reviewer.snackbarMessages.toList(), + equalTo(listOf(reviewer.getString(CommonString.card_viewer_could_not_find_image, filename))), + ) + reviewer.displayCardAnswer() + assertTrue(reviewer.isDisplayingAnswer) + assertFalse(reviewer.isFinishing) } @Test @@ -628,6 +652,15 @@ class ReviewerTest : RobolectricTest() { private val defaultDeckConfig get() = col.decks.configDictForDeckId(Consts.DEFAULT_DECK_ID) + private class ReviewerWithSnackbarRecording : Reviewer() { + val snackbarMessages = ConcurrentLinkedQueue() + + override val baseSnackbarBuilder: SnackbarBuilder = { + super.baseSnackbarBuilder.invoke(this) + text?.let(snackbarMessages::add) + } + } + private class ReviewerForMenuItems : Reviewer() { var menu: Menu? = null private set diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/RobolectricTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/RobolectricTest.kt index 0a7d9c6c3d6f..cf033b4cd681 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/RobolectricTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/RobolectricTest.kt @@ -26,7 +26,9 @@ import com.ichi2.anki.CollectionManager.CollectionOpenFailure import com.ichi2.anki.RobolectricTest.CollectionStorageMode.IN_MEMORY_NO_FOLDERS import com.ichi2.anki.RobolectricTest.CollectionStorageMode.IN_MEMORY_WITH_MEDIA import com.ichi2.anki.RobolectricTest.CollectionStorageMode.ON_DISK +import com.ichi2.anki.common.android.AdaptionUtil import com.ichi2.anki.common.annotations.UseContextParameter +import com.ichi2.anki.common.preferences.SharedPreferencesTestHook import com.ichi2.anki.common.preferences.sharedPrefs import com.ichi2.anki.common.time.MockTime import com.ichi2.anki.common.time.TimeManager @@ -81,8 +83,12 @@ import kotlin.time.Duration.Companion.seconds import kotlin.time.TimeSource import com.ichi2.testutils.Robolectric as RobolectricActivities -open class RobolectricTest : - AnkiTest, +/** + * @param loadBackend Disable for tests which do not use the native backend. + */ +open class RobolectricTest( + private val loadBackend: Boolean = true, +) : AnkiTest, AndroidTest { @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") private fun Any.wait(timeMs: Long) = (this as Object).wait(timeMs) @@ -168,7 +174,7 @@ open class RobolectricTest : CollectionManager.closeCollectionBlocking() - maybeSetupBackend() + if (loadBackend) setupBackend() // Reset static variable for custom tabs failure. CustomTabActivityHelper.resetFailed() @@ -181,6 +187,8 @@ open class RobolectricTest : // https://github.com/ankidroid/Anki-Android/pull/19004#discussion_r2739833965 grantPermissions(Manifest.permission.INTERNET) + + AdaptionUtil.resetWebBrowserAvailabilityCacheForTests() } @After @@ -199,6 +207,10 @@ open class RobolectricTest : } controllersForCleanup.clear() + if (SharedPreferencesTestHook.override != null) { + Timber.w("SharedPreferencesTestHook was not reset! Setting it to null.") + SharedPreferencesTestHook.override = null + } if (AnkiDroidApp.sharedPreferencesTestingOverride != null) { Timber.w("AnkiDroidApp SharedPrefs test override was not reset to null! Setting it to null.") AnkiDroidApp.sharedPreferencesTestingOverride = null @@ -465,16 +477,7 @@ open class RobolectricTest : undoableOp { col.updateNote(note) } } - private fun maybeSetupBackend() { - try { - targetContext - } catch (exc: IllegalStateException) { - // We must make sure not to load the backend library into a test running outside - // the Robolectric classloader, or subsequent Robolectric tests that run in this - // process will be unable to make calls into the backend. - println("not annotated with junit, not setting up backend") - return - } + private fun setupBackend() { try { RustBackendLoader.ensureSetup() } catch (e: UnsatisfiedLinkError) { diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ScreenshotTest.kt index f0dd6c3072fb..9df05258c31e 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ScreenshotTest.kt @@ -2,17 +2,23 @@ package com.ichi2.anki +import android.os.Build import android.view.View import android.view.WindowManager import android.widget.EditText import androidx.core.content.getSystemService import androidx.core.view.allViews import androidx.core.view.drawToBitmap +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.matcher.ViewMatchers.isRoot import com.github.takahirom.roborazzi.ExperimentalRoborazziApi import com.github.takahirom.roborazzi.RobolectricDeviceQualifiers +import com.github.takahirom.roborazzi.RoborazziATFAccessibilityCheckOptions +import com.github.takahirom.roborazzi.RoborazziATFAccessibilityChecker import com.github.takahirom.roborazzi.RoborazziOptions import com.github.takahirom.roborazzi.captureRoboImage import com.github.takahirom.roborazzi.captureScreenRoboImage +import com.github.takahirom.roborazzi.checkRoboAccessibility import com.github.takahirom.roborazzi.provideRoborazziContext import com.google.testing.junit.testparameterinjector.TestParameter import com.google.testing.junit.testparameterinjector.TestParameterValuesProvider @@ -31,8 +37,6 @@ import org.robolectric.shadow.api.Shadow import org.robolectric.shadows.ShadowWindowManagerImpl import java.io.File -interface ScreenshotTestCategory - /** * Base class for [roborazzi](https://github.com/takahirom/roborazzi) screenshot tests */ @@ -147,13 +151,39 @@ abstract class ScreenshotTest : RobolectricTest() { * Captures a screenshot to `build/outputs/roborazzi//.png`. * * Writes to /diffs/ if there is an issue. + * Add `-PaccessibilityScan` to scan the live UI and log accessibility findings. */ @OptIn(ExperimentalRoborazziApi::class) protected fun captureScreen(name: String) = capture(name) { filePath, options -> captureScreenRoboImage(filePath = filePath, roborazziOptions = options) + scanAccessibilityIfEnabled(filePath, options) } + /** + * Scan the live download UI across all themes, logging findings without failing on them: + * ```sh + * ./gradlew :AnkiDroid:testPlayDebugUnitTest -Pscreenshot -PaccessibilityScan -Ptheme=all \ + * --tests '*SharedDecksScreenshotTest.downloadFragment*' + * ``` + */ + @OptIn(ExperimentalRoborazziApi::class) + private fun scanAccessibilityIfEnabled( + filePath: String, + options: RoborazziOptions, + ) { + if (!java.lang.Boolean.getBoolean("screenshot.accessibilityScan")) return + check(Build.VERSION.SDK_INT >= 34) { "Accessibility scans require API 34 or newer" } + println("Accessibility scan: $filePath") + onView(isRoot()).checkRoboAccessibility( + roborazziATFAccessibilityCheckOptions = + RoborazziATFAccessibilityCheckOptions( + failureLevel = RoborazziATFAccessibilityChecker.CheckLevel.LogOnly, + ), + roborazziOptions = options, + ) + } + /** Captures a laid-out view, including content extending beyond the screen. */ protected fun captureView( name: String, diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/SearchErrorScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/SearchErrorScreenshotTest.kt new file mode 100644 index 000000000000..9f3082629601 --- /dev/null +++ b/AnkiDroid/src/test/java/com/ichi2/anki/SearchErrorScreenshotTest.kt @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.ichi2.anki + +import org.junit.Test +import org.robolectric.shadows.ShadowDialog + +/** + * `./gradlew :AnkiDroid:verifyRoborazziPlayDebug -Pscreenshot --tests "com.ichi2.anki.SearchErrorScreenshotTest"` + */ +class SearchErrorScreenshotTest : ScreenshotTest() { + @Test + fun `browser search errors`() = + runTest { + throwOnShowError = false + addBasicNote() + val browser = startRegularActivity() + for ((query, name) in listOf("and" to "inline_code", "re:b[" to "regex_diagnostic")) { + browser.searchCardsSync(query) + advanceRobolectricLooper() + captureScreen(name) + ShadowDialog.getLatestDialog().dismiss() + } + } +} diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/SingleFragmentScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/SingleFragmentScreenshotTest.kt index 4241c3b41748..2036a9c0ac9d 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/SingleFragmentScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/SingleFragmentScreenshotTest.kt @@ -3,8 +3,8 @@ package com.ichi2.anki import android.content.Intent +import com.ichi2.anki.common.utils.dp import com.ichi2.testutils.simulateSystemBars -import com.ichi2.utils.dp import org.junit.Test import org.robolectric.RuntimeEnvironment diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/StudyOptionsFragmentTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/StudyOptionsFragmentTest.kt index 30a3e8b20f77..33cf1794a69a 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/StudyOptionsFragmentTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/StudyOptionsFragmentTest.kt @@ -2,22 +2,37 @@ // SPDX-License-Identifier: GPL-3.0-or-later package com.ichi2.anki +import android.content.Context +import android.content.res.Configuration +import android.graphics.drawable.GradientDrawable import android.view.View import android.view.View.MeasureSpec +import android.view.ViewGroup import android.widget.ScrollView import android.widget.TextView import androidx.appcompat.app.AlertDialog +import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.view.menu.MenuBuilder +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.fragment.app.commit import androidx.fragment.app.commitNow import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope +import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.ichi2.anki.CollectionManager.TR +import com.ichi2.anki.databinding.FragmentStudyOptionsBinding +import com.ichi2.anki.libanki.Consts.DEFAULT_DECK_ID +import com.ichi2.anki.observability.undoableOp import com.ichi2.anki.ui.internationalization.sentenceCase +import com.ichi2.testutils.ext.menu import com.ichi2.testutils.ext.triggerDeckNotFoundInLimitsMap import com.ichi2.testutils.launchFragmentInContainer import com.ichi2.testutils.withFragment import com.ichi2.utils.neutralButton +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.TestScope @@ -27,11 +42,14 @@ import org.junit.runner.RunWith import org.robolectric.Robolectric import org.robolectric.annotation.Config import org.robolectric.shadows.ShadowDialog +import java.util.Locale import kotlin.test.assertContains import kotlin.test.assertEquals import kotlin.test.assertFailsWith import kotlin.test.assertFalse import kotlin.test.assertIs +import kotlin.test.assertNotNull +import kotlin.test.assertNotSame import kotlin.test.assertNull import kotlin.test.assertSame import kotlin.test.assertTrue @@ -41,6 +59,48 @@ import kotlin.test.assertTrue */ @RunWith(AndroidJUnit4::class) class StudyOptionsFragmentTest : RobolectricTest() { + /** Issue 22249: backend deletion can leave the tablet showing hidden Default. */ + @Test + @Config(qualifiers = "xlarge") + fun `tablet shows empty Default after backend deletion and Undo restores custom study`() { + val keep = addDeck("Keep") + col.setDeck(listOf(addBasicNote().firstCard().id), keep) + val deleted = addDeck("Delete me", setAsSelected = true) + col.setDeck(listOf(addBasicNote().firstCard().id), deleted) + + deckPicker { + advanceRobolectricLooperUntil { fragment?.viewModel?.selectedDeckId == deleted } + undoableOp { decks.remove(listOf(deleted)) } + advanceRobolectricLooperUntil { fragment?.viewModel?.state is StudyOptionsState.Empty } + advanceRobolectricLooper() + + assertEquals(DEFAULT_DECK_ID, col.decks.selected()) + assertEquals(DEFAULT_DECK_ID, fragment!!.viewModel.selectedDeckId) + assertEquals("Default", assertIs(fragment!!.viewModel.state).deckName) + assertNull(col.sched.deckDueTree().find(DEFAULT_DECK_ID)) + val undoStatus = col.undoStatus() + val menu = menu() + fragment!!.onPrepareMenu(menu) + updateMenuFromState(menu) + assertFalse(assertNotNull(menu.findItem(R.id.action_custom_study)).isVisible) + assertTrue(assertNotNull(menu.findItem(R.id.action_deck_or_study_options)).isVisible) + assertEquals(undoStatus, col.undoStatus()) + + undoAndShowSnackbar() + advanceRobolectricLooperUntil { fragment?.viewModel?.selectedDeckId == deleted } + assertIs(fragment!!.viewModel.state) + fragment!!.onPrepareMenu(menu) + assertTrue(menu.findItem(R.id.action_custom_study).isVisible) + assertNotNull(col.undoStatus().redo) + + redoAndShowSnackbar() + advanceRobolectricLooperUntil { fragment?.viewModel?.state is StudyOptionsState.Empty } + fragment!!.onPrepareMenu(menu) + assertFalse(menu.findItem(R.id.action_custom_study).isVisible) + assertEquals(DEFAULT_DECK_ID, fragment!!.viewModel.selectedDeckId) + } + } + @Test fun `empty filtered deck shows counts after a finished regular deck`() = runTest { @@ -59,6 +119,37 @@ class StudyOptionsFragmentTest : RobolectricTest() { } } + @Test + fun `bury counts stay hidden without buried cards`() = + runTest { + addBasicNote() + withStudyOptions { + assertIs(viewModel.state) + assertBuryCountsHidden() + + reattachView() + assertBuryCountsHidden() + } + } + + @Test + fun `bury count is shown next to the counts`() = + runTest { + addBasicAndReversedNote("Front", "Back") + val config = col.decks.configDictForDeckId(col.decks.current().id) + config.new.bury = true + col.decks.save(config) + withStudyOptions { + assertIs(viewModel.state) + val newBury = binding.studyoptionsNewBury + assertEquals(View.VISIBLE, newBury.visibility) + + reattachView() + assertEquals(View.VISIBLE, newBury.visibility) + assertEquals("+1 buried", newBury.text.toString()) + } + } + @Test fun `scroll position is retained on refresh and reset for another deck`() = runTest { @@ -82,11 +173,30 @@ class StudyOptionsFragmentTest : RobolectricTest() { } } + @Test + fun `returning from another panel keeps a single progress observer`() = + runTest { + withStudyOptions { + val firstView = requireView() + + parentFragmentManager.commit { + replace(android.R.id.content, Fragment()) + addToBackStack(null) + } + parentFragmentManager.executePendingTransactions() + parentFragmentManager.popBackStackImmediate() + + assertNotSame(firstView, requireView()) + val progress = viewModel.progressManager.progress as MutableStateFlow<*> + assertEquals(1, progress.subscriptionCount.value) + } + } + /** Issue 22348: replacing the tablet panel can detach it before its initial refresh starts. */ @Test @Config(qualifiers = "xlarge") - fun `replacing study options before its refresh starts exposes lifecycle misuse`() = - assertLifecycleFailure("not attached to an activity") { + fun `replacing study options before its refresh starts skips the stale refresh`() = + runTest { setIntroductionSlidesShown(true) addBasicNote() val controller = Robolectric.buildActivity(DeckPicker::class.java).setup() @@ -152,6 +262,28 @@ class StudyOptionsFragmentTest : RobolectricTest() { assertSame(initialState, fragment.viewModel.state) } + /** Issue 22065: the host can replace the fragment before its queued refresh starts. */ + @Test + fun `refresh queued by view creation is skipped after synchronous replacement`() { + withNullCollection { + val controller = Robolectric.buildActivity(FragmentActivity::class.java).setup() + saveControllerForCleanup(controller) + val activity = controller.get() + val first = StudyOptionsFragment() + val second = StudyOptionsFragment() + + activity.lifecycleScope.launch { + activity.supportFragmentManager.commitNow { replace(android.R.id.content, first) } + activity.supportFragmentManager.commitNow { replace(android.R.id.content, second) } + } + advanceRobolectricLooper() + + assertNull(first.activity) + assertSame(second, activity.supportFragmentManager.findFragmentById(android.R.id.content)) + assertTrue(second.isAdded) + } + } + /** Issue 21981: a refresh must offer recovery when the deck hierarchy is corrupt. */ @Test fun `corrupt deck hierarchy offers Check database instead of crashing`() = @@ -251,6 +383,40 @@ class StudyOptionsFragmentTest : RobolectricTest() { } } + @Test + fun `study options gradient spans from top to bottom of parent`() = + runTest { + withStudyOptions { + val gradient = requireView().findViewById(R.id.studyoptions_gradient) + val params = gradient.layoutParams as ConstraintLayout.LayoutParams + assertEquals(ConstraintLayout.LayoutParams.PARENT_ID, params.topToTop) + assertEquals(ConstraintLayout.LayoutParams.PARENT_ID, params.bottomToBottom) + assertEquals(ConstraintLayout.LayoutParams.PARENT_ID, params.startToStart) + } + } + + @Test + fun `shadow_left drawable mirrors in RTL`() { + val context = ApplicationProvider.getApplicationContext() + val ltrConfig = + Configuration(context.resources.configuration).apply { + setLayoutDirection(Locale.US) + } + val ltrContext = context.createConfigurationContext(ltrConfig) + val ltrDrawable = + AppCompatResources.getDrawable(ltrContext, R.drawable.shadow_left) as GradientDrawable + assertEquals(GradientDrawable.Orientation.LEFT_RIGHT, ltrDrawable.orientation) + + val rtlConfig = + Configuration(context.resources.configuration).apply { + setLayoutDirection(Locale.forLanguageTag("ar")) + } + val rtlContext = context.createConfigurationContext(rtlConfig) + val rtlDrawable = + AppCompatResources.getDrawable(rtlContext, R.drawable.shadow_left) as GradientDrawable + assertEquals(GradientDrawable.Orientation.RIGHT_LEFT, rtlDrawable.orientation) + } + private fun assertLifecycleFailure( message: String, block: suspend TestScope.() -> Unit, @@ -266,6 +432,24 @@ class StudyOptionsFragmentTest : RobolectricTest() { scenario.withFragment(block) } + private val StudyOptionsFragment.binding + get() = FragmentStudyOptionsBinding.bind(requireView()) + + private fun StudyOptionsFragment.assertBuryCountsHidden() = + with(binding) { + for (bury in listOf(studyoptionsNewBury, studyoptionsLearningBury, studyoptionsReviewBury)) { + assertEquals(View.GONE, bury.visibility, resources.getResourceEntryName(bury.id)) + } + } + + private fun StudyOptionsFragment.reattachView() { + val view = requireView() + val parent = view.parent as ViewGroup + val index = parent.indexOfChild(view) + parent.removeView(view) + parent.addView(view, index) + } + context(scope: TestScope) private fun StudyOptionsFragment.refreshAndAwait() { refreshInterface() diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/StudyOptionsScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/StudyOptionsScreenshotTest.kt index 814b4a2ea270..4be27ddd2767 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/StudyOptionsScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/StudyOptionsScreenshotTest.kt @@ -12,9 +12,9 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat.Type.displayCutout import androidx.core.view.WindowInsetsCompat.Type.navigationBars import androidx.core.view.WindowInsetsCompat.Type.statusBars +import com.ichi2.anki.common.utils.dp import com.ichi2.testutils.insetsOf import com.ichi2.testutils.simulateKeyboard -import com.ichi2.utils.dp import org.junit.Test import org.robolectric.RuntimeEnvironment diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/StudyOptionsViewModelTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/StudyOptionsViewModelTest.kt index 886d04a8ec93..c5a9ed0b3e33 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/StudyOptionsViewModelTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/StudyOptionsViewModelTest.kt @@ -7,6 +7,7 @@ import anki.scheduler.CardAnswer.Rating import app.cash.turbine.test import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.observability.ensureOpsExecuted +import com.ichi2.anki.progress.ViewModelProgress import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Dispatchers @@ -172,6 +173,24 @@ class StudyOptionsViewModelTest : RobolectricTest() { } } + @Test + fun `rebuildCram - reports progress`() = + runTest { + addBasicNote() + addDynamicDeck("Filtered", "") + + assertProgressAround(StudyOptionsProgress.REBUILDING_FILTERED_DECK) { viewModel.rebuildCram() } + } + + @Test + fun `emptyCram - reports progress`() = + runTest { + addBasicNote() + addDynamicDeck("Filtered", "") + + assertProgressAround(StudyOptionsProgress.EMPTYING_FILTERED_DECK) { viewModel.emptyCram() } + } + @Test fun `unbury - is undoable`() = runTest { @@ -197,19 +216,19 @@ class StudyOptionsViewModelTest : RobolectricTest() { } @Test - fun `refreshData - buried cards are counted`() = + fun `refreshData - buried siblings are counted`() = runTest { - addBasicNote("Front1", "Back1") - addBasicNote("Front2", "Back2") + addBasicAndReversedNote("Front", "Back") withCol { - val card = sched.card!! - sched.buryCards(listOf(card.id), true) + val config = decks.configDictForDeckId(decks.current().id) + config.new.bury = true + decks.save(config) } viewModel.refreshData() val state = assertIs(viewModel.state) - assertTrue(state.data.buriedNew > 0, "expected buried new cards") + assertEquals(1, state.data.buriedNew) assertEquals(1, state.data.newCardsToday) } @@ -300,6 +319,20 @@ class StudyOptionsViewModelTest : RobolectricTest() { } } + private suspend fun assertProgressAround( + message: StudyOptionsProgress, + op: suspend () -> Unit, + ) { + viewModel.progressManager.progress.test { + assertIs(awaitItem()) + op() + val active = assertIs>(awaitItem()) + assertEquals(message, active.message) + assertIs(awaitItem()) + expectNoEvents() + } + } + /** Hold the production queue as a sync would; restore Robolectric's lock after all work finishes. */ private suspend fun withBlockedCollectionQueue(block: suspend CoroutineScope.(releaseQueue: () -> Unit) -> Unit) { val previousQueue = CollectionManager.setTestDispatcher(Dispatchers.IO.limitedParallelism(1), useReentrantLock = false) diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ThrowableFilterServiceTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ThrowableFilterServiceTest.kt index 1659bb050980..b7c485eabe20 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ThrowableFilterServiceTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ThrowableFilterServiceTest.kt @@ -3,12 +3,11 @@ package com.ichi2.anki -import androidx.test.ext.junit.runners.AndroidJUnit4 import anki.backend.backendError import com.ichi2.anki.exception.StorageAccessException import com.ichi2.anki.servicelayer.ThrowableFilterService import com.ichi2.anki.servicelayer.ThrowableFilterService.safeFromPII -import com.ichi2.testutils.JvmTest +import com.ichi2.utils.ExceptionUtil.causeChain import net.ankiweb.rsdroid.BackendException import net.ankiweb.rsdroid.BackendException.BackendSchedulerUpgradeRequiredException import net.ankiweb.rsdroid.exceptions.BackendDeckIsFilteredException @@ -16,12 +15,15 @@ import net.ankiweb.rsdroid.exceptions.BackendNetworkException import net.ankiweb.rsdroid.exceptions.BackendSyncException import net.ankiweb.rsdroid.exceptions.BackendSyncException.BackendSyncServerMessageException import org.junit.Test -import org.junit.runner.RunWith +import kotlin.test.assertContentEquals +import kotlin.test.assertEquals import kotlin.test.assertFalse +import kotlin.test.assertNotNull +import kotlin.test.assertNotSame +import kotlin.test.assertSame import kotlin.test.assertTrue -@RunWith(AndroidJUnit4::class) -class ThrowableFilterServiceTest : JvmTest() { +class ThrowableFilterServiceTest { @Test fun `scheduler upgrade required exceptions are discarded`() { val exception = BackendSchedulerUpgradeRequiredException(backendError {}) @@ -61,4 +63,223 @@ class ThrowableFilterServiceTest : JvmTest() { val exception3 = StorageAccessException("test exception") assertTrue(ThrowableFilterService.shouldDiscardThrowable(exception3)) } + + @Test + fun `circular causes are discarded before reporting`() { + val exception = Exception() + val cause = Exception() + exception.initCause(cause) + cause.initCause(exception) + + assertTrue(ThrowableFilterService.shouldDiscardThrowable(exception)) + } + + @Test + fun `PII in suppressed exceptions is filtered`() { + val exception = Exception() + val suppressed = Exception() + suppressed.addSuppressed(BackendSyncServerMessageException(backendError {})) + exception.addSuppressed(suppressed) + + assertFalse(exception.safeFromPII()) + assertTrue(ThrowableFilterService.shouldDiscardThrowable(exception)) + + suppressed.addSuppressed(exception) + assertFalse(exception.safeFromPII()) + } + + @Test + fun `ordinary uncaught exceptions reach the next handler unchanged`() { + val cause = IllegalArgumentException("wanted cause") + val exception = IllegalStateException("wanted", cause) + + assertSame(exception, forwardUnhandled(exception)) + exception.addSuppressed(cause) + assertFalse(ThrowableFilterService.shouldDiscardThrowable(exception)) + assertSame(exception, forwardUnhandled(exception)) + } + + @Test + fun `unwanted uncaught exceptions reach crash reporting without messages`() { + val exceptions = + listOf( + BackendNetworkException(backendError { message = "private network details" }), + BackendSyncException(backendError { message = "private sync details" }), + BackendSchedulerUpgradeRequiredException(backendError { message = "private scheduler details" }), + StorageAccessException("private storage path"), + BackendSyncServerMessageException(backendError { message = "private@example.com" }), + ) + for (exception in exceptions) { + val forwarded = forwardUnhandled(exception) + + assertNotSame(exception, forwarded) + assertEquals(exception.javaClass.name, forwarded.toString()) + assertContentEquals(exception.stackTrace, forwarded.stackTrace) + assertFalse(forwarded.stackTraceToString().contains("private")) + // Handled reports of the same types must continue to be filtered. + assertTrue(ThrowableFilterService.shouldDiscardThrowable(exception)) + } + } + + @Test + fun `uncaught PII exceptions have their entire cause chain sanitized`() { + val serverError = BackendSyncServerMessageException(backendError { message = "private@example.com" }) + val cause = + object : IllegalArgumentException("private cause", serverError) { + override fun toString(): String = error("Must not read a custom description") + + override fun getLocalizedMessage(): String = error("Must not read a localized message") + } + val exception = IllegalStateException("private outer message", cause) + // Sharing a cause as a suppressed exception must not truncate the main cause chain. + exception.addSuppressed(serverError) + + val forwarded = forwardUnhandled(exception) + + assertEquals(exception.javaClass.name, forwarded.toString()) + assertContentEquals(exception.stackTrace, forwarded.stackTrace) + val forwardedCause = assertNotNull(forwarded.cause) + assertEquals(cause.javaClass.name, forwardedCause.toString()) + assertContentEquals(cause.stackTrace, forwardedCause.stackTrace) + val forwardedServerError = assertNotNull(forwardedCause.cause) + assertEquals(serverError.javaClass.name, forwardedServerError.toString()) + assertContentEquals(serverError.stackTrace, forwardedServerError.stackTrace) + assertFalse(forwarded.stackTraceToString().contains("private")) + assertEquals("private outer message", exception.message) + assertSame(cause, exception.cause) + assertSame(serverError, cause.cause) + } + + @Test + fun `suppressed PII exceptions are detected and sanitized`() { + val exception = IllegalStateException("private outer message") + val suppressed = IllegalArgumentException("private suppressed message") + suppressed.addSuppressed(BackendSyncServerMessageException(backendError { message = "private@example.com" })) + exception.addSuppressed(suppressed) + + assertFalse(exception.safeFromPII()) + assertTrue(ThrowableFilterService.shouldDiscardThrowable(exception)) + val forwarded = forwardUnhandled(exception) + + val forwardedSuppressed = forwarded.suppressed.single() + assertEquals(suppressed.javaClass.name, forwardedSuppressed.toString()) + assertContentEquals(suppressed.stackTrace, forwardedSuppressed.stackTrace) + val suppressedServerError = suppressed.suppressed.single() + assertEquals(suppressedServerError.javaClass.name, forwardedSuppressed.suppressed.single().toString()) + assertFalse(forwarded.stackTraceToString().contains("private")) + assertSame(suppressed, exception.suppressed.single()) + } + + @Test + fun `circular exception graphs are sanitized with and without PII types`() { + val exception = Exception("private outer message") + val cause = Exception("private cause") + exception.initCause(cause) + cause.initCause(exception) + cause.addSuppressed(exception) + assertTrue(exception.safeFromPII()) + + repeat(2) { + val forwarded = forwardUnhandled(exception) + val forwardedCause = assertNotNull(forwarded.cause) + assertNotSame(exception, forwarded) + assertEquals(cause.javaClass.name, forwardedCause.toString()) + assertEquals(null, forwardedCause.cause) + assertTrue(forwardedCause.suppressed.isEmpty()) + assertTrue(ThrowableFilterService.shouldDiscardThrowable(exception)) + assertFalse(forwarded.stackTraceToString().contains("private")) + + exception.addSuppressed(BackendSyncServerMessageException(backendError { message = "private@example.com" })) + assertFalse(exception.safeFromPII()) + } + } + + @Test + fun `deep exception chains do not overflow filtering or sanitization`() { + var cause: Throwable = BackendSyncServerMessageException(backendError { message = "private@example.com" }) + repeat(2000) { cause = Exception("private cause", cause) } + + assertFalse(cause.safeFromPII()) + val forwarded = forwardUnhandled(cause) + + val forwardedCauses = forwarded.causeChain.toList() + assertEquals(2001, forwardedCauses.size) + assertTrue(forwardedCauses.none { it.message?.contains("private") == true }) + } + + @Test + fun `reinitialization keeps filtered fatal errors reportable`() { + val exception = StorageAccessException("private path") + val reports = mutableListOf() + withReportingHandler( + Thread.UncaughtExceptionHandler { _, throwable -> reports.add(throwable) }, + ) { + ThrowableFilterService.reInitialize() + val handler = assertNotNull(Thread.getDefaultUncaughtExceptionHandler()) + + handler.uncaughtException(Thread.currentThread(), exception) + + val report = reports.single() + assertEquals(exception.javaClass.name, report.toString()) + assertFalse(report.stackTraceToString().contains("private")) + } + } + + @Test + fun `installed filter forwards an uncaught worker thread exception`() { + val exception = StorageAccessException("private storage path") + val worker = Thread { throw exception } + var forwardedThread: Thread? = null + var forwarded: Throwable? = null + var reports = 0 + withReportingHandler( + Thread.UncaughtExceptionHandler { thread, throwable -> + reports++ + forwardedThread = thread + forwarded = throwable + }, + ) { + worker.start() + worker.join(5000) + + assertFalse(worker.isAlive) + assertEquals(1, reports) + assertSame(worker, forwardedThread) + assertEquals(exception.javaClass.name, assertNotNull(forwarded).toString()) + assertFalse(assertNotNull(forwarded).stackTraceToString().contains("private")) + } + } + + private fun withReportingHandler( + reportingHandler: Thread.UncaughtExceptionHandler, + block: () -> Unit, + ) { + val originalDefault = Thread.getDefaultUncaughtExceptionHandler() + val originalHandler = ThrowableFilterService.originalUncaughtExceptionHandler + try { + Thread.setDefaultUncaughtExceptionHandler(reportingHandler) + ThrowableFilterService.initialize() + block() + } finally { + Thread.setDefaultUncaughtExceptionHandler(originalDefault) + ThrowableFilterService.originalUncaughtExceptionHandler = originalHandler + } + } + + private fun forwardUnhandled(exception: Throwable): Throwable { + val thread = Thread.currentThread() + var forwarded: Throwable? = null + var calls = 0 + withReportingHandler( + Thread.UncaughtExceptionHandler { actualThread, throwable -> + assertSame(thread, actualThread) + forwarded = throwable + calls++ + }, + ) { + ThrowableFilterService.uncaughtExceptionHandler.uncaughtException(thread, exception) + } + assertEquals(1, calls, "The uncaught exception must reach the next handler exactly once") + return assertNotNull(forwarded) + } } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/TranslationTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/TranslationTest.kt index 6dc47400f2a8..1e6180698f95 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/TranslationTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/TranslationTest.kt @@ -2,18 +2,17 @@ package com.ichi2.anki -import androidx.test.ext.junit.runners.AndroidJUnit4 import anki.i18n.GeneratedTranslations import com.ichi2.anki.CollectionManager.TR import com.ichi2.anki.TranslationTest.Companion.BASELINE_CASE_INSENSITIVE_DUPLICATES import com.ichi2.anki.TranslationTest.Companion.BASELINE_DUPLICATES import com.ichi2.testutils.BackendTranslation +import com.ichi2.testutils.JvmTest import com.ichi2.testutils.XmlStringResource import com.ichi2.testutils.getAndroidManifestStringResourceNames import com.ichi2.testutils.getBackendNonArgStrings import com.ichi2.testutils.getTranslatableXmlStrings import org.junit.Test -import org.junit.runner.RunWith import java.io.File import kotlin.test.fail @@ -22,8 +21,7 @@ import kotlin.test.fail * (01-core, 02-strings, etc.) do not duplicate strings already available * from the backend via [GeneratedTranslations]/[TR]. */ -@RunWith(AndroidJUnit4::class) // TODO: no Android dependencies; could be JvmTest -class TranslationTest : RobolectricTest() { +class TranslationTest : JvmTest() { @Test fun `CrowdIn-managed files do not reappear in this module`() { val resDir = File("src/main/res") diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/TtsVoicesCacheTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/TtsVoicesCacheTest.kt index 70bff1e26881..21e3101a6152 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/TtsVoicesCacheTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/TtsVoicesCacheTest.kt @@ -3,9 +3,7 @@ package com.ichi2.anki import android.speech.tts.TextToSpeech -import androidx.test.ext.junit.runners.AndroidJUnit4 import com.ichi2.anki.i18n.normalize -import com.ichi2.testutils.EmptyApplication import com.ichi2.testutils.TtsVoicesCacheOverride import io.mockk.Runs import io.mockk.coEvery @@ -14,15 +12,12 @@ import io.mockk.every import io.mockk.just import io.mockk.mockk import io.mockk.mockkObject +import kotlinx.coroutines.test.runTest import org.junit.Test -import org.junit.runner.RunWith -import org.robolectric.annotation.Config import java.util.Locale import kotlin.test.assertEquals -@RunWith(AndroidJUnit4::class) -@Config(application = EmptyApplication::class) -class TtsVoicesCacheTest : RobolectricTest() { +class TtsVoicesCacheTest { @Test fun `a new reviewer engine gets its own cached languages`() = runTest { diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/TtsVoicesMultiEngineTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/TtsVoicesMultiEngineTest.kt index c59eab0ebdd0..0281adbecad4 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/TtsVoicesMultiEngineTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/TtsVoicesMultiEngineTest.kt @@ -103,7 +103,7 @@ class TtsVoicesMultiEngineTest { assertTrue(defaultLocales.isCompleted) assertEquals(emptyList(), defaultLocales.await().locales) - assertEquals(emptySet(), voices) + assertEquals(emptyList(), voices) } @Test @@ -147,6 +147,61 @@ class TtsVoicesMultiEngineTest { } } + @Test + fun `default engine comes first while other engines retain discovery order`() = + runTest { + val probe = probeTts() + every { probe.defaultEngine } returns ENGINE_B + every { probe.engines } returns + listOf(ENGINE_C, ENGINE_B, ENGINE_A).map { engine -> + TextToSpeech.EngineInfo().apply { name = engine } + } + + val voices = + TtsVoices.loadVoices(CompletableDeferred()) { engine -> + if (engine == null) { + probe + } else { + fakeTts(setOf(fakeVoice("first", Locale.US), fakeVoice("second", Locale.FRANCE)), emptySet()) + } + } + + assertEquals(listOf(ENGINE_B, ENGINE_B, ENGINE_C, ENGINE_C, ENGINE_A, ENGINE_A), voices.map { it.engine }) + assertEquals(listOf("first", "second", "first", "second", "first", "second"), voices.map { it.voice.name }) + } + + @Test + fun `default engine is included first even when missing from discovered engines`() = + runTest { + val probe = probeTts() + every { probe.defaultEngine } returns ENGINE_C + + val voices = + TtsVoices.loadVoices(CompletableDeferred()) { engine -> + if (engine == null) probe else fakeTts(setOf(fakeVoice("voice", Locale.US)), emptySet()) + } + + assertEquals(listOf(ENGINE_C, ENGINE_A, ENGINE_B), voices.map { it.engine }) + } + + @Test + fun `voices are distinct by engine and name while preserving their first occurrence`() = + runTest { + val first = fakeVoice("shared", Locale.US) + val duplicate = fakeVoice("shared", Locale.US) + val other = fakeVoice("other", Locale.FRANCE) + val engineB = fakeTts(setOf(first, duplicate, other), emptySet()) + val engineA = fakeTts(setOf(fakeVoice("shared", Locale.US)), emptySet()) + + val voices = + TtsVoices.loadVoicesFromEngines(listOf(ENGINE_B, ENGINE_A, ENGINE_B)) { engine -> + if (engine == ENGINE_B) engineB else engineA + } + + assertEquals(listOf("$ENGINE_B-shared", "$ENGINE_B-other", "$ENGINE_A-shared"), voices.map { it.name }) + assertSame(first, voices.first().voice) + } + @Test fun `voices are aggregated across multiple engines`() = runBlocking { @@ -222,7 +277,7 @@ class TtsVoicesMultiEngineTest { setUpFailingTts() val locales = CompletableDeferred() - assertEquals(emptySet(), TtsVoices.loadVoices(locales, TtsVoices::createTts)) + assertEquals(emptyList(), TtsVoices.loadVoices(locales, TtsVoices::createTts)) assertEquals(TtsVoices.EngineLocales(null, emptyList()), locales.await()) } @@ -320,5 +375,6 @@ class TtsVoicesMultiEngineTest { companion object { private const val ENGINE_A = "com.example.engine.a" private const val ENGINE_B = "com.example.engine.b" + private const val ENGINE_C = "com.example.engine.c" } } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/account/AccountActivityScreenshotTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/account/AccountActivityScreenshotTest.kt index 737f574b6323..b3cac6430283 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/account/AccountActivityScreenshotTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/account/AccountActivityScreenshotTest.kt @@ -16,9 +16,9 @@ import androidx.core.view.WindowInsetsCompat.Type.statusBars import androidx.test.core.app.ActivityScenario import com.ichi2.anki.R import com.ichi2.anki.ScreenshotTest +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.settings.Prefs import com.ichi2.testutils.insetsOf -import com.ichi2.utils.dp import org.junit.Test import org.robolectric.RuntimeEnvironment diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/account/AccountInsetsTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/account/AccountInsetsTest.kt index d9a7929dfe82..94425ad6b563 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/account/AccountInsetsTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/account/AccountInsetsTest.kt @@ -7,10 +7,10 @@ import android.widget.Button import androidx.test.ext.junit.runners.AndroidJUnit4 import com.ichi2.anki.R import com.ichi2.anki.RobolectricTest +import com.ichi2.anki.common.utils.dp import com.ichi2.anki.databinding.FragmentPageBinding import com.ichi2.anki.settings.Prefs import com.ichi2.testutils.dispatchInsets -import com.ichi2.utils.dp import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.equalTo import org.junit.Test diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/account/LoginFragmentTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/account/LoginFragmentTest.kt index c527d3310765..3a7cf6c80649 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/account/LoginFragmentTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/account/LoginFragmentTest.kt @@ -2,6 +2,8 @@ package com.ichi2.anki.account +import android.os.Looper +import android.view.WindowManager import android.widget.Button import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.android.material.textfield.TextInputEditText @@ -16,6 +18,9 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.robolectric.Shadows.shadowOf +import kotlin.time.Duration.Companion.seconds +import kotlin.time.TimeSource @RunWith(AndroidJUnit4::class) class LoginFragmentTest : RobolectricTest() { @@ -43,8 +48,17 @@ class LoginFragmentTest : RobolectricTest() { activity.findViewById(R.id.password).setText("hunter2") activity.findViewById