Harden Android accessibility, localization and startup (#105)
Android ARM verification / rust (push) Failing after 46m41s
Android ARM verification / android (push) Failing after 8s
Dependency security audit / rustsec (push) Successful in 22s

Implement independent hardening and regression coverage. Keep #105 open for final feature and environment coverage after #106–#110; document the completion boundary and resume order.
This commit is contained in:
hugo committed 2026-10-11 15:56:33 +02:00
1 parent 43f660ace3
commit 6669b77f4e
55 files changed
+24433 -284

No files matched your search

+124 -5
View File
@@ -3,6 +3,7 @@
import argparse import argparse
import hashlib import hashlib
import json import json
import math
import os import os
from pathlib import Path from pathlib import Path
import platform import platform
@@ -99,6 +100,7 @@ def verification_phases():
(":app:assembleDebug", ":app:assembleRelease", ":app:bundleRelease"), (":app:assembleDebug", ":app:assembleRelease", ":app:bundleRelease"),
*((f":{module}:assembleDebugAndroidTest",) for module in ("app", "core", "rust-bridge", "platform")), *((f":{module}:assembleDebugAndroidTest",) for module in ("app", "core", "rust-bridge", "platform")),
*((f":{module}:ktlintCheck", f":{module}:lintDebug") for module in MODULES), *((f":{module}:ktlintCheck", f":{module}:lintDebug") for module in MODULES),
(":app:assembleBenchmark", ":app:assembleProfile", ":performance:assembleBenchmark", ":performance:ktlintCheck"),
("androidVerification",), ("androidVerification",),
) )
@@ -166,7 +168,7 @@ def clean_ci(root=ROOT):
if os.environ.get("CI") != "true": if os.environ.get("CI") != "true":
raise RuntimeError("Build cleanup is restricted to CI checkouts") raise RuntimeError("Build cleanup is restricted to CI checkouts")
paths = [root / "target", root / "android/build"] paths = [root / "target", root / "android/build"]
paths.extend(root / "android" / module / "build" for module in MODULES) paths.extend(root / "android" / module / "build" for module in (*MODULES, "performance"))
if any(path.resolve() != path or (path.exists() and not path.is_dir()) for path in paths): if any(path.resolve() != path or (path.exists() and not path.is_dir()) for path in paths):
raise RuntimeError("CI build directories must not contain symlinks or unexpected files") raise RuntimeError("CI build directories must not contain symlinks or unexpected files")
for path in paths: for path in paths:
@@ -244,6 +246,30 @@ def build():
checksum_artifacts(output) checksum_artifacts(output)
PERFORMANCE_BUDGETS = {
"editor_100_updates_ms": 500,
"editor_update_p95_us": 32000,
"cache_rebuild_ms": 15000,
"qr_analysis_ms": 5000,
"tree_1000_navigation_ms": 3000,
"tree_1000_search_ms": 5000,
}
def performance_metrics(result):
values = {}
for name, number in re.findall(r"^INSTRUMENTATION_STATUS: ironstorage_([a-z0-9_]+)=([0-9]{1,12})$", result, re.MULTILINE):
if name in PERFORMANCE_BUDGETS:
if name in values:
raise RuntimeError("Duplicate performance measurement")
values[name] = int(number)
if values.keys() != PERFORMANCE_BUDGETS.keys():
raise RuntimeError("Missing required journey measurements")
if any(values[name] >= bound for name, bound in PERFORMANCE_BUDGETS.items()):
raise RuntimeError("Native journey exceeded its performance budget")
return values
def emulator(serial): def emulator(serial):
adb = SDK / "platform-tools/adb" adb = SDK / "platform-tools/adb"
def command(*args): def command(*args):
@@ -271,6 +297,7 @@ def emulator(serial):
("core", "de.rfc1437.ironstorage.core.test", None), ("core", "de.rfc1437.ironstorage.core.test", None),
("rust-bridge", "de.rfc1437.ironstorage.rustbridge.test", None)] ("rust-bridge", "de.rfc1437.ironstorage.rustbridge.test", None)]
native_timings = [] native_timings = []
journey_timings = {}
for module, package, _ in suites: for module, package, _ in suites:
test_apk = next((ROOT / "android" / module / "build/outputs/apk/androidTest/debug").glob("*.apk")) test_apk = next((ROOT / "android" / module / "build/outputs/apk/androidTest/debug").glob("*.apk"))
command("install", "-r", test_apk) command("install", "-r", test_apk)
@@ -291,6 +318,8 @@ def emulator(serial):
raw.write_text(result) raw.write_text(result)
raw.chmod(0o600) raw.chmod(0o600)
raise RuntimeError("ARM emulator instrumentation failed (raw output retained locally only)") raise RuntimeError("ARM emulator instrumentation failed (raw output retained locally only)")
if module == "core":
journey_timings = performance_metrics(result)
# Release instrumentation-owned activities and native owners before real app starts. # Release instrumentation-owned activities and native owners before real app starts.
command("shell", "am", "force-stop", package) command("shell", "am", "force-stop", package)
# No activity state or application data is deleted between process recreation runs. # No activity state or application data is deleted between process recreation runs.
@@ -304,18 +333,105 @@ def emulator(serial):
timings.append(int(values["TotalTime"].strip())) timings.append(int(values["TotalTime"].strip()))
output = ROOT / "android/build/ci-artifacts" output = ROOT / "android/build/ci-artifacts"
output.mkdir(parents=True, exist_ok=True) output.mkdir(parents=True, exist_ok=True)
(output / f"emulator-api{api}-{pages}.json").write_text(json.dumps({"api": api, "abi": abi, "page_size": pages, "cold_start_ms": timings, "native_load_ns": native_timings, "instrumentation": "passed"}, indent=2) + "\n") (output / f"emulator-api{api}-{pages}.json").write_text(json.dumps({"api": api, "abi": abi, "page_size": pages, "cold_start_ms": timings, "native_load_ns": native_timings, "journey_timings": journey_timings, "instrumentation": "passed"}, indent=2) + "\n")
checksum_artifacts(output) checksum_artifacts(output)
print(f"ARM API {api}, {pages}-byte pages: instrumentation and five cold starts passed") print(f"ARM API {api}, {pages}-byte pages: instrumentation and five cold starts passed")
def startup_metrics(data):
values = {}
for row in data["benchmarks"]:
mode = {"coldStart": "cold", "warmStart": "warm"}.get(row["name"])
if mode is None:
continue
if mode in values or row["repeatIterations"] != 5:
raise RuntimeError("Startup measurements must have five isolated iterations")
samples = {}
for metric, key in [("timeToInitialDisplayMs", "initial_display_ms"),
("timeToFullDisplayMs", "full_display_ms")]:
runs = row["metrics"][metric]["runs"]
budget = 5000 if mode == "cold" else 3000
if len(runs) != 5 or any(type(value) not in (int, float) or
not math.isfinite(value) or value <= 0 or value >= budget for value in runs):
raise RuntimeError("Incomplete or over-budget startup measurement")
samples[key] = runs
values[mode] = samples
if values.keys() != {"cold", "warm"}:
raise RuntimeError("Both cold and warm startup measurements are required")
return values
def performance(serial, profiles=False):
adb = SDK / "platform-tools/adb"
def command(*args):
return run(adb, "-s", serial, *args, capture=True).stdout.strip()
abi = command("shell", "getprop", "ro.product.cpu.abi")
api = int(command("shell", "getprop", "ro.build.version.sdk"))
if abi not in ABIS or command("shell", "getprop", "ro.kernel.qemu") != "1":
raise RuntimeError("Performance validation requires an ARM emulator")
if profiles and api < 34:
raise RuntimeError("Data-preserving baseline generation requires API 34 or newer")
variant = "profile" if profiles else "benchmark"
gradle(":app:assemble" + variant.capitalize(), ":performance:assembleBenchmark")
command("install", "-r", ROOT / f"android/app/build/outputs/apk/{variant}/app-{variant}.apk")
harness = "de.rfc1437.ironstorage.performance"
command("install", "-r", "-t", ROOT / "android/performance/build/outputs/apk/benchmark/performance-benchmark.apk")
directory = "/sdcard/Android/media/" + harness + "/additional_test_output"
command("shell", "mkdir", "-p", directory)
test = "BaselineProfile" if profiles else "StartupBenchmark"
result = command("shell", "am", "instrument", "-w", "-r", "-e", "class", harness + "." + test,
"-e", "additionalTestOutputDir", directory, "-e", "androidx.benchmark.suppressErrors", "EMULATOR",
harness + "/androidx.test.runner.AndroidJUnitRunner")
local = ROOT / "android/build/local-validation" / ("performance-" + serial)
local.mkdir(parents=True, exist_ok=True)
local.chmod(0o700)
(local / (test + ".txt")).write_text(result)
(local / (test + ".txt")).chmod(0o600)
command("shell", "am", "force-stop", harness)
if "FAILURES!!!" in result or "INSTRUMENTATION_FAILED" in result or "OK (" not in result:
raise RuntimeError("Performance instrumentation failed; raw output stays local")
command("pull", directory, local)
if not profiles:
data = json.loads((local / "additional_test_output" / (harness + "-benchmarkData.json")).read_text())
metrics = startup_metrics(data)
output = ROOT / "android/build/ci-artifacts"
output.mkdir(parents=True, exist_ok=True)
(output / f"startup-api{api}-{abi}.json").write_text(json.dumps({"api": api, "abi": abi, "startup": metrics}, allow_nan=False, indent=2) + "\n")
checksum_artifacts(output)
print(f"ARM API {api}: {test} passed; inspect local artifacts before promoting numeric metrics or generated profiles")
class SelfTest(unittest.TestCase): class SelfTest(unittest.TestCase):
def test_startup_requires_complete_bounded_numeric_samples(self):
def data():
return {"benchmarks": [{"name": name, "repeatIterations": 5, "metrics": {
metric: {"runs": [1, 2, 3, 4, 5]} for metric in ("timeToInitialDisplayMs", "timeToFullDisplayMs")
}} for name in ("coldStart", "warmStart")]}
self.assertEqual(set(startup_metrics(data())), {"cold", "warm"})
for samples in ([1, 2], [1, 2, 3, 4, float("nan")], [1, 2, 3, 4, 5000], [1, 2, 3, 4, "secret"], [1, 2, 3, 4, True]):
invalid = data()
invalid["benchmarks"][0]["metrics"]["timeToFullDisplayMs"]["runs"] = samples
with self.assertRaises(RuntimeError):
startup_metrics(invalid)
invalid = data()
invalid["benchmarks"].append(invalid["benchmarks"][0])
with self.assertRaises(RuntimeError):
startup_metrics(invalid)
def test_performance_metrics_retain_only_reviewed_numbers_and_enforce_budgets(self):
valid = "\n".join(f"INSTRUMENTATION_STATUS: ironstorage_{name}=1" for name in PERFORMANCE_BUDGETS)
self.assertEqual(performance_metrics(valid + "\nINSTRUMENTATION_STATUS: ironstorage_secret=999"), dict.fromkeys(PERFORMANCE_BUDGETS, 1))
for invalid in (valid.replace("editor_100_updates_ms=1", "editor_100_updates_ms=500"), valid.replace("qr_analysis_ms=1", "qr_analysis_ms=NaN"), valid + "\nINSTRUMENTATION_STATUS: ironstorage_qr_analysis_ms=1"):
with self.assertRaises(RuntimeError):
performance_metrics(invalid)
def test_isolated_phases_preserve_all_verification_tasks(self): def test_isolated_phases_preserve_all_verification_tasks(self):
phases = verification_phases() phases = verification_phases()
expected = {f":{module}:{task}" for module in MODULES expected = {f":{module}:{task}" for module in MODULES
for task in ("testDebugUnitTest", "ktlintCheck", "lintDebug")} for task in ("testDebugUnitTest", "ktlintCheck", "lintDebug")}
expected.update(f":{module}:assembleDebugAndroidTest" for module in ("app", "core", "rust-bridge", "platform")) expected.update(f":{module}:assembleDebugAndroidTest" for module in ("app", "core", "rust-bridge", "platform"))
expected.update((":app:assembleDebug", ":app:assembleRelease", ":app:bundleRelease", "androidVerification")) expected.update((":app:assembleDebug", ":app:assembleRelease", ":app:bundleRelease", ":app:assembleBenchmark", ":app:assembleProfile", ":performance:assembleBenchmark", ":performance:ktlintCheck", "androidVerification"))
self.assertEqual({task for phase in phases for task in phase}, expected) self.assertEqual({task for phase in phases for task in phase}, expected)
self.assertEqual(phases[-1], ("androidVerification",)) self.assertEqual(phases[-1], ("androidVerification",))
self.assertTrue(all(len(phase) <= len(MODULES) for phase in phases)) self.assertTrue(all(len(phase) <= len(MODULES) for phase in phases))
@@ -423,7 +539,7 @@ class SelfTest(unittest.TestCase):
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("command", choices=["prepare-linux", "build", "emulator", "test", "clean-ci"]) parser.add_argument("command", choices=["prepare-linux", "build", "emulator", "performance", "profiles", "test", "clean-ci"])
parser.add_argument("serial", nargs="?") parser.add_argument("serial", nargs="?")
args = parser.parse_args() args = parser.parse_args()
if args.command not in ("test", "clean-ci") and not (os.environ.get("ANDROID_HOME") or os.environ.get("ANDROID_SDK_ROOT")): if args.command not in ("test", "clean-ci") and not (os.environ.get("ANDROID_HOME") or os.environ.get("ANDROID_SDK_ROOT")):
@@ -437,6 +553,9 @@ if __name__ == "__main__":
elif args.command == "build": elif args.command == "build":
build() build()
elif args.serial: elif args.serial:
if args.command in ("performance", "profiles"):
performance(args.serial, profiles=args.command == "profiles")
else:
emulator(args.serial) emulator(args.serial)
else: else:
parser.error("emulator requires an ADB serial") parser.error("emulator, performance and profiles require an ADB serial")
+16
View File
@@ -37,6 +37,21 @@ android {
) )
} }
} }
buildTypes.create("benchmark") {
initWith(buildTypes.getByName("release"))
signingConfig = signingConfigs.getByName("debug")
matchingFallbacks += "release"
}
sourceSets.getByName("benchmark").kotlin.srcDir("src/release/kotlin")
buildTypes.create("profile") {
initWith(buildTypes.getByName("benchmark"))
isMinifyEnabled = false
isShrinkResources = false
}
sourceSets.getByName("profile").apply {
kotlin.srcDir("src/release/kotlin")
manifest.srcFile("src/benchmark/AndroidManifest.xml")
}
packaging { resources.excludes += "/META-INF/{AL2.0,LGPL2.1}" } packaging { resources.excludes += "/META-INF/{AL2.0,LGPL2.1}" }
lint { lint {
abortOnError = true abortOnError = true
@@ -72,6 +87,7 @@ dependencies {
ksp(libs.hilt.compiler) ksp(libs.hilt.compiler)
androidTestImplementation(platform(libs.compose.bom)) androidTestImplementation(platform(libs.compose.bom))
androidTestImplementation(libs.compose.ui.test) androidTestImplementation(libs.compose.ui.test)
androidTestImplementation(libs.compose.ui.test.accessibility)
androidTestImplementation(libs.android.test.runner) androidTestImplementation(libs.android.test.runner)
androidTestImplementation(libs.android.test.espresso) androidTestImplementation(libs.android.test.espresso)
implementation(libs.coroutines.android) implementation(libs.coroutines.android)
+176 -159
View File
@@ -2,135 +2,143 @@
# Manual edits can break the build and are not advised. # Manual edits can break the build and are not advised.
# This file is expected to be part of source control. # This file is expected to be part of source control.
# To regenerate this file, run: ./gradlew :app:dependencies --write-locks # To regenerate this file, run: ./gradlew :app:dependencies --write-locks
androidx.activity:activity-compose:1.13.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.activity:activity-compose:1.13.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.activity:activity-ktx:1.13.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.activity:activity-ktx:1.13.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.activity:activity:1.13.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.activity:activity:1.13.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.annotation:annotation-experimental:1.5.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.annotation:annotation-experimental:1.5.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.annotation:annotation-jvm:1.11.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.annotation:annotation-jvm:1.11.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.annotation:annotation-jvm:1.9.1=debugAndroidTestCompileClasspath,debugCompileClasspath,debugUnitTestCompileClasspath,releaseCompileClasspath androidx.annotation:annotation-jvm:1.9.1=benchmarkCompileClasspath,debugAndroidTestCompileClasspath,debugCompileClasspath,debugUnitTestCompileClasspath,profileCompileClasspath,releaseCompileClasspath
androidx.annotation:annotation:1.11.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.annotation:annotation:1.11.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.annotation:annotation:1.9.1=debugAndroidTestCompileClasspath,debugCompileClasspath,debugUnitTestCompileClasspath,releaseCompileClasspath androidx.annotation:annotation:1.9.1=benchmarkCompileClasspath,debugAndroidTestCompileClasspath,debugCompileClasspath,debugUnitTestCompileClasspath,profileCompileClasspath,releaseCompileClasspath
androidx.appcompat:appcompat-resources:1.2.0=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.appcompat:appcompat-resources:1.2.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.appcompat:appcompat:1.2.0=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.appcompat:appcompat:1.2.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.arch.core:core-common:2.2.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.arch.core:core-common:2.2.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.arch.core:core-runtime:2.2.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.arch.core:core-runtime:2.2.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.autofill:autofill:1.0.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.autofill:autofill:1.0.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.biometric:biometric:1.1.0=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.biometric:biometric:1.1.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.collection:collection-jvm:1.5.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugUnitTestCompileClasspath,releaseCompileClasspath androidx.cardview:cardview:1.0.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.collection:collection-jvm:1.6.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.collection:collection-jvm:1.5.0=benchmarkCompileClasspath,debugAndroidTestCompileClasspath,debugCompileClasspath,debugUnitTestCompileClasspath,profileCompileClasspath,releaseCompileClasspath
androidx.collection:collection-ktx:1.6.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.collection:collection-jvm:1.6.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.collection:collection:1.5.0=debugAndroidTestCompileClasspath,debugCompileClasspath,debugUnitTestCompileClasspath,releaseCompileClasspath androidx.collection:collection-ktx:1.6.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.collection:collection:1.6.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.collection:collection:1.5.0=benchmarkCompileClasspath,debugAndroidTestCompileClasspath,debugCompileClasspath,debugUnitTestCompileClasspath,profileCompileClasspath,releaseCompileClasspath
androidx.compose.animation:animation-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.collection:collection:1.6.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.animation:animation-core-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.animation:animation-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.animation:animation-core:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.animation:animation-core-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.animation:animation:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.animation:animation-core:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.foundation:foundation-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.animation:animation:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.foundation:foundation-layout-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.foundation:foundation-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.foundation:foundation-layout:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.foundation:foundation-layout-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.foundation:foundation:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.foundation:foundation-layout:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.material3.adaptive:adaptive-android:1.3.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.foundation:foundation:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.material3.adaptive:adaptive-layout-android:1.3.0=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.material3.adaptive:adaptive-android:1.3.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.material3.adaptive:adaptive-layout:1.3.0=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.material3.adaptive:adaptive-layout-android:1.3.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.material3.adaptive:adaptive-navigation-android:1.3.0=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.material3.adaptive:adaptive-layout:1.3.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.material3.adaptive:adaptive-navigation:1.3.0=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.material3.adaptive:adaptive-navigation-android:1.3.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.material3.adaptive:adaptive:1.3.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.material3.adaptive:adaptive-navigation:1.3.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.material3:material3-android:1.4.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.material3.adaptive:adaptive:1.3.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.material3:material3:1.4.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.material3:material3-android:1.4.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.material:material-ripple-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.material3:material3:1.4.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.material:material-ripple:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.material:material-ripple-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.runtime:runtime-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.material:material-ripple:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.runtime:runtime-annotation-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.runtime:runtime-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.runtime:runtime-annotation:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.runtime:runtime-annotation-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.runtime:runtime-retain-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.runtime:runtime-annotation:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.runtime:runtime-retain:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.runtime:runtime-retain-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.runtime:runtime-saveable-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.runtime:runtime-retain:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.runtime:runtime-saveable:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.runtime:runtime-saveable-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.runtime:runtime:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.runtime:runtime-saveable:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.ui:ui-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.runtime:runtime:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.ui:ui-geometry-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.ui:ui-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.ui:ui-geometry:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.ui:ui-geometry-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.ui:ui-graphics-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.ui:ui-geometry:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.ui:ui-graphics:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.ui:ui-graphics-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.ui:ui-graphics:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.ui:ui-test-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath androidx.compose.ui:ui-test-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.compose.ui:ui-test-junit4-accessibility-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.compose.ui:ui-test-junit4-accessibility:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.compose.ui:ui-test-junit4-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath androidx.compose.ui:ui-test-junit4-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.compose.ui:ui-test-junit4:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath androidx.compose.ui:ui-test-junit4:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.compose.ui:ui-test:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath androidx.compose.ui:ui-test:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.compose.ui:ui-text-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.ui:ui-text-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.ui:ui-text:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.ui:ui-text:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.ui:ui-unit-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.ui:ui-unit-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.ui:ui-unit:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.ui:ui-unit:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.ui:ui-util-android:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.ui:ui-util-android:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.ui:ui-util:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.ui:ui-util:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose.ui:ui:1.12.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose.ui:ui:1.12.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.compose:compose-bom:2026.09.00=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.compose:compose-bom:2026.09.00=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.concurrent:concurrent-futures-ktx:1.2.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath androidx.concurrent:concurrent-futures-ktx:1.2.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.concurrent:concurrent-futures:1.1.0=debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.concurrent:concurrent-futures:1.1.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.concurrent:concurrent-futures:1.2.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath androidx.concurrent:concurrent-futures:1.2.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath
androidx.core:core-ktx:1.18.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.coordinatorlayout:coordinatorlayout:1.1.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.core:core-viewtree:1.0.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.core:core-ktx:1.18.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.core:core:1.18.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.core:core-viewtree:1.0.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.cursoradapter:cursoradapter:1.0.0=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.core:core:1.18.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.customview:customview-poolingcontainer:1.0.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.cursoradapter:cursoradapter:1.0.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.customview:customview:1.0.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.customview:customview-poolingcontainer:1.0.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.drawerlayout:drawerlayout:1.0.0=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.customview:customview:1.0.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.emoji2:emoji2:1.4.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.drawerlayout:drawerlayout:1.0.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.fragment:fragment:1.9.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.emoji2:emoji2:1.4.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.graphics:graphics-path:1.0.1=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.fragment:fragment:1.9.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.interpolator:interpolator:1.0.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.graphics:graphics-path:1.0.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-common-java8:2.11.0=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.interpolator:interpolator:1.0.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-common-jvm:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-common-java8:2.11.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-common:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-common-jvm:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-livedata-core-ktx:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-common:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-livedata-core:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-livedata-core-ktx:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-livedata:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-livedata-core:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-process:2.11.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-livedata:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-runtime-android:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-process:2.11.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-runtime-compose-android:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-runtime-android:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-runtime-compose:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-runtime-compose-android:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-runtime-ktx-android:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-runtime-compose:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-runtime-ktx:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-runtime-ktx-android:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-runtime:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-runtime-ktx:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-viewmodel-android:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-runtime:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-viewmodel-compose-android:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-viewmodel-android:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-viewmodel-compose:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-viewmodel-compose-android:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-viewmodel-ktx:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-viewmodel-compose:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-viewmodel-savedstate-android:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-viewmodel-ktx:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-viewmodel-savedstate:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-viewmodel-savedstate-android:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.lifecycle:lifecycle-viewmodel:2.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-viewmodel-savedstate:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.loader:loader:1.0.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.lifecycle:lifecycle-viewmodel:2.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.navigation3:navigation3-runtime-android:1.2.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.loader:loader:1.0.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.navigation3:navigation3-runtime:1.2.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.navigation3:navigation3-runtime-android:1.2.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.navigation3:navigation3-ui-android:1.2.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.navigation3:navigation3-runtime:1.2.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.navigation3:navigation3-ui:1.2.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.navigation3:navigation3-ui-android:1.2.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.navigationevent:navigationevent-android:1.1.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.navigation3:navigation3-ui:1.2.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.navigationevent:navigationevent-compose-android:1.1.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.navigationevent:navigationevent-android:1.1.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.navigationevent:navigationevent-compose:1.1.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.navigationevent:navigationevent-compose-android:1.1.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.navigationevent:navigationevent:1.1.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.navigationevent:navigationevent-compose:1.1.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.profileinstaller:profileinstaller:1.4.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.navigationevent:navigationevent:1.1.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.savedstate:savedstate-android:1.4.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.profileinstaller:profileinstaller:1.4.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.savedstate:savedstate-compose-android:1.4.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.recyclerview:recyclerview:1.1.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.savedstate:savedstate-compose:1.4.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.savedstate:savedstate-android:1.4.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.savedstate:savedstate-ktx:1.4.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.savedstate:savedstate-compose-android:1.4.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.savedstate:savedstate:1.4.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.savedstate:savedstate-compose:1.4.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.startup:startup-runtime:1.1.1=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.savedstate:savedstate-ktx:1.4.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.savedstate:savedstate:1.4.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.startup:startup-runtime:1.1.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.test.espresso:espresso-core:3.7.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath androidx.test.espresso:espresso-core:3.7.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.test.espresso:espresso-idling-resource:3.7.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath androidx.test.espresso:espresso-idling-resource:3.7.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.test.ext:junit:1.1.5=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath androidx.test.ext:junit:1.1.5=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.test.services:storage:1.6.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath androidx.test.services:storage:1.6.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.test:core:1.7.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath androidx.test:core:1.7.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.test:monitor:1.8.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath androidx.test:monitor:1.8.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.test:rules:1.4.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.test:runner:1.7.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath androidx.test:runner:1.7.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.tracing:tracing-android:2.0.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.tracing:tracing-android:2.0.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.tracing:tracing:1.1.0=debugAndroidTestCompileClasspath androidx.tracing:tracing:1.1.0=debugAndroidTestCompileClasspath
androidx.tracing:tracing:2.0.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.tracing:tracing:2.0.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.vectordrawable:vectordrawable-animated:1.1.0=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.transition:transition:1.2.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.vectordrawable:vectordrawable:1.1.0=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.vectordrawable:vectordrawable-animated:1.1.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.versionedparcelable:versionedparcelable:1.1.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.vectordrawable:vectordrawable:1.1.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.viewpager:viewpager:1.0.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.versionedparcelable:versionedparcelable:1.1.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.window:window-core-android:1.5.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.viewpager2:viewpager2:1.0.0=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
androidx.window:window-core:1.5.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.viewpager:viewpager:1.0.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.window:window:1.5.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath androidx.window:window-core-android:1.5.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.window:window-core:1.5.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
androidx.window:window:1.5.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
ch.qos.logback:logback-classic:1.3.15=ktlint ch.qos.logback:logback-classic:1.3.15=ktlint
ch.qos.logback:logback-core:1.3.15=ktlint ch.qos.logback:logback-core:1.3.15=ktlint
com.android.tools.analytics-library:protos:32.4.1=androidLintTool com.android.tools.analytics-library:protos:32.4.1=androidLintTool
@@ -164,31 +172,37 @@ com.android.tools:sdk-common:32.4.1=androidLintTool
com.android.tools:sdklib:32.4.1=androidLintTool com.android.tools:sdklib:32.4.1=androidLintTool
com.github.ajalt.clikt:clikt-jvm:5.0.3=ktlint com.github.ajalt.clikt:clikt-jvm:5.0.3=ktlint
com.github.ajalt.clikt:clikt:5.0.3=ktlint com.github.ajalt.clikt:clikt:5.0.3=ktlint
com.google.code.findbugs:jsr305:3.0.2=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,androidLintTool,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:4.1.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
com.google.android.material:material:1.2.0-rc01=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
com.google.code.findbugs:jsr305:3.0.2=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,androidLintTool,benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
com.google.code.gson:gson:2.11.0=androidLintTool com.google.code.gson:gson:2.11.0=androidLintTool
com.google.dagger:dagger-compiler:2.60.1=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath com.google.dagger:dagger-compiler:2.60.1=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
com.google.dagger:dagger-lint-aar:2.60.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath com.google.dagger:dagger-lint-aar:2.60.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
com.google.dagger:dagger-spi:2.60.1=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath com.google.dagger:dagger-spi:2.60.1=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
com.google.dagger:dagger:2.60.1=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath com.google.dagger:dagger:2.60.1=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
com.google.dagger:hilt-android:2.60.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath com.google.dagger:hilt-android:2.60.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
com.google.dagger:hilt-compiler:2.60.1=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath com.google.dagger:hilt-compiler:2.60.1=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
com.google.dagger:hilt-core:2.60.1=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath com.google.dagger:hilt-core:2.60.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
com.google.devtools.ksp:symbol-processing-api:2.3.12=kotlinCompilerPluginClasspathDebug,kotlinCompilerPluginClasspathDebugAndroidTest,kotlinCompilerPluginClasspathDebugUnitTest,kotlinCompilerPluginClasspathRelease,kspPluginClasspath,kspPluginClasspathNonEmbeddable com.google.devtools.ksp:symbol-processing-api:2.3.12=kotlinCompilerPluginClasspathBenchmark,kotlinCompilerPluginClasspathDebug,kotlinCompilerPluginClasspathDebugAndroidTest,kotlinCompilerPluginClasspathDebugUnitTest,kotlinCompilerPluginClasspathProfile,kotlinCompilerPluginClasspathRelease,kspPluginClasspath,kspPluginClasspathNonEmbeddable
com.google.devtools.ksp:symbol-processing-api:2.3.7=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath com.google.devtools.ksp:symbol-processing-api:2.3.7=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
com.google.errorprone:error_prone_annotations:2.30.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath com.google.errorprone:error_prone_annotations:2.30.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
com.google.errorprone:error_prone_annotations:2.36.0=androidLintTool com.google.errorprone:error_prone_annotations:2.36.0=androidLintTool
com.google.errorprone:error_prone_annotations:2.47.0=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath com.google.errorprone:error_prone_annotations:2.47.0=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
com.google.googlejavaformat:google-java-format:1.33.0=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath com.google.googlejavaformat:google-java-format:1.33.0=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
com.google.guava:failureaccess:1.0.1=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
com.google.guava:failureaccess:1.0.2=androidLintTool com.google.guava:failureaccess:1.0.2=androidLintTool
com.google.guava:failureaccess:1.0.3=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath com.google.guava:failureaccess:1.0.3=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
com.google.guava:guava:31.0.1-android=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
com.google.guava:guava:33.4.0-jre=androidLintTool com.google.guava:guava:33.4.0-jre=androidLintTool
com.google.guava:guava:33.6.0-jre=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath com.google.guava:guava:33.6.0-jre=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
com.google.guava:listenablefuture:1.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath com.google.guava:listenablefuture:1.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,androidLintTool,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,androidLintTool,debugAndroidTestLintChecksClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
com.google.j2objc:j2objc-annotations:1.3=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
com.google.j2objc:j2objc-annotations:3.0.0=androidLintTool com.google.j2objc:j2objc-annotations:3.0.0=androidLintTool
com.google.j2objc:j2objc-annotations:3.1=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath com.google.j2objc:j2objc-annotations:3.1=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
com.google.jimfs:jimfs:1.1=androidLintTool com.google.jimfs:jimfs:1.1=androidLintTool
com.google.protobuf:protobuf-java:3.25.5=androidLintTool,unified-test-platform-gradle-work-action com.google.protobuf:protobuf-java:3.25.5=androidLintTool,unified-test-platform-gradle-work-action
com.google.protobuf:protobuf-javalite:3.19.1=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
com.pinterest.ktlint:ktlint-cli-reporter-baseline:1.7.1=ktlint,ktlintBaselineReporter com.pinterest.ktlint:ktlint-cli-reporter-baseline:1.7.1=ktlint,ktlintBaselineReporter
com.pinterest.ktlint:ktlint-cli-reporter-checkstyle:1.7.1=ktlint com.pinterest.ktlint:ktlint-cli-reporter-checkstyle:1.7.1=ktlint
com.pinterest.ktlint:ktlint-cli-reporter-core:1.7.1=ktlint,ktlintBaselineReporter com.pinterest.ktlint:ktlint-cli-reporter-core:1.7.1=ktlint,ktlintBaselineReporter
@@ -204,8 +218,8 @@ com.pinterest.ktlint:ktlint-logger:1.7.1=ktlint,ktlintBaselineReporter,ktlintRul
com.pinterest.ktlint:ktlint-rule-engine-core:1.7.1=ktlint,ktlintBaselineReporter,ktlintRuleset com.pinterest.ktlint:ktlint-rule-engine-core:1.7.1=ktlint,ktlintBaselineReporter,ktlintRuleset
com.pinterest.ktlint:ktlint-rule-engine:1.7.1=ktlint com.pinterest.ktlint:ktlint-rule-engine:1.7.1=ktlint
com.pinterest.ktlint:ktlint-ruleset-standard:1.7.1=ktlint,ktlintRuleset com.pinterest.ktlint:ktlint-ruleset-standard:1.7.1=ktlint,ktlintRuleset
com.squareup:javapoet:1.13.0=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath com.squareup:javapoet:1.13.0=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
com.squareup:kotlinpoet:1.11.0=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath com.squareup:kotlinpoet:1.11.0=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
com.sun.istack:istack-commons-runtime:3.0.8=androidLintTool com.sun.istack:istack-commons-runtime:3.0.8=androidLintTool
com.sun.xml.fastinfoset:FastInfoset:1.2.16=androidLintTool com.sun.xml.fastinfoset:FastInfoset:1.2.16=androidLintTool
commons-codec:commons-codec:1.17.1=androidLintTool commons-codec:commons-codec:1.17.1=androidLintTool
@@ -218,14 +232,14 @@ io.github.detekt.sarif4k:sarif4k:0.6.0=ktlint,ktlintReporter
io.github.oshai:kotlin-logging-jvm:7.0.7=ktlint,ktlintBaselineReporter,ktlintReporter,ktlintRuleset io.github.oshai:kotlin-logging-jvm:7.0.7=ktlint,ktlintBaselineReporter,ktlintReporter,ktlintRuleset
io.github.oshai:kotlin-logging:5.1.0=ktlint,ktlintBaselineReporter,ktlintReporter io.github.oshai:kotlin-logging:5.1.0=ktlint,ktlintBaselineReporter,ktlintReporter
jakarta.activation:jakarta.activation-api:1.2.1=androidLintTool jakarta.activation:jakarta.activation-api:1.2.1=androidLintTool
jakarta.inject:jakarta.inject-api:2.0.1=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath jakarta.inject:jakarta.inject-api:2.0.1=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
jakarta.xml.bind:jakarta.xml.bind-api:2.3.2=androidLintTool jakarta.xml.bind:jakarta.xml.bind-api:2.3.2=androidLintTool
javax.inject:javax.inject:1=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,androidLintTool,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath javax.inject:javax.inject:1=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,androidLintTool,benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
junit:junit:4.13.2=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath junit:junit:4.13.2=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath
net.java.dev.jna:jna-platform:5.6.0=androidLintTool net.java.dev.jna:jna-platform:5.6.0=androidLintTool
net.java.dev.jna:jna:5.19.1=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath net.java.dev.jna:jna:5.19.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
net.java.dev.jna:jna:5.6.0=androidLintTool net.java.dev.jna:jna:5.6.0=androidLintTool
net.ltgt.gradle.incap:incap:0.2=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath net.ltgt.gradle.incap:incap:0.2=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
net.sf.kxml:kxml2:2.3.0=androidLintTool net.sf.kxml:kxml2:2.3.0=androidLintTool
org.apache.commons:commons-compress:1.27.1=androidLintTool org.apache.commons:commons-compress:1.27.1=androidLintTool
org.apache.commons:commons-lang3:3.16.0=androidLintTool org.apache.commons:commons-lang3:3.16.0=androidLintTool
@@ -237,7 +251,9 @@ org.apache.httpcomponents:httpmime:4.5.6=androidLintTool
org.bouncycastle:bcpkix-jdk18on:1.80.2=androidLintTool org.bouncycastle:bcpkix-jdk18on:1.80.2=androidLintTool
org.bouncycastle:bcprov-jdk18on:1.80.2=androidLintTool org.bouncycastle:bcprov-jdk18on:1.80.2=androidLintTool
org.bouncycastle:bcutil-jdk18on:1.80.2=androidLintTool org.bouncycastle:bcutil-jdk18on:1.80.2=androidLintTool
org.checkerframework:checker-compat-qual:2.5.3=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath org.checkerframework:checker-compat-qual:2.5.3=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
org.checkerframework:checker-compat-qual:2.5.5=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
org.checkerframework:checker-qual:3.22.1=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
org.checkerframework:checker-qual:3.43.0=androidLintTool org.checkerframework:checker-qual:3.43.0=androidLintTool
org.ec4j.core:ec4j-core:1.1.1=ktlint,ktlintBaselineReporter,ktlintRuleset org.ec4j.core:ec4j-core:1.1.1=ktlint,ktlintBaselineReporter,ktlintRuleset
org.glassfish.jaxb:jaxb-runtime:2.3.2=androidLintTool org.glassfish.jaxb:jaxb-runtime:2.3.2=androidLintTool
@@ -257,51 +273,52 @@ org.jetbrains.kotlin:kotlin-compiler-embeddable:2.4.0=kotlinAbiValidationCompatC
org.jetbrains.kotlin:kotlin-compiler-embeddable:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath org.jetbrains.kotlin:kotlin-compiler-embeddable:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:2.4.0=kotlinAbiValidationCompatClasspath org.jetbrains.kotlin:kotlin-compiler-runner:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath org.jetbrains.kotlin:kotlin-compiler-runner:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-compose-compiler-plugin-embeddable:2.4.21=kotlin-extension,kotlinCompilerPluginClasspathDebug,kotlinCompilerPluginClasspathDebugAndroidTest,kotlinCompilerPluginClasspathDebugUnitTest,kotlinCompilerPluginClasspathRelease org.jetbrains.kotlin:kotlin-compose-compiler-plugin-embeddable:2.4.21=kotlin-extension,kotlinCompilerPluginClasspathBenchmark,kotlinCompilerPluginClasspathDebug,kotlinCompilerPluginClasspathDebugAndroidTest,kotlinCompilerPluginClasspathDebugUnitTest,kotlinCompilerPluginClasspathProfile,kotlinCompilerPluginClasspathRelease
org.jetbrains.kotlin:kotlin-daemon-client:2.4.0=kotlinAbiValidationCompatClasspath org.jetbrains.kotlin:kotlin-daemon-client:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-daemon-client:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath org.jetbrains.kotlin:kotlin-daemon-client:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.0=ktlint,ktlintBaselineReporter,ktlintRuleset org.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.0=ktlint,ktlintBaselineReporter,ktlintRuleset
org.jetbrains.kotlin:kotlin-daemon-embeddable:2.4.0=kotlinAbiValidationCompatClasspath org.jetbrains.kotlin:kotlin-daemon-embeddable:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath org.jetbrains.kotlin:kotlin-daemon-embeddable:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-metadata-jvm:2.3.21=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath org.jetbrains.kotlin:kotlin-metadata-jvm:2.3.21=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
org.jetbrains.kotlin:kotlin-reflect:1.6.10=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kotlinAbiValidationCompatClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,ktlint,ktlintBaselineReporter,ktlintRuleset org.jetbrains.kotlin:kotlin-reflect:1.6.10=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kotlinAbiValidationCompatClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,ktlint,ktlintBaselineReporter,ktlintRuleset
org.jetbrains.kotlin:kotlin-reflect:2.2.10=androidLintTool org.jetbrains.kotlin:kotlin-reflect:2.2.10=androidLintTool
org.jetbrains.kotlin:kotlin-script-runtime:2.2.0=ktlint,ktlintBaselineReporter,ktlintRuleset org.jetbrains.kotlin:kotlin-script-runtime:2.2.0=ktlint,ktlintBaselineReporter,ktlintRuleset
org.jetbrains.kotlin:kotlin-script-runtime:2.4.0=kotlinAbiValidationCompatClasspath org.jetbrains.kotlin:kotlin-script-runtime:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-script-runtime:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath org.jetbrains.kotlin:kotlin-script-runtime:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0=ktlintReporter org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0=ktlintReporter
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,ktlintReporter org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,ktlintReporter
org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.10=androidLintTool,unified-test-platform-gradle-work-action org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.10=androidLintTool,unified-test-platform-gradle-work-action
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,ktlintReporter org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,ktlintReporter
org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.10=androidLintTool,unified-test-platform-gradle-work-action org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.10=androidLintTool,unified-test-platform-gradle-work-action
org.jetbrains.kotlin:kotlin-stdlib:2.2.0=ktlint,ktlintBaselineReporter,ktlintReporter,ktlintRuleset org.jetbrains.kotlin:kotlin-stdlib:2.2.0=ktlint,ktlintBaselineReporter,ktlintReporter,ktlintRuleset
org.jetbrains.kotlin:kotlin-stdlib:2.2.10=androidLintTool,unified-test-platform-gradle-work-action org.jetbrains.kotlin:kotlin-stdlib:2.2.10=androidLintTool,unified-test-platform-gradle-work-action
org.jetbrains.kotlin:kotlin-stdlib:2.2.21=composeMappingProducerClasspath org.jetbrains.kotlin:kotlin-stdlib:2.2.21=composeMappingProducerClasspath
org.jetbrains.kotlin:kotlin-stdlib:2.3.20=kotlinCompilerPluginClasspathDebug,kotlinCompilerPluginClasspathDebugAndroidTest,kotlinCompilerPluginClasspathDebugUnitTest,kotlinCompilerPluginClasspathRelease,kspPluginClasspath,kspPluginClasspathNonEmbeddable org.jetbrains.kotlin:kotlin-stdlib:2.3.20=kotlinCompilerPluginClasspathBenchmark,kotlinCompilerPluginClasspathDebug,kotlinCompilerPluginClasspathDebugAndroidTest,kotlinCompilerPluginClasspathDebugUnitTest,kotlinCompilerPluginClasspathProfile,kotlinCompilerPluginClasspathRelease,kspPluginClasspath,kspPluginClasspathNonEmbeddable
org.jetbrains.kotlin:kotlin-stdlib:2.3.21=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath org.jetbrains.kotlin:kotlin-stdlib:2.3.21=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath
org.jetbrains.kotlin:kotlin-stdlib:2.4.0=kotlinAbiValidationCompatClasspath org.jetbrains.kotlin:kotlin-stdlib:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-stdlib:2.4.21=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath org.jetbrains.kotlin:kotlin-stdlib:2.4.21=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
org.jetbrains.kotlin:kotlin-tooling-core:2.4.21=kotlinAbiValidationCompatClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath org.jetbrains.kotlin:kotlin-tooling-core:2.4.21=kotlinAbiValidationCompatClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath org.jetbrains.kotlinx:kotlinx-coroutines-android:1.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0=androidLintTool,unified-test-platform-gradle-work-action org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0=androidLintTool,unified-test-platform-gradle-work-action
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinAbiValidationCompatClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,ktlint,ktlintBaselineReporter,ktlintRuleset org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinAbiValidationCompatClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,ktlint,ktlintBaselineReporter,ktlintRuleset
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0=androidLintTool,unified-test-platform-gradle-work-action org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0=androidLintTool,unified-test-platform-gradle-work-action
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0=androidLintTool,unified-test-platform-gradle-work-action org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0=androidLintTool,unified-test-platform-gradle-work-action
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath org.jetbrains.kotlinx:kotlinx-coroutines-test:1.11.0=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.4.1=ktlintReporter org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.4.1=ktlintReporter
org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-serialization-core:1.4.1=ktlintReporter org.jetbrains.kotlinx:kotlinx-serialization-core:1.4.1=ktlintReporter
org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.4.1=ktlintReporter org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.4.1=ktlintReporter
org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1=ktlintReporter org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1=ktlintReporter
org.jetbrains:annotations:13.0=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,composeMappingProducerClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kotlinAbiValidationCompatClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathDebug,kotlinCompilerPluginClasspathDebugAndroidTest,kotlinCompilerPluginClasspathDebugUnitTest,kotlinCompilerPluginClasspathRelease,kspDebugKotlinProcessorClasspath,kspPluginClasspath,kspPluginClasspathNonEmbeddable,kspReleaseKotlinProcessorClasspath,ktlint,ktlintBaselineReporter,ktlintReporter,ktlintRuleset org.jetbrains:annotations:13.0=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,composeMappingProducerClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kotlinAbiValidationCompatClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathBenchmark,kotlinCompilerPluginClasspathDebug,kotlinCompilerPluginClasspathDebugAndroidTest,kotlinCompilerPluginClasspathDebugUnitTest,kotlinCompilerPluginClasspathProfile,kotlinCompilerPluginClasspathRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspPluginClasspath,kspPluginClasspathNonEmbeddable,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,ktlint,ktlintBaselineReporter,ktlintReporter,ktlintRuleset
org.jetbrains:annotations:23.0.0=androidLintTool,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath,unified-test-platform-gradle-work-action org.jetbrains:annotations:23.0.0=androidLintTool,benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath,unified-test-platform-gradle-work-action
org.jspecify:jspecify:1.0.0=_agp_internal_debug_kspClasspath,_agp_internal_release_kspClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorRelease,kspDebugKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath org.jsoup:jsoup:1.15.1=debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath
org.jspecify:jspecify:1.0.0=_agp_internal_benchmark_kspClasspath,_agp_internal_debug_kspClasspath,_agp_internal_profile_kspClasspath,_agp_internal_release_kspClasspath,benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestCompileClasspath,debugAndroidTestLintChecksClasspath,debugAndroidTestRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,hiltAnnotationProcessorBenchmark,hiltAnnotationProcessorDebug,hiltAnnotationProcessorDebugAndroidTest,hiltAnnotationProcessorDebugUnitTest,hiltAnnotationProcessorProfile,hiltAnnotationProcessorRelease,kspBenchmarkKotlinProcessorClasspath,kspDebugKotlinProcessorClasspath,kspProfileKotlinProcessorClasspath,kspReleaseKotlinProcessorClasspath,profileCompileClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseCompileClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
org.junit.platform:junit-platform-commons:1.13.3=unified-test-platform-gradle-work-action org.junit.platform:junit-platform-commons:1.13.3=unified-test-platform-gradle-work-action
org.junit.platform:junit-platform-engine:1.13.3=unified-test-platform-gradle-work-action org.junit.platform:junit-platform-engine:1.13.3=unified-test-platform-gradle-work-action
org.junit.platform:junit-platform-launcher:1.13.3=unified-test-platform-gradle-work-action org.junit.platform:junit-platform-launcher:1.13.3=unified-test-platform-gradle-work-action
@@ -315,5 +332,5 @@ org.ow2.asm:asm-tree:9.9.1=composeMappingProducerClasspath
org.ow2.asm:asm:9.9=androidLintTool org.ow2.asm:asm:9.9=androidLintTool
org.ow2.asm:asm:9.9.1=composeMappingProducerClasspath org.ow2.asm:asm:9.9.1=composeMappingProducerClasspath
org.slf4j:slf4j-api:2.0.7=ktlint org.slf4j:slf4j-api:2.0.7=ktlint
rustls:rustls-platform-verifier:0.1.1=debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath rustls:rustls-platform-verifier:0.1.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugAndroidTestLintChecksClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugUnitTestLintChecksClasspath,debugUnitTestRuntimeClasspath,profileLintChecksClasspath,profileRuntimeClasspath,releaseLintChecksClasspath,releaseRuntimeClasspath
empty=_agp_internal_debugAndroidTest_kspClasspath,_agp_internal_debugUnitTest_kspClasspath,androidApis,androidJdkImage,androidTestUtil,coreLibraryDesugaring,debugAndroidTestAnnotationProcessorClasspath,debugAndroidTestImplementationDependenciesMetadata,debugAnnotationProcessorClasspath,debugImplementationDependenciesMetadata,debugReverseMetadataValues,debugUnitTestAnnotationProcessorClasspath,debugUnitTestImplementationDependenciesMetadata,hiltCompileOnlyDebug,hiltCompileOnlyDebugAndroidTest,hiltCompileOnlyDebugUnitTest,hiltCompileOnlyRelease,kotlinCompilerPluginClasspath,kspDebugAndroidTestKotlinProcessorClasspath,kspDebugUnitTestKotlinProcessorClasspath,lintChecks,lintPublish,releaseAnnotationProcessorClasspath,releaseImplementationDependenciesMetadata,releaseReverseMetadataValues empty=_agp_internal_debugAndroidTest_kspClasspath,_agp_internal_debugUnitTest_kspClasspath,androidApis,androidJdkImage,androidTestUtil,benchmarkAnnotationProcessorClasspath,benchmarkImplementationDependenciesMetadata,benchmarkReverseMetadataValues,coreLibraryDesugaring,debugAndroidTestAnnotationProcessorClasspath,debugAndroidTestImplementationDependenciesMetadata,debugAnnotationProcessorClasspath,debugImplementationDependenciesMetadata,debugReverseMetadataValues,debugUnitTestAnnotationProcessorClasspath,debugUnitTestImplementationDependenciesMetadata,hiltCompileOnlyBenchmark,hiltCompileOnlyDebug,hiltCompileOnlyDebugAndroidTest,hiltCompileOnlyDebugUnitTest,hiltCompileOnlyProfile,hiltCompileOnlyRelease,kotlinCompilerPluginClasspath,kspDebugAndroidTestKotlinProcessorClasspath,kspDebugUnitTestKotlinProcessorClasspath,lintChecks,lintPublish,profileAnnotationProcessorClasspath,profileReverseMetadataValues,releaseAnnotationProcessorClasspath,releaseImplementationDependenciesMetadata,releaseReverseMetadataValues
@@ -13,6 +13,7 @@ import androidx.compose.ui.test.assertHeightIsAtLeast
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsSelected import androidx.compose.ui.test.assertIsSelected
import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasTestTag
import androidx.compose.ui.test.junit4.accessibility.enableAccessibilityChecks
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText
@@ -41,12 +42,17 @@ import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
class AdaptiveShellTest { class AdaptiveShellTest {
@get:Rule val compose = createAndroidComposeRule<MainActivity>() @get:Rule val compose = createAndroidComposeRule<MainActivity>()
@Before fun enableChecks() {
compose.enableAccessibilityChecks()
}
@Test fun independentPreferencesStackAndSafeRecreationUseCompactAndExpandedNavigation() { @Test fun independentPreferencesStackAndSafeRecreationUseCompactAndExpandedNavigation() {
val original = ViewModelProvider(compose.activity)[ShellViewModel::class.java] val original = ViewModelProvider(compose.activity)[ShellViewModel::class.java]
val setup = ViewModelProvider(compose.activity)[SetupFormViewModel::class.java] val setup = ViewModelProvider(compose.activity)[SetupFormViewModel::class.java]
@@ -253,7 +259,7 @@ class AdaptiveShellTest {
compose.runOnIdle { assertFalse(original.editor.state.value.open) } compose.runOnIdle { assertFalse(original.editor.state.value.open) }
} }
private class Fixture : ShellRepository { internal class Fixture : ShellRepository {
override val snapshot = MutableStateFlow( override val snapshot = MutableStateFlow(
ShellSnapshot( ShellSnapshot(
ShellState.Locked, ShellState.Locked,
@@ -3,6 +3,7 @@ package de.rfc1437.ironstorage
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsNotEnabled import androidx.compose.ui.test.assertIsNotEnabled
import androidx.compose.ui.test.junit4.accessibility.enableAccessibilityChecks
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performClick
@@ -16,12 +17,17 @@ import de.rfc1437.ironstorage.features.AuthenticationControls
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
class AuthenticationScreenTest { class AuthenticationScreenTest {
@get:Rule val compose = createAndroidComposeRule<MainActivity>() @get:Rule val compose = createAndroidComposeRule<MainActivity>()
@Before fun enableChecks() {
compose.enableAccessibilityChecks()
}
@Test fun enrollmentRequiresExplicitSubmissionAndTypedSuccessBeforeDisplayingEnabled() { @Test fun enrollmentRequiresExplicitSubmissionAndTypedSuccessBeforeDisplayingEnabled() {
val repository = Fixture() val repository = Fixture()
compose.activity.runOnUiThread { compose.activity.runOnUiThread {
@@ -14,6 +14,7 @@ import androidx.compose.ui.semantics.SemanticsProperties
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasTestTag
import androidx.compose.ui.test.hasText import androidx.compose.ui.test.hasText
import androidx.compose.ui.test.junit4.accessibility.enableAccessibilityChecks
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText
@@ -38,12 +39,17 @@ import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
class EntryEditorScreenTest { class EntryEditorScreenTest {
@get:Rule val compose = createAndroidComposeRule<MainActivity>() @get:Rule val compose = createAndroidComposeRule<MainActivity>()
@Before fun enableChecks() {
compose.enableAccessibilityChecks()
}
@Test fun structuredInputsGenerationAndAccessibleReorderForwardTypedIds() { @Test fun structuredInputsGenerationAndAccessibleReorderForwardTypedIds() {
val repository = Fixture() val repository = Fixture()
val lease = MutableStateFlow(AuthenticationState(unlocked = true)) val lease = MutableStateFlow(AuthenticationState(unlocked = true))
@@ -140,6 +146,54 @@ class EntryEditorScreenTest {
} }
} }
@Test fun hiddenEditorValuesAreAbsentFromAndroidAccessibilityNodes() {
val repository = Fixture()
val authentication = object : AuthenticationRepository by compose.activity.authentication {
override val state = MutableStateFlow(AuthenticationState(unlocked = true))
override val presentation = ProtectedPresentation()
}
compose.activity.runOnUiThread {
compose.activity.setProtectedTestContent(authentication.presentation) {
MaterialTheme { EntryEditorScreen(repository, authentication) }
}
}
compose.onNodeWithTag("editor-value-41").assertIsDisplayed()
val markers = repository.state.value.fields.mapNotNull { it.value }
val automation = InstrumentationRegistry.getInstrumentation().uiAutomation
var active: android.view.accessibility.AccessibilityNodeInfo? = null
compose.waitUntil(10000) {
active = automation.rootInActiveWindow
active != null
}
val root = requireNotNull(active)
@Suppress("DEPRECATION")
fun inspect(node: android.view.accessibility.AccessibilityNodeInfo) {
try {
val announced = listOf(
node.text,
node.contentDescription,
node.hintText
).mapNotNull {
it?.toString()
}
assertTrue(
"Hidden values must never be announced",
markers.none { marker ->
announced.any {
marker in
it
}
}
)
repeat(node.childCount) { index -> node.getChild(index)?.let(::inspect) }
} finally {
node.recycle()
}
}
inspect(root)
}
private class Fixture : EditorRepository { private class Fixture : EditorRepository {
override val state = MutableStateFlow( override val state = MutableStateFlow(
EditorState( EditorState(
@@ -15,6 +15,7 @@ import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.hasSetTextAction import androidx.compose.ui.test.hasSetTextAction
import androidx.compose.ui.test.hasText import androidx.compose.ui.test.hasText
import androidx.compose.ui.test.junit4.accessibility.enableAccessibilityChecks
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithTag
@@ -47,6 +48,7 @@ import java.util.concurrent.TimeUnit
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assume.assumeTrue import org.junit.Assume.assumeTrue
import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
@@ -54,6 +56,10 @@ import org.junit.Test
class EntryViewerTest { class EntryViewerTest {
@get:Rule val compose = createAndroidComposeRule<MainActivity>() @get:Rule val compose = createAndroidComposeRule<MainActivity>()
@Before fun enableChecks() {
compose.enableAccessibilityChecks()
}
@Test fun maskedFieldsExplicitActionsEditorDiagnosticsAndRevocation() { @Test fun maskedFieldsExplicitActionsEditorDiagnosticsAndRevocation() {
val repository = Fixture() val repository = Fixture()
compose.activity.runOnUiThread { compose.activity.runOnUiThread {
@@ -5,6 +5,7 @@ import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsNotEnabled import androidx.compose.ui.test.assertIsNotEnabled
import androidx.compose.ui.test.hasScrollAction import androidx.compose.ui.test.hasScrollAction
import androidx.compose.ui.test.hasText import androidx.compose.ui.test.hasText
import androidx.compose.ui.test.junit4.accessibility.enableAccessibilityChecks
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
import androidx.compose.ui.test.onAllNodesWithText import androidx.compose.ui.test.onAllNodesWithText
import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText
@@ -32,11 +33,16 @@ import de.rfc1437.ironstorage.features.HomeScreen
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
class HomeScreenTest { class HomeScreenTest {
@get:Rule val compose = createAndroidComposeRule<MainActivity>() @get:Rule val compose = createAndroidComposeRule<MainActivity>()
@Before fun enableChecks() {
compose.enableAccessibilityChecks()
}
private fun show(repository: Fixture) { private fun show(repository: Fixture) {
compose.activity.runOnUiThread { compose.activity.runOnUiThread {
compose.activity.setProtectedTestContent { MaterialTheme { HomeScreen(repository) } } compose.activity.setProtectedTestContent { MaterialTheme { HomeScreen(repository) } }
@@ -2,6 +2,7 @@ package de.rfc1437.ironstorage
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.accessibility.enableAccessibilityChecks
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performClick
@@ -15,12 +16,17 @@ import de.rfc1437.ironstorage.features.SetupFormViewModel
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
class OnboardingScreenTest { class OnboardingScreenTest {
@get:Rule val compose = createAndroidComposeRule<MainActivity>() @get:Rule val compose = createAndroidComposeRule<MainActivity>()
@Before fun enableChecks() {
compose.enableAccessibilityChecks()
}
@Test fun localAndRemoteFormsUseTypedFacadeAndClearSubmittedSecrets() { @Test fun localAndRemoteFormsUseTypedFacadeAndClearSubmittedSecrets() {
val repository = FixtureRepository() val repository = FixtureRepository()
val secrets = SetupFormViewModel() val secrets = SetupFormViewModel()
@@ -12,6 +12,7 @@ import androidx.compose.ui.platform.LocalInputModeManager
import androidx.compose.ui.semantics.SemanticsActions import androidx.compose.ui.semantics.SemanticsActions
import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.accessibility.enableAccessibilityChecks
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
import androidx.compose.ui.test.onAllNodesWithText import androidx.compose.ui.test.onAllNodesWithText
import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText
@@ -37,6 +38,7 @@ import de.rfc1437.ironstorage.features.PasswordScreen
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
@@ -44,6 +46,10 @@ import org.junit.Test
class PasswordScreenTest { class PasswordScreenTest {
@get:Rule val compose = createAndroidComposeRule<MainActivity>() @get:Rule val compose = createAndroidComposeRule<MainActivity>()
@Before fun enableChecks() {
compose.enableAccessibilityChecks()
}
@Test fun foldersActionsDetailAndStaleRefreshUseOnlyTypedIdentities() { @Test fun foldersActionsDetailAndStaleRefreshUseOnlyTypedIdentities() {
compose.activity.runOnUiThread { compose.activity.runOnUiThread {
compose.activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT compose.activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
@@ -19,6 +19,7 @@ import androidx.compose.ui.platform.InterceptPlatformTextInput
import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.hasSetTextAction import androidx.compose.ui.test.hasSetTextAction
import androidx.compose.ui.test.junit4.accessibility.enableAccessibilityChecks
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performClick
@@ -36,6 +37,7 @@ import org.junit.Assert.assertFalse
import org.junit.Assert.assertNull import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Assume.assumeTrue import org.junit.Assume.assumeTrue
import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
@@ -43,6 +45,10 @@ import org.junit.Test
class PresentationSecurityTest { class PresentationSecurityTest {
@get:Rule val compose = createAndroidComposeRule<MainActivity>() @get:Rule val compose = createAndroidComposeRule<MainActivity>()
@Before fun enableChecks() {
compose.enableAccessibilityChecks()
}
@Test fun inspectTaskSwitchingWithDisposableProtectedInput() { @Test fun inspectTaskSwitchingWithDisposableProtectedInput() {
assumeTrue(InstrumentationRegistry.getArguments().getString("securityInspect") == "true") assumeTrue(InstrumentationRegistry.getArguments().getString("securityInspect") == "true")
val done = CountDownLatch(1) val done = CountDownLatch(1)
@@ -2,6 +2,10 @@ package de.rfc1437.ironstorage
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.unit.LayoutDirection
import androidx.test.platform.app.InstrumentationRegistry
import de.rfc1437.ironstorage.core.ProtectedPresentation import de.rfc1437.ironstorage.core.ProtectedPresentation
import de.rfc1437.ironstorage.features.ProtectedContent import de.rfc1437.ironstorage.features.ProtectedContent
@@ -10,5 +14,13 @@ internal fun MainActivity.setProtectedTestContent(
presentation: ProtectedPresentation = authentication.presentation, presentation: ProtectedPresentation = authentication.presentation,
content: @Composable () -> Unit content: @Composable () -> Unit
) { ) {
setContent { ProtectedContent(presentation, content) } val rtl = InstrumentationRegistry.getArguments().getString("hardeningRtl") == "true"
setContent {
CompositionLocalProvider(
LocalLayoutDirection provides
if (rtl) LayoutDirection.Rtl else LocalLayoutDirection.current
) {
ProtectedContent(presentation, content)
}
}
} }
@@ -9,6 +9,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.ui.semantics.SemanticsActions import androidx.compose.ui.semantics.SemanticsActions
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.accessibility.enableAccessibilityChecks
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performClick
@@ -30,12 +31,17 @@ import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assume.assumeTrue import org.junit.Assume.assumeTrue
import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
class SearchScreenTest { class SearchScreenTest {
@get:Rule val compose = createAndroidComposeRule<MainActivity>() @get:Rule val compose = createAndroidComposeRule<MainActivity>()
@Before fun enableChecks() {
compose.enableAccessibilityChecks()
}
@Test fun inspectSearchWithComputerUse() { @Test fun inspectSearchWithComputerUse() {
assumeTrue(InstrumentationRegistry.getArguments().getString("searchInspect") == "true") assumeTrue(InstrumentationRegistry.getArguments().getString("searchInspect") == "true")
val repository = Fixture() val repository = Fixture()
@@ -9,6 +9,7 @@ import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertTextContains import androidx.compose.ui.test.assertTextContains
import androidx.compose.ui.test.assertWidthIsAtLeast import androidx.compose.ui.test.assertWidthIsAtLeast
import androidx.compose.ui.test.hasText import androidx.compose.ui.test.hasText
import androidx.compose.ui.test.junit4.accessibility.enableAccessibilityChecks
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithTag
@@ -38,12 +39,17 @@ import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
class SettingsScreenTest { class SettingsScreenTest {
@get:Rule val compose = createAndroidComposeRule<MainActivity>() @get:Rule val compose = createAndroidComposeRule<MainActivity>()
@Before fun enableChecks() {
compose.enableAccessibilityChecks()
}
@Test fun searchableSettingsKeepEditsAndUseExplicitSecretAndProviderActionsAtLargeFont() { @Test fun searchableSettingsKeepEditsAndUseExplicitSecretAndProviderActionsAtLargeFont() {
val original = ViewModelProvider(compose.activity)[ShellViewModel::class.java] val original = ViewModelProvider(compose.activity)[ShellViewModel::class.java]
val setup = ViewModelProvider(compose.activity)[SetupFormViewModel::class.java] val setup = ViewModelProvider(compose.activity)[SetupFormViewModel::class.java]
@@ -158,7 +164,7 @@ class SettingsScreenTest {
authentication.presentation.clear() authentication.presentation.clear()
} }
} }
private class Fixture : SettingsRepository { internal class Fixture : SettingsRepository {
override val state = MutableStateFlow( override val state = MutableStateFlow(
SettingsState( SettingsState(
page = SettingsPage( page = SettingsPage(
@@ -3,6 +3,7 @@ package de.rfc1437.ironstorage
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.hasText import androidx.compose.ui.test.hasText
import androidx.compose.ui.test.isHeading import androidx.compose.ui.test.isHeading
import androidx.compose.ui.test.junit4.accessibility.enableAccessibilityChecks
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performClick
@@ -10,12 +11,17 @@ import androidx.compose.ui.test.performScrollTo
import de.rfc1437.ironstorage.core.ShellFixtures import de.rfc1437.ironstorage.core.ShellFixtures
import de.rfc1437.ironstorage.core.ShellState import de.rfc1437.ironstorage.core.ShellState
import de.rfc1437.ironstorage.core.ShellTab import de.rfc1437.ironstorage.core.ShellTab
import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
class ShellScreenTest { class ShellScreenTest {
@get:Rule val compose = createAndroidComposeRule<MainActivity>() @get:Rule val compose = createAndroidComposeRule<MainActivity>()
@Before fun enableChecks() {
compose.enableAccessibilityChecks()
}
@Test @Test
fun allRustFixtureStatesRender() { fun allRustFixtureStatesRender() {
ShellState.entries.forEach { state -> ShellState.entries.forEach { state ->
@@ -0,0 +1,102 @@
package de.rfc1437.ironstorage
import androidx.compose.ui.input.InputMode
import androidx.compose.ui.input.InputModeManager
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.platform.LocalInputModeManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.platform.SoftwareKeyboardController
import androidx.compose.ui.semantics.SemanticsActions
import androidx.compose.ui.test.assertHasClickAction
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.getUnclippedBoundsInRoot
import androidx.compose.ui.test.hasTestTag
import androidx.compose.ui.test.junit4.accessibility.enableAccessibilityChecks
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performKeyInput
import androidx.compose.ui.test.performScrollTo
import androidx.compose.ui.test.performScrollToNode
import androidx.compose.ui.test.performSemanticsAction
import androidx.compose.ui.test.pressKey
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModelProvider
import androidx.test.platform.app.InstrumentationRegistry
import de.rfc1437.ironstorage.core.AuthenticationRepository
import de.rfc1437.ironstorage.core.AuthenticationState
import de.rfc1437.ironstorage.core.ProtectedPresentation
import de.rfc1437.ironstorage.features.ApplicationTheme
import de.rfc1437.ironstorage.features.SetupFormViewModel
import de.rfc1437.ironstorage.features.ShellScreen
import de.rfc1437.ironstorage.features.ShellViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
/** Run on each actual resized window/density/font configuration, without unlocking data. */
class Tier2WindowTest {
@get:Rule val compose = createAndroidComposeRule<MainActivity>()
@Test fun settingsAndKeyboardNavigationFitTheCurrentWindow() {
compose.enableAccessibilityChecks()
val original = ViewModelProvider(compose.activity)[ShellViewModel::class.java]
val setup = ViewModelProvider(compose.activity)[SetupFormViewModel::class.java]
val authentication = object : AuthenticationRepository by original.authentication {
override val state = MutableStateFlow(AuthenticationState())
override val presentation = ProtectedPresentation()
override fun reload() = Unit
}
val model = ShellViewModel(
AdaptiveShellTest.Fixture(), original.onboarding, original.passwords,
original.home, original.search, authentication, original.editor,
SettingsScreenTest.Fixture(), SavedStateHandle(mapOf("shell.tab" to "Preferences"))
)
compose.runOnIdle { compose.activity.viewModelStore.put("tier2-window-fixture", model) }
lateinit var inputMode: InputModeManager
var keyboard: SoftwareKeyboardController? = null
compose.activity.runOnUiThread {
compose.activity.setProtectedTestContent(authentication.presentation) {
inputMode = LocalInputModeManager.current
keyboard = LocalSoftwareKeyboardController.current
ApplicationTheme(authentication) { ShellScreen(model, setup) }
}
}
val width =
compose.activity.window.decorView.width /
compose.activity.resources.displayMetrics.density
val navigation = if (width >= 600) "shell-navigation-rail" else "shell-bottom-navigation"
compose.onNodeWithTag(navigation).assertIsDisplayed()
compose.onNodeWithTag("settings-search").assertIsDisplayed()
if (InstrumentationRegistry.getArguments().getString("hardeningIme") == "true") {
compose.onNodeWithTag("settings-search").performClick()
compose.runOnIdle { requireNotNull(keyboard).show() }
val root = compose.activity.window.decorView
fun imeBottom() = ViewCompat.getRootWindowInsets(root)
?.getInsets(WindowInsetsCompat.Type.ime())?.bottom ?: 0
compose.waitUntil(10000) { imeBottom() > 0 }
val bottom = compose.onNodeWithTag("shell-content").getUnclippedBoundsInRoot()
.bottom.value * compose.activity.resources.displayMetrics.density
assertTrue(
"Shell content must end above the IME: $bottom",
bottom <= root.height - imeBottom()
)
compose.runOnIdle { requireNotNull(keyboard).hide() }
}
val list = compose.onNodeWithTag("settings-list")
list.performScrollToNode(hasTestTag("shell-open-appearance"))
val appearance = compose.onNodeWithTag("shell-open-appearance")
appearance.assertIsDisplayed().assertHasClickAction()
compose.runOnIdle { assertTrue(inputMode.requestInputMode(InputMode.Keyboard)) }
appearance.performSemanticsAction(SemanticsActions.RequestFocus) { assertTrue(it()) }
.performKeyInput { pressKey(Key.Enter) }
compose.onNodeWithText("System default").performScrollTo().assertIsDisplayed()
compose.onNodeWithText("Back").performScrollTo().performClick()
compose.onNodeWithTag("settings-list").performScrollToNode(hasTestTag("settings-search"))
compose.onNodeWithTag("settings-search").assertIsDisplayed()
}
}
@@ -0,0 +1,3 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application><profileable android:shell="true" /></application>
</manifest>
+1
View File
@@ -12,6 +12,7 @@
android:theme="@style/Theme.IronStorage" android:theme="@style/Theme.IronStorage"
android:usesCleartextTraffic="false"> android:usesCleartextTraffic="false">
<activity android:name=".MainActivity" android:exported="true" <activity android:name=".MainActivity" android:exported="true"
android:windowSoftInputMode="adjustResize"
android:supportsPictureInPicture="false"> android:supportsPictureInPicture="false">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
File diff suppressed because it is too large. Load diff
@@ -10,6 +10,7 @@ import android.os.Bundle
import android.view.Display import android.view.Display
import android.view.View import android.view.View
import android.view.WindowManager import android.view.WindowManager
import androidx.activity.compose.ReportDrawnWhen
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels import androidx.activity.viewModels
@@ -17,16 +18,19 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.runtime.SideEffect import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.luminance import androidx.compose.ui.graphics.luminance
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import de.rfc1437.ironstorage.core.AuthenticationLifecycle import de.rfc1437.ironstorage.core.AuthenticationLifecycle
import de.rfc1437.ironstorage.core.AuthenticationRepository import de.rfc1437.ironstorage.core.AuthenticationRepository
import de.rfc1437.ironstorage.core.OnboardingRepository import de.rfc1437.ironstorage.core.OnboardingRepository
import de.rfc1437.ironstorage.core.SettingsRepository import de.rfc1437.ironstorage.core.SettingsRepository
import de.rfc1437.ironstorage.core.ShellRepository import de.rfc1437.ironstorage.core.ShellRepository
import de.rfc1437.ironstorage.core.ShellState
import de.rfc1437.ironstorage.features.ApplicationTheme import de.rfc1437.ironstorage.features.ApplicationTheme
import de.rfc1437.ironstorage.features.ProtectedContent import de.rfc1437.ironstorage.features.ProtectedContent
import de.rfc1437.ironstorage.features.SetupFormViewModel import de.rfc1437.ironstorage.features.SetupFormViewModel
@@ -146,6 +150,8 @@ class MainActivity : FragmentActivity() {
settingsPlatform.attach(this, settings::addQrImages) settingsPlatform.attach(this, settings::addQrImages)
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
val startup by viewModel.snapshot.collectAsStateWithLifecycle()
ReportDrawnWhen { startup.state != ShellState.Loading }
ProtectedContent(authentication.presentation) { ProtectedContent(authentication.presentation) {
ApplicationTheme(authentication) { ApplicationTheme(authentication) {
val lightBars = MaterialTheme.colorScheme.background.luminance() > 0.5f val lightBars = MaterialTheme.colorScheme.background.luminance() > 0.5f
+6 -3
View File
@@ -8,6 +8,7 @@ import org.gradle.api.artifacts.ProjectDependency
plugins { plugins {
alias(libs.plugins.android.application) apply false alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) apply false alias(libs.plugins.android.library) apply false
alias(libs.plugins.android.test) apply false
alias(libs.plugins.kotlin.jvm) apply false alias(libs.plugins.kotlin.jvm) apply false
alias(libs.plugins.compose) apply false alias(libs.plugins.compose) apply false
alias(libs.plugins.hilt) apply false alias(libs.plugins.hilt) apply false
@@ -16,6 +17,7 @@ plugins {
} }
val allowed = mapOf( val allowed = mapOf(
":performance" to setOf(":app"),
":app" to setOf(":features", ":core", ":platform"), ":app" to setOf(":features", ":core", ":platform"),
":features" to setOf(":core"), ":features" to setOf(":core"),
":core" to setOf(":rust-bridge"), ":core" to setOf(":rust-bridge"),
@@ -99,7 +101,7 @@ subprojects {
outputs.file(output) outputs.file(output)
outputs.upToDateWhen { false } outputs.upToDateWhen { false }
doLast { doLast {
val rows = listOf("debugRuntimeClasspath", "releaseRuntimeClasspath", "debugAndroidTestRuntimeClasspath", "debugUnitTestRuntimeClasspath").flatMap { name -> val rows = listOf("debugRuntimeClasspath", "releaseRuntimeClasspath", "debugAndroidTestRuntimeClasspath", "debugUnitTestRuntimeClasspath", "benchmarkRuntimeClasspath").flatMap { name ->
val configuration = owner.configurations.findByName(name) val configuration = owner.configurations.findByName(name)
if (configuration == null || !configuration.isCanBeResolved) emptyList() else { if (configuration == null || !configuration.isCanBeResolved) emptyList() else {
configuration.incoming.artifactView { configuration.incoming.artifactView {
@@ -133,7 +135,8 @@ tasks.register("dependencyInventory") {
tasks.register("androidVerification") { tasks.register("androidVerification") {
dependsOn("checkArchitecture", "dependencyInventory", "auditNativePackages") dependsOn("checkArchitecture", "dependencyInventory", "auditNativePackages")
dependsOn(subprojects.map { "${it.path}:ktlintCheck" }) dependsOn(subprojects.map { "${it.path}:ktlintCheck" })
dependsOn(subprojects.map { "${it.path}:lintDebug" }) dependsOn(subprojects.filter { it.name != "performance" }.map { "${it.path}:lintDebug" })
dependsOn(subprojects.map { "${it.path}:testDebugUnitTest" }) dependsOn(subprojects.filter { it.name != "performance" }.map { "${it.path}:testDebugUnitTest" })
dependsOn(":app:assembleBenchmark", ":app:assembleProfile", ":performance:assembleBenchmark")
dependsOn(":core:assembleDebugAndroidTest", ":app:assembleDebugAndroidTest", ":rust-bridge:assembleDebugAndroidTest", ":platform:assembleDebugAndroidTest") dependsOn(":core:assembleDebugAndroidTest", ":app:assembleDebugAndroidTest", ":rust-bridge:assembleDebugAndroidTest", ":platform:assembleDebugAndroidTest")
} }
@@ -24,7 +24,7 @@ import org.junit.Test
/** Actual encrypted Rust documents and Kotlin facade, with deterministic OS capabilities. */ /** Actual encrypted Rust documents and Kotlin facade, with deterministic OS capabilities. */
class NativeEntryViewerTest { class NativeEntryViewerTest {
@Test fun fieldsEditingCopyMutationsAndTotpExpiryUseTheNativeOwner() = runBlocking { @Test fun fieldsEditingCopyMutationsAndTotpExpiryUseTheNativeOwner(): Unit = runBlocking {
val context = InstrumentationRegistry.getInstrumentation().targetContext val context = InstrumentationRegistry.getInstrumentation().targetContext
val name = "viewer-${UUID.randomUUID()}" val name = "viewer-${UUID.randomUUID()}"
val roots = listOf(context.filesDir, context.noBackupFilesDir, context.cacheDir).map { val roots = listOf(context.filesDir, context.noBackupFilesDir, context.cacheDir).map {
@@ -259,12 +259,45 @@ class NativeEntryViewerTest {
password, password,
keystore keystore
) )
withContext(Dispatchers.IO) {
val vault = File(roots[1], "ironstorage/vault")
val ciphertext = File(vault, "editor/new.gpg").readBytes()
repeat(50) { directory ->
val folder = File(vault, "load/slot-${directory.toString().padStart(3, '0')}")
assertTrue(folder.mkdirs())
repeat(20) { entry -> File(folder, "entry-$entry.gpg").writeBytes(ciphertext) }
}
val storage = session.storage()
val navigateStart = android.os.SystemClock.elapsedRealtime()
assertEquals(50, storage.passwordNavigation("load", null, null, false).rows.size)
assertEquals(
20,
storage.passwordNavigation("load/slot-000", null, null, false).rows.size
)
val navigateMs = android.os.SystemClock.elapsedRealtime() - navigateStart
assertTrue("1000-entry navigation must finish in 3 s", navigateMs < 3000)
val searchStart = android.os.SystemClock.elapsedRealtime()
assertEquals(1000, storage.passwordNameSearch("load").size)
assertEquals(20, storage.passwordNameSearch("load/slot-019").size)
val searchMs = android.os.SystemClock.elapsedRealtime() - searchStart
assertTrue("1000-entry name search must finish in 5 s", searchMs < 5000)
performance("tree_1000_navigation_ms", navigateMs)
performance("tree_1000_search_ms", searchMs)
}
} finally { } finally {
withContext(Dispatchers.Main.immediate) { repository.lock() } withContext(Dispatchers.Main.immediate) { repository.lock() }
scope.cancel() scope.cancel()
} }
} }
private fun performance(name: String, value: Long) {
android.util.Log.i("IronStoragePerformance", "$name=$value")
InstrumentationRegistry.getInstrumentation().sendStatus(
0,
android.os.Bundle().apply { putLong("ironstorage_$name", value) }
)
}
private suspend fun structuredEditorCreatesMutatesSavesAndRecoversEncryptedDrafts( private suspend fun structuredEditorCreatesMutatesSavesAndRecoversEncryptedDrafts(
authentication: NativeAuthenticationRepository, authentication: NativeAuthenticationRepository,
passwords: NativePasswordRepository, passwords: NativePasswordRepository,
@@ -344,7 +377,22 @@ class NativeEntryViewerTest {
assertNull(request { editor.save() }.error) assertNull(request { editor.save() }.error)
request { editor.begin("editor/new") } request { editor.begin("editor/new") }
val passwordId = editor.state.value.fields.first().id val passwordId = editor.state.value.fields.first().id
request { editor.change(passwordId, null, "in-memory recovered secret") } val typingStart = android.os.SystemClock.elapsedRealtimeNanos()
val updateTimes = LongArray(100)
withContext(Dispatchers.Main.immediate) {
repeat(100) {
val start = android.os.SystemClock.elapsedRealtimeNanos()
editor.change(passwordId, null, "public typing $it")
updateTimes[it] = android.os.SystemClock.elapsedRealtimeNanos() - start
}
editor.change(passwordId, null, "in-memory recovered secret")
}
val typingMs = (android.os.SystemClock.elapsedRealtimeNanos() - typingStart) / 1_000_000
assertTrue("100 input updates must finish within 500 ms", typingMs < 500)
val updateP95Us = updateTimes.sorted()[94] / 1000
assertTrue("Input update p95 must fit within 32 ms", updateP95Us < 32000)
performance("editor_100_updates_ms", typingMs)
performance("editor_update_p95_us", updateP95Us)
withContext(Dispatchers.Main.immediate) { withContext(Dispatchers.Main.immediate) {
authentication.lifecycle(AuthenticationLifecycle.Background) authentication.lifecycle(AuthenticationLifecycle.Background)
} }
@@ -424,7 +472,11 @@ class NativeEntryViewerTest {
assertEquals(45uL, settings.state.value.page!!.timeout) assertEquals(45uL, settings.state.value.page!!.timeout)
assertNotNull(request { settings.removeToken() }.error) assertNotNull(request { settings.removeToken() }.error)
assertNull(settings.state.value.page!!.account) assertNull(settings.state.value.page!!.account)
val cacheStart = android.os.SystemClock.elapsedRealtime()
assertNull(request { settings.rebuildCache(passphrase) }.error) assertNull(request { settings.rebuildCache(passphrase) }.error)
val cacheMs = android.os.SystemClock.elapsedRealtime() - cacheStart
assertTrue("Fixture cache rebuild must finish in 15 s", cacheMs < 15000)
performance("cache_rebuild_ms", cacheMs)
assertTrue(settings.state.value.page!!.cacheDetail.contains("current TOTP entries")) assertTrue(settings.state.value.page!!.cacheDetail.contains("current TOTP entries"))
val beforeEnrollment = keystore.keyCount val beforeEnrollment = keystore.keyCount
authentication.authenticated { it.enrollBiometricUnlock(passphrase) } authentication.authenticated { it.enrollBiometricUnlock(passphrase) }
@@ -481,7 +533,11 @@ class NativeEntryViewerTest {
image = output.toByteArray() image = output.toByteArray()
request { settings.closeTransfer() } request { settings.closeTransfer() }
assertTrue(frame.modules.all { it.toInt() == 0 }) assertTrue(frame.modules.all { it.toInt() == 0 })
val qrStart = android.os.SystemClock.elapsedRealtime()
assertNull(request { settings.addQrImages(listOf("content://public-fixture/qr")) }.error) assertNull(request { settings.addQrImages(listOf("content://public-fixture/qr")) }.error)
val qrMs = android.os.SystemClock.elapsedRealtime() - qrStart
assertTrue("Fixture QR analysis must finish in 5 s", qrMs < 5000)
performance("qr_analysis_ms", qrMs)
assertEquals(fingerprint, settings.state.value.transfer.ready!!.fingerprint) assertEquals(fingerprint, settings.state.value.transfer.ready!!.fingerprint)
assertNotNull(request { settings.importKey("", false, false) }.error) assertNotNull(request { settings.importKey("", false, false) }.error)
assertEquals(fingerprint, settings.state.value.transfer.ready!!.fingerprint) assertEquals(fingerprint, settings.state.value.transfer.ready!!.fingerprint)
@@ -23,7 +23,7 @@ data class EditorState(
val open: Boolean = false, val open: Boolean = false,
val locked: Boolean = false, val locked: Boolean = false,
val busy: Boolean = false, val busy: Boolean = false,
val title: String = "Entry editor", val title: String = "",
val path: String = "", val path: String = "",
val fields: List<EditorField> = emptyList(), val fields: List<EditorField> = emptyList(),
val dirty: Boolean = false, val dirty: Boolean = false,
@@ -28,6 +28,8 @@ class NativeAuthenticationRepository(
private val scope: CoroutineScope, private val scope: CoroutineScope,
private val io: CoroutineDispatcher private val io: CoroutineDispatcher
) : AuthenticationRepository { ) : AuthenticationRepository {
internal fun text(id: Int) = session.text(id)
override val presentation = ProtectedPresentation() override val presentation = ProtectedPresentation()
private val mutable = MutableStateFlow(AuthenticationState()) private val mutable = MutableStateFlow(AuthenticationState())
override val state: StateFlow<AuthenticationState> = mutable override val state: StateFlow<AuthenticationState> = mutable
@@ -72,15 +74,15 @@ class NativeAuthenticationRepository(
mutable.value = mutable.value.copy(busy = true, failure = null) mutable.value = mutable.value.copy(busy = true, failure = null)
operation.withLock { operation.withLock {
revocation?.join() revocation?.join()
if (ticket != sequence.get()) throw cancelled() if (ticket != sequence.get()) throw cancelled(session)
try { try {
val result = withContext(io) { val result = withContext(io) {
val authentication = owner() val authentication = owner()
if (ticket != sequence.get()) throw cancelled() if (ticket != sequence.get()) throw cancelled(session)
val result = block(authentication) val result = block(authentication)
if (ticket != sequence.get()) { if (ticket != sequence.get()) {
authentication.manualLock() authentication.manualLock()
throw cancelled() throw cancelled(session)
} }
result result
} }
@@ -121,7 +123,7 @@ class NativeAuthenticationRepository(
version: ULong, version: ULong,
fields: List<de.rfc1437.ironstorage.bridge.generated.MobileEntryEditorInput> fields: List<de.rfc1437.ironstorage.bridge.generated.MobileEntryEditorInput>
) = withContext(io) { ) = withContext(io) {
(current ?: throw cancelled()).checkpointEntryEditorInputs(editor, version, fields) (current ?: throw cancelled(session)).checkpointEntryEditorInputs(editor, version, fields)
} }
internal suspend fun discardEditor(editor: ULong) = withContext(io) { internal suspend fun discardEditor(editor: ULong) = withContext(io) {
@@ -168,8 +170,8 @@ class NativeAuthenticationRepository(
appearance = mutable.value.appearance, appearance = mutable.value.appearance,
failure = AuthenticationFailure( failure = AuthenticationFailure(
AuthenticationFailureKind.Configuration, AuthenticationFailureKind.Configuration,
"Authentication is unavailable", session.text(R.string.core_auth_unavailable),
"Unlock the device or recover private storage and reload." session.text(R.string.core_auth_recover)
) )
) )
) )
@@ -189,8 +191,8 @@ class NativeAuthenticationRepository(
failure = if (cancel) { failure = if (cancel) {
AuthenticationFailure( AuthenticationFailure(
AuthenticationFailureKind.Cancelled, AuthenticationFailureKind.Cancelled,
"Authentication cancelled", session.text(R.string.core_auth_cancelled),
"No protected content was unlocked." session.text(R.string.core_auth_no_content)
) )
} else { } else {
null null
@@ -243,10 +245,10 @@ class NativeAuthenticationRepository(
} }
} }
} }
private fun cancelled() = MobileAuthenticationFfiException.Failed( private fun cancelled(session: NativePrivateSession) = MobileAuthenticationFfiException.Failed(
MobileAuthenticationErrorKind.CANCELLED, MobileAuthenticationErrorKind.CANCELLED,
"Authentication cancelled", session.text(R.string.core_auth_cancelled),
"No protected content was unlocked." session.text(R.string.core_auth_no_content)
) )
private fun MobileAuthenticationState.toFacade() = AuthenticationState( private fun MobileAuthenticationState.toFacade() = AuthenticationState(
unlocked, unlocked,
@@ -10,6 +10,7 @@ import de.rfc1437.ironstorage.bridge.generated.MobilePrivateStorageFfiException
import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
@@ -140,6 +141,8 @@ class NativeEditorRepository(
pending?.cancel() pending?.cancel()
pending = scope.launch { pending = scope.launch {
try { try {
// Coalesce typing; save, reorder and recovery join the latest encrypted checkpoint.
delay(150)
authentication.checkpointEditor(editor, inputVersion, fields) authentication.checkpointEditor(editor, inputVersion, fields)
} catch (error: CancellationException) { } catch (error: CancellationException) {
throw error throw error
@@ -155,7 +158,7 @@ class NativeEditorRepository(
epoch epoch
) { ) {
mutable.value = mutable.value =
mutable.value.copy(error = "Update the application and retry.") mutable.value.copy(error = authentication.text(R.string.core_update_retry))
} }
} }
} }
@@ -241,7 +244,7 @@ class NativeEditorRepository(
mutable.value = mutable.value =
mutable.value.copy( mutable.value.copy(
busy = false, busy = false,
error = "Update the application and retry." error = authentication.text(R.string.core_update_retry)
) )
} }
} }
@@ -277,7 +280,7 @@ class NativeEditorRepository(
) { ) {
mutable.value = mutable.value =
mutable.value.copy( mutable.value.copy(
error = "Unlock the device and retry." error = authentication.text(R.string.core_unlock_retry)
) )
} }
} catch (_: NativeBridgeException) { } catch (_: NativeBridgeException) {
@@ -285,7 +288,9 @@ class NativeEditorRepository(
epoch epoch
) { ) {
mutable.value = mutable.value =
mutable.value.copy(error = "Update the application and retry.") mutable.value.copy(
error = authentication.text(R.string.core_update_retry)
)
} }
} catch (_: java.io.IOException) { } catch (_: java.io.IOException) {
if (ticket == if (ticket ==
@@ -293,7 +298,7 @@ class NativeEditorRepository(
) { ) {
mutable.value = mutable.value =
mutable.value.copy( mutable.value.copy(
error = "Storage unavailable. Keep the draft and retry." error = authentication.text(R.string.core_draft_storage_unavailable)
) )
} }
} finally { } finally {
@@ -124,14 +124,14 @@ class NativeHomeRepository(
} catch (_: MobilePrivateStorageFfiException) { } catch (_: MobilePrivateStorageFfiException) {
failure( failure(
ticket, ticket,
"Unlock the device or recover private storage, then reload Home." session.text(R.string.core_home_recover)
) )
} catch (_: NativeBridgeException) { } catch (_: NativeBridgeException) {
failure(ticket, "Update the app and reload Home.") failure(ticket, session.text(R.string.core_home_update))
} catch (_: java.io.IOException) { } catch (_: java.io.IOException) {
failure( failure(
ticket, ticket,
"Private storage is unavailable. Unlock the device and reload Home." session.text(R.string.core_home_storage)
) )
} finally { } finally {
active = null active = null
@@ -146,7 +146,11 @@ class NativeHomeRepository(
private fun failure(ticket: Long, detail: String) { private fun failure(ticket: Long, detail: String) {
if (sequence.get() == ticket) { if (sequence.get() == ticket) {
mutable.value = mutable.value.copy( mutable.value = mutable.value.copy(
failure = HomeFailure(HomeFailureKind.Repository, "Home is unavailable", detail) failure = HomeFailure(
HomeFailureKind.Repository,
session.text(R.string.core_home_unavailable),
detail
)
) )
} }
} }
@@ -53,7 +53,7 @@ class NativeOnboardingRepository(
operation = it operation = it
if (revoked.get()) { if (revoked.get()) {
it.cancel() it.cancel()
throw interrupted() throw interrupted(session)
} }
} }
} }
@@ -76,11 +76,11 @@ class NativeOnboardingRepository(
it.cancel() it.cancel()
it.close() it.close()
remote = null remote = null
throw interrupted() throw interrupted(session)
} }
} }
val discovery = request.discover() val discovery = request.discover()
if (revoked.get()) throw interrupted() if (revoked.get()) throw interrupted(session)
pollProgress = false pollProgress = false
mutableSetup.update { mutableSetup.update {
it.copy( it.copy(
@@ -88,8 +88,8 @@ class NativeOnboardingRepository(
selectedBranch = discovery.branches.getOrNull( selectedBranch = discovery.branches.getOrNull(
discovery.selectedBranch.toInt() discovery.selectedBranch.toInt()
).orEmpty(), ).orEmpty(),
title = "Select a branch", title = session.text(R.string.core_branch_title),
detail = "Choose the branch and private GPG key for this store." detail = session.text(R.string.core_branch_detail)
) )
} }
} }
@@ -100,7 +100,7 @@ class NativeOnboardingRepository(
useExisting: Boolean useExisting: Boolean
) = runSetup { ) = runSetup {
completed( completed(
(remote ?: throw interrupted()).cloneStore( (remote ?: throw interrupted(session)).cloneStore(
branch, branch,
fingerprint, fingerprint,
passphrase.ifEmpty { passphrase.ifEmpty {
@@ -117,12 +117,12 @@ class NativeOnboardingRepository(
} }
override fun replaceToken(account: String, token: String) = runSetup { override fun replaceToken(account: String, token: String) = runSetup {
newOperation().replaceToken(account, token) newOperation().replaceToken(account, token)
if (revoked.get()) throw interrupted() if (revoked.get()) throw interrupted(session)
pollProgress = false pollProgress = false
mutableSetup.update { mutableSetup.update {
it.copy( it.copy(
title = "Token updated", title = session.text(R.string.core_token_updated),
detail = "The previous token was replaced in protected device storage." detail = session.text(R.string.core_token_updated_detail)
) )
} }
} }
@@ -145,7 +145,7 @@ class NativeOnboardingRepository(
} }
} }
private fun completed(outcome: MobileOnboardingOutcome) { private fun completed(outcome: MobileOnboardingOutcome) {
if (revoked.get()) throw interrupted() if (revoked.get()) throw interrupted(session)
updateStatus(requireNotNull(operation).status()) updateStatus(requireNotNull(operation).status())
mutableSetup.update { mutableSetup.update {
it.copy(title = outcome.title, detail = outcome.detail, branches = emptyList()) it.copy(title = outcome.title, detail = outcome.detail, branches = emptyList())
@@ -155,7 +155,7 @@ class NativeOnboardingRepository(
shell.refresh() shell.refresh()
} }
private fun updateStatus(status: MobileAndroidSetupStatus) { private fun updateStatus(status: MobileAndroidSetupStatus) {
if (revoked.get()) throw interrupted() if (revoked.get()) throw interrupted(session)
pollProgress = false pollProgress = false
mutableSetup.update { mutableSetup.update {
it.copy( it.copy(
@@ -215,8 +215,8 @@ class NativeOnboardingRepository(
pollProgress = false pollProgress = false
mutableSetup.update { mutableSetup.update {
it.copy( it.copy(
title = "Private storage unavailable", title = session.text(R.string.core_private_unavailable),
detail = "Unlock the device and retry. Existing data was retained.", detail = session.text(R.string.core_private_retained),
failure = true failure = true
) )
} }
@@ -224,8 +224,8 @@ class NativeOnboardingRepository(
pollProgress = false pollProgress = false
mutableSetup.update { mutableSetup.update {
it.copy( it.copy(
title = "Application update required", title = session.text(R.string.core_update_required),
detail = "The native storage service could not be loaded.", detail = session.text(R.string.core_native_unavailable),
failure = true failure = true
) )
} }
@@ -233,14 +233,14 @@ class NativeOnboardingRepository(
pollProgress = false pollProgress = false
mutableSetup.update { mutableSetup.update {
it.copy( it.copy(
title = "Private storage unavailable", title = session.text(R.string.core_private_unavailable),
detail = "The app-private directories could not be opened.", detail = session.text(R.string.core_directories_unavailable),
failure = true failure = true
) )
} }
} catch (error: IllegalStateException) { } catch (error: IllegalStateException) {
if (!revoked.get()) throw error if (!revoked.get()) throw error
val failure = interrupted() val failure = interrupted(session)
mutableSetup.update { mutableSetup.update {
it.copy(title = failure.title, detail = failure.detail, failure = true) it.copy(title = failure.title, detail = failure.detail, failure = true)
} }
@@ -261,8 +261,8 @@ class NativeOnboardingRepository(
} }
} }
private fun interrupted() = MobileOnboardingFfiException.Failed( private fun interrupted(session: NativePrivateSession) = MobileOnboardingFfiException.Failed(
MobileOnboardingErrorKind.INTERRUPTED, MobileOnboardingErrorKind.INTERRUPTED,
"Setup interrupted", session.text(R.string.core_setup_interrupted),
"Return to setup and enter its secrets again." session.text(R.string.core_setup_return)
) )
@@ -283,7 +283,10 @@ class NativePasswordRepository(
try { try {
clearMobileEntryCopy(copy, callback) clearMobileEntryCopy(copy, callback)
} catch (_: MobilePlatformFfiException) { } catch (_: MobilePlatformFfiException) {
mutable.value = mutable.value.copy(error = "Clipboard cleanup is unavailable.") mutable.value =
mutable.value.copy(
error = session.text(R.string.core_clipboard_cleanup_unavailable)
)
} }
} }
} }
@@ -298,7 +301,10 @@ class NativePasswordRepository(
withContext(Dispatchers.Main.immediate) { withContext(Dispatchers.Main.immediate) {
if (ticket == sequence.get()) { if (ticket == sequence.get()) {
mutable.value = mutable.value =
mutable.value.copy(error = "Copy is unavailable.", notice = null) mutable.value.copy(
error = session.text(R.string.core_copy_unavailable),
notice = null
)
} }
} }
} finally { } finally {
@@ -308,9 +314,9 @@ class NativePasswordRepository(
} }
} }
if (written.await()) { if (written.await()) {
current.copy(notice = "Copied. The clipboard will be cleared automatically.") current.copy(notice = session.text(R.string.core_copied))
} else { } else {
current.copy(error = "Copy is unavailable.", notice = null) current.copy(error = session.text(R.string.core_copy_unavailable), notice = null)
} }
} }
override fun prepareMutation(action: PasswordMutation) = content { current -> override fun prepareMutation(action: PasswordMutation) = content { current ->
@@ -386,13 +392,13 @@ class NativePasswordRepository(
mutable.value.copy(error = error.detail) mutable.value.copy(error = error.detail)
} catch (_: MobilePrivateStorageFfiException) { } catch (_: MobilePrivateStorageFfiException) {
mutable.value.copy( mutable.value.copy(
error = "Unlock the device or recover the private store and refresh." error = session.text(R.string.core_password_recovery)
) )
} catch (_: NativeBridgeException) { } catch (_: NativeBridgeException) {
mutable.value.copy(error = "Update the application and retry.") mutable.value.copy(error = session.text(R.string.core_update_retry))
} catch (_: java.io.IOException) { } catch (_: java.io.IOException) {
mutable.value.copy( mutable.value.copy(
error = "Private storage is unavailable. Unlock the device and refresh.", error = session.text(R.string.core_password_storage),
selected = null selected = null
) )
} }
@@ -8,10 +8,12 @@ import de.rfc1437.ironstorage.bridge.generated.MobileSecretBackend
/** Both facades share one Rust owner and retain its Keystore callbacks for its lifetime. */ /** Both facades share one Rust owner and retain its Keystore callbacks for its lifetime. */
class NativePrivateSession( class NativePrivateSession(
context: Context, private val context: Context,
private val directories: () -> PrivateDirectories, private val directories: () -> PrivateDirectories,
private val keystore: AndroidKeystore private val keystore: AndroidKeystore
) { ) {
internal fun text(id: Int): String = context.getString(id)
val runtime = NativeRuntime(context) val runtime = NativeRuntime(context)
fun cancelAuthentication() = keystore.cancelPending() fun cancelAuthentication() = keystore.cancelPending()
@@ -64,22 +64,31 @@ class NativeSettingsRepository(
releaseTransfer() releaseTransfer()
authentication.authenticated { it.setDefaultKey(fingerprint) } authentication.authenticated { it.setDefaultKey(fingerprint) }
authentication.lock() authentication.lock()
mutable.value = mutable.value.copy(page = page(), notice = "Default GPG key updated.") mutable.value =
mutable.value.copy(
page = page(),
notice = session.text(R.string.core_default_key_updated)
)
} }
override fun setGitIdentity(name: String, email: String) = run { override fun setGitIdentity(name: String, email: String) = run {
authentication.authenticated { it.setGitIdentity(name, email) } authentication.authenticated { it.setGitIdentity(name, email) }
mutable.value = mutable.value.copy(page = page(), notice = "Git author updated.") mutable.value =
mutable.value.copy(
page = page(),
notice = session.text(R.string.core_git_author_updated)
)
} }
override fun setTimeout(seconds: String) = run { override fun setTimeout(seconds: String) = run {
authentication.authenticated { it.setAuthenticationTimeoutText(seconds) } authentication.authenticated { it.setAuthenticationTimeoutText(seconds) }
mutable.value = mutable.value.copy(page = page(), notice = "Inactivity timeout updated.") mutable.value =
mutable.value.copy(page = page(), notice = session.text(R.string.core_timeout_updated))
} }
override fun removeToken() = run { override fun removeToken() = run {
authentication.authenticated { it.removeApplicationToken() } authentication.authenticated { it.removeApplicationToken() }
mutable.value = mutable.value =
mutable.value.copy( mutable.value.copy(
page = page(), page = page(),
notice = "Application token removed from protected storage." notice = session.text(R.string.core_token_removed)
) )
} }
override fun rebuildCache(passphrase: String) = run { override fun rebuildCache(passphrase: String) = run {
@@ -94,7 +103,7 @@ class NativeSettingsRepository(
mutable.value.copy( mutable.value.copy(
page = page(), page = page(),
notice = notice =
result.cacheNotice ?: "TOTP cache rebuilt." result.cacheNotice ?: session.text(R.string.core_cache_rebuilt)
) )
} finally { } finally {
discovery = null discovery = null
@@ -105,7 +114,7 @@ class NativeSettingsRepository(
if (!platform.openAutofill()) { if (!platform.openAutofill()) {
mutable.value = mutable.value =
mutable.value.copy( mutable.value.copy(
error = "Autofill provider settings are unavailable on this device." error = session.text(R.string.core_autofill_settings_unavailable)
) )
} }
} }
@@ -113,7 +122,7 @@ class NativeSettingsRepository(
if (!platform.openCredentials()) { if (!platform.openCredentials()) {
mutable.value = mutable.value =
mutable.value.copy( mutable.value.copy(
error = "Credential provider settings are unavailable on this device." error = session.text(R.string.core_credential_settings_unavailable)
) )
} }
} }
@@ -184,7 +193,7 @@ class NativeSettingsRepository(
override fun chooseQrImages() { override fun chooseQrImages() {
if (!platform.chooseQrImages()) { if (!platform.chooseQrImages()) {
mutable.value = mutable.value =
mutable.value.copy(error = "The image picker is unavailable on this device.") mutable.value.copy(error = session.text(R.string.core_picker_unavailable))
} }
} }
override fun addQrImages(uris: List<String>) { override fun addQrImages(uris: List<String>) {
@@ -294,10 +303,7 @@ class NativeSettingsRepository(
mutable.value = mutable.value =
mutable.value.copy( mutable.value.copy(
error = error =
"Private storage recovery required. " + session.text(R.string.core_private_recovery)
"Unlock the device and reload; " +
"missing or invalidated Keystore data requires " +
"reimporting the GPG key."
) )
} }
} catch (_: NativeBridgeException) { } catch (_: NativeBridgeException) {
@@ -305,14 +311,14 @@ class NativeSettingsRepository(
epoch epoch
) { ) {
mutable.value = mutable.value =
mutable.value.copy(error = "Update the application and retry.") mutable.value.copy(error = session.text(R.string.core_update_retry))
} }
} catch (_: java.io.IOException) { } catch (_: java.io.IOException) {
if (ticket == if (ticket ==
epoch epoch
) { ) {
mutable.value = mutable.value =
mutable.value.copy(error = "The selected QR image could not be read.") mutable.value.copy(error = session.text(R.string.core_image_unreadable))
} }
} finally { } finally {
if (ticket == epoch) mutable.value = mutable.value.copy(busy = false) if (ticket == epoch) mutable.value = mutable.value.copy(busy = false)
@@ -12,8 +12,8 @@ data class SetupStatus(
val branches: List<String> = emptyList(), val branches: List<String> = emptyList(),
val selectedBranch: String = "", val selectedBranch: String = "",
val busy: Boolean = false, val busy: Boolean = false,
val title: String = "Set up your password store", val title: String = "",
val detail: String = "Create a local store or clone an existing HTTPS repository.", val detail: String = "",
val failure: Boolean = false val failure: Boolean = false
) )
@@ -56,7 +56,7 @@ data class PasswordMutationPlan(
) )
data class PasswordState( data class PasswordState(
val path: String = "", val path: String = "",
val title: String = "Passwords", val title: String = "",
val parent: String? = null, val parent: String? = null,
val revision: String = "", val revision: String = "",
val rows: List<PasswordRow> = emptyList(), val rows: List<PasswordRow> = emptyList(),
@@ -33,6 +33,7 @@ interface SearchRepository {
class NativeSearchRepository internal constructor( class NativeSearchRepository internal constructor(
private val scope: CoroutineScope, private val scope: CoroutineScope,
presentation: ProtectedPresentation, presentation: ProtectedPresentation,
private val failureText: () -> String = { "" },
private val load: suspend (String) -> List<PasswordRow> private val load: suspend (String) -> List<PasswordRow>
) : SearchRepository { ) : SearchRepository {
constructor( constructor(
@@ -40,7 +41,7 @@ class NativeSearchRepository internal constructor(
scope: CoroutineScope, scope: CoroutineScope,
io: CoroutineDispatcher, io: CoroutineDispatcher,
presentation: ProtectedPresentation presentation: ProtectedPresentation
) : this(scope, presentation, { query -> ) : this(scope, presentation, { session.text(R.string.core_search_unavailable) }, { query ->
withContext(io) { withContext(io) {
session.storage().passwordNameSearch(query).map { it.toFacade() } session.storage().passwordNameSearch(query).map { it.toFacade() }
} }
@@ -95,7 +96,7 @@ class NativeSearchRepository internal constructor(
if (sequence == ticket) { if (sequence == ticket) {
mutable.value = SearchState( mutable.value = SearchState(
query, query,
error = "Search is unavailable. Unlock the device or recover the store, then retry." error = failureText()
) )
} }
} }
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="core_update_retry">Update the application and retry.</string>
<string name="core_unlock_retry">Unlock the device and retry.</string>
<string name="core_draft_storage_unavailable">Storage unavailable. Keep the draft and retry.</string>
<string name="core_home_recover">Unlock the device or recover private storage, then reload Home.</string>
<string name="core_home_update">Update the app and reload Home.</string>
<string name="core_home_storage">Private storage is unavailable. Unlock the device and reload Home.</string>
<string name="core_home_unavailable">Home is unavailable</string>
<string name="core_search_unavailable">Search is unavailable. Unlock the device or recover the store, then retry.</string>
<string name="core_auth_unavailable">Authentication is unavailable</string>
<string name="core_auth_recover">Unlock the device or recover private storage and reload.</string>
<string name="core_auth_cancelled">Authentication cancelled</string>
<string name="core_auth_no_content">No protected content was unlocked.</string>
<string name="core_branch_title">Select a branch</string>
<string name="core_branch_detail">Choose the branch and private GPG key for this store.</string>
<string name="core_token_updated">Token updated</string>
<string name="core_token_updated_detail">The previous token was replaced in protected device storage.</string>
<string name="core_private_unavailable">Private storage unavailable</string>
<string name="core_private_retained">Unlock the device and retry. Existing data was retained.</string>
<string name="core_update_required">Application update required</string>
<string name="core_native_unavailable">The native storage service could not be loaded.</string>
<string name="core_directories_unavailable">The app-private directories could not be opened.</string>
<string name="core_setup_interrupted">Setup interrupted</string>
<string name="core_setup_return">Return to setup and enter its secrets again.</string>
<string name="core_default_key_updated">Default GPG key updated.</string>
<string name="core_git_author_updated">Git author updated.</string>
<string name="core_timeout_updated">Inactivity timeout updated.</string>
<string name="core_token_removed">Application token removed from protected storage.</string>
<string name="core_cache_rebuilt">TOTP cache rebuilt.</string>
<string name="core_autofill_settings_unavailable">Autofill provider settings are unavailable on this device.</string>
<string name="core_credential_settings_unavailable">Credential provider settings are unavailable on this device.</string>
<string name="core_picker_unavailable">The image picker is unavailable on this device.</string>
<string name="core_private_recovery">Private storage recovery required. Unlock the device and reload; missing or invalidated Keystore data requires reimporting the GPG key.</string>
<string name="core_image_unreadable">The selected QR image could not be read.</string>
<string name="core_clipboard_cleanup_unavailable">Clipboard cleanup is unavailable.</string>
<string name="core_copy_unavailable">Copy is unavailable.</string>
<string name="core_copied">Copied. The clipboard will be cleared automatically.</string>
<string name="core_password_recovery">Unlock the device or recover the private store and refresh.</string>
<string name="core_password_storage">Private storage is unavailable. Unlock the device and refresh.</string>
</resources>
+44 -1
View File
@@ -133,7 +133,50 @@
"org.jspecify:jspecify:1.0.0": "Apache-2.0", "org.jspecify:jspecify:1.0.0": "Apache-2.0",
"androidx.compose.material3.adaptive:adaptive-layout-android:1.3.0": "Apache-2.0", "androidx.compose.material3.adaptive:adaptive-layout-android:1.3.0": "Apache-2.0",
"androidx.compose.material3.adaptive:adaptive-navigation-android:1.3.0": "Apache-2.0", "androidx.compose.material3.adaptive:adaptive-navigation-android:1.3.0": "Apache-2.0",
"androidx.lifecycle:lifecycle-common:2.3.1": "Apache-2.0" "androidx.lifecycle:lifecycle-common:2.3.1": "Apache-2.0",
"androidx.cardview:cardview:1.0.0": "Apache-2.0",
"androidx.compose.ui:ui-test-junit4-accessibility-android:1.12.1": "Apache-2.0",
"androidx.coordinatorlayout:coordinatorlayout:1.1.0": "Apache-2.0",
"androidx.recyclerview:recyclerview:1.1.0": "Apache-2.0",
"androidx.test:rules:1.4.0": "Apache-2.0",
"androidx.transition:transition:1.2.0": "Apache-2.0",
"androidx.viewpager2:viewpager2:1.0.0": "Apache-2.0",
"com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:4.1.1": "Apache-2.0",
"com.google.android.material:material:1.2.0-rc01": "Apache-2.0",
"com.google.guava:failureaccess:1.0.1": "Apache-2.0",
"com.google.guava:guava:31.0.1-android": "Apache-2.0",
"com.google.j2objc:j2objc-annotations:1.3": "Apache-2.0",
"com.google.protobuf:protobuf-javalite:3.19.1": "BSD-3-Clause",
"org.checkerframework:checker-compat-qual:2.5.5": "MIT",
"org.checkerframework:checker-qual:3.22.1": "MIT",
"org.jsoup:jsoup:1.15.1": "MIT",
"androidx.annotation:annotation-jvm:1.8.1": "Apache-2.0",
"androidx.arch.core:core-common:2.1.0": "Apache-2.0",
"androidx.arch.core:core-runtime:2.1.0": "Apache-2.0",
"androidx.benchmark:benchmark-common:1.5.0": "Apache-2.0",
"androidx.benchmark:benchmark-macro:1.5.0": "Apache-2.0",
"androidx.benchmark:benchmark-macro-junit4:1.5.0": "Apache-2.0",
"androidx.benchmark:benchmark-traceprocessor-android:1.5.0": "Apache-2.0",
"androidx.collection:collection:1.0.0": "Apache-2.0",
"androidx.core:core:1.9.0": "Apache-2.0",
"androidx.lifecycle:lifecycle-runtime:2.3.1": "Apache-2.0",
"androidx.profileinstaller:profileinstaller:1.4.1": "Apache-2.0",
"androidx.test:annotation:1.0.1": "Apache-2.0",
"androidx.test:rules:1.5.0": "Apache-2.0",
"androidx.test.ext:junit:1.2.1": "Apache-2.0",
"androidx.test.uiautomator:uiautomator:2.4.0": "Apache-2.0",
"androidx.test.uiautomator:uiautomator-shell-android:2.4.0": "Apache-2.0",
"androidx.tracing:tracing-ktx:1.1.0": "Apache-2.0",
"androidx.tracing:tracing-perfetto:1.0.1": "Apache-2.0",
"androidx.tracing:tracing-perfetto-binary:1.0.1": "Apache-2.0",
"androidx.tracing:tracing-perfetto-handshake:1.0.1": "Apache-2.0",
"com.squareup.moshi:moshi:1.13.0": "Apache-2.0",
"com.squareup.okio:okio-jvm:3.17.0": "Apache-2.0",
"com.squareup.wire:wire-runtime-jvm:6.4.0": "Apache-2.0",
"org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0": "Apache-2.0",
"org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0": "Apache-2.0",
"org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0": "Apache-2.0",
"org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0": "Apache-2.0"
}, },
"rust_licenses": [ "rust_licenses": [
"(Apache-2.0 OR MIT) AND BSD-3-Clause", "(Apache-2.0 OR MIT) AND BSD-3-Clause",
@@ -63,7 +63,7 @@ fun EntryEditorScreen(repository: EditorRepository, authentication: Authenticati
) { ) {
item { item {
Text( Text(
state.title, state.title.ifEmpty { stringResource(R.string.editor_initial_title) },
style = MaterialTheme.typography.headlineSmall, style = MaterialTheme.typography.headlineSmall,
modifier = Modifier.semantics { modifier = Modifier.semantics {
heading() heading()
@@ -165,11 +165,39 @@ fun EntryEditorScreen(repository: EditorRepository, authentication: Authenticati
}) })
) )
field.diagnostic?.let { Text(it) } field.diagnostic?.let { Text(it) }
val revealLabel = stringResource(
R.string.entry_field_action,
stringResource(if (shown) R.string.editor_hide else R.string.editor_reveal),
field.label
)
val removeLabel =
stringResource(
R.string.entry_field_action,
stringResource(R.string.editor_remove),
field.label
)
val upLabel =
stringResource(
R.string.entry_field_action,
stringResource(R.string.editor_up),
field.label
)
val downLabel =
stringResource(
R.string.entry_field_action,
stringResource(R.string.editor_down),
field.label
)
FlowRow { FlowRow {
TextButton(onClick = { TextButton(
modifier = Modifier.semantics {
contentDescription = revealLabel
},
onClick = {
revealed = revealed =
if (shown) revealed - field.id else revealed + field.id if (shown) revealed - field.id else revealed + field.id
}) { }
) {
Text( Text(
stringResource( stringResource(
if (shown) R.string.editor_hide else R.string.editor_reveal if (shown) R.string.editor_hide else R.string.editor_reveal
@@ -177,9 +205,16 @@ fun EntryEditorScreen(repository: EditorRepository, authentication: Authenticati
) )
} }
if (field.removable) { if (field.removable) {
TextButton(enabled = !state.busy, onClick = { TextButton(
enabled = !state.busy,
onClick = {
repository.remove(field.id) repository.remove(field.id)
}, modifier = Modifier.testTag("editor-remove-${field.id}")) { },
modifier = Modifier.testTag("editor-remove-${field.id}").semantics {
contentDescription =
removeLabel
}
) {
Text(stringResource(R.string.editor_remove)) Text(stringResource(R.string.editor_remove))
} }
} }
@@ -196,12 +231,17 @@ fun EntryEditorScreen(repository: EditorRepository, authentication: Authenticati
).toUInt() ).toUInt()
) )
}, },
modifier = Modifier.testTag("editor-up-${field.id}") modifier = Modifier.testTag("editor-up-${field.id}").semantics {
contentDescription =
upLabel
}
) { ) {
Text(stringResource(R.string.editor_up)) Text(stringResource(R.string.editor_up))
} }
val canMoveDown = !state.busy && index < state.fields.lastIndex val canMoveDown = !state.busy && index < state.fields.lastIndex
TextButton(enabled = canMoveDown, onClick = { TextButton(
enabled = canMoveDown,
onClick = {
repository.reorder( repository.reorder(
field.id, field.id,
( (
@@ -209,7 +249,12 @@ fun EntryEditorScreen(repository: EditorRepository, authentication: Authenticati
1 1
).toUInt() ).toUInt()
) )
}, modifier = Modifier.testTag("editor-down-${field.id}")) { },
modifier = Modifier.testTag("editor-down-${field.id}").semantics {
contentDescription =
downLabel
}
) {
Text(stringResource(R.string.editor_down)) Text(stringResource(R.string.editor_down))
} }
} }
@@ -156,11 +156,13 @@ fun LazyListScope.entryViewer(state: PasswordState, repository: PasswordReposito
stringResource( stringResource(
if (field.revealed) R.string.entry_hide else R.string.entry_reveal if (field.revealed) R.string.entry_hide else R.string.entry_reveal
) )
val revealLabel =
stringResource(R.string.entry_field_action, reveal, field.label)
TextButton( TextButton(
enabled = !state.loading, enabled = !state.loading,
modifier = Modifier.semantics { modifier = Modifier.semantics {
contentDescription = contentDescription =
"$reveal ${field.label}" revealLabel
}, },
onClick = { onClick = {
if (field.revealed) { if (field.revealed) {
@@ -174,20 +176,23 @@ fun LazyListScope.entryViewer(state: PasswordState, repository: PasswordReposito
) { Text(reveal) } ) { Text(reveal) }
} }
val copy = stringResource(R.string.entry_copy) val copy = stringResource(R.string.entry_copy)
val copyLabel = stringResource(R.string.entry_field_action, copy, field.label)
TextButton( TextButton(
enabled = !state.loading, enabled = !state.loading,
modifier = Modifier.semantics { modifier = Modifier.semantics {
contentDescription = "$copy ${field.label}" contentDescription = copyLabel
}, },
onClick = { repository.copy(field.id) } onClick = { repository.copy(field.id) }
) { Text(copy) } ) { Text(copy) }
if (field.editable) { if (field.editable) {
val edit = stringResource(R.string.entry_edit) val edit = stringResource(R.string.entry_edit)
val editLabel =
stringResource(R.string.entry_field_action, edit, field.label)
TextButton( TextButton(
enabled = !state.loading, enabled = !state.loading,
modifier = Modifier.semantics { modifier = Modifier.semantics {
contentDescription = contentDescription =
"$edit ${field.label}" editLabel
}, },
onClick = { repository.edit(field.id) } onClick = { repository.edit(field.id) }
) { Text(edit) } ) { Text(edit) }
@@ -84,14 +84,14 @@ fun OnboardingScreen(
verticalArrangement = Arrangement.spacedBy(12.dp) verticalArrangement = Arrangement.spacedBy(12.dp)
) { ) {
Text( Text(
state.title, state.title.ifEmpty { stringResource(R.string.setup_initial_title) },
modifier = Modifier.semantics { modifier = Modifier.semantics {
heading() heading()
}, },
style = MaterialTheme.typography.headlineSmall style = MaterialTheme.typography.headlineSmall
) )
Text( Text(
state.detail, state.detail.ifEmpty { stringResource(R.string.setup_initial_detail) },
color = if (state.failure) { color = if (state.failure) {
MaterialTheme.colorScheme.error MaterialTheme.colorScheme.error
} else { } else {
@@ -142,7 +142,9 @@ fun PasswordScreen(
item { item {
Column(Modifier.padding(16.dp)) { Column(Modifier.padding(16.dp)) {
Text( Text(
state.title, state.title.ifEmpty {
stringResource(R.string.password_initial_title)
},
style = MaterialTheme.typography.headlineSmall, style = MaterialTheme.typography.headlineSmall,
modifier = Modifier.semantics { heading() } modifier = Modifier.semantics { heading() }
) )
@@ -22,6 +22,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.LiveRegionMode import androidx.compose.ui.semantics.LiveRegionMode
import androidx.compose.ui.semantics.heading import androidx.compose.ui.semantics.heading
@@ -88,7 +89,12 @@ fun SearchScreen(
CircularProgressIndicator() CircularProgressIndicator()
Text(stringResource(R.string.search_loading)) Text(stringResource(R.string.search_loading))
} else if (state.error != null) { } else if (state.error != null) {
Text(requireNotNull(state.error), color = MaterialTheme.colorScheme.error) Text(
state.error.orEmpty().ifEmpty {
stringResource(R.string.search_recovery)
},
color = MaterialTheme.colorScheme.error
)
} else if (state.cancelled) { } else if (state.cancelled) {
Text(stringResource(R.string.search_cancelled)) Text(stringResource(R.string.search_cancelled))
} else if (state.results.isEmpty()) { } else if (state.results.isEmpty()) {
@@ -98,7 +104,13 @@ fun SearchScreen(
) )
) )
} else { } else {
Text(stringResource(R.string.search_count, state.results.size)) Text(
pluralStringResource(
R.plurals.search_results,
state.results.size,
state.results.size
)
)
} }
} }
LazyColumn(Modifier.weight(1f).fillMaxSize()) { LazyColumn(Modifier.weight(1f).fillMaxSize()) {
@@ -28,6 +28,7 @@ import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@@ -37,6 +38,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.platform.LocalResources
import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.platform.testTag import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.contentDescription
@@ -52,6 +54,8 @@ import de.rfc1437.ironstorage.core.AuthenticationRepository
import de.rfc1437.ironstorage.core.OnboardingRepository import de.rfc1437.ironstorage.core.OnboardingRepository
import de.rfc1437.ironstorage.core.ProviderStatus import de.rfc1437.ironstorage.core.ProviderStatus
import de.rfc1437.ironstorage.core.SettingsRepository import de.rfc1437.ironstorage.core.SettingsRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
@Composable @Composable
fun SettingsScreen(viewModel: ShellViewModel, setup: SetupFormViewModel) { fun SettingsScreen(viewModel: ShellViewModel, setup: SetupFormViewModel) {
@@ -190,9 +194,10 @@ fun SettingsScreen(
) )
) )
Text( Text(
stringResource( pluralStringResource(
R.string.settings_timeout_value, R.plurals.settings_timeout_value,
it.timeout.toString() it.timeout.toInt(),
it.timeout.toLong()
) )
) )
} }
@@ -288,10 +293,10 @@ fun SettingsScreen(
if (state.transfer.open) KeyTransferDialog(repository, authentication) if (state.transfer.open) KeyTransferDialog(repository, authentication)
if (licenses) { if (licenses) {
val resources = LocalResources.current val resources = LocalResources.current
val text = val loading = stringResource(R.string.settings_license_loading)
remember(resources) { val text by produceState(loading, resources) {
resources.openRawResource(R.raw.license).bufferedReader().use { value = withContext(Dispatchers.IO) {
it.readText() resources.openRawResource(R.raw.license).bufferedReader().use { it.readText() }
} }
} }
AlertDialog( AlertDialog(
@@ -491,8 +496,8 @@ private fun KeyTransferDialog(
val description = val description =
stringResource( stringResource(
R.string.settings_qr_frame, R.string.settings_qr_frame,
qr.sequence.toString(), qr.sequence.toInt(),
qr.total.toString() qr.total.toInt()
) )
Text(description) Text(description)
Canvas( Canvas(
@@ -552,10 +557,11 @@ private fun KeyTransferDialog(
"" ""
}) { Text(stringResource(R.string.settings_qr_add)) } }) { Text(stringResource(R.string.settings_qr_add)) }
Text( Text(
stringResource( pluralStringResource(
R.string.settings_qr_progress, R.plurals.settings_qr_progress,
state.transfer.received.toString(), state.transfer.total.toInt(),
state.transfer.total.toString() state.transfer.received.toInt(),
state.transfer.total.toInt()
) )
) )
state.transfer.ready?.let { state.transfer.ready?.let {
@@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.selection.selectable import androidx.compose.foundation.selection.selectable
@@ -81,6 +82,7 @@ fun ShellScreen(viewModel: ShellViewModel, setupForm: SetupFormViewModel) {
val rail = maxWidth >= 600.dp val rail = maxWidth >= 600.dp
val largeFont = LocalDensity.current.fontScale >= 1.6f val largeFont = LocalDensity.current.fontScale >= 1.6f
Scaffold( Scaffold(
modifier = Modifier.imePadding(),
bottomBar = { bottomBar = {
if (!rail) { if (!rail) {
NavigationBar(Modifier.testTag("shell-bottom-navigation")) { NavigationBar(Modifier.testTag("shell-bottom-navigation")) {
@@ -110,7 +110,6 @@
<string name="search_loading">Searching names…</string> <string name="search_loading">Searching names…</string>
<string name="search_prompt">Enter an entry name, folder, or path.</string> <string name="search_prompt">Enter an entry name, folder, or path.</string>
<string name="search_empty">No matching entries.</string> <string name="search_empty">No matching entries.</string>
<string name="search_count">Results: %1$d</string>
<string name="search_open">Open entry</string> <string name="search_open">Open entry</string>
<string name="search_cancelled">Search cancelled. Refresh to try again.</string> <string name="search_cancelled">Search cancelled. Refresh to try again.</string>
<string name="shell_appearance">Appearance</string> <string name="shell_appearance">Appearance</string>
@@ -168,7 +167,10 @@
<string name="settings_edit_git">Edit Git author</string> <string name="settings_edit_git">Edit Git author</string>
<string name="settings_biometry_available">Strong biometric authentication is available</string> <string name="settings_biometry_available">Strong biometric authentication is available</string>
<string name="settings_biometry_unavailable">Strong biometric authentication is unavailable; use a GPG passphrase</string> <string name="settings_biometry_unavailable">Strong biometric authentication is unavailable; use a GPG passphrase</string>
<string name="settings_timeout_value">Inactivity timeout: %1$s seconds</string> <plurals name="settings_timeout_value">
<item quantity="one">Inactivity timeout: %1$d second</item>
<item quantity="other">Inactivity timeout: %1$d seconds</item>
</plurals>
<string name="settings_edit_timeout">Edit inactivity timeout</string> <string name="settings_edit_timeout">Edit inactivity timeout</string>
<string name="settings_lock_now">Lock now</string> <string name="settings_lock_now">Lock now</string>
<string name="settings_rebuild">Rebuild TOTP cache</string> <string name="settings_rebuild">Rebuild TOTP cache</string>
@@ -197,15 +199,29 @@
<string name="settings_private_warning">Private QR codes contain encrypted secret key material. Export only after checking the intended recipient. A private export requires its GPG passphrase.</string> <string name="settings_private_warning">Private QR codes contain encrypted secret key material. Export only after checking the intended recipient. A private export requires its GPG passphrase.</string>
<string name="settings_private_export">Export private key</string> <string name="settings_private_export">Export private key</string>
<string name="settings_export_confirm">Confirm and export selected key</string> <string name="settings_export_confirm">Confirm and export selected key</string>
<string name="settings_qr_frame">QR frame %1$s of %2$s</string> <string name="settings_qr_frame">QR frame %1$d of %2$d</string>
<string name="settings_previous">Previous frame</string> <string name="settings_previous">Previous frame</string>
<string name="settings_next">Next frame</string> <string name="settings_next">Next frame</string>
<string name="settings_qr_images">Choose QR images</string> <string name="settings_qr_images">Choose QR images</string>
<string name="settings_qr_images_detail">Select all frames of one transfer together. Opening another app clears the current transfer.</string> <string name="settings_qr_images_detail">Select all frames of one transfer together. Opening another app clears the current transfer.</string>
<string name="settings_qr_payload">QR payload or armored GPG key</string> <string name="settings_qr_payload">QR payload or armored GPG key</string>
<string name="settings_qr_add">Add transfer payload</string> <string name="settings_qr_add">Add transfer payload</string>
<string name="settings_qr_progress">Received %1$s of %2$s frames</string> <plurals name="settings_qr_progress">
<item quantity="one">Received %1$d of %2$d frame</item>
<item quantity="other">Received %1$d of %2$d frames</item>
</plurals>
<string name="settings_make_default">Make imported private key the default</string> <string name="settings_make_default">Make imported private key the default</string>
<string name="settings_replace_key">Confirm replacement of an existing key</string> <string name="settings_replace_key">Confirm replacement of an existing key</string>
<string name="settings_import_confirm">Confirm and import reconstructed key</string> <string name="settings_import_confirm">Confirm and import reconstructed key</string>
<string name="setup_initial_title">Set up your password store</string>
<string name="setup_initial_detail">Create a local store or clone an existing HTTPS repository.</string>
<string name="editor_initial_title">Entry editor</string>
<string name="password_initial_title">Passwords</string>
<string name="search_recovery">Search is unavailable. Unlock the device or recover the store, then retry.</string>
<string name="entry_field_action">%1$s %2$s</string>
<plurals name="search_results">
<item quantity="one">%1$d result</item>
<item quantity="other">%1$d results</item>
</plurals>
<string name="settings_license_loading">Loading license…</string>
</resources> </resources>
+4
View File
@@ -17,6 +17,7 @@ ktlint = "1.7.1"
compileSdk = "37" compileSdk = "37"
minSdk = "26" minSdk = "26"
ndk = "30.0.16248370" ndk = "30.0.16248370"
benchmark = "1.5.0"
rust = "1.97.1" rust = "1.97.1"
cargoNdk = "4.1.2" cargoNdk = "4.1.2"
jna = "5.19.1" jna = "5.19.1"
@@ -27,6 +28,7 @@ biometric = "1.1.0"
fragment = "1.9.1" fragment = "1.9.1"
[libraries] [libraries]
benchmark-macro = { module = "androidx.benchmark:benchmark-macro-junit4", version.ref = "benchmark" }
rustls-verifier = { group = "rustls", name = "rustls-platform-verifier", version.ref = "rustlsVerifier" } rustls-verifier = { group = "rustls", name = "rustls-platform-verifier", version.ref = "rustlsVerifier" }
compose-bom = { module = "androidx.compose:compose-bom", version.ref = "compose" } compose-bom = { module = "androidx.compose:compose-bom", version.ref = "compose" }
compose-ui = { module = "androidx.compose.ui:ui" } compose-ui = { module = "androidx.compose.ui:ui" }
@@ -34,6 +36,7 @@ compose-material3 = { module = "androidx.compose.material3:material3" }
compose-adaptive = { module = "androidx.compose.material3.adaptive:adaptive", version.ref = "adaptive" } compose-adaptive = { module = "androidx.compose.material3.adaptive:adaptive", version.ref = "adaptive" }
compose-adaptive-layout = { module = "androidx.compose.material3.adaptive:adaptive-layout", version.ref = "adaptive" } compose-adaptive-layout = { module = "androidx.compose.material3.adaptive:adaptive-layout", version.ref = "adaptive" }
compose-adaptive-navigation = { module = "androidx.compose.material3.adaptive:adaptive-navigation", version.ref = "adaptive" } compose-adaptive-navigation = { module = "androidx.compose.material3.adaptive:adaptive-navigation", version.ref = "adaptive" }
compose-ui-test-accessibility = { module = "androidx.compose.ui:ui-test-junit4-accessibility" }
compose-ui-test = { module = "androidx.compose.ui:ui-test-junit4" } compose-ui-test = { module = "androidx.compose.ui:ui-test-junit4" }
activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activity" } activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activity" }
lifecycle-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "lifecycle" } lifecycle-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "lifecycle" }
@@ -55,6 +58,7 @@ biometric = { module = "androidx.biometric:biometric", version.ref = "biometric"
fragment = { module = "androidx.fragment:fragment", version.ref = "fragment" } fragment = { module = "androidx.fragment:fragment", version.ref = "fragment" }
[plugins] [plugins]
android-test = { id = "com.android.test", version.ref = "agp" }
android-application = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }
android-library = { id = "com.android.library", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
+614
View File
@@ -168,6 +168,9 @@
</artifact> </artifact>
</component> </component>
<component group="androidx.annotation" name="annotation-jvm" version="1.8.1"> <component group="androidx.annotation" name="annotation-jvm" version="1.8.1">
<artifact name="annotation-jvm-1.8.1.jar">
<sha256 value="9aab326d9492800991854360ac248f493ce7f7c3183519309b78ace9e240f6f6" origin="Generated by Gradle"/>
</artifact>
<artifact name="annotation-jvm-1.8.1.module"> <artifact name="annotation-jvm-1.8.1.module">
<sha256 value="c959e3b0cdc75c15efe01605fa56aa79f033e39238e150638b8fabde6aa121a0" origin="Generated by Gradle"/> <sha256 value="c959e3b0cdc75c15efe01605fa56aa79f033e39238e150638b8fabde6aa121a0" origin="Generated by Gradle"/>
</artifact> </artifact>
@@ -197,6 +200,9 @@
</artifact> </artifact>
</component> </component>
<component group="androidx.arch.core" name="core-common" version="2.1.0"> <component group="androidx.arch.core" name="core-common" version="2.1.0">
<artifact name="core-common-2.1.0.jar">
<sha256 value="fe1237bf029d063e7f29fe39aeaf73ef74c8b0a3658486fc29d3c54326653889" origin="Generated by Gradle"/>
</artifact>
<artifact name="core-common-2.1.0.pom"> <artifact name="core-common-2.1.0.pom">
<sha256 value="83bbb3960eaabc600ac366c94cb59414e441532a1d6aa9388b0b8bfface5cf01" origin="Generated by Gradle"/> <sha256 value="83bbb3960eaabc600ac366c94cb59414e441532a1d6aa9388b0b8bfface5cf01" origin="Generated by Gradle"/>
</artifact> </artifact>
@@ -233,6 +239,43 @@
<sha256 value="3677abead5d4e06cf76cbacb954151e051779c2274494451fb424e375aa9e450" origin="Generated by Gradle"/> <sha256 value="3677abead5d4e06cf76cbacb954151e051779c2274494451fb424e375aa9e450" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.benchmark" name="benchmark-common" version="1.5.0">
<artifact name="benchmark-common-1.5.0.aar">
<sha256 value="1b915a31dae4d4c57a1641a16d063983c29069290ce4153c1f356e97bd247db4" origin="Generated by Gradle"/>
</artifact>
<artifact name="benchmark-common-1.5.0.module">
<sha256 value="3bc1a20e21237973012e62b1b6d9324d9d37c893f2926d838be92c16cd46aed9" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.benchmark" name="benchmark-macro" version="1.5.0">
<artifact name="benchmark-macro-1.5.0.aar">
<sha256 value="252e2e208ac6fc4d08c0e380819c20519982679cbbfa087d225d445b4deb9e33" origin="Generated by Gradle"/>
</artifact>
<artifact name="benchmark-macro-1.5.0.module">
<sha256 value="586d5f7e8978e59b5c46dfc8744e2b3db701d7bfac556a119b13680bf397756e" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.benchmark" name="benchmark-macro-junit4" version="1.5.0">
<artifact name="benchmark-macro-junit4-1.5.0.aar">
<sha256 value="a931079e084f7abdce788272ebaa67584a95a88214d214b409342d865df32c67" origin="Generated by Gradle"/>
</artifact>
<artifact name="benchmark-macro-junit4-1.5.0.module">
<sha256 value="651e9e91009319de3383659d9f6a2b7c496e8e2b46d39a8017fc732466d89dd2" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.benchmark" name="benchmark-traceprocessor" version="1.5.0">
<artifact name="benchmark-traceprocessor-1.5.0.module">
<sha256 value="a1509e8e2fb710b9e8791a900ba0d6012f6f298159bd7ec5664198ed1616e50b" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.benchmark" name="benchmark-traceprocessor-android" version="1.5.0">
<artifact name="benchmark-traceprocessor-android-1.5.0.module">
<sha256 value="9feaf9e660bb6a1f8e154435e06b56e4afd644edfe40e334479f738fffdbd0f6" origin="Generated by Gradle"/>
</artifact>
<artifact name="benchmark-traceprocessor.aar">
<sha256 value="ab4d190c91668e67bc227705af9ef461d05148cc30c230255dac6b71dd9e066f" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.biometric" name="biometric" version="1.1.0"> <component group="androidx.biometric" name="biometric" version="1.1.0">
<artifact name="biometric-1.1.0.aar"> <artifact name="biometric-1.1.0.aar">
<sha256 value="270c7b7d99942d5ec1dd88594e4648feb33d8e31d8c3c2ab2321d49d9abdfc1f" origin="Generated by Gradle"/> <sha256 value="270c7b7d99942d5ec1dd88594e4648feb33d8e31d8c3c2ab2321d49d9abdfc1f" origin="Generated by Gradle"/>
@@ -241,7 +284,18 @@
<sha256 value="4999f205b2b38e31180ad58111e32d564190c2024fbfd58527e2da8bfb67ff65" origin="Generated by Gradle"/> <sha256 value="4999f205b2b38e31180ad58111e32d564190c2024fbfd58527e2da8bfb67ff65" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.cardview" name="cardview" version="1.0.0">
<artifact name="cardview-1.0.0.aar">
<sha256 value="1193c04c22a3d6b5946dae9f4e8c59d6adde6a71b6bd5d87fb99d82dda1afec7" origin="Generated by Gradle"/>
</artifact>
<artifact name="cardview-1.0.0.pom">
<sha256 value="e64ef4e08b58358fe27b599e6fe80a1b153db014c644beee630ab271061c3e6c" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.collection" name="collection" version="1.0.0"> <component group="androidx.collection" name="collection" version="1.0.0">
<artifact name="collection-1.0.0.jar">
<sha256 value="9c8d117b5c2bc120a1cdfeb857e05b495b16c36013570372a708f7827e3ac9f9" origin="Generated by Gradle"/>
</artifact>
<artifact name="collection-1.0.0.pom"> <artifact name="collection-1.0.0.pom">
<sha256 value="a7913a5275ad68e555d2612ebe8c14c367b153e14ca48a1872a64899020e54ef" origin="Generated by Gradle"/> <sha256 value="a7913a5275ad68e555d2612ebe8c14c367b153e14ca48a1872a64899020e54ef" origin="Generated by Gradle"/>
</artifact> </artifact>
@@ -353,6 +407,22 @@
<sha256 value="29e26959b2c5645c53a42aa8302570bf8cc3644755d6ca97bf1028d08a665b97" origin="Generated by Gradle"/> <sha256 value="29e26959b2c5645c53a42aa8302570bf8cc3644755d6ca97bf1028d08a665b97" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.animation" name="animation-core-jvmstubs" version="1.12.1">
<artifact name="animation-core-jvmstubs-1.12.1.jar">
<sha256 value="2576b15d54ee18195ccaf80f3daecad35fbcabb5c0b699438cf59842a285893d" origin="Generated by Gradle"/>
</artifact>
<artifact name="animation-core-jvmstubs-1.12.1.module">
<sha256 value="ee9a5679c9e8fe9718d1e32c4fb588a12d1cb9ee109f22c076afe75cf80696a6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.animation" name="animation-jvmstubs" version="1.12.1">
<artifact name="animation-jvmstubs-1.12.1.jar">
<sha256 value="de2848ad75574e166c25c401ed6fd910a1531470a5feb0ddf76f8cca3aa2c242" origin="Generated by Gradle"/>
</artifact>
<artifact name="animation-jvmstubs-1.12.1.module">
<sha256 value="b1d9c1f9eab0da25e49b1e47f5959fa0df1e7817d43584d1076cb9d6053f5af6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.foundation" name="foundation" version="1.12.1"> <component group="androidx.compose.foundation" name="foundation" version="1.12.1">
<artifact name="foundation-1.12.1.module"> <artifact name="foundation-1.12.1.module">
<sha256 value="2a08dde665f93295d1ab18ec9b75298299d8f243fe2c40e4bb16eb7b28ad6e08" origin="Generated by Gradle"/> <sha256 value="2a08dde665f93295d1ab18ec9b75298299d8f243fe2c40e4bb16eb7b28ad6e08" origin="Generated by Gradle"/>
@@ -366,6 +436,14 @@
<sha256 value="444749ea7b5a563e530504b9035c87e47ed0fb62b9f7ba00e90af8aa81e6bfb8" origin="Generated by Gradle"/> <sha256 value="444749ea7b5a563e530504b9035c87e47ed0fb62b9f7ba00e90af8aa81e6bfb8" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.foundation" name="foundation-jvmstubs" version="1.12.1">
<artifact name="foundation-jvmstubs-1.12.1.jar">
<sha256 value="b9c9d1c0159fd32ec1c1b6c6aae1e216abdebe8dc1e0902ee4de7ffd193362af" origin="Generated by Gradle"/>
</artifact>
<artifact name="foundation-jvmstubs-1.12.1.module">
<sha256 value="9adb61869da1278b84d9911999b9ab6f5b40b1d49564ff1864c01beee16e38b4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.foundation" name="foundation-layout" version="1.12.1"> <component group="androidx.compose.foundation" name="foundation-layout" version="1.12.1">
<artifact name="foundation-layout-1.12.1.module"> <artifact name="foundation-layout-1.12.1.module">
<sha256 value="15b8b8eb927360f0bce19a72754f92b8ab1d06680b010f414244bd484a72b8c9" origin="Generated by Gradle"/> <sha256 value="15b8b8eb927360f0bce19a72754f92b8ab1d06680b010f414244bd484a72b8c9" origin="Generated by Gradle"/>
@@ -379,6 +457,14 @@
<sha256 value="274370a88621e001417e76c2d862ffad61ebc8ca2d9f151c7b60dd02d65ebe51" origin="Generated by Gradle"/> <sha256 value="274370a88621e001417e76c2d862ffad61ebc8ca2d9f151c7b60dd02d65ebe51" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.foundation" name="foundation-layout-jvmstubs" version="1.12.1">
<artifact name="foundation-layout-jvmstubs-1.12.1.jar">
<sha256 value="f7b43a9eb5cb52f9e1e2a245c9cea5199175c77e63cf9e437992c26fe21d35d3" origin="Generated by Gradle"/>
</artifact>
<artifact name="foundation-layout-jvmstubs-1.12.1.module">
<sha256 value="68ed54e846ac4c8fde9779e9dcfc1f300cf0f98c24bf276766039b6c3f4d633b" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.material" name="material-ripple" version="1.12.1"> <component group="androidx.compose.material" name="material-ripple" version="1.12.1">
<artifact name="material-ripple-1.12.1.module"> <artifact name="material-ripple-1.12.1.module">
<sha256 value="c5db9cd2225e801db6fd9607a53ae4d7af6fc1720bf23e479bd69024835cda09" origin="Generated by Gradle"/> <sha256 value="c5db9cd2225e801db6fd9607a53ae4d7af6fc1720bf23e479bd69024835cda09" origin="Generated by Gradle"/>
@@ -392,6 +478,14 @@
<sha256 value="795d8742165875ee96383ca64ff4cd8bc12b83efb0918f68472e7c2f9d5826df" origin="Generated by Gradle"/> <sha256 value="795d8742165875ee96383ca64ff4cd8bc12b83efb0918f68472e7c2f9d5826df" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.material" name="material-ripple-jvmstubs" version="1.12.1">
<artifact name="material-ripple-jvmstubs-1.12.1.jar">
<sha256 value="ab71680f2e83f678c765d2b634261b7c80c6672a733a5dc6aec86c90e5a6485a" origin="Generated by Gradle"/>
</artifact>
<artifact name="material-ripple-jvmstubs-1.12.1.module">
<sha256 value="9f713064b628f68e2e646ba11b9fc1d4cca81b02b130bfc48c07d3f57fa4ee0a" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.material3" name="material3" version="1.4.0"> <component group="androidx.compose.material3" name="material3" version="1.4.0">
<artifact name="material3-1.4.0.module"> <artifact name="material3-1.4.0.module">
<sha256 value="757081d128daf8801c1dd9acc431fa5269e656b28a0a490ae98ccee68e9c3452" origin="Generated by Gradle"/> <sha256 value="757081d128daf8801c1dd9acc431fa5269e656b28a0a490ae98ccee68e9c3452" origin="Generated by Gradle"/>
@@ -405,6 +499,14 @@
<sha256 value="3a37e8b36df3822fe1e6059f0f9fafda8800388860477624ac1b9422c418a36e" origin="Generated by Gradle"/> <sha256 value="3a37e8b36df3822fe1e6059f0f9fafda8800388860477624ac1b9422c418a36e" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.material3" name="material3-jvmstubs" version="1.4.0">
<artifact name="material3-jvmstubs-1.4.0.jar">
<sha256 value="a30c3680b527829ac1f058b306df566e81625d1728aca68739bb9fb10925daf2" origin="Generated by Gradle"/>
</artifact>
<artifact name="material3-jvmstubs-1.4.0.module">
<sha256 value="23f6c9753a99718baa2be29538f62d1518ac53d6dc19992fc2c510473310cba0" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.material3.adaptive" name="adaptive" version="1.3.0"> <component group="androidx.compose.material3.adaptive" name="adaptive" version="1.3.0">
<artifact name="adaptive-1.3.0.module"> <artifact name="adaptive-1.3.0.module">
<sha256 value="dc32d2747e674f27768a4d65e49ee952ac6030a0901eb795430ed23cdfda2119" origin="Generated by Gradle"/> <sha256 value="dc32d2747e674f27768a4d65e49ee952ac6030a0901eb795430ed23cdfda2119" origin="Generated by Gradle"/>
@@ -418,6 +520,14 @@
<sha256 value="a5eb40a72cc8aff8c6f1ae819d778da0f22f8bb9e71fcb43bc90bbc68f90a1df" origin="Generated by Gradle"/> <sha256 value="a5eb40a72cc8aff8c6f1ae819d778da0f22f8bb9e71fcb43bc90bbc68f90a1df" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.material3.adaptive" name="adaptive-jvmstubs" version="1.3.0">
<artifact name="adaptive-jvmstubs-1.3.0.jar">
<sha256 value="ff6466d4eda2608402819601784cf6ce7aa3cac18e3820fbfd81c92dfb3eb609" origin="Generated by Gradle"/>
</artifact>
<artifact name="adaptive-jvmstubs-1.3.0.module">
<sha256 value="1d973c20b2ad649f11fcb388c07d2e00f618669d0bd427a8bd8980f698e428e4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.material3.adaptive" name="adaptive-layout" version="1.3.0"> <component group="androidx.compose.material3.adaptive" name="adaptive-layout" version="1.3.0">
<artifact name="adaptive-layout-1.3.0.module"> <artifact name="adaptive-layout-1.3.0.module">
<sha256 value="67f934a92fe951eff67e3165d59fd6a467c0f1002ce4b90ac92410951a37dfac" origin="Generated by Gradle"/> <sha256 value="67f934a92fe951eff67e3165d59fd6a467c0f1002ce4b90ac92410951a37dfac" origin="Generated by Gradle"/>
@@ -431,6 +541,14 @@
<sha256 value="504a5fde768cb0c802697da68e6fa2e2e27d6d37a626a9c35410633c813f022a" origin="Generated by Gradle"/> <sha256 value="504a5fde768cb0c802697da68e6fa2e2e27d6d37a626a9c35410633c813f022a" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.material3.adaptive" name="adaptive-layout-jvmstubs" version="1.3.0">
<artifact name="adaptive-layout-jvmstubs-1.3.0.jar">
<sha256 value="e83192cb0ce194dd7420ed62264658ee9781dc58b1519218b3d5b9c7cf2ecd70" origin="Generated by Gradle"/>
</artifact>
<artifact name="adaptive-layout-jvmstubs-1.3.0.module">
<sha256 value="4580bfc1ab636e8c80b13f2443ea8945f97b67e528428ee739fb774d8648592c" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.material3.adaptive" name="adaptive-navigation" version="1.3.0"> <component group="androidx.compose.material3.adaptive" name="adaptive-navigation" version="1.3.0">
<artifact name="adaptive-navigation-1.3.0.module"> <artifact name="adaptive-navigation-1.3.0.module">
<sha256 value="5931ccb361df740619473d7e38dd628bb316659ad3af9781ddf4545879ca0f3a" origin="Generated by Gradle"/> <sha256 value="5931ccb361df740619473d7e38dd628bb316659ad3af9781ddf4545879ca0f3a" origin="Generated by Gradle"/>
@@ -444,6 +562,14 @@
<sha256 value="0205752a39813b31f8087497f44a4bde491129e608fedf67f2ff6d0f0c660440" origin="Generated by Gradle"/> <sha256 value="0205752a39813b31f8087497f44a4bde491129e608fedf67f2ff6d0f0c660440" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.material3.adaptive" name="adaptive-navigation-jvmstubs" version="1.3.0">
<artifact name="adaptive-navigation-jvmstubs-1.3.0.jar">
<sha256 value="10b88c49adc4e96eb1e10a168f84e8f5d7dcafe2355a9b8b6d4b0d04f70742c5" origin="Generated by Gradle"/>
</artifact>
<artifact name="adaptive-navigation-jvmstubs-1.3.0.module">
<sha256 value="06862ff765702ce89653bf2a992d1299b089e82a2ec069a6218cf627dbec0809" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime" version="1.12.1"> <component group="androidx.compose.runtime" name="runtime" version="1.12.1">
<artifact name="runtime-1.12.1.module"> <artifact name="runtime-1.12.1.module">
<sha256 value="6229c46e743d284155b9a0d3dbbc9e61ec6ced6a4fbdbef85ce2619895dfbcae" origin="Generated by Gradle"/> <sha256 value="6229c46e743d284155b9a0d3dbbc9e61ec6ced6a4fbdbef85ce2619895dfbcae" origin="Generated by Gradle"/>
@@ -470,6 +596,22 @@
<sha256 value="071d6200f5f34ffb5ce69cc19ee8db577c188832bb472779213d4633eca26565" origin="Generated by Gradle"/> <sha256 value="071d6200f5f34ffb5ce69cc19ee8db577c188832bb472779213d4633eca26565" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.runtime" name="runtime-annotation-jvm" version="1.12.1">
<artifact name="runtime-annotation-jvm-1.12.1.jar">
<sha256 value="e291a6ae01ab71a7f48a568ec9744c6bf9b3f46ef72fbcdeb28c3407ae531c5e" origin="Generated by Gradle"/>
</artifact>
<artifact name="runtime-annotation-jvm-1.12.1.module">
<sha256 value="a6f8f1750e9ca881b16c8823008f7c5167eb955e7df34ef691874cbbd2221e8d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime-desktop" version="1.12.1">
<artifact name="runtime-desktop-1.12.1.jar">
<sha256 value="ed390d7bf7bdba951359d127f4c1ddd223f535f5a6a63078c5c5ac6b6924eb08" origin="Generated by Gradle"/>
</artifact>
<artifact name="runtime-desktop-1.12.1.module">
<sha256 value="2920ed8534406d1206e40faaa733521a8cea7c202993dec5e49b132ebf89d8a4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime-retain" version="1.12.1"> <component group="androidx.compose.runtime" name="runtime-retain" version="1.12.1">
<artifact name="runtime-retain-1.12.1.module"> <artifact name="runtime-retain-1.12.1.module">
<sha256 value="c6f8ad1d5450bb4e647b392b6bdba7795bb1d39e17ce627a2c83130b2087e946" origin="Generated by Gradle"/> <sha256 value="c6f8ad1d5450bb4e647b392b6bdba7795bb1d39e17ce627a2c83130b2087e946" origin="Generated by Gradle"/>
@@ -483,6 +625,14 @@
<sha256 value="6e32111eed0f67ef2ae70c2d9c83cb6bfb54095fe2fb2fdc800febd14d0d7a61" origin="Generated by Gradle"/> <sha256 value="6e32111eed0f67ef2ae70c2d9c83cb6bfb54095fe2fb2fdc800febd14d0d7a61" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.runtime" name="runtime-retain-desktop" version="1.12.1">
<artifact name="runtime-retain-desktop-1.12.1.jar">
<sha256 value="9b7e62a7df333c33eff9e1a6d6c2508a4d8fe4b7a43778075538fe3da4bc4485" origin="Generated by Gradle"/>
</artifact>
<artifact name="runtime-retain-desktop-1.12.1.module">
<sha256 value="02d35a1e94d8d88210b4b0dee56c0f51993f5debddbf0e7b2e42c07f796973a5" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime-saveable" version="1.12.1"> <component group="androidx.compose.runtime" name="runtime-saveable" version="1.12.1">
<artifact name="runtime-saveable-1.12.1.module"> <artifact name="runtime-saveable-1.12.1.module">
<sha256 value="7f2350cdbe4beb8a18fb168a75a2d980c3eae3ee0ac80eee0239793ce3e8671c" origin="Generated by Gradle"/> <sha256 value="7f2350cdbe4beb8a18fb168a75a2d980c3eae3ee0ac80eee0239793ce3e8671c" origin="Generated by Gradle"/>
@@ -496,6 +646,14 @@
<sha256 value="0c83d47820fbc8ffb6e3e49311ccd4755676d6f94bb8c6d8564ab4c799df8779" origin="Generated by Gradle"/> <sha256 value="0c83d47820fbc8ffb6e3e49311ccd4755676d6f94bb8c6d8564ab4c799df8779" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.runtime" name="runtime-saveable-desktop" version="1.12.1">
<artifact name="runtime-saveable-desktop-1.12.1.jar">
<sha256 value="069949667409ab6de21053f9fdbff0869ae2a1f70a7212cdb89e7d409fd2552c" origin="Generated by Gradle"/>
</artifact>
<artifact name="runtime-saveable-desktop-1.12.1.module">
<sha256 value="3f840028380764e1b3341c8f48b8f89247d5f63e60c16864a6b4aa6a5c5bde20" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui" version="1.12.1"> <component group="androidx.compose.ui" name="ui" version="1.12.1">
<artifact name="ui-1.12.1.module"> <artifact name="ui-1.12.1.module">
<sha256 value="522b7fe3ad5c6f5e60319ac66c67fdff2dc47a0c78317f0efa3f87b105c8dc35" origin="Generated by Gradle"/> <sha256 value="522b7fe3ad5c6f5e60319ac66c67fdff2dc47a0c78317f0efa3f87b105c8dc35" origin="Generated by Gradle"/>
@@ -522,6 +680,14 @@
<sha256 value="09a23c76f5d52ea5ec61d4a78d4876940f0f033c975e5c604246f89a63532754" origin="Generated by Gradle"/> <sha256 value="09a23c76f5d52ea5ec61d4a78d4876940f0f033c975e5c604246f89a63532754" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.ui" name="ui-geometry-jvmstubs" version="1.12.1">
<artifact name="ui-geometry-jvmstubs-1.12.1.jar">
<sha256 value="7a0ae0f9bbc27bfa5b594277c0ea488a760c845f0ac8606cdc2286f4b7a197d5" origin="Generated by Gradle"/>
</artifact>
<artifact name="ui-geometry-jvmstubs-1.12.1.module">
<sha256 value="b71262d085e3b98267af0e7165989061cdf66fd9c5ae31c290cb1f413c1e4bc2" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-graphics" version="1.12.1"> <component group="androidx.compose.ui" name="ui-graphics" version="1.12.1">
<artifact name="ui-graphics-1.12.1.module"> <artifact name="ui-graphics-1.12.1.module">
<sha256 value="34c86f9a4ac2d71bd509d229140ecec77cfc3b3590d0b1647751b27ee07ba9d4" origin="Generated by Gradle"/> <sha256 value="34c86f9a4ac2d71bd509d229140ecec77cfc3b3590d0b1647751b27ee07ba9d4" origin="Generated by Gradle"/>
@@ -535,6 +701,22 @@
<sha256 value="1e6451f05ad569e306e7022b3c41d16aa75080bb2c99b59c4d67e7dbf6f428e7" origin="Generated by Gradle"/> <sha256 value="1e6451f05ad569e306e7022b3c41d16aa75080bb2c99b59c4d67e7dbf6f428e7" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.ui" name="ui-graphics-jvmstubs" version="1.12.1">
<artifact name="ui-graphics-jvmstubs-1.12.1.jar">
<sha256 value="296b5ab0dec4a5f695d2faf7e400e37aa596f7f529b26458737bb6733e1b5a1a" origin="Generated by Gradle"/>
</artifact>
<artifact name="ui-graphics-jvmstubs-1.12.1.module">
<sha256 value="12a8f9419dcb6c6a7f5884dd84aff28cb5380dbdedf50033188260486f8daf23" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-jvmstubs" version="1.12.1">
<artifact name="ui-jvmstubs-1.12.1.jar">
<sha256 value="c1ca78285d1936417331483647859ae230a927a598837479c5609295d61dd262" origin="Generated by Gradle"/>
</artifact>
<artifact name="ui-jvmstubs-1.12.1.module">
<sha256 value="3664466431a445d8a53e3e60ec371e7fabdc3c6750e4a32b48a0bfd47266467c" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-test" version="1.12.1"> <component group="androidx.compose.ui" name="ui-test" version="1.12.1">
<artifact name="ui-test-1.12.1.module"> <artifact name="ui-test-1.12.1.module">
<sha256 value="4f7008c6659cabba83cec0a89fafc8bbe2aa232b14de8b34b19e317b06175634" origin="Generated by Gradle"/> <sha256 value="4f7008c6659cabba83cec0a89fafc8bbe2aa232b14de8b34b19e317b06175634" origin="Generated by Gradle"/>
@@ -553,6 +735,19 @@
<sha256 value="58f9b48521da00580fd184c74b1dbbf7879055d55b14e3f46825d991033105f5" origin="Generated by Gradle"/> <sha256 value="58f9b48521da00580fd184c74b1dbbf7879055d55b14e3f46825d991033105f5" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.ui" name="ui-test-junit4-accessibility" version="1.12.1">
<artifact name="ui-test-junit4-accessibility-1.12.1.module">
<sha256 value="a139e2b1844e1f51ae42be17ff077d73ebd113c4bea6aa728ff0e13c3f8afd62" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-test-junit4-accessibility-android" version="1.12.1">
<artifact name="ui-test-junit4-accessibility-android-1.12.1.module">
<sha256 value="458fecfba5d4015953054bd38efedb95feab5cb6504f33f5bb5951508a4b2cca" origin="Generated by Gradle"/>
</artifact>
<artifact name="ui-test-junit4-accessibility.aar">
<sha256 value="7b3e990be97220e166e5c4f054cefc9d30230953ed850dbec9a48a36455a5e47" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-test-junit4-android" version="1.12.1"> <component group="androidx.compose.ui" name="ui-test-junit4-android" version="1.12.1">
<artifact name="ui-test-junit4-android-1.12.1.module"> <artifact name="ui-test-junit4-android-1.12.1.module">
<sha256 value="2fbcff1284ed93d46c98bbb8d2bc806b74032657a33dc017d756d95783a83f93" origin="Generated by Gradle"/> <sha256 value="2fbcff1284ed93d46c98bbb8d2bc806b74032657a33dc017d756d95783a83f93" origin="Generated by Gradle"/>
@@ -582,6 +777,14 @@
<sha256 value="e710a5776966537df09a2e5c4ca1dacc14ca11d7b20a6af16c0e992ddd3aecd3" origin="Generated by Gradle"/> <sha256 value="e710a5776966537df09a2e5c4ca1dacc14ca11d7b20a6af16c0e992ddd3aecd3" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.ui" name="ui-text-jvmstubs" version="1.12.1">
<artifact name="ui-text-jvmstubs-1.12.1.jar">
<sha256 value="0116463f1450a6975160989f9ead6b2fd008ff27575664e54e948f2d6310b43d" origin="Generated by Gradle"/>
</artifact>
<artifact name="ui-text-jvmstubs-1.12.1.module">
<sha256 value="3e4738f3cb9c3db10d2be31e4a07e051750d2c7bbc64a5fe9c8645e01a1ce2cd" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-unit" version="1.12.1"> <component group="androidx.compose.ui" name="ui-unit" version="1.12.1">
<artifact name="ui-unit-1.12.1.module"> <artifact name="ui-unit-1.12.1.module">
<sha256 value="b450aa17675e16108b99dd4b11e10e2535ca68728dff8282da3b4a5aca14adc3" origin="Generated by Gradle"/> <sha256 value="b450aa17675e16108b99dd4b11e10e2535ca68728dff8282da3b4a5aca14adc3" origin="Generated by Gradle"/>
@@ -595,6 +798,14 @@
<sha256 value="97d2bf062395d981435bc8d571b1d5d75587a7f26f3444671b2287f233e18ae7" origin="Generated by Gradle"/> <sha256 value="97d2bf062395d981435bc8d571b1d5d75587a7f26f3444671b2287f233e18ae7" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.ui" name="ui-unit-jvmstubs" version="1.12.1">
<artifact name="ui-unit-jvmstubs-1.12.1.jar">
<sha256 value="ea529c68e590c009a5ba5cfaf984173bda7c491f904648c09e91f07cea183e8c" origin="Generated by Gradle"/>
</artifact>
<artifact name="ui-unit-jvmstubs-1.12.1.module">
<sha256 value="9c0745fdd2d3e4a36e08498bf7f145e67ec2c201cfb13e148de5e6ab8459e7d9" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-util" version="1.12.1"> <component group="androidx.compose.ui" name="ui-util" version="1.12.1">
<artifact name="ui-util-1.12.1.module"> <artifact name="ui-util-1.12.1.module">
<sha256 value="19714591bed384f1c6bacf8c6cde965715e002dcd4e2027d414805603e52a3c0" origin="Generated by Gradle"/> <sha256 value="19714591bed384f1c6bacf8c6cde965715e002dcd4e2027d414805603e52a3c0" origin="Generated by Gradle"/>
@@ -608,6 +819,14 @@
<sha256 value="cd47f06626c19a06086e16823a32e49e0a0c7d903451668da2f777d063507aa5" origin="Generated by Gradle"/> <sha256 value="cd47f06626c19a06086e16823a32e49e0a0c7d903451668da2f777d063507aa5" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.compose.ui" name="ui-util-jvmstubs" version="1.12.1">
<artifact name="ui-util-jvmstubs-1.12.1.jar">
<sha256 value="65e7f5d5b5503db4b124a2e0d606ad8e0262d15543e43cf255a18fbfa4e17665" origin="Generated by Gradle"/>
</artifact>
<artifact name="ui-util-jvmstubs-1.12.1.module">
<sha256 value="6fdd138d39471a52666723a076f09f6dbb8474d06e16a22ffbee27f928881e41" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.concurrent" name="concurrent-futures" version="1.0.0"> <component group="androidx.concurrent" name="concurrent-futures" version="1.0.0">
<artifact name="concurrent-futures-1.0.0.pom"> <artifact name="concurrent-futures-1.0.0.pom">
<sha256 value="4505b9a5e30a9418b59a9ad6702c3e4193aea6e691a3d03cf220c7640ad083e2" origin="Generated by Gradle"/> <sha256 value="4505b9a5e30a9418b59a9ad6702c3e4193aea6e691a3d03cf220c7640ad083e2" origin="Generated by Gradle"/>
@@ -637,6 +856,14 @@
<sha256 value="823f469acd984adfd30b3d0a577eb4f7796a03742a526ef70c1583b594b43b80" origin="Generated by Gradle"/> <sha256 value="823f469acd984adfd30b3d0a577eb4f7796a03742a526ef70c1583b594b43b80" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.coordinatorlayout" name="coordinatorlayout" version="1.1.0">
<artifact name="coordinatorlayout-1.1.0.aar">
<sha256 value="44a9e30abf56af1025c52a0af506fee9c4131aa55efda52f9fd9451211c5e8cb" origin="Generated by Gradle"/>
</artifact>
<artifact name="coordinatorlayout-1.1.0.pom">
<sha256 value="a67c52c9ddfaff2ffb2fd4b97cd94fa382e837ea8a5874d029e0a04fa63e5caf" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.core" name="core" version="1.0.0"> <component group="androidx.core" name="core" version="1.0.0">
<artifact name="core-1.0.0.pom"> <artifact name="core-1.0.0.pom">
<sha256 value="384d529ad668ada4808de29b29a6348f0007c2841ad79cae9a5a089bd68810f5" origin="Generated by Gradle"/> <sha256 value="384d529ad668ada4808de29b29a6348f0007c2841ad79cae9a5a089bd68810f5" origin="Generated by Gradle"/>
@@ -868,6 +1095,11 @@
<sha256 value="0ddc07cc39699f48ecd9ec894b5830c0f09e22e82959294edf37217224c88b7b" origin="Generated by Gradle"/> <sha256 value="0ddc07cc39699f48ecd9ec894b5830c0f09e22e82959294edf37217224c88b7b" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.legacy" name="legacy-support-core-ui" version="1.0.0">
<artifact name="legacy-support-core-ui-1.0.0.pom">
<sha256 value="2baaf7f17551765524bd1e4d2f954a2a0178a112039cf549ba8b7d4b41e66931" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.lifecycle" name="lifecycle-common" version="2.10.0"> <component group="androidx.lifecycle" name="lifecycle-common" version="2.10.0">
<artifact name="lifecycle-common-2.10.0.module"> <artifact name="lifecycle-common-2.10.0.module">
<sha256 value="5d1247b1edfbdc9ddedcbe525c9d2629567b1c538cb7a9c620cd044a124b5c73" origin="Generated by Gradle"/> <sha256 value="5d1247b1edfbdc9ddedcbe525c9d2629567b1c538cb7a9c620cd044a124b5c73" origin="Generated by Gradle"/>
@@ -1043,6 +1275,14 @@
<sha256 value="7f154066fed1c9162870f728b208352831b3d1f8f23f5d388958a50ca4e9f441" origin="Generated by Gradle"/> <sha256 value="7f154066fed1c9162870f728b208352831b3d1f8f23f5d388958a50ca4e9f441" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.lifecycle" name="lifecycle-runtime" version="2.3.1">
<artifact name="lifecycle-runtime-2.3.1.aar">
<sha256 value="dd294f4a689c71ff877fd41f3b67a3a62f7760d44ce420e6130f1fc3569d8f00" origin="Generated by Gradle"/>
</artifact>
<artifact name="lifecycle-runtime-2.3.1.module">
<sha256 value="2a7b90e5049b674b36bccfd68677b3a0b3178b3f7c2ef7ddf618d3895598c4ce" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.lifecycle" name="lifecycle-runtime" version="2.6.1"> <component group="androidx.lifecycle" name="lifecycle-runtime" version="2.6.1">
<artifact name="lifecycle-runtime-2.6.1.aar"> <artifact name="lifecycle-runtime-2.6.1.aar">
<sha256 value="4867fd5279742fba8388821930cb2affe06d81a52814e7e41e70392ea0ef887c" origin="Generated by Gradle"/> <sha256 value="4867fd5279742fba8388821930cb2affe06d81a52814e7e41e70392ea0ef887c" origin="Generated by Gradle"/>
@@ -1090,6 +1330,27 @@
<sha256 value="7b31489e6e162143c481f14e1ae5a4dc089f8ec58e65976a0502b910c641987f" origin="Generated by Gradle"/> <sha256 value="7b31489e6e162143c481f14e1ae5a4dc089f8ec58e65976a0502b910c641987f" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.lifecycle" name="lifecycle-runtime-compose-desktop" version="2.11.0">
<artifact name="lifecycle-runtime-compose-desktop-2.11.0.jar">
<sha256 value="d5336753ea4d5881ccfb8b0613e034eb241f0d8b4349536df1cd0ec86cf63664" origin="Generated by Gradle"/>
</artifact>
<artifact name="lifecycle-runtime-compose-desktop-2.11.0.module">
<sha256 value="994fc431d3fd62728b9cec8db3d322ffa8db9f02286bddec6c87b9fce9ea68e5" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.lifecycle" name="lifecycle-runtime-desktop" version="2.10.0">
<artifact name="lifecycle-runtime-desktop-2.10.0.module">
<sha256 value="2eeef8084cf67129e199227a3fabacf8506f57faeecb0aab0f765d5c4e59040a" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.lifecycle" name="lifecycle-runtime-desktop" version="2.11.0">
<artifact name="lifecycle-runtime-desktop-2.11.0.jar">
<sha256 value="09f75a4a8d763cee5d6af36f422139a0205d3f6df2e2c5288cae42836f0b36ea" origin="Generated by Gradle"/>
</artifact>
<artifact name="lifecycle-runtime-desktop-2.11.0.module">
<sha256 value="a87b257dd27d02ba2ce83396c1268469ec9fb7866e147285617298888e36cb7a" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.lifecycle" name="lifecycle-runtime-ktx" version="2.10.0"> <component group="androidx.lifecycle" name="lifecycle-runtime-ktx" version="2.10.0">
<artifact name="lifecycle-runtime-ktx-2.10.0.module"> <artifact name="lifecycle-runtime-ktx-2.10.0.module">
<sha256 value="556f15957376858b6e3abc08fb3df566ea5eb4067149253194bf2a049606db4e" origin="Generated by Gradle"/> <sha256 value="556f15957376858b6e3abc08fb3df566ea5eb4067149253194bf2a049606db4e" origin="Generated by Gradle"/>
@@ -1197,6 +1458,22 @@
<sha256 value="2bafd402807bd4af05c06cf58c48cbdad09521e2145273faae90908b7712f689" origin="Generated by Gradle"/> <sha256 value="2bafd402807bd4af05c06cf58c48cbdad09521e2145273faae90908b7712f689" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.lifecycle" name="lifecycle-viewmodel-compose-desktop" version="2.11.0">
<artifact name="lifecycle-viewmodel-compose-desktop-2.11.0.jar">
<sha256 value="1b4c58125c7b3693444f40c8ab76881d17fa74726860c24872a3dec3e0fad34b" origin="Generated by Gradle"/>
</artifact>
<artifact name="lifecycle-viewmodel-compose-desktop-2.11.0.module">
<sha256 value="9551a87ec6304930248d9578fd0ddaca72bad76de46748405866a34e827a12c4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.lifecycle" name="lifecycle-viewmodel-desktop" version="2.11.0">
<artifact name="lifecycle-viewmodel-desktop-2.11.0.jar">
<sha256 value="175c349266ccbb6a2036615725b7066ee3f3319665c98af42206ab3a582a43c3" origin="Generated by Gradle"/>
</artifact>
<artifact name="lifecycle-viewmodel-desktop-2.11.0.module">
<sha256 value="f3dc0eee174e29700719a403833dadfbb8e7dfa93dc874235e008f386d289659" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.lifecycle" name="lifecycle-viewmodel-ktx" version="2.10.0"> <component group="androidx.lifecycle" name="lifecycle-viewmodel-ktx" version="2.10.0">
<artifact name="lifecycle-viewmodel-ktx-2.10.0.aar"> <artifact name="lifecycle-viewmodel-ktx-2.10.0.aar">
<sha256 value="54295ac86b67886dc0613e38f621c531995d0662005fc763e340e19a90994f84" origin="Generated by Gradle"/> <sha256 value="54295ac86b67886dc0613e38f621c531995d0662005fc763e340e19a90994f84" origin="Generated by Gradle"/>
@@ -1265,6 +1542,19 @@
<sha256 value="1761707c1ddee002bd97e1a0889a5016f7cd6bd8e0b6b069bcba8b2523d63723" origin="Generated by Gradle"/> <sha256 value="1761707c1ddee002bd97e1a0889a5016f7cd6bd8e0b6b069bcba8b2523d63723" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.lifecycle" name="lifecycle-viewmodel-savedstate-desktop" version="2.10.0">
<artifact name="lifecycle-viewmodel-savedstate-desktop-2.10.0.module">
<sha256 value="59b7367fbd82b74a6053291a12743cac0c2cf1fe96929378c51d82bf8fe9a95d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.lifecycle" name="lifecycle-viewmodel-savedstate-desktop" version="2.11.0">
<artifact name="lifecycle-viewmodel-savedstate-desktop-2.11.0.jar">
<sha256 value="ca21720ce7f370cb21cabb5329b959eda624107ec06282e3bdc92582917b1d27" origin="Generated by Gradle"/>
</artifact>
<artifact name="lifecycle-viewmodel-savedstate-desktop-2.11.0.module">
<sha256 value="967d1fda42644b55e8f8f594dda287049d1313c1fd2437a1662567683f7e8c07" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.loader" name="loader" version="1.0.0"> <component group="androidx.loader" name="loader" version="1.0.0">
<artifact name="loader-1.0.0.aar"> <artifact name="loader-1.0.0.aar">
<sha256 value="11f735cb3b55c458d470bed9e25254375b518b4b1bad6926783a7026db0f5025" origin="Generated by Gradle"/> <sha256 value="11f735cb3b55c458d470bed9e25254375b518b4b1bad6926783a7026db0f5025" origin="Generated by Gradle"/>
@@ -1286,6 +1576,14 @@
<sha256 value="f48515e309202935758c709ae9bfbb09c26922d70cea77123683497ed6a833b9" origin="Generated by Gradle"/> <sha256 value="f48515e309202935758c709ae9bfbb09c26922d70cea77123683497ed6a833b9" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.navigation3" name="navigation3-runtime-desktop" version="1.2.0">
<artifact name="navigation3-runtime-desktop-1.2.0.jar">
<sha256 value="430fc8ccfd959f5079009921ad5052320fac9d93e7eb52af9cdc21562a6fc442" origin="Generated by Gradle"/>
</artifact>
<artifact name="navigation3-runtime-desktop-1.2.0.module">
<sha256 value="b46511821e1034745f4b446f0437a6fa2df17524bdf5af578bc73c3d9f54bc7b" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.navigation3" name="navigation3-ui" version="1.2.0"> <component group="androidx.navigation3" name="navigation3-ui" version="1.2.0">
<artifact name="navigation3-ui-1.2.0.module"> <artifact name="navigation3-ui-1.2.0.module">
<sha256 value="122c7fabde2f429e918dc78bbbf96aae6e20efdcabe1fff661bfeeb9cd9d8f28" origin="Generated by Gradle"/> <sha256 value="122c7fabde2f429e918dc78bbbf96aae6e20efdcabe1fff661bfeeb9cd9d8f28" origin="Generated by Gradle"/>
@@ -1299,6 +1597,14 @@
<sha256 value="ce00086ea93af85e1adc332afae5b260707b8c6c75faa05f0fdc22995bad3173" origin="Generated by Gradle"/> <sha256 value="ce00086ea93af85e1adc332afae5b260707b8c6c75faa05f0fdc22995bad3173" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.navigation3" name="navigation3-ui-jvmstubs" version="1.2.0">
<artifact name="navigation3-ui-jvmstubs-1.2.0.jar">
<sha256 value="04f51079a4839a0d86fd7c159d21c5475fdb78b2dbb903a49807f3c4d45020ad" origin="Generated by Gradle"/>
</artifact>
<artifact name="navigation3-ui-jvmstubs-1.2.0.module">
<sha256 value="564ca681d449317405b36425d43ac1fbec553b4311a41fdad1fc23c6e7907380" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.navigationevent" name="navigationevent" version="1.0.0"> <component group="androidx.navigationevent" name="navigationevent" version="1.0.0">
<artifact name="navigationevent-1.0.0.module"> <artifact name="navigationevent-1.0.0.module">
<sha256 value="f33f1e030a0a7d10aab608a5a5d3ff70d25df325ce825ca204aa19c0e0578b53" origin="Generated by Gradle"/> <sha256 value="f33f1e030a0a7d10aab608a5a5d3ff70d25df325ce825ca204aa19c0e0578b53" origin="Generated by Gradle"/>
@@ -1340,6 +1646,22 @@
<sha256 value="4c978461881d0506dd8d38deb25f84f56ea28756a14e583f2561c0ee98dff2d6" origin="Generated by Gradle"/> <sha256 value="4c978461881d0506dd8d38deb25f84f56ea28756a14e583f2561c0ee98dff2d6" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.navigationevent" name="navigationevent-compose-desktop" version="1.1.1">
<artifact name="navigationevent-compose-desktop-1.1.1.jar">
<sha256 value="1d7d20d7826a2cc63ace9862cddd8a7085a11a3ea2cff258c28b3d58e57f143b" origin="Generated by Gradle"/>
</artifact>
<artifact name="navigationevent-compose-desktop-1.1.1.module">
<sha256 value="3f25078efa15f7860f16c9d0384cea009d77a839213837c893b7ae54bfd35356" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.navigationevent" name="navigationevent-desktop" version="1.1.1">
<artifact name="navigationevent-desktop-1.1.1.jar">
<sha256 value="4c92508d4bd3b9cafb2785e8211057d39ed8465b529660223864a19625cedb5b" origin="Generated by Gradle"/>
</artifact>
<artifact name="navigationevent-desktop-1.1.1.module">
<sha256 value="ff1ff2b5ad10315fea2994ebf95631d61d6e07c9bf3f89d24dd2096cc0032094" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.profileinstaller" name="profileinstaller" version="1.3.1"> <component group="androidx.profileinstaller" name="profileinstaller" version="1.3.1">
<artifact name="profileinstaller-1.3.1.aar"> <artifact name="profileinstaller-1.3.1.aar">
<sha256 value="d0e402ec31f24028a1dc7eb6a0a3f9d9635c1459392cd734396343b73d673948" origin="Generated by Gradle"/> <sha256 value="d0e402ec31f24028a1dc7eb6a0a3f9d9635c1459392cd734396343b73d673948" origin="Generated by Gradle"/>
@@ -1356,6 +1678,27 @@
<sha256 value="39bf997a28d8eed2cb319819f6f352a1ba3a78b9c979004fbe05e26b8f7d160b" origin="Generated by Gradle"/> <sha256 value="39bf997a28d8eed2cb319819f6f352a1ba3a78b9c979004fbe05e26b8f7d160b" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.profileinstaller" name="profileinstaller" version="1.4.1">
<artifact name="profileinstaller-1.4.1.aar">
<sha256 value="b519f9317ded1e2c1c2993038c0692e30da326ca99097d9331ff2d3a5861a428" origin="Generated by Gradle"/>
</artifact>
<artifact name="profileinstaller-1.4.1.module">
<sha256 value="6f11cf65e4bf8444995cc73e5aa3f81b082d66e720c0592bc5fc80d3f73850f7" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.recyclerview" name="recyclerview" version="1.0.0">
<artifact name="recyclerview-1.0.0.pom">
<sha256 value="8831c06417fab6a9690c25f6e4b347b2e8c03cf6d47337be9c57e75b7fb23e6a" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.recyclerview" name="recyclerview" version="1.1.0">
<artifact name="recyclerview-1.1.0.aar">
<sha256 value="f0d2b5a67d0a91ee1b1c73ef2b636a81f3563925ddd15a1d4e1c41ec28de7a4f" origin="Generated by Gradle"/>
</artifact>
<artifact name="recyclerview-1.1.0.pom">
<sha256 value="fe321062a6e4e168b9c2b39a1137564c8784a2e5849402729768d5d7c4d972ef" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.savedstate" name="savedstate" version="1.0.0"> <component group="androidx.savedstate" name="savedstate" version="1.0.0">
<artifact name="savedstate-1.0.0.pom"> <artifact name="savedstate-1.0.0.pom">
<sha256 value="844d7d22fcea798c78bf5559229daf88ec9cad8136f5eea0a29aa76b3f8fde7c" origin="Generated by Gradle"/> <sha256 value="844d7d22fcea798c78bf5559229daf88ec9cad8136f5eea0a29aa76b3f8fde7c" origin="Generated by Gradle"/>
@@ -1400,6 +1743,22 @@
<sha256 value="0f0ae3032d6c6eea834ee22179c8976160d09d841d30e47f53f56b1b3438774b" origin="Generated by Gradle"/> <sha256 value="0f0ae3032d6c6eea834ee22179c8976160d09d841d30e47f53f56b1b3438774b" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.savedstate" name="savedstate-compose-desktop" version="1.4.0">
<artifact name="savedstate-compose-desktop-1.4.0.jar">
<sha256 value="c02a98b0c2b35cdde245c0bfe6e7ff453c7b6d06a5eb8681d25b7f54b874ea48" origin="Generated by Gradle"/>
</artifact>
<artifact name="savedstate-compose-desktop-1.4.0.module">
<sha256 value="808ff723a153acce160489a5bc4b58ca1d7033fe84a9060f52d17db227eaa4cd" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.savedstate" name="savedstate-desktop" version="1.4.0">
<artifact name="savedstate-desktop-1.4.0.jar">
<sha256 value="e965ed7a011be83a271ac7d82249a776368479ee3a2b07948c3445b51d640856" origin="Generated by Gradle"/>
</artifact>
<artifact name="savedstate-desktop-1.4.0.module">
<sha256 value="e73f2cf8818ece347d8b5dff990d0db639a7dfb8fcc85eeecb2618383f7ecef7" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.savedstate" name="savedstate-ktx" version="1.2.1"> <component group="androidx.savedstate" name="savedstate-ktx" version="1.2.1">
<artifact name="savedstate-ktx-1.2.1.aar"> <artifact name="savedstate-ktx-1.2.1.aar">
<sha256 value="8553f87e7136c24ec5243560f48f1c32cba56daa77722f89589a5cafcb8f7894" origin="Generated by Gradle"/> <sha256 value="8553f87e7136c24ec5243560f48f1c32cba56daa77722f89589a5cafcb8f7894" origin="Generated by Gradle"/>
@@ -1466,6 +1825,22 @@
<sha256 value="681cf08c41700c73b146953867c0ac826da9c2a810bd2a4a8f878ea11c64d40c" origin="Generated by Gradle"/> <sha256 value="681cf08c41700c73b146953867c0ac826da9c2a810bd2a4a8f878ea11c64d40c" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.test" name="rules" version="1.4.0">
<artifact name="rules-1.4.0.aar">
<sha256 value="01401cd7d1185530f6081ce503ce611d18d8a483ea15599a16c39f15b2f8e7d8" origin="Generated by Gradle"/>
</artifact>
<artifact name="rules-1.4.0.pom">
<sha256 value="01545f7b65d7e6255df4601257ac89854fedbe72e5df8ddd642c7de5fcdfc197" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.test" name="rules" version="1.5.0">
<artifact name="rules-1.5.0.aar">
<sha256 value="dd645929c63e24f41be8e6f57bb06f305d3b02ed1b2a7d961647027ae1d9e17f" origin="Generated by Gradle"/>
</artifact>
<artifact name="rules-1.5.0.pom">
<sha256 value="aa11334fba453ceaccc650ee5894aea940b61df088307384fcdd6473ad2874b0" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.test" name="runner" version="1.7.0"> <component group="androidx.test" name="runner" version="1.7.0">
<artifact name="runner-1.7.0.aar"> <artifact name="runner-1.7.0.aar">
<sha256 value="970311c47119928a2e406a88892a3d270387cc5a49a181a1c44511105b41b818" origin="Generated by Gradle"/> <sha256 value="970311c47119928a2e406a88892a3d270387cc5a49a181a1c44511105b41b818" origin="Generated by Gradle"/>
@@ -1514,6 +1889,14 @@
<sha256 value="4cff0df04cae25831e821ef2f9129245783460e98d0fd67d8f6824065a134c4e" origin="Generated by Gradle"/> <sha256 value="4cff0df04cae25831e821ef2f9129245783460e98d0fd67d8f6824065a134c4e" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.test.ext" name="junit" version="1.2.1">
<artifact name="junit-1.2.1.aar">
<sha256 value="7b146a73c545b983430d2fae0081df67c76722c19a9abd2904e131696a8c5b20" origin="Generated by Gradle"/>
</artifact>
<artifact name="junit-1.2.1.pom">
<sha256 value="983e474e47aafea0d078c4bd0b72aab1a292aceac198856371a02e1e1cb51751" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.test.services" name="storage" version="1.6.0"> <component group="androidx.test.services" name="storage" version="1.6.0">
<artifact name="storage-1.6.0.aar"> <artifact name="storage-1.6.0.aar">
<sha256 value="f97e3cf6aaf4e3fb97ef219d37a9c0a0720183c1f6db87b37642521e26fb6d30" origin="Generated by Gradle"/> <sha256 value="f97e3cf6aaf4e3fb97ef219d37a9c0a0720183c1f6db87b37642521e26fb6d30" origin="Generated by Gradle"/>
@@ -1522,6 +1905,32 @@
<sha256 value="8e5d72e2bceef6ef807bc38834dbc7aa53177fd20da349f53dce5a4f2a028bbf" origin="Generated by Gradle"/> <sha256 value="8e5d72e2bceef6ef807bc38834dbc7aa53177fd20da349f53dce5a4f2a028bbf" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.test.uiautomator" name="uiautomator" version="2.3.0">
<artifact name="uiautomator-2.3.0.module">
<sha256 value="639b1bbaae4eaa538675ba9866a55888e08d640440f0911e26667553b2af3f71" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.test.uiautomator" name="uiautomator" version="2.4.0">
<artifact name="uiautomator-2.4.0.aar">
<sha256 value="e7c57391d8baa1435c242334f605c4a282d03695442032622438b23bf2c6c904" origin="Generated by Gradle"/>
</artifact>
<artifact name="uiautomator-2.4.0.module">
<sha256 value="89a0a85e623cec2989c7bd5160de68890ce40c23d9d19af7b46e7d82924ece33" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.test.uiautomator" name="uiautomator-shell" version="2.4.0">
<artifact name="uiautomator-shell-2.4.0.module">
<sha256 value="164b4a050954e517d6fba4fd3713fa880ef0c358d5a5d551b84fa0bd33d12d0c" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.test.uiautomator" name="uiautomator-shell-android" version="2.4.0">
<artifact name="uiautomator-shell-android-2.4.0.module">
<sha256 value="607b7ec8328c7ad211098008a4dc70343c2f31d81969cdcb22800686f5d66da1" origin="Generated by Gradle"/>
</artifact>
<artifact name="uiautomator-shell.aar">
<sha256 value="aa97c53f034c7ffed41975b2c37b82b02b23b3cd28be61a1281edd29014bbcc4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.tracing" name="tracing" version="1.0.0"> <component group="androidx.tracing" name="tracing" version="1.0.0">
<artifact name="tracing-1.0.0.aar"> <artifact name="tracing-1.0.0.aar">
<sha256 value="07b8b6139665b884a162eccf97891ca50f7f56831233bf25168ae04f7b568612" origin="Generated by Gradle"/> <sha256 value="07b8b6139665b884a162eccf97891ca50f7f56831233bf25168ae04f7b568612" origin="Generated by Gradle"/>
@@ -1559,6 +1968,64 @@
<sha256 value="b21800b83ed0e3e214742c8a94edee90130e0a9970c85e59161d161546f5fe9a" origin="Generated by Gradle"/> <sha256 value="b21800b83ed0e3e214742c8a94edee90130e0a9970c85e59161d161546f5fe9a" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.tracing" name="tracing-desktop" version="2.0.0">
<artifact name="tracing-desktop-2.0.0.jar">
<sha256 value="cc3c640b8ee4e3b74d2bc0532e829f546b2fe55c6dd8ee4a8e57583453244d8e" origin="Generated by Gradle"/>
</artifact>
<artifact name="tracing-desktop-2.0.0.module">
<sha256 value="ae3f2625d86bd8c48923345b2e220e49b2c05a908057bedacf31c3f6a954b8b2" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.tracing" name="tracing-ktx" version="1.0.0">
<artifact name="tracing-ktx-1.0.0.module">
<sha256 value="f426e636a23a05db8c7fabf2b959f4dab80c9ca97b5131bf411d422555c48c18" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.tracing" name="tracing-ktx" version="1.1.0">
<artifact name="tracing-ktx-1.1.0.aar">
<sha256 value="914d8c83aa16455d431b5b3af306cef0eb0a0bfd6550d097e39ad475435bf56c" origin="Generated by Gradle"/>
</artifact>
<artifact name="tracing-ktx-1.1.0.module">
<sha256 value="6ec8aa998df9b964424c7ab215738237a9b2cc4301da135bb9b8cdc62325fb3e" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.tracing" name="tracing-perfetto" version="1.0.1">
<artifact name="tracing-perfetto-1.0.1.aar">
<sha256 value="5387298b5bdd8f7d98315fe8720a757056ba0b9b5d9544d2e3fabc26b9ac55a6" origin="Generated by Gradle"/>
</artifact>
<artifact name="tracing-perfetto-1.0.1.module">
<sha256 value="bd8aaac0267779a248542cfd5ff1b409a0e5cdf6734d38260125a20c61b83c6e" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.tracing" name="tracing-perfetto-binary" version="1.0.1">
<artifact name="tracing-perfetto-binary-1.0.1.aar">
<sha256 value="e42bb39e5aa180299d94ba230011371bb4b2f6234afda44a0a2e6f830751d4c6" origin="Generated by Gradle"/>
</artifact>
<artifact name="tracing-perfetto-binary-1.0.1.module">
<sha256 value="183a2ac0261cf508d4963464691b71aa58a2c7b248c5e4ae0efbca8a79368562" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.tracing" name="tracing-perfetto-handshake" version="1.0.0">
<artifact name="tracing-perfetto-handshake-1.0.0.module">
<sha256 value="baba97bfc2834fbd29275ce3e250ac814305bd0d4beb8b3594248424cc6ff385" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.tracing" name="tracing-perfetto-handshake" version="1.0.1">
<artifact name="tracing-perfetto-handshake-1.0.1.jar">
<sha256 value="db6c24b137160567ffb86ffb13b2f298226e19a9e0e49b2b0d989bc9466e6df8" origin="Generated by Gradle"/>
</artifact>
<artifact name="tracing-perfetto-handshake-1.0.1.module">
<sha256 value="fd29e4a223b9118b1f6dc78ab7d11536086be9d64b5b7b0b9657bbaf27056dcf" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.transition" name="transition" version="1.2.0">
<artifact name="transition-1.2.0.aar">
<sha256 value="a1e059b3bc0b43a58dec0efecdcaa89c82d2bca552ea5bacf6656c46e853157e" origin="Generated by Gradle"/>
</artifact>
<artifact name="transition-1.2.0.pom">
<sha256 value="247f12757acabd706b069445fd31c83c016cc7fe67b0468c582d043ea7d20de1" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.vectordrawable" name="vectordrawable" version="1.1.0"> <component group="androidx.vectordrawable" name="vectordrawable" version="1.1.0">
<artifact name="vectordrawable-1.1.0.aar"> <artifact name="vectordrawable-1.1.0.aar">
<sha256 value="46fd633ac01b49b7fcabc263bf098c5a8b9e9a69774d234edcca04fb02df8e26" origin="Generated by Gradle"/> <sha256 value="46fd633ac01b49b7fcabc263bf098c5a8b9e9a69774d234edcca04fb02df8e26" origin="Generated by Gradle"/>
@@ -1601,6 +2068,14 @@
<sha256 value="1f72f836339d03c6eb013f65075e76ca87075a577578eb4f95f74a3a5d253128" origin="Generated by Gradle"/> <sha256 value="1f72f836339d03c6eb013f65075e76ca87075a577578eb4f95f74a3a5d253128" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.viewpager2" name="viewpager2" version="1.0.0">
<artifact name="viewpager2-1.0.0.aar">
<sha256 value="e95c0031d4cc247cd48196c6287e58d2cee54d9c79b85afea7c90920330275af" origin="Generated by Gradle"/>
</artifact>
<artifact name="viewpager2-1.0.0.pom">
<sha256 value="4063bca7fe94fe65c98f4168f97ae10e02da0248598ad3ac21c432c7f608a17a" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.window" name="window" version="1.5.0"> <component group="androidx.window" name="window" version="1.5.0">
<artifact name="window-1.5.0.aar"> <artifact name="window-1.5.0.aar">
<sha256 value="5de2d48aa578402f46deb5294a955cee62f0c7d8c1840ef626fc7afb8abe22f9" origin="Generated by Gradle"/> <sha256 value="5de2d48aa578402f46deb5294a955cee62f0c7d8c1840ef626fc7afb8abe22f9" origin="Generated by Gradle"/>
@@ -1622,6 +2097,14 @@
<sha256 value="d0d50db0756194a6d49a66ad8dafd17b24b4c5fbd8379375056e2eb9bdfeaf22" origin="Generated by Gradle"/> <sha256 value="d0d50db0756194a6d49a66ad8dafd17b24b4c5fbd8379375056e2eb9bdfeaf22" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="androidx.window" name="window-core-jvm" version="1.5.0">
<artifact name="window-core-jvm-1.5.0.jar">
<sha256 value="c3bef837bbeb9caeb9ac2570ee015f6fa02cd80cdfa30a2e360f9671e60737e0" origin="Generated by Gradle"/>
</artifact>
<artifact name="window-core-jvm-1.5.0.module">
<sha256 value="9ebdef127cace4bae5ba825fcfda9e5c0a1a6df96dc2057819de5795617da715" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="ch.qos.logback" name="logback-classic" version="1.3.15"> <component group="ch.qos.logback" name="logback-classic" version="1.3.15">
<artifact name="logback-classic-1.3.15.jar"> <artifact name="logback-classic-1.3.15.jar">
<sha256 value="06c68fb7468143c3c6512d13bb8eb6676724b019330de3a5ab493e267dde2084" origin="Generated by Gradle"/> <sha256 value="06c68fb7468143c3c6512d13bb8eb6676724b019330de3a5ab493e267dde2084" origin="Generated by Gradle"/>
@@ -1677,6 +2160,11 @@
<sha256 value="1e238a7cf7d4b5cd72c8b2672e94f02fe2129d53f46e7ba413017ef27e84bbc2" origin="Generated by Gradle"/> <sha256 value="1e238a7cf7d4b5cd72c8b2672e94f02fe2129d53f46e7ba413017ef27e84bbc2" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="com.android.test" name="com.android.test.gradle.plugin" version="9.4.1">
<artifact name="com.android.test.gradle.plugin-9.4.1.pom">
<sha256 value="63476090273133a731474b4705dd4ac68422b89b31a8bf9a715c15dab51ee4b2" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools" name="annotations" version="32.4.1"> <component group="com.android.tools" name="annotations" version="32.4.1">
<artifact name="annotations-32.4.1.jar"> <artifact name="annotations-32.4.1.jar">
<sha256 value="32e90226ae4c7b59ed61b06689ae8356bab080cd79f6569455fd92925439a339" origin="Generated by Gradle"/> <sha256 value="32e90226ae4c7b59ed61b06689ae8356bab080cd79f6569455fd92925439a339" origin="Generated by Gradle"/>
@@ -2042,6 +2530,22 @@
<sha256 value="42e19164ac1058a8f86f5929bad928d749e96376c5e58499924f441fff67f714" origin="Generated by Gradle"/> <sha256 value="42e19164ac1058a8f86f5929bad928d749e96376c5e58499924f441fff67f714" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="com.google.android.apps.common.testing.accessibility.framework" name="accessibility-test-framework" version="4.1.1">
<artifact name="accessibility-test-framework-4.1.1.aar">
<sha256 value="f19c550163f277a2aebe7e002a7988c3544c693ee29dd7ac4d4747c2971e2c45" origin="Generated by Gradle"/>
</artifact>
<artifact name="accessibility-test-framework-4.1.1.pom">
<sha256 value="c038e90864935f4b4fe50ece742c41ee33ca490149f780328929811e8548c1b6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.android.material" name="material" version="1.2.0-rc01">
<artifact name="material-1.2.0-rc01.aar">
<sha256 value="2c0d2b3fbce154182e9e20bb647b8aa29f0f7d8d9dc825c4e9346f72a2722840" origin="Generated by Gradle"/>
</artifact>
<artifact name="material-1.2.0-rc01.module">
<sha256 value="00207c2ec4cd663d6b10223faa0980e99c2cb4b03eafc026335848575342dc62" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.auto" name="auto-parent" version="6"> <component group="com.google.auto" name="auto-parent" version="6">
<artifact name="auto-parent-6.pom"> <artifact name="auto-parent-6.pom">
<sha256 value="05f740c6648165db00cf618dd56c200c4725e358e6d54f5853e0bec15734ea0a" origin="Generated by Gradle"/> <sha256 value="05f740c6648165db00cf618dd56c200c4725e358e6d54f5853e0bec15734ea0a" origin="Generated by Gradle"/>
@@ -2301,6 +2805,14 @@
<sha256 value="c75752dd6f526c4afbf6adb818b805c8bfd7429e3cad805afcdacc5258dcd2e9" origin="Generated by Gradle"/> <sha256 value="c75752dd6f526c4afbf6adb818b805c8bfd7429e3cad805afcdacc5258dcd2e9" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="com.google.guava" name="failureaccess" version="1.0.1">
<artifact name="failureaccess-1.0.1.jar">
<sha256 value="a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26" origin="Generated by Gradle"/>
</artifact>
<artifact name="failureaccess-1.0.1.pom">
<sha256 value="e96042ce78fecba0da2be964522947c87b40a291b5fd3cd672a434924103c4b9" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.guava" name="failureaccess" version="1.0.2"> <component group="com.google.guava" name="failureaccess" version="1.0.2">
<artifact name="failureaccess-1.0.2.jar"> <artifact name="failureaccess-1.0.2.jar">
<sha256 value="8a8f81cf9b359e3f6dfa691a1e776985c061ef2f223c9b2c80753e1b458e8064" origin="Generated by Gradle"/> <sha256 value="8a8f81cf9b359e3f6dfa691a1e776985c061ef2f223c9b2c80753e1b458e8064" origin="Generated by Gradle"/>
@@ -2317,6 +2829,14 @@
<sha256 value="c54beff37f6d42d43e14722d54a522c9ad51ef97fc5b79277e62a3ebf882f3bb" origin="Generated by Gradle"/> <sha256 value="c54beff37f6d42d43e14722d54a522c9ad51ef97fc5b79277e62a3ebf882f3bb" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="com.google.guava" name="guava" version="31.0.1-android">
<artifact name="guava-31.0.1-android.jar">
<sha256 value="9425a423a4cb9d9db0356300722d9bd8e634cf539f29d97bb84f457cccd16eb8" origin="Generated by Gradle"/>
</artifact>
<artifact name="guava-31.0.1-android.pom">
<sha256 value="13d4e2998aac652fc6d7b9eaf3e495fa2952bf98ef68a2c49aa5eaa0bbe731a9" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.guava" name="guava" version="33.4.0-jre"> <component group="com.google.guava" name="guava" version="33.4.0-jre">
<artifact name="guava-33.4.0-jre.jar"> <artifact name="guava-33.4.0-jre.jar">
<sha256 value="b918c98a7e44dbe94ebd9fe3e40cddaadb5a93e6a78eb6008b42df237241e538" origin="Generated by Gradle"/> <sha256 value="b918c98a7e44dbe94ebd9fe3e40cddaadb5a93e6a78eb6008b42df237241e538" origin="Generated by Gradle"/>
@@ -2338,6 +2858,11 @@
<sha256 value="f8698ab46ca996ce889c1afc8ca4f25eb8ac6b034dc898d4583742360016cc04" origin="Generated by Gradle"/> <sha256 value="f8698ab46ca996ce889c1afc8ca4f25eb8ac6b034dc898d4583742360016cc04" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="com.google.guava" name="guava-parent" version="31.0.1-android">
<artifact name="guava-parent-31.0.1-android.pom">
<sha256 value="30a51d34b075c9b4eb6a2da3fba6c1f5047b45225a3a03aebcefc0b7880e5735" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.guava" name="guava-parent" version="33.4.0-android"> <component group="com.google.guava" name="guava-parent" version="33.4.0-android">
<artifact name="guava-parent-33.4.0-android.pom"> <artifact name="guava-parent-33.4.0-android.pom">
<sha256 value="7220ede61026596fbc720ee4b93246fa2d14f328058532b59ef053de397c7d83" origin="Generated by Gradle"/> <sha256 value="7220ede61026596fbc720ee4b93246fa2d14f328058532b59ef053de397c7d83" origin="Generated by Gradle"/>
@@ -2369,6 +2894,14 @@
<sha256 value="18d4b1db26153d4e55079ce1f76bb1fe05cdb862ef9954a88cbcc4ff38b8679b" origin="Generated by Gradle"/> <sha256 value="18d4b1db26153d4e55079ce1f76bb1fe05cdb862ef9954a88cbcc4ff38b8679b" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="com.google.j2objc" name="j2objc-annotations" version="1.3">
<artifact name="j2objc-annotations-1.3.jar">
<sha256 value="21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b" origin="Generated by Gradle"/>
</artifact>
<artifact name="j2objc-annotations-1.3.pom">
<sha256 value="5faca824ba115bee458730337dfdb2fcea46ba2fd774d4304edbf30fa6a3f055" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.j2objc" name="j2objc-annotations" version="2.8"> <component group="com.google.j2objc" name="j2objc-annotations" version="2.8">
<artifact name="j2objc-annotations-2.8.pom"> <artifact name="j2objc-annotations-2.8.pom">
<sha256 value="37f87798b18385113c918bfa9e1276fe50735ef8fa849b5800c519d54dbf11f8" origin="Generated by Gradle"/> <sha256 value="37f87798b18385113c918bfa9e1276fe50735ef8fa849b5800c519d54dbf11f8" origin="Generated by Gradle"/>
@@ -2403,6 +2936,11 @@
<sha256 value="c71555751e57e0ef912870e8ac9625ae782502a6a5b9c19ccf83b2a97d8b26bd" origin="Generated by Gradle"/> <sha256 value="c71555751e57e0ef912870e8ac9625ae782502a6a5b9c19ccf83b2a97d8b26bd" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="com.google.protobuf" name="protobuf-bom" version="3.19.1">
<artifact name="protobuf-bom-3.19.1.pom">
<sha256 value="96623d7afc374800cfdc4eb1e49efdb1b17d762fbe9c7de0e46980de14473170" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.protobuf" name="protobuf-bom" version="3.25.5"> <component group="com.google.protobuf" name="protobuf-bom" version="3.25.5">
<artifact name="protobuf-bom-3.25.5.pom"> <artifact name="protobuf-bom-3.25.5.pom">
<sha256 value="080e2984173238b50e064c226afffbb1b0233520295c790a7fd3d6ae4593f063" origin="Generated by Gradle"/> <sha256 value="080e2984173238b50e064c226afffbb1b0233520295c790a7fd3d6ae4593f063" origin="Generated by Gradle"/>
@@ -2424,6 +2962,19 @@
<sha256 value="a09d190eaa6a79616bc5f4b5404e94b0cab559803a98c8a090c4099962f41f92" origin="Generated by Gradle"/> <sha256 value="a09d190eaa6a79616bc5f4b5404e94b0cab559803a98c8a090c4099962f41f92" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="com.google.protobuf" name="protobuf-javalite" version="3.19.1">
<artifact name="protobuf-javalite-3.19.1.jar">
<sha256 value="865210ede9acb33456ae00af4e6d02b76c09c1f7622df870a8bd2290aa5ce8d9" origin="Generated by Gradle"/>
</artifact>
<artifact name="protobuf-javalite-3.19.1.pom">
<sha256 value="276359b7abbc4eebe05f9c1de23cc8bb726a6290b71060fda8e25f96264ddfb3" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.protobuf" name="protobuf-parent" version="3.19.1">
<artifact name="protobuf-parent-3.19.1.pom">
<sha256 value="83d413b2a79d6357d2ca78fd623143424e8f6ecc72cfa83bf2ae2ae258a93a44" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.protobuf" name="protobuf-parent" version="3.25.5"> <component group="com.google.protobuf" name="protobuf-parent" version="3.25.5">
<artifact name="protobuf-parent-3.25.5.pom"> <artifact name="protobuf-parent-3.25.5.pom">
<sha256 value="64cc0e3ad6e85f5aec8f9dcf9341d1379e9525364ff53e23e16d8d5824673ef7" origin="Generated by Gradle"/> <sha256 value="64cc0e3ad6e85f5aec8f9dcf9341d1379e9525364ff53e23e16d8d5824673ef7" origin="Generated by Gradle"/>
@@ -2589,6 +3140,45 @@
<sha256 value="2d6ad09e7cacb9da63c6fdf333e3432b39942d5586336f02eb06f5b5450f34a0" origin="Generated by Gradle"/> <sha256 value="2d6ad09e7cacb9da63c6fdf333e3432b39942d5586336f02eb06f5b5450f34a0" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="com.squareup.moshi" name="moshi" version="1.13.0">
<artifact name="moshi-1.13.0.jar">
<sha256 value="bd004dd9ba175e603ad44420bf605250291b9b7bc6b9d9e916f5741ac8663307" origin="Generated by Gradle"/>
</artifact>
<artifact name="moshi-1.13.0.module">
<sha256 value="dc5640e1a802012f7cf7171dab8a340d52e7714661a9d9dbb0b36788f1db04fc" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.squareup.okio" name="okio" version="2.10.0">
<artifact name="okio-2.10.0.module">
<sha256 value="11cbeabc3a765c9a803242fa2024a11853eb0865da536c4b05afdcdbb2346370" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.squareup.okio" name="okio" version="3.17.0">
<artifact name="okio-3.17.0.module">
<sha256 value="3d878db9ffd4e959c30f9a8366a88c22d001e9b324378d7dbeed98568e7ec559" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.squareup.okio" name="okio-jvm" version="3.17.0">
<artifact name="okio-jvm-3.17.0.jar">
<sha256 value="3b13dcc3e1573047c2d507fc4f7fcb0bb0cbcd9d395da21d20e09406e2cd6a73" origin="Generated by Gradle"/>
</artifact>
<artifact name="okio-jvm-3.17.0.module">
<sha256 value="d4617d0df71f202e7299471848e625f4f36d7fa64d46c3503f70acf4821a45de" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.squareup.wire" name="wire-runtime" version="6.4.0">
<artifact name="wire-runtime-6.4.0.module">
<sha256 value="8b1da13a71fe8137c60f7d41e8b8d18bfdde9d37c2b63851bebbc215b3330729" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.squareup.wire" name="wire-runtime-jvm" version="6.4.0">
<artifact name="wire-runtime-jvm-6.4.0.jar">
<sha256 value="8c0a450299e546f896ce9b40d6f1b83850d9e6b219664301b5a441b548d4ab84" origin="Generated by Gradle"/>
</artifact>
<artifact name="wire-runtime-jvm-6.4.0.module">
<sha256 value="c6a410799a0aba56021281b368749c1703452dc37aab24ee4f058f864a36547c" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.sun.activation" name="all" version="1.2.1"> <component group="com.sun.activation" name="all" version="1.2.1">
<artifact name="all-1.2.1.pom"> <artifact name="all-1.2.1.pom">
<sha256 value="360883bf64486ecef161b8f282f6503536dd1a670d53a0a871c8fb20170e6795" origin="Generated by Gradle"/> <sha256 value="360883bf64486ecef161b8f282f6503536dd1a670d53a0a871c8fb20170e6795" origin="Generated by Gradle"/>
@@ -2999,11 +3589,27 @@
<sha256 value="f7fcdac99eb33d169f6d52a35541c22ffd14f458abbcf56f9c49ee1486598c9c" origin="Generated by Gradle"/> <sha256 value="f7fcdac99eb33d169f6d52a35541c22ffd14f458abbcf56f9c49ee1486598c9c" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="org.checkerframework" name="checker-compat-qual" version="2.5.5">
<artifact name="checker-compat-qual-2.5.5.jar">
<sha256 value="11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a" origin="Generated by Gradle"/>
</artifact>
<artifact name="checker-compat-qual-2.5.5.pom">
<sha256 value="42f21ebd9183be049ee5afc822b345403a5da764037875734a039b0d6e0353be" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.checkerframework" name="checker-qual" version="2.5.8"> <component group="org.checkerframework" name="checker-qual" version="2.5.8">
<artifact name="checker-qual-2.5.8.pom"> <artifact name="checker-qual-2.5.8.pom">
<sha256 value="33ac6a0f1341ae96647c7d4465f4aa3d24fe97d2697bcee2ceae6fc8b5ef2c3c" origin="Generated by Gradle"/> <sha256 value="33ac6a0f1341ae96647c7d4465f4aa3d24fe97d2697bcee2ceae6fc8b5ef2c3c" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="org.checkerframework" name="checker-qual" version="3.22.1">
<artifact name="checker-qual-3.22.1.jar">
<sha256 value="8dfb8247a3b90da2c12cba6d92cb4cc1a0919996aa8c171680862cfbf2307a93" origin="Generated by Gradle"/>
</artifact>
<artifact name="checker-qual-3.22.1.module">
<sha256 value="66f563d8a2a1ee395a1283992fd646347f42054d071592d1f477523816e397fa" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.checkerframework" name="checker-qual" version="3.43.0"> <component group="org.checkerframework" name="checker-qual" version="3.43.0">
<artifact name="checker-qual-3.43.0.jar"> <artifact name="checker-qual-3.43.0.jar">
<sha256 value="3fbc2e98f05854c3df16df9abaa955b91b15b3ecac33623208ed6424640ef0f6" origin="Generated by Gradle"/> <sha256 value="3fbc2e98f05854c3df16df9abaa955b91b15b3ecac33623208ed6424640ef0f6" origin="Generated by Gradle"/>
@@ -4006,6 +4612,14 @@
<sha256 value="9124e34344dca9abea1e28618a83a3a714ed8fa193dac90bf73561aee177cf8b" origin="Generated by Gradle"/> <sha256 value="9124e34344dca9abea1e28618a83a3a714ed8fa193dac90bf73561aee177cf8b" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="org.jsoup" name="jsoup" version="1.15.1">
<artifact name="jsoup-1.15.1.jar">
<sha256 value="246947b4fa5fb5fcd446c7dae46ab1ff1779b31f6af7a33e1e0aabfbdb6d8749" origin="Generated by Gradle"/>
</artifact>
<artifact name="jsoup-1.15.1.pom">
<sha256 value="35ebb1b687fb5831d75b65df597faa461104661ac5b5e85a7c69729e3d466125" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jspecify" name="jspecify" version="1.0.0"> <component group="org.jspecify" name="jspecify" version="1.0.0">
<artifact name="jspecify-1.0.0.jar"> <artifact name="jspecify-1.0.0.jar">
<sha256 value="1fad6e6be7557781e4d33729d49ae1cdc8fdda6fe477bb0cc68ce351eafdfbab" origin="Generated by Gradle"/> <sha256 value="1fad6e6be7557781e4d33729d49ae1cdc8fdda6fe477bb0cc68ce351eafdfbab" origin="Generated by Gradle"/>
+37
View File
@@ -0,0 +1,37 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins { alias(libs.plugins.android.test) }
android {
namespace = "de.rfc1437.ironstorage.performance"
compileSdk = libs.versions.compileSdk.get().toInt()
targetProjectPath = ":app"
defaultConfig {
minSdk = libs.versions.minSdk.get().toInt()
targetSdk = libs.versions.compileSdk.get().toInt()
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes.create("benchmark") {
isDebuggable = true
signingConfig = signingConfigs.getByName("debug")
matchingFallbacks += "release"
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
experimentalProperties["android.experimental.self-instrumenting"] = true
}
kotlin {
jvmToolchain(25)
compilerOptions {
jvmTarget.set(JvmTarget.JVM_17)
allWarningsAsErrors.set(true)
}
}
dependencies {
implementation(libs.benchmark.macro)
implementation(libs.android.test.runner)
}
+304
View File
@@ -0,0 +1,304 @@
# This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised.
# This file is expected to be part of source control.
# To regenerate this file, run: ./gradlew :performance:dependencies --write-locks
androidx.activity:activity-compose:1.13.0=benchmarkTestedApks,debugTestedApks
androidx.activity:activity-ktx:1.13.0=benchmarkTestedApks,debugTestedApks
androidx.activity:activity:1.13.0=benchmarkTestedApks,debugTestedApks
androidx.annotation:annotation-experimental:1.4.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,benchmarkTestedApks,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugTestedApks
androidx.annotation:annotation-jvm:1.11.0=benchmarkTestedApks,debugTestedApks
androidx.annotation:annotation-jvm:1.8.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.annotation:annotation:1.11.0=benchmarkTestedApks,debugTestedApks
androidx.annotation:annotation:1.8.1=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.appcompat:appcompat-resources:1.2.0=benchmarkTestedApks,debugTestedApks
androidx.appcompat:appcompat:1.2.0=benchmarkTestedApks,debugTestedApks
androidx.arch.core:core-common:2.1.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.arch.core:core-common:2.2.0=benchmarkTestedApks,debugTestedApks
androidx.arch.core:core-runtime:2.1.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.arch.core:core-runtime:2.2.0=benchmarkTestedApks,debugTestedApks
androidx.benchmark:benchmark-common:1.5.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.benchmark:benchmark-macro-junit4:1.5.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.benchmark:benchmark-macro:1.5.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.benchmark:benchmark-traceprocessor-android:1.5.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.benchmark:benchmark-traceprocessor:1.5.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.biometric:biometric:1.1.0=benchmarkTestedApks,debugTestedApks
androidx.collection:collection-jvm:1.6.0=benchmarkTestedApks,debugTestedApks
androidx.collection:collection:1.0.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.collection:collection:1.6.0=benchmarkTestedApks,debugTestedApks
androidx.compose.animation:animation-core-jvmstubs:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.animation:animation-core:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.animation:animation-jvmstubs:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.animation:animation:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.foundation:foundation-jvmstubs:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.foundation:foundation-layout-jvmstubs:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.foundation:foundation-layout:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.foundation:foundation:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.material3.adaptive:adaptive-jvmstubs:1.3.0=benchmarkTestedApks,debugTestedApks
androidx.compose.material3.adaptive:adaptive-layout-jvmstubs:1.3.0=benchmarkTestedApks,debugTestedApks
androidx.compose.material3.adaptive:adaptive-layout:1.3.0=benchmarkTestedApks,debugTestedApks
androidx.compose.material3.adaptive:adaptive-navigation-jvmstubs:1.3.0=benchmarkTestedApks,debugTestedApks
androidx.compose.material3.adaptive:adaptive-navigation:1.3.0=benchmarkTestedApks,debugTestedApks
androidx.compose.material3.adaptive:adaptive:1.3.0=benchmarkTestedApks,debugTestedApks
androidx.compose.material3:material3-jvmstubs:1.4.0=benchmarkTestedApks,debugTestedApks
androidx.compose.material3:material3:1.4.0=benchmarkTestedApks,debugTestedApks
androidx.compose.material:material-ripple-jvmstubs:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.material:material-ripple:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.runtime:runtime-annotation-jvm:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.runtime:runtime-annotation:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.runtime:runtime-desktop:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.runtime:runtime-retain-desktop:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.runtime:runtime-retain:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.runtime:runtime-saveable-desktop:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.runtime:runtime-saveable:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.runtime:runtime:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.ui:ui-geometry-jvmstubs:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.ui:ui-geometry:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.ui:ui-graphics-jvmstubs:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.ui:ui-graphics:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.ui:ui-jvmstubs:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.ui:ui-text-jvmstubs:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.ui:ui-text:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.ui:ui-unit-jvmstubs:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.ui:ui-unit:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.ui:ui-util-jvmstubs:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.ui:ui-util:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose.ui:ui:1.12.1=benchmarkTestedApks,debugTestedApks
androidx.compose:compose-bom:2026.09.00=benchmarkTestedApks,debugTestedApks
androidx.concurrent:concurrent-futures-ktx:1.2.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.concurrent:concurrent-futures:1.1.0=benchmarkTestedApks,debugTestedApks
androidx.concurrent:concurrent-futures:1.2.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.core:core-ktx:1.18.0=benchmarkTestedApks,debugTestedApks
androidx.core:core-viewtree:1.0.0=benchmarkTestedApks,debugTestedApks
androidx.core:core:1.18.0=benchmarkTestedApks,debugTestedApks
androidx.core:core:1.9.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.cursoradapter:cursoradapter:1.0.0=benchmarkTestedApks,debugTestedApks
androidx.customview:customview:1.0.0=benchmarkTestedApks,debugTestedApks
androidx.drawerlayout:drawerlayout:1.0.0=benchmarkTestedApks,debugTestedApks
androidx.fragment:fragment:1.9.1=benchmarkTestedApks,debugTestedApks
androidx.interpolator:interpolator:1.0.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-common-jvm:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-common:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-common:2.3.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.lifecycle:lifecycle-livedata-core-ktx:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-livedata-core:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-livedata:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-runtime-compose-desktop:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-runtime-compose:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-runtime-desktop:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-runtime-ktx-android:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-runtime-ktx:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-runtime:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-runtime:2.3.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.lifecycle:lifecycle-viewmodel-compose-desktop:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-viewmodel-compose:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-viewmodel-desktop:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-viewmodel-ktx:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-viewmodel-savedstate-desktop:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-viewmodel-savedstate:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.lifecycle:lifecycle-viewmodel:2.11.0=benchmarkTestedApks,debugTestedApks
androidx.loader:loader:1.0.0=benchmarkTestedApks,debugTestedApks
androidx.navigation3:navigation3-runtime-desktop:1.2.0=benchmarkTestedApks,debugTestedApks
androidx.navigation3:navigation3-runtime:1.2.0=benchmarkTestedApks,debugTestedApks
androidx.navigation3:navigation3-ui-jvmstubs:1.2.0=benchmarkTestedApks,debugTestedApks
androidx.navigation3:navigation3-ui:1.2.0=benchmarkTestedApks,debugTestedApks
androidx.navigationevent:navigationevent-compose-desktop:1.1.1=benchmarkTestedApks,debugTestedApks
androidx.navigationevent:navigationevent-compose:1.1.1=benchmarkTestedApks,debugTestedApks
androidx.navigationevent:navigationevent-desktop:1.1.1=benchmarkTestedApks,debugTestedApks
androidx.navigationevent:navigationevent:1.1.1=benchmarkTestedApks,debugTestedApks
androidx.profileinstaller:profileinstaller:1.4.0=benchmarkTestedApks,debugTestedApks
androidx.profileinstaller:profileinstaller:1.4.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.savedstate:savedstate-compose-desktop:1.4.0=benchmarkTestedApks,debugTestedApks
androidx.savedstate:savedstate-compose:1.4.0=benchmarkTestedApks,debugTestedApks
androidx.savedstate:savedstate-desktop:1.4.0=benchmarkTestedApks,debugTestedApks
androidx.savedstate:savedstate-ktx:1.4.0=benchmarkTestedApks,debugTestedApks
androidx.savedstate:savedstate:1.4.0=benchmarkTestedApks,debugTestedApks
androidx.startup:startup-runtime:1.1.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,benchmarkTestedApks,debugLintChecksClasspath,debugRuntimeClasspath,debugTestedApks
androidx.test.ext:junit:1.2.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.test.services:storage:1.6.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.test.uiautomator:uiautomator-shell-android:2.4.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.test.uiautomator:uiautomator-shell:2.4.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.test.uiautomator:uiautomator:2.4.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.test:annotation:1.0.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.test:core:1.7.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.test:monitor:1.8.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.test:rules:1.5.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.test:runner:1.7.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.tracing:tracing-desktop:2.0.0=benchmarkTestedApks,debugTestedApks
androidx.tracing:tracing-ktx:1.1.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.tracing:tracing-perfetto-binary:1.0.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.tracing:tracing-perfetto-handshake:1.0.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.tracing:tracing-perfetto:1.0.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.tracing:tracing:1.1.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
androidx.tracing:tracing:2.0.0=benchmarkTestedApks,debugTestedApks
androidx.vectordrawable:vectordrawable-animated:1.1.0=benchmarkTestedApks,debugTestedApks
androidx.vectordrawable:vectordrawable:1.1.0=benchmarkTestedApks,debugTestedApks
androidx.versionedparcelable:versionedparcelable:1.1.1=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,benchmarkTestedApks,debugLintChecksClasspath,debugRuntimeClasspath,debugTestedApks
androidx.viewpager:viewpager:1.0.0=benchmarkTestedApks,debugTestedApks
androidx.window:window-core-jvm:1.5.0=benchmarkTestedApks,debugTestedApks
androidx.window:window-core:1.5.0=benchmarkTestedApks,debugTestedApks
ch.qos.logback:logback-classic:1.3.15=ktlint
ch.qos.logback:logback-core:1.3.15=ktlint
com.android.tools.analytics-library:protos:32.4.1=androidLintTool
com.android.tools.analytics-library:shared:32.4.1=androidLintTool
com.android.tools.analytics-library:tracker:32.4.1=androidLintTool
com.android.tools.androidtest:android-test-engine-result-listener:1.0.1=unified-test-platform-gradle-work-action
com.android.tools.androidtest:android-test-engine:1.0.1=unified-test-platform-gradle-work-action
com.android.tools.androidtest:test-result-event-proto:1.0.1=unified-test-platform-gradle-work-action
com.android.tools.androidtest:test-result-proto:1.0.1=unified-test-platform-gradle-work-action
com.android.tools.build:aapt2-proto:9.4.1-15978811=androidLintTool
com.android.tools.build:builder-model:9.4.1=androidLintTool
com.android.tools.build:manifest-merger:32.4.1=androidLintTool
com.android.tools.ddms:ddmlib:32.4.1=androidLintTool
com.android.tools.external.com-intellij:intellij-core:32.4.1=androidLintTool
com.android.tools.external.com-intellij:kotlin-compiler:32.4.1=androidLintTool
com.android.tools.external.org-jetbrains:uast:32.4.1=androidLintTool
com.android.tools.layoutlib:layoutlib-api:32.4.1=androidLintTool
com.android.tools.lint:lint-api:32.4.1=androidLintTool
com.android.tools.lint:lint-checks:32.4.1=androidLintTool
com.android.tools.lint:lint-gradle:32.4.1=androidLintTool
com.android.tools.lint:lint-model:32.4.1=androidLintTool
com.android.tools.lint:lint-typedef-remover:32.4.1=androidLintTool
com.android.tools.lint:lint:32.4.1=androidLintTool
com.android.tools.utp:gradle-work-action:32.4.1=unified-test-platform-gradle-work-action
com.android.tools:annotations:32.4.1=androidLintTool
com.android.tools:common:32.4.1=androidLintTool
com.android.tools:dvlib:32.4.1=androidLintTool
com.android.tools:play-sdk-proto:32.4.1=androidLintTool
com.android.tools:repository:32.4.1=androidLintTool
com.android.tools:sdk-common:32.4.1=androidLintTool
com.android.tools:sdklib:32.4.1=androidLintTool
com.github.ajalt.clikt:clikt-jvm:5.0.3=ktlint
com.github.ajalt.clikt:clikt:5.0.3=ktlint
com.google.code.findbugs:jsr305:3.0.2=androidLintTool,benchmarkTestedApks,debugTestedApks
com.google.code.gson:gson:2.11.0=androidLintTool
com.google.dagger:dagger-lint-aar:2.60.1=benchmarkTestedApks,debugTestedApks
com.google.dagger:dagger:2.60.1=benchmarkTestedApks,debugTestedApks
com.google.dagger:hilt-android:2.60.1=benchmarkTestedApks,debugTestedApks
com.google.dagger:hilt-core:2.60.1=benchmarkTestedApks,debugTestedApks
com.google.errorprone:error_prone_annotations:2.36.0=androidLintTool
com.google.guava:failureaccess:1.0.2=androidLintTool
com.google.guava:guava:33.4.0-jre=androidLintTool
com.google.guava:listenablefuture:1.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,benchmarkTestedApks,debugLintChecksClasspath,debugRuntimeClasspath,debugTestedApks
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=androidLintTool
com.google.j2objc:j2objc-annotations:3.0.0=androidLintTool
com.google.jimfs:jimfs:1.1=androidLintTool
com.google.protobuf:protobuf-java:3.25.5=androidLintTool,unified-test-platform-gradle-work-action
com.pinterest.ktlint:ktlint-cli-reporter-baseline:1.7.1=ktlint,ktlintBaselineReporter
com.pinterest.ktlint:ktlint-cli-reporter-checkstyle:1.7.1=ktlint
com.pinterest.ktlint:ktlint-cli-reporter-core:1.7.1=ktlint,ktlintBaselineReporter
com.pinterest.ktlint:ktlint-cli-reporter-format:1.7.1=ktlint
com.pinterest.ktlint:ktlint-cli-reporter-html:1.7.1=ktlint
com.pinterest.ktlint:ktlint-cli-reporter-json:1.7.1=ktlint
com.pinterest.ktlint:ktlint-cli-reporter-plain-summary:1.7.1=ktlint
com.pinterest.ktlint:ktlint-cli-reporter-plain:1.7.1=ktlint
com.pinterest.ktlint:ktlint-cli-reporter-sarif:1.7.1=ktlint
com.pinterest.ktlint:ktlint-cli-ruleset-core:1.7.1=ktlint,ktlintRuleset
com.pinterest.ktlint:ktlint-cli:1.7.1=ktlint
com.pinterest.ktlint:ktlint-logger:1.7.1=ktlint,ktlintBaselineReporter,ktlintRuleset
com.pinterest.ktlint:ktlint-rule-engine-core:1.7.1=ktlint,ktlintBaselineReporter,ktlintRuleset
com.pinterest.ktlint:ktlint-rule-engine:1.7.1=ktlint
com.pinterest.ktlint:ktlint-ruleset-standard:1.7.1=ktlint,ktlintRuleset
com.squareup.moshi:moshi:1.13.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
com.squareup.okio:okio-jvm:3.17.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
com.squareup.okio:okio:3.17.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
com.squareup.wire:wire-runtime-jvm:6.4.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
com.squareup.wire:wire-runtime:6.4.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
com.sun.istack:istack-commons-runtime:3.0.8=androidLintTool
com.sun.xml.fastinfoset:FastInfoset:1.2.16=androidLintTool
commons-codec:commons-codec:1.17.1=androidLintTool
commons-io:commons-io:2.16.1=androidLintTool
commons-logging:commons-logging:1.2=androidLintTool
dev.drewhamilton.poko:poko-annotations-jvm:0.19.1=ktlint,ktlintBaselineReporter,ktlintRuleset
dev.drewhamilton.poko:poko-annotations:0.19.1=ktlint,ktlintBaselineReporter,ktlintRuleset
io.github.detekt.sarif4k:sarif4k-jvm:0.6.0=ktlint,ktlintReporter
io.github.detekt.sarif4k:sarif4k:0.6.0=ktlint,ktlintReporter
io.github.oshai:kotlin-logging-jvm:7.0.7=ktlint,ktlintBaselineReporter,ktlintReporter,ktlintRuleset
io.github.oshai:kotlin-logging:5.1.0=ktlint,ktlintBaselineReporter,ktlintReporter
jakarta.activation:jakarta.activation-api:1.2.1=androidLintTool
jakarta.inject:jakarta.inject-api:2.0.1=benchmarkTestedApks,debugTestedApks
jakarta.xml.bind:jakarta.xml.bind-api:2.3.2=androidLintTool
javax.inject:javax.inject:1=androidLintTool,benchmarkTestedApks,debugTestedApks
junit:junit:4.13.2=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
net.java.dev.jna:jna-platform:5.6.0=androidLintTool
net.java.dev.jna:jna:5.19.1=benchmarkTestedApks,debugTestedApks
net.java.dev.jna:jna:5.6.0=androidLintTool
net.sf.kxml:kxml2:2.3.0=androidLintTool
org.apache.commons:commons-compress:1.27.1=androidLintTool
org.apache.commons:commons-lang3:3.16.0=androidLintTool
org.apache.groovy:groovy-bom:4.0.29=androidLintTool
org.apache.groovy:groovy:4.0.29=androidLintTool
org.apache.httpcomponents:httpclient:4.5.6=androidLintTool
org.apache.httpcomponents:httpcore:4.4.16=androidLintTool
org.apache.httpcomponents:httpmime:4.5.6=androidLintTool
org.bouncycastle:bcpkix-jdk18on:1.80.2=androidLintTool
org.bouncycastle:bcprov-jdk18on:1.80.2=androidLintTool
org.bouncycastle:bcutil-jdk18on:1.80.2=androidLintTool
org.checkerframework:checker-qual:3.43.0=androidLintTool
org.ec4j.core:ec4j-core:1.1.1=ktlint,ktlintBaselineReporter,ktlintRuleset
org.glassfish.jaxb:jaxb-runtime:2.3.2=androidLintTool
org.glassfish.jaxb:txw2:2.3.2=androidLintTool
org.hamcrest:hamcrest-core:1.3=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-build-tools-compat:2.4.21=kotlinAbiValidationCompatClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-build-tools-cri-impl:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-build-tools-cri-impl:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.0=ktlint,ktlintBaselineReporter,ktlintRuleset
org.jetbrains.kotlin:kotlin-compiler-embeddable:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-daemon-client:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-daemon-client:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.0=ktlint,ktlintBaselineReporter,ktlintRuleset
org.jetbrains.kotlin:kotlin-daemon-embeddable:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinAbiValidationCompatClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,ktlint,ktlintBaselineReporter,ktlintRuleset
org.jetbrains.kotlin:kotlin-reflect:2.2.10=androidLintTool
org.jetbrains.kotlin:kotlin-script-runtime:2.2.0=ktlint,ktlintBaselineReporter,ktlintRuleset
org.jetbrains.kotlin:kotlin-script-runtime:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-script-runtime:2.4.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:2.2.0=ktlintReporter
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,ktlintReporter
org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.10=androidLintTool,unified-test-platform-gradle-work-action
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,ktlintReporter
org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.10=androidLintTool,unified-test-platform-gradle-work-action
org.jetbrains.kotlin:kotlin-stdlib:2.2.0=ktlint,ktlintBaselineReporter,ktlintReporter,ktlintRuleset
org.jetbrains.kotlin:kotlin-stdlib:2.2.10=androidLintTool,unified-test-platform-gradle-work-action
org.jetbrains.kotlin:kotlin-stdlib:2.4.0=kotlinAbiValidationCompatClasspath
org.jetbrains.kotlin:kotlin-stdlib:2.4.21=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,benchmarkTestedApks,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugTestedApks,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-tooling-core:2.4.21=kotlinAbiValidationCompatClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.11.0=benchmarkTestedApks,debugTestedApks
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0=benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.11.0=benchmarkTestedApks,debugTestedApks
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0=androidLintTool,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,unified-test-platform-gradle-work-action
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.11.0=benchmarkTestedApks,debugTestedApks
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinAbiValidationCompatClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,ktlint,ktlintBaselineReporter,ktlintRuleset
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0=androidLintTool,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,unified-test-platform-gradle-work-action
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0=benchmarkTestedApks,debugTestedApks
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0=androidLintTool,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,debugLintChecksClasspath,debugRuntimeClasspath,unified-test-platform-gradle-work-action
org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=benchmarkTestedApks,debugTestedApks
org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.4.1=ktlintReporter
org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=benchmarkTestedApks,debugTestedApks
org.jetbrains.kotlinx:kotlinx-serialization-core:1.4.1=ktlintReporter
org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=benchmarkTestedApks,debugTestedApks
org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.4.1=ktlintReporter
org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1=ktlintReporter
org.jetbrains:annotations:13.0=benchmarkCompileClasspath,debugCompileClasspath,kotlinAbiValidationCompatClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,ktlint,ktlintBaselineReporter,ktlintReporter,ktlintRuleset
org.jetbrains:annotations:23.0.0=androidLintTool,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,benchmarkTestedApks,debugLintChecksClasspath,debugRuntimeClasspath,debugTestedApks,unified-test-platform-gradle-work-action
org.jspecify:jspecify:1.0.0=benchmarkCompileClasspath,benchmarkLintChecksClasspath,benchmarkRuntimeClasspath,benchmarkTestedApks,debugCompileClasspath,debugLintChecksClasspath,debugRuntimeClasspath,debugTestedApks
org.junit.platform:junit-platform-commons:1.13.3=unified-test-platform-gradle-work-action
org.junit.platform:junit-platform-engine:1.13.3=unified-test-platform-gradle-work-action
org.junit.platform:junit-platform-launcher:1.13.3=unified-test-platform-gradle-work-action
org.junit:junit-bom:5.13.3=unified-test-platform-gradle-work-action
org.jvnet.staxex:stax-ex:1.8.1=androidLintTool
org.opentest4j:opentest4j:1.3.0=unified-test-platform-gradle-work-action
org.ow2.asm:asm-analysis:9.9=androidLintTool
org.ow2.asm:asm-commons:9.9=androidLintTool
org.ow2.asm:asm-tree:9.9=androidLintTool
org.ow2.asm:asm:9.9=androidLintTool
org.slf4j:slf4j-api:2.0.7=ktlint
rustls:rustls-platform-verifier:0.1.1=benchmarkTestedApks,debugTestedApks
empty=androidApis,androidJdkImage,androidTestUtil,benchmarkAnnotationProcessorClasspath,benchmarkImplementationDependenciesMetadata,coreLibraryDesugaring,debugAnnotationProcessorClasspath,debugImplementationDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinCompilerPluginClasspathBenchmark,kotlinCompilerPluginClasspathDebug,lintChecks,lintPublish
@@ -0,0 +1 @@
<manifest />
@@ -0,0 +1,33 @@
package de.rfc1437.ironstorage.performance
import android.os.Build
import androidx.benchmark.macro.junit4.BaselineProfileRule
import androidx.test.uiautomator.By
import androidx.test.uiautomator.Until
import org.junit.Assert.assertNotNull
import org.junit.Before
import org.junit.Rule
import org.junit.Test
class BaselineProfile {
@get:Rule val profile = BaselineProfileRule()
@Before fun preserveInstalledApplicationData() {
// Older non-rooted images can reinstall the app while resetting compilation.
check(Build.VERSION.SDK_INT >= 34)
}
@Test fun startupAndPreferences() = profile.collect(
packageName = "de.rfc1437.ironstorage"
) {
pressHome()
startActivityAndWait()
val preferences = device.wait(Until.findObject(By.text("Preferences")), 10000)
assertNotNull("Preferences navigation must be available", preferences)
preferences.click()
assertNotNull(
"Searchable settings must finish loading",
device.wait(Until.findObject(By.text("Search settings")), 10000)
)
}
}
@@ -0,0 +1,37 @@
package de.rfc1437.ironstorage.performance
import androidx.benchmark.macro.CompilationMode
import androidx.benchmark.macro.ExperimentalMacrobenchmarkApi
import androidx.benchmark.macro.StartupMode
import androidx.benchmark.macro.StartupTimingMetric
import androidx.benchmark.macro.junit4.MacrobenchmarkRule
import androidx.test.uiautomator.By
import androidx.test.uiautomator.Until
import org.junit.Assert.assertNotNull
import org.junit.Rule
import org.junit.Test
@OptIn(ExperimentalMacrobenchmarkApi::class)
class StartupBenchmark {
@get:Rule val benchmark = MacrobenchmarkRule()
@Test fun coldStart() = startup(StartupMode.COLD)
@Test fun warmStart() = startup(StartupMode.WARM)
private fun startup(mode: StartupMode) = benchmark.measureRepeated(
packageName = "de.rfc1437.ironstorage",
metrics = listOf(StartupTimingMetric()),
compilationMode = CompilationMode.Ignore(),
startupMode = mode,
iterations = 5,
setupBlock = { pressHome() }
) {
startActivityAndWait()
assertNotNull(
"Native shell must finish loading",
device.wait(Until.findObject(By.text("Home")), 10000)
)
device.waitForIdle()
}
}
+1 -1
View File
@@ -35,4 +35,4 @@ dependencyResolutionManagement {
} }
} }
rootProject.name = "IronStorage" rootProject.name = "IronStorage"
include(":app", ":features", ":core", ":platform", ":rust-bridge") include(":performance", ":app", ":features", ":core", ":platform", ":rust-bridge")
+18 -3
View File
@@ -127,12 +127,12 @@ impl MobilePasswordPage {
) -> Result<Self, MobilePasswordError> { ) -> Result<Self, MobilePasswordError> {
let query = query.trim(); let query = query.trim();
let folded = query.to_lowercase(); let folded = query.to_lowercase();
let snapshot = repository
.snapshot()
.map_err(MobilePasswordError::repository)?;
let rows = if folded.is_empty() { let rows = if folded.is_empty() {
Vec::new() Vec::new()
} else { } else {
let snapshot = repository
.snapshot()
.map_err(MobilePasswordError::repository)?;
snapshot snapshot
.entries() .entries()
.filter(|entry| !hidden_path(entry.path().as_path())) .filter(|entry| !hidden_path(entry.path().as_path()))
@@ -312,6 +312,21 @@ mod tests {
use super::{MobilePasswordErrorKind, MobilePasswordPage, MobilePasswordRowKind}; use super::{MobilePasswordErrorKind, MobilePasswordPage, MobilePasswordRowKind};
use crate::repository::Repository; use crate::repository::Repository;
#[cfg(unix)]
#[test]
fn blank_search_does_not_walk_the_repository() -> Result<(), Box<dyn std::error::Error>> {
let temporary = tempdir()?;
let repository = Repository::open(temporary.path())?;
std::os::unix::fs::symlink("missing", temporary.path().join("unsafe.gpg"))?;
assert!(MobilePasswordPage::search_repository(&repository, "unsafe").is_err());
assert!(
MobilePasswordPage::search_repository(&repository, " ")?
.rows()
.is_empty()
);
Ok(())
}
#[test] #[test]
fn locked_pages_preserve_storage_identity_across_nested_refreshes() fn locked_pages_preserve_storage_identity_across_nested_refreshes()
-> Result<(), Box<dyn std::error::Error>> { -> Result<(), Box<dyn std::error::Error>> {
+22 -5
View File
@@ -286,11 +286,10 @@ impl QrMatrix {
.decode() .decode()
.map_err(|_| QrError::InvalidImage)? .map_err(|_| QrError::InvalidImage)?
.into_luma8(); .into_luma8();
Self::decode_luminance( let width = grayscale.width() as usize;
grayscale.width() as usize, let height = grayscale.height() as usize;
grayscale.height() as usize, let pixels = zeroize::Zeroizing::new(grayscale.into_raw());
|x, y| grayscale.get_pixel(x as u32, y as u32).0[0], Self::decode_luminance(width, height, |x, y| pixels[y * width + x])
)
} }
pub(crate) fn decode_luminance( pub(crate) fn decode_luminance(
@@ -298,6 +297,9 @@ impl QrMatrix {
height: usize, height: usize,
pixel: impl Fn(usize, usize) -> u8, pixel: impl Fn(usize, usize) -> u8,
) -> Result<SecretBytes, QrError> { ) -> Result<SecretBytes, QrError> {
if width == 0 || height == 0 || width > 4096 || height > 4096 {
return Err(QrError::InvalidImage);
}
let mut prepared = rqrr::PreparedImage::prepare_from_greyscale(width, height, pixel); let mut prepared = rqrr::PreparedImage::prepare_from_greyscale(width, height, pixel);
let grid = prepared let grid = prepared
.detect_grids() .detect_grids()
@@ -374,3 +376,18 @@ impl Drop for QrMatrix {
self.modules.zeroize(); self.modules.zeroize();
} }
} }
#[cfg(test)]
mod qr_dimensions_tests {
use super::{QrError, QrMatrix};
#[test]
fn invalid_dimensions_are_rejected_before_pixel_access_or_allocation() {
for (width, height) in [(0, 1), (1, 0), (4097, 1), (1, 4097), (usize::MAX, 2)] {
assert!(matches!(
QrMatrix::decode_luminance(width, height, |_, _| panic!("untrusted pixels read")),
Err(QrError::InvalidImage)
));
}
}
}
+108
View File
@@ -0,0 +1,108 @@
# Android hardening
The Android presentation layer uses resource strings for Kotlin-owned notices,
action labels, counts, and durations. Rust-owned presentation text remains opaque:
frontends do not parse or translate it. Repeated editor actions include the field
label, and hidden editor values are checked against the actual Android accessibility
node tree as well as Compose semantics. Compose accessibility checks run before
interactions in every app screen test.
Blank name searches do not traverse the password store. QR luminance inputs reject
zero or greater-than-4096 dimensions before allocating the decoder image; owned
decoded luminance bytes are zeroized. License loading runs on the IO dispatcher.
Editor keystrokes coalesce encrypted recovery checkpoints for 150 ms; save,
reorder, and recovery wait for the latest checkpoint. This changes persistence
scheduling, not authorization or the interactive unlock boundary.
## Native journey budgets
The `android_ci.py emulator <serial>` gate requires exactly one numeric measurement
for each journey below and rejects missing, duplicate, malformed, or over-budget
values. Raw fixture output remains local; published reports contain numeric values
and test status only. The large-tree fixture contains 1,000 valid encrypted entries
in 50 folders. These timings measure native/repository work, not rendered frame
latency or a physical device.
| Journey | Required budget | API 26 ARM64 / 4 KB | API 37 ARM64 / strict 16 KB |
| --- | ---: | ---: | ---: |
| 100 editor input updates | < 500 ms | 4 ms | 6 ms |
| Editor update p95 | < 32,000 μs | 61 μs | 102 μs |
| TOTP discovery cache rebuild | < 15,000 ms | 1,924 ms | 1,861 ms |
| QR image analysis | < 5,000 ms | 99 ms | 91 ms |
| 1,000-entry tree navigation | < 3,000 ms | 11 ms | 11 ms |
| 1,000-entry name search | < 5,000 ms | 27 ms | 26 ms |
Both configurations reported `OK (31 tests)` for app instrumentation and passed
the native core journey and bridge suite. Opt-in inspection and biometric tests
remain assumption-skipped unless explicitly requested; these runs do not establish
their manual coverage. Native load samples ranged from 32.7–35.2 ms on API 26 and
63.3–78.7 ms on API 37 with strict 16 KB pages. Five debug cold starts ranged from
202–279 ms and 708–1,086 ms respectively. These debug activity timings are separate
from release Macrobenchmark startup measurements.
## Adaptive checks
`Tier2WindowTest` exercises searchable Preferences and keyboard activation using
actual window dimensions. The API 26 emulator passed compact (411 dp), medium
(640 dp), expanded (1,067 dp), 200% font with RTL, landscape with 200% font and RTL,
and a smaller window with 200% font. Size, density, font scale, and rotation settings
were restored after the run. This covers window geometry; it does not establish
hinge occlusion or folded/tabletop posture behavior.
The shell consumes IME insets, and the activity explicitly requests `adjustResize`.
The optional `hardeningIme=true` instrumentation argument opens a real keyboard
and checks shell content bounds against the platform IME inset. It reproduced an
overlap before the shared-shell fix and passes afterward on API 26 and API 37 with
strict 16 KB pages. Temporarily enable `show_ime_with_hard_keyboard` for this check
and restore its original value afterward. Full app instrumentation also reported
`OK (31 tests)` with `hardeningRtl=true` on the strict 16 KB image.
## Release benchmarks
`android_ci.py performance <serial>` installs the benchmark app over the retained
installation and records five cold and five warm startup iterations. The benchmark
variant uses release code and shrinking, debug signing, and shell profiling; the
distributed release variant does not enable profiling. `ReportDrawnWhen` waits for
the shell to leave its native loading state. Compilation is preserved rather than
resetting application data.
The startup gate requires five complete numeric initial/full-display samples for
each mode, with cold startup below 5,000 ms and warm startup below 3,000 ms.
Before installing the generated profile, release-like median full-display times
were 268.6 ms cold / 131.2 ms warm on API 26 and 1,203.5 ms cold / 427.0 ms warm on
API 37. These emulator observations preserve existing compilation state and are
not a claim of profile speedup. Raw traces and device metadata stay local; CI
artifacts retain only API/ABI and the reviewed numeric samples.
`android_ci.py profiles <serial>` generates a profile from startup and the existing
Preferences journey. Generation requires API 34 or newer so compilation reset
does not fall back to reinstalling the app on older non-rooted images. Inspect the
generated local artifacts before promoting them into the app source set. Generation
uses a non-obfuscated `profile` variant, while startup measurements use the shrunk
`benchmark` variant. Both use release source code and debug signing.
The committed `app/src/main/baseline-prof.txt` was generated on the API 37 ARM64
emulator from the startup/Preferences journey on 2026-10-11, with 22,331 rules and
SHA-256 `687afdc199dacf0736dc1c577767dea9b81ddc987b5b61b02b5afed5e501b503`.
Regenerate it with the `profiles` command after changing those journeys; use the
untimestamped `BaselineProfile_startupAndPreferences-baseline-prof.txt` output,
check that application class names are unobfuscated, and rebuild the release APK
to verify its compiled `assets/dexopt/baseline.prof` remains within ART's size limit.
## Completion boundary
Issue #105 explicitly depends on every Android feature UI issue. CameraX (#106),
TOTP list/detail (#107), mutation workflows (#108), Credential Manager/Autofill
(#109), and TOTP discovery UI (#110) are still open. Their final screen accessibility,
camera interruption, cached-open/refresh presentation, and provider response
latency cannot be certified by tests of the existing screens. Keep #105 open until
those implementations and the remaining environment/posture checks are complete.
ARMv7 is package-validated; the installed runnable emulator images are ARM64.
On 2026-10-11 the user explicitly requested committing the independent implementation
now and delaying final coverage. Issues #106–#110 received `critical`; resume those
eligible Android enhancements in numeric order, then revisit #105. Remaining
checks include TalkBack/Switch Access and contrast/motion modes across the finished
screens, real hinge/posture and live-resize coverage, and low-memory, doze, battery,
network, camera-interruption, and storage-pressure scenarios. Do not close #105
based solely on the current instrumentation and window-geometry results.
+1
View File
@@ -142,6 +142,7 @@ fn check(root: &Path) -> Result<(), Box<dyn Error>> {
let project = regex::Regex::new(r#"project\s*\(\s*"\:([^\"]+)"\s*\)"#)?; let project = regex::Regex::new(r#"project\s*\(\s*"\:([^\"]+)"\s*\)"#)?;
for (module, allowed) in [ for (module, allowed) in [
("app", &["features", "core", "platform"][..]), ("app", &["features", "core", "platform"][..]),
("performance", &["app"][..]),
("features", &["core"][..]), ("features", &["core"][..]),
("core", &["rust-bridge"][..]), ("core", &["rust-bridge"][..]),
("platform", &["core"][..]), ("platform", &["core"][..]),