feat(main): 로그인 가드 헬퍼를 추가한다

This commit is contained in:
2026-06-27 02:35:37 +09:00
parent 12ea65f14f
commit 6299259f89
2 changed files with 116 additions and 0 deletions

View File

@@ -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()
}
}
}
}

View File

@@ -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")
}
}