Skip to content

Commit 54bf91d

Browse files
committed
docs: add power-user import mode design
1 parent 962c90a commit 54bf91d

2 files changed

Lines changed: 149 additions & 0 deletions

File tree

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Power-User Import Mode Implementation Plan
2+
3+
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
4+
5+
**Goal:** Keep SAF as the default import path while exposing advanced non-SAF import entry points only when power-user mode is enabled.
6+
7+
**Architecture:** Add a small import entry-point catalog interface, a settings wrapper for the power-user toggle, and gate the advanced chooser behind that toggle. Keep standard imports on direct SAF and leave advanced browsing in `NewFileChooserActivity`.
8+
9+
**Tech Stack:** Android Views preferences, Jetpack Compose, Activity Result API, existing shared preferences, JUnit5.
10+
11+
---
12+
13+
## Chunk 1: Import entry-point boundary
14+
15+
### Task 1: Add failing unit test for entry-point visibility
16+
17+
**Files:**
18+
- Test: `app/src/test/java/com/kyhsgeekcode/disassembler/importing/ImportEntryPointCatalogTest.kt`
19+
20+
- [ ] Step 1: Write failing test for standard mode
21+
- [ ] Step 2: Run `./gradlew testDebugUnitTest --tests com.kyhsgeekcode.disassembler.importing.ImportEntryPointCatalogTest`
22+
- [ ] Step 3: Add `ImportEntryPoint` and `ImportEntryPointCatalog`
23+
- [ ] Step 4: Re-run the test until green
24+
25+
### Task 2: Use catalog in project overview
26+
27+
**Files:**
28+
- Create: `app/src/main/java/com/kyhsgeekcode/disassembler/importing/ImportEntryPointCatalog.kt`
29+
- Modify: `app/src/main/java/com/kyhsgeekcode/disassembler/ui/MainTab.kt`
30+
31+
- [ ] Step 1: Render buttons from visible entry points
32+
- [ ] Step 2: Keep `Select file` on direct SAF
33+
- [ ] Step 3: Add `Advanced import` launch path
34+
- [ ] Step 4: Run `./gradlew testDebugUnitTest assembleDebug`
35+
36+
## Chunk 2: Power-user settings boundary
37+
38+
### Task 3: Add settings wrapper
39+
40+
**Files:**
41+
- Create: `app/src/main/java/com/kyhsgeekcode/disassembler/preference/PowerUserModeSettings.kt`
42+
- Modify: `app/src/main/java/com/kyhsgeekcode/disassembler/preference/SettingsFragment.kt`
43+
- Modify: `app/src/main/res/xml/pref_settings.xml`
44+
- Modify: `app/src/main/res/xml-v30/pref_settings.xml`
45+
- Modify: `app/src/main/res/values/strings.xml`
46+
47+
- [ ] Step 1: Add toggle preference XML
48+
- [ ] Step 2: Add wrapper object for preference reads
49+
- [ ] Step 3: Make `ProjectOverview` refresh setting on resume
50+
- [ ] Step 4: Run `./gradlew testDebugUnitTest assembleDebug`
51+
52+
## Chunk 3: Advanced chooser gating
53+
54+
### Task 4: Gate advanced root items
55+
56+
**Files:**
57+
- Modify: `app/src/main/java/com/kyhsgeekcode/filechooser/NewFileChooserActivity.kt`
58+
- Modify: `app/src/main/java/com/kyhsgeekcode/filechooser/NewFileChooserAdapter.kt`
59+
- Modify: `app/src/main/java/com/kyhsgeekcode/filechooser/model/FileItem.kt`
60+
61+
- [ ] Step 1: Add chooser extra for power-user mode
62+
- [ ] Step 2: Restrict advanced root items to power-user mode
63+
- [ ] Step 3: Keep direct SAF import outside chooser
64+
- [ ] Step 4: Run `./gradlew testDebugUnitTest assembleDebug`
65+
66+
## Chunk 4: Final verification
67+
68+
### Task 5: Verify and commit
69+
70+
**Files:**
71+
- Modify as needed based on verification failures
72+
73+
- [ ] Step 1: Run `JAVA_HOME=$(/usr/libexec/java_home -v 17) ANDROID_HOME=$HOME/Library/Android/sdk ./gradlew testDebugUnitTest assembleDebug`
74+
- [ ] Step 2: Update maintenance docs if behavior changed
75+
- [ ] Step 3: Commit feature in a focused commit
76+
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Power-User Import Mode Design
2+
3+
## Summary
4+
5+
기본 파일 가져오기 흐름은 SAF를 기준으로 유지한다. 파워유저 기능은 별도 설정으로 명시적으로 활성화했을 때만 노출하고, 기본 사용자 경험과 구현 경로에서 분리한다.
6+
7+
## Goals
8+
9+
- 기본 사용자 경로는 Play 정책과 최신 Android 저장소 모델에 맞는 SAF 중심 흐름으로 유지한다.
10+
- 루트 파일 탐색, 직접 경로 탐색, 앱 목록 기반 선택 등 파워유저 기능은 기본 경로와 분리한다.
11+
- UI와 구현을 분리하기 위해 import entry point를 인터페이스로 추상화한다.
12+
13+
## Non-goals
14+
15+
- 이번 단계에서 루트 전용 구현을 새로 작성하지는 않는다.
16+
- 모든 legacy power-user 기능을 복구하지는 않는다.
17+
- 루트 권한 확보/검증 로직을 추가하지는 않는다.
18+
19+
## UX
20+
21+
### Standard mode
22+
23+
- 메인 화면에는 `Select file`만 보인다.
24+
- 이 버튼은 바로 SAF `OpenDocument`를 호출한다.
25+
26+
### Power-user mode
27+
28+
- Settings에 `Enable power-user import options` 토글을 추가한다.
29+
- 토글을 켜면 메인 화면에 `Advanced import` 버튼이 추가로 보인다.
30+
- `Advanced import`는 기존 `NewFileChooserActivity`를 열고, 여기서만 non-SAF/advanced 소스를 노출한다.
31+
32+
## Architecture
33+
34+
### Import entry point boundary
35+
36+
- `ImportEntryPoint`:
37+
- `SafImport`
38+
- `AdvancedImport`
39+
- `ImportEntryPointCatalog`:
40+
- power-user 설정값에 따라 화면에 노출할 entry point 목록을 결정한다.
41+
- UI는 이 catalog만 보고 버튼을 렌더링한다.
42+
43+
### Settings boundary
44+
45+
- `PowerUserModeSettings`는 shared preference 접근을 캡슐화한다.
46+
- UI는 직접 preference key 문자열을 알지 않는다.
47+
48+
### Advanced chooser boundary
49+
50+
- `NewFileChooserActivity``EXTRA_POWER_USER_MODE`를 입력으로 받는다.
51+
- power-user 모드일 때만 root/app/process/hash/zoo 등 advanced root items를 노출한다.
52+
53+
## Data flow
54+
55+
1. Settings에서 power-user toggle 변경
56+
2. `PowerUserModeSettings`에 저장
57+
3. `ProjectOverview`가 resume 시 설정값 재조회
58+
4. `ImportEntryPointCatalog`가 visible entry points 계산
59+
5. `Select file`은 SAF로 직접 import
60+
6. `Advanced import`는 advanced chooser로 이동
61+
62+
## Testing
63+
64+
- `ImportEntryPointCatalogTest`
65+
- standard mode는 `SafImport`만 노출
66+
- power-user mode는 `SafImport`, `AdvancedImport`를 노출
67+
- `PowerUserModeSettingsTest`는 이번 단계에서는 보류
68+
- 기존 `testDebugUnitTest` 전체 회귀 확인
69+
70+
## Rollout
71+
72+
- 이번 PR에서는 토글 + 버튼 분리 + chooser gating만 도입한다.
73+
- 후속 PR에서 root-only mode, direct-path mode, advanced source별 세부 제어를 추가한다.

0 commit comments

Comments
 (0)