# TASK-039: Design pass — app icon, visibility badge, header truncation, PR-label Korean-ization Status: implemented; all required checks pass; live-confirmed on the human product owner's device Owner: Claude Reviewer: Codex ## Outcome The human product owner asked for an open-ended design review: "디자인 수정해줄래? 앱의 아이콘부터 해서 전체적으로 확인해보고 부족한 부분 고쳐줘" (fix the design — starting with the app icon, review the whole app and fix what's lacking). This task covers the first batch of concrete gaps found and fixed while screen-by-screen reviewing the app (repository list, references/branches, work items, notifications, settings) in both light and dark mode: - **App icon**: the app had no custom launcher icon at all — Android's bare default was showing on the home screen and app switcher. Added a full adaptive icon (background + foreground + monochrome layers) with an original hand-drawn git-branch glyph on the app's own established primary green. - **Repository visibility label**: the 공개/비공개 (public/private) text on each repository-list row had no explicit style (rendered oversized/inconsistent next to the other metadata lines) and took a full-width line. Replaced with a small rounded badge, matching the compact-chip look Gitea's own web UI uses for the same information. - **References screen header truncation**: a repository with a long owner/name combination (a real one already in the human product owner's own Gitea instance) wrapped the title to 3 lines, pushing the branch/tag list far down the screen. Capped it to 2 lines with an ellipsis. - **"Pull Request" → "PR"**: two string resources (the work-items tab label, the notifications subject label) were the only English text left in an otherwise fully-Korean UI, and were also the widest word in a `Row` that doesn't wrap gracefully — on the live notifications list this visibly broke "Pull Request" across two lines next to the state label. The rest of the app had already settled on "PR" as the Korean-context abbreviation (`workitems_permission_denied`, `workitems_pr_refs`, etc.); matched that. ## Scope - Included: `mipmap-anydpi-v26/ic_launcher.xml`/`ic_launcher_round.xml` + their three drawable layers; `AndroidManifest.xml`'s `android:icon`/`android:roundIcon`; `RepositoryListScreen.kt`'s new `VisibilityBadge` composable and the references-header title's `maxLines`/`overflow`; `strings_workitems.xml`/`strings_notifications.xml`'s `Pull Request` → `PR` string values. - Excluded: no icon library was introduced (this app has never depended on `androidx.compose.material.icons` — see Design notes); no change to `WorkItemsScreen.kt` to surface which repository/branch a work-items or code-browser screen belongs to (a real gap noticed while reviewing, but it needs new state threaded through the ViewModel/use-case layer, not just a view change — flagged for a follow-up task rather than folded into this visual-polish batch); no explicit in-app back button anywhere (deliberate, pre-existing, app-wide pattern — this device's own 3-button system navigation already provides a visible back affordance, so this wasn't treated as a gap). ## Design notes - **Original glyph, not Gitea's logo**: the launcher icon is a hand-drawn trunk-and-branch motif (a straight line, a curved line, three circular nodes) built from plain vector primitives — deliberately not a reproduction of Gitea's own trademarked logo. - **Same green as the in-app theme**: the icon background reuses `GreenPrimaryLight` (`#3B6A1F`, `ui/theme/Color.kt`) exactly, so the home-screen icon and the in-app Material 3 theme read as one deliberate color choice rather than two unrelated greens. - **Adaptive icon only, no legacy PNG mipmaps**: `minSdk` is 28 (> 26), so only the `mipmap-anydpi-v26` adaptive-icon XML wrappers are needed; there is no pre-Android-8 device this app can run on that would need a flat PNG fallback. - **`VisibilityBadge` reuses the existing chip pattern**: a `Surface` + `RoundedCornerShape(4.dp)` + `labelSmall` text, the same construction already used for `FilterChip` elsewhere in this screen — not a new UI primitive, just the same small-badge shape applied to a second piece of metadata. - **"PR" was already this app's own convention, not a new one**: `strings_workitems.xml` already used "PR" in half a dozen other strings (`workitems_pr_refs`, `workitems_permission_denied`, the "PR/이슈" button label on the repository-detail header) — only the tab label and the notifications subject label had been left as the English "Pull Request". This was a one-line fix per file, not a design decision made fresh here. ## Acceptance criteria - [x] The app has a custom launcher icon (visible on the home screen and in Recents), not Android's bare default. - [x] The icon renders correctly as both a round and non-round adaptive icon shape. - [x] Repository visibility (공개/비공개) renders as a small styled badge, not an unstyled full-width text line. - [x] A repository with a long owner/name combination shows a 2-line-max, ellipsized title on the references screen instead of pushing the branch list down with a 3-line wrap. - [x] No user-facing English text remains next to otherwise-Korean labels in the work-items tabs or the notifications list. - [x] Dark mode reviewed for the repository list and references screens: badges, selected-branch highlighting, and text all stay legible with no contrast regressions. - [x] Build, unit tests, and lint pass. - [x] Live-confirmed on the human product owner's device for every change above. ## Required checks ```text ./gradlew compileDebugKotlin testDebugUnitTest assembleDebug lintDebug ``` ## Evidence - `app/src/main/res/drawable/ic_launcher_background.xml`, `ic_launcher_foreground.xml`, `ic_launcher_monochrome.xml`; `app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml`, `ic_launcher_round.xml`; `AndroidManifest.xml`'s new `android:icon`/`android:roundIcon`. - `feature/repositories/RepositoryListScreen.kt`: new private `VisibilityBadge` composable, used in place of the old unstyled `Text` for `repositories_private`/`repositories_public`; the references header's repository-name `Text` gained `maxLines = 2, overflow = TextOverflow.Ellipsis`. - `res/values/strings_workitems.xml`: `workitems_tab_pull_requests` changed from `Pull Request` to `PR`. `res/values/strings_notifications.xml`: `notifications_subject_pull_request` changed the same way. - `./gradlew compileDebugKotlin testDebugUnitTest assembleDebug lintDebug`: BUILD SUCCESSFUL, all unit tests passing, 0 lint errors (run twice — once after the icon/badge/truncation changes, once after the PR-label change). - Live device: installed over wireless `adb` after each round. - App icon: screenshot-confirmed rendering cleanly in the Recents/task-switcher view. - `VisibilityBadge`: screenshot-confirmed on the repository list — compact rounded badges (gray for 비공개, green-tinted for 공개) replacing the old full-width text line. - Header truncation: screenshot-confirmed on `RobotAutomationDevelopment-Dept/LGE-OC6-Inline-CylinderTypeWelder-PRI-REPO` (a real, already-long-named repository) — title now wraps to exactly 2 lines with a trailing ellipsis instead of 3, and the branch/tag list starts noticeably higher on screen. - PR label: screenshot-confirmed on the notifications "전체" tab against real data (a repository with an actual PR/issue history) — every row now reads "PR" inline with "이슈"/"열림"/"닫힘"/"병합됨" on one line instead of wrapping "Pull" and "Request" onto two. - Dark mode: forced via `adb shell cmd uimode night yes`, screenshot-reviewed the repository list, references, code-browser file tree, commit history list, and the colorized per-file diff view, restored to `night no` afterward — no contrast or legibility issues found anywhere reviewed. - Also reviewed without code changes (already well-designed, nothing to fix): the code-browser file tree (폴더/파일 rows, breadcrumb), the commit history list, and the per-file diff view — which already does proper red/green (`DiffAddedColor`/`colorScheme.error`) side-by-side 기존/변경 columns in monospace, in both light and dark mode. ## Known limitations - Work-items and code-browser screens still don't show which repository/branch they belong to in their own header — noticed during this review but scoped out (see Scope) since it needs new state threaded through the ViewModel/use-case layer, not a view-only change. - Dark-mode review now also covers the code browser and commit/diff screens (see Evidence above), but not yet notifications/settings/work-items — those still need a dark-mode pass. - Work-item and PR detail views with real content, and the text/image/CSV/PDF file viewers, haven't been screen-reviewed yet — this task covers the batch of concrete fixes found so far, not a fully complete pass. ## Review findings None yet — no Codex review pending (Codex retired, 2026-09-29).