From 6299259f89b75e084f08e5ebf902976ec9e754a8 Mon Sep 17 00:00:00 2001 From: klaus Date: Sat, 27 Jun 2026 02:35:37 +0900 Subject: [PATCH] =?UTF-8?q?feat(main):=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EA=B0=80=EB=93=9C=20=ED=97=AC=ED=8D=BC=EB=A5=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/v2/main/MainV2LoginGuard.kt | 78 +++++++++++++++++++ .../v2/main/MainV2LoginGuardSourceTest.kt | 38 +++++++++ 2 files changed, 116 insertions(+) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuard.kt create mode 100644 app/src/test/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuardSourceTest.kt diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuard.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuard.kt new file mode 100644 index 00000000..76b3e075 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuard.kt @@ -0,0 +1,78 @@ +package kr.co.vividnext.sodalive.v2.main + +import android.content.Intent +import android.view.Gravity +import androidx.fragment.app.Fragment +import com.google.gson.Gson +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.base.SodaDialog +import kr.co.vividnext.sodalive.common.Constants +import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import kr.co.vividnext.sodalive.mypage.MyPageViewModel +import kr.co.vividnext.sodalive.mypage.auth.Auth +import kr.co.vividnext.sodalive.mypage.auth.AuthVerifyRequest +import kr.co.vividnext.sodalive.mypage.auth.BootpayResponse +import kr.co.vividnext.sodalive.settings.ContentSettingsActivity +import kr.co.vividnext.sodalive.splash.SplashActivity +import org.koin.android.ext.android.get + +fun Fragment.ensureMainV2NavigationAllowed( + requiresAdultContentAccess: Boolean = false, + onAllowed: () -> Unit +) { + if (SharedPreferenceManager.token.isBlank()) { + (activity as? MainV2Activity)?.showLoginActivity() + return + } + + if (requiresAdultContentAccess) { + val isKoreanCountry = SharedPreferenceManager.countryCode.ifBlank { "KR" } == "KR" + if (isKoreanCountry && !SharedPreferenceManager.isAuth) { + showMainV2AuthDialog() + return + } + + if (!SharedPreferenceManager.isAdultContentVisible) { + startActivity( + Intent(requireContext(), ContentSettingsActivity::class.java).apply { + putExtra(Constants.EXTRA_SHOW_SENSITIVE_CONTENT_GUIDE, true) + } + ) + return + } + } + + onAllowed() +} + +private fun Fragment.showMainV2AuthDialog() { + SodaDialog( + activity = requireActivity(), + layoutInflater = layoutInflater, + title = getString(R.string.auth_title), + desc = getString(R.string.auth_desc_live), + confirmButtonTitle = getString(R.string.auth_go), + confirmButtonClick = { startMainV2AuthFlow() }, + cancelButtonTitle = getString(R.string.cancel), + cancelButtonClick = {}, + descGravity = Gravity.CENTER + ).show(resources.displayMetrics.widthPixels) +} + +private fun Fragment.startMainV2AuthFlow() { + val myPageViewModel: MyPageViewModel = get() + Auth.auth(requireActivity(), requireContext()) { json -> + val bootpayResponse = Gson().fromJson(json, BootpayResponse::class.java) + val request = AuthVerifyRequest(receiptId = bootpayResponse.data.receiptId) + requireActivity().runOnUiThread { + myPageViewModel.authVerify(request) { + startActivity( + Intent(requireContext(), SplashActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) + } + ) + requireActivity().finish() + } + } + } +} diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuardSourceTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuardSourceTest.kt new file mode 100644 index 00000000..24ab461f --- /dev/null +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuardSourceTest.kt @@ -0,0 +1,38 @@ +package kr.co.vividnext.sodalive.v2.main + +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test +import java.io.File + +class MainV2LoginGuardSourceTest { + + @Test + fun `MainV2 로그인 가드는 v2 Activity 로그인 진입점과 성인 콘텐츠 설정을 사용한다`() { + val source = projectFile("app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuard.kt").readText() + + assertTrue(source.contains("fun Fragment.ensureMainV2NavigationAllowed(")) + assertTrue(source.contains("requiresAdultContentAccess: Boolean = false")) + assertTrue(source.contains("SharedPreferenceManager.token.isBlank()")) + assertTrue(source.contains("(activity as? MainV2Activity)?.showLoginActivity()")) + assertTrue(source.contains("SharedPreferenceManager.countryCode.ifBlank { \"KR\" }")) + assertTrue(source.contains("SharedPreferenceManager.isAuth")) + assertTrue(source.contains("SodaDialog(")) + assertTrue(source.contains("Auth.auth(requireActivity(), requireContext())")) + assertTrue(source.contains("Gson().fromJson(json, BootpayResponse::class.java)")) + assertTrue(source.contains("AuthVerifyRequest(receiptId = bootpayResponse.data.receiptId)")) + assertTrue(source.contains("myPageViewModel.authVerify(request)")) + assertTrue(source.contains("SplashActivity::class.java")) + assertTrue(source.contains("SharedPreferenceManager.isAdultContentVisible")) + assertTrue(source.contains("ContentSettingsActivity::class.java")) + assertTrue(source.contains("putExtra(Constants.EXTRA_SHOW_SENSITIVE_CONTENT_GUIDE, true)")) + assertFalse(source.contains("Auth.auth(requireActivity(), requireContext()) {}")) + assertFalse(source.contains("kr.co.vividnext.sodalive.main.MainActivity")) + } + + private fun projectFile(relativePath: String): File { + val candidates = listOf(File(relativePath), File("../$relativePath")) + return candidates.firstOrNull { it.exists() } + ?: error("Project file not found: $relativePath") + } +}