blob: f8b8d33b853a24e315bd1220b3b78b8d72e85870 [file] [log] [blame]
/*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.car.widget;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition;
import static android.support.test.espresso.contrib.RecyclerViewActions.scrollToPosition;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.support.test.espresso.UiController;
import android.support.test.espresso.ViewAction;
import android.support.test.filters.SmallTest;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SeekBar;
import org.hamcrest.Matcher;
import org.junit.Assume;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import androidx.car.test.R;
/**
* Tests the layout configuration in {@link SeekbarListItem}.
*/
@RunWith(AndroidJUnit4.class)
@SmallTest
public class SeekbarListItemTest {
@Rule
public ActivityTestRule<PagedListViewTestActivity> mActivityRule =
new ActivityTestRule<>(PagedListViewTestActivity.class);
private PagedListViewTestActivity mActivity;
private PagedListView mPagedListView;
private boolean isAutoDevice() {
PackageManager packageManager = mActivityRule.getActivity().getPackageManager();
return packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
}
@Before
public void setUp() {
Assume.assumeTrue(isAutoDevice());
mActivity = mActivityRule.getActivity();
mPagedListView = mActivity.findViewById(R.id.paged_list_view);
}
private void setupPagedListView(List<? extends ListItem> items) {
ListItemProvider provider = new ListItemProvider.ListProvider(
new ArrayList<>(items));
try {
mActivityRule.runOnUiThread(() -> {
mPagedListView.setAdapter(new ListItemAdapter(mActivity, provider));
});
} catch (Throwable throwable) {
throwable.printStackTrace();
throw new RuntimeException(throwable);
}
// Wait for paged list view to layout by using espresso to scroll to a position.
onView(withId(R.id.recycler_view)).perform(scrollToPosition(0));
}
private void verifyViewDefaultVisibility(View view) {
if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
final int childCount = viewGroup.getChildCount();
for (int i = 0; i < childCount; i++) {
verifyViewDefaultVisibility(viewGroup.getChildAt(i));
}
} else if (view instanceof SeekBar) {
assertThat(view.getVisibility(), is(equalTo(View.VISIBLE)));
} else {
assertThat("Visibility of view "
+ mActivity.getResources().getResourceEntryName(view.getId())
+ " by default should be GONE.",
view.getVisibility(), is(equalTo(View.GONE)));
}
}
private SeekbarListItem.ViewHolder getViewHolderAtPosition(int position) {
return (SeekbarListItem.ViewHolder) mPagedListView.getRecyclerView()
.findViewHolderForAdapterPosition(
position);
}
@Test
public void testOnlySliderIsVisibleInEmptyItem() {
SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, null);
setupPagedListView(Arrays.asList(item));
verifyViewDefaultVisibility(mPagedListView.getRecyclerView().getLayoutManager()
.getChildAt(0));
}
@Test
public void testPrimaryActionVisible() {
SeekbarListItem item0 = new SeekbarListItem(mActivity, 0, 0, null, null);
item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon);
SeekbarListItem item1 = new SeekbarListItem(mActivity, 0, 0, null, null);
item1.setPrimaryActionIcon(new ColorDrawable(Color.BLACK));
List<ListItem> items = Arrays.asList(item0, item1);
setupPagedListView(items);
assertThat(getViewHolderAtPosition(0).getPrimaryIcon().getVisibility(),
is(equalTo(View.VISIBLE)));
assertThat(getViewHolderAtPosition(1).getPrimaryIcon().getVisibility(),
is(equalTo(View.VISIBLE)));
}
@Test
public void testSliderTextVisible() {
SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, "Text");
List<ListItem> items = Arrays.asList(item);
setupPagedListView(items);
assertThat(getViewHolderAtPosition(0).getText().getVisibility(), is(equalTo(View.VISIBLE)));
}
@Test
public void testSupplementalIconVisible() {
SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, null);
item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false);
List<ListItem> items = Arrays.asList(item);
setupPagedListView(items);
assertThat(getViewHolderAtPosition(0).getSupplementalIcon().getVisibility(),
is(equalTo(View.VISIBLE)));
assertThat(getViewHolderAtPosition(0).getSupplementalIconDivider().getVisibility(),
is(equalTo(View.GONE)));
}
@Test
public void testSupplementalIconDividerVisible() {
SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, null);
item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, true);
List<ListItem> items = Arrays.asList(item);
setupPagedListView(items);
assertThat(getViewHolderAtPosition(0).getSupplementalIcon().getVisibility(),
is(equalTo(View.VISIBLE)));
assertThat(getViewHolderAtPosition(0).getSupplementalIconDivider().getVisibility(),
is(equalTo(View.VISIBLE)));
}
@Test
public void testPrimaryIconIsNotClickable() {
SeekbarListItem item0 = new SeekbarListItem(mActivity, 0, 0, null, null);
item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon);
SeekbarListItem item1 = new SeekbarListItem(mActivity, 0, 0, null, null);
item1.setPrimaryActionIcon(new ColorDrawable(Color.BLACK));
List<ListItem> items = Arrays.asList(item0, item1);
setupPagedListView(items);
assertFalse(getViewHolderAtPosition(0).getPrimaryIcon().isClickable());
assertFalse(getViewHolderAtPosition(1).getPrimaryIcon().isClickable());
}
@Test
public void testSupplementalIconNotClickableWithoutListener() {
SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, null);
item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false);
List<ListItem> items = Arrays.asList(item);
setupPagedListView(items);
assertFalse(getViewHolderAtPosition(0).getSupplementalIcon().isClickable());
}
@Test
public void testClickingSupplementalIcon() {
boolean[] clicked = {false};
SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, null);
item.setSupplementalIcon(android.R.drawable.sym_def_app_icon, false,
v -> clicked[0] = true);
List<ListItem> items = Arrays.asList(item);
setupPagedListView(items);
onView(withId(R.id.recycler_view)).perform(
actionOnItemAtPosition(0, clickChildViewWithId(R.id.supplemental_icon)));
assertTrue(clicked[0]);
}
@Test
public void testPrimaryActionEmptyIconSpacing() {
SeekbarListItem item0 = new SeekbarListItem(mActivity, 0, 0, null, null);
item0.setPrimaryActionIcon(android.R.drawable.sym_def_app_icon);
SeekbarListItem item1 = new SeekbarListItem(mActivity, 0, 0, null, null);
item1.setPrimaryActionIcon(new ColorDrawable(Color.BLACK));
SeekbarListItem item2 = new SeekbarListItem(mActivity, 0, 0, null, null);
item2.setPrimaryActionEmptyIcon();
List<ListItem> items = Arrays.asList(item0, item1, item2);
setupPagedListView(items);
for (int i = 1; i < items.size(); i++) {
assertThat(getViewHolderAtPosition(i - 1).getSeekBar().getLeft(),
is(equalTo(getViewHolderAtPosition(i).getSeekBar().getLeft())));
}
}
@Test
public void testSupplementalIconSpacingWithoutDivider() {
final boolean showDivider = false;
SeekbarListItem item0 = new SeekbarListItem(mActivity, 0, 0, null, null);
item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, showDivider);
SeekbarListItem item1 = new SeekbarListItem(mActivity, 0, 0, null, null);
item1.setSupplementalEmptyIcon(showDivider);
List<ListItem> items = Arrays.asList(item0, item1);
setupPagedListView(items);
for (int i = 1; i < items.size(); i++) {
assertThat(getViewHolderAtPosition(i - 1).getSeekBar().getRight(),
is(equalTo(getViewHolderAtPosition(i).getSeekBar().getRight())));
}
}
@Test
public void testSupplementalIconSpacingWithDivider() {
final boolean showDivider = true;
SeekbarListItem item0 = new SeekbarListItem(mActivity, 0, 0, null, null);
item0.setSupplementalIcon(android.R.drawable.sym_def_app_icon, showDivider);
SeekbarListItem item1 = new SeekbarListItem(mActivity, 0, 0, null, null);
item1.setSupplementalEmptyIcon(showDivider);
List<ListItem> items = Arrays.asList(item0, item1);
setupPagedListView(items);
for (int i = 1; i < items.size(); i++) {
assertThat(getViewHolderAtPosition(i - 1).getSeekBar().getRight(),
is(equalTo(getViewHolderAtPosition(i).getSeekBar().getRight())));
}
}
@Test
public void testSettingSupplementalIconWithDrawable() {
Drawable drawable = mActivity.getDrawable(android.R.drawable.sym_def_app_icon);
SeekbarListItem item = new SeekbarListItem(mActivity, 0, 0, null, null);
item.setSupplementalIcon(drawable, false);
setupPagedListView(Arrays.asList(item));
assertThat(getViewHolderAtPosition(0).getSupplementalIcon().getDrawable(),
is(equalTo(drawable)));
}
private static ViewAction clickChildViewWithId(final int id) {
return new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return null;
}
@Override
public String getDescription() {
return "Click on a child view with specific id.";
}
@Override
public void perform(UiController uiController, View view) {
View v = view.findViewById(id);
v.performClick();
}
};
}
}