From f20caebdcb26ef64272c5747826f6a82d8d25a2d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 21 May 2025 18:19:42 +0200 Subject: [PATCH] Add support for login link (#4752) * Add support for login link https://mobile.element.io/element?account_provider=example.org&login_hint=mxid:@alice:example.org * Update screenshots * Reduce code duplication * Add test on OnBoardingPresenter * Fix tool * Ignore login parameter if user is not allowed to connect to the provided server. * Improve tests. * Cleanup * Revert change on Project.xml. * Add documentation * Improve LoginHelper * Rename LoginFlow to LoginMode Move LoginFlow to package io.element.android.features.login.impl.login Rename some implementation of LoginMode Rename LoginFlowView to LoginModeView * Change launchMode of MainActivity from `singleTop` to `singleTask` Using launchMode singleTask to avoid multiple instances of the Activity when the app is already open. This is important for incoming share and for opening the application from a mobile.element.io link. Closes #4074 --------- Co-authored-by: ElementBot --- app/src/main/AndroidManifest.xml | 26 ++- appnav/build.gradle.kts | 1 + .../android/appnav/NotLoggedInFlowNode.kt | 15 ++ .../io/element/android/appnav/RootFlowNode.kt | 43 ++++- .../android/appnav/intent/IntentResolver.kt | 15 +- .../appnav/intent/IntentResolverTest.kt | 29 +++- .../features/login/api/LoginEntryPoint.kt | 6 + .../features/login/api/LoginIntentResolver.kt | 12 ++ .../android/features/login/api/LoginParams.kt | 21 +++ features/login/impl/build.gradle.kts | 1 + .../login/impl/DefaultLoginEntryPoint.kt | 8 + .../login/impl/DefaultLoginIntentResolver.kt | 30 ++++ .../features/login/impl/LoginFlowNode.kt | 52 ++++-- .../features/login/impl/login/LoginHelper.kt | 119 ++++++++++++++ .../features/login/impl/login/LoginMode.kt | 16 ++ .../login/impl/login/LoginModeView.kt | 87 ++++++++++ .../impl/onboarding/OnBoardingPresenter.kt | 44 ------ .../login/impl/onboarding/OnBoardingState.kt | 15 -- .../ConfirmAccountProviderPresenter.kt | 104 ++---------- .../ConfirmAccountProviderState.kt | 12 +- .../ConfirmAccountProviderStateProvider.kt | 7 +- .../ConfirmAccountProviderView.kt | 61 ++----- .../screens/onboarding/OnBoardingEvents.kt | 16 ++ .../onboarding/OnBoardingNode.kt | 40 ++++- .../screens/onboarding/OnBoardingPresenter.kt | 77 +++++++++ .../screens/onboarding/OnBoardingState.kt | 24 +++ .../onboarding/OnBoardingStateProvider.kt | 11 +- .../onboarding/OnBoardingView.kt | 60 ++++++- .../impl/DefaultLoginIntentResolverTest.kt | 81 ++++++++++ .../onboarding/OnBoardingPresenterTest.kt | 68 -------- .../ConfirmAccountProviderPresenterTest.kt | 83 +++++----- .../onboarding/OnBoardingPresenterTest.kt | 149 ++++++++++++++++++ .../onboarding/OnboardingViewTest.kt | 44 +++++- features/login/test/build.gradle.kts | 19 +++ .../login/test/FakeLoginIntentResolver.kt | 20 +++ .../api/auth/MatrixAuthenticationService.kt | 5 +- .../auth/RustMatrixAuthenticationService.kt | 7 +- .../android/libraries/matrix/test/TestData.kt | 4 +- .../auth/FakeMatrixAuthenticationService.kt | 5 +- ...ns.onboarding_OnBoardingView_Day_0_en.png} | 0 ...ns.onboarding_OnBoardingView_Day_1_en.png} | 0 ...ns.onboarding_OnBoardingView_Day_2_en.png} | 0 ...ns.onboarding_OnBoardingView_Day_3_en.png} | 0 ...ns.onboarding_OnBoardingView_Day_4_en.png} | 0 ...ens.onboarding_OnBoardingView_Day_5_en.png | 3 + ....onboarding_OnBoardingView_Night_0_en.png} | 0 ....onboarding_OnBoardingView_Night_1_en.png} | 0 ....onboarding_OnBoardingView_Night_2_en.png} | 0 ....onboarding_OnBoardingView_Night_3_en.png} | 0 ....onboarding_OnBoardingView_Night_4_en.png} | 0 ...s.onboarding_OnBoardingView_Night_5_en.png | 3 + tools/adb/deeplink_mobile.sh | 12 ++ 52 files changed, 1092 insertions(+), 363 deletions(-) create mode 100644 features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginIntentResolver.kt create mode 100644 features/login/api/src/main/kotlin/io/element/android/features/login/api/LoginParams.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/DefaultLoginIntentResolver.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/login/LoginHelper.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/login/LoginMode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/login/LoginModeView.kt delete mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/onboarding/OnBoardingPresenter.kt delete mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/onboarding/OnBoardingState.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingEvents.kt rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/{ => screens}/onboarding/OnBoardingNode.kt (55%) create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/{ => screens}/onboarding/OnBoardingStateProvider.kt (67%) rename features/login/impl/src/main/kotlin/io/element/android/features/login/impl/{ => screens}/onboarding/OnBoardingView.kt (75%) create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/DefaultLoginIntentResolverTest.kt delete mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/onboarding/OnBoardingPresenterTest.kt create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt rename features/login/impl/src/test/kotlin/io/element/android/features/login/impl/{ => screens}/onboarding/OnboardingViewTest.kt (67%) create mode 100644 features/login/test/build.gradle.kts create mode 100644 features/login/test/src/main/kotlin/io/element/android/features/login/test/FakeLoginIntentResolver.kt rename tests/uitests/src/test/snapshots/images/{features.login.impl.onboarding_OnBoardingView_Day_0_en.png => features.login.impl.screens.onboarding_OnBoardingView_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.login.impl.onboarding_OnBoardingView_Day_1_en.png => features.login.impl.screens.onboarding_OnBoardingView_Day_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.login.impl.onboarding_OnBoardingView_Day_2_en.png => features.login.impl.screens.onboarding_OnBoardingView_Day_2_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.login.impl.onboarding_OnBoardingView_Day_3_en.png => features.login.impl.screens.onboarding_OnBoardingView_Day_3_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.login.impl.onboarding_OnBoardingView_Day_4_en.png => features.login.impl.screens.onboarding_OnBoardingView_Day_4_en.png} (100%) create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_5_en.png rename tests/uitests/src/test/snapshots/images/{features.login.impl.onboarding_OnBoardingView_Night_0_en.png => features.login.impl.screens.onboarding_OnBoardingView_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.login.impl.onboarding_OnBoardingView_Night_1_en.png => features.login.impl.screens.onboarding_OnBoardingView_Night_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.login.impl.onboarding_OnBoardingView_Night_2_en.png => features.login.impl.screens.onboarding_OnBoardingView_Night_2_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.login.impl.onboarding_OnBoardingView_Night_3_en.png => features.login.impl.screens.onboarding_OnBoardingView_Night_3_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.login.impl.onboarding_OnBoardingView_Night_4_en.png => features.login.impl.screens.onboarding_OnBoardingView_Night_4_en.png} (100%) create mode 100644 tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_5_en.png create mode 100755 tools/adb/deeplink_mobile.sh diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c26c9a5a51..6619603f93 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -34,11 +34,17 @@ android:value='androidx.startup' /> + @@ -54,6 +60,9 @@ android:host="open" android:scheme="elementx" /> + @@ -80,6 +89,21 @@ + + + + + + + + + + + +