diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/core/data/PreferenceRepository.kt b/kotlin/android/app/src/main/java/dev/firezone/android/core/data/PreferenceRepository.kt index 1e303be78..ce8c034f6 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/core/data/PreferenceRepository.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/core/data/PreferenceRepository.kt @@ -15,5 +15,7 @@ internal interface PreferenceRepository { fun validateCsrfToken(value: String): Flow - fun clear() + fun clearToken() + + fun clearAll() } diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/core/data/PreferenceRepositoryImpl.kt b/kotlin/android/app/src/main/java/dev/firezone/android/core/data/PreferenceRepositoryImpl.kt index 4c8f018ae..248cb0286 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/core/data/PreferenceRepositoryImpl.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/core/data/PreferenceRepositoryImpl.kt @@ -52,7 +52,15 @@ internal class PreferenceRepositoryImpl emit(token == value) }.flowOn(coroutineDispatcher) - override fun clear() { + override fun clearToken() { + sharedPreferences.edit().apply { + remove(CSRF_KEY) + remove(TOKEN_KEY) + apply() + } + } + + override fun clearAll() { sharedPreferences.edit().clear().apply() } diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthActivity.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthActivity.kt index 3e423d0c2..e5f6549ac 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthActivity.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthActivity.kt @@ -26,14 +26,12 @@ class AuthActivity : AppCompatActivity(R.layout.activity_auth) { binding = ActivityAuthBinding.inflate(layoutInflater) setupActionObservers() - - viewModel.startAuthFlow() } override fun onResume() { super.onResume() - viewModel.startAuthFlow() + viewModel.onActivityResume() } private fun setupActionObservers() { @@ -63,7 +61,6 @@ class AuthActivity : AppCompatActivity(R.layout.activity_auth) { try { intent.launchUrl(this@AuthActivity, Uri.parse(url)) - finish() } catch (e: Exception) { showChromeAppRequiredError() } diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthViewModel.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthViewModel.kt index 5e111393b..736e41f00 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthViewModel.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthViewModel.kt @@ -24,7 +24,9 @@ internal class AuthViewModel private val actionMutableLiveData = MutableLiveData() val actionLiveData: LiveData = actionMutableLiveData - fun startAuthFlow() = + private var authFlowLaunched: Boolean = false + + fun onActivityResume() = try { viewModelScope.launch { val config = @@ -36,9 +38,10 @@ internal class AuthViewModel .firstOrNull() ?: throw Exception("csrfToken cannot be null") actionMutableLiveData.postValue( - if (config.token != null) { + if (authFlowLaunched || config.token != null) { ViewAction.NavigateToSignInFragment } else { + authFlowLaunched = true ViewAction.LaunchAuthFlow( url = "$AUTH_URL${config.accountId}?client_csrf_token=$csrfToken&client_platform=android", ) diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/TunnelManager.kt b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/TunnelManager.kt index 4322c9594..8b7fd3c90 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/TunnelManager.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/TunnelManager.kt @@ -77,8 +77,8 @@ internal class TunnelManager val intent = Intent(appContext, TunnelService::class.java) intent.action = TunnelService.ACTION_DISCONNECT appContext.startService(intent) - tunnelRepository.clear() - preferenceRepository.clear() + tunnelRepository.clearAll() + preferenceRepository.clearToken() } internal companion object { diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/data/TunnelRepository.kt b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/data/TunnelRepository.kt index 1f3ca1ffb..6a315cc8d 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/data/TunnelRepository.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/data/TunnelRepository.kt @@ -28,7 +28,7 @@ interface TunnelRepository { fun getRoutes(): List - fun clear() + fun clearAll() fun addListener(callback: SharedPreferences.OnSharedPreferenceChangeListener) diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/data/TunnelRepositoryImpl.kt b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/data/TunnelRepositoryImpl.kt index 398378f18..f94b8384c 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/data/TunnelRepositoryImpl.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/data/TunnelRepositoryImpl.kt @@ -110,7 +110,7 @@ class TunnelRepositoryImpl return moshi.adapter>().fromJson(json) ?: emptyList() } - override fun clear() { + override fun clearAll() { synchronized(lock) { sharedPreferences.edit().clear().apply() }