Pressing a card under 활동 중인 저장소 hitched: the file list was built in one long frame while the screen was still pushing in, and Back began with a frame of about 120 ms because the four tab screens were built again. PushedOver keeps the tab pager composed under a pushed screen, moved off to the left with the push; heldWhilePushedIn shows what loaded during the push once the screen stands still. Agent: main (opus) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
103 lines
5.6 KiB
Markdown
103 lines
5.6 KiB
Markdown
# TASK-069: In-app motion
|
|
|
|
Status: implemented; required checks pass; being adjusted from the product owner's look on a device
|
|
Owner: Claude
|
|
Reviewer: human product owner
|
|
|
|
## Outcome
|
|
|
|
The app moves where it used to jump, and what moves is the launcher icon's tea cup.
|
|
|
|
1. Cold start: the cup on the icon's blue, steaming, for about a second, then it fades.
|
|
2. Loading: lists show grey placeholder rows with a light passing over them; everything else shows
|
|
the steaming cup in place of the stock spinner.
|
|
3. The favourite star springs when its state changes.
|
|
4. A screen with nothing to list shows the cup bobbing above its message.
|
|
5. Entering and leaving a screen slides it a short way in from the side it was opened towards.
|
|
6. Pull to refresh brings the cup down with the finger; the steam appears near the release point.
|
|
7. A file's diff arrives row by row the first time it is shown.
|
|
8. Added while this was in progress (product owner, 2026-10-12): switching bottom tabs slides the
|
|
whole screen sideways, the old tab gliding out as the new one glides in, and the tab's icon
|
|
springs.
|
|
9. Added after that (product owner, 2026-10-12): the tabs inside a screen glide the same way.
|
|
전체 저장소/즐겨찾기 and 이슈/풀 리퀘스트 keep their header and tab row still while the list under
|
|
them changes sides. The branch screen's tabs already slid (a pager) and are unchanged.
|
|
10. Reported by the product owner (2026-10-12): the start stuttered as the cup left. The first
|
|
screen was gliding in sideways underneath, as if a tab had been switched, while the cover was
|
|
fading. The first screen now fades in where it stands, and the cover waits for it (at most
|
|
1.5 seconds longer) before it leaves.
|
|
11. Asked by the product owner (2026-10-12): going from 홈 to 알림 should pass 저장소 and 작업
|
|
on the way, quickly, not jump straight there. The four tab screens now sit side by side in a
|
|
pager that only a tab press moves.
|
|
12. After the product owner's first look on a device (2026-10-12): opening a screen pushes it in
|
|
from the right, the full width, as the one behind leaves to the left, and Back reverses it;
|
|
this replaces the short fade of item 5, which read as a flicker. The repository tabs keep
|
|
showing each tab's last list while it reloads, so nothing settles after the glide. All four
|
|
bottom tabs stay composed, so a glide does not wait for a screen to be built.
|
|
13. Measured on the product owner's device over adb (2026-10-12), at their request: every tab
|
|
change, repository tab change, opening and Back began with one frame of 45 to 118 ms on a
|
|
120 Hz screen. A move now starts without every screen being drawn again; the two repository
|
|
lists stay built side by side; a repository's branches open beside the list and not in place
|
|
of it; nothing that loops is drawn while it is off screen.
|
|
14. Reported by the product owner (2026-10-12): going between 전체 저장소 and 즐겨찾기 changed
|
|
the lines of text in the rows. Each row keeps the branch it was last found to have been
|
|
pushed to while the list is loaded again, where it went back to "확인 중" and then to the
|
|
branch, changing the row's height twice.
|
|
15. Reported by the product owner (2026-10-12): pressing a card under 활동 중인 저장소 hitched.
|
|
Measured: the file list was built in one long frame while the screen was still pushing in,
|
|
and Back began with a frame of about 120 ms because the four tab screens, dropped when the
|
|
screen covered them, were all built again. The tab screens now stay as they were under a
|
|
screen opened from them, and what loads during a push is shown once the screen stands still.
|
|
|
|
## Scope
|
|
|
|
- Included: Compose's own animation APIs only. No new dependency.
|
|
- Excluded: videos made with Claude Motion; any change to what the screens load or show.
|
|
|
|
## Writable paths
|
|
|
|
- `app/src/main/java/com/ubisam/ubgitea/ui/components/Motion.kt`
|
|
- `app/src/main/java/com/ubisam/ubgitea/ui/components/Elements.kt`
|
|
- `app/src/main/java/com/ubisam/ubgitea/ui/shell/AppShell.kt`
|
|
- `app/src/main/java/com/ubisam/ubgitea/MainActivity.kt`
|
|
- `app/src/main/java/com/ubisam/ubgitea/feature/home/HomeScreen.kt`
|
|
- `app/src/main/java/com/ubisam/ubgitea/feature/repositories/RepositoryListScreen.kt`
|
|
- `app/src/main/java/com/ubisam/ubgitea/feature/repositories/RepositoryListViewModel.kt`
|
|
- `app/src/main/java/com/ubisam/ubgitea/feature/work/WorkScreen.kt`
|
|
- `app/src/main/java/com/ubisam/ubgitea/feature/notifications/NotificationsScreen.kt`
|
|
- `app/src/main/java/com/ubisam/ubgitea/feature/workitems/WorkItemsScreen.kt`
|
|
- `app/src/main/java/com/ubisam/ubgitea/feature/history/HistoryScreen.kt`
|
|
- `app/src/main/java/com/ubisam/ubgitea/feature/history/FileDiffScreen.kt`
|
|
- `tasks/069-in-app-motion.md`
|
|
- `docs/development-log.md`
|
|
|
|
## Acceptance criteria
|
|
|
|
- [x] Each of the fifteen items above is in the code and the app builds.
|
|
- [x] The splash covers the app without delaying it: sign-in, loading and the OAuth callback run
|
|
underneath, and taps do not pass through the cover.
|
|
- [x] Moving between code tabs, or between pages of one screen, does not replay the screen
|
|
transition.
|
|
- [x] Nothing animates off screen: the pull indicator composes only during a pull, and the diff
|
|
rows animate once per file, not on scroll.
|
|
- [x] A list's loading message is still what a screen reader says.
|
|
- [ ] Seen on the product owner's device.
|
|
|
|
## Security and privacy
|
|
|
|
No additional concerns. No network, storage or credential code is touched.
|
|
|
|
## Required checks
|
|
|
|
```text
|
|
./gradlew compileDebugKotlin compileDebugUnitTestKotlin testDebugUnitTest assembleDebug lintDebug
|
|
```
|
|
|
|
## Evidence
|
|
|
|
See the development log entry for TASK-069.
|
|
|
|
## Review findings
|
|
|
|
None yet.
|