diff --git a/briar-android/res/layout/activity_password.xml b/briar-android/res/layout/activity_password.xml index dff9612aad563a5cf197bf76ae9a8cd18ac9565a..bda170a9432446c6bf6394e5c19a5f1650ffac6a 100644 --- a/briar-android/res/layout/activity_password.xml +++ b/briar-android/res/layout/activity_password.xml @@ -1,65 +1,81 @@ <?xml version="1.0" encoding="utf-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" +<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" - android:orientation="vertical" - android:paddingBottom="@dimen/margin_activity_vertical" - android:paddingEnd="@dimen/margin_activity_horizontal" - android:paddingRight="@dimen/margin_activity_horizontal" - android:paddingStart="@dimen/margin_activity_horizontal" - android:paddingLeft="@dimen/margin_activity_horizontal" - android:paddingTop="@dimen/margin_activity_vertical"> + android:layout_height="match_parent"> - <TextView - android:id="@+id/title_password" - style="@style/BriarTextTitle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerHorizontal="true" - android:padding="@dimen/margin_large" - android:text="@string/enter_password" /> - - <EditText - android:id="@+id/edit_password" + <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_below="@id/title_password" - android:hint="@string/password_hint" - android:imeOptions="actionDone" - android:inputType="textPassword" - android:maxLines="1" /> + android:orientation="vertical" + android:paddingBottom="@dimen/margin_activity_vertical" + android:paddingEnd="@dimen/margin_activity_horizontal" + android:paddingRight="@dimen/margin_activity_horizontal" + android:paddingStart="@dimen/margin_activity_horizontal" + android:paddingLeft="@dimen/margin_activity_horizontal" + android:paddingTop="@dimen/margin_activity_vertical"> - <Button - android:id="@+id/btn_sign_in" - style="@style/BriarButton.Default" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_below="@id/edit_password" - android:layout_marginTop="@dimen/margin_xlarge" - android:onClick="onSignInClick" - android:text="@string/sign_in_button" /> + <TextView + android:id="@+id/title_password" + style="@style/BriarTextTitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerHorizontal="true" + android:padding="@dimen/margin_large" + android:text="@string/enter_password" /> - <ProgressBar - android:id="@+id/progress_wheel" - style="?android:attr/progressBarStyleInverse" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignTop="@id/btn_sign_in" - android:layout_alignBottom="@id/btn_sign_in" - android:layout_centerHorizontal="true" - android:gravity="center" - android:visibility="invisible" /> + <android.support.design.widget.TextInputLayout + android:id="@+id/password_layout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_centerHorizontal="true" + android:layout_below="@id/title_password" + app:errorEnabled="true"> - <TextView - style="@style/BriarTextBody" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_below="@id/btn_sign_in" - android:layout_centerHorizontal="true" - android:layout_marginTop="@dimen/margin_large" - android:clickable="true" - android:onClick="onForgottenPasswordClick" - android:text="@string/forgotten_password" - android:textColor="?android:attr/textColorLink" /> + <EditText + android:id="@+id/edit_password" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:imeOptions="actionDone" + android:inputType="textPassword" + android:maxLines="1" /> + + </android.support.design.widget.TextInputLayout> + + <Button + android:id="@+id/btn_sign_in" + style="@style/BriarButton.Default" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/password_layout" + android:layout_marginTop="@dimen/margin_medium" + android:onClick="onSignInClick" + android:text="@string/sign_in_button" /> + + <ProgressBar + android:id="@+id/progress_wheel" + style="?android:attr/progressBarStyleInverse" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignTop="@id/btn_sign_in" + android:layout_alignBottom="@id/btn_sign_in" + android:layout_centerHorizontal="true" + android:gravity="center" + android:visibility="invisible" /> + + <TextView + style="@style/BriarTextBody" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/btn_sign_in" + android:layout_centerHorizontal="true" + android:layout_marginTop="@dimen/margin_large" + android:clickable="true" + android:onClick="onForgottenPasswordClick" + android:text="@string/forgotten_password" + android:textColor="?android:attr/textColorLink" /> + + </RelativeLayout> -</RelativeLayout> \ No newline at end of file +</ScrollView> \ No newline at end of file diff --git a/briar-android/res/values/color.xml b/briar-android/res/values/color.xml index 0ecc0f1ba7ad2565ad31c956d2d8673066342b9a..28cddbd4f2ce28ce41d4cc2ba7230485bba44135 100644 --- a/briar-android/res/values/color.xml +++ b/briar-android/res/values/color.xml @@ -17,7 +17,7 @@ <color name="briar_primary">#2D3E50</color> <color name="briar_primary_dark">#0f1720</color> - <color name="briar_text_link">#2D3E50</color> + <color name="briar_text_link">#75ab0d</color> <color name="briar_green_light">#95d220</color> <color name="briar_green_dark">#75ab0d</color> <color name="briar_text_primary">#333333</color> diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml index db7f2bfc4c1be306c8c2a197a441f760a8cdb141..4934dceabe03d48d78932a90e66a513251550e4b 100644 --- a/briar-android/res/values/strings.xml +++ b/briar-android/res/values/strings.xml @@ -19,7 +19,7 @@ <string name="yes">Yes</string> <string name="no">No</string> <string name="forgotten_password">I have forgotten my password</string> - <string name="try_again">Wrong password, try again:</string> + <string name="try_again">Wrong password, try again!</string> <string name="sign_in_button">Sign In</string> <string name="startup_failed_notification_title">Briar could not start</string> <string name="startup_failed_notification_text">You may need to reinstall Briar.</string> diff --git a/briar-android/src/org/briarproject/android/BaseActivity.java b/briar-android/src/org/briarproject/android/BaseActivity.java index f6b3641f3cef7f9f93c496d3d72f246fc82826be..a36252747158257bfb15dc3144089c7b878c2fbe 100644 --- a/briar-android/src/org/briarproject/android/BaseActivity.java +++ b/briar-android/src/org/briarproject/android/BaseActivity.java @@ -5,6 +5,7 @@ import android.content.SharedPreferences; import android.content.res.Configuration; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import android.view.View; import android.view.inputmethod.InputMethodManager; import com.google.inject.Inject; @@ -31,6 +32,7 @@ import roboguice.util.RoboContext; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.inputmethod.InputMethodManager.HIDE_IMPLICIT_ONLY; +import static android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT; import static org.briarproject.android.TestingConstants.PREVENT_SCREENSHOTS; public abstract class BaseActivity extends AppCompatActivity @@ -155,8 +157,19 @@ public abstract class BaseActivity extends AppCompatActivity gotoAndFinish(classInstance, Integer.MIN_VALUE); } - protected void hideSoftKeyboard() { + protected void toggleSoftKeyboard() { Object o = getSystemService(INPUT_METHOD_SERVICE); ((InputMethodManager) o).toggleSoftInput(HIDE_IMPLICIT_ONLY, 0); } + + protected void showSoftKeyboard(View view) { + Object o = getSystemService(INPUT_METHOD_SERVICE); + ((InputMethodManager) o).showSoftInput(view, SHOW_IMPLICIT); + } + + protected void hideSoftKeyboard(View view) { + Object o = getSystemService(INPUT_METHOD_SERVICE); + ((InputMethodManager) o).hideSoftInputFromWindow(view.getWindowToken(), + 0); + } } diff --git a/briar-android/src/org/briarproject/android/PasswordActivity.java b/briar-android/src/org/briarproject/android/PasswordActivity.java index fed1a6201a97fff1dbc528feeeddb54348742b14..353cb0953623da46f5e70557db19c9b60c0c191d 100644 --- a/briar-android/src/org/briarproject/android/PasswordActivity.java +++ b/briar-android/src/org/briarproject/android/PasswordActivity.java @@ -4,7 +4,9 @@ import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; +import android.support.design.widget.TextInputLayout; import android.text.Editable; +import android.text.TextWatcher; import android.view.KeyEvent; import android.view.View; import android.widget.Button; @@ -14,6 +16,7 @@ import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import org.briarproject.R; +import org.briarproject.android.util.AndroidUtils; import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.crypto.CryptoExecutor; import org.briarproject.api.crypto.SecretKey; @@ -36,6 +39,7 @@ public class PasswordActivity extends BaseActivity { private Button signInButton; private ProgressBar progress; private TextView title; + private TextInputLayout input; private EditText password; private byte[] encrypted; @@ -59,16 +63,31 @@ public class PasswordActivity extends BaseActivity { signInButton = (Button) findViewById(R.id.btn_sign_in); progress = (ProgressBar) findViewById(R.id.progress_wheel); title = (TextView) findViewById(R.id.title_password); + input = (TextInputLayout) findViewById(R.id.password_layout); password = (EditText) findViewById(R.id.edit_password); password.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - hideSoftKeyboard(); + hideSoftKeyboard(password); validatePassword(encrypted, password.getText()); return true; } }); + password.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, + int after) {} + + @Override + public void onTextChanged(CharSequence s, int start, int before, + int count) { + if (count > 0) AndroidUtils.setError(input, null, false); + } + + @Override + public void afterTextChanged(Editable s) {} + }); } @Override @@ -107,7 +126,7 @@ public class PasswordActivity extends BaseActivity { } private void validatePassword(final byte[] encrypted, Editable e) { - hideSoftKeyboard(); + hideSoftKeyboard(password); // Replace the button with a progress bar signInButton.setVisibility(INVISIBLE); progress.setVisibility(VISIBLE); @@ -129,10 +148,14 @@ public class PasswordActivity extends BaseActivity { private void tryAgain() { runOnUiThread(new Runnable() { public void run() { - title.setText(R.string.try_again); + AndroidUtils.setError(input, getString(R.string.try_again), + true); signInButton.setVisibility(VISIBLE); progress.setVisibility(INVISIBLE); password.setText(""); + + // show the keyboard again + showSoftKeyboard(password); } }); } diff --git a/briar-android/src/org/briarproject/android/SetupActivity.java b/briar-android/src/org/briarproject/android/SetupActivity.java index 2713b9984319f0c4f32bbd07e80db1c51d79ff8f..380792bf187b7c92294b2aca0d01e7a9d97bd0eb 100644 --- a/briar-android/src/org/briarproject/android/SetupActivity.java +++ b/briar-android/src/org/briarproject/android/SetupActivity.java @@ -129,7 +129,7 @@ public class SetupActivity extends BaseActivity implements OnClickListener, } public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - hideSoftKeyboard(); + hideSoftKeyboard(v); return true; } diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java index 585778ed554584b6f026c86c99f6106f4ab51942..e50540bc2982039a166cd8eb11c5f41608d46c6d 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java @@ -411,7 +411,7 @@ public class ConversationActivity extends BriarActivity timestamp = Math.max(timestamp, getMinTimestampForNewMessage()); createMessage(StringUtils.toUtf8(message), timestamp); content.setText(""); - hideSoftKeyboard(); + hideSoftKeyboard(content); } private long getMinTimestampForNewMessage() { diff --git a/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java b/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java index 89c230e189ba0d74c7ea281e3dd4a065abb24dba..5fc968a961b66ced3bd4d6116fde70dbba19f07b 100644 --- a/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java +++ b/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java @@ -110,7 +110,7 @@ implements OnEditorActionListener, OnClickListener { } public boolean onEditorAction(TextView textView, int actionId, KeyEvent e) { - hideSoftKeyboard(); + hideSoftKeyboard(textView); return true; } @@ -126,7 +126,7 @@ implements OnEditorActionListener, OnClickListener { public void onClick(View view) { if (view == createForumButton) { - hideSoftKeyboard(); + hideSoftKeyboard(view); if (!validateName()) return; createForumButton.setVisibility(GONE); progress.setVisibility(VISIBLE); diff --git a/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java b/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java index 81c348273bbb209d5b08d87d83b35af959174130..2b293e4e05b873bd94ffbd650dde6d7c856ecfc3 100644 --- a/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java +++ b/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java @@ -118,7 +118,7 @@ implements OnEditorActionListener, OnClickListener { } public boolean onEditorAction(TextView textView, int actionId, KeyEvent e) { - hideSoftKeyboard(); + hideSoftKeyboard(textView); return true; } @@ -134,7 +134,7 @@ implements OnEditorActionListener, OnClickListener { } public void onClick(View view) { - hideSoftKeyboard(); + hideSoftKeyboard(view); if (!validateNickname()) return; // Replace the button with a progress bar createIdentityButton.setVisibility(GONE);