From 5e434118547f3e936be38df3260652cc2348557d Mon Sep 17 00:00:00 2001 From: klaus Date: Tue, 10 Feb 2026 17:32:04 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B5=AC=EA=B8=80=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=ED=99=98=EA=B2=BD=20=EC=A0=90=EA=B2=80=EC=9D=84=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 구글 로그인 시작 전에 필수 설정과 Google Play 서비스 상태를 확인한다. 사용자가 해결 가능한 오류에서는 시스템 다이얼로그를 표시한다. 인증 예외 로그에 예외 타입을 포함해 원인 추적성을 높인다. --- .../sodalive/user/login/LoginActivity.kt | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/user/login/LoginActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/user/login/LoginActivity.kt index 86db4ca2..c11fba8f 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/user/login/LoginActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/user/login/LoginActivity.kt @@ -16,6 +16,8 @@ import androidx.credentials.GetCredentialRequest import androidx.credentials.exceptions.GetCredentialException import androidx.lifecycle.lifecycleScope import androidx.media3.common.util.UnstableApi +import com.google.android.gms.common.ConnectionResult +import com.google.android.gms.common.GoogleApiAvailability import com.google.android.libraries.identity.googleid.GetGoogleIdOption import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential.Companion.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL @@ -125,6 +127,9 @@ class LoginActivity : BaseActivity(ActivityLoginBinding::i binding.ivSignUpEmail.setOnClickListener { startSignUp() } binding.ivLoginGoogle.setOnClickListener { + if (!isGoogleLoginAvailable()) { + return@setOnClickListener + } loadingDialog.show(width = screenWidth) val credentialManager = CredentialManager.create(this) @@ -152,7 +157,10 @@ class LoginActivity : BaseActivity(ActivityLoginBinding::i handleSignIn(result.credential) } catch (e: GetCredentialException) { showToast(getString(R.string.login_google_failed)) - Logger.e("Couldn't retrieve user's credentials: ${e.localizedMessage}") + Logger.e( + "Couldn't retrieve user's credentials: " + + "${e.javaClass.simpleName}, ${e.localizedMessage}" + ) loadingDialog.dismiss() } } @@ -301,6 +309,27 @@ class LoginActivity : BaseActivity(ActivityLoginBinding::i startActivity(nextIntent) } + private fun isGoogleLoginAvailable(): Boolean { + if (BuildConfig.GOOGLE_CLIENT_ID.isBlank()) { + Logger.e("Google login blocked: GOOGLE_CLIENT_ID is blank.") + showToast(getString(R.string.login_google_failed)) + return false + } + + val status = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) + if (status == ConnectionResult.SUCCESS) { + return true + } + + Logger.e("Google login blocked: Google Play services unavailable. status=$status") + if (GoogleApiAvailability.getInstance().isUserResolvableError(status)) { + GoogleApiAvailability.getInstance() + .getErrorDialog(this, status, 1001)?.show() + } + showToast(getString(R.string.login_google_failed)) + return false + } + private fun navigateToMain() { finishAffinity() val nextIntent = Intent(applicationContext, MainActivity::class.java)