Skip to content

Commit

Permalink
refact: Google Login, Social Login 로직을 util로 분리
Browse files Browse the repository at this point in the history
  • Loading branch information
comst19 committed Jan 15, 2024
1 parent c67f1e6 commit 75ab2b0
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 68 deletions.
Original file line number Diff line number Diff line change
@@ -1,20 +1,46 @@
package com.droidblossom.archive

import android.app.Application
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.util.Base64
import android.util.Log
import com.droidblossom.archive.util.AppSignatureHelper
import com.kakao.sdk.common.KakaoSdk
import dagger.hilt.android.HiltAndroidApp
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException


@HiltAndroidApp
class ARchiveApplication : Application() {
override fun onCreate() {
super.onCreate()
// 키 값 알아내기
// AppSignatureHelper(this@ARchiveApplication).apply {
// Log.d("hash", "hash : ${appSignature}")
// Log.d("key1", "hash : ${appSignature}")
// }
// getHashKey()
// Kakao Sdk 초기화
KakaoSdk.init(this, BuildConfig.KAKAO_NATIVE_APP_KEY)
}
private fun getHashKey() {
//
var packageInfo: PackageInfo? = null
try {
packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
} catch (e: PackageManager.NameNotFoundException) {
e.printStackTrace()
}
if (packageInfo == null) Log.e("KeyHash", "KeyHash:null")
for (signature in packageInfo!!.signatures) {
try {
val md = MessageDigest.getInstance("SHA")
md.update(signature.toByteArray())
Log.d("key2", Base64.encodeToString(md.digest(), Base64.DEFAULT))
} catch (e: NoSuchAlgorithmException) {
Log.e("key3", "Unable to get MessageDigest. signature=$signature", e)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.droidblossom.archive.presentation.ui.auth

import android.app.Activity
import android.os.Bundle
import android.util.Log
import android.view.View
Expand All @@ -15,6 +16,7 @@ import com.droidblossom.archive.R
import com.droidblossom.archive.databinding.FragmentSignInBinding
import com.droidblossom.archive.presentation.base.BaseFragment
import com.droidblossom.archive.presentation.ui.MainActivity
import com.droidblossom.di.SocialLoginUtil
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import com.google.android.gms.auth.api.signin.GoogleSignInClient
Expand All @@ -39,45 +41,37 @@ class SignInFragment : BaseFragment<AuthViewModelImpl,FragmentSignInBinding>(R.l

override val viewModel : AuthViewModelImpl by activityViewModels()

private val mCallback: (OAuthToken?, Throwable?) -> Unit = { token, error ->
if (error != null) {
Log.e("카카오", "로그인 실패 $error")
} else if (token != null) {
Log.e("카카오2", "로그인 성공 ${token.accessToken}")
}
}
private lateinit var socialLoginUtil: SocialLoginUtil

private var googleLoginLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == -1) {
val data = result.data
val task = GoogleSignIn.getSignedInAccountFromIntent(data)
googleSignInSuccess(task)
if (result.resultCode == Activity.RESULT_OK) {
val task = GoogleSignIn.getSignedInAccountFromIntent(result.data)
socialLoginUtil.handleGoogleSignInResult(task)
}
}

private val googleSignInClient: GoogleSignInClient by lazy {
GoogleSignIn.getClient(requireContext(), googleSignInOptions)
}

private val googleSignInOptions: GoogleSignInOptions by lazy {
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build()
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

navController = Navigation.findNavController(view)

socialLoginUtil = SocialLoginUtil(requireContext(), object : SocialLoginUtil.LoginCallback {
override fun onLoginSuccess(social: AuthViewModel.Social) {
viewModel.SignInSuccess(social)
}

override fun onLoginFailure(error: Throwable) {
// 에러 처리 로직
}
})

binding.kakaoLoginBtn.setOnClickListener {
//viewModel.signInToSignUp()
kakaoSignIn()
socialLoginUtil.kakaoSignIn()
}

binding.googleLoginBtn.setOnClickListener {
//viewModel.signInToSignUp()
googleSignIn()
val signInIntent = socialLoginUtil.googleSignIn()
googleLoginLauncher.launch(signInIntent)
}
}

Expand Down Expand Up @@ -114,46 +108,4 @@ class SignInFragment : BaseFragment<AuthViewModelImpl,FragmentSignInBinding>(R.l
}
}

private fun kakaoSignIn(){
if (UserApiClient.instance.isKakaoTalkLoginAvailable(requireContext())) {
UserApiClient.instance.loginWithKakaoTalk(requireContext()) { token, error ->
// 로그인 실패 부분
if (error != null) {
Log.e("카카오", "로그인 실패 $error")
// 사용자가 취소
if (error is ClientError && error.reason == ClientErrorCause.Cancelled ) {
return@loginWithKakaoTalk
}
// 다른 오류
else {
UserApiClient.instance.loginWithKakaoAccount(requireContext(), callback = mCallback) // 카카오 이메일 로그인
}
}
// 로그인 성공 부분
else if (token != null) {
viewModel.SignInSuccess(AuthViewModel.Social.KAKAO)
Log.e("카카오1", "로그인 성공 ${token.accessToken}")
}
}
} else {
UserApiClient.instance.loginWithKakaoAccount(requireContext(), callback = mCallback) // 카카오 이메일 로그인
}
}

private fun googleSignIn() {
val signInIntent = googleSignInClient.signInIntent
googleLoginLauncher.launch(signInIntent)
}
private fun googleSignInSuccess(completedTask: Task<GoogleSignInAccount>) {
viewModel.SignInSuccess(AuthViewModel.Social.GOOGLE)
// 회원이 아닐 때의 로직이 추가되어야함

try {
val account = completedTask.getResult(ApiException::class.java)
}
catch (e: ApiException) {
Log.w("구글", "signInResult:failed code=" + e.statusCode)
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.google.android.gms.common.api.Status
class AuthOtpReceiver : BroadcastReceiver() {

companion object {
// 패턴 수정 후 숨기기
private const val PATTERN = "^<#>.*\\[Sample\\].+\\[(\\d{6})\\].+\$"
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.droidblossom.di

import android.content.Context
import android.content.Intent
import android.util.Log
import com.droidblossom.archive.presentation.ui.auth.AuthViewModel
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.android.gms.common.api.ApiException
import com.google.android.gms.tasks.Task
import com.kakao.sdk.user.UserApiClient

class SocialLoginUtil(private val context: Context, private val callback: LoginCallback) {

interface LoginCallback {
fun onLoginSuccess(social: AuthViewModel.Social)
fun onLoginFailure(error: Throwable)
}

private val googleSignInClient: GoogleSignInClient by lazy {
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build()
GoogleSignIn.getClient(context, gso)
}

fun kakaoSignIn() {
if (UserApiClient.instance.isKakaoTalkLoginAvailable(context)) {
UserApiClient.instance.loginWithKakaoTalk(context) { token, error ->
if (error != null) {
Log.e("카카오", "로그인 실패 $error")
callback.onLoginFailure(error)
} else if (token != null) {
//Log.e("카카오", "로그인 성공 ${token.accessToken}")
callback.onLoginSuccess(AuthViewModel.Social.KAKAO)
}
}
} else {
UserApiClient.instance.loginWithKakaoAccount(context) { token, error ->
if (error != null) {
Log.e("카카오", "로그인 실패 $error")
callback.onLoginFailure(error)
} else if (token != null) {
//Log.e("카카오", "로그인 성공 ${token.accessToken}")
callback.onLoginSuccess(AuthViewModel.Social.KAKAO)
}
}
}
}

fun googleSignIn(): Intent {
return googleSignInClient.signInIntent
}

fun handleGoogleSignInResult(completedTask: Task<GoogleSignInAccount>) {
try {
val account = completedTask.getResult(ApiException::class.java)
//Log.d("구글", "로그인 성공: ${account.idToken}")
callback.onLoginSuccess(AuthViewModel.Social.GOOGLE)
} catch (e: ApiException) {
//Log.w("구글", "signInResult:failed code=" + e.statusCode)
callback.onLoginFailure(e)
}
}
}

0 comments on commit 75ab2b0

Please sign in to comment.