diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LoginFlowResult.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LoginFlowResult.kt index 53c18385f7..f1f9ba3916 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LoginFlowResult.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LoginFlowResult.kt @@ -19,7 +19,7 @@ package org.matrix.android.sdk.api.auth.data sealed class LoginFlowResult { data class Success( val supportedLoginTypes: List, - val ssoIdentityProviders: List?, + val ssoIdentityProviders: List?, val isLoginAndRegistrationSupported: Boolean, val homeServerUrl: String, val isOutdatedHomeserver: Boolean diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/IdentityProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SsoIdentityProvider.kt similarity index 98% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/IdentityProvider.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SsoIdentityProvider.kt index 8847e27a92..8bda65b90d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/IdentityProvider.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SsoIdentityProvider.kt @@ -23,7 +23,7 @@ import kotlinx.android.parcel.Parcelize @JsonClass(generateAdapter = true) @Parcelize -data class IdentityProvider( +data class SsoIdentityProvider( /** * The id field would be opaque with the accepted characters matching unreserved URI characters as defined in RFC3986 * - this was chosen to avoid having to encode special characters in the URL. Max length 128. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt index ba3bd29b9f..55f053de8d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt @@ -279,7 +279,7 @@ internal class DefaultAuthenticationService @Inject constructor( } return LoginFlowResult.Success( loginFlowResponse.flows.orEmpty().mapNotNull { it.type }, - loginFlowResponse.flows.orEmpty().firstOrNull { it.type == LoginFlowTypes.SSO }?.identityProvider, + loginFlowResponse.flows.orEmpty().firstOrNull { it.type == LoginFlowTypes.SSO }?.ssoIdentityProvider, versions.isLoginAndRegistrationSupportedBySdk(), homeServerUrl, !versions.isSupportedBySdk() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/data/LoginFlowResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/data/LoginFlowResponse.kt index 54d38cd336..c333b3524e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/data/LoginFlowResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/data/LoginFlowResponse.kt @@ -18,7 +18,7 @@ package org.matrix.android.sdk.internal.auth.data import com.squareup.moshi.Json import com.squareup.moshi.JsonClass -import org.matrix.android.sdk.api.auth.data.IdentityProvider +import org.matrix.android.sdk.api.auth.data.SsoIdentityProvider @JsonClass(generateAdapter = true) internal data class LoginFlowResponse( @@ -43,5 +43,5 @@ internal data class LoginFlow( * See MSC #2858 */ @Json(name = "identity_providers") - val identityProvider: List? + val ssoIdentityProvider: List? ) diff --git a/vector/src/main/java/im/vector/app/features/login/AbstractSSOLoginFragment.kt b/vector/src/main/java/im/vector/app/features/login/AbstractSSOLoginFragment.kt index 085094be62..9b0a154100 100644 --- a/vector/src/main/java/im/vector/app/features/login/AbstractSSOLoginFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/AbstractSSOLoginFragment.kt @@ -84,7 +84,7 @@ abstract class AbstractSSOLoginFragment : AbstractLoginFragment() { private fun prefetchIfNeeded() { withState(loginViewModel) { state -> - if (state.loginMode.hasSso() && state.loginMode.ssoProviders().isNullOrEmpty()) { + if (state.loginMode.hasSso() && state.loginMode.ssoIdentityProviders().isNullOrEmpty()) { // in this case we can prefetch (not other cases for privacy concerns) prefetchUrl(state.getSsoUrl(null)) } diff --git a/vector/src/main/java/im/vector/app/features/login/LoginAction.kt b/vector/src/main/java/im/vector/app/features/login/LoginAction.kt index 9480df4108..745e9986a8 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginAction.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginAction.kt @@ -18,7 +18,7 @@ package im.vector.app.features.login import im.vector.app.core.platform.VectorViewModelAction import org.matrix.android.sdk.api.auth.data.Credentials -import org.matrix.android.sdk.api.auth.data.IdentityProvider +import org.matrix.android.sdk.api.auth.data.SsoIdentityProvider import org.matrix.android.sdk.api.auth.registration.RegisterThreePid import org.matrix.android.sdk.internal.network.ssl.Fingerprint @@ -61,7 +61,9 @@ sealed class LoginAction : VectorViewModelAction { object ResetResetPassword : ResetAction() // For the soft logout case - data class SetupSsoForSessionRecovery(val homeServerUrl: String, val deviceId: String, val identityProvider: List?) : LoginAction() + data class SetupSsoForSessionRecovery(val homeServerUrl: String, + val deviceId: String, + val ssoIdentityProvider: List?) : LoginAction() data class PostViewEvent(val viewEvent: LoginViewEvents) : LoginAction() diff --git a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt index 489b33abe9..10c5fd59a7 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt @@ -175,7 +175,7 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment() { if (state.loginMode is LoginMode.SsoAndPassword) { loginSocialLoginContainer.isVisible = true - loginSocialLoginButtons.identityProviders = state.loginMode.identityProviders + loginSocialLoginButtons.ssoIdentityProviders = state.loginMode.ssoIdentityProviders loginSocialLoginButtons.listener = object : SocialLoginButtonsView.InteractionListener { override fun onProviderSelected(id: String?) { openInCustomTab(state.getSsoUrl(id)) @@ -183,7 +183,7 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment() { } } else { loginSocialLoginContainer.isVisible = false - loginSocialLoginButtons.identityProviders = null + loginSocialLoginButtons.ssoIdentityProviders = null } } } diff --git a/vector/src/main/java/im/vector/app/features/login/LoginMode.kt b/vector/src/main/java/im/vector/app/features/login/LoginMode.kt index 5121bf39ba..14accefc00 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginMode.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginMode.kt @@ -18,21 +18,21 @@ package im.vector.app.features.login import android.os.Parcelable import kotlinx.android.parcel.Parcelize -import org.matrix.android.sdk.api.auth.data.IdentityProvider +import org.matrix.android.sdk.api.auth.data.SsoIdentityProvider sealed class LoginMode : Parcelable /** because persist state */ { @Parcelize object Unknown : LoginMode() @Parcelize object Password : LoginMode() - @Parcelize data class Sso(val identityProviders: List?) : LoginMode() - @Parcelize data class SsoAndPassword(val identityProviders: List?) : LoginMode() + @Parcelize data class Sso(val ssoIdentityProviders: List?) : LoginMode() + @Parcelize data class SsoAndPassword(val ssoIdentityProviders: List?) : LoginMode() @Parcelize object Unsupported : LoginMode() } -fun LoginMode.ssoProviders() : List? { +fun LoginMode.ssoIdentityProviders() : List? { return when (this) { - is LoginMode.Sso -> identityProviders - is LoginMode.SsoAndPassword -> identityProviders + is LoginMode.Sso -> ssoIdentityProviders + is LoginMode.SsoAndPassword -> ssoIdentityProviders else -> null } } diff --git a/vector/src/main/java/im/vector/app/features/login/LoginSignUpSignInSelectionFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginSignUpSignInSelectionFragment.kt index eb9b99c7ef..ec931f89a2 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginSignUpSignInSelectionFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginSignUpSignInSelectionFragment.kt @@ -53,11 +53,10 @@ class LoginSignUpSignInSelectionFragment @Inject constructor() : AbstractSSOLogi ServerType.Unknown -> Unit /* Should not happen */ } - val identityProviders = state.loginMode.ssoProviders() when (state.loginMode) { is LoginMode.SsoAndPassword -> { loginSignupSigninSignInSocialLoginContainer.isVisible = true - loginSignupSigninSocialLoginButtons.identityProviders = identityProviders + loginSignupSigninSocialLoginButtons.ssoIdentityProviders = state.loginMode.ssoIdentityProviders() loginSignupSigninSocialLoginButtons.listener = object : SocialLoginButtonsView.InteractionListener { override fun onProviderSelected(id: String?) { val url = withState(loginViewModel) { it.getSsoUrl(id) } @@ -68,7 +67,7 @@ class LoginSignUpSignInSelectionFragment @Inject constructor() : AbstractSSOLogi else -> { // SSO only is managed without container as well as No sso loginSignupSigninSignInSocialLoginContainer.isVisible = false - loginSignupSigninSocialLoginButtons.identityProviders = null + loginSignupSigninSocialLoginButtons.ssoIdentityProviders = null } } } diff --git a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt index e00e4065e1..70979f7a11 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt @@ -205,7 +205,7 @@ class LoginViewModel @AssistedInject constructor( setState { copy( signMode = SignMode.SignIn, - loginMode = LoginMode.Sso(action.identityProvider), + loginMode = LoginMode.Sso(action.ssoIdentityProvider), homeServerUrl = action.homeServerUrl, deviceId = action.deviceId ) diff --git a/vector/src/main/java/im/vector/app/features/login/SocialLoginButtonsView.kt b/vector/src/main/java/im/vector/app/features/login/SocialLoginButtonsView.kt index 89dfb8c7cb..5e5ea20d62 100644 --- a/vector/src/main/java/im/vector/app/features/login/SocialLoginButtonsView.kt +++ b/vector/src/main/java/im/vector/app/features/login/SocialLoginButtonsView.kt @@ -26,7 +26,7 @@ import android.widget.LinearLayout import androidx.core.view.children import com.google.android.material.button.MaterialButton import im.vector.app.R -import org.matrix.android.sdk.api.auth.data.IdentityProvider +import org.matrix.android.sdk.api.auth.data.SsoIdentityProvider class SocialLoginButtonsView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : LinearLayout(context, attrs, defStyle) { @@ -41,9 +41,9 @@ class SocialLoginButtonsView @JvmOverloads constructor(context: Context, attrs: MODE_CONTINUE, } - var identityProviders: List? = null + var ssoIdentityProviders: List? = null set(newProviders) { - if (newProviders != identityProviders) { + if (newProviders != ssoIdentityProviders) { field = newProviders update() } @@ -65,7 +65,7 @@ class SocialLoginButtonsView @JvmOverloads constructor(context: Context, attrs: cachedViews[it.getTag(R.id.loginSignupSigninSocialLoginButtons)?.toString() ?: ""] = it } removeAllViews() - if (identityProviders.isNullOrEmpty()) { + if (ssoIdentityProviders.isNullOrEmpty()) { // Put a default sign in with sso button MaterialButton(context, null, R.attr.materialButtonOutlinedStyle).apply { transformationMethod = null @@ -81,7 +81,7 @@ class SocialLoginButtonsView @JvmOverloads constructor(context: Context, attrs: return } - identityProviders?.forEach { identityProvider -> + ssoIdentityProviders?.forEach { identityProvider -> // Use some heuristic to render buttons according to branding guidelines val button: MaterialButton = cachedViews[identityProvider.id] ?: when (identityProvider.id) { @@ -101,6 +101,7 @@ class SocialLoginButtonsView @JvmOverloads constructor(context: Context, attrs: MaterialButton(context, null, R.attr.vctr_social_login_button_twitter_style) } else -> { + // TODO Use iconUrl MaterialButton(context, null, R.attr.materialButtonStyle).apply { transformationMethod = null textAlignment = View.TEXT_ALIGNMENT_CENTER @@ -131,13 +132,13 @@ class SocialLoginButtonsView @JvmOverloads constructor(context: Context, attrs: clipChildren = false @SuppressLint("SetTextI18n") if (isInEditMode) { - identityProviders = listOf( - IdentityProvider("google", "Google", null), - IdentityProvider("facebook", "Facebook", null), - IdentityProvider("apple", "Apple", null), - IdentityProvider("github", "GitHub", null), - IdentityProvider("twitter", "Twitter", null), - IdentityProvider("Custom_pro", "SSO", null) + ssoIdentityProviders = listOf( + SsoIdentityProvider("google", "Google", null), + SsoIdentityProvider("facebook", "Facebook", null), + SsoIdentityProvider("apple", "Apple", null), + SsoIdentityProvider("github", "GitHub", null), + SsoIdentityProvider("twitter", "Twitter", null), + SsoIdentityProvider("Custom_pro", "SSO", null) ) } val typedArray = context.theme.obtainStyledAttributes(attrs, R.styleable.SocialLoginButtonsView, 0, 0) diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutFragment.kt b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutFragment.kt index 0fc1076f1d..b85c9a8763 100644 --- a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutFragment.kt +++ b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutFragment.kt @@ -59,14 +59,14 @@ class SoftLogoutFragment @Inject constructor( loginViewModel.handle(LoginAction.SetupSsoForSessionRecovery( softLogoutViewState.homeServerUrl, softLogoutViewState.deviceId, - mode.identityProviders + mode.ssoIdentityProviders )) } is LoginMode.Sso -> { loginViewModel.handle(LoginAction.SetupSsoForSessionRecovery( softLogoutViewState.homeServerUrl, softLogoutViewState.deviceId, - mode.identityProviders + mode.ssoIdentityProviders )) } LoginMode.Unsupported -> {