Skip to content

Commit 36c7c7a

Browse files
bmartyElementBot
andauthored
Oidc: Fallback to external browser instead of using Webview (#4808)
* Oidc: Fallback to external browser instead of using Webview * Update screenshots --------- Co-authored-by: ElementBot <[email protected]>
1 parent 58d503f commit 36c7c7a

File tree

21 files changed

+14
-709
lines changed

21 files changed

+14
-709
lines changed

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import io.element.android.features.login.impl.screens.createaccount.CreateAccoun
3636
import io.element.android.features.login.impl.screens.loginpassword.LoginPasswordNode
3737
import io.element.android.features.login.impl.screens.onboarding.OnBoardingNode
3838
import io.element.android.features.login.impl.screens.searchaccountprovider.SearchAccountProviderNode
39+
import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab
3940
import io.element.android.libraries.architecture.BackstackView
4041
import io.element.android.libraries.architecture.BaseFlowNode
4142
import io.element.android.libraries.architecture.NodeInputs
@@ -45,7 +46,6 @@ import io.element.android.libraries.di.AppScope
4546
import io.element.android.libraries.matrix.api.auth.OidcDetails
4647
import io.element.android.libraries.oidc.api.OidcAction
4748
import io.element.android.libraries.oidc.api.OidcActionFlow
48-
import io.element.android.libraries.oidc.api.OidcEntryPoint
4949
import kotlinx.coroutines.delay
5050
import kotlinx.coroutines.launch
5151
import kotlinx.parcelize.Parcelize
@@ -57,7 +57,6 @@ class LoginFlowNode @AssistedInject constructor(
5757
private val accountProviderDataSource: AccountProviderDataSource,
5858
private val defaultLoginUserStory: DefaultLoginUserStory,
5959
private val oidcActionFlow: OidcActionFlow,
60-
private val oidcEntryPoint: OidcEntryPoint,
6160
) : BaseFlowNode<LoginFlowNode.NavTarget>(
6261
backstack = BackStack(
6362
initialElement = NavTarget.OnBoarding,
@@ -74,15 +73,15 @@ class LoginFlowNode @AssistedInject constructor(
7473
private var activity: Activity? = null
7574
private var darkTheme: Boolean = false
7675

77-
private var customChromeTabStarted = false
76+
private var externalAppStarted = false
7877

7978
override fun onBuilt() {
8079
super.onBuilt()
8180
defaultLoginUserStory.setLoginFlowIsDone(false)
8281
lifecycle.subscribe(
8382
onResume = {
84-
if (customChromeTabStarted) {
85-
customChromeTabStarted = false
83+
if (externalAppStarted) {
84+
externalAppStarted = false
8685
// Workaround to detect that the Custom Chrome Tab has been closed
8786
// If there is no coming OidcAction (that would end this Node),
8887
// consider that the user has cancelled the login
@@ -122,9 +121,6 @@ class LoginFlowNode @AssistedInject constructor(
122121

123122
@Parcelize
124123
data class CreateAccount(val url: String) : NavTarget
125-
126-
@Parcelize
127-
data class OidcView(val oidcDetails: OidcDetails) : NavTarget
128124
}
129125

130126
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
@@ -249,9 +245,6 @@ class LoginFlowNode @AssistedInject constructor(
249245
NavTarget.LoginPassword -> {
250246
createNode<LoginPasswordNode>(buildContext)
251247
}
252-
is NavTarget.OidcView -> {
253-
oidcEntryPoint.createFallbackWebViewNode(this, buildContext, navTarget.oidcDetails.url)
254-
}
255248
is NavTarget.CreateAccount -> {
256249
val inputs = CreateAccountNode.Inputs(
257250
url = navTarget.url,
@@ -262,15 +255,9 @@ class LoginFlowNode @AssistedInject constructor(
262255
}
263256

264257
private fun navigateToMas(oidcDetails: OidcDetails) {
265-
if (oidcEntryPoint.canUseCustomTab()) {
266-
// In this case open a Chrome Custom tab
267-
activity?.let {
268-
customChromeTabStarted = true
269-
oidcEntryPoint.openUrlInCustomTab(it, darkTheme, oidcDetails.url)
270-
}
271-
} else {
272-
// Fallback to WebView mode
273-
backstack.push(NavTarget.OidcView(oidcDetails))
258+
activity?.let {
259+
externalAppStarted = true
260+
it.openUrlInChromeCustomTab(null, darkTheme, oidcDetails.url)
274261
}
275262
}
276263

features/securebackup/impl/src/main/kotlin/io/element/android/features/securebackup/impl/reset/ResetIdentityFlowNode.kt

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.bumble.appyx.navmodel.backstack.operation.push
2626
import dagger.assisted.Assisted
2727
import dagger.assisted.AssistedInject
2828
import io.element.android.anvilannotations.ContributesNode
29+
import io.element.android.compound.theme.ElementTheme
2930
import io.element.android.features.securebackup.impl.reset.password.ResetIdentityPasswordNode
3031
import io.element.android.features.securebackup.impl.reset.root.ResetIdentityRootNode
3132
import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab
@@ -37,7 +38,6 @@ import io.element.android.libraries.designsystem.components.ProgressDialog
3738
import io.element.android.libraries.di.SessionScope
3839
import io.element.android.libraries.matrix.api.encryption.IdentityOidcResetHandle
3940
import io.element.android.libraries.matrix.api.encryption.IdentityPasswordResetHandle
40-
import io.element.android.libraries.oidc.api.OidcEntryPoint
4141
import kotlinx.coroutines.CoroutineScope
4242
import kotlinx.coroutines.Job
4343
import kotlinx.coroutines.flow.collectLatest
@@ -51,7 +51,6 @@ class ResetIdentityFlowNode @AssistedInject constructor(
5151
@Assisted plugins: List<Plugin>,
5252
private val resetIdentityFlowManager: ResetIdentityFlowManager,
5353
private val coroutineScope: CoroutineScope,
54-
private val oidcEntryPoint: OidcEntryPoint,
5554
) : BaseFlowNode<ResetIdentityFlowNode.NavTarget>(
5655
backstack = BackStack(initialElement = NavTarget.Root, savedStateMap = buildContext.savedStateMap),
5756
buildContext = buildContext,
@@ -67,20 +66,18 @@ class ResetIdentityFlowNode @AssistedInject constructor(
6766

6867
@Parcelize
6968
data object ResetPassword : NavTarget
70-
71-
@Parcelize
72-
data class ResetOidc(val url: String) : NavTarget
7369
}
7470

7571
private lateinit var activity: Activity
72+
private var darkTheme: Boolean = false
7673
private var resetJob: Job? = null
7774

7875
override fun onBuilt() {
7976
super.onBuilt()
8077

8178
lifecycle.addObserver(object : DefaultLifecycleObserver {
8279
override fun onStart(owner: LifecycleOwner) {
83-
// If the custom tab was opened, we need to cancel the reset job
80+
// If the custom tab / Web browser was opened, we need to cancel the reset job
8481
// when we come back to the node if the reset wasn't successful
8582
coroutineScope.launch {
8683
cancelResetJob()
@@ -115,9 +112,6 @@ class ResetIdentityFlowNode @AssistedInject constructor(
115112
listOf(ResetIdentityPasswordNode.Inputs(handle))
116113
)
117114
}
118-
is NavTarget.ResetOidc -> {
119-
oidcEntryPoint.createFallbackWebViewNode(this, buildContext, navTarget.url)
120-
}
121115
}
122116
}
123117

@@ -135,11 +129,7 @@ class ResetIdentityFlowNode @AssistedInject constructor(
135129
Timber.d("No reset handle return, the reset is done.")
136130
}
137131
is IdentityOidcResetHandle -> {
138-
if (oidcEntryPoint.canUseCustomTab()) {
139-
activity.openUrlInChromeCustomTab(null, false, handle.url)
140-
} else {
141-
backstack.push(NavTarget.ResetOidc(handle.url))
142-
}
132+
activity.openUrlInChromeCustomTab(null, darkTheme, handle.url)
143133
resetJob = launch { handle.resetOidc() }
144134
}
145135
is IdentityPasswordResetHandle -> backstack.push(NavTarget.ResetPassword)
@@ -162,7 +152,7 @@ class ResetIdentityFlowNode @AssistedInject constructor(
162152
if (!this::activity.isInitialized) {
163153
activity = requireNotNull(LocalActivity.current)
164154
}
165-
155+
darkTheme = !ElementTheme.isLightTheme
166156
val startResetState by resetIdentityFlowManager.currentHandleFlow.collectAsState()
167157
if (startResetState.isLoading()) {
168158
ProgressDialog(

libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcEntryPoint.kt

Lines changed: 0 additions & 18 deletions
This file was deleted.

libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/CustomTabAvailabilityChecker.kt

Lines changed: 0 additions & 26 deletions
This file was deleted.

libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/customtab/DefaultOidcActionFlow.kt renamed to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcActionFlow.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* Please see LICENSE files in the repository root for full details.
66
*/
77

8-
package io.element.android.libraries.oidc.impl.customtab
8+
package io.element.android.libraries.oidc.impl
99

1010
import com.squareup.anvil.annotations.ContributesBinding
1111
import io.element.android.libraries.di.AppScope

libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcEntryPoint.kt

Lines changed: 0 additions & 40 deletions
This file was deleted.

libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/customtab/CustomTabHandler.kt

Lines changed: 0 additions & 69 deletions
This file was deleted.

libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcEvents.kt

Lines changed: 0 additions & 16 deletions
This file was deleted.

libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcNode.kt

Lines changed: 0 additions & 48 deletions
This file was deleted.

0 commit comments

Comments
 (0)