Initial search bar implementation.
Replaces the default Toolbar in SettingsActivity with one that looks
like a search bar. It uses a Toolbar inside a CardView with some custom
styling.
Since the search bar is a floating element, the new toolbar lives in the
content frame of the dashboard. A FrameLayout is used to provide the
layering that is desired.
Since the search bar is on top, an additional spacer view is added to
the list of items in the dashboard. Its color changes based on what
the first view is so that it always matches.
Adds android-support-v7-cardview as a dependency (and reorders the
other deps to be in alphabetical order).
Remaining work (in future CLs):
- remove search menu option?
- clean up initial window
- remove the line between the header and the first condition
when there's a condition
Change-Id: I627b406735c8e2280ac08f44ca32f7098621a830
Merged-In: Id7477b90fbaf30eb5cac1ee244c847bddb95b3fd
Bug: 37477506
Test: make RunSettingsRoboTests
This commit is contained in:
@@ -20,12 +20,15 @@ import android.app.Activity;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.FragmentManager;
|
||||
import android.app.FragmentTransaction;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Bitmap;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.Menu;
|
||||
|
||||
import com.android.settings.search2.SearchActivity;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -35,6 +38,7 @@ import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.shadows.ShadowApplication;
|
||||
import org.robolectric.util.ReflectionHelpers;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
@@ -138,4 +142,15 @@ public class SettingsActivityTest {
|
||||
|
||||
assertThat(mActivity.mDisplaySearch).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnClick() {
|
||||
doReturn("com.android.settings").when(mActivity).getPackageName();
|
||||
|
||||
mActivity.onClick(null);
|
||||
|
||||
Intent intent = ShadowApplication.getInstance().getNextStartedActivity();
|
||||
assertThat(intent.getComponent()).isEqualTo(
|
||||
new ComponentName("com.android.settings", SearchActivity.class.getName()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,16 +19,23 @@ import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.graphics.drawable.Icon;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.dashboard.conditional.Condition;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||
import com.android.settingslib.drawer.DashboardCategory;
|
||||
import com.android.settingslib.drawer.Tile;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -47,6 +54,7 @@ import java.util.List;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Mockito.any;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
@@ -99,6 +107,53 @@ public class DashboardAdapterTest {
|
||||
when(mView.getTag()).thenReturn(mCondition);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnBindViewHolder_spacer_noSuggestions_noConditions() {
|
||||
makeCategory();
|
||||
DashboardAdapter.DashboardItemHolder holder = setupSpacer();
|
||||
|
||||
mDashboardAdapter.onBindViewHolder(holder, 0);
|
||||
|
||||
assertThat(holder.itemView.getBackground()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnBindViewHolder_spacer_suggestion_noConditions() {
|
||||
setupSuggestions(makeSuggestions("pkg1"));
|
||||
makeCategory();
|
||||
DashboardAdapter.DashboardItemHolder holder = setupSpacer();
|
||||
|
||||
mDashboardAdapter.onBindViewHolder(holder, 0);
|
||||
|
||||
assertThat(holder.itemView.getBackground()).isNotNull();
|
||||
assertThat(holder.itemView.getBackground()).isInstanceOf(ColorDrawable.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnBindViewHolder_spacer_noSuggestion_condition() {
|
||||
makeCondition();
|
||||
makeCategory();
|
||||
DashboardAdapter.DashboardItemHolder holder = setupSpacer();
|
||||
|
||||
mDashboardAdapter.onBindViewHolder(holder, 0);
|
||||
|
||||
assertThat(holder.itemView.getBackground()).isNotNull();
|
||||
assertThat(holder.itemView.getBackground()).isInstanceOf(ColorDrawable.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnBindViewHolder_spacer_suggestion_condition() {
|
||||
setupSuggestions(makeSuggestions("pkg1"));
|
||||
makeCondition();
|
||||
makeCategory();
|
||||
DashboardAdapter.DashboardItemHolder holder = setupSpacer();
|
||||
|
||||
mDashboardAdapter.onBindViewHolder(holder, 0);
|
||||
|
||||
assertThat(holder.itemView.getBackground()).isNotNull();
|
||||
assertThat(holder.itemView.getBackground()).isInstanceOf(ColorDrawable.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetConditions_AfterSetConditions_ExpandedConditionNull() {
|
||||
mDashboardAdapter.onExpandClick(mView);
|
||||
@@ -109,7 +164,7 @@ public class DashboardAdapterTest {
|
||||
|
||||
@Test
|
||||
public void testSuggestionsLogs_NotExpanded() {
|
||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
|
||||
setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3"));
|
||||
verify(mFactory.metricsFeatureProvider, times(2)).action(
|
||||
any(Context.class), mActionCategoryCaptor.capture(),
|
||||
mActionPackageCaptor.capture());
|
||||
@@ -124,7 +179,7 @@ public class DashboardAdapterTest {
|
||||
|
||||
@Test
|
||||
public void testSuggestionsLogs_NotExpandedAndPaused() {
|
||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
|
||||
setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3"));
|
||||
mDashboardAdapter.onPause();
|
||||
verify(mFactory.metricsFeatureProvider, times(4)).action(
|
||||
any(Context.class), mActionCategoryCaptor.capture(),
|
||||
@@ -141,7 +196,7 @@ public class DashboardAdapterTest {
|
||||
|
||||
@Test
|
||||
public void testSuggestionsLogs_Expanded() {
|
||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
|
||||
setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3"));
|
||||
mDashboardAdapter.onBindSuggestionHeader(
|
||||
mSuggestionHolder, mSuggestionHeaderData);
|
||||
mSuggestionHolder.itemView.callOnClick();
|
||||
@@ -160,7 +215,7 @@ public class DashboardAdapterTest {
|
||||
|
||||
@Test
|
||||
public void testSuggestionsLogs_ExpandedAndPaused() {
|
||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
|
||||
setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3"));
|
||||
mDashboardAdapter.onBindSuggestionHeader(
|
||||
mSuggestionHolder, mSuggestionHeaderData);
|
||||
mSuggestionHolder.itemView.callOnClick();
|
||||
@@ -183,7 +238,7 @@ public class DashboardAdapterTest {
|
||||
|
||||
@Test
|
||||
public void testSuggestionsLogs_ExpandedAfterPause() {
|
||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
|
||||
setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3"));
|
||||
mDashboardAdapter.onPause();
|
||||
mDashboardAdapter.onBindSuggestionHeader(
|
||||
mSuggestionHolder, mSuggestionHeaderData);
|
||||
@@ -208,7 +263,7 @@ public class DashboardAdapterTest {
|
||||
|
||||
@Test
|
||||
public void testSuggestionsLogs_ExpandedAfterPauseAndPausedAgain() {
|
||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
|
||||
setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3"));
|
||||
mDashboardAdapter.onPause();
|
||||
mDashboardAdapter.onBindSuggestionHeader(
|
||||
mSuggestionHolder, mSuggestionHeaderData);
|
||||
@@ -237,7 +292,7 @@ public class DashboardAdapterTest {
|
||||
|
||||
@Test
|
||||
public void testSuggestionsLogs_ExpandedWithLessThanDefaultShown() {
|
||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1"}));
|
||||
setupSuggestions(makeSuggestions("pkg1"));
|
||||
mDashboardAdapter.onBindSuggestionHeader(
|
||||
mSuggestionHolder, mSuggestionHeaderData);
|
||||
mSuggestionHolder.itemView.callOnClick();
|
||||
@@ -254,7 +309,7 @@ public class DashboardAdapterTest {
|
||||
|
||||
@Test
|
||||
public void testSuggestionsLogs_ExpandedWithLessThanDefaultShownAndPaused() {
|
||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1"}));
|
||||
setupSuggestions(makeSuggestions("pkg1"));
|
||||
mDashboardAdapter.onBindSuggestionHeader(
|
||||
mSuggestionHolder, mSuggestionHeaderData);
|
||||
mSuggestionHolder.itemView.callOnClick();
|
||||
@@ -273,7 +328,7 @@ public class DashboardAdapterTest {
|
||||
|
||||
@Test
|
||||
public void testSuggestionsLogs_ExpandedWithLessThanDefaultShownAfterPause() {
|
||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1"}));
|
||||
setupSuggestions(makeSuggestions("pkg1"));
|
||||
mDashboardAdapter.onPause();
|
||||
mDashboardAdapter.onBindSuggestionHeader(
|
||||
mSuggestionHolder, mSuggestionHeaderData);
|
||||
@@ -293,7 +348,7 @@ public class DashboardAdapterTest {
|
||||
|
||||
@Test
|
||||
public void testSuggestionsLogs_ExpandedWithLessThanDefaultShownAfterPauseAndPausedAgain() {
|
||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1"}));
|
||||
setupSuggestions(makeSuggestions("pkg1"));
|
||||
mDashboardAdapter.onPause();
|
||||
mDashboardAdapter.onBindSuggestionHeader(
|
||||
mSuggestionHolder, mSuggestionHeaderData);
|
||||
@@ -313,7 +368,7 @@ public class DashboardAdapterTest {
|
||||
assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions);
|
||||
}
|
||||
|
||||
private List<Tile> makeSuggestions(String[] pkgNames) {
|
||||
private List<Tile> makeSuggestions(String... pkgNames) {
|
||||
final List<Tile> suggestions = new ArrayList<>();
|
||||
for (String pkgName : pkgNames) {
|
||||
Tile suggestion = new Tile();
|
||||
@@ -324,11 +379,31 @@ public class DashboardAdapterTest {
|
||||
return suggestions;
|
||||
}
|
||||
|
||||
private void setUpSuggestions(List<Tile> suggestions) {
|
||||
private void setupSuggestions(List<Tile> suggestions) {
|
||||
mDashboardAdapter.setCategoriesAndSuggestions(new ArrayList<>(), suggestions);
|
||||
mSuggestionHolder = mDashboardAdapter.onCreateViewHolder(
|
||||
new FrameLayout(RuntimeEnvironment.application),
|
||||
mDashboardAdapter.getItemViewType(0));
|
||||
mDashboardAdapter.getItemViewType(1));
|
||||
}
|
||||
|
||||
private void makeCondition() {
|
||||
final List<Condition> conditions = new ArrayList<>();
|
||||
Condition condition = mock(Condition.class);
|
||||
when(condition.shouldShow()).thenReturn(true);
|
||||
conditions.add(condition);
|
||||
mDashboardAdapter.setConditions(conditions);
|
||||
}
|
||||
|
||||
private void makeCategory() {
|
||||
List<DashboardCategory> categories = new ArrayList<>();
|
||||
categories.add(new DashboardCategory());
|
||||
mDashboardAdapter.setCategory(categories);
|
||||
}
|
||||
|
||||
private DashboardAdapter.DashboardItemHolder setupSpacer() {
|
||||
Context context = RuntimeEnvironment.application;
|
||||
final View view = LayoutInflater.from(context)
|
||||
.inflate(R.layout.dashboard_header_spacer, new LinearLayout(context), false);
|
||||
return new DashboardAdapter.DashboardItemHolder(view);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ public class DashboardDataTest {
|
||||
public void testBuildItemsData_containsAllData() {
|
||||
final DashboardData.SuggestionHeaderData data =
|
||||
new DashboardData.SuggestionHeaderData(false, 1, 0);
|
||||
final Object[] expectedObjects = {mTestCondition, null, data, mTestSuggestion,
|
||||
final Object[] expectedObjects = {null, mTestCondition, null, data, mTestSuggestion,
|
||||
mDashboardCategory, mTestCategoryTile};
|
||||
final int expectedSize = expectedObjects.length;
|
||||
|
||||
@@ -171,7 +171,7 @@ public class DashboardDataTest {
|
||||
@Test
|
||||
public void testDiffUtil_DataEqual_noResultData() {
|
||||
List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
|
||||
testDiffUtil(mDashboardDataWithOneConditions,
|
||||
testDiffUtil(mDashboardDataWithOneConditions,
|
||||
mDashboardDataWithOneConditions, testResultData);
|
||||
}
|
||||
|
||||
@@ -180,7 +180,7 @@ public class DashboardDataTest {
|
||||
//Build testResultData
|
||||
final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
|
||||
testResultData.add(new ListUpdateResult.ResultData(
|
||||
ListUpdateResult.ResultData.TYPE_OPERATION_INSERT, 1, 1));
|
||||
ListUpdateResult.ResultData.TYPE_OPERATION_INSERT, 2, 1));
|
||||
|
||||
testDiffUtil(mDashboardDataWithOneConditions,
|
||||
mDashboardDataWithTwoConditions, testResultData);
|
||||
@@ -191,7 +191,7 @@ public class DashboardDataTest {
|
||||
//Build testResultData
|
||||
final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
|
||||
testResultData.add(new ListUpdateResult.ResultData(
|
||||
ListUpdateResult.ResultData.TYPE_OPERATION_REMOVE, 0, 6));
|
||||
ListUpdateResult.ResultData.TYPE_OPERATION_REMOVE, 1, 6));
|
||||
|
||||
testDiffUtil(mDashboardDataWithOneConditions, mDashboardDataWithNoItems, testResultData);
|
||||
}
|
||||
@@ -203,8 +203,8 @@ public class DashboardDataTest {
|
||||
mDashboardDataWithOneConditions.getItemList(),
|
||||
mDashboardDataWithOneConditions.getItemList());
|
||||
|
||||
// Item in position 0 is condition card, which payload should not be null
|
||||
assertThat(callback.getChangePayload(0, 0)).isNotEqualTo(null);
|
||||
// Item in position 1 is condition card, which payload should not be null
|
||||
assertThat(callback.getChangePayload(1, 1)).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -214,9 +214,9 @@ public class DashboardDataTest {
|
||||
mDashboardDataWithOneConditions.getItemList(),
|
||||
mDashboardDataWithOneConditions.getItemList());
|
||||
|
||||
// Only item in position 0 is condition card, so others' payload should be null
|
||||
for (int i = 1; i < mDashboardDataWithOneConditions.getItemList().size(); i++) {
|
||||
assertThat(callback.getChangePayload(i, i)).isEqualTo(null);
|
||||
// Position 0 is spacer, 1 is condition card, so others' payload should be null
|
||||
for (int i = 2; i < mDashboardDataWithOneConditions.getItemList().size(); i++) {
|
||||
assertThat(callback.getChangePayload(i, i)).isNull();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -356,6 +356,11 @@ public class DashboardDataTest {
|
||||
|
||||
return arg2 - resultData.arg2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "op:" + operation + ",arg1:" + arg1 + ",arg2:" + arg2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user