diff --git a/app/src/main/java/kr/co/vividnext/sodalive/network/TokenAuthenticator.kt b/app/src/main/java/kr/co/vividnext/sodalive/network/TokenAuthenticator.kt index f7a1de3..5cce62b 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/network/TokenAuthenticator.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/network/TokenAuthenticator.kt @@ -1,7 +1,10 @@ package kr.co.vividnext.sodalive.network import android.content.Context +import android.content.Intent +import kr.co.vividnext.sodalive.audio_content.AudioContentPlayService import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import kr.co.vividnext.sodalive.user.login.LoginActivity import okhttp3.Authenticator import okhttp3.Request import okhttp3.Response @@ -12,7 +15,16 @@ class TokenAuthenticator( ) : Authenticator { override fun authenticate(route: Route?, response: Response): Request? { if (response.code == 401) { + context.startService( + Intent(context, AudioContentPlayService::class.java).apply { + action = AudioContentPlayService.MusicAction.STOP.name + } + ) + SharedPreferenceManager.clear() + val intent = Intent(context, LoginActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + context.startActivity(intent) } return null diff --git a/app/src/main/java/kr/co/vividnext/sodalive/settings/SettingsActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/settings/SettingsActivity.kt index 20ee5ad..0a07dfe 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/settings/SettingsActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/settings/SettingsActivity.kt @@ -35,6 +35,19 @@ class SettingsActivity : BaseActivity(ActivitySettingsB ) } + private val logoutAllDialog: SodaDialog by lazy { + SodaDialog( + activity = this, + layoutInflater = layoutInflater, + title = "알림", + desc = "모든 기기에서 로그아웃 하시겠어요?", + confirmButtonTitle = "확인", + confirmButtonClick = { logoutAllDevice() }, + cancelButtonTitle = "취소", + cancelButtonClick = {} + ) + } + private val viewModel: SettingsViewModel by inject() private lateinit var loadingDialog: LoadingDialog @@ -101,6 +114,10 @@ class SettingsActivity : BaseActivity(ActivitySettingsB logoutDialog.show(screenWidth) } + binding.tvLogOutAll.setOnClickListener { + logoutAllDialog.show(screenWidth) + } + binding.tvSignOut.paintFlags = binding.tvSignOut.paintFlags.or(Paint.UNDERLINE_TEXT_FLAG) binding.tvSignOut.setOnClickListener { startActivity(Intent(applicationContext, SignOutActivity::class.java)) @@ -134,4 +151,18 @@ class SettingsActivity : BaseActivity(ActivitySettingsB startActivity(Intent(applicationContext, SplashActivity::class.java)) } } + + private fun logoutAllDevice() { + startService( + Intent(applicationContext, AudioContentPlayService::class.java).apply { + action = AudioContentPlayService.MusicAction.STOP.name + } + ) + + viewModel.logoutAllDevice() { + SharedPreferenceManager.clear() + finishAffinity() + startActivity(Intent(applicationContext, SplashActivity::class.java)) + } + } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/settings/SettingsViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/settings/SettingsViewModel.kt index b05ed9b..f98a3b6 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/settings/SettingsViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/settings/SettingsViewModel.kt @@ -44,4 +44,31 @@ class SettingsViewModel(private val userRepository: UserRepository) : BaseViewMo ) ) } + + fun logoutAllDevice(onSuccess: () -> Unit) { + compositeDisposable.add( + userRepository.logoutAllDevice(token = "Bearer ${SharedPreferenceManager.token}") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + if (it.success) { + onSuccess() + } else { + if (it.message != null) { + _toastLiveData.postValue(it.message) + } else { + _toastLiveData.postValue( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + } + }, + { + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + } + ) + ) + } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/user/UserApi.kt b/app/src/main/java/kr/co/vividnext/sodalive/user/UserApi.kt index fed2c86..1207aa7 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/user/UserApi.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/user/UserApi.kt @@ -98,4 +98,7 @@ interface UserApi { @POST("/member/logout") fun logout(@Header("Authorization") authHeader: String): Single> + + @POST("/member/logout/all") + fun logoutAll(@Header("Authorization") authHeader: String): Single> } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/user/UserRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/user/UserRepository.kt index 7506e26..a3d3fbe 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/user/UserRepository.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/user/UserRepository.kt @@ -78,4 +78,5 @@ class UserRepository(private val userApi: UserApi) { ) = userApi.signOut(request, authHeader = token) fun logout(token: String) = userApi.logout(authHeader = token) + fun logoutAllDevice(token: String) = userApi.logoutAll(authHeader = token) } diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 03ff3f5..4067200 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -271,6 +271,17 @@ android:textColor="@color/color_eeeeee" android:textSize="14.7sp" /> + + -