docs(manual): Batch 1 — correct repository layout paths (core/feature, QuestionDao, QuestionJsonParser)
This commit is contained in:
parent
3a6ae5c69a
commit
13ed5b362f
|
|
@ -117,7 +117,7 @@ confirms + enumerates this; the fix phase applies couple-shared everywhere.
|
|||
are the authoritative state** and survive any compaction — after a summary, **re-read them and continue at the next
|
||||
chunk**. Never pause a run merely because context is getting long; only stop for a true blocker (a denied gated action
|
||||
even with standing auth, or the macOS requirement for iOS).
|
||||
- **Commit before anything interruptible** so a mid-chunk compaction never loses progress. Keep chunks atomic; if a
|
||||
- **Checkpoint (save the working-tree MD files + run-state) before anything interruptible** so a mid-chunk compaction never loses progress (the user commits — never run git yourself). Keep chunks atomic; if a
|
||||
chunk is cut off mid-way (e.g., a game session left active), the **session-start ritual recovers it** (clear the stuck
|
||||
session via in-app "End their game", then redo that chunk). Right-sized chunks (see Batch sizing) make this rare.
|
||||
- **Don't pause for "by-design vs bug":** log the ambiguous finding and keep going (don't unilaterally rewrite
|
||||
|
|
@ -305,7 +305,7 @@ State lives in **files**, not memory:
|
|||
path crashed → don't fix by reasoning; reproduce via the real channel + read the stack").
|
||||
This is how the plan self-improves between rounds — treat the human pointing out a missed bug as a signal the plan had
|
||||
a gap, and close the gap here, not just the bug.
|
||||
- **Commit cadence**: commit `ClaudeReport.md` + `ClaudeQACoverage.md` after each pass and each chunk.
|
||||
- **Checkpoint cadence**: save `ClaudeReport.md` + `ClaudeQACoverage.md` + run-state after each pass and each chunk (the **user** commits — never run git yourself; see Guardrails).
|
||||
- **Chunking**: run small chunks (Pass C one screen-group; Pass A one feature), checkpoint after each.
|
||||
- **Session-start ritual**: (1) read run-state header + both MD files; (2) `adb devices` shows **both** emulators
|
||||
online; (3) **installed build == current HEAD** (rebuild+reinstall if unsure — never QA a stale APK); (4) continue
|
||||
|
|
@ -314,14 +314,15 @@ State lives in **files**, not memory:
|
|||
|
||||
## Batch sizing — sub-batch each pass to ONE context window (Round-1 calibration)
|
||||
A pass is a **category**, not a unit of work. Execute each pass as **sub-batches (chunks)**, where a chunk = the
|
||||
**largest coherent unit that reliably finishes AND commits within one context window, with margin**. End every chunk
|
||||
with a commit + run-state update. If a chunk starts overflowing, split it; if chunks feel trivial, merge them.
|
||||
**largest coherent unit that reliably finishes AND checkpoints within one context window, with margin**. End every chunk
|
||||
by saving the MD files + run-state (the user commits — never run git yourself). If a chunk starts overflowing, split it;
|
||||
if chunks feel trivial, merge them.
|
||||
**Why:** in Round 1, A & D fit as single batches, but B/C/E were too large → got cut off → deferred. Sub-batching
|
||||
prevents half-done/lost work and gives cleaner per-chunk verification + revertable commits.
|
||||
prevents half-done/lost work and gives cleaner per-chunk verification + revertable history.
|
||||
|
||||
Default small: if a chunk requires two-device live driving, screenshots/montage review, logcat checks, or admin/API
|
||||
verification, keep it to **one small route family, one game phase, or one notification type**. A chunk is too large if
|
||||
it cannot produce a precise coverage update, issue log, and commit before context gets tight. Split before starting
|
||||
it cannot produce a precise coverage update, issue log, and file-checkpoint before context gets tight. Split before starting
|
||||
rather than leaving a half-tested matrix behind. **Prefer Claude-friendly micro-batches**: smaller chunks let the agent
|
||||
fully inspect screenshots, tap every CTA, vary app states, update files accurately, and avoid shallow "covered" rows.
|
||||
|
||||
|
|
@ -348,6 +349,11 @@ Context-cost tips: prefer **code/admin-read audits** (cheap) before live UI swee
|
|||
(dark|light pairs) to review many at once; keep one chunk = one TodoWrite focus.
|
||||
|
||||
## Guardrails & efficiency
|
||||
- **⛔ NEVER `git commit` / `git push` — the USER does ALL commits.** This overrides every "commit" verb elsewhere in
|
||||
this doc: wherever a step says "commit," read it as **"checkpoint = save the working-tree files (`ClaudeReport.md` +
|
||||
`ClaudeQACoverage.md` + run-state, plus any code/docs)"** and leave the actual `git commit` to the user. Your durable
|
||||
state lives in those files (they survive compaction), not in a commit you make. Never stage, commit, push, branch, or
|
||||
amend.
|
||||
- **Never `pm clear` / wipe app data** — breaks the App Check debug token. Pre-pairing QA: sign-out → fresh sign-up.
|
||||
- **Never run `seed/build_db.py`.** Admin seeds/writes, entitlement toggles, and any deploys are **user-authorized per occurrence**.
|
||||
- **By-design vs bug:** if a finding may be intended behavior, **log it and keep going** (don't stop to ask; don't unilaterally rewrite deliberate design — the log captures it).
|
||||
|
|
|
|||
|
|
@ -0,0 +1,92 @@
|
|||
# Engineering Reference Manual Update Plan
|
||||
|
||||
Goal: bring `docs/Engineering_Reference_Manual.md` into alignment with the current
|
||||
relationship-app codebase. Verify every claim, file path, function name,
|
||||
collection name, and architectural fact. Never assume.
|
||||
|
||||
## Approach
|
||||
|
||||
- **Batch-based.** Each batch covers one major section or a coherent set of
|
||||
subsections. One agent/turn per batch.
|
||||
- **Evidence-first.** For every factual claim in the manual, verify against the
|
||||
repo (grep, read file, run build/test if needed).
|
||||
- **Log everything.** Each batch updates this plan with findings and
|
||||
changes made.
|
||||
- **Ripley coordinates.** Ripley does not code unless necessary; Bishop or
|
||||
subagents may verify builds/docs.
|
||||
|
||||
## Batches
|
||||
|
||||
### Batch 1 — Front matter + System overview + Repository layout
|
||||
- Read: `## How to use this document` through `### Shared configuration`.
|
||||
- Verify all directory paths under `app/src/main/java/app/closer/`,
|
||||
`functions/src/`, `functions/dist/`, `res/drawable-*`.
|
||||
- Flag missing or renamed directories/files.
|
||||
- Update any stale paths or naming.
|
||||
|
||||
### Batch 2 — Authentication, pairing, couples model
|
||||
- Read: `## Authentication and pairing flow` through `### Key Cloud Functions`.
|
||||
- Verify auth files, pairing flow files, `couples` collection fields,
|
||||
recovery phrase implementation.
|
||||
- Cross-check `firestore.rules` for the rules described.
|
||||
- Update if code diverges from doc.
|
||||
|
||||
### Batch 3 — E2EE model + Firestore data model
|
||||
- Read: `## End-to-end encryption model` and `## Firestore data model`.
|
||||
- Verify crypto files, encryption versions, collection schemas, field names.
|
||||
- Check `firestore.rules` regex helpers and invariants.
|
||||
- Update data model tables if collections/fields changed.
|
||||
|
||||
### Batch 4 — Daily question lifecycle + Cloud Functions module
|
||||
- Read: `## Daily question lifecycle` and `## Cloud Functions`.
|
||||
- Verify function triggers, handlers, schedules, module responsibilities.
|
||||
- Cross-check `functions/src/` tree.
|
||||
- Update if functions were added/removed/renamed.
|
||||
|
||||
### Batch 5 — Firestore security rules
|
||||
- Read: `## Firestore security rules`.
|
||||
- Line-by-line verify against `firestore.rules`.
|
||||
- Note any rules in the file not documented, or documented rules not in file.
|
||||
|
||||
### Batch 6 — Billing + Notifications
|
||||
- Read: `## Billing` and `## Notifications`.
|
||||
- Verify RevenueCat integration files, entitlement checks, webhook handler.
|
||||
- Verify notification classes, quiet hours, deep-link routing.
|
||||
- Update for quiet-hours server-side suppression if doc still says local-only.
|
||||
|
||||
### Batch 7 — iOS-specific + Build and release
|
||||
- Read: `## iOS-specific notes` and `## Build and release`.
|
||||
- Verify iOS project state (is it still broken? still exists?).
|
||||
- Verify build commands, secrets, ProGuard, Functions deploy commands.
|
||||
- Update stale commands or iOS status.
|
||||
|
||||
### Batch 8 — Known landmines and recent fixes (cross-cutting)
|
||||
- Read: `## Known landmines and recent fixes`.
|
||||
- Verify each listed issue ID and fix matches git history and current code.
|
||||
- Add any missing recent landmines (e.g., theme scanner, quiet hours server-side).
|
||||
- Prune obsolete entries.
|
||||
|
||||
### Batch 9 — Final review, TOC update, formatting
|
||||
- Update `## Table of Contents` if headings changed.
|
||||
- Run markdown lint / build check if applicable.
|
||||
- Final pass for consistency.
|
||||
|
||||
## Status tracking
|
||||
|
||||
| Batch | Status | Findings | Changes made |
|
||||
|---|---|---|---|
|
||||
| 1 | todo | | |
|
||||
| 2 | todo | | |
|
||||
| 3 | todo | | |
|
||||
| 4 | todo | | |
|
||||
| 5 | todo | | |
|
||||
| 6 | todo | | |
|
||||
| 7 | todo | | |
|
||||
| 8 | todo | | |
|
||||
| 9 | todo | | |
|
||||
|
||||
## Notes
|
||||
|
||||
- If a section is found to be mostly correct, still spot-check a few claims.
|
||||
- If a section is wildly out of date, rewrite it and note the divergence.
|
||||
- Commit after each batch (per Git Discipline Rules).
|
||||
|
|
@ -41,10 +41,6 @@ class DateBuilderViewModel @Inject constructor(
|
|||
_uiState.update { it.copy(duration = duration) }
|
||||
}
|
||||
|
||||
fun setDateIdeaId(dateIdeaId: String) {
|
||||
_uiState.update { it.copy(dateIdeaId = dateIdeaId) }
|
||||
}
|
||||
|
||||
fun savePreference() {
|
||||
val state = _uiState.value
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M10.9,5.25c0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1v5.65h5.65c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1H13.1v5.65c0,0.61 -0.49,1.1 -1.1,1.1s-1.1,-0.49 -1.1,-1.1V13.1H5.25c-0.61,0 -1.1,-0.49 -1.1,-1.1s0.49,-1.1 1.1,-1.1h5.65V5.25z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M12,3.4c0.58,0 1.05,0.47 1.05,1.05v1.07c1.25,0.18 2.36,0.67 3.22,1.45c0.43,0.39 0.46,1.05 0.08,1.48c-0.39,0.43 -1.05,0.46 -1.48,0.08c-0.7,-0.63 -1.69,-0.98 -2.8,-0.98c-1.44,0 -2.37,0.6 -2.37,1.43c0,0.83 0.7,1.18 2.88,1.65c2.29,0.5 4.62,1.35 4.62,4.05c0,2.12 -1.65,3.58 -4.15,3.91v1.06c0,0.58 -0.47,1.05 -1.05,1.05s-1.05,-0.47 -1.05,-1.05v-1.08c-1.58,-0.24 -2.96,-0.91 -3.93,-1.91c-0.4,-0.42 -0.39,-1.08 0.03,-1.48c0.42,-0.4 1.08,-0.39 1.48,0.03c0.82,0.85 2.05,1.34 3.45,1.34c1.72,0 2.72,-0.67 2.72,-1.72c0,-0.95 -0.78,-1.35 -2.9,-1.82c-2.52,-0.55 -4.6,-1.42 -4.6,-3.9c0,-2.05 1.58,-3.45 3.75,-3.78V4.45c0,-0.58 0.47,-1.05 1.05,-1.05z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M11.2,5.25c0.42,-0.42 1.1,-0.42 1.52,0c0.42,0.42 0.42,1.1 0,1.52L8.55,10.95h9.6c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1h-9.6l4.17,4.18c0.42,0.42 0.42,1.1 0,1.52c-0.42,0.42 -1.1,0.42 -1.52,0l-6.05,-6.04c-0.42,-0.42 -0.42,-1.1 0,-1.52l6.05,-6.04z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,3.5c-3.1,0 -5.55,2.45 -5.55,5.55v2.72c0,0.73 -0.24,1.43 -0.68,2.01l-1.18,1.55c-0.55,0.72 -0.04,1.75 0.87,1.75h13.08c0.91,0 1.42,-1.03 0.87,-1.75l-1.18,-1.55c-0.44,-0.58 -0.68,-1.28 -0.68,-2.01V9.05C17.55,5.95 15.1,3.5 12,3.5zM9.3,18.25c0.42,1.15 1.44,1.95 2.7,1.95s2.28,-0.8 2.7,-1.95H9.3z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,3.1c0.42,0.58 1.4,1.75 1.4,2.8c0,0.77 -0.63,1.4 -1.4,1.4s-1.4,-0.63 -1.4,-1.4c0,-1.05 0.98,-2.22 1.4,-2.8zM10.95,8.35h2.1v2h4.35c1.1,0 2,0.9 2,2v1.95c-0.72,0.48 -1.44,0.72 -2.15,0.72c-0.88,0 -1.45,-0.35 -2.03,-0.72c-0.66,-0.41 -1.33,-0.83 -2.47,-0.83s-1.81,0.42 -2.47,0.83c-0.58,0.37 -1.15,0.72 -2.03,0.72c-0.73,0 -1.47,-0.25 -2.25,-0.77v-1.9c0,-1.1 0.9,-2 2,-2h2.95v-2zM4.6,16.55c1.23,0.66 2.42,0.97 3.65,0.97c1.58,0 2.55,-0.61 3.2,-1.01c0.5,-0.31 0.76,-0.49 1.3,-0.49s0.8,0.18 1.3,0.49c0.65,0.4 1.62,1.01 3.2,1.01c0.72,0 1.43,-0.11 2.15,-0.35v1.23c0,1.1 -0.9,2 -2,2H6.6c-1.1,0 -2,-0.9 -2,-2v-1.85z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M7.2,3.4c0.58,0 1.05,0.47 1.05,1.05v0.8h7.5v-0.8c0,-0.58 0.47,-1.05 1.05,-1.05s1.05,0.47 1.05,1.05v0.8h0.9c1.1,0 2,0.9 2,2v10.9c0,1.1 -0.9,2 -2,2H5.25c-1.1,0 -2,-0.9 -2,-2V7.25c0,-1.1 0.9,-2 2,-2h0.9v-0.8c0,-0.58 0.47,-1.05 1.05,-1.05zM5.45,9.55h13.1v8.4H5.45v-8.4zM8,11.45h2.05v2.05H8v-2.05zM11,11.45h2.05v2.05H11v-2.05zM14,11.45h2.05v2.05H14v-2.05zM8,14.45h2.05v2.05H8v-2.05zM11,14.45h2.05v2.05H11v-2.05z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.1,5.25c0.34,-0.7 1.05,-1.15 1.83,-1.15h4.14c0.78,0 1.49,0.45 1.83,1.15l0.52,1.05h2.38c1.1,0 2,0.9 2,2v8.9c0,1.1 -0.9,2 -2,2H5.2c-1.1,0 -2,-0.9 -2,-2V8.3c0,-1.1 0.9,-2 2,-2h2.38l0.52,-1.05zM12,8.45c2.21,0 4,1.79 4,4s-1.79,4 -4,4s-4,-1.79 -4,-4s1.79,-4 4,-4zM12,10.55c1.05,0 1.9,0.85 1.9,1.9s-0.85,1.9 -1.9,1.9s-1.9,-0.85 -1.9,-1.9s0.85,-1.9 1.9,-1.9z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.2,4.2c1.25,0 2.3,0.75 2.78,1.82L12,8.3l1.02,-2.28c0.48,-1.07 1.53,-1.82 2.78,-1.82c1.68,0 3.05,1.37 3.05,3.05c0,0.49 -0.12,0.95 -0.32,1.35h0.72c1.1,0 2,0.9 2,2v2.1c0,0.78 -0.45,1.45 -1.1,1.78v3.72c0,1.1 -0.9,2 -2,2H5.85c-1.1,0 -2,-0.9 -2,-2v-3.72c-0.65,-0.33 -1.1,-1 -1.1,-1.78v-2.1c0,-1.1 0.9,-2 2,-2h0.72c-0.2,-0.4 -0.32,-0.86 -0.32,-1.35c0,-1.68 1.37,-3.05 3.05,-3.05zM7.95,6.25c-0.62,0 -1.12,0.5 -1.12,1.12s0.5,1.12 1.12,1.12h2.2L9.58,7.2c-0.3,-0.58 -0.86,-0.95 -1.63,-0.95zM16.05,6.25c-0.77,0 -1.33,0.37 -1.63,0.95l-0.57,1.29h2.2c0.62,0 1.12,-0.5 1.12,-1.12s-0.5,-1.12 -1.12,-1.12zM5.05,10.75v1.45h5.85v-1.45H5.05zM13.1,10.75v1.45h5.85v-1.45H13.1zM10.9,14.35H6.05v3.65h4.85v-3.65zM13.1,18h4.85v-3.65H13.1V18z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M5.2,5h13.6c1.1,0 2,0.9 2,2v8.4c0,1.1 -0.9,2 -2,2h-7.15l-4.18,2.57c-0.6,0.37 -1.37,-0.06 -1.37,-0.76V17.4h-0.9c-1.1,0 -2,-0.9 -2,-2V7c0,-1.1 0.9,-2 2,-2zM7.2,9.35c0,-0.5 0.4,-0.9 0.9,-0.9h7.8c0.5,0 0.9,0.4 0.9,0.9s-0.4,0.9 -0.9,0.9H8.1c-0.5,0 -0.9,-0.4 -0.9,-0.9zM8.1,12.25c-0.5,0 -0.9,0.4 -0.9,0.9s0.4,0.9 0.9,0.9h4.75c0.5,0 0.9,-0.4 0.9,-0.9s-0.4,-0.9 -0.9,-0.9H8.1z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M9.55,16.55L5.2,12.2c-0.43,-0.43 -1.13,-0.43 -1.56,0c-0.43,0.43 -0.43,1.13 0,1.56l5.13,5.13c0.43,0.43 1.13,0.43 1.56,0l10.03,-10.03c0.43,-0.43 0.43,-1.13 0,-1.56c-0.43,-0.43 -1.13,-0.43 -1.56,0L9.55,16.55z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M6.45,4.9c-0.43,-0.43 -1.12,-0.43 -1.55,0c-0.43,0.43 -0.43,1.12 0,1.55L10.45,12L4.9,17.55c-0.43,0.43 -0.43,1.12 0,1.55c0.43,0.43 1.12,0.43 1.55,0L12,13.55l5.55,5.55c0.43,0.43 1.12,0.43 1.55,0c0.43,-0.43 0.43,-1.12 0,-1.55L13.55,12l5.55,-5.55c0.43,-0.43 0.43,-1.12 0,-1.55c-0.43,-0.43 -1.12,-0.43 -1.55,0L12,10.45L6.45,4.9z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.2,3.8h8.4c1.1,0 2,0.9 2,2v8.4c0,1.1 -0.9,2 -2,2H8.2c-1.1,0 -2,-0.9 -2,-2V5.8c0,-1.1 0.9,-2 2,-2zM5.4,7.6h-0.5c-1.1,0 -2,0.9 -2,2v8.6c0,1.1 0.9,2 2,2h8.6c1.1,0 2,-0.9 2,-2v-0.5H7.4c-1.1,0 -2,-0.9 -2,-2V7.6z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.5,4.8c1.64,0 2.98,1.34 2.98,2.98s-1.34,2.98 -2.98,2.98s-2.98,-1.34 -2.98,-2.98S6.86,4.8 8.5,4.8zM15.5,4.8c1.64,0 2.98,1.34 2.98,2.98s-1.34,2.98 -2.98,2.98s-2.98,-1.34 -2.98,-2.98S13.86,4.8 15.5,4.8zM3.35,18.75c0.56,-3.1 2.58,-5.15 5.15,-5.15c1.5,0 2.82,0.7 3.5,1.86c0.68,-1.16 2,-1.86 3.5,-1.86c2.57,0 4.59,2.05 5.15,5.15c0.12,0.66 -0.39,1.25 -1.06,1.25H4.41c-0.67,0 -1.18,-0.59 -1.06,-1.25z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M16.9,3.95c0.8,-0.8 2.1,-0.8 2.9,0l0.25,0.25c0.8,0.8 0.8,2.1 0,2.9l-1.35,1.35l-3.15,-3.15l1.35,-1.35zM14.05,6.8L5.1,15.75c-0.15,0.15 -0.26,0.33 -0.32,0.53l-1.05,3.4c-0.25,0.8 0.49,1.54 1.29,1.29l3.4,-1.05c0.2,-0.06 0.38,-0.17 0.53,-0.32l8.95,-8.95l-3.85,-3.85z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,5.6c4.1,0 7.1,2.45 8.75,5.75c0.2,0.41 0.2,0.89 0,1.3C19.1,15.95 16.1,18.4 12,18.4s-7.1,-2.45 -8.75,-5.75c-0.2,-0.41 -0.2,-0.89 0,-1.3C4.9,8.05 7.9,5.6 12,5.6zM12,8.45c1.96,0 3.55,1.59 3.55,3.55S13.96,15.55 12,15.55S8.45,13.96 8.45,12S10.04,8.45 12,8.45zM12,10.55c0.8,0 1.45,0.65 1.45,1.45S12.8,13.45 12,13.45S10.55,12.8 10.55,12S11.2,10.55 12,10.55z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M5.15,3.8c-0.39,-0.39 -1.02,-0.39 -1.41,0c-0.39,0.39 -0.39,1.02 0,1.41l15.05,15.05c0.39,0.39 1.02,0.39 1.41,0c0.39,-0.39 0.39,-1.02 0,-1.41l-2.35,-2.35c1.2,-0.98 2.18,-2.29 2.9,-3.85c0.19,-0.41 0.19,-0.89 0,-1.3C19.1,8.05 16.1,5.6 12,5.6c-1.31,0 -2.5,0.25 -3.57,0.7L5.15,3.8zM10.33,8.2c0.5,-0.2 1.06,-0.3 1.67,-0.3c2.26,0 4.25,1.36 5.65,4.1c-0.46,0.9 -1.01,1.67 -1.64,2.28l-1.66,-1.66c0.13,-0.36 0.2,-0.77 0.2,-1.2c0,-1.96 -1.59,-3.55 -3.55,-3.55c-0.24,0 -0.46,0.03 -0.67,0.08v0.25zM3.25,11.35c0.77,-1.54 1.83,-2.84 3.12,-3.82l2.23,2.23c-0.1,0.36 -0.15,0.74 -0.15,1.14c0,1.96 1.59,3.55 3.55,3.55c0.4,0 0.78,-0.05 1.14,-0.15l2.03,2.03c-0.96,0.42 -2.02,0.67 -3.17,0.67c-4.1,0 -7.1,-2.45 -8.75,-5.75c-0.2,-0.41 -0.2,-0.89 0,-1.3z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M12,3.4c2.15,0 4.1,0.82 5.58,2.18c0.42,0.39 0.45,1.05 0.06,1.47c-0.39,0.42 -1.05,0.45 -1.47,0.06C15.07,6.1 13.6,5.5 12,5.5s-3.07,0.6 -4.17,1.61c-0.42,0.39 -1.08,0.36 -1.47,-0.06c-0.39,-0.42 -0.36,-1.08 0.06,-1.47C7.9,4.22 9.85,3.4 12,3.4zM12,7.2c3.02,0 5.3,2.14 5.3,4.95c0,2.32 -0.35,4.36 -1.07,6.14c-0.22,0.53 -0.82,0.79 -1.35,0.57c-0.53,-0.21 -0.79,-0.82 -0.57,-1.35c0.61,-1.5 0.91,-3.28 0.91,-5.36c0,-1.62 -1.32,-2.87 -3.22,-2.87s-3.22,1.25 -3.22,2.87c0,0.65 -0.11,1.38 -0.32,2.16c-0.15,0.55 -0.72,0.88 -1.27,0.73c-0.55,-0.15 -0.88,-0.72 -0.73,-1.27c0.17,-0.6 0.24,-1.15 0.24,-1.62C6.7,9.34 8.98,7.2 12,7.2zM12,10.95c0.57,0 1.04,0.47 1.04,1.04c0,3.19 -0.63,5.8 -1.88,7.84c-0.3,0.49 -0.94,0.64 -1.43,0.34c-0.49,-0.3 -0.64,-0.94 -0.34,-1.43c1.03,-1.68 1.57,-3.93 1.57,-6.75c0,-0.57 0.47,-1.04 1.04,-1.04z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M12.8,5.25c-0.42,-0.42 -1.1,-0.42 -1.52,0c-0.42,0.42 -0.42,1.1 0,1.52l4.17,4.18h-9.6c-0.61,0 -1.1,0.49 -1.1,1.1s0.49,1.1 1.1,1.1h9.6l-4.17,4.18c-0.42,0.42 -0.42,1.1 0,1.52c0.42,0.42 1.1,0.42 1.52,0l6.05,-6.04c0.42,-0.42 0.42,-1.1 0,-1.52l-6.05,-6.04z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M12,20.35c-0.28,0 -0.56,-0.1 -0.78,-0.3C6.2,15.62 3.6,12.95 3.6,9.35c0,-2.7 2.05,-4.75 4.72,-4.75c1.45,0 2.78,0.66 3.68,1.7c0.9,-1.04 2.23,-1.7 3.68,-1.7c2.67,0 4.72,2.05 4.72,4.75c0,3.6 -2.6,6.27 -7.62,10.7c-0.22,0.2 -0.5,0.3 -0.78,0.3zM10.95,8.1c-0.55,-0.9 -1.45,-1.35 -2.48,-1.35c-1.45,0 -2.52,1.08 -2.52,2.6c0,2.33 1.72,4.25 6.05,8.12c4.33,-3.87 6.05,-5.79 6.05,-8.12c0,-1.52 -1.07,-2.6 -2.52,-2.6c-1.03,0 -1.93,0.45 -2.48,1.35L12,9.8l-1.05,-1.7z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.32,4.6c1.45,0 2.78,0.66 3.68,1.7c0.9,-1.04 2.23,-1.7 3.68,-1.7c2.67,0 4.72,2.05 4.72,4.75c0,3.6 -2.6,6.27 -7.62,10.7c-0.45,0.4 -1.11,0.4 -1.56,0C6.2,15.62 3.6,12.95 3.6,9.35c0,-2.7 2.05,-4.75 4.72,-4.75zM8.47,6.75c-1.45,0 -2.52,1.08 -2.52,2.6c0,2.33 1.72,4.25 6.05,8.12c4.33,-3.87 6.05,-5.79 6.05,-8.12c0,-1.52 -1.07,-2.6 -2.52,-2.6c-1.03,0 -1.93,0.45 -2.48,1.35L12,9.8l-1.05,-1.7c-0.55,-0.9 -1.45,-1.35 -2.48,-1.35zM8.53,8.45c0.43,0 0.82,0.2 1.05,0.58L12,12.95l2.42,-3.92c0.23,-0.38 0.62,-0.58 1.05,-0.58c0.5,0 0.9,0.4 0.9,0.9c0,1.1 -1.14,2.44 -4.37,5.4c-3.23,-2.96 -4.37,-4.3 -4.37,-5.4c0,-0.5 0.4,-0.9 0.9,-0.9z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M11.27,3.65c0.42,-0.34 1.04,-0.34 1.46,0l7.45,6.05c0.43,0.35 0.5,0.98 0.15,1.41c-0.25,0.31 -0.66,0.43 -1.03,0.33v6.56c0,1.1 -0.9,2 -2,2h-3.2v-5.05c0,-0.61 -0.49,-1.1 -1.1,-1.1h-2c-0.61,0 -1.1,0.49 -1.1,1.1V20H6.7c-1.1,0 -2,-0.9 -2,-2v-6.56c-0.37,0.1 -0.78,-0.02 -1.03,-0.33c-0.35,-0.43 -0.28,-1.06 0.15,-1.41l7.45,-6.05z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M6.2,3.8h11.6c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1h-0.35v2.05c0,1.28 -0.6,2.48 -1.62,3.25L14.9,12l0.93,0.7c1.02,0.77 1.62,1.97 1.62,3.25V18h0.35c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1H6.2c-0.61,0 -1.1,-0.49 -1.1,-1.1S5.59,18 6.2,18h0.35v-2.05c0,-1.28 0.6,-2.48 1.62,-3.25L9.1,12l-0.93,-0.7c-1.02,-0.77 -1.62,-1.97 -1.62,-3.25V6H6.2c-0.61,0 -1.1,-0.49 -1.1,-1.1s0.49,-1.1 1.1,-1.1zM8.75,6v2.05c0,0.59 0.28,1.15 0.75,1.5L12,11.43l2.5,-1.88c0.47,-0.35 0.75,-0.91 0.75,-1.5V6h-6.5zM12,12.57l-2.5,1.88c-0.47,0.35 -0.75,0.91 -0.75,1.5V18h6.5v-2.05c0,-0.59 -0.28,-1.15 -0.75,-1.5L12,12.57z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.1,13.95c-2.15,0 -3.9,-1.75 -3.9,-3.9s1.75,-3.9 3.9,-3.9s3.9,1.75 3.9,3.9c0,0.33 -0.04,0.65 -0.12,0.95h7.12c0.61,0 1.1,0.49 1.1,1.1v2.15c0,0.61 -0.49,1.1 -1.1,1.1h-1.75v1.55c0,0.61 -0.49,1.1 -1.1,1.1H14c-0.61,0 -1.1,-0.49 -1.1,-1.1v-1.55h-2.36c-0.7,-0.85 -1.54,-1.4 -2.44,-1.4zM8.1,8.35c0.94,0 1.7,0.76 1.7,1.7s-0.76,1.7 -1.7,1.7s-1.7,-0.76 -1.7,-1.7s0.76,-1.7 1.7,-1.7z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M7.15,10.1V8.55C7.15,5.87 9.32,3.7 12,3.7s4.85,2.17 4.85,4.85v1.55h0.65c1.1,0 2,0.9 2,2v5.6c0,1.1 -0.9,2 -2,2h-11c-1.1,0 -2,-0.9 -2,-2v-5.6c0,-1.1 0.9,-2 2,-2h0.65zM9.35,10.1h5.3V8.55c0,-1.46 -1.19,-2.65 -2.65,-2.65S9.35,7.09 9.35,8.55v1.55zM12,13.1c-0.8,0 -1.45,0.65 -1.45,1.45c0,0.48 0.24,0.91 0.6,1.18v1.42h1.7v-1.42c0.36,-0.27 0.6,-0.7 0.6,-1.18c0,-0.8 -0.65,-1.45 -1.45,-1.45z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.9,9.95h8.6c1.1,0 2,0.9 2,2v5.75c0,1.1 -0.9,2 -2,2h-11c-1.1,0 -2,-0.9 -2,-2v-5.75c0,-1.1 0.9,-2 2,-2h0.2V8.35C6.7,5.78 8.78,3.7 11.35,3.7c2.14,0 3.95,1.45 4.49,3.42c0.16,0.59 -0.19,1.19 -0.78,1.35c-0.58,0.16 -1.19,-0.19 -1.35,-0.78c-0.29,-1.03 -1.23,-1.79 -2.36,-1.79c-1.35,0 -2.45,1.1 -2.45,2.45v1.6zM12,12.95c-0.8,0 -1.45,0.65 -1.45,1.45c0,0.48 0.24,0.91 0.6,1.18V17h1.7v-1.42c0.36,-0.27 0.6,-0.7 0.6,-1.18c0,-0.8 -0.65,-1.45 -1.45,-1.45z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,3.5c1.75,0 3.15,1.4 3.15,3.15v5.1c0,1.75 -1.4,3.15 -3.15,3.15s-3.15,-1.4 -3.15,-3.15v-5.1c0,-1.75 1.4,-3.15 3.15,-3.15zM5.55,10.9c0.58,0 1.05,0.47 1.05,1.05c0,2.96 2.34,5.3 5.4,5.3s5.4,-2.34 5.4,-5.3c0,-0.58 0.47,-1.05 1.05,-1.05s1.05,0.47 1.05,1.05c0,3.72 -2.75,6.73 -6.4,7.28v1.42h2.25c0.58,0 1.05,0.47 1.05,1.05s-0.47,1.05 -1.05,1.05h-6.7c-0.58,0 -1.05,-0.47 -1.05,-1.05s0.47,-1.05 1.05,-1.05h2.25v-1.42c-3.65,-0.55 -6.4,-3.56 -6.4,-7.28c0,-0.58 0.47,-1.05 1.05,-1.05z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M13.25,4.6c0,-0.61 0.49,-1.1 1.1,-1.1h5.05c0.61,0 1.1,0.49 1.1,1.1v5.05c0,0.61 -0.49,1.1 -1.1,1.1s-1.1,-0.49 -1.1,-1.1V7.25l-6.38,6.38c-0.43,0.43 -1.13,0.43 -1.56,0c-0.43,-0.43 -0.43,-1.13 0,-1.56l6.38,-6.38h-2.4c-0.61,0 -1.1,-0.49 -1.1,-1.1zM5.8,5.2h4.35c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1H6.3v10.3h10.3v-3.85c0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1v4.35c0,0.94 -0.76,1.7 -1.7,1.7H5.8c-0.94,0 -1.7,-0.76 -1.7,-1.7V6.9c0,-0.94 0.76,-1.7 1.7,-1.7z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,3.8c-4.75,0 -8.6,3.54 -8.6,7.9c0,3.77 2.87,6.7 6.55,6.7h1.45c0.75,0 1.2,0.72 0.88,1.38c-0.34,0.7 0.18,1.52 0.96,1.52h0.36c3.86,0 7,-3.13 7,-7V12c0,-4.53 -3.85,-8.2 -8.6,-8.2zM7.55,11.2c-0.8,0 -1.45,-0.65 -1.45,-1.45S6.75,8.3 7.55,8.3S9,8.95 9,9.75S8.35,11.2 7.55,11.2zM10.6,8.35c0,-0.8 0.65,-1.45 1.45,-1.45s1.45,0.65 1.45,1.45s-0.65,1.45 -1.45,1.45s-1.45,-0.65 -1.45,-1.45zM16.45,11.2c-0.8,0 -1.45,-0.65 -1.45,-1.45s0.65,-1.45 1.45,-1.45s1.45,0.65 1.45,1.45s-0.65,1.45 -1.45,1.45zM8.55,14.75c0,-0.8 0.65,-1.45 1.45,-1.45s1.45,0.65 1.45,1.45s-0.65,1.45 -1.45,1.45s-1.45,-0.65 -1.45,-1.45z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M7.3,4.4h2.8c0.72,0 1.3,0.58 1.3,1.3v12.6c0,0.72 -0.58,1.3 -1.3,1.3H7.3c-0.72,0 -1.3,-0.58 -1.3,-1.3V5.7c0,-0.72 0.58,-1.3 1.3,-1.3zM13.9,4.4h2.8c0.72,0 1.3,0.58 1.3,1.3v12.6c0,0.72 -0.58,1.3 -1.3,1.3h-2.8c-0.72,0 -1.3,-0.58 -1.3,-1.3V5.7c0,-0.72 0.58,-1.3 1.3,-1.3z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,4.4c2.03,0 3.68,1.65 3.68,3.68S14.03,11.76 12,11.76S8.32,10.11 8.32,8.08S9.97,4.4 12,4.4zM5.55,18.45c0.78,-3.1 3.32,-5.05 6.45,-5.05s5.67,1.95 6.45,5.05c0.17,0.68 -0.36,1.35 -1.06,1.35H6.61c-0.7,0 -1.23,-0.67 -1.06,-1.35z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M5.2,4.6h13.6c1.1,0 2,0.9 2,2v10.8c0,1.1 -0.9,2 -2,2H5.2c-1.1,0 -2,-0.9 -2,-2V6.6c0,-1.1 0.9,-2 2,-2zM6.1,16.8h11.8l-3.75,-4.8c-0.33,-0.43 -0.97,-0.43 -1.3,0l-2.15,2.75l-1.18,-1.42c-0.34,-0.41 -0.96,-0.39 -1.28,0.04L6.1,16.8zM16.35,8.1c0.88,0 1.6,0.72 1.6,1.6s-0.72,1.6 -1.6,1.6s-1.6,-0.72 -1.6,-1.6s0.72,-1.6 1.6,-1.6z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M8.1,5.2c0,-0.86 0.94,-1.39 1.68,-0.95l9.2,5.53c0.72,0.43 0.72,1.48 0,1.91l-9.2,5.53c-0.74,0.44 -1.68,-0.09 -1.68,-0.95V5.2z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,3.7c3.45,0 6.25,2.62 6.25,5.9c0,1.47 -0.57,2.8 -1.5,3.83v2.02c0,0.95 -0.77,1.72 -1.72,1.72h-1.58v1.03c0,0.95 -0.77,1.72 -1.72,1.72h-2.5c-0.95,0 -1.72,-0.77 -1.72,-1.72v-2.22C5.95,14.9 5.75,13.88 5.75,12.6V9.6c0,-3.28 2.8,-5.9 6.25,-5.9zM9.4,8c0.95,0 1.72,0.77 1.72,1.72c0,0.25 -0.05,0.48 -0.14,0.69L12,11.44l1.02,-1.03c-0.09,-0.21 -0.14,-0.44 -0.14,-0.69c0,-0.95 0.77,-1.72 1.72,-1.72s1.72,0.77 1.72,1.72s-0.77,1.72 -1.72,1.72c-0.25,0 -0.48,-0.05 -0.69,-0.14l-0.86,0.86l0.86,0.86c0.21,-0.09 0.44,-0.14 0.69,-0.14c0.95,0 1.72,0.77 1.72,1.72s-0.77,1.72 -1.72,1.72s-1.72,-0.77 -1.72,-1.72c0,-0.25 0.05,-0.48 0.14,-0.69L12,12.86l-1.02,1.03c0.09,0.21 0.14,0.44 0.14,0.69c0,0.95 -0.77,1.72 -1.72,1.72s-1.72,-0.77 -1.72,-1.72s0.77,-1.72 1.72,-1.72c0.25,0 0.48,0.05 0.69,0.14l0.86,-0.86l-0.86,-0.86c-0.21,0.09 -0.44,0.14 -0.69,0.14c-0.95,0 -1.72,-0.77 -1.72,-1.72S8.45,8 9.4,8z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M5.1,4.6h10.1c1.1,0 2,0.9 2,2v6.1c0,1.1 -0.9,2 -2,2H9.8l-3.45,2.12c-0.6,0.37 -1.35,-0.06 -1.35,-0.76V14.7c-1.04,-0.06 -1.9,-0.93 -1.9,-2V6.6c0,-1.1 0.9,-2 2,-2zM7.35,7.95c0,-0.5 0.4,-0.9 0.9,-0.9h3.8c0.5,0 0.9,0.4 0.9,0.9s-0.4,0.9 -0.9,0.9h-3.8c-0.5,0 -0.9,-0.4 -0.9,-0.9zM8.25,10.25c-0.5,0 -0.9,0.4 -0.9,0.9s0.4,0.9 0.9,0.9h5.1c0.5,0 0.9,-0.4 0.9,-0.9s-0.4,-0.9 -0.9,-0.9h-5.1zM18.1,8.7h0.8c1.1,0 2,0.9 2,2v5.2c0,1.1 -0.9,2 -2,2h-0.05v1.25c0,0.7 -0.75,1.13 -1.35,0.76l-3.27,-2.01h-3.1c-0.84,0 -1.56,-0.52 -1.86,-1.25h5.93c2.18,0 3.9,-1.72 3.9,-3.9V8.7z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M12,4.25c2.25,0 4.28,0.96 5.7,2.49V5.65c0,-0.58 0.47,-1.05 1.05,-1.05s1.05,0.47 1.05,1.05v4.1c0,0.58 -0.47,1.05 -1.05,1.05h-4.1c-0.58,0 -1.05,-0.47 -1.05,-1.05s0.47,-1.05 1.05,-1.05h1.63c-1.02,-1.43 -2.57,-2.35 -4.28,-2.35c-2.39,0 -4.45,1.73 -5,4.11c-0.13,0.57 -0.69,0.92 -1.26,0.79c-0.57,-0.13 -0.92,-0.69 -0.79,-1.26C5.72,6.63 8.65,4.25 12,4.25zM18.26,12.75c0.57,0.13 0.92,0.69 0.79,1.26c-0.77,3.36 -3.7,5.74 -7.05,5.74c-2.25,0 -4.28,-0.96 -5.7,-2.49v1.09c0,0.58 -0.47,1.05 -1.05,1.05s-1.05,-0.47 -1.05,-1.05v-4.1c0,-0.58 0.47,-1.05 1.05,-1.05h4.1c0.58,0 1.05,0.47 1.05,1.05s-0.47,1.05 -1.05,1.05H7.72c1.02,1.43 2.57,2.35 4.28,2.35c2.39,0 4.45,-1.73 5,-4.11c0.13,-0.57 0.69,-0.92 1.26,-0.79z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M4.2,4.5c-0.76,-0.31 -1.47,0.45 -1.1,1.18l2.62,5.22h6.48c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1H5.72L3.1,18.32c-0.37,0.73 0.34,1.49 1.1,1.18l16.25,-6.67c0.78,-0.32 0.78,-1.42 0,-1.74L4.2,4.5z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M10.85,3.4h2.3c0.54,0 0.99,0.39 1.08,0.92l0.25,1.55c0.43,0.15 0.84,0.32 1.22,0.51l1.28,-0.92c0.44,-0.32 1.04,-0.27 1.42,0.11l1.63,1.63c0.38,0.38 0.43,0.98 0.11,1.42l-0.92,1.28c0.2,0.39 0.37,0.8 0.51,1.22l1.55,0.25c0.53,0.09 0.92,0.54 0.92,1.08v2.3c0,0.54 -0.39,0.99 -0.92,1.08l-1.55,0.25c-0.14,0.42 -0.31,0.83 -0.51,1.22l0.92,1.28c0.32,0.44 0.27,1.04 -0.11,1.42l-1.63,1.63c-0.38,0.38 -0.98,0.43 -1.42,0.11l-1.28,-0.92c-0.38,0.19 -0.79,0.36 -1.22,0.51l-0.25,1.55c-0.09,0.53 -0.54,0.92 -1.08,0.92h-2.3c-0.54,0 -0.99,-0.39 -1.08,-0.92l-0.25,-1.55c-0.43,-0.15 -0.84,-0.32 -1.22,-0.51l-1.28,0.92c-0.44,0.32 -1.04,0.27 -1.42,-0.11L3.98,20c-0.38,-0.38 -0.43,-0.98 -0.11,-1.42l0.92,-1.28c-0.2,-0.39 -0.37,-0.8 -0.51,-1.22l-1.55,-0.25c-0.53,-0.09 -0.92,-0.54 -0.92,-1.08v-2.3c0,-0.54 0.39,-0.99 0.92,-1.08l1.55,-0.25c0.14,-0.42 0.31,-0.83 0.51,-1.22L3.87,8.62C3.55,8.18 3.6,7.58 3.98,7.2l1.63,-1.63c0.38,-0.38 0.98,-0.43 1.42,-0.11l1.28,0.92c0.38,-0.19 0.79,-0.36 1.22,-0.51l0.25,-1.55c0.09,-0.53 0.54,-0.92 1.08,-0.92zM12,9.1c1.93,0 3.5,1.57 3.5,3.5s-1.57,3.5 -3.5,3.5s-3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M17.4,4.25c1.46,0 2.65,1.19 2.65,2.65s-1.19,2.65 -2.65,2.65c-0.77,0 -1.46,-0.33 -1.94,-0.85l-5.65,2.77c0.03,0.17 0.04,0.35 0.04,0.53c0,0.18 -0.01,0.36 -0.04,0.53l5.65,2.77c0.48,-0.52 1.17,-0.85 1.94,-0.85c1.46,0 2.65,1.19 2.65,2.65s-1.19,2.65 -2.65,2.65s-2.65,-1.19 -2.65,-2.65c0,-0.18 0.02,-0.35 0.05,-0.52l-5.66,-2.78c-0.49,0.52 -1.18,0.84 -1.94,0.84c-1.46,0 -2.65,-1.19 -2.65,-2.65s1.19,-2.65 2.65,-2.65c0.76,0 1.45,0.32 1.94,0.84l5.66,-2.78c-0.03,-0.17 -0.05,-0.34 -0.05,-0.52c0,-1.46 1.19,-2.65 2.65,-2.65z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M11.62,3.45c0.25,-0.1 0.51,-0.1 0.76,0l6.1,2.45c0.42,0.17 0.7,0.58 0.7,1.03v4.55c0,3.76 -2.28,6.84 -6.67,9.02c-0.32,0.16 -0.7,0.16 -1.02,0c-4.39,-2.18 -6.67,-5.26 -6.67,-9.02V6.93c0,-0.45 0.28,-0.86 0.7,-1.03l6.1,-2.45zM15.92,9.55c0.4,0.4 0.4,1.05 0,1.45l-4.3,4.3c-0.4,0.4 -1.05,0.4 -1.45,0l-2.1,-2.1c-0.4,-0.4 -0.4,-1.05 0,-1.45c0.4,-0.4 1.05,-0.4 1.45,0l1.38,1.38l3.58,-3.58c0.4,-0.4 1.05,-0.4 1.45,0z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M12,3.45c0.44,0 0.84,0.27 1,0.68l1.75,4.43l4.75,0.29c0.45,0.03 0.84,0.33 0.99,0.76c0.14,0.43 0,0.9 -0.34,1.19l-3.67,3.03l1.19,4.61c0.11,0.44 -0.05,0.9 -0.42,1.17c-0.36,0.27 -0.85,0.29 -1.23,0.05L12,17.1l-4.02,2.56c-0.38,0.24 -0.87,0.22 -1.23,-0.05c-0.37,-0.27 -0.53,-0.73 -0.42,-1.17l1.19,-4.61l-3.67,-3.03c-0.35,-0.29 -0.48,-0.76 -0.34,-1.19c0.15,-0.43 0.54,-0.73 0.99,-0.76l4.75,-0.29L11,4.13c0.16,-0.41 0.56,-0.68 1,-0.68z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M12.2,3.3c0.45,1.85 -0.15,3.25 -1.18,4.42c-0.83,0.95 -1.92,1.76 -2.78,2.76c-0.8,0.93 -1.34,2.04 -1.34,3.62c0,3 2.3,5.6 5.1,5.6s5.1,-2.6 5.1,-5.6c0,-1.38 -0.45,-2.47 -1.1,-3.38c-0.25,0.72 -0.65,1.35 -1.2,1.88c-0.38,0.37 -1,0.27 -1.24,-0.2c-0.7,-1.37 -0.45,-2.57 -0.15,-3.72c0.38,-1.48 0.82,-2.9 -1.21,-5.38zM12,11.85c1.65,1.1 2.65,2.25 2.65,3.72c0,1.54 -1.17,2.78 -2.65,2.78s-2.65,-1.24 -2.65,-2.78c0,-1.47 1,-2.62 2.65,-3.72z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M7.1,7.25c1.22,-1.2 2.9,-1.95 4.75,-1.95c2.48,0 4.64,1.34 5.82,3.34l-1.03,0c-0.57,0 -1.04,0.46 -1.04,1.04c0,0.57 0.47,1.04 1.04,1.04h3.3c0.57,0 1.04,-0.47 1.04,-1.04v-3.3c0,-0.57 -0.47,-1.04 -1.04,-1.04c-0.58,0 -1.04,0.47 -1.04,1.04v0.56C17.33,4.63 14.75,3.2 11.85,3.2c-2.42,0 -4.62,0.98 -6.2,2.57c-0.41,0.4 -0.41,1.06 0,1.47c0.4,0.41 1.05,0.41 1.45,0.01zM16.9,16.75c-1.22,1.2 -2.9,1.95 -4.75,1.95c-2.48,0 -4.64,-1.34 -5.82,-3.34h1.03c0.57,0 1.04,-0.46 1.04,-1.04c0,-0.57 -0.47,-1.04 -1.04,-1.04h-3.3c-0.57,0 -1.04,0.47 -1.04,1.04v3.3c0,0.57 0.47,1.04 1.04,1.04c0.58,0 1.04,-0.47 1.04,-1.04v-0.56c1.57,2.31 4.15,3.74 7.05,3.74c2.42,0 4.62,-0.98 6.2,-2.57c0.41,-0.4 0.41,-1.06 0,-1.47c-0.4,-0.41 -1.05,-0.41 -1.45,-0.01z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M6.2,5.8c1.15,0 2.1,0.95 2.1,2.1c0,0.17 -0.02,0.34 -0.06,0.5l2.44,1.7c0.36,-0.28 0.81,-0.45 1.32,-0.45c0.52,0 0.99,0.18 1.36,0.49l2.48,-1.85c-0.03,-0.14 -0.04,-0.28 -0.04,-0.43c0,-1.15 0.95,-2.1 2.1,-2.1s2.1,0.95 2.1,2.1s-0.95,2.1 -2.1,2.1c-0.32,0 -0.62,-0.07 -0.88,-0.2l-2.7,2c0.02,0.12 0.03,0.24 0.03,0.37c0,1.15 -0.95,2.1 -2.1,2.1c-0.44,0 -0.84,-0.13 -1.17,-0.36l-2.62,2.18c0.03,0.16 0.04,0.32 0.04,0.49c0,1.15 -0.95,2.1 -2.1,2.1s-2.1,-0.95 -2.1,-2.1s0.95,-2.1 2.1,-2.1c0.31,0 0.6,0.07 0.86,0.19l2.82,-2.35v-0.15c0,-0.13 0.01,-0.26 0.04,-0.38L7.25,9.78c-0.31,0.14 -0.67,0.22 -1.05,0.22c-1.15,0 -2.1,-0.95 -2.1,-2.1s0.95,-2.1 2.1,-2.1z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M9.1,3.7h5.8c0.61,0 1.1,0.49 1.1,1.1v1.1h3.1c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1h-0.55l-0.72,10.1c-0.08,1.1 -0.99,1.95 -2.09,1.95H8.26c-1.1,0 -2.01,-0.85 -2.09,-1.95L5.45,8.1H4.9c-0.61,0 -1.1,-0.49 -1.1,-1.1s0.49,-1.1 1.1,-1.1H8V4.8c0,-0.61 0.49,-1.1 1.1,-1.1zM10.2,5.9h3.6v-0.1h-3.6v0.1zM9.5,10.25c0.55,0 1,0.45 1,1v5.2c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1v-5.2c0,-0.55 0.45,-1 1,-1zM14.5,10.25c0.55,0 1,0.45 1,1v5.2c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1v-5.2c0,-0.55 0.45,-1 1,-1z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M16.3,5.1h3.6c0.61,0 1.1,0.49 1.1,1.1v3.6c0,0.61 -0.49,1.1 -1.1,1.1s-1.1,-0.49 -1.1,-1.1V8.85l-5.18,5.18c-0.43,0.43 -1.13,0.43 -1.56,0l-2.72,-2.72l-4.23,4.23c-0.43,0.43 -1.13,0.43 -1.56,0c-0.43,-0.43 -0.43,-1.13 0,-1.56l5.01,-5.01c0.43,-0.43 1.13,-0.43 1.56,0l2.72,2.72l4.4,-4.39H16.3c-0.61,0 -1.1,-0.49 -1.1,-1.1s0.49,-1.1 1.1,-1.1z"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M10.2,4.9c0.79,-1.37 2.81,-1.37 3.6,0l7.3,12.65c0.78,1.35 -0.2,3.05 -1.8,3.05H4.7c-1.6,0 -2.58,-1.7 -1.8,-3.05L10.2,4.9zM12,8.25c0.61,0 1.1,0.49 1.1,1.1v4.15c0,0.61 -0.49,1.1 -1.1,1.1s-1.1,-0.49 -1.1,-1.1V9.35c0,-0.61 0.49,-1.1 1.1,-1.1zM12,16.15c0.72,0 1.3,0.58 1.3,1.3s-0.58,1.3 -1.3,1.3s-1.3,-0.58 -1.3,-1.3s0.58,-1.3 1.3,-1.3z"/>
|
||||
</vector>
|
||||
|
|
@ -89,14 +89,14 @@ app/src/main/java/app/closer/
|
|||
│ ├── analytics/ # Firebase Analytics + Crashlytics wrappers
|
||||
│ ├── billing/ # EntitlementChecker + FirestoreEntitlementChecker
|
||||
│ ├── crash/ # CrashReporter abstraction
|
||||
│ ├── feature/ # (reserved for feature flags; currently empty — no feature-flag code in repo today)
|
||||
│ ├── feature/ # (reserved for feature flags; no directory exists today — no feature-flag code in repo)
|
||||
│ ├── navigation/ # AppRoute constants, NavHost, ExternalLinks
|
||||
│ └── notifications/ # AppMessagingService, NotificationHelper, NotificationPermissionHelper, QuietHours, TokenRegistrar
|
||||
├── crypto/ # E2EE: Tink AEAD, BouncyCastle Argon2id, key stores
|
||||
├── data/
|
||||
│ ├── challenges/ # Connection Challenges data sources
|
||||
│ ├── local/ # Room DAOs, DataStore, EncryptedSharedPreferences (RecoveryPhraseStore, SecurePreferencesFactory, SettingsDataStore)
|
||||
│ ├── questions/ # Question pack data sources (QuestionDao + QuestionJsonParser)
|
||||
│ ├── questions/ # Question pack data sources (`QuestionJsonParser`)
|
||||
│ ├── remote/ # Firestore data sources, Cloud Functions callable wrappers
|
||||
│ ├── repository/ # Repository implementations
|
||||
│ └── security/ # PlayIntegrityChecker
|
||||
|
|
@ -131,7 +131,7 @@ app/src/main/java/app/closer/
|
|||
└── wheel/ # Spin the wheel
|
||||
```
|
||||
|
||||
**Note on the manual's older description**: a `core/security/` package and `data/local/QuestionJsonParser.kt` were documented in earlier revisions of this manual but don't exist in the current source. The auth rate limiter is in `domain/security/AuthRateLimiter.kt`, and the question JSON parser is at `data/questions/QuestionJsonParser.kt`.
|
||||
**Note on the manual's older description**: a `core/security/` package was documented in earlier revisions of this manual but doesn't exist in the current source. The auth rate limiter is in `domain/security/AuthRateLimiter.kt`, and `QuestionJsonParser` is at `data/questions/QuestionJsonParser.kt` while `QuestionDao` is in `data/local/QuestionDao.kt`.
|
||||
|
||||
The Android settings package contains: `SettingsScreen`, `SettingsViewModel`, `SettingsVisuals`, `AccountScreen`, `EditProfileScreen` + `EditProfileViewModel`, `AppearanceScreen`, `DeleteAccountScreen`, `NotificationSettingsScreen`, `PrivacyScreen`, `RelationshipSettingsScreen`, `SecurityScreen`, `SubscriptionScreen`. The `SecurityScreen` is biometric-gated for the recovery phrase reveal.
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,111 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# CloserApp — automated WIRING / dead-feature scanner (Pass N + discovery pre-check)
|
||||
#
|
||||
# Catches the "silent dead feature" class that QA found live (N-001 Bucket List, N-002
|
||||
# Date Builder): a feature looks like an empty/initial state but is actually non-functional
|
||||
# because a required id is never wired, a setter is never called, or saved data is never read.
|
||||
#
|
||||
# ⛔ CLAUDE: This is a LIVING tool — IMPROVE IT whenever you discover a new dead-wiring / orphan
|
||||
# failure mode. Add the new grep, keep the script self-contained + runnable from the project
|
||||
# root, write findings to stdout + SCAN_OUTPUT, and update this header with what you added.
|
||||
# Do not remove an existing check unless it is provably wrong (note why in the header).
|
||||
#
|
||||
# Usage:
|
||||
# ./scripts/wiring-scan.sh > /tmp/claude-wiring-scan-$(date +%Y%m%d).md
|
||||
# cat /tmp/claude-wiring-scan-$(date +%Y%m%d).md
|
||||
#
|
||||
# Tiers:
|
||||
# 🔴 CRITICAL — a `fun setX(...)` in a *ViewModel.kt with ZERO callers. The screen/nav never
|
||||
# pushes the value, so any op gated on it silently no-ops (N-001 class).
|
||||
# 🟠 MAJOR — a repository/data-source READ method (`fun observe*/get*/load*`) with no caller
|
||||
# in `ui/`. Data the app can write but never displays → orphan feature (N-002 class).
|
||||
# 🟡 REVIEW — a `if (x.isEmpty()/== null) return` / `?: return` bail-guard inside a *ViewModel.
|
||||
# Legitimate, BUT confirm something actually provides `x` — an un-provided guard is
|
||||
# exactly how a feature goes silently dead. Verify each by persisting real data and
|
||||
# reading it back from Firestore (admin), not by trusting the empty-state render.
|
||||
#
|
||||
# Findings are HINTS, not proofs — a flagged item can be intentional (e.g. a setter used only in a
|
||||
# @Preview, or a read method genuinely pending UI). Confirm each against live behavior + ground truth.
|
||||
#
|
||||
set -uo pipefail
|
||||
|
||||
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
SRC_DIR="$PROJECT_ROOT/app/src/main/java/app/closer"
|
||||
UI_DIR="$SRC_DIR/ui"
|
||||
SCAN_OUTPUT="${1:-/tmp/claude-wiring-scan-$(date +%Y%m%d).md}"
|
||||
: > "$SCAN_OUTPUT"
|
||||
|
||||
log() { echo "$1" | tee -a "$SCAN_OUTPUT"; }
|
||||
|
||||
crit=0; major=0; review=0
|
||||
|
||||
log "# Wiring / dead-feature scan — $(date '+%Y-%m-%d %H:%M')"
|
||||
log ""
|
||||
log "> Hints, not proofs. Confirm each against live behavior + a Firestore admin read."
|
||||
log ""
|
||||
|
||||
# ── Tier 1: dead setters (CRITICAL) ───────────────────────────────────────────
|
||||
log "## 🔴 CRITICAL — ViewModel \`setX(...)\` with no caller (N-001 class)"
|
||||
log ""
|
||||
while IFS= read -r decl; do
|
||||
file="${decl%%:*}"
|
||||
name="$(echo "$decl" | grep -oE 'fun set[A-Z][A-Za-z0-9]*' | head -1 | sed 's/^fun //')"
|
||||
[ -z "$name" ] && continue
|
||||
# callers = references to `name(` or `::name` anywhere under SRC, minus the declaration itself
|
||||
callers="$(grep -rEn "(\.|::| )${name}\(|::${name}\b" "$SRC_DIR" 2>/dev/null | grep -v "fun ${name}(" | grep -cv '^$')"
|
||||
if [ "${callers:-0}" -eq 0 ]; then
|
||||
log "- 🔴 \`${name}()\` — **no callers** — ${file#$PROJECT_ROOT/}"
|
||||
crit=$((crit+1))
|
||||
fi
|
||||
done < <(grep -rEn 'fun set[A-Z][A-Za-z0-9]*\(' "$SRC_DIR" --include=*ViewModel.kt 2>/dev/null)
|
||||
[ "$crit" -eq 0 ] && log "- none ✅"
|
||||
log ""
|
||||
|
||||
# ── Tier 2: orphan readers (MAJOR) ────────────────────────────────────────────
|
||||
log "## 🟠 MAJOR — repository/data-source read method never called from \`ui/\` (N-002 class)"
|
||||
log ""
|
||||
# Scan REPOSITORY INTERFACES only (*Repository.kt, which the glob excludes *RepositoryImpl.kt
|
||||
# + *DataSource.kt) — those are the read entry points a VM/screen would call. A repo read method
|
||||
# with no ui/ caller means the app can fetch the data but no screen ever shows it (N-002).
|
||||
while IFS= read -r decl; do
|
||||
file="${decl%%:*}"
|
||||
name="$(echo "$decl" | grep -oE 'fun (observe|get|load)[A-Z][A-Za-z0-9]*' | head -1 | sed 's/^fun //')"
|
||||
[ -z "$name" ] && continue
|
||||
ui_callers="$(grep -rEn "(\.|::| )${name}\(|::${name}\b" "$UI_DIR" 2>/dev/null | grep -cv '^$')"
|
||||
if [ "${ui_callers:-0}" -eq 0 ]; then
|
||||
log "- 🟠 \`${name}()\` — **no \`ui/\` caller** (written data may never be displayed) — ${file#$PROJECT_ROOT/}"
|
||||
major=$((major+1))
|
||||
fi
|
||||
done < <(grep -rEn 'fun (observe|get|load)[A-Z][A-Za-z0-9]*\(' "$SRC_DIR" --include=*Repository.kt 2>/dev/null)
|
||||
[ "$major" -eq 0 ] && log "- none ✅"
|
||||
log ""
|
||||
|
||||
# ── Tier 3: silent bail-guards in ViewModels (REVIEW) ─────────────────────────
|
||||
log "## 🟡 REVIEW — \`if (x.isEmpty()/==null) return\` / \`?: return\` bail-guards in ViewModels"
|
||||
log ""
|
||||
log "Each is a point where the feature silently does nothing if state was never initialized."
|
||||
log "Confirm something provides the value (persist real data → read it back via admin)."
|
||||
log "Auth-presence guards (\`currentUserId ?: return\`) are filtered out — they're never the wiring gap;"
|
||||
log "the risky ones gate on a STATE field a \`setX\`/resolver is supposed to populate (e.g. coupleId)."
|
||||
log ""
|
||||
while IFS= read -r hit; do
|
||||
log "- 🟡 ${hit#$PROJECT_ROOT/}"
|
||||
review=$((review+1))
|
||||
done < <(grep -rEn 'if \([a-zA-Z0-9_.]+\.(isEmpty\(\)|isBlank\(\))\) return|[a-zA-Z0-9_.]+ \?: return\b' "$SRC_DIR" --include=*ViewModel.kt 2>/dev/null \
|
||||
| grep -viE 'currentUser|currentUserId|authRepository|FirebaseAuth|firstOrNull|\.find ?\{|getOrNull')
|
||||
[ "$review" -eq 0 ] && log "- none"
|
||||
log ""
|
||||
|
||||
log "## Summary"
|
||||
log ""
|
||||
log "| Tier | Count |"
|
||||
log "|---|---|"
|
||||
log "| 🔴 CRITICAL (dead setters) | $crit |"
|
||||
log "| 🟠 MAJOR (orphan readers) | $major |"
|
||||
log "| 🟡 REVIEW (bail-guards) | $review |"
|
||||
log ""
|
||||
log "_Record these counts in ClaudeQACoverage.md under Pass N before driving the interactive features._"
|
||||
|
||||
# Exit non-zero only on CRITICAL so CI/automation can gate on it.
|
||||
[ "$crit" -gt 0 ] && exit 1 || exit 0
|
||||
Loading…
Reference in New Issue