Combine settings suggestion and condition.

- Add a flag in dashboard feature provider to specify whether to use the
combined UI for suggestions and conditions.
- Move Conditions below Suggestions.
- Add dashboard entity for condition and suggestion container, and
  wrap the condition and suggestion list inside the container. The
  container itself will be a single dashboard item, and within it will
  be the list of suggestion or condition.
- Add suggestion/condition header that will show the combined info for
  the conditions and suggestion data, and have the expand button to
  control expanding both the suggestion and condition list.
- Change the individual condition card to be always expanded, and
remove the logic to collapse/expand individual condition card.
- Remove the divider between the action button and condition detail
  within each condition card.
- Add suggestion/condition footer for collapsing the whole suggestion and
  condition list.

Bug: 37645754
Test: make RunSettingsRoboTests
Change-Id: I86df75f7e4551778f79d730851c03121fd0dcbdf
This commit is contained in:
Doris Ling
2017-05-11 16:27:54 -07:00
parent 52c031edae
commit 83a6621b38
23 changed files with 1476 additions and 110 deletions

View File

@@ -88,17 +88,21 @@ public class DashboardDataTest {
mDashboardCategory.tiles.add(mTestCategoryTile);
categories.add(mDashboardCategory);
// Build DashboardData
// Build DashboardData
mDashboardDataWithOneConditions = new DashboardData.Builder()
.setConditions(oneItemConditions)
.setCategories(categories)
.setSuggestions(suggestions)
.setSuggestionConditionMode(DashboardData.HEADER_MODE_FULLY_EXPANDED)
.setCombineSuggestionAndCondition(true)
.build();
mDashboardDataWithTwoConditions = new DashboardData.Builder()
.setConditions(twoItemsConditions)
.setCategories(categories)
.setSuggestions(suggestions)
.setSuggestionConditionMode(DashboardData.HEADER_MODE_FULLY_EXPANDED)
.setCombineSuggestionAndCondition(true)
.build();
mDashboardDataWithNoItems = new DashboardData.Builder()
@@ -110,23 +114,33 @@ public class DashboardDataTest {
@Test
public void testBuildItemsData_containsAllData() {
final DashboardData.SuggestionHeaderData data =
new DashboardData.SuggestionHeaderData(false, 1, 0);
final Object[] expectedObjects = {null, mTestCondition, null, data, mTestSuggestion,
mDashboardCategory, mTestCategoryTile};
final DashboardData.SuggestionConditionHeaderData data =
new DashboardData.SuggestionConditionHeaderData(
mDashboardDataWithOneConditions.getConditions(), 0);
final Object[] expectedObjects = {null, data,
mDashboardDataWithOneConditions.getSuggestions(),
mDashboardDataWithOneConditions.getConditions(),
null, mDashboardCategory, mTestCategoryTile};
final int expectedSize = expectedObjects.length;
assertThat(mDashboardDataWithOneConditions.getItemList().size())
.isEqualTo(expectedSize);
for (int i = 0; i < expectedSize; i++) {
if (mDashboardDataWithOneConditions.getItemEntityByPosition(i)
instanceof DashboardData.SuggestionHeaderData) {
final Object item = mDashboardDataWithOneConditions.getItemEntityByPosition(i);
if (item instanceof DashboardData.SuggestionHeaderData
|| item instanceof List) {
// SuggestionHeaderData is created inside when build, we can only use isEqualTo
assertThat(mDashboardDataWithOneConditions.getItemEntityByPosition(i))
.isEqualTo(expectedObjects[i]);
assertThat(item).isEqualTo(expectedObjects[i]);
} else if (item instanceof DashboardData.SuggestionConditionHeaderData) {
DashboardData.SuggestionConditionHeaderData i1 =
(DashboardData.SuggestionConditionHeaderData)item;
DashboardData.SuggestionConditionHeaderData i2 =
(DashboardData.SuggestionConditionHeaderData)expectedObjects[i];
assertThat(i1.title).isEqualTo(i2.title);
assertThat(i1.conditionCount).isEqualTo(i2.conditionCount);
assertThat(i1.hiddenSuggestionCount).isEqualTo(i2.hiddenSuggestionCount);
} else {
assertThat(mDashboardDataWithOneConditions.getItemEntityByPosition(i))
.isSameAs(expectedObjects[i]);
assertThat(item).isSameAs(expectedObjects[i]);
}
}
}
@@ -134,7 +148,7 @@ public class DashboardDataTest {
@Test
public void testGetPositionByEntity_selfInstance_returnPositionFound() {
final int position = mDashboardDataWithOneConditions
.getPositionByEntity(mTestCondition);
.getPositionByEntity(mDashboardDataWithOneConditions.getConditions());
assertThat(position).isNotEqualTo(DashboardData.POSITION_NOT_FOUND);
}
@@ -176,11 +190,17 @@ public class DashboardDataTest {
}
@Test
public void testDiffUtil_InsertOneCondition_ResultDataOneInserted() {
public void testDiffUtil_InsertOneCondition_ResultDataTwoChanged() {
//Build testResultData
final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
// Item in position 1 is the header, which contains the number of conditions, changed from
// 1 to 2
testResultData.add(new ListUpdateResult.ResultData(
ListUpdateResult.ResultData.TYPE_OPERATION_INSERT, 2, 1));
ListUpdateResult.ResultData.TYPE_OPERATION_CHANGE, 1, 1));
// Item in position 3 is the condition container containing the list of conditions, which
// gets 1 more item
testResultData.add(new ListUpdateResult.ResultData(
ListUpdateResult.ResultData.TYPE_OPERATION_CHANGE, 3, 1));
testDiffUtil(mDashboardDataWithOneConditions,
mDashboardDataWithTwoConditions, testResultData);
@@ -196,31 +216,6 @@ public class DashboardDataTest {
testDiffUtil(mDashboardDataWithOneConditions, mDashboardDataWithNoItems, testResultData);
}
@Test
public void testPayload_ItemConditionCard_returnNotNull() {
final DashboardData.ItemsDataDiffCallback callback = new DashboardData
.ItemsDataDiffCallback(
mDashboardDataWithOneConditions.getItemList(),
mDashboardDataWithOneConditions.getItemList());
// Item in position 1 is condition card, which payload should not be null
assertThat(callback.getChangePayload(1, 1)).isNotNull();
}
@Test
public void testPayload_ItemNotConditionCard_returnNull() {
final DashboardData.ItemsDataDiffCallback callback = new DashboardData
.ItemsDataDiffCallback(
mDashboardDataWithOneConditions.getItemList(),
mDashboardDataWithOneConditions.getItemList());
// 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();
}
}
/**
* Test when using the
* {@link com.android.settings.dashboard.DashboardData.ItemsDataDiffCallback}