Skip to content

Commit

Permalink
KKUMI-111 [FIX] #91 - 카카오톡 설치는 되어있는데, 로그인이 안 되어있는 경우 카카오 계정 로그인으로 이동
Browse files Browse the repository at this point in the history
  • Loading branch information
jung0115 committed Sep 21, 2024
1 parent f9764b3 commit 1b3a762
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 3 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ android {
minSdk min_sdk_version
targetSdk target_sdk_version

versionCode 14
versionCode 15
versionName "1.1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ import kotlinx.coroutines.launch
class LoginComposeActivity : ComponentActivity() {

private val viewModel: LoginViewModel by viewModels()
private val activityContext = this

@ExperimentalPermissionsApi
override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -84,6 +85,13 @@ class LoginComposeActivity : ComponentActivity() {
}
)

// 카카오 계정으로 로그인 handling 필요
viewModel.needKakaoAccount.observe(this, Observer {
if(it) {
handleKakaoAccount()
}
})

enableEdgeToEdge()
setContent {
MyApp {
Expand Down Expand Up @@ -245,7 +253,6 @@ class LoginComposeActivity : ComponentActivity() {

// 카카오 로그인
private fun handleKakaoLogin() {
val activityContext = this
viewModel.kakaoLogin()

lifecycleScope.launch {
Expand All @@ -271,6 +278,29 @@ class LoginComposeActivity : ComponentActivity() {
}
}

// 카카오 계정으로 로그인
private fun handleKakaoAccount() {
viewModel.kakaoLogin()

lifecycleScope.launch {
try {
viewModel.doneKakaoAccount()

// 카카오톡에 연결된 카카오계정이 없는 경우, 카카오계정으로 로그인 시도
UserApiClient.instance.loginWithKakaoAccount(activityContext, callback = viewModel.kakaoCallback)
Log.d(TAG, "카카오 계정으로 로그인")
} catch (error: Throwable) {
// 사용자가 카카오톡 설치 후 디바이스 권한 요청 화면에서 로그인을 취소한 경우,
// 의도적인 로그인 취소로 보고 카카오계정으로 로그인 시도 없이 로그인 취소로 처리 (예: 뒤로 가기)
if (error is ClientError && error.reason == ClientErrorCause.Cancelled) {
Log.d(TAG, "사용자의 의도적인 로그인 취소")
} else {
Log.e(TAG, "인증 에러 발생", error)
}
}
}
}

private fun showToast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class LoginViewModel @Inject constructor(

private val INVALID_TOKEN = "INVALID_TOKEN"
private val MAX_RETRIES = 1
private val KAKAO_INSTALL_BUT_NOT_ACCOUNT = "KakaoTalk is installed but not connected to Kakao account."

private val _finishLoginUiState = MutableLiveData<Unit>()
val finishLoginUiState: LiveData<Unit> get() = _finishLoginUiState
Expand All @@ -40,6 +41,10 @@ class LoginViewModel @Inject constructor(
private val _userInfoUiState = MutableStateFlow<UserInfoVO>(UserInfoVO(null, null, null, null))
val userInfoUiState: StateFlow<UserInfoVO> get() = _userInfoUiState

private val _needKakaoAccount = MutableLiveData<Boolean>(false)
val needKakaoAccount: LiveData<Boolean> get() = _needKakaoAccount


fun kakaoLogin() {
_loginUiState.value = LoginUiState.KakaoLogin
}
Expand Down Expand Up @@ -101,8 +106,13 @@ class LoginViewModel @Inject constructor(
showToast("요청 권한이 없는 앱입니다.") // 앱이 요청 권한이 없음
}

error.message == KAKAO_INSTALL_BUT_NOT_ACCOUNT -> {
// 카카오톡 앱이 설치되어 있지만, 로그인은 안 되어있는 경우
_needKakaoAccount.setValue(true)
}

else -> { // Unknown
showToast("서비스 에러가 발생했습니다.") // 기타 에러
showToast("서비스 에러가 발생했습니다") // 기타 에러
}
}
Log.e(TAG, "카카오계정으로 로그인 실패", error)
Expand All @@ -115,6 +125,10 @@ class LoginViewModel @Inject constructor(
}
}

fun doneKakaoAccount() {
_needKakaoAccount.setValue(false)
}

// 카카오 로그인 token 값
fun setKakaoToken(
accessToken: String,
Expand Down

0 comments on commit 1b3a762

Please sign in to comment.