구글 로그인 환경 점검을 추가한다

구글 로그인 시작 전에 필수 설정과 Google Play 서비스 상태를 확인한다.
사용자가 해결 가능한 오류에서는 시스템 다이얼로그를 표시한다.
인증 예외 로그에 예외 타입을 포함해 원인 추적성을 높인다.
This commit is contained in:
2026-02-10 17:32:04 +09:00
parent 39c09ef8e5
commit 5e43411854

View File

@@ -16,6 +16,8 @@ import androidx.credentials.GetCredentialRequest
import androidx.credentials.exceptions.GetCredentialException import androidx.credentials.exceptions.GetCredentialException
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.media3.common.util.UnstableApi 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.GetGoogleIdOption
import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential
import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential.Companion.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential.Companion.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
@@ -125,6 +127,9 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>(ActivityLoginBinding::i
binding.ivSignUpEmail.setOnClickListener { startSignUp() } binding.ivSignUpEmail.setOnClickListener { startSignUp() }
binding.ivLoginGoogle.setOnClickListener { binding.ivLoginGoogle.setOnClickListener {
if (!isGoogleLoginAvailable()) {
return@setOnClickListener
}
loadingDialog.show(width = screenWidth) loadingDialog.show(width = screenWidth)
val credentialManager = CredentialManager.create(this) val credentialManager = CredentialManager.create(this)
@@ -152,7 +157,10 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>(ActivityLoginBinding::i
handleSignIn(result.credential) handleSignIn(result.credential)
} catch (e: GetCredentialException) { } catch (e: GetCredentialException) {
showToast(getString(R.string.login_google_failed)) 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() loadingDialog.dismiss()
} }
} }
@@ -301,6 +309,27 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>(ActivityLoginBinding::i
startActivity(nextIntent) 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() { private fun navigateToMain() {
finishAffinity() finishAffinity()
val nextIntent = Intent(applicationContext, MainActivity::class.java) val nextIntent = Intent(applicationContext, MainActivity::class.java)