카카오 로그인 추가
This commit is contained in:
@@ -198,6 +198,20 @@
|
||||
android:name="com.google.android.gms.oss.licenses.OssLicensesActivity"
|
||||
android:theme="@style/Theme.AppCompat.DayNight" />
|
||||
|
||||
<activity
|
||||
android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
|
||||
<!-- Redirect URI: "kakao${NATIVE_APP_KEY}://oauth" -->
|
||||
<data android:host="oauth"
|
||||
android:scheme="kakao${KAKAO_APP_KEY}" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<service
|
||||
android:name=".common.SodaLiveService"
|
||||
android:foregroundServiceType="microphone|mediaPlayback"
|
||||
|
||||
@@ -8,6 +8,7 @@ import androidx.appcompat.app.AppCompatDelegate
|
||||
import com.appsflyer.AppsFlyerLib
|
||||
import com.appsflyer.deeplink.DeepLinkResult
|
||||
import com.facebook.FacebookSdk
|
||||
import com.kakao.sdk.common.KakaoSdk
|
||||
import com.orhanobut.logger.AndroidLogAdapter
|
||||
import com.orhanobut.logger.Logger
|
||||
import kr.co.vividnext.sodalive.BuildConfig
|
||||
@@ -37,6 +38,8 @@ class SodaLiveApp : Application() {
|
||||
|
||||
FacebookSdk.fullyInitialize()
|
||||
|
||||
KakaoSdk.init(applicationContext, BuildConfig.KAKAO_APP_KEY)
|
||||
|
||||
setupAppsFlyer()
|
||||
|
||||
setupNotifly()
|
||||
|
||||
@@ -169,4 +169,11 @@ interface UserApi {
|
||||
@Body request: SocialLoginRequest,
|
||||
@Header("Authorization") authHeader: String
|
||||
): Single<ApiResponse<LoginResponse>>
|
||||
|
||||
@POST("/member/login/kakao")
|
||||
fun loginKakao(
|
||||
@Body request: SocialLoginRequest,
|
||||
@Header("Authorization") authHeader: String
|
||||
): Single<ApiResponse<LoginResponse>>
|
||||
|
||||
}
|
||||
|
||||
@@ -133,4 +133,12 @@ class UserRepository(private val userApi: UserApi) {
|
||||
request = request,
|
||||
authHeader = token
|
||||
)
|
||||
|
||||
fun kakaoLogin(
|
||||
request: SocialLoginRequest,
|
||||
token: String
|
||||
) = userApi.loginKakao(
|
||||
request = request,
|
||||
authHeader = token
|
||||
)
|
||||
}
|
||||
|
||||
@@ -25,6 +25,10 @@ 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
|
||||
import com.jakewharton.rxbinding4.widget.textChanges
|
||||
import com.kakao.sdk.auth.model.OAuthToken
|
||||
import com.kakao.sdk.common.model.ClientError
|
||||
import com.kakao.sdk.common.model.ClientErrorCause
|
||||
import com.kakao.sdk.user.UserApiClient
|
||||
import com.orhanobut.logger.Logger
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||
@@ -147,6 +151,8 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>(ActivityLoginBinding::i
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
binding.ivLoginKakao.setOnClickListener { loginKakao() }
|
||||
}
|
||||
|
||||
private fun handleSignIn(credential: Credential) {
|
||||
@@ -255,4 +261,59 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>(ActivityLoginBinding::i
|
||||
)
|
||||
}, 100)
|
||||
}
|
||||
|
||||
private val kakaoLoginCallback: (OAuthToken?, Throwable?) -> Unit = { token, error ->
|
||||
loadingDialog.dismiss()
|
||||
if (error != null) {
|
||||
showToast("카카오 계정으로 로그인 하지 못했습니다. 다시 시도해 주세요")
|
||||
} else if (token != null) {
|
||||
handleKakaoLogin(token)
|
||||
}
|
||||
}
|
||||
|
||||
private fun loginKakao() {
|
||||
loadingDialog.show(screenWidth)
|
||||
if (UserApiClient.instance.isKakaoTalkLoginAvailable(this@LoginActivity)) {
|
||||
UserApiClient.instance.loginWithKakaoTalk(this@LoginActivity) { token, error ->
|
||||
if (error != null) {
|
||||
Logger.e("error: ${error.message}, ${error.cause}")
|
||||
if (error is ClientError && error.reason == ClientErrorCause.Cancelled) {
|
||||
loadingDialog.dismiss()
|
||||
return@loginWithKakaoTalk
|
||||
} else {
|
||||
UserApiClient.instance.loginWithKakaoAccount(
|
||||
this@LoginActivity,
|
||||
callback = kakaoLoginCallback
|
||||
)
|
||||
}
|
||||
} else if (token != null) {
|
||||
handleKakaoLogin(token)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
UserApiClient.instance.loginWithKakaoAccount(
|
||||
this@LoginActivity,
|
||||
callback = kakaoLoginCallback
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleKakaoLogin(token: OAuthToken) {
|
||||
viewModel.kakaoLogin(accessToken = token.accessToken) {
|
||||
finishAffinity()
|
||||
val nextIntent = Intent(applicationContext, MainActivity::class.java)
|
||||
val extras = intent.getBundleExtra(Constants.EXTRA_DATA)
|
||||
?: if (intent.extras != null) {
|
||||
intent.extras
|
||||
} else {
|
||||
null
|
||||
}
|
||||
if (extras != null) {
|
||||
nextIntent.putExtra(Constants.EXTRA_DATA, extras)
|
||||
}
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
|
||||
startActivity(nextIntent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,45 @@ class LoginViewModel(private val repository: UserRepository) : BaseViewModel() {
|
||||
val isLoading: LiveData<Boolean>
|
||||
get() = _isLoading
|
||||
|
||||
fun kakaoLogin(accessToken: String, onSuccess: () -> Unit) {
|
||||
_isLoading.value = true
|
||||
|
||||
compositeDisposable.add(
|
||||
repository.kakaoLogin(
|
||||
request = SocialLoginRequest(marketingPid = SharedPreferenceManager.marketingPid),
|
||||
token = "Bearer $accessToken"
|
||||
)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(
|
||||
{
|
||||
_isLoading.value = false
|
||||
if (it.success && it.data != null) {
|
||||
SharedPreferenceManager.token = it.data.token
|
||||
SharedPreferenceManager.email = it.data.email
|
||||
SharedPreferenceManager.userId = it.data.userId
|
||||
SharedPreferenceManager.nickname = it.data.nickname
|
||||
SharedPreferenceManager.profileImage = it.data.profileImage
|
||||
onSuccess()
|
||||
} else {
|
||||
if (it.message != null) {
|
||||
_toastLiveData.postValue(it.message)
|
||||
} else {
|
||||
_toastLiveData.postValue(
|
||||
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
|
||||
)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
_isLoading.value = false
|
||||
it.message?.let { message -> Logger.e(message) }
|
||||
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
fun googleLogin(idToken: String, onSuccess: () -> Unit) {
|
||||
_isLoading.value = true
|
||||
|
||||
|
||||
@@ -103,6 +103,14 @@
|
||||
android:layout_marginTop="20dp"
|
||||
android:gravity="center">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_login_kakao"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="13.3dp"
|
||||
android:contentDescription="@null"
|
||||
android:src="@drawable/ic_login_kakao" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_login_google"
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
Reference in New Issue
Block a user