diff --git a/briar-android/build.gradle b/briar-android/build.gradle index 8e043ff7f8f0fe72b9316f49b9bf33005e86b220..756b2da587dbdff195733d15cbb150513597e413 100644 --- a/briar-android/build.gradle +++ b/briar-android/build.gradle @@ -6,8 +6,9 @@ dependencies { compile fileTree(dir: '../briar-core/libs', include: '*.jar') compile project(':briar-core') compile fileTree(dir: 'libs', include: '*.jar') - compile 'com.android.support:design:23.1.1' - compile 'com.android.support:recyclerview-v7:23.1.1' + compile "com.android.support:support-v4:23.1.1" + compile "com.android.support:appcompat-v7:23.1.1" + compile "com.android.support:design:23.1.1" } android { diff --git a/briar-android/res/layout/activity_setup.xml b/briar-android/res/layout/activity_setup.xml index 0285356113c9568c3692836035342bb512190940..f484946166b1e8e3a1abc6deba9700aa394ea669 100644 --- a/briar-android/res/layout/activity_setup.xml +++ b/briar-android/res/layout/activity_setup.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> @@ -23,12 +24,19 @@ android:text="@string/choose_nickname" android:textSize="18sp"/> - <EditText - android:id="@+id/nickname_entry" + <android.support.design.widget.TextInputLayout + android:id="@+id/nickname_entry_wrapper" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="text|textCapWords" - android:maxLines="1"/> + app:errorEnabled="true"> + + <EditText + android:id="@+id/nickname_entry" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="text|textCapWords" + android:maxLines="1"/> + </android.support.design.widget.TextInputLayout> <TextView android:layout_width="wrap_content" @@ -37,12 +45,19 @@ android:text="@string/choose_password" android:textSize="18sp"/> - <EditText - android:id="@+id/password_entry" + <android.support.design.widget.TextInputLayout + android:id="@+id/password_entry_wrapper" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="textPassword" - android:maxLines="1"/> + app:errorEnabled="true"> + + <EditText + android:id="@+id/password_entry" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="textPassword" + android:maxLines="1"/> + </android.support.design.widget.TextInputLayout> <TextView android:layout_width="wrap_content" @@ -51,12 +66,19 @@ android:text="@string/confirm_password" android:textSize="18sp"/> - <EditText - android:id="@+id/password_confirm" + <android.support.design.widget.TextInputLayout + android:id="@+id/password_confirm_wrapper" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="textPassword" - android:maxLines="1"/> + app:errorEnabled="true"> + + <EditText + android:id="@+id/password_confirm" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="textPassword" + android:maxLines="1"/> + </android.support.design.widget.TextInputLayout> <org.briarproject.android.util.StrengthMeter android:id="@+id/strength_meter" diff --git a/briar-android/src/org/briarproject/android/SetupActivity.java b/briar-android/src/org/briarproject/android/SetupActivity.java index 56d61e8c27130eeea24a9d29f6319c415e8a50c6..e7940b0ffead77b43154a13db4fbdce000f4a365 100644 --- a/briar-android/src/org/briarproject/android/SetupActivity.java +++ b/briar-android/src/org/briarproject/android/SetupActivity.java @@ -4,6 +4,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; +import android.support.design.widget.TextInputLayout; import android.text.Editable; import android.text.TextWatcher; import android.view.KeyEvent; @@ -17,6 +18,7 @@ import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import org.briarproject.R; +import org.briarproject.android.util.AndroidUtils; import org.briarproject.android.util.StrengthMeter; import org.briarproject.api.android.ReferenceManager; import org.briarproject.api.crypto.CryptoComponent; @@ -55,6 +57,9 @@ OnEditorActionListener { @Inject @CryptoExecutor private Executor cryptoExecutor; @Inject private PasswordStrengthEstimator strengthEstimator; + @InjectView(R.id.nickname_entry_wrapper) TextInputLayout nicknameEntryWrapper; + @InjectView(R.id.password_entry_wrapper) TextInputLayout passwordEntryWrapper; + @InjectView(R.id.password_confirm_wrapper) TextInputLayout passwordConfirmationWrapper; @InjectView(R.id.nickname_entry) EditText nicknameEntry; @InjectView(R.id.password_entry) EditText passwordEntry; @InjectView(R.id.password_confirm) EditText passwordConfirmation; @@ -99,7 +104,7 @@ OnEditorActionListener { private void enableOrDisableContinueButton() { if (progress == null) return; // Not created yet - if (passwordEntry.getText().length() > 0 && passwordEntry.hasFocus()) + if (passwordEntry.getText().length() > 0) strengthMeter.setVisibility(VISIBLE); else strengthMeter.setVisibility(INVISIBLE); String nickname = nicknameEntry.getText().toString(); @@ -109,12 +114,12 @@ OnEditorActionListener { boolean passwordsMatch = firstPassword.equals(secondPassword); float strength = strengthEstimator.estimateStrength(firstPassword); strengthMeter.setStrength(strength); - if (nicknameLength > MAX_AUTHOR_NAME_LENGTH) - nicknameEntry.setError(getString(R.string.name_too_long)); - if (firstPassword.length() > 0 && strength < WEAK) - passwordEntry.setError(getString(R.string.password_too_weak)); - if (secondPassword.length() > 0 && !passwordsMatch) - passwordConfirmation.setError(getString(R.string.passwords_do_not_match)); + AndroidUtils.setError(nicknameEntryWrapper, getString(R.string.name_too_long), + nicknameLength > MAX_AUTHOR_NAME_LENGTH); + AndroidUtils.setError(passwordEntryWrapper, getString(R.string.password_too_weak), + firstPassword.length() > 0 && strength < WEAK); + AndroidUtils.setError(passwordConfirmationWrapper, getString(R.string.passwords_do_not_match), + secondPassword.length() > 0 && !passwordsMatch); createAccountButton.setEnabled(nicknameLength > 0 && nicknameLength <= MAX_AUTHOR_NAME_LENGTH && passwordsMatch && strength >= WEAK); diff --git a/briar-android/src/org/briarproject/android/util/AndroidUtils.java b/briar-android/src/org/briarproject/android/util/AndroidUtils.java index 5923ba7e41cfbe024ba4d125d83272a31c8a4a73..abbafafd37992976aab2302a7d31f4b60692606e 100644 --- a/briar-android/src/org/briarproject/android/util/AndroidUtils.java +++ b/briar-android/src/org/briarproject/android/util/AndroidUtils.java @@ -2,6 +2,7 @@ package org.briarproject.android.util; import android.annotation.SuppressLint; import android.os.Build; +import android.support.design.widget.TextInputLayout; import java.util.ArrayList; import java.util.Arrays; @@ -23,4 +24,12 @@ public class AndroidUtils { } return Collections.unmodifiableList(abis); } + + public static void setError(TextInputLayout til, String error, boolean condition) { + if (condition) { + if (til.getError() == null) + til.setError(error); + } else + til.setError(null); + } }