From ee7a31caceb9c871e38a42dcad596695e6894943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Thu, 8 Aug 2024 16:24:13 +0200 Subject: [PATCH] Extract OIDC to its own module --- appnav/build.gradle.kts | 2 + .../io/element/android/appnav/RootFlowNode.kt | 4 +- .../android/appnav/intent/IntentResolver.kt | 4 +- .../appnav/intent/IntentResolverTest.kt | 6 +- features/login/impl/build.gradle.kts | 2 + .../features/login/impl/LoginFlowNode.kt | 18 ++--- .../ConfirmAccountProviderPresenter.kt | 10 +-- .../ConfirmAccountProviderPresenterTest.kt | 6 +- .../impl/VerifySelfSessionViewTest.kt | 2 + .../test/encryption/FakeEncryptionService.kt | 9 ++- .../encryption/FakeIdentityResetHandle.kt | 38 ++++++++++ libraries/oidc/api/build.gradle.kts | 27 +++++++ .../android/libraries/oidc/api}/OidcAction.kt | 2 +- .../libraries/oidc/api}/OidcActionFlow.kt | 6 +- .../libraries/oidc/api/OidcEntryPoint.kt | 27 +++++++ .../libraries/oidc/api}/OidcIntentResolver.kt | 2 +- libraries/oidc/impl/build.gradle.kts | 71 +++++++++++++++++++ .../impl}/CustomTabAvailabilityChecker.kt | 2 +- .../oidc/impl/DefaultOidcEntryPoint.kt | 49 +++++++++++++ .../oidc/impl}/DefaultOidcIntentResolver.kt | 6 +- .../libraries/oidc/impl}/OidcUrlParser.kt | 4 +- .../oidc/impl}/customtab/CustomTabHandler.kt | 2 +- .../impl}/customtab/DefaultOidcActionFlow.kt | 10 +-- .../oidc/impl}/webview/OidcEvents.kt | 4 +- .../libraries/oidc/impl}/webview/OidcNode.kt | 2 +- .../oidc/impl}/webview/OidcPresenter.kt | 4 +- .../libraries/oidc/impl}/webview/OidcState.kt | 2 +- .../oidc/impl}/webview/OidcStateProvider.kt | 2 +- .../libraries/oidc/impl}/webview/OidcView.kt | 4 +- .../oidc/impl}/webview/OidcWebViewClient.kt | 2 +- .../impl}/webview/WebViewEventListener.kt | 2 +- .../libraries/oidc/impl}/OidcUrlParserTest.kt | 4 +- .../oidc/impl}/webview/OidcPresenterTest.kt | 4 +- .../kotlin/extension/DependencyHandleScope.kt | 1 + 34 files changed, 283 insertions(+), 57 deletions(-) create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/encryption/FakeIdentityResetHandle.kt create mode 100644 libraries/oidc/api/build.gradle.kts rename {features/login/api/src/main/kotlin/io/element/android/features/login/api/oidc => libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api}/OidcAction.kt (93%) rename {features/login/api/src/main/kotlin/io/element/android/features/login/api/oidc => libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api}/OidcActionFlow.kt (79%) create mode 100644 libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcEntryPoint.kt rename {features/login/api/src/main/kotlin/io/element/android/features/login/api/oidc => libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api}/OidcIntentResolver.kt (93%) create mode 100644 libraries/oidc/impl/build.gradle.kts rename {features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl}/CustomTabAvailabilityChecker.kt (95%) create mode 100644 libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcEntryPoint.kt rename {features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl}/DefaultOidcIntentResolver.kt (85%) rename {features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl}/OidcUrlParser.kt (93%) rename {features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl}/customtab/CustomTabHandler.kt (97%) rename {features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl}/customtab/DefaultOidcActionFlow.kt (82%) rename {features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl}/webview/OidcEvents.kt (86%) rename {features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl}/webview/OidcNode.kt (96%) rename {features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl}/webview/OidcPresenter.kt (96%) rename {features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl}/webview/OidcState.kt (93%) rename {features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl}/webview/OidcStateProvider.kt (95%) rename {features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl}/webview/OidcView.kt (96%) rename {features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl}/webview/OidcWebViewClient.kt (95%) rename {features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl}/webview/WebViewEventListener.kt (93%) rename {features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/test/kotlin/io/element/android/libraries/oidc/impl}/OidcUrlParserTest.kt (94%) rename {features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc => libraries/oidc/impl/src/test/kotlin/io/element/android/libraries/oidc/impl}/webview/OidcPresenterTest.kt (97%) diff --git a/appnav/build.gradle.kts b/appnav/build.gradle.kts index 53680fd44e..887f48e203 100644 --- a/appnav/build.gradle.kts +++ b/appnav/build.gradle.kts @@ -42,6 +42,7 @@ dependencies { implementation(projects.libraries.architecture) implementation(projects.libraries.deeplink) implementation(projects.libraries.matrix.api) + implementation(projects.libraries.oidc.api) implementation(projects.libraries.preferences.api) implementation(projects.libraries.push.api) implementation(projects.libraries.pushproviders.api) @@ -66,6 +67,7 @@ dependencies { testImplementation(libs.test.truth) testImplementation(libs.test.turbine) testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.oidc.impl) testImplementation(projects.libraries.push.test) testImplementation(projects.libraries.pushproviders.test) testImplementation(projects.features.networkmonitor.test) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt index d200acb84e..b651f4d77c 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt @@ -42,8 +42,6 @@ import io.element.android.appnav.intent.ResolvedIntent import io.element.android.appnav.root.RootNavStateFlowFactory import io.element.android.appnav.root.RootPresenter import io.element.android.appnav.root.RootView -import io.element.android.features.login.api.oidc.OidcAction -import io.element.android.features.login.api.oidc.OidcActionFlow import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint import io.element.android.features.signedout.api.SignedOutEntryPoint import io.element.android.features.viewfolder.api.ViewFolderEntryPoint @@ -59,6 +57,8 @@ import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.sessionstorage.api.LoggedInState +import io.element.android.libraries.oidc.api.OidcAction +import io.element.android.libraries.oidc.api.OidcActionFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach diff --git a/appnav/src/main/kotlin/io/element/android/appnav/intent/IntentResolver.kt b/appnav/src/main/kotlin/io/element/android/appnav/intent/IntentResolver.kt index d41fbbfebb..73ad6f6008 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/intent/IntentResolver.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/intent/IntentResolver.kt @@ -17,12 +17,12 @@ package io.element.android.appnav.intent import android.content.Intent -import io.element.android.features.login.api.oidc.OidcAction -import io.element.android.features.login.api.oidc.OidcIntentResolver import io.element.android.libraries.deeplink.DeeplinkData import io.element.android.libraries.deeplink.DeeplinkParser import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.permalink.PermalinkParser +import io.element.android.libraries.oidc.api.OidcAction +import io.element.android.libraries.oidc.api.OidcIntentResolver import timber.log.Timber import javax.inject.Inject diff --git a/appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt index aa0fe9cbf1..8134c091f6 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt @@ -21,9 +21,6 @@ import android.content.Intent import android.net.Uri import androidx.core.net.toUri import com.google.common.truth.Truth.assertThat -import io.element.android.features.login.api.oidc.OidcAction -import io.element.android.features.login.impl.oidc.DefaultOidcIntentResolver -import io.element.android.features.login.impl.oidc.OidcUrlParser import io.element.android.libraries.deeplink.DeepLinkCreator import io.element.android.libraries.deeplink.DeeplinkData import io.element.android.libraries.deeplink.DeeplinkParser @@ -33,6 +30,9 @@ import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_SESSION_ID import io.element.android.libraries.matrix.test.A_THREAD_ID import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser +import io.element.android.libraries.oidc.api.OidcAction +import io.element.android.libraries.oidc.impl.DefaultOidcIntentResolver +import io.element.android.libraries.oidc.impl.OidcUrlParser import io.element.android.tests.testutils.lambda.lambdaError import org.junit.Assert.assertThrows import org.junit.Test diff --git a/features/login/impl/build.gradle.kts b/features/login/impl/build.gradle.kts index 6fcdc2c1de..3fbe55f1f9 100644 --- a/features/login/impl/build.gradle.kts +++ b/features/login/impl/build.gradle.kts @@ -50,6 +50,7 @@ dependencies { implementation(projects.libraries.uiStrings) implementation(projects.libraries.permissions.api) implementation(projects.libraries.qrcode) + implementation(projects.libraries.oidc.api) implementation(libs.androidx.browser) implementation(platform(libs.network.retrofit.bom)) implementation(libs.network.retrofit) @@ -65,6 +66,7 @@ dependencies { testImplementation(libs.test.truth) testImplementation(libs.test.turbine) testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.oidc.impl) testImplementation(projects.libraries.permissions.test) testImplementation(projects.tests.testutils) testReleaseImplementation(libs.androidx.compose.ui.test.manifest) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt index 0af102a403..13aac03de4 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt @@ -36,12 +36,7 @@ import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode import io.element.android.compound.theme.ElementTheme import io.element.android.features.login.api.LoginFlowType -import io.element.android.features.login.api.oidc.OidcAction -import io.element.android.features.login.api.oidc.OidcActionFlow import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource -import io.element.android.features.login.impl.oidc.CustomTabAvailabilityChecker -import io.element.android.features.login.impl.oidc.customtab.CustomTabHandler -import io.element.android.features.login.impl.oidc.webview.OidcNode import io.element.android.features.login.impl.qrcode.QrCodeLoginFlowNode import io.element.android.features.login.impl.screens.changeaccountprovider.ChangeAccountProviderNode import io.element.android.features.login.impl.screens.confirmaccountprovider.ConfirmAccountProviderNode @@ -56,6 +51,9 @@ import io.element.android.libraries.architecture.createNode import io.element.android.libraries.architecture.inputs import io.element.android.libraries.di.AppScope import io.element.android.libraries.matrix.api.auth.OidcDetails +import io.element.android.libraries.oidc.api.OidcAction +import io.element.android.libraries.oidc.api.OidcActionFlow +import io.element.android.libraries.oidc.api.OidcEntryPoint import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.parcelize.Parcelize @@ -64,11 +62,10 @@ import kotlinx.parcelize.Parcelize class LoginFlowNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, - private val customTabAvailabilityChecker: CustomTabAvailabilityChecker, - private val customTabHandler: CustomTabHandler, private val accountProviderDataSource: AccountProviderDataSource, private val defaultLoginUserStory: DefaultLoginUserStory, private val oidcActionFlow: OidcActionFlow, + private val oidcEntryPoint: OidcEntryPoint, ) : BaseFlowNode( backstack = BackStack( initialElement = NavTarget.Root, @@ -146,11 +143,11 @@ class LoginFlowNode @AssistedInject constructor( ) val callback = object : ConfirmAccountProviderNode.Callback { override fun onOidcDetails(oidcDetails: OidcDetails) { - if (customTabAvailabilityChecker.supportCustomTab()) { + if (oidcEntryPoint.canUseCustomTab()) { // In this case open a Chrome Custom tab activity?.let { customChromeTabStarted = true - customTabHandler.open(it, darkTheme, oidcDetails.url) + oidcEntryPoint.openUrlInCustomTab(it, darkTheme, oidcDetails.url) } } else { // Fallback to WebView mode @@ -201,8 +198,7 @@ class LoginFlowNode @AssistedInject constructor( createNode(buildContext, plugins = listOf(callback)) } is NavTarget.OidcView -> { - val input = OidcNode.Inputs(navTarget.oidcDetails) - createNode(buildContext, plugins = listOf(input)) + oidcEntryPoint.createFallbackWebViewNode(this, buildContext, navTarget.oidcDetails.url) } is NavTarget.WaitList -> { val inputs = WaitListNode.Inputs( diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt index 27aec75739..fdf7994d7e 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt @@ -27,15 +27,15 @@ import androidx.compose.runtime.rememberCoroutineScope import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import io.element.android.features.login.api.oidc.OidcAction import io.element.android.features.login.impl.DefaultLoginUserStory import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource import io.element.android.features.login.impl.error.ChangeServerError -import io.element.android.features.login.impl.oidc.customtab.DefaultOidcActionFlow import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService +import io.element.android.libraries.oidc.api.OidcAction +import io.element.android.libraries.oidc.api.OidcActionFlow import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -43,7 +43,7 @@ class ConfirmAccountProviderPresenter @AssistedInject constructor( @Assisted private val params: Params, private val accountProviderDataSource: AccountProviderDataSource, private val authenticationService: MatrixAuthenticationService, - private val defaultOidcActionFlow: DefaultOidcActionFlow, + private val oidcActionFlow: OidcActionFlow, private val defaultLoginUserStory: DefaultLoginUserStory, ) : Presenter { data class Params( @@ -65,7 +65,7 @@ class ConfirmAccountProviderPresenter @AssistedInject constructor( } LaunchedEffect(Unit) { - defaultOidcActionFlow.collect { oidcAction -> + oidcActionFlow.collect { oidcAction -> if (oidcAction != null) { onOidcAction(oidcAction, loginFlowAction) } @@ -133,6 +133,6 @@ class ConfirmAccountProviderPresenter @AssistedInject constructor( } } } - defaultOidcActionFlow.reset() + oidcActionFlow.reset() } } diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenterTest.kt index 5a02797bdb..3875a4b245 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenterTest.kt @@ -20,10 +20,8 @@ import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import io.element.android.features.login.api.oidc.OidcAction import io.element.android.features.login.impl.DefaultLoginUserStory import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource -import io.element.android.features.login.impl.oidc.customtab.DefaultOidcActionFlow import io.element.android.features.login.impl.util.defaultAccountProvider import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService @@ -31,6 +29,8 @@ import io.element.android.libraries.matrix.test.A_HOMESERVER import io.element.android.libraries.matrix.test.A_HOMESERVER_OIDC import io.element.android.libraries.matrix.test.A_THROWABLE import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService +import io.element.android.libraries.oidc.api.OidcAction +import io.element.android.libraries.oidc.impl.customtab.DefaultOidcActionFlow import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.waitForPredicate import kotlinx.coroutines.test.runTest @@ -274,7 +274,7 @@ class ConfirmAccountProviderPresenterTest { params = params, accountProviderDataSource = accountProviderDataSource, authenticationService = matrixAuthenticationService, - defaultOidcActionFlow = defaultOidcActionFlow, + oidcActionFlow = defaultOidcActionFlow, defaultLoginUserStory = defaultLoginUserStory, ) } diff --git a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionViewTest.kt b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionViewTest.kt index f19f3e1f29..7e5bf928e2 100644 --- a/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionViewTest.kt +++ b/features/verifysession/impl/src/test/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionViewTest.kt @@ -217,12 +217,14 @@ class VerifySelfSessionViewTest { state: VerifySelfSessionState, onEnterRecoveryKey: () -> Unit = EnsureNeverCalled(), onFinished: () -> Unit = EnsureNeverCalled(), + onResetKey: () -> Unit = EnsureNeverCalled(), ) { setContent { VerifySelfSessionView( state = state, onEnterRecoveryKey = onEnterRecoveryKey, onFinish = onFinished, + onResetKey = onResetKey, ) } } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/encryption/FakeEncryptionService.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/encryption/FakeEncryptionService.kt index b864c69b0b..fa301e402e 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/encryption/FakeEncryptionService.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/encryption/FakeEncryptionService.kt @@ -20,13 +20,16 @@ import io.element.android.libraries.matrix.api.encryption.BackupState import io.element.android.libraries.matrix.api.encryption.BackupUploadState import io.element.android.libraries.matrix.api.encryption.EnableRecoveryProgress import io.element.android.libraries.matrix.api.encryption.EncryptionService +import io.element.android.libraries.matrix.api.encryption.IdentityResetHandle import io.element.android.libraries.matrix.api.encryption.RecoveryState import io.element.android.tests.testutils.simulateLongTask import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flowOf -class FakeEncryptionService : EncryptionService { +class FakeEncryptionService( + var startIdentityResetLambda: () -> Result = { error("Not implemented") }, +) : EncryptionService { private var disableRecoveryFailure: Exception? = null override val backupStateStateFlow: MutableStateFlow = MutableStateFlow(BackupState.UNKNOWN) override val recoveryStateStateFlow: MutableStateFlow = MutableStateFlow(RecoveryState.UNKNOWN) @@ -118,6 +121,10 @@ class FakeEncryptionService : EncryptionService { enableRecoveryProgressStateFlow.emit(state) } + override suspend fun startIdentityReset(): Result { + return startIdentityResetLambda() + } + companion object { const val FAKE_RECOVERY_KEY = "fake" } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/encryption/FakeIdentityResetHandle.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/encryption/FakeIdentityResetHandle.kt new file mode 100644 index 0000000000..bf0aa312be --- /dev/null +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/encryption/FakeIdentityResetHandle.kt @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.test.encryption + +import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.encryption.IdentityOidcResetHandle +import io.element.android.libraries.matrix.api.encryption.IdentityPasswordResetHandle + +class FakeIdentityOidcResetHandle( + override val url: String = "", + var resetOidcLambda: () -> Result = { error("Not implemented") } +) : IdentityOidcResetHandle { + override suspend fun resetOidc(): Result { + return resetOidcLambda() + } +} + +class FakeIdentityPasswordResetHandle( + var resetPasswordLambda: (UserId, String) -> Result = { _, _ -> error("Not implemented") } +) : IdentityPasswordResetHandle { + override suspend fun resetPassword(userId: UserId, password: String): Result { + return resetPasswordLambda(userId, password) + } +} diff --git a/libraries/oidc/api/build.gradle.kts b/libraries/oidc/api/build.gradle.kts new file mode 100644 index 0000000000..874c3ddbd4 --- /dev/null +++ b/libraries/oidc/api/build.gradle.kts @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +plugins { + id("io.element.android-library") + id("kotlin-parcelize") +} + +android { + namespace = "io.element.android.libraries.oidc.api" +} + +dependencies { + implementation(projects.libraries.architecture) +} diff --git a/features/login/api/src/main/kotlin/io/element/android/features/login/api/oidc/OidcAction.kt b/libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcAction.kt similarity index 93% rename from features/login/api/src/main/kotlin/io/element/android/features/login/api/oidc/OidcAction.kt rename to libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcAction.kt index 6d87872879..cc17159960 100644 --- a/features/login/api/src/main/kotlin/io/element/android/features/login/api/oidc/OidcAction.kt +++ b/libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcAction.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.api.oidc +package io.element.android.libraries.oidc.api sealed interface OidcAction { data object GoBack : OidcAction diff --git a/features/login/api/src/main/kotlin/io/element/android/features/login/api/oidc/OidcActionFlow.kt b/libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcActionFlow.kt similarity index 79% rename from features/login/api/src/main/kotlin/io/element/android/features/login/api/oidc/OidcActionFlow.kt rename to libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcActionFlow.kt index 004e7c8a51..1fd67cfaf5 100644 --- a/features/login/api/src/main/kotlin/io/element/android/features/login/api/oidc/OidcActionFlow.kt +++ b/libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcActionFlow.kt @@ -14,8 +14,12 @@ * limitations under the License. */ -package io.element.android.features.login.api.oidc +package io.element.android.libraries.oidc.api + +import kotlinx.coroutines.flow.FlowCollector interface OidcActionFlow { fun post(oidcAction: OidcAction) + suspend fun collect(collector: FlowCollector) + fun reset() } diff --git a/libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcEntryPoint.kt b/libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcEntryPoint.kt new file mode 100644 index 0000000000..c00bf263af --- /dev/null +++ b/libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcEntryPoint.kt @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.oidc.api + +import android.app.Activity +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node + +interface OidcEntryPoint { + fun canUseCustomTab(): Boolean + fun openUrlInCustomTab(activity: Activity, darkTheme: Boolean, url: String) + fun createFallbackWebViewNode(parentNode: Node, buildContext: BuildContext, url: String): Node +} diff --git a/features/login/api/src/main/kotlin/io/element/android/features/login/api/oidc/OidcIntentResolver.kt b/libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcIntentResolver.kt similarity index 93% rename from features/login/api/src/main/kotlin/io/element/android/features/login/api/oidc/OidcIntentResolver.kt rename to libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcIntentResolver.kt index a6ecf26fca..77597fd432 100644 --- a/features/login/api/src/main/kotlin/io/element/android/features/login/api/oidc/OidcIntentResolver.kt +++ b/libraries/oidc/api/src/main/kotlin/io/element/android/libraries/oidc/api/OidcIntentResolver.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.api.oidc +package io.element.android.libraries.oidc.api import android.content.Intent diff --git a/libraries/oidc/impl/build.gradle.kts b/libraries/oidc/impl/build.gradle.kts new file mode 100644 index 0000000000..be4181e169 --- /dev/null +++ b/libraries/oidc/impl/build.gradle.kts @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id("io.element.android-compose-library") + alias(libs.plugins.anvil) + id("kotlin-parcelize") + alias(libs.plugins.kotlin.serialization) +} + +android { + namespace = "io.element.android.libraries.oidc.impl" + + testOptions { + unitTests { + isIncludeAndroidResources = true + } + } +} + +anvil { + generateDaggerFactories.set(true) +} + +dependencies { + implementation(projects.anvilannotations) + implementation(projects.appconfig) + anvil(projects.anvilcodegen) + implementation(projects.libraries.core) + implementation(projects.libraries.androidutils) + implementation(projects.libraries.architecture) + implementation(projects.libraries.matrix.api) + implementation(projects.libraries.matrix.api) + implementation(projects.libraries.network) + implementation(projects.libraries.designsystem) + implementation(projects.libraries.testtags) + implementation(projects.libraries.uiStrings) + implementation(projects.libraries.permissions.api) + implementation(projects.libraries.qrcode) + implementation(libs.androidx.browser) + implementation(platform(libs.network.retrofit.bom)) + implementation(libs.network.retrofit) + implementation(libs.serialization.json) + api(projects.libraries.oidc.api) + + testImplementation(libs.test.junit) + testImplementation(libs.androidx.compose.ui.test.junit) + testImplementation(libs.androidx.test.ext.junit) + testImplementation(libs.coroutines.test) + testImplementation(libs.molecule.runtime) + testImplementation(libs.test.robolectric) + testImplementation(libs.test.truth) + testImplementation(libs.test.turbine) + testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.permissions.test) + testImplementation(projects.tests.testutils) + testReleaseImplementation(libs.androidx.compose.ui.test.manifest) +} diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/CustomTabAvailabilityChecker.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/CustomTabAvailabilityChecker.kt similarity index 95% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/CustomTabAvailabilityChecker.kt rename to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/CustomTabAvailabilityChecker.kt index 424e9f13bc..6258e67b0e 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/CustomTabAvailabilityChecker.kt +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/CustomTabAvailabilityChecker.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc +package io.element.android.libraries.oidc.impl import android.content.Context import androidx.browser.customtabs.CustomTabsClient diff --git a/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcEntryPoint.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcEntryPoint.kt new file mode 100644 index 0000000000..1a8ce960c5 --- /dev/null +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcEntryPoint.kt @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.oidc.impl + +import android.app.Activity +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab +import io.element.android.libraries.architecture.createNode +import io.element.android.libraries.di.AppScope +import io.element.android.libraries.matrix.api.auth.OidcDetails +import io.element.android.libraries.oidc.impl.webview.OidcNode +import io.element.android.libraries.oidc.api.OidcEntryPoint +import javax.inject.Inject + +@ContributesBinding(AppScope::class) +class DefaultOidcEntryPoint @Inject constructor( + private val customTabAvailabilityChecker: CustomTabAvailabilityChecker, +) : OidcEntryPoint { + override fun canUseCustomTab(): Boolean { + return customTabAvailabilityChecker.supportCustomTab() + } + + override fun openUrlInCustomTab(activity: Activity, darkTheme: Boolean, url: String) { + assert(canUseCustomTab()) { "Custom tab is not supported in this device." } + activity.openUrlInChromeCustomTab(null, darkTheme, url) + } + + override fun createFallbackWebViewNode(parentNode: Node, buildContext: BuildContext, url: String): Node { + assert(!canUseCustomTab()) { "Custom tab should be used instead of the fallback node." } + val inputs = OidcNode.Inputs(OidcDetails(url)) + return parentNode.createNode(buildContext, listOf(inputs)) + } +} diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/DefaultOidcIntentResolver.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcIntentResolver.kt similarity index 85% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/DefaultOidcIntentResolver.kt rename to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcIntentResolver.kt index 8b6844e0f3..9777cee22f 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/DefaultOidcIntentResolver.kt +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/DefaultOidcIntentResolver.kt @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc +package io.element.android.libraries.oidc.impl import android.content.Intent import com.squareup.anvil.annotations.ContributesBinding -import io.element.android.features.login.api.oidc.OidcAction -import io.element.android.features.login.api.oidc.OidcIntentResolver import io.element.android.libraries.di.AppScope +import io.element.android.libraries.oidc.api.OidcAction +import io.element.android.libraries.oidc.api.OidcIntentResolver import javax.inject.Inject @ContributesBinding(AppScope::class) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcUrlParser.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/OidcUrlParser.kt similarity index 93% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcUrlParser.kt rename to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/OidcUrlParser.kt index 8c8c895acd..ae502d0a8c 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcUrlParser.kt +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/OidcUrlParser.kt @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc +package io.element.android.libraries.oidc.impl -import io.element.android.features.login.api.oidc.OidcAction import io.element.android.libraries.matrix.api.auth.OidcConfig +import io.element.android.libraries.oidc.api.OidcAction import javax.inject.Inject /** diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/CustomTabHandler.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/customtab/CustomTabHandler.kt similarity index 97% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/CustomTabHandler.kt rename to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/customtab/CustomTabHandler.kt index b83c0eb1ac..21c673145e 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/CustomTabHandler.kt +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/customtab/CustomTabHandler.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc.customtab +package io.element.android.libraries.oidc.impl.customtab import android.app.Activity import android.content.ComponentName diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/DefaultOidcActionFlow.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/customtab/DefaultOidcActionFlow.kt similarity index 82% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/DefaultOidcActionFlow.kt rename to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/customtab/DefaultOidcActionFlow.kt index 17dfa8418f..0c0737b43e 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/DefaultOidcActionFlow.kt +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/customtab/DefaultOidcActionFlow.kt @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc.customtab +package io.element.android.libraries.oidc.impl.customtab import com.squareup.anvil.annotations.ContributesBinding -import io.element.android.features.login.api.oidc.OidcAction -import io.element.android.features.login.api.oidc.OidcActionFlow import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.SingleIn +import io.element.android.libraries.oidc.api.OidcAction +import io.element.android.libraries.oidc.api.OidcActionFlow import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.flow.MutableStateFlow import javax.inject.Inject @@ -34,11 +34,11 @@ class DefaultOidcActionFlow @Inject constructor() : OidcActionFlow { mutableStateFlow.value = oidcAction } - suspend fun collect(collector: FlowCollector) { + override suspend fun collect(collector: FlowCollector) { mutableStateFlow.collect(collector) } - fun reset() { + override fun reset() { mutableStateFlow.value = null } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcEvents.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcEvents.kt similarity index 86% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcEvents.kt rename to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcEvents.kt index 9d2f945e25..602d50628a 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcEvents.kt +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcEvents.kt @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc.webview +package io.element.android.libraries.oidc.impl.webview -import io.element.android.features.login.api.oidc.OidcAction +import io.element.android.libraries.oidc.api.OidcAction sealed interface OidcEvents { data object Cancel : OidcEvents diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcNode.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcNode.kt similarity index 96% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcNode.kt rename to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcNode.kt index 5cd7cf0c3b..d31bdcd032 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcNode.kt +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcNode.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc.webview +package io.element.android.libraries.oidc.impl.webview import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenter.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcPresenter.kt similarity index 96% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenter.kt rename to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcPresenter.kt index 3f10ba256a..853a9b584c 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenter.kt +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcPresenter.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc.webview +package io.element.android.libraries.oidc.impl.webview import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -25,7 +25,7 @@ import androidx.compose.runtime.setValue import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import io.element.android.features.login.api.oidc.OidcAction +import io.element.android.libraries.oidc.api.OidcAction import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcState.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcState.kt similarity index 93% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcState.kt rename to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcState.kt index dc4f26d51e..8b1b01b03d 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcState.kt +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcState.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc.webview +package io.element.android.libraries.oidc.impl.webview import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.api.auth.OidcDetails diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcStateProvider.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcStateProvider.kt similarity index 95% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcStateProvider.kt rename to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcStateProvider.kt index 5d44657462..7127c9160e 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcStateProvider.kt +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcStateProvider.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc.webview +package io.element.android.libraries.oidc.impl.webview import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.libraries.architecture.AsyncAction diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcView.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcView.kt similarity index 96% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcView.kt rename to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcView.kt index c07078cdff..e8ddcd03c3 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcView.kt +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcView.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc.webview +package io.element.android.libraries.oidc.impl.webview import android.webkit.WebView import androidx.activity.compose.BackHandler @@ -28,11 +28,11 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.viewinterop.AndroidView -import io.element.android.features.login.impl.oidc.OidcUrlParser import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.designsystem.components.async.AsyncActionView import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.oidc.impl.OidcUrlParser @Composable fun OidcView( diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcWebViewClient.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcWebViewClient.kt similarity index 95% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcWebViewClient.kt rename to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcWebViewClient.kt index a9cd576e6d..d20eabf00e 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcWebViewClient.kt +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/OidcWebViewClient.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc.webview +package io.element.android.libraries.oidc.impl.webview import android.webkit.WebResourceRequest import android.webkit.WebView diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/WebViewEventListener.kt b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/WebViewEventListener.kt similarity index 93% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/WebViewEventListener.kt rename to libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/WebViewEventListener.kt index 446754aced..8f587966bf 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/WebViewEventListener.kt +++ b/libraries/oidc/impl/src/main/kotlin/io/element/android/libraries/oidc/impl/webview/WebViewEventListener.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc.webview +package io.element.android.libraries.oidc.impl.webview fun interface WebViewEventListener { /** diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/OidcUrlParserTest.kt b/libraries/oidc/impl/src/test/kotlin/io/element/android/libraries/oidc/impl/OidcUrlParserTest.kt similarity index 94% rename from features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/OidcUrlParserTest.kt rename to libraries/oidc/impl/src/test/kotlin/io/element/android/libraries/oidc/impl/OidcUrlParserTest.kt index 6f63673b23..895e416faa 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/OidcUrlParserTest.kt +++ b/libraries/oidc/impl/src/test/kotlin/io/element/android/libraries/oidc/impl/OidcUrlParserTest.kt @@ -14,11 +14,11 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc +package io.element.android.libraries.oidc.impl import com.google.common.truth.Truth.assertThat -import io.element.android.features.login.api.oidc.OidcAction import io.element.android.libraries.matrix.api.auth.OidcConfig +import io.element.android.libraries.oidc.api.OidcAction import org.junit.Assert import org.junit.Test diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenterTest.kt b/libraries/oidc/impl/src/test/kotlin/io/element/android/libraries/oidc/impl/webview/OidcPresenterTest.kt similarity index 97% rename from features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenterTest.kt rename to libraries/oidc/impl/src/test/kotlin/io/element/android/libraries/oidc/impl/webview/OidcPresenterTest.kt index 38d0506dd8..994334d2e9 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenterTest.kt +++ b/libraries/oidc/impl/src/test/kotlin/io/element/android/libraries/oidc/impl/webview/OidcPresenterTest.kt @@ -16,17 +16,17 @@ @file:OptIn(ExperimentalCoroutinesApi::class) -package io.element.android.features.login.impl.oidc.webview +package io.element.android.libraries.oidc.impl.webview import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import io.element.android.features.login.api.oidc.OidcAction import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.test.A_THROWABLE import io.element.android.libraries.matrix.test.auth.A_OIDC_DATA import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService +import io.element.android.libraries.oidc.api.OidcAction import io.element.android.tests.testutils.WarmUpRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest diff --git a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt index 9fd82af4ae..bd83d527ca 100644 --- a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt +++ b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt @@ -116,6 +116,7 @@ fun DependencyHandlerScope.allLibrariesImpl() { implementation(project(":libraries:mediaviewer:impl")) implementation(project(":libraries:troubleshoot:impl")) implementation(project(":libraries:fullscreenintent:impl")) + implementation(project(":libraries:oidc:impl")) } fun DependencyHandlerScope.allServicesImpl() {