From 5b8215a356c190739db01044af585dc31071732d Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 1 Feb 2021 16:36:38 +0100 Subject: [PATCH] Support SSO provider brand + UI fixes --- .../sdk/api/auth/data/SsoIdentityProvider.kt | 23 ++++++--- .../internal/auth/data/LoginFlowResponse.kt | 10 +++- .../features/login/SocialLoginButtonsView.kt | 30 +++++++----- .../main/res/drawable/ic_social_gitlab.xml | 48 +++++++++++++++++++ vector/src/main/res/layout/fragment_login.xml | 1 - ...fragment_login_signup_signin_selection.xml | 1 - vector/src/main/res/values/attrs.xml | 1 + .../main/res/values/styles_social_login.xml | 26 ++++++++-- vector/src/main/res/values/theme_dark.xml | 1 + vector/src/main/res/values/theme_light.xml | 1 + 10 files changed, 115 insertions(+), 27 deletions(-) create mode 100644 vector/src/main/res/drawable/ic_social_gitlab.xml diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SsoIdentityProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SsoIdentityProvider.kt index 6759c59237..cfaf74ce24 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SsoIdentityProvider.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SsoIdentityProvider.kt @@ -38,15 +38,24 @@ data class SsoIdentityProvider( * If present then it must be an HTTPS URL to an image resource. * This should be hosted by the homeserver service provider to not leak the client's IP address unnecessarily. */ - @Json(name = "icon") val iconUrl: String? + @Json(name = "icon") val iconUrl: String?, + + /** + * The `brand` field is **optional**. It allows the client to style the login + * button to suit a particular brand. It should be a string matching the + * "Common namespaced identifier grammar" as defined in + * [MSC2758](https://github.com/matrix-org/matrix-doc/pull/2758). + */ + @Json(name = "brand") val brand: String? + ) : Parcelable { companion object { - // Not really defined by the spec, but we may define some ids here - const val ID_GOOGLE = "google" - const val ID_GITHUB = "github" - const val ID_APPLE = "apple" - const val ID_FACEBOOK = "facebook" - const val ID_TWITTER = "twitter" + const val BRAND_GOOGLE = "org.matrix.google" + const val BRAND_GITHUB = "org.matrix.github" + const val BRAND_APPLE = "org.matrix.apple" + const val BRAND_FACEBOOK = "org.matrix.facebook" + const val BRAND_TWITTER = "org.matrix.twitter" + const val BRAND_GITLAB = "org.matrix.gitlab" } } 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 2b26115f30..112f7a1078 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 @@ -43,5 +43,11 @@ internal data class LoginFlow( * See MSC #2858 */ @Json(name = "org.matrix.msc2858.identity_providers") - val ssoIdentityProvider: List? -) + val _devSsoIdentityProvider: List? = null, + + @Json(name = "identity_providers") + val _ssoIdentityProvider: List? = null, + +) { + val ssoIdentityProvider = _ssoIdentityProvider ?: _devSsoIdentityProvider +} 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 9290479a7a..cffe44d0f0 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 @@ -83,25 +83,28 @@ class SocialLoginButtonsView @JvmOverloads constructor(context: Context, attrs: ssoIdentityProviders?.forEach { identityProvider -> // Use some heuristic to render buttons according to branding guidelines val button: MaterialButton = cachedViews[identityProvider.id] - ?: when (identityProvider.id) { - SsoIdentityProvider.ID_GOOGLE -> { + ?: when (identityProvider.brand) { + SsoIdentityProvider.BRAND_GOOGLE -> { MaterialButton(context, null, R.attr.vctr_social_login_button_google_style) } - SsoIdentityProvider.ID_GITHUB -> { + SsoIdentityProvider.BRAND_GITHUB -> { MaterialButton(context, null, R.attr.vctr_social_login_button_github_style) } - SsoIdentityProvider.ID_APPLE -> { + SsoIdentityProvider.BRAND_APPLE -> { MaterialButton(context, null, R.attr.vctr_social_login_button_apple_style) } - SsoIdentityProvider.ID_FACEBOOK -> { + SsoIdentityProvider.BRAND_FACEBOOK -> { MaterialButton(context, null, R.attr.vctr_social_login_button_facebook_style) } - SsoIdentityProvider.ID_TWITTER -> { + SsoIdentityProvider.BRAND_TWITTER -> { MaterialButton(context, null, R.attr.vctr_social_login_button_twitter_style) } + SsoIdentityProvider.BRAND_GITLAB -> { + MaterialButton(context, null, R.attr.vctr_social_login_button_gitlab_style) + } else -> { // TODO Use iconUrl - MaterialButton(context, null, R.attr.materialButtonStyle).apply { + MaterialButton(context, null, R.attr.materialButtonOutlinedStyle).apply { transformationMethod = null textAlignment = View.TEXT_ALIGNMENT_CENTER } @@ -131,12 +134,13 @@ class SocialLoginButtonsView @JvmOverloads constructor(context: Context, attrs: clipChildren = false if (isInEditMode) { ssoIdentityProviders = listOf( - SsoIdentityProvider(SsoIdentityProvider.ID_GOOGLE, "Google", null), - SsoIdentityProvider(SsoIdentityProvider.ID_FACEBOOK, "Facebook", null), - SsoIdentityProvider(SsoIdentityProvider.ID_APPLE, "Apple", null), - SsoIdentityProvider(SsoIdentityProvider.ID_GITHUB, "GitHub", null), - SsoIdentityProvider(SsoIdentityProvider.ID_TWITTER, "Twitter", null), - SsoIdentityProvider("Custom_pro", "SSO", null) + SsoIdentityProvider("Google", "Google", null, SsoIdentityProvider.BRAND_GOOGLE), + SsoIdentityProvider("Facebook", "Facebook",null, SsoIdentityProvider.BRAND_FACEBOOK), + SsoIdentityProvider("Apple", "Apple",null, SsoIdentityProvider.BRAND_APPLE), + SsoIdentityProvider("GitHub", "GitHub",null, SsoIdentityProvider.BRAND_GITHUB), + SsoIdentityProvider("Twitter", "Twitter", null, SsoIdentityProvider.BRAND_TWITTER), + SsoIdentityProvider("Gitlab", "Gitlab", null, SsoIdentityProvider.BRAND_GITLAB), + SsoIdentityProvider("Custom_pro", "SSO", null, null) ) } val typedArray = context.theme.obtainStyledAttributes(attrs, R.styleable.SocialLoginButtonsView, 0, 0) diff --git a/vector/src/main/res/drawable/ic_social_gitlab.xml b/vector/src/main/res/drawable/ic_social_gitlab.xml new file mode 100644 index 0000000000..9399f6448a --- /dev/null +++ b/vector/src/main/res/drawable/ic_social_gitlab.xml @@ -0,0 +1,48 @@ + + + + + + + + + diff --git a/vector/src/main/res/layout/fragment_login.xml b/vector/src/main/res/layout/fragment_login.xml index da41878365..1740d26b3b 100644 --- a/vector/src/main/res/layout/fragment_login.xml +++ b/vector/src/main/res/layout/fragment_login.xml @@ -143,7 +143,6 @@ android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical" - android:padding="8dp" android:visibility="gone" tools:visibility="visible"> diff --git a/vector/src/main/res/layout/fragment_login_signup_signin_selection.xml b/vector/src/main/res/layout/fragment_login_signup_signin_selection.xml index 097e5c1f52..56d4e37f1e 100644 --- a/vector/src/main/res/layout/fragment_login_signup_signin_selection.xml +++ b/vector/src/main/res/layout/fragment_login_signup_signin_selection.xml @@ -88,7 +88,6 @@ android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical" - android:padding="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/vector/src/main/res/values/attrs.xml b/vector/src/main/res/values/attrs.xml index 51d140ebcf..41b8080fc0 100644 --- a/vector/src/main/res/values/attrs.xml +++ b/vector/src/main/res/values/attrs.xml @@ -46,6 +46,7 @@ + diff --git a/vector/src/main/res/values/styles_social_login.xml b/vector/src/main/res/values/styles_social_login.xml index 796965cee1..3ad7fbb989 100644 --- a/vector/src/main/res/values/styles_social_login.xml +++ b/vector/src/main/res/values/styles_social_login.xml @@ -1,17 +1,20 @@ - + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/values/theme_dark.xml b/vector/src/main/res/values/theme_dark.xml index 86fbb57608..c31fc8240b 100644 --- a/vector/src/main/res/values/theme_dark.xml +++ b/vector/src/main/res/values/theme_dark.xml @@ -200,6 +200,7 @@ @style/WidgetButtonSocialLogin.Facebook.Dark @style/WidgetButtonSocialLogin.Twitter.Dark @style/WidgetButtonSocialLogin.Apple.Dark + @style/WidgetButtonSocialLogin.Gitlab.Dark @android:color/transparent diff --git a/vector/src/main/res/values/theme_light.xml b/vector/src/main/res/values/theme_light.xml index f174bcf758..56faaeb325 100644 --- a/vector/src/main/res/values/theme_light.xml +++ b/vector/src/main/res/values/theme_light.xml @@ -202,6 +202,7 @@ @style/WidgetButtonSocialLogin.Facebook.Light @style/WidgetButtonSocialLogin.Twitter.Light @style/WidgetButtonSocialLogin.Apple.Light + @style/WidgetButtonSocialLogin.Gitlab.Light @color/black_alpha