Rework login screen before release

This commit is contained in:
Benoit Marty 2019-07-11 14:34:16 +02:00
parent 80a61cf6b5
commit f65becf7c0
10 changed files with 69 additions and 28 deletions

View File

@ -19,10 +19,12 @@ package im.vector.riotx.core.extensions
import android.text.Spannable import android.text.Spannable
import android.text.SpannableString import android.text.SpannableString
import android.text.style.ForegroundColorSpan import android.text.style.ForegroundColorSpan
import android.text.style.UnderlineSpan
import android.widget.TextView import android.widget.TextView
import androidx.annotation.AttrRes import androidx.annotation.AttrRes
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.core.view.isVisible import androidx.core.view.isVisible
import im.vector.riotx.R
import im.vector.riotx.features.themes.ThemeUtils import im.vector.riotx.features.themes.ThemeUtils
@ -43,11 +45,13 @@ fun TextView.setTextOrHide(newText: CharSequence?, hideWhenBlank: Boolean = true
* Set text with a colored part * Set text with a colored part
* @param fullTextRes the resource id of the full text. Value MUST contains a parameter for string, which will be replaced by the colored part * @param fullTextRes the resource id of the full text. Value MUST contains a parameter for string, which will be replaced by the colored part
* @param coloredTextRes the resource id of the colored part of the text * @param coloredTextRes the resource id of the colored part of the text
* @param colorAttribute attribute of the color * @param colorAttribute attribute of the color. Default to colorAccent
* @param underline true to also underline the text. Default to false
*/ */
fun TextView.setTextWithColoredPart(@StringRes fullTextRes: Int, fun TextView.setTextWithColoredPart(@StringRes fullTextRes: Int,
@StringRes coloredTextRes: Int, @StringRes coloredTextRes: Int,
@AttrRes colorAttribute: Int) { @AttrRes colorAttribute: Int = R.attr.colorAccent,
underline: Boolean = false) {
val coloredPart = resources.getString(coloredTextRes) val coloredPart = resources.getString(coloredTextRes)
// Insert colored part into the full text // Insert colored part into the full text
val fullText = resources.getString(fullTextRes, coloredPart) val fullText = resources.getString(fullTextRes, coloredPart)
@ -60,5 +64,8 @@ fun TextView.setTextWithColoredPart(@StringRes fullTextRes: Int,
text = SpannableString(fullText) text = SpannableString(fullText)
.apply { .apply {
setSpan(foregroundSpan, index, index + coloredPart.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) setSpan(foregroundSpan, index, index + coloredPart.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
if (underline) {
setSpan(UnderlineSpan(), index, index + coloredPart.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
}
} }
} }

View File

@ -45,12 +45,7 @@ fun showDisclaimerDialog(activity: Activity) {
val textView = (dialogLayout as ViewGroup).findViewById<TextView>(R.id.dialogDisclaimerContentLine2) val textView = (dialogLayout as ViewGroup).findViewById<TextView>(R.id.dialogDisclaimerContentLine2)
@Suppress("ConstantConditionIf") @Suppress("ConstantConditionIf")
if (BuildConfig.FLAVOR == "gplay") { if (BuildConfig.FLAVOR == "gplay") {
textView.setTextWithColoredPart(R.string.alpha_disclaimer_content_line_2_gplay, R.string.alpha_disclaimer_content_line_2_gplay_colored_part)
textView.setTextWithColoredPart(
R.string.alpha_disclaimer_content_line_2_gplay,
R.string.alpha_disclaimer_content_line_2_gplay_colored_part,
R.attr.colorAccent
)
textView.setOnClickListener { textView.setOnClickListener {
openPlayStore(activity) openPlayStore(activity)

View File

@ -19,8 +19,8 @@ package im.vector.riotx.features.login
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.core.view.isVisible
import arrow.core.Try import arrow.core.Try
import com.jakewharton.rxbinding2.widget.RxTextView import com.jakewharton.rxbinding2.widget.RxTextView
import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.MatrixCallback
@ -31,8 +31,10 @@ import im.vector.riotx.R
import im.vector.riotx.core.di.ActiveSessionHolder import im.vector.riotx.core.di.ActiveSessionHolder
import im.vector.riotx.core.di.ScreenComponent import im.vector.riotx.core.di.ScreenComponent
import im.vector.riotx.core.extensions.configureAndStart import im.vector.riotx.core.extensions.configureAndStart
import im.vector.riotx.core.extensions.setTextWithColoredPart
import im.vector.riotx.core.extensions.showPassword import im.vector.riotx.core.extensions.showPassword
import im.vector.riotx.core.platform.VectorBaseActivity import im.vector.riotx.core.platform.VectorBaseActivity
import im.vector.riotx.core.utils.openUrlInExternalBrowser
import im.vector.riotx.features.disclaimer.showDisclaimerDialog import im.vector.riotx.features.disclaimer.showDisclaimerDialog
import im.vector.riotx.features.home.HomeActivity import im.vector.riotx.features.home.HomeActivity
import im.vector.riotx.features.notifications.PushRuleTriggerListener import im.vector.riotx.features.notifications.PushRuleTriggerListener
@ -61,11 +63,20 @@ class LoginActivity : VectorBaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login) setContentView(R.layout.activity_login)
setupNotice()
setupAuthButton() setupAuthButton()
setupPasswordReveal() setupPasswordReveal()
homeServerField.setText(DEFAULT_HOME_SERVER_URI) homeServerField.setText(DEFAULT_HOME_SERVER_URI)
} }
private fun setupNotice() {
riotx_no_registration_notice.setTextWithColoredPart(R.string.riotx_no_registration_notice, R.string.riotx_no_registration_notice_colored_part)
riotx_no_registration_notice.setOnClickListener {
openUrlInExternalBrowser(this@LoginActivity, "https://about.riot.im/downloads")
}
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
@ -85,7 +96,8 @@ class LoginActivity : VectorBaseActivity() {
} }
private fun authenticateWith(homeServerConnectionConfig: HomeServerConnectionConfig, login: String, password: String) { private fun authenticateWith(homeServerConnectionConfig: HomeServerConnectionConfig, login: String, password: String) {
progressBar.visibility = View.VISIBLE progressBar.isVisible = true
touchArea.isVisible = true
authenticator.authenticate(homeServerConnectionConfig, login, password, object : MatrixCallback<Session> { authenticator.authenticate(homeServerConnectionConfig, login, password, object : MatrixCallback<Session> {
override fun onSuccess(data: Session) { override fun onSuccess(data: Session) {
activeSessionHolder.setActiveSession(data) activeSessionHolder.setActiveSession(data)
@ -94,7 +106,8 @@ class LoginActivity : VectorBaseActivity() {
} }
override fun onFailure(failure: Throwable) { override fun onFailure(failure: Throwable) {
progressBar.visibility = View.GONE progressBar.isVisible = false
touchArea.isVisible = false
Toast.makeText(this@LoginActivity, "Authenticate failure: $failure", Toast.LENGTH_LONG).show() Toast.makeText(this@LoginActivity, "Authenticate failure: $failure", Toast.LENGTH_LONG).show()
} }
}) })

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

View File

@ -16,25 +16,32 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:paddingStart="24dp" android:padding="24dp">
android:paddingLeft="24dp"
android:paddingTop="24dp"
android:paddingEnd="24dp"
android:paddingRight="24dp"
android:paddingBottom="80dp">
<ImageView <ImageView
android:id="@+id/logoImageView" android:id="@+id/logoImageView"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="100dp" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:src="@drawable/riot_splash_0_blue" /> android:src="@drawable/riotx_logo" />
<TextView
android:id="@+id/riotx_no_registration_notice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="32dp"
android:gravity="center"
android:padding="8dp"
android:text="@string/riotx_no_registration_notice"
android:textColor="?vctr_notice_secondary"
android:textSize="15sp" />
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
style="@style/VectorTextInputLayout" style="@style/VectorTextInputLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:layout_marginTop="14dp"
android:hint="@string/auth_user_name_placeholder"> android:hint="@string/auth_user_name_placeholder">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
@ -43,17 +50,18 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:inputType="textEmailAddress" android:inputType="textEmailAddress"
android:maxLines="1" /> android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:layout_marginTop="16dp">
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
style="@style/VectorTextInputLayout" style="@style/VectorTextInputLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:hint="@string/auth_password_placeholder"> android:hint="@string/auth_password_placeholder">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
@ -66,6 +74,7 @@
android:paddingEnd="48dp" android:paddingEnd="48dp"
android:paddingRight="48dp" android:paddingRight="48dp"
tools:ignore="RtlSymmetry" /> tools:ignore="RtlSymmetry" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<ImageView <ImageView
@ -73,7 +82,7 @@
android:layout_width="@dimen/layout_touch_size" android:layout_width="@dimen/layout_touch_size"
android:layout_height="@dimen/layout_touch_size" android:layout_height="@dimen/layout_touch_size"
android:layout_gravity="end" android:layout_gravity="end"
android:layout_marginTop="24dp" android:layout_marginTop="8dp"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:scaleType="center" android:scaleType="center"
android:src="@drawable/ic_eye_black" android:src="@drawable/ic_eye_black"
@ -86,7 +95,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:hint="@string/auth_home_server"> android:hint="@string/settings_home_server">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/homeServerField" android:id="@+id/homeServerField"
@ -94,30 +103,43 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:inputType="textUri" android:inputType="textUri"
android:maxLines="1" /> android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/authenticateButton" android:id="@+id/authenticateButton"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="end" android:layout_gravity="end"
android:layout_marginTop="@dimen/layout_vertical_margin" android:layout_marginTop="22dp"
android:text="@string/auth_login" /> android:text="@string/auth_login" />
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
<View
android:id="@+id/touchArea"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="?vctr_waiting_background_color"
android:clickable="true"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ProgressBar <ProgressBar
android:id="@+id/progressBar" android:id="@+id/progressBar"
android:layout_width="60dp" android:layout_width="60dp"
android:layout_height="60dp" android:layout_height="60dp"
android:layout_centerInParent="true"
android:layout_margin="8dp" android:layout_margin="8dp"
android:visibility="gone" android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent"
tools:visibility="visible" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -16,5 +16,9 @@
<string name="edited_suffix">"(edited)"</string> <string name="edited_suffix">"(edited)"</string>
<!-- param will be replaced by the value of riotx_no_registration_notice_colored_part -->
<string name="riotx_no_registration_notice">%1$s to create an account.</string>
<string name="riotx_no_registration_notice_colored_part">Use the old app</string>
</resources> </resources>