Skip to content

[GMSS-213] 뒤로가기 트랜지션 보완 및 홈 이중 뒤로가기 종료 - #50

Merged
seunghee17 merged 8 commits into
developfrom
fix/back-press-navigate
Aug 19, 2026
Merged

[GMSS-213] 뒤로가기 트랜지션 보완 및 홈 이중 뒤로가기 종료#50
seunghee17 merged 8 commits into
developfrom
fix/back-press-navigate

Conversation

@soyeonLee126

@soyeonLee126 soyeonLee126 commented Aug 18, 2026

Copy link
Copy Markdown
Collaborator

작업 개요

시스템 뒤로가기 제스처로 화면을 빠져나갈 때 모션이 어색하던 문제를 해결하고, 홈에서 뒤로가기 한 번에 앱이 바로 종료되던 동작을 두 번 연타 방식으로 바꿉니다.

#47 에서 상세 화면의 predictivePopTransitionSpec 은 맞췄지만 탭 화면(Home/Calendar/Chat)에는 지정하지 않아, 탭에서 제스처 뒤로가기를 하면 Navigation3 기본값인 scaleOut(0.7f) 이 걸려 화면이 축소되며 사라졌습니다. 3버튼 뒤로가기는 popTransitionSpec(fade-through)을 타기 때문에, 같은 뒤로가기인데 트리거 경로에 따라 모션이 갈렸습니다.

작업 유형

  • feat: 새 기능
  • fix: 버그 수정
  • refactor: 리팩토링 (동작 변경 없음)
  • build: 빌드/의존성 설정
  • chore: 기타 (문서, 설정 등)
  • test: 테스트 추가/수정

변경 사항

뒤로가기 트랜지션

  • 탭 화면 NavDisplaypredictivePopTransitionSpec 을 지정해, 제스처 뒤로가기만 축소되던 모션을 3버튼과 동일한 fade-through 로 통일했습니다. 탭 entry 에는 transition metadata 가 없어 세 spec 을 모두 지정해야 하고, 하나라도 빠지면 그 경로만 라이브러리 기본값으로 떨어집니다.
  • 상세 화면 pop 이 swipeEdge 를 반영하도록 수정했습니다. 기존에는 엣지와 무관하게 항상 SlideDirection.End 로 빠져서, 오른쪽 엣지에서 당기면 손가락과 반대 방향으로 화면이 밀려났습니다.
  • detailSlideTransition 주석의 트리거 경로 설명을 정정했습니다. 3버튼 뒤로가기는 진행률 이벤트가 없어 predictivePopTransitionSpec 이 아니라 popTransitionSpec 을 탑니다.
  • swipeEdge 상수를 쓰기 위해 androidx.navigationevent:navigationevent 를 명시 선언했습니다. 기존에는 선언되지 않은 transitive 의존성에 의존하는 상태였습니다.

홈 이중 뒤로가기 종료

  • 홈 루트에서 뒤로가기 한 번이면 안내 토스트를 띄우고, 2초 안에 한 번 더 누르면 종료합니다. 홈 루트에서는 NavDisplaypreviousEntries 가 비어 자체 back handler 가 꺼지므로, 추가한 handler 가 시스템 뒤로가기를 대신 받습니다.
  • 토스트 인스턴스를 재사용하고 종료 직전 취소합니다. 그러지 않으면 연타 시 토스트가 큐에 쌓이고, Toast.LENGTH_SHORT(약 2초)와 종료 창(2초)이 겹쳐 앱이 사라진 뒤에도 런처 위에 토스트가 남습니다.
  • 다른 화면을 거쳐 홈으로 돌아오면 직전 경고를 무효화합니다. 남겨두면 홈에서 뒤로가기 1회 후 2초 안에 탭을 다녀오는 경로에서 경고 없이 바로 종료됩니다.
  • 창 계산에 SystemClock.elapsedRealtime() 을 씁니다. 벽시계(currentTimeMillis)는 시간 보정으로 뒤로 점프할 수 있어 뒤로가기 한 번에 종료되는 경우가 생깁니다.

문구 및 주석

  • 종료 안내 문구를 strings.xmlback_press_exit_confirm 으로 분리했습니다. 같은 파일에 하드코딩돼 있던 모델 다운로드 스낵바 문구(model_download_message, model_download_action)도 함께 옮겼습니다. LaunchedEffect 안에서는 stringResource 를 부를 수 없어 composable 본문에서 미리 읽어 넘깁니다.
  • 코드에서 그대로 읽히는 동작을 되풀이하는 주석을 걷어내고, 코드만으로는 알 수 없는 제약 두 건(경고 무효화 이유, 토스트 취소 이유)만 남겼습니다.

관련 이슈

  • 없음

관련 작업 (Notion)

스크린샷 / 동작 화면

갤럭시 S23(Android 16) 실기기에서 제스처 진행 중 프레임을 캡처해 확인했습니다.

  • 탭 화면 엣지 스와이프: 화면이 원래 크기와 위치를 유지한 채 알파만 감소합니다. 축소 없음.
  • 상세 화면 왼쪽 엣지: 화면이 오른쪽으로 밀리고 왼쪽에서 이전 화면이 들어옵니다.
  • 상세 화면 오른쪽 엣지: 화면이 왼쪽으로 밀리고 오른쪽에서 이전 화면이 들어옵니다.

문자열 리소스는 aapt2 dump strings 로 APK 반영을 확인했습니다. 모델 다운로드 스낵바는 셀룰러/용량 확인 조건에서만 노출되어 실제 표시는 재현하지 못했고, 컴파일과 리소스 반영까지만 확인했습니다.

종료 동작은 다음 네 가지를 확인했습니다.

  • 홈에서 뒤로가기 1회: 토스트 표시, 앱 생존
  • 2초 안에 2회: MainActivity 레코드 완전 소멸
  • 종료 후 이전 앱 화면에 토스트 잔존 없음
  • 홈 → 탭 이동 → 홈 복귀 후 뒤로가기(1.3초 내): 종료되지 않고 경고 재표시

체크리스트

  • base 브랜치가 develop으로 설정되어 있다
  • 로컬 빌드 및 실행을 확인했다
  • 커밋 메시지가 컨벤션(feat:, fix: 등)을 따른다
  • 불필요한 로그/주석/디버그 코드를 제거했다
  • 리뷰어가 이해할 수 있도록 설명을 작성했다

리뷰 요청 사항

  • [GMSS-206] 화면전환 애니메이션 적용 #47 에서 후속으로 남겨둔 WebViewScreen 의 구식 BackHandler 문제는 이번에도 손대지 않았습니다. enabled 조건을 붙이려면 GamssWebViewState.canGoBack() 이 snapshot state 가 아니어서 히스토리 변화에 recomposition 이 걸리지 않는 문제부터 풀어야 합니다. 상태 노출 방식을 바꾸는 별도 작업으로 분리하는 게 맞을지 의견 부탁드립니다.
  • 탭 fade-through 를 제스처 진행률로 seek 하면 fadeOut(90ms)이 끝나고 fadeIn 이 시작되는 지점에서 종이 배경만 보이는 순간이 스칩니다. 3버튼에서는 인지되지 않는 구간인데 제스처로 천천히 당기면 보입니다. 3버튼과 모션을 일치시키는 것을 우선해 그대로 뒀는데, predictive 경로만 겹치는 크로스페이드로 바꾸는 편이 나을지 봐주세요.
  • 상세 화면이 쌓인 탭을 탭바로 떠날 때, 나가는 화면이 상세라서 상세 pop 모션(우측 슬라이드)이 재생됩니다. 탭 전환 성격과는 어긋나지만 이번 범위에서는 제외했습니다.
  • supportsRtl="true" 이므로 RTL 로케일을 실제로 지원하게 되면 EDGE_LEFT/EDGE_RIGHT(물리적 엣지)와 Start/End(레이아웃 방향) 매핑을 뒤집어야 합니다. 현재는 영향 없습니다.

- 탭 화면에 predictivePopTransitionSpec 을 지정해, 제스처 뒤로가기만
  라이브러리 기본값(scaleOut)으로 축소되던 모션을 fade-through 로 통일
- 상세 화면 pop 이 swipeEdge 를 반영해 제스처를 시작한 엣지 쪽으로 빠지도록 수정
- swipeEdge 상수 사용을 위해 navigationevent 의존성을 명시 선언
- detailSlideTransition 주석의 트리거 경로 설명 정정
- 홈 루트에서 뒤로가기 한 번이면 안내 토스트, 2초 안에 한 번 더 누르면 종료
- 토스트 인스턴스를 재사용하고 종료 직전 취소해, 연타 시 큐에 쌓이거나
  앱이 사라진 뒤 런처 위에 남지 않도록 처리
- 다른 화면을 거쳐 홈으로 돌아오면 직전 경고를 무효화
- 하드코딩한 종료 안내 문구를 strings.xml 의 back_press_exit_confirm 으로 이동
- 코드에서 읽히는 동작을 되풀이하는 주석을 걷어내고, 코드만으로 알 수 없는
  제약 두 건(경고 무효화 이유, 토스트 취소 이유)만 남김
- MODEL_DOWNLOAD_MESSAGE / MODEL_DOWNLOAD_ACTION 상수를 strings.xml 로 이동
- LaunchedEffect 안에서는 stringResource 를 부를 수 없어 composable 본문에서 미리 읽는다
…igate

# Conflicts:
#	app/src/main/res/values/strings.xml
- 슬라이드 방향 분기를 그대로 되풀이하던 주석을 지웁니다
- 남긴 주석은 라이브러리 동작과 재발 방지 정보만 담도록 다듬습니다
문자열 상수를 리소스로 옮길 때 빈 줄이 남아 detekt 의
NoConsecutiveBlankLines 규칙에 걸렸습니다.

@seunghee17 seunghee17 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인했습니다

@seunghee17
seunghee17 merged commit 6774235 into develop Aug 19, 2026
6 checks passed
@seunghee17
seunghee17 deleted the fix/back-press-navigate branch August 19, 2026 11:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants