Skip to content

Latest commit

 

History

History
219 lines (178 loc) · 34.9 KB

testing.md

File metadata and controls

219 lines (178 loc) · 34.9 KB

TimeStack Android Testing

Current Test Stack

  • Local unit tests: JUnit4.
  • Compose instrumented tests: androidx.compose.ui:ui-test-junit4 in androidTest.
  • WorkManager instrumented tests: androidx.work:work-testing in androidTest.
  • Room schema export: app/schemas/com.example.timestack.data.local.TimeStackDatabase/1.json through 8.json.
  • Release build gate: assembleRelease and bundleRelease with R8 minification and resource shrinking enabled.
  • Store-candidate gate: verifyStoreCandidate aggregates store-listing asset validation, store-listing copy validation, privacy/Data Safety disclosure validation, public privacy-policy draft validation, privacy-policy hosting validation, in-app policy/support validation, third-party notices validation, Play Console readiness validation, Play submission runbook validation, release-notes/version validation, release signing runbook validation, device/OEM smoke checklist validation, distribution readiness matrix validation, local unit tests, Android test APK compilation, merged-manifest permission checks, release APK and release AAB builds.
  • Device/emulator gate: connectedDebugAndroidTest on a local Android 16 / API 36 AVD.

Covered Now

  • Sample product data contains the core dashboard content.
  • Derived dashboard metrics are recalculated from task and habit state instead of trusting stale sample text.
  • Calendar load planner tests cover daily load aggregation from events, open tasks and unresolved habits, configured daily capacity, cancelled-task exclusion, planning buckets and minute formatting.
  • Widget content tests cover the Today, habit and focus home-screen widget summary text generated from product data, including cancelled-task exclusion from task and focus summaries.
  • Quick input parser tests cover task, timeline event, habit and countdown inference plus extraction of project, priority, estimate, date and time labels.
  • Room entity/model mapping preserves task business fields, current-focus flag and sort order.
  • Repository task and inbox tests cover add, edit without resetting done/progress state, deleting the current focus, review triage actions for continuing tomorrow, rescheduling to a chosen label, splitting into inbox items, cancelling without counting as done, lowering priority and moving a task back to inbox, capturing parsed inbox suggestions, organizing inbox items into tasks, timeline events, habits and countdowns, and deleting inbox items.
  • Repository habit tests cover add, edit without resetting done/progress state, skip behavior, delete behavior and derived habit metrics.
  • Repository schedule/countdown tests cover add, edit and delete behavior for fixed timeline events and countdowns.
  • Repository focus-session tests cover saving a focus session, manually recording a time log, clamping invalid durations, updating review time-log slices and refreshing the focus metric.
  • Focus timer policy tests cover countdown display formatting, remaining-progress clamping and elapsed-minute rounding before saving.
  • Repository review tests cover editing a review answer without duplicating the question and saving a daily review snapshot with score clamping, top-task normalization, task/habit counts and focus minutes.
  • Review period summary tests cover weekly and monthly recap aggregation, focus time distribution, review score inclusion, historical score averaging, cancelled-task exclusion from completion/risk/next-focus labels and empty-period fallbacks.
  • Repository reminder tests cover toggling a local reminder without changing other reminder settings, normalizing review reminder times, recognizing daily reminder labels and rebasing seeded daily reminders into the future.
  • Reminder policy tests cover daily trigger parsing, local-hour delivery buckets, the 2-notifications-per-hour delivery cap and reset at the next hour.
  • Focus interruption policy tests cover focus activity expiry and the rule that only schedule reminders may interrupt a running focus session.
  • JSON backup encoding is readable, round-trips v8 records, imports legacy v7 task records as not cancelled, previews record counts for all local data groups, rejects unsupported format versions, duplicate records, invalid enum/progress/review values and contradictory done-plus-cancelled task state, and supports optional password-encrypted backup envelopes without leaking plaintext record content.
  • Backup service tests verify export reads DAO data, password-encrypted export can be previewed/restored only with the matching password, restore requires explicit destructive confirmation before replacing local tasks, habits, inbox, timeline events, countdowns, focus sessions, review questions, daily reviews, reminders and preferences, and successful restore cancels old reminder work before scheduling imported enabled reminders.
  • Compose instrumented tests cover the Today section headings, the Today stale-inbox attention card and Inbox navigation action, the task-detail focus FAB content description used by accessibility services, Today task-row direct focus action and task-row delete confirmation action, Navigation 3 top-level destination switching and back behavior from task detail/settings routes, global create sheet quick input capture, single-create-action behavior across compact and wide navigation layouts, primary action callbacks for focus, task, countdown, calendar event, habit, review time-log and unresolved-task actions including reschedule/split/cancel, inbox promote/delete actions, editor form validation/save flows for task, habit, timeline event, countdown and manual time log, Focus timer running/paused/finished UI states, Focus timer paused-state restoration after recreation, task-editor draft restoration after recreation, Review daily-review/question save flows, visible review trend stats and visible focus-session history stats, Settings preference saving, installed app identity display, live backup data summary updates, reminder-row accessibility labels/callbacks, backup entry points, password entry switching export to encrypted JSON, visible backup-password clearing after successful export/import preview/restore, and the Settings flow under a 400dp compact width with 1.5 font scale.
  • Settings privacy/data boundary tests cover the in-app no-network/no-accounts/no-ads/no-analytics/no-cloud-sync copy, backup-password scope and uninstall deletion scope.
  • Settings in-app policy and support tests cover the 政策与支持 section, privacy policy boundary, real support contact readiness, no network feedback, open-source license summary and signed package / privacy policy URL / Data Safety / store screenshots / physical-device smoke / Play Console form reminders.
  • Automated screenshot smoke tests use Compose captureToImage() to verify nonblank, visually varied rendered frames for compact phone home, tablet landscape home, dark review and 1.5 font scale settings surfaces; on the API 36 reference AVD they also assert stable sampled visual signatures as lightweight golden regression coverage.
  • Edge-to-edge checks cover MainActivity.enableEdgeToEdge(), disabled Android navigation-bar contrast enforcement on API 29+, Activity-scoped windowSoftInputMode="adjustResize" in the merged debug/release manifests and IME padding on the standalone editor forms that use OutlinedTextField.
  • WorkManager instrumented tests grant POST_NOTIFICATIONS on API 36, execute ReminderWorker, reset the local delivery-throttle and focus-activity state, verify the posted TimeStack notification title, text and channel through NotificationManager.activeNotifications, and cover both task-reminder silence during running focus and schedule-reminder delivery during running focus.
  • Navigation 3 retained entries read the latest repository snapshot through rememberUpdatedState, so Settings reminder toggles and other current-route data changes update without leaving and re-entering the screen.
  • Room instrumented tests use an in-memory TimeStackDatabase to verify Debug sample seed idempotency, Release no-sample first-run defaults, empty-restore seed suppression, core DAO updates and destructive replaceAll behavior against the real SQLite engine.
  • Debug APK, release APK and release AAB builds with Room, KSP, Compose, adaptive bottom/rail navigation, Navigation 3, WorkManager, explicit local-first backup policy and R8 release shrinking.
  • Resource packaging checks verify the APK uses TimeStack adaptive launcher XML resources and the dedicated single-color notification icon, with old generated launcher webp files removed from the packaged APK.
  • Store listing asset and copy checks verify the local candidate Play Store icon, feature graphic and five phone screenshots exist, have the expected PNG dimensions, alpha/pixel-size properties and references in docs/store-listing.md plus the asset notes; they also verify app name, short description and full description length limits plus obvious promotional/ranking metadata risk phrases.
  • Privacy disclosure checks verify docs/privacy.md, docs/store-listing.md, the source manifest, the app permission allowlist and Android backup-rule XML files stay aligned on the no-INTERNET, no auto-backup, notification-only, no developer collection/sharing release boundary.
  • Public privacy-policy draft checks verify docs/public-privacy-policy.md covers the app scope, local storage, no-network claim, permissions, data export/import, data sharing/sale, deletion, children, change policy and the required real public contact replacement before hosting.
  • Privacy-policy hosting checks verify docs/privacy-policy-hosting.md, docs/public-privacy-policy.md, docs/privacy.md, docs/play-console-readiness.md, docs/distribution-readiness.md, docs/release.md, docs/testing.md, docs/product-design.md and README.md stay aligned on public URL, public contact, Play Console Privacy Policy field and Data Safety consistency requirements.
  • In-app policy/support checks verify app/src/main/java/com/example/timestack/ui/main/MainScreen.kt, app/src/androidTest/java/com/example/timestack/ui/main/MainScreenTest.kt, docs/privacy.md, docs/play-console-readiness.md, docs/distribution-readiness.md, docs/release.md, docs/testing.md, docs/product-design.md and README.md stay aligned on the 政策与支持 in-app policy and support section. The local gate is verifyInAppPolicySupport.
  • Third-party notices checks verify docs/third-party-notices.md, the Settings 开源许可 copy, gradle/libs.versions.toml, app/build.gradle.kts, release docs and evidence notes stay aligned on the current releaseRuntimeClasspath dependency families and local POM license spot checks. The local gate is verifyThirdPartyNotices.
  • Play Console readiness checks verify docs/play-console-readiness.md covers privacy policy URL, Data Safety, ads, app access, target audience, content rating, permissions declaration, account deletion and not-applicable declaration preparation for the current no-account/no-ads/no-network build.
  • Play submission runbook checks verify docs/play-submission-runbook.md, docs/play-console-readiness.md, docs/release.md, docs/testing.md, docs/product-design.md, docs/distribution-readiness.md and README.md stay aligned on Play Console app creation, testing tracks, production access, managed publishing, release creation, errors summary, pre-launch report and rollout evidence.
  • Release notes checks verify docs/release-notes.md matches app/build.gradle.kts versionName/versionCode, uses the expected release name, includes en-US and zh-CN language-tagged Play notes, keeps each language under 500 Unicode characters and avoids obvious promotional/solicitation wording.
  • Release signing runbook checks verify docs/signing-runbook.md, keystore.properties.example, .gitignore, app/build.gradle.kts, docs/release.md, docs/testing.md and README.md stay aligned on Play App Signing upload-key usage, secret exclusion, signed-build commands, jarsigner/apksigner verification and evidence capture.
  • Device/OEM smoke checklist checks verify docs/device-smoke-checklist.md, docs/release.md, docs/testing.md, docs/product-design.md and README.md stay aligned on physical-phone, OEM launcher, signed release install, real reminder delivery, document-provider, IME, large-screen and TalkBack spot-check requirements.
  • Distribution readiness checks verify docs/distribution-readiness.md, docs/release.md, docs/testing.md, docs/product-design.md, README.md and the store-candidate notes stay aligned on local gate evidence, external blockers and the current release decision summary.
  • Gradle permission gates verify the merged debug and release manifests stay on the allowed permission list: POST_NOTIFICATIONS, WorkManager scheduling permissions and the AndroidX dynamic receiver permission. Unexpected permissions such as INTERNET, location, camera, microphone, contacts, SMS or advertising permissions fail the build.

Latest Local Device Verification

  • AVD created through the local Android CLI: medium_phone.
  • Device under test: sdk_gphone64_x86_64, Android 16, API 36, sys.boot_completed=1.
  • App package installed and launched on emulator: com.lvjun.timestack/com.example.timestack.MainActivity.
  • Cold debug launch completed without FATAL EXCEPTION or AndroidRuntime crash in logcat.
  • Warm foreground restore completed in 309 ms on the API 36 emulator.
  • Evidence artifacts: artifacts/timestack-home-api36.png, artifacts/timestack-wide-api36.png, artifacts/product-audit-2026-07-01-settings/, artifacts/product-audit-2026-07-01-review-trends/, artifacts/product-audit-2026-07-01-current-product/, artifacts/product-flow-audit-2026-07-01-current-run/, artifacts/review-triage-audit-2026-07-01/, artifacts/reminder-throttle-audit-2026-07-01/, artifacts/focus-reminder-quiet-audit-2026-07-01/, artifacts/task-row-focus-audit-2026-07-01/, artifacts/task-row-delete-audit-2026-07-01/, artifacts/inbox-attention-audit-2026-07-01/, artifacts/system-picker-smoke-2026-07-01/, artifacts/widget-smoke-2026-07-01/, artifacts/reminder-permission-smoke-2026-07-01/, artifacts/permission-audit-2026-07-01/, artifacts/release-bundle-audit-2026-07-01/, artifacts/store-candidate-gate-2026-07-01/, artifacts/store-listing-copy-audit-2026-07-01/, artifacts/privacy-disclosure-gate-2026-07-02/, artifacts/public-privacy-policy-gate-2026-07-02/, artifacts/privacy-policy-hosting-gate-2026-07-02/, artifacts/in-app-policy-support-gate-2026-07-02/, artifacts/third-party-notices-gate-2026-07-02/, artifacts/play-console-readiness-gate-2026-07-02/, artifacts/play-submission-runbook-gate-2026-07-02/, artifacts/release-notes-gate-2026-07-02/, artifacts/signing-runbook-gate-2026-07-02/, artifacts/device-smoke-checklist-gate-2026-07-02/, artifacts/distribution-readiness-gate-2026-07-02/, artifacts/visual-golden-audit-2026-07-01/, artifacts/screenshot-matrix-2026-07-01/, artifacts/settings-privacy-trust-audit-2026-07-01/, artifacts/settings-app-identity-audit-2026-07-01/, artifacts/settings-backup-live-summary-audit-2026-07-01/ and artifacts/settings-backup-passphrase-clear-audit-2026-07-01/.
  • Connected test report: app/build/reports/androidTests/connected/debug/index.html.
  • JUnit XML evidence: app/build/outputs/androidTest-results/connected/debug/TEST-medium_phone(AVD) - 16-_app-.xml.
  • Latest backup passphrase-clear audit on 2026-07-01: Settings clears the visible backup password field after successful export, successful import preview and successful restore while keeping the internal restore confirmation passphrase only as pending state. testDebugUnitTest assembleDebugAndroidTest passed in 47s, targeted import-preview and restore passphrase-clear tests passed in 46s with 2 tests, 0 failures, 0 errors and 0 skipped, connectedDebugAndroidTest passed in 2m 7s with 46 tests, 0 failures, 0 errors and 0 skipped, and verifyStoreCandidate passed in 21s. Evidence is in artifacts/settings-backup-passphrase-clear-audit-2026-07-01/.
  • Latest app identity audit on 2026-07-01: Settings now exposes installed package metadata from PackageManager, showing TimeStack, 1.0 (1), com.lvjun.timestack and Debug on the API 36 emulator. testDebugUnitTest assembleDebugAndroidTest passed in 51s, connectedDebugAndroidTest passed with 42 tests, 0 failures, 0 errors and 0 skipped, and verifyStoreCandidate passed in 2m 18s. Evidence is in artifacts/settings-app-identity-audit-2026-07-01/.
  • Latest backup live-summary audit on 2026-07-01: Settings backup status now always includes the current snapshot data summary across tasks, habits, inbox, timeline, countdowns, focus history, review questions, daily reviews, reminders and preferences, then appends export/import/restore operation status through the polite live region. testDebugUnitTest assembleDebugAndroidTest passed in 45s, connectedDebugAndroidTest passed in 4m 9s with 43 tests, 0 failures, 0 errors and 0 skipped, and verifyStoreCandidate passed in 1m 58s. Evidence is in artifacts/settings-backup-live-summary-audit-2026-07-01/.
  • connectedDebugAndroidTest result on 2026-07-01 after visual golden and quick-create test stabilization: 37 tests, 0 failures, 0 errors, 0 skipped.
  • Clean build result on 2026-07-01: clean assembleDebug assembleRelease testDebugUnitTest passed through the T: alias.
  • Latest APK build result on 2026-07-01: testDebugUnitTest assembleDebugAndroidTest assembleRelease passed through the T: alias after focus-session history was added to Review.
  • Latest forced unit-test result on 2026-07-01: testDebugUnitTest --rerun-tasks passed through the T: alias after encrypted backup JSON/service tests were added.
  • Latest device-test result on 2026-07-01: connectedDebugAndroidTest passed on medium_phone after first-run seed logic was tightened and the app shell navigation/settings/create entry points were polished with Material icons.
  • Latest system-picker smoke result on 2026-07-01: API 36 medium_phone DocumentsUI exported readable JSON, exported password-encrypted JSON, imported the encrypted backup with the same password, showed restore preview and completed restore. Evidence is in artifacts/system-picker-smoke-2026-07-01/.
  • Latest launcher-widget smoke result on 2026-07-01: API 36 medium_phone Nexus Launcher listed TimeStack Today, Focus and Habits widgets, placed the Today widget on the home screen with live RemoteViews content, and opened MainActivity from a widget tap. Evidence is in artifacts/widget-smoke-2026-07-01/.
  • Latest reminder permission/scheduling smoke result on 2026-07-01: API 36 medium_phone revoked POST_NOTIFICATIONS, granted it through the real system dialog, verified Settings switch enablement, found and fixed a retained-route stale snapshot issue, and confirmed the habit reminder UI, Room state and WorkManager enqueue/cancel state now stay consistent. Evidence is in artifacts/reminder-permission-smoke-2026-07-01/.
  • Latest full verification on 2026-07-01 after the Navigation snapshot fix: testDebugUnitTest assembleDebugAndroidTest assembleRelease connectedDebugAndroidTest passed through the T: alias; connected device result was 37 tests, 0 failures, 0 errors, 0 skipped.
  • Latest permission audit on 2026-07-01: verifyDebugPermissions verifyReleasePermissions assembleDebug assembleRelease passed through the T: alias, and aapt2 dump permissions confirmed debug/release APKs contain only the allowed merged permissions with no INTERNET or sensitive device/data permissions. Evidence is in artifacts/permission-audit-2026-07-01/.
  • Latest release bundle audit on 2026-07-01: verifyReleasePermissions bundleRelease passed through the T: alias, producing app/build/outputs/bundle/release/app-release.aab; bundle structure contains BundleConfig.pb, base manifest, dex and resources, and jarsigner confirms the local AAB is unsigned until a real release/upload key is provided. Evidence is in artifacts/release-bundle-audit-2026-07-01/.
  • Latest local store-candidate gate on 2026-07-01: verifyStoreCandidate passed through the T: alias after store-listing asset and copy verification were added, covering candidate listing PNG dimensions/references, listing text length/risk checks, unit tests, debug Android test APK compilation, debug/release permission gates, release APK and release AAB; :app:verifyReleaseSigningConfigured fails as expected until real signing credentials are provided. Evidence is in artifacts/store-candidate-gate-2026-07-01/.
  • Latest privacy disclosure gate on 2026-07-02: verifyPrivacyDisclosures passed in 24s, and the final verifyStoreCandidate rerun after documentation updates passed in 21s with :verifyPrivacyDisclosures, store-listing asset/copy checks, unit tests, debug Android test APK compilation, debug/release permission gates, release APK and release AAB included. Evidence is in artifacts/privacy-disclosure-gate-2026-07-02/.
  • Latest public privacy-policy draft gate on 2026-07-02: verifyPublicPrivacyPolicyDraft passed in 28s, and the final verifyStoreCandidate rerun after documentation updates passed in 37s with :verifyPublicPrivacyPolicyDraft, :verifyPlayConsoleReadiness, :verifyPrivacyDisclosures, store-listing asset/copy checks, unit tests, debug Android test APK compilation, debug/release permission gates, release APK and release AAB included. Evidence is in artifacts/public-privacy-policy-gate-2026-07-02/.
  • Latest privacy-policy hosting gate on 2026-07-02: verifyPrivacyPolicyHosting passed in 24s after the checklist task-name traceability gap was fixed, validating the hosted privacy-policy URL, public contact, Play Console Privacy Policy field and Data Safety consistency checklist. Final verifyStoreCandidate reruns after adding the gate and updating evidence docs passed repeatedly with :verifyPrivacyPolicyHosting included. Evidence is in artifacts/privacy-policy-hosting-gate-2026-07-02/.
  • Latest in-app policy/support gate on 2026-07-02: verifyInAppPolicySupport passed and checks the Settings 政策与支持 section, its Compose test and release docs for privacy-policy boundary, support contact readiness, no network feedback and submission reminders. testDebugUnitTest assembleDebugAndroidTest passed after the UI and test changes; no device was attached, so the new Compose UI test was compiled but not executed in this pass. The final verifyStoreCandidate rerun after adding the gate passed with :verifyInAppPolicySupport included. Evidence is in artifacts/in-app-policy-support-gate-2026-07-02/.
  • Latest third-party notices gate on 2026-07-02: verifyThirdPartyNotices checks docs/third-party-notices.md, Settings 开源许可 copy, version catalog dependencies, app build dependencies and release docs against the current release runtime dependency families and local POM license spot checks. Evidence is in artifacts/third-party-notices-gate-2026-07-02/.
  • Latest Play Console readiness gate on 2026-07-02: verifyPlayConsoleReadiness passed in 22s, and the final verifyStoreCandidate rerun after documentation updates passed in 28s with :verifyPlayConsoleReadiness, :verifyPrivacyDisclosures, store-listing asset/copy checks, unit tests, debug Android test APK compilation, debug/release permission gates, release APK and release AAB included. Evidence is in artifacts/play-console-readiness-gate-2026-07-02/.
  • Latest Play submission runbook gate on 2026-07-02: verifyPlaySubmissionRunbook passed after the device-smoke task-name traceability gap was fixed, checking docs/play-submission-runbook.md and cross-document references for app creation, internal/closed testing, production access, release creation, managed publishing, errors summary, pre-launch report and rollout decision evidence. The final verifyStoreCandidate rerun after adding the gate passed in 34s with :verifyPlaySubmissionRunbook included. Evidence is in artifacts/play-submission-runbook-gate-2026-07-02/.
  • Latest release-notes gate on 2026-07-02: verifyReleaseNotes passed in 22s after the release-notes gate coverage note was added, and verifyStoreCandidate passed with :verifyReleaseNotes included. Evidence is in artifacts/release-notes-gate-2026-07-02/.
  • Latest signing runbook gate on 2026-07-02: verifySigningRunbook passed in 38s, validating the upload-key runbook, ignored signing-secret boundaries, Gradle signing hooks, signed AAB/APK verification commands and cross-document release links. The final verifyStoreCandidate rerun after adding the gate passed in 35s with :verifySigningRunbook included. Evidence is in artifacts/signing-runbook-gate-2026-07-02/.
  • Latest device/OEM smoke checklist gate on 2026-07-02: verifyDeviceSmokeChecklist passed in 22s after the product-design task-name traceability gap was fixed, validating the physical-phone, OEM launcher, signed release install, real reminder delivery, document-provider, IME, large-screen and TalkBack smoke plan. The final verifyStoreCandidate rerun after adding the gate passed with :verifyDeviceSmokeChecklist included. Evidence is in artifacts/device-smoke-checklist-gate-2026-07-02/.
  • Latest distribution readiness gate on 2026-07-02: verifyDistributionReadiness passed in 22s after the product-design matrix-link traceability gap was fixed. The final verifyStoreCandidate rerun after adding the gate passed with :verifyDistributionReadiness included. Evidence is in artifacts/distribution-readiness-gate-2026-07-02/.
  • Latest visual golden audit on 2026-07-01: the four Compose screenshot tests passed on the API 36 reference AVD with stable sampled signatures for compact phone home, tablet landscape home, dark review and 1.5 font-scale settings; the full connectedDebugAndroidTest suite then passed with 37 tests, 0 failures, 0 errors and 0 skipped. Evidence is in artifacts/visual-golden-audit-2026-07-01/.
  • Latest Product Design flow audit on 2026-07-01: ADB screenshots on the API 36 medium_phone AVD covered Today, quick create, quick input, Inbox, Review, Settings reminders, Settings backup and Focus. The audit found and fixed two UI polish issues: quick-create direct actions now include Material icons, and Settings backup now treats export as the primary action while import stays secondary. Evidence is in artifacts/product-flow-audit-2026-07-01-current-run/.
  • Latest Review unresolved-task triage audit on 2026-07-01: Review now supports continuing tomorrow, rescheduling, splitting into inbox items, lowering priority, moving back to inbox, cancelling and deleting. ADB screenshot evidence confirms the phone-width action layout is readable, and Room schema v8 stores task cancelled state. Evidence is in artifacts/review-triage-audit-2026-07-01/.
  • Latest full connected-device check after Review unresolved-task triage on 2026-07-01: connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 37 tests, 0 failures, 0 errors and 0 skipped.
  • Latest reminder-throttle audit on 2026-07-01: ReminderWorker now uses a persisted local-hour delivery window so at most 2 TimeStack notifications are posted in the same hour; extra reminders still finish and daily reminders still reschedule. testDebugUnitTest passed in 37s and connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 37 tests, 0 failures, 0 errors and 0 skipped. Evidence is in artifacts/reminder-throttle-audit-2026-07-01/.
  • Latest inbox-attention audit on 2026-07-01: Today now surfaces stale or overloaded inbox state below the summary metrics and provides a direct "整理" action into Inbox. Screenshot and UI XML evidence confirm the compact phone layout is readable. testDebugUnitTest assembleDebugAndroidTest passed in 54s and connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 38 tests, 0 failures, 0 errors and 0 skipped. Evidence is in artifacts/inbox-attention-audit-2026-07-01/.
  • Latest focus-reminder quiet audit on 2026-07-01: running Focus timer state now silences Task, Habit, Review and Overload reminders while allowing Schedule reminders to post. testDebugUnitTest assembleDebugAndroidTest passed in 1m 8s, connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 40 tests, 0 failures, 0 errors and 0 skipped, and verifyStoreCandidate passed in 2m 18s. Evidence is in artifacts/focus-reminder-quiet-audit-2026-07-01/.
  • Latest task-row focus audit on 2026-07-01: Today task rows now expose a direct play-icon focus action with an accessibility label. Screenshot evidence confirms the compact phone task list remains readable. testDebugUnitTest assembleDebugAndroidTest passed in 1m 4s, connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 40 tests, 0 failures, 0 errors and 0 skipped, and verifyStoreCandidate passed in 2m 53s. Evidence is in artifacts/task-row-focus-audit-2026-07-01/.
  • Latest task-row delete audit on 2026-07-01: Today task rows now expose a delete icon with an accessibility label and a destructive confirmation dialog. Screenshot and UI XML evidence confirm the compact phone task list and dialog remain readable. testDebugUnitTest assembleDebugAndroidTest passed in 30s, connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 40 tests, 0 failures, 0 errors and 0 skipped, and verifyStoreCandidate passed in 2m 34s. Evidence is in artifacts/task-row-delete-audit-2026-07-01/.
  • Latest settings privacy trust audit on 2026-07-01: Settings now exposes the local-first data boundary in app, covering no network permission, no accounts/ads/analytics/cloud sync, Room local storage, Android system picker backup/import, backup-password scope and deletion/uninstall behavior. testDebugUnitTest assembleDebugAndroidTest passed in 18s, connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 41 tests, 0 failures, 0 errors and 0 skipped, and verifyStoreCandidate passed in 2m 17s. Evidence is in artifacts/settings-privacy-trust-audit-2026-07-01/.

Commands

Build from the normal project path:

$env:JAVA_HOME = "C:\Program Files\Android\Android Studio\jbr"
$env:ANDROID_HOME = "$env:LOCALAPPDATA\Android\Sdk"
$env:ANDROID_SDK_ROOT = "$env:LOCALAPPDATA\Android\Sdk"
$env:PATH = "$env:JAVA_HOME\bin;$env:USERPROFILE\AppData\AndroidCLI;$env:ANDROID_HOME\platform-tools;$env:PATH"
.\gradlew.bat clean assembleDebug --no-daemon --no-configuration-cache --console=plain

Run local unit tests through an ASCII drive alias because the Windows project path contains Chinese characters:

subst T: "C:\Users\lvjun\Documents\打卡APP设计\timestack-android"
T:\gradlew.bat -p T:\ testDebugUnitTest --no-daemon --no-configuration-cache --console=plain
subst T: /D

Compile the instrumented test APK without requiring a connected device:

.\gradlew.bat assembleDebugAndroidTest --no-daemon --no-configuration-cache --console=plain

Run device/emulator tests when a device is attached:

$env:JAVA_HOME = "C:\Program Files\Android\Android Studio\jbr"
$env:ANDROID_HOME = "$env:LOCALAPPDATA\Android\Sdk"
$env:ANDROID_SDK_ROOT = "$env:LOCALAPPDATA\Android\Sdk"
$env:PATH = "$env:JAVA_HOME\bin;$env:USERPROFILE\AppData\AndroidCLI;$env:ANDROID_HOME\platform-tools;$env:ANDROID_HOME\emulator;$env:PATH"
.\gradlew.bat connectedDebugAndroidTest --no-daemon --no-configuration-cache --console=plain

Build the R8-shrunk release APK:

.\gradlew.bat assembleRelease --no-daemon --no-configuration-cache --console=plain

Build the release Android App Bundle:

.\gradlew.bat bundleRelease --no-daemon --no-configuration-cache --console=plain

Run the local store-candidate gate without signing secrets or a connected device:

.\gradlew.bat verifyStoreCandidate --no-daemon --no-configuration-cache --console=plain

Verify the privacy-policy hosting checklist without requiring a hosted URL:

.\gradlew.bat verifyPrivacyPolicyHosting --no-daemon --no-configuration-cache --console=plain

Verify the in-app policy and support section:

.\gradlew.bat verifyInAppPolicySupport --no-daemon --no-configuration-cache --console=plain

Verify third-party notices:

.\gradlew.bat verifyThirdPartyNotices --no-daemon --no-configuration-cache --console=plain

Verify the Play Console submission runbook without requiring Play Console access:

.\gradlew.bat verifyPlaySubmissionRunbook --no-daemon --no-configuration-cache --console=plain

Verify the release signing runbook without signing secrets:

.\gradlew.bat verifySigningRunbook --no-daemon --no-configuration-cache --console=plain

Verify the physical-device and OEM smoke checklist without requiring a connected device:

.\gradlew.bat verifyDeviceSmokeChecklist --no-daemon --no-configuration-cache --console=plain

Verify the distribution readiness matrix:

.\gradlew.bat verifyDistributionReadiness --no-daemon --no-configuration-cache --console=plain

Verify merged APK permission policy explicitly:

.\gradlew.bat verifyDebugPermissions verifyReleasePermissions --no-daemon --no-configuration-cache --console=plain

Not Yet Covered

  • Home Screen widget provider registration, launcher picker discovery, Today placement and Today tap-to-open now have API 36 Nexus Launcher coverage; physical-phone and OEM-launcher spot checks, including placing Focus and Habits, are tracked in docs/device-smoke-checklist.md and are still needed before wider distribution.
  • Pixel-perfect PNG golden comparison is not installed; lightweight reference-device visual-signature regression now covers compact phone home, tablet landscape home, dark review and 1.5 font scale settings surfaces, and ADB screenshot matrix evidence exists for compact phone, large phone, tablet landscape and 1.5 font scale.
  • Reminder Worker notification posting, local hourly delivery throttling, real system permission prompt, Settings reminder-toggle behavior and WorkManager enqueue/cancel state have API 36 emulator coverage; real wall-clock delayed delivery and OEM background-policy behavior are tracked in docs/device-smoke-checklist.md and still need physical-phone spot checks before wider distribution.
  • Android document picker export/import now has API 36 emulator coverage with the real system picker, including encrypted backup export and encrypted import with the same password; physical-phone and OEM/provider spot checks are tracked in docs/device-smoke-checklist.md and are still needed before wider distribution.
  • Full IME behavior on physical devices still needs smoke testing for third-party keyboards and gesture navigation, although Activity adjustResize and editor-form IME padding are now configured and the Compose device suite passes; the release smoke path is tracked in docs/device-smoke-checklist.md.
  • Release APK/AAB behavior still needs a real signed-build installation and smoke testing through docs/device-smoke-checklist.md.

Next Testing Work

  • Add deep-link or external-intent route tests if TimeStack exposes public link contracts beyond launcher/widget entry points.
  • Add deeper backup restore integration fixtures only if TimeStack later supports more document providers or backup envelope variants beyond the current encrypted JSON path.
  • Add pixel-perfect PNG golden comparisons only if the project later needs pixel-stable UI review in CI.