Ubisam-MobileGit/tasks/069-in-app-motion.md
choiminyeong db8fc0574e TASK-069: screens push in, repository tabs hold their list, tabs stay composed
Opening a screen pushes it in from the right and Back reverses it, in place
of a 90 ms fade that read as a flicker. The repository tabs keep each tab's
last list through a reload, so nothing settles after the glide. The four
bottom tabs stay composed; only the one shown answers Back.

Agent: main (opus)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 16:38:54 +09:00

4.3 KiB

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.

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/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

  • Each of the twelve items above is in the code and the app builds.
  • 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.
  • Moving between code tabs, or between pages of one screen, does not replay the screen transition.
  • Nothing animates off screen: the pull indicator composes only during a pull, and the diff rows animate once per file, not on scroll.
  • 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

./gradlew compileDebugKotlin compileDebugUnitTestKotlin testDebugUnitTest assembleDebug lintDebug

Evidence

See the development log entry for TASK-069.

Review findings

None yet.