package com.schibsted.spain.barista.custom;
import android.support.test.espresso.UiController;
import android.support.test.espresso.ViewAction;
import android.support.test.espresso.action.ReplaceTextAction;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import javax.annotation.Nonnull;
import org.hamcrest.Matcher;
import static android.support.test.espresso.action.ViewActions.actionWithAssertions;
import static android.support.test.espresso.core.deps.guava.base.Preconditions.checkNotNull;
import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static org.hamcrest.Matchers.allOf;
public class AutocompleteViewActions {
public static ViewAction replaceAutocomplete(@Nonnull String stringToBeSet) {
return actionWithAssertions(new ReplaceAutocompleteTextAction(stringToBeSet));
}
/**
* This is based on {@link ReplaceTextAction}
* with modifications thanks to "http://www.grokkingandroid.com/how-androids-autocompletetextview-nearly-drove-me-nuts/".
* <p>
* It replaces the text without showing the autocomplete popup.
* Bear in mind it won't work if you use a custom adapter not extending {@link ArrayAdapter}.
* <p>
*/
public static class ReplaceAutocompleteTextAction implements ViewAction {
private final String stringToBeSet;
public ReplaceAutocompleteTextAction(String value) {
checkNotNull(value);
this.stringToBeSet = value;
}
@SuppressWarnings("unchecked")
@Override
public Matcher<View> getConstraints() {
return allOf(isDisplayed(), isAssignableFrom(AutoCompleteTextView.class));
}
@Override
public void perform(UiController uiController, View view) {
AutoCompleteTextView autocomplete = (AutoCompleteTextView) view;
ArrayAdapter adapter = (ArrayAdapter) autocomplete.getAdapter();
autocomplete.setAdapter(null);
((EditText) view).setText(stringToBeSet);
autocomplete.setAdapter(adapter);
}
@Override
public String getDescription() {
return "replace text without showing autocomplete suggestions";
}
}
}