Compare commits
2 Commits
0fcd929c6f
...
25d549b06f
| Author | SHA1 | Date | |
|---|---|---|---|
| 25d549b06f | |||
| 0c0801561e |
@@ -27,6 +27,7 @@ import kr.co.vividnext.sodalive.R
|
||||
import kr.co.vividnext.sodalive.audio_content.PurchaseOption
|
||||
import kr.co.vividnext.sodalive.audio_content.upload.theme.AudioContentThemeFragment
|
||||
import kr.co.vividnext.sodalive.base.BaseActivity
|
||||
import kr.co.vividnext.sodalive.common.AdultContentVisibilityPolicy
|
||||
import kr.co.vividnext.sodalive.common.ImagePickerCropper
|
||||
import kr.co.vividnext.sodalive.common.LoadingDialog
|
||||
import kr.co.vividnext.sodalive.common.RealPathUtil
|
||||
@@ -206,7 +207,7 @@ class AudioContentUploadActivity : BaseActivity<ActivityAudioContentUploadBindin
|
||||
)
|
||||
}
|
||||
|
||||
if (SharedPreferenceManager.isAuth) {
|
||||
if (shouldShowAdultRestrictionSetting()) {
|
||||
binding.llSetAdult.visibility = View.VISIBLE
|
||||
} else {
|
||||
binding.llSetAdult.visibility = View.GONE
|
||||
@@ -540,7 +541,7 @@ class AudioContentUploadActivity : BaseActivity<ActivityAudioContentUploadBindin
|
||||
}
|
||||
}
|
||||
|
||||
if (SharedPreferenceManager.isAuth) {
|
||||
if (shouldShowAdultRestrictionSetting()) {
|
||||
binding.llAgeAll.setOnClickListener {
|
||||
viewModel.setAdult(false)
|
||||
}
|
||||
@@ -955,4 +956,12 @@ class AudioContentUploadActivity : BaseActivity<ActivityAudioContentUploadBindin
|
||||
|
||||
return fileName
|
||||
}
|
||||
|
||||
private fun shouldShowAdultRestrictionSetting(): Boolean {
|
||||
return AdultContentVisibilityPolicy.shouldShowAdultRestrictionSetting(
|
||||
countryCode = SharedPreferenceManager.countryCode,
|
||||
isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
|
||||
isAuth = SharedPreferenceManager.isAuth
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package kr.co.vividnext.sodalive.common
|
||||
|
||||
object AdultContentVisibilityPolicy {
|
||||
private const val COUNTRY_CODE_KR = "KR"
|
||||
|
||||
fun shouldShowAdultRestrictionSetting(
|
||||
countryCode: String,
|
||||
isAdultContentVisible: Boolean,
|
||||
isAuth: Boolean
|
||||
): Boolean {
|
||||
if (!isAdultContentVisible) {
|
||||
return false
|
||||
}
|
||||
|
||||
val isKoreanCountry = countryCode.ifBlank { COUNTRY_CODE_KR } == COUNTRY_CODE_KR
|
||||
return !isKoreanCountry || isAuth
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||
import kr.co.vividnext.sodalive.R
|
||||
import kr.co.vividnext.sodalive.base.BaseActivity
|
||||
import kr.co.vividnext.sodalive.common.AdultContentVisibilityPolicy
|
||||
import kr.co.vividnext.sodalive.common.Constants
|
||||
import kr.co.vividnext.sodalive.common.ImagePickerCropper
|
||||
import kr.co.vividnext.sodalive.common.LoadingDialog
|
||||
@@ -286,7 +287,7 @@ class LiveRoomCreateActivity : BaseActivity<ActivityLiveRoomCreateBinding>(
|
||||
)
|
||||
}
|
||||
|
||||
if (SharedPreferenceManager.isAuth) {
|
||||
if (shouldShowAdultRestrictionSetting()) {
|
||||
binding.llSetAdult.visibility = View.VISIBLE
|
||||
} else {
|
||||
binding.llSetAdult.visibility = View.GONE
|
||||
@@ -581,10 +582,7 @@ class LiveRoomCreateActivity : BaseActivity<ActivityLiveRoomCreateBinding>(
|
||||
}
|
||||
}
|
||||
|
||||
if (SharedPreferenceManager.role == MemberRole.CREATOR.name ||
|
||||
SharedPreferenceManager.isAuth
|
||||
) {
|
||||
|
||||
if (shouldShowAdultRestrictionSetting()) {
|
||||
binding.llAgeAll.setOnClickListener {
|
||||
viewModel.setAdult(false)
|
||||
}
|
||||
@@ -920,4 +918,12 @@ class LiveRoomCreateActivity : BaseActivity<ActivityLiveRoomCreateBinding>(
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private fun shouldShowAdultRestrictionSetting(): Boolean {
|
||||
return AdultContentVisibilityPolicy.shouldShowAdultRestrictionSetting(
|
||||
countryCode = SharedPreferenceManager.countryCode,
|
||||
isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
|
||||
isAuth = SharedPreferenceManager.isAuth
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
package kr.co.vividnext.sodalive.common
|
||||
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
|
||||
class AdultContentVisibilityPolicyTest {
|
||||
|
||||
@Test
|
||||
fun `isAdultContentVisible가 false면 항상 미표시`() {
|
||||
assertFalse(
|
||||
AdultContentVisibilityPolicy.shouldShowAdultRestrictionSetting(
|
||||
countryCode = "KR",
|
||||
isAdultContentVisible = false,
|
||||
isAuth = true
|
||||
)
|
||||
)
|
||||
|
||||
assertFalse(
|
||||
AdultContentVisibilityPolicy.shouldShowAdultRestrictionSetting(
|
||||
countryCode = "US",
|
||||
isAdultContentVisible = false,
|
||||
isAuth = false
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `한국 접속은 isAuth가 true일 때만 표시`() {
|
||||
assertTrue(
|
||||
AdultContentVisibilityPolicy.shouldShowAdultRestrictionSetting(
|
||||
countryCode = "KR",
|
||||
isAdultContentVisible = true,
|
||||
isAuth = true
|
||||
)
|
||||
)
|
||||
|
||||
assertFalse(
|
||||
AdultContentVisibilityPolicy.shouldShowAdultRestrictionSetting(
|
||||
countryCode = "KR",
|
||||
isAdultContentVisible = true,
|
||||
isAuth = false
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `비한국 접속은 isAdultContentVisible true면 표시`() {
|
||||
assertTrue(
|
||||
AdultContentVisibilityPolicy.shouldShowAdultRestrictionSetting(
|
||||
countryCode = "US",
|
||||
isAdultContentVisible = true,
|
||||
isAuth = false
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `countryCode가 비어있으면 한국으로 간주한다`() {
|
||||
assertFalse(
|
||||
AdultContentVisibilityPolicy.shouldShowAdultRestrictionSetting(
|
||||
countryCode = "",
|
||||
isAdultContentVisible = true,
|
||||
isAuth = false
|
||||
)
|
||||
)
|
||||
|
||||
assertTrue(
|
||||
AdultContentVisibilityPolicy.shouldShowAdultRestrictionSetting(
|
||||
countryCode = "",
|
||||
isAdultContentVisible = true,
|
||||
isAuth = true
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
35
docs/20260327_연령제한표시조건수정.md
Normal file
35
docs/20260327_연령제한표시조건수정.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# 연령제한 설정 UI 표시 조건 수정
|
||||
|
||||
## 작업 목표
|
||||
- 라이브 생성, 콘텐츠 업로드 페이지의 연령제한 설정 UI 표시 조건을 접속국가와 `isAdultContentVisible` 기준으로 조정한다.
|
||||
|
||||
## 체크리스트
|
||||
- [x] AC1: 공통 필수조건으로 `isAdultContentVisible == true`일 때만 연령제한 설정 UI를 표시한다.
|
||||
- QA: `isAdultContentVisible=false`에서 UI 미표시, `isAdultContentVisible=true`에서 국가별 추가 조건 적용 확인
|
||||
- [x] AC2: 접속국가가 한국(`countryCode == "KR"`)인 경우 `isAuth == true`일 때만 연령제한 설정 UI를 표시한다.
|
||||
- QA: KR + `isAuth=false` 미표시, KR + `isAuth=true` 표시
|
||||
- [x] AC3: 접속국가가 한국이 아닌 경우 `isAuth`와 무관하게 AC1만 충족하면 UI를 표시한다.
|
||||
- QA: non-KR + `isAdultContentVisible=true`에서 `isAuth` true/false 모두 표시
|
||||
- [x] AC4: 라이브 생성/콘텐츠 업로드 양쪽 페이지에 동일 규칙이 적용된다.
|
||||
- QA: 두 화면에서 동일 입력 조건 대비 동일 표시 결과 확인
|
||||
- [x] AC5: 변경 파일 진단/테스트/빌드 검증을 통과한다.
|
||||
- QA: Kotlin LSP 미지원 환경 확인, `./gradlew :app:testDebugUnitTest`, `./gradlew :app:assembleDebug`
|
||||
|
||||
## 검증 기록
|
||||
- 무엇/왜/어떻게: 라이브 생성(`LiveRoomCreateActivity`)과 콘텐츠 업로드(`AudioContentUploadActivity`)의 연령제한 UI 노출 조건을 공통 정책(`AdultContentVisibilityPolicy`)으로 통합했다. 요청 조건(필수 `isAdultContentVisible=true`, KR 추가 `isAuth=true`)을 두 화면에서 동일하게 적용하기 위해 기존 `isAuth` 단일 조건을 정책 함수 호출로 교체했다.
|
||||
- 실행 명령: 코드 수정(해당 3개 Kotlin 파일 + 정책 테스트 1개 파일 추가)
|
||||
- 결과: 두 화면 모두 `shouldShowAdultRestrictionSetting()` 기반으로 `llSetAdult` 표시 및 연령선택 핸들러 등록 조건이 동작하도록 반영됨
|
||||
|
||||
- 무엇/왜/어떻게: 정책 로직의 조건 분기 오동작을 방지하기 위해 단위 테스트(`AdultContentVisibilityPolicyTest`)로 KR/non-KR, `isAdultContentVisible`, `isAuth`, 빈 `countryCode` 조합을 검증했다.
|
||||
- 실행 명령: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.common.AdultContentVisibilityPolicyTest"`
|
||||
- 결과: BUILD SUCCESSFUL
|
||||
|
||||
- 무엇/왜/어떻게: 변경 영향 범위의 회귀 확인을 위해 디버그 단위 테스트 전체와 디버그 빌드를 수행했다.
|
||||
- 실행 명령: `./gradlew :app:testDebugUnitTest`
|
||||
- 결과: BUILD SUCCESSFUL
|
||||
- 실행 명령: `./gradlew :app:assembleDebug`
|
||||
- 결과: BUILD SUCCESSFUL
|
||||
|
||||
- 무엇/왜/어떻게: 정적 진단 요구사항 확인을 위해 LSP diagnostics를 시도했으나 현재 실행 환경에는 `.kt`용 LSP 서버가 구성되어 있지 않음을 확인했다. 대신 Gradle 컴파일/테스트/빌드 성공으로 Kotlin 컴파일 오류 유무를 검증했다.
|
||||
- 실행 명령: `lsp_diagnostics` (4개 Kotlin 파일)
|
||||
- 결과: `No LSP server configured for extension: .kt`
|
||||
Reference in New Issue
Block a user