From d33fbaf89f4a6ab5d04435264ecf3a5c16610005 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 24 Apr 2023 14:49:15 +0200 Subject: [PATCH] Create sub packages. --- .../features/login/impl/LoginFlowNode.kt | 9 +++-- .../impl/oidc/CustomTabAvailabilityChecker.kt | 35 +++++++++++++++++++ .../oidc/{ => customtab}/CustomTabHandler.kt | 14 ++------ .../DefaultOidcActionFlow.kt | 2 +- .../CustomTab.kt => customtab/Extensions.kt} | 7 ++-- .../impl/oidc/{ => webview}/OidcEvents.kt | 2 +- .../login/impl/oidc/{ => webview}/OidcNode.kt | 2 +- .../impl/oidc/{ => webview}/OidcPresenter.kt | 2 +- .../impl/oidc/{ => webview}/OidcState.kt | 2 +- .../oidc/{ => webview}/OidcStateProvider.kt | 2 +- .../login/impl/oidc/{ => webview}/OidcView.kt | 4 +-- .../oidc/{ => webview}/OidcWebViewClient.kt | 3 +- .../{ => webview}/WebViewEventListener.kt | 2 +- .../login/impl/root/LoginRootPresenter.kt | 2 +- .../oidc/{ => webview}/OidcPresenterTest.kt | 2 +- 15 files changed, 58 insertions(+), 32 deletions(-) create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/CustomTabAvailabilityChecker.kt rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/{ => customtab}/CustomTabHandler.kt (83%) rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/{web => customtab}/DefaultOidcActionFlow.kt (95%) rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/{web/CustomTab.kt => customtab/Extensions.kt} (94%) rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/{ => webview}/OidcEvents.kt (93%) rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/{ => webview}/OidcNode.kt (96%) rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/{ => webview}/OidcPresenter.kt (98%) rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/{ => webview}/OidcState.kt (93%) rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/{ => webview}/OidcStateProvider.kt (95%) rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/{ => webview}/OidcView.kt (96%) rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/{ => webview}/OidcWebViewClient.kt (94%) rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/{ => webview}/WebViewEventListener.kt (93%) rename features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/{ => webview}/OidcPresenterTest.kt (98%) 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 f1f56888bb..833bf4367b 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 @@ -29,8 +29,9 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode import io.element.android.features.login.impl.changeserver.ChangeServerNode -import io.element.android.features.login.impl.oidc.CustomTabHandler -import io.element.android.features.login.impl.oidc.OidcNode +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.root.LoginRootNode import io.element.android.libraries.architecture.BackstackNode import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler @@ -43,6 +44,7 @@ import kotlinx.parcelize.Parcelize class LoginFlowNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, + private val customTabAvailabilityChecker: CustomTabAvailabilityChecker, private val customTabHandler: CustomTabHandler, ) : BackstackNode( backstack = BackStack( @@ -72,7 +74,8 @@ class LoginFlowNode @AssistedInject constructor( } override fun onOidcDetails(oidcDetails: OidcDetails) { - if (customTabHandler.supportCustomTab()) { + if (customTabAvailabilityChecker.supportCustomTab()) { + // In this case open a Chrome Custom tab customTabHandler.open(oidcDetails.url) } else { // Fallback to WebView mode diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/CustomTabAvailabilityChecker.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/CustomTabAvailabilityChecker.kt new file mode 100644 index 0000000000..424e9f13bc --- /dev/null +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/CustomTabAvailabilityChecker.kt @@ -0,0 +1,35 @@ +/* + * 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. + */ + +package io.element.android.features.login.impl.oidc + +import android.content.Context +import androidx.browser.customtabs.CustomTabsClient +import io.element.android.libraries.di.ApplicationContext +import javax.inject.Inject + +class CustomTabAvailabilityChecker @Inject constructor( + @ApplicationContext private val context: Context, +) { + /** + * Return true if the device supports Custom tab, i.e. there is an third party app with + * CustomTab support (ex: Chrome, Firefox, etc.). + */ + fun supportCustomTab(): Boolean { + val packageName = CustomTabsClient.getPackageName(context, null) + return packageName != null + } +} diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/CustomTabHandler.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/CustomTabHandler.kt similarity index 83% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/CustomTabHandler.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/CustomTabHandler.kt index 593469a12d..4a84dc76a7 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/CustomTabHandler.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/CustomTabHandler.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc +package io.element.android.features.login.impl.oidc.customtab import android.content.ComponentName import android.content.Context @@ -22,7 +22,6 @@ import android.net.Uri import androidx.browser.customtabs.CustomTabsClient import androidx.browser.customtabs.CustomTabsServiceConnection import androidx.browser.customtabs.CustomTabsSession -import io.element.android.features.login.impl.oidc.web.openUrlInChromeCustomTab import io.element.android.libraries.di.ApplicationContext import javax.inject.Inject @@ -33,15 +32,6 @@ class CustomTabHandler @Inject constructor( private var customTabsClient: CustomTabsClient? = null private var customTabsServiceConnection: CustomTabsServiceConnection? = null - /** - * Return true if the device supports Custom tab, i.e. there is an third party app with - * CustomTab support (ex: Chrome, Firefox, etc.). - */ - fun supportCustomTab(): Boolean { - val packageName = CustomTabsClient.getPackageName(context, null) - return packageName != null - } - fun prepareCustomTab(url: String) { val packageName = CustomTabsClient.getPackageName(context, null) @@ -82,6 +72,6 @@ class CustomTabHandler @Inject constructor( } fun open(url: String) { - openUrlInChromeCustomTab(context, customTabsSession, false, url) + context.openUrlInChromeCustomTab(customTabsSession, false, url) } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/web/DefaultOidcActionFlow.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/DefaultOidcActionFlow.kt similarity index 95% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/web/DefaultOidcActionFlow.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/DefaultOidcActionFlow.kt index be4ec88ca2..87c22629a0 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/web/DefaultOidcActionFlow.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/DefaultOidcActionFlow.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc.web +package io.element.android.features.login.impl.oidc.customtab import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.login.api.oidc.OidcAction diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/web/CustomTab.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/Extensions.kt similarity index 94% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/web/CustomTab.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/Extensions.kt index d6c9de7e68..3321c8979a 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/web/CustomTab.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/customtab/Extensions.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc.web +package io.element.android.features.login.impl.oidc.customtab import android.content.ActivityNotFoundException import android.content.Context @@ -29,8 +29,7 @@ import androidx.browser.customtabs.CustomTabsSession * If several compatible browsers are installed, the user will be proposed to choose one. * Ref: https://developer.chrome.com/multidevice/android/customtabs. */ -fun openUrlInChromeCustomTab( - context: Context, +fun Context.openUrlInChromeCustomTab( session: CustomTabsSession?, darkTheme: Boolean, url: String @@ -58,7 +57,7 @@ fun openUrlInChromeCustomTab( .apply { intent.flags += Intent.FLAG_ACTIVITY_NEW_TASK } - .launchUrl(context, Uri.parse(url)) + .launchUrl(this, Uri.parse(url)) } catch (activityNotFoundException: ActivityNotFoundException) { // TODO context.toast(R.string.error_no_external_application_found) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcEvents.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcEvents.kt similarity index 93% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcEvents.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcEvents.kt index 4f62c6476d..6265cfc85a 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcEvents.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcEvents.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc +package io.element.android.features.login.impl.oidc.webview import io.element.android.features.login.api.oidc.OidcAction diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcNode.kt similarity index 96% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcNode.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcNode.kt index b1f9b45237..dd16b5e57b 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcNode.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc +package io.element.android.features.login.impl.oidc.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/OidcPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenter.kt similarity index 98% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcPresenter.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenter.kt index f66caef5b2..66926b3734 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenter.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc +package io.element.android.features.login.impl.oidc.webview import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcState.kt similarity index 93% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcState.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcState.kt index e9b2ac2355..fc9507a89d 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcState.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcState.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc +package io.element.android.features.login.impl.oidc.webview import io.element.android.libraries.architecture.Async 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/OidcStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcStateProvider.kt similarity index 95% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcStateProvider.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcStateProvider.kt index 7a5552e719..80878cf8f8 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcStateProvider.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc +package io.element.android.features.login.impl.oidc.webview import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.libraries.architecture.Async diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcView.kt similarity index 96% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcView.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcView.kt index 10834f5afa..47dd4f7a28 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcView.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc +package io.element.android.features.login.impl.oidc.webview import android.webkit.WebView import androidx.activity.compose.BackHandler @@ -27,9 +27,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview 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.architecture.Async import io.element.android.libraries.core.bool.orFalse -import io.element.android.libraries.core.bool.orTrue import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcWebViewClient.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcWebViewClient.kt similarity index 94% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcWebViewClient.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcWebViewClient.kt index bd7ab99ad6..78c44dcf27 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/OidcWebViewClient.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/OidcWebViewClient.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc +package io.element.android.features.login.impl.oidc.webview import android.annotation.TargetApi import android.os.Build @@ -23,7 +23,6 @@ import android.webkit.WebView import android.webkit.WebViewClient import timber.log.Timber -// TODO Move to a dedicated module class OidcWebViewClient(private val eventListener: WebViewEventListener) : WebViewClient() { @TargetApi(Build.VERSION_CODES.N) override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/WebViewEventListener.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/WebViewEventListener.kt similarity index 93% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/WebViewEventListener.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/WebViewEventListener.kt index 91fde6c311..acb5c082dc 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/WebViewEventListener.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/oidc/webview/WebViewEventListener.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.login.impl.oidc +package io.element.android.features.login.impl.oidc.webview interface WebViewEventListener { /** diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/root/LoginRootPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/root/LoginRootPresenter.kt index 5bf9f2ad05..ecf6533929 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/root/LoginRootPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/root/LoginRootPresenter.kt @@ -25,7 +25,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import io.element.android.features.login.api.oidc.OidcAction -import io.element.android.features.login.impl.oidc.web.DefaultOidcActionFlow +import io.element.android.features.login.impl.oidc.customtab.DefaultOidcActionFlow import io.element.android.features.login.impl.util.LoginConstants import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Presenter diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/OidcPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenterTest.kt similarity index 98% rename from features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/OidcPresenterTest.kt rename to features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenterTest.kt index f69cecd0f2..5756cd13d2 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/OidcPresenterTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/oidc/webview/OidcPresenterTest.kt @@ -16,7 +16,7 @@ @file:OptIn(ExperimentalCoroutinesApi::class) -package io.element.android.features.login.impl.oidc +package io.element.android.features.login.impl.oidc.webview import app.cash.molecule.RecompositionClock import app.cash.molecule.moleculeFlow