Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9be8c3fb authored by Antony Sargent's avatar Antony Sargent
Browse files

Fix focus behavior of ValidatedEditTextPreference

The bug report was that the cursor is set to the beginning of the
EditText for wifi hotspot password field, instead of at the end (or
having the entire field selected). This fix makes it so that all
ValidatedEditTextPreference's will put the cursor at the end of the
EditText.

Bug: 65413206
Test: make RunSettingsRoboTests
Change-Id: I23f3bb1b3f1b49b2f193c0ae2e103eae5c1a1019
parent 5b017f7b
Loading
Loading
Loading
Loading
+13 −10
Original line number Diff line number Diff line
@@ -21,8 +21,10 @@ import android.content.Context;
import android.support.annotation.VisibleForTesting;
import android.text.Editable;
import android.text.InputType;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

@@ -61,9 +63,11 @@ public class ValidatedEditTextPreference extends CustomEditTextPreference {
    @Override
    protected void onBindDialogView(View view) {
        super.onBindDialogView(view);
        if (mValidator != null) {
        final EditText editText = view.findViewById(android.R.id.edit);
            if (editText != null) {
        if (editText != null && !TextUtils.isEmpty(editText.getText())) {
            editText.setSelection(editText.getText().length());
        }
        if (mValidator != null && editText != null) {
            editText.removeTextChangedListener(mTextWatcher);
            if (mIsPassword) {
                editText.setInputType(
@@ -73,7 +77,6 @@ public class ValidatedEditTextPreference extends CustomEditTextPreference {
            editText.addTextChangedListener(mTextWatcher);
        }
    }
    }

    public void setIsPassword(boolean isPassword) {
        mIsPassword = isPassword;
+30 −3
Original line number Diff line number Diff line
@@ -35,9 +35,10 @@ import org.robolectric.annotation.Config;

import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;

@RunWith(SettingsRobolectricTestRunner.class)
@@ -58,10 +59,36 @@ public class ValidatedEditTextPreferenceTest {
    }

    @Test
    public void bindDialogView_noTextWatcher_shouldDoNothing() {
    public void bindDialogView_nullEditText_shouldNotCrash() {
        when(mView.findViewById(android.R.id.edit)).thenReturn(null);
        // should not crash trying to get the EditText text
        mPreference.onBindDialogView(mView);
    }

    @Test
    public void bindDialogView_emptyEditText_shouldNotSetSelection() {
        final String testText = "";
        final EditText editText = spy(new EditText(RuntimeEnvironment.application));
        editText.setText(testText);
        when(mView.findViewById(android.R.id.edit)).thenReturn(editText);

        mPreference.onBindDialogView(mView);

        // no need to setSelection if text was empty
        verify(editText, never()).setSelection(anyInt());
    }

    @Test
    public void bindDialogView_nonemptyEditText_shouldSetSelection() {
        final String testText = "whatever";
        final EditText editText = spy(new EditText(RuntimeEnvironment.application));
        editText.setText(testText);
        when(mView.findViewById(android.R.id.edit)).thenReturn(editText);

        mPreference.onBindDialogView(mView);

        verifyZeroInteractions(mView);
        // selection should be set to end of string
        verify(editText).setSelection(testText.length());
    }

    @Test