Files
sodalive-android/docs/20260402_쿠폰등록해외사용자본인인증예외.md

11 KiB

쿠폰 등록 버튼 노출 및 해외 사용자 본인인증 예외 수정

작업 목표

  • 마이페이지 btnCoupon 터치 시 한국 사용자는 기존처럼 본인인증이 필요하고, 한국이 아닌 사용자는 본인인증 없이 쿠폰 등록 화면으로 이동하도록 수정한다.
  • 마이페이지 btnCoupon은 한국이 아닌 사용자에 한해 민감한 콘텐츠 보기 설정이 켜져 있을 때만 화면에 보이도록 수정한다.
  • 마이페이지 기능 버튼 영역을 RecyclerView 기반 그리드로 전환해 숨겨진 버튼이 있어도 중간 빈 슬롯 없이 왼쪽부터 자연스럽게 재배치되도록 수정한다.
  • MyPageFragment에 혼합된 기능 버튼 모델/어댑터 책임을 분리해 화면 제어와 렌더링 관심사를 정리한다.

체크리스트

  • AC1: countryCode == "KR" 이고 isAuth == false인 경우 기존처럼 인증 필요 토스트와 showAuthDialog()가 실행된다.
    • QA: 한국 사용자 분기에서 기존 인증 요구 동작 유지 코드 확인
  • AC2: countryCode != "KR" 이고 isAuth == false인 경우에도 CanCouponActivity로 이동한다.
    • QA: 쿠폰 버튼 분기가 isAuth || !isKoreanUser 조건으로 허용되는지 코드 확인
  • AC3: 이미 인증된 사용자는 국가와 무관하게 기존처럼 CanCouponActivity로 이동한다.
    • QA: 인증 완료 사용자의 쿠폰 등록 진입 동작 유지 코드 확인
  • AC4: 변경 파일 진단/검증 명령 결과를 기록한다.
    • QA: lsp_diagnostics, 관련 Gradle 검증 명령 결과 기록
  • AC5: countryCode != "KR" 이고 SharedPreferenceManager.isAdultContentVisible == true인 경우에만 쿠폰 버튼이 기능 버튼 목록에 포함되어 화면에 보인다.
    • QA: 비한국 사용자에서 쿠폰 버튼 아이템이 민감한 콘텐츠 보기 설정값에 따라 리스트에 포함되는지 코드 확인
  • AC6: countryCode != "KR" 이고 SharedPreferenceManager.isAdultContentVisible == false인 경우 쿠폰 버튼이 기능 버튼 목록에서 제외되어 화면에 보이지 않는다.
    • QA: 비한국 사용자에서 쿠폰 버튼 아이템이 리스트에 추가되지 않는지 코드 확인
  • AC7: countryCode == "KR" 인 경우 쿠폰 버튼 노출과 기존 한국/비한국 클릭 분기는 유지된다.
    • QA: 한국 사용자에서는 버튼이 계속 보이고, 클릭 시 기존 인증 분기가 유지되는지 코드 확인
  • AC8: 기능 버튼 영역이 RecyclerView 기반으로 렌더링되고, 숨겨진 버튼은 데이터 목록에서 제외되어 남은 버튼이 좌→우/상→하로 자연스럽게 압축 배치된다.
    • QA: fragment_my.xmlRecyclerView를 사용하고, MyPageFragment가 쿠폰/본인인증 버튼을 조건에 따라 아이템 리스트에 포함/제외하는지 코드 확인
  • AC9: 쿠폰 버튼이 숨겨지는 비한국 사용자(isAdultContentVisible == false)에서도 기능 버튼 간 가로/세로 간격이 기존 4열 그리드와 동일하게 유지된다.
    • QA: GridLayoutManager(4)GridSpacingItemDecoration(..., 16dp, false) 적용으로 기존 16dp 간격 패턴을 유지하는지 코드 확인
  • AC10: FunctionButtonItemFunctionButtonAdapterMyPageFragment 밖 별도 파일로 분리되어 Fragment가 화면 상태/버튼 목록 조립에 집중한다.
    • QA: 모델/어댑터 클래스가 별도 파일로 이동하고 MyPageFragment 하단 정의가 제거됐는지 코드 확인
  • AC11: 기능 버튼 조립 로직은 buildFunctionButtonItems()로 분리되며, 기존 버튼 순서/조건/클릭 동작은 유지된다.
    • QA: MyPageFragmentupdateFunctionButtons()에서 조립 함수 결과만 어댑터에 전달하는지, 버튼 분기 로직이 동일한지 코드 확인

검증 기록

  • 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.isAdultContentVisibletrue일 때만 버튼을 보이게 하며, 숨겨질 때는 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.visibilityView.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.xmlRecyclerView 기반 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로 완료됐다.
  • 2026-04-02
    • 무엇/왜/어떻게: RecyclerView 전환 이후 MyPageFragment 안에 기능 버튼 모델, 어댑터, 버튼 목록 조립이 함께 들어와 관심사가 섞였다. 기존 mypage 패키지의 어댑터 분리 패턴에 맞춰 FunctionButtonItemFunctionButtonAdapter를 별도 파일로 분리하고, 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
    • 결과:
      • FunctionButtonItemapp/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로 완료됐다.