Load suggestions through SettingsIntelligence.

- Add flag to switch between old/new implementation
- Add SuggestionLoader to load using Loader (instead of AsyncTask)
- Update DashboardAdapater/SuggestionAdapter to take List<Suggestion>
- Marked old getter/setters as @Deprecated and added comment
- Update tests to cover suggestionV2 adapter changes.

TODO:
- Handler for dismissing suggestion not set up yet.
- Suggestion data structure is incomplete (missing icon, remote view, etc)
- Need to extend Suggestion data strcture to support icon and
  remote view binding

Bug: 65065268
Test: robotests
Change-Id: I2378ef4c9edee972d5de93c3868068e2cde23f56
This commit is contained in:
Fan Zhang
2017-08-17 16:13:20 -07:00
parent c0f1c8f216
commit 82cb5a5cc8
14 changed files with 747 additions and 122 deletions

View File

@@ -17,6 +17,7 @@ package com.android.settings.dashboard;
import android.annotation.IntDef;
import android.graphics.drawable.Icon;
import android.service.settings.suggestions.Suggestion;
import android.support.annotation.VisibleForTesting;
import android.support.v7.util.DiffUtil;
import android.text.TextUtils;
@@ -69,6 +70,7 @@ public class DashboardData {
private final DashboardCategory mCategory;
private final List<Condition> mConditions;
private final List<Tile> mSuggestions;
private final List<Suggestion> mSuggestionsV2;
@HeaderMode
private final int mSuggestionConditionMode;
@@ -76,6 +78,7 @@ public class DashboardData {
mCategory = builder.mCategory;
mConditions = builder.mConditions;
mSuggestions = builder.mSuggestions;
mSuggestionsV2 = builder.mSuggestionsV2;
mSuggestionConditionMode = builder.mSuggestionConditionMode;
mItems = new ArrayList<>();
@@ -124,6 +127,10 @@ public class DashboardData {
return mSuggestions;
}
public List<Suggestion> getSuggestionsV2() {
return mSuggestionsV2;
}
public int getSuggestionConditionMode() {
return mSuggestionConditionMode;
}
@@ -190,13 +197,22 @@ public class DashboardData {
* and mIsShowingAll, mSuggestionConditionMode flag.
*/
private void buildItemsData() {
final boolean hasSuggestions = sizeOf(mSuggestions) > 0;
final boolean useSuggestionV2 = mSuggestionsV2 != null;
final boolean hasSuggestions = useSuggestionV2
? sizeOf(mSuggestionsV2) > 0
: sizeOf(mSuggestions) > 0;
final List<Condition> conditions = getConditionsToShow(mConditions);
final boolean hasConditions = sizeOf(conditions) > 0;
final List<Tile> suggestions = getSuggestionsToShow(mSuggestions);
final int hiddenSuggestion =
hasSuggestions ? sizeOf(mSuggestions) - sizeOf(suggestions) : 0;
final List<Suggestion> suggestionsV2 = getSuggestionsV2ToShow(mSuggestionsV2);
final int hiddenSuggestion;
if (useSuggestionV2) {
hiddenSuggestion = hasSuggestions ? sizeOf(mSuggestionsV2) - sizeOf(suggestionsV2) : 0;
} else {
hiddenSuggestion = hasSuggestions ? sizeOf(mSuggestions) - sizeOf(suggestions) : 0;
}
final boolean hasSuggestionAndCollapsed = hasSuggestions
&& mSuggestionConditionMode == HEADER_MODE_COLLAPSED;
@@ -215,10 +231,15 @@ public class DashboardData {
R.layout.suggestion_condition_header,
STABLE_ID_SUGGESTION_CONDITION_MIDDLE_HEADER, onlyHasConditionAndCollapsed);
/* Suggestion container. This is the card view that contains the list of suggestions.
* This will be added whenever the suggestion list is not empty */
addToItemList(suggestions, R.layout.suggestion_condition_container,
STABLE_ID_SUGGESTION_CONTAINER, sizeOf(suggestions) > 0);
if (useSuggestionV2) {
addToItemList(suggestionsV2, R.layout.suggestion_condition_container,
STABLE_ID_SUGGESTION_CONTAINER, sizeOf(suggestionsV2) > 0);
} else {
/* Suggestion container. This is the card view that contains the list of suggestions.
* This will be added whenever the suggestion list is not empty */
addToItemList(suggestions, R.layout.suggestion_condition_container,
STABLE_ID_SUGGESTION_CONTAINER, sizeOf(suggestions) > 0);
}
/* Second suggestion/condition header. This will be added when there is at least one
* suggestion or condition that is not currently displayed, and the user can expand the
@@ -246,7 +267,7 @@ public class DashboardData {
&& !hasConditions
&& hiddenSuggestion == 0);
if(mCategory != null) {
if (mCategory != null) {
for (int j = 0; j < mCategory.tiles.size(); j++) {
final Tile tile = mCategory.tiles.get(j);
addToItemList(tile, R.layout.dashboard_tile, Objects.hash(tile.title),
@@ -274,6 +295,10 @@ public class DashboardData {
return result;
}
/**
* @deprecated in favor of {@link #getSuggestionsV2ToShow}.
*/
@Deprecated
private List<Tile> getSuggestionsToShow(List<Tile> suggestions) {
if (suggestions == null || mSuggestionConditionMode == HEADER_MODE_COLLAPSED) {
return null;
@@ -285,6 +310,17 @@ public class DashboardData {
return suggestions.subList(0, DEFAULT_SUGGESTION_COUNT);
}
private List<Suggestion> getSuggestionsV2ToShow(List<Suggestion> suggestions) {
if (suggestions == null || mSuggestionConditionMode == HEADER_MODE_COLLAPSED) {
return null;
}
if (mSuggestionConditionMode != HEADER_MODE_DEFAULT
|| suggestions.size() <= DEFAULT_SUGGESTION_COUNT) {
return suggestions;
}
return suggestions.subList(0, DEFAULT_SUGGESTION_COUNT);
}
/**
* Builder used to build the ItemsData
* <p>
@@ -296,7 +332,12 @@ public class DashboardData {
private DashboardCategory mCategory;
private List<Condition> mConditions;
/**
* @deprecated in favor of SuggestionList
*/
@Deprecated
private List<Tile> mSuggestions;
private List<Suggestion> mSuggestionsV2;
public Builder() {
}
@@ -305,6 +346,7 @@ public class DashboardData {
mCategory = dashboardData.mCategory;
mConditions = dashboardData.mConditions;
mSuggestions = dashboardData.mSuggestions;
mSuggestionsV2 = dashboardData.mSuggestionsV2;
mSuggestionConditionMode = dashboardData.mSuggestionConditionMode;
}
@@ -318,11 +360,20 @@ public class DashboardData {
return this;
}
/**
* @deprecated in favor of {@link #setSuggestionsV2(List)})}
*/
@Deprecated
public Builder setSuggestions(List<Tile> suggestions) {
this.mSuggestions = suggestions;
return this;
}
public Builder setSuggestionsV2(List<Suggestion> suggestions) {
this.mSuggestionsV2 = suggestions;
return this;
}
public Builder setSuggestionConditionMode(@HeaderMode int mode) {
this.mSuggestionConditionMode = mode;
return this;