11 KiB
11 KiB
쿠폰 등록 버튼 노출 및 해외 사용자 본인인증 예외 수정
작업 목표
- 마이페이지
btnCoupon터치 시 한국 사용자는 기존처럼 본인인증이 필요하고, 한국이 아닌 사용자는 본인인증 없이 쿠폰 등록 화면으로 이동하도록 수정한다. - 마이페이지
btnCoupon은 한국이 아닌 사용자에 한해 민감한 콘텐츠 보기 설정이 켜져 있을 때만 화면에 보이도록 수정한다. - 마이페이지 기능 버튼 영역을
RecyclerView기반 그리드로 전환해 숨겨진 버튼이 있어도 중간 빈 슬롯 없이 왼쪽부터 자연스럽게 재배치되도록 수정한다. MyPageFragment에 혼합된 기능 버튼 모델/어댑터 책임을 분리해 화면 제어와 렌더링 관심사를 정리한다.
체크리스트
- AC1:
countryCode == "KR"이고isAuth == false인 경우 기존처럼 인증 필요 토스트와showAuthDialog()가 실행된다.- QA: 한국 사용자 분기에서 기존 인증 요구 동작 유지 코드 확인
- AC2:
countryCode != "KR"이고isAuth == false인 경우에도CanCouponActivity로 이동한다.- QA: 쿠폰 버튼 분기가
isAuth || !isKoreanUser조건으로 허용되는지 코드 확인
- QA: 쿠폰 버튼 분기가
- AC3: 이미 인증된 사용자는 국가와 무관하게 기존처럼
CanCouponActivity로 이동한다.- QA: 인증 완료 사용자의 쿠폰 등록 진입 동작 유지 코드 확인
- AC4: 변경 파일 진단/검증 명령 결과를 기록한다.
- QA:
lsp_diagnostics, 관련 Gradle 검증 명령 결과 기록
- QA:
- AC5:
countryCode != "KR"이고SharedPreferenceManager.isAdultContentVisible == true인 경우에만 쿠폰 버튼이 기능 버튼 목록에 포함되어 화면에 보인다.- QA: 비한국 사용자에서 쿠폰 버튼 아이템이 민감한 콘텐츠 보기 설정값에 따라 리스트에 포함되는지 코드 확인
- AC6:
countryCode != "KR"이고SharedPreferenceManager.isAdultContentVisible == false인 경우 쿠폰 버튼이 기능 버튼 목록에서 제외되어 화면에 보이지 않는다.- QA: 비한국 사용자에서 쿠폰 버튼 아이템이 리스트에 추가되지 않는지 코드 확인
- AC7:
countryCode == "KR"인 경우 쿠폰 버튼 노출과 기존 한국/비한국 클릭 분기는 유지된다.- QA: 한국 사용자에서는 버튼이 계속 보이고, 클릭 시 기존 인증 분기가 유지되는지 코드 확인
- AC8: 기능 버튼 영역이
RecyclerView기반으로 렌더링되고, 숨겨진 버튼은 데이터 목록에서 제외되어 남은 버튼이 좌→우/상→하로 자연스럽게 압축 배치된다.- QA:
fragment_my.xml이RecyclerView를 사용하고,MyPageFragment가 쿠폰/본인인증 버튼을 조건에 따라 아이템 리스트에 포함/제외하는지 코드 확인
- QA:
- AC9: 쿠폰 버튼이 숨겨지는 비한국 사용자(
isAdultContentVisible == false)에서도 기능 버튼 간 가로/세로 간격이 기존 4열 그리드와 동일하게 유지된다.- QA:
GridLayoutManager(4)와GridSpacingItemDecoration(..., 16dp, false)적용으로 기존 16dp 간격 패턴을 유지하는지 코드 확인
- QA:
- AC10:
FunctionButtonItem과FunctionButtonAdapter가MyPageFragment밖 별도 파일로 분리되어 Fragment가 화면 상태/버튼 목록 조립에 집중한다.- QA: 모델/어댑터 클래스가 별도 파일로 이동하고
MyPageFragment하단 정의가 제거됐는지 코드 확인
- QA: 모델/어댑터 클래스가 별도 파일로 이동하고
- AC11: 기능 버튼 조립 로직은
buildFunctionButtonItems()로 분리되며, 기존 버튼 순서/조건/클릭 동작은 유지된다.- QA:
MyPageFragment가updateFunctionButtons()에서 조립 함수 결과만 어댑터에 전달하는지, 버튼 분기 로직이 동일한지 코드 확인
- QA:
검증 기록
- 2026-04-02
- 무엇/왜/어떻게:
MyPageFragment의 쿠폰 등록 버튼은 기존에isAuth만으로 진입 가능 여부를 판단해서 해외 사용자도 본인인증이 강제됐다. 한국 사용자만 인증이 필요하도록if (it.isAuth || !isKoreanUser)조건으로 최소 수정했다. - 실행 명령/도구:
apply_patch(app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt)read(app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt)lsp_diagnostics(app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt)./gradlew :app:testDebugUnitTest :app:assembleDebug
- 결과:
btnCoupon분기가it.isAuth || !isKoreanUser로 반영되어 비한국 사용자는 미인증 상태에서도CanCouponActivity로 진입하게 됐다.- 한국 사용자이면서 미인증인 경우의 토스트 노출과
showAuthDialog()호출 로직은 그대로 유지됐다. .kt파일 대상lsp_diagnostics는 현재 환경에 Kotlin LSP가 없어 실행 불가(No LSP server configured for extension: .kt)였다.:app:testDebugUnitTest,:app:assembleDebug실행은BUILD SUCCESSFUL로 완료됐다.
- 무엇/왜/어떻게:
- 2026-04-02
- 무엇/왜/어떻게: 추가 요구사항에 따라 쿠폰 버튼 자체 노출은 한국이 아닌 사용자에게만 민감한 콘텐츠 보기 설정을 따르도록 조정했다.
isKoreanUser면 항상 버튼을 보여 주고, 비한국 사용자는SharedPreferenceManager.isAdultContentVisible이true일 때만 버튼을 보이게 하며, 숨겨질 때는return@observe로 클릭 설정도 중단했다. - 실행 명령/도구:
apply_patch(app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt)read(app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt)lsp_diagnostics(app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt)./gradlew :app:testDebugUnitTest :app:assembleDebug
- 결과:
- 비한국 사용자는
SharedPreferenceManager.isAdultContentVisible값에 따라btnCoupon.root.visibility가View.VISIBLE또는View.GONE으로 제어된다. - 한국 사용자는 쿠폰 버튼이 계속 노출되고, 기존 인증 기반 클릭 분기도 유지된다.
.kt파일 대상lsp_diagnostics는 현재 환경에 Kotlin LSP가 없어 실행 불가(No LSP server configured for extension: .kt)였다.:app:testDebugUnitTest,:app:assembleDebug실행은BUILD SUCCESSFUL로 완료됐다.
- 비한국 사용자는
- 무엇/왜/어떻게: 추가 요구사항에 따라 쿠폰 버튼 자체 노출은 한국이 아닌 사용자에게만 민감한 콘텐츠 보기 설정을 따르도록 조정했다.
- 2026-04-02
- 무엇/왜/어떻게: 기능 버튼 영역이 고정 2행 x 4열
include구조여서 비한국 사용자에게서 쿠폰 버튼이 숨겨질 때 중간 빈칸이 남았다.fragment_my.xml을RecyclerView기반 4열 그리드로 바꾸고,MyPageFragment가 기존 버튼 순서를 유지한 채 조건에 맞는 버튼만 리스트에 담아 렌더링하도록 리팩터링했다. - 실행 명령/도구:
apply_patch(app/src/main/res/layout/fragment_my.xml)apply_patch(app/src/main/res/layout/item_function_button.xml)apply_patch(app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt)apply_patch(docs/20260402_쿠폰등록해외사용자본인인증예외.md)read(app/src/main/res/layout/fragment_my.xml)read(app/src/main/res/layout/item_function_button.xml)read(app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt)lsp_diagnostics(app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt)lsp_diagnostics(app/src/main/res/layout/fragment_my.xml)lsp_diagnostics(app/src/main/res/layout/item_function_button.xml)./gradlew :app:testDebugUnitTest :app:assembleDebug
- 결과:
- 쿠폰 버튼과 본인인증 버튼은 더 이상 고정 슬롯의
visibility로 숨기지 않고, 조건에 맞을 때만RecyclerView데이터에 포함된다. - 비한국 사용자이면서
SharedPreferenceManager.isAdultContentVisible == false인 경우 쿠폰 버튼이 목록에서 빠져 나머지 기능 버튼이 좌측부터 자연스럽게 압축 배치된다. - 가로/세로 간격은
GridLayoutManager(4)+GridSpacingItemDecoration(..., 16dp, false)로 기존 4열 레이아웃의 16dp 간격 패턴을 유지한다. - 기존 버튼 제목, 아이콘, 클릭 액션, 한국/비한국 및 인증/민감 콘텐츠 조건은 그대로 유지됐다.
.kt/.xml대상lsp_diagnostics는 현재 환경에 Kotlin/XML LSP가 없어 실행 불가(No LSP server configured for extension: .kt/.xml)였다.:app:testDebugUnitTest,:app:assembleDebug실행은BUILD SUCCESSFUL로 완료됐다.
- 쿠폰 버튼과 본인인증 버튼은 더 이상 고정 슬롯의
- 무엇/왜/어떻게: 기능 버튼 영역이 고정 2행 x 4열
- 2026-04-02
- 무엇/왜/어떻게:
RecyclerView전환 이후MyPageFragment안에 기능 버튼 모델, 어댑터, 버튼 목록 조립이 함께 들어와 관심사가 섞였다. 기존mypage패키지의 어댑터 분리 패턴에 맞춰FunctionButtonItem과FunctionButtonAdapter를 별도 파일로 분리하고, Fragment에는buildFunctionButtonItems()를 통한 버튼 목록 조립과 화면 제어만 남기도록 정리했다. - 실행 명령/도구:
read(app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt)read(app/src/main/java/kr/co/vividnext/sodalive/mypage/recent/RecentContentAdapter.kt)read(app/src/main/java/kr/co/vividnext/sodalive/mypage/profile/tag/MemberTagAdapter.kt)apply_patch(app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt)apply_patch(app/src/main/java/kr/co/vividnext/sodalive/mypage/function_button/FunctionButtonItem.kt)apply_patch(app/src/main/java/kr/co/vividnext/sodalive/mypage/function_button/FunctionButtonAdapter.kt)read(app/src/main/java/kr/co/vividnext/sodalive/mypage/function_button/FunctionButtonItem.kt)read(app/src/main/java/kr/co/vividnext/sodalive/mypage/function_button/FunctionButtonAdapter.kt)read(app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt)lsp_diagnostics(app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt)./gradlew :app:testDebugUnitTest :app:assembleDebug
- 결과:
FunctionButtonItem은app/src/main/java/kr/co/vividnext/sodalive/mypage/function_button/FunctionButtonItem.kt로,FunctionButtonAdapter는.../FunctionButtonAdapter.kt로 분리됐다.MyPageFragment하단의 내부 모델/어댑터 정의는 제거됐고,updateFunctionButtons()는buildFunctionButtonItems()결과를 어댑터에 전달하는 역할만 수행한다.- 버튼 순서, 쿠폰 노출 조건, 한국/비한국 인증 분기, 각 버튼 클릭 동작은 유지됐다.
.kt대상lsp_diagnostics는 현재 환경에 Kotlin LSP가 없어 실행 불가(No LSP server configured for extension: .kt)였다.:app:testDebugUnitTest,:app:assembleDebug실행은BUILD SUCCESSFUL로 완료됐다.
- 무엇/왜/어떻게: