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;
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
- if (mValidator != null) {
- final EditText editText = view.findViewById(android.R.id.edit);
- if (editText != null) {
- editText.removeTextChangedListener(mTextWatcher);
- if (mIsPassword) {
- editText.setInputType(
- InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
- editText.setMaxLines(1);
- }
- editText.addTextChangedListener(mTextWatcher);
+ final EditText editText = view.findViewById(android.R.id.edit);
+ if (editText != null && !TextUtils.isEmpty(editText.getText())) {
+ editText.setSelection(editText.getText().length());
+ }
+ if (mValidator != null && editText != null) {
+ editText.removeTextChangedListener(mTextWatcher);
+ if (mIsPassword) {
+ editText.setInputType(
+ InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
+ editText.setMaxLines(1);
}
+ editText.addTextChangedListener(mTextWatcher);
}
}
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)
}
@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