Refactor SummaryLoader to set summary on subsetting pages.
- Make a SummaryConsumer interface. Things that needs latest summary
should implement this interface (DashboardAdapter for homepage,
DashboardFragment for subsettings). This also decouples SummaryLoader
from relying on SettingsDrawerActivity.
- Make DashboardFeatureProvider more generic to load DashboardCategory
by key.
Bug: 31781480
Test: RunSettingsRoboTests
Change-Id: I9c65456fb433a74c352498251e0ccf65da0be1f0
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index 1388be7..0aee0b5 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -40,13 +40,15 @@
* Base fragment for dashboard style UI containing a list of static and dynamic setting items.
*/
public abstract class DashboardFragment extends SettingsPreferenceFragment
- implements SettingsDrawerActivity.CategoryListener, Indexable {
+ implements SettingsDrawerActivity.CategoryListener, Indexable,
+ SummaryLoader.SummaryConsumer {
private final Map<Class, PreferenceController> mPreferenceControllers =
new ArrayMap<>();
protected DashboardFeatureProvider mDashboardFeatureProvider;
private boolean mListeningToCategoryChange;
+ private SummaryLoader mSummaryLoader;
@Override
public void onAttach(Context context) {
@@ -57,7 +59,8 @@
@Override
public void onCategoriesChanged() {
- final DashboardCategory category = getDashboardTiles();
+ final DashboardCategory category =
+ mDashboardFeatureProvider.getTilesForCategory(getCategoryKey());
if (category == null) {
return;
}
@@ -73,11 +76,12 @@
@Override
public void onStart() {
super.onStart();
- final DashboardCategory category = getDashboardTiles();
+ final DashboardCategory category =
+ mDashboardFeatureProvider.getTilesForCategory(getCategoryKey());
if (category == null) {
return;
}
-
+ mSummaryLoader.setListening(true);
final Activity activity = getActivity();
if (activity instanceof SettingsDrawerActivity) {
mListeningToCategoryChange = true;
@@ -86,6 +90,19 @@
}
@Override
+ public void notifySummaryChanged(Tile tile) {
+ final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile);
+ final Preference pref = findPreference(key);
+ if (pref == null) {
+ Log.d(getLogTag(),
+ String.format("Can't find pref by key %s, skipping update summary %s/%s",
+ key, tile.title, tile.summary));
+ return;
+ }
+ pref.setSummary(tile.summary);
+ }
+
+ @Override
public boolean onPreferenceTreeClick(Preference preference) {
Collection<PreferenceController> controllers = mPreferenceControllers.values();
// Give all controllers a chance to handle click.
@@ -100,6 +117,7 @@
@Override
public void onStop() {
super.onStop();
+ mSummaryLoader.setListening(false);
if (mListeningToCategoryChange) {
final Activity activity = getActivity();
if (activity instanceof SettingsDrawerActivity) {
@@ -119,9 +137,9 @@
}
/**
- * Returns {@link DashboardCategory} for this fragment.
+ * Returns the CategoryKey for loading {@link DashboardCategory} for this fragment.
*/
- protected abstract DashboardCategory getDashboardTiles();
+ protected abstract String getCategoryKey();
/**
* Displays resource based tiles.
@@ -135,7 +153,8 @@
*/
private final void displayDashboardTiles(final String TAG, PreferenceScreen screen) {
final Context context = getContext();
- final DashboardCategory category = getDashboardTiles();
+ final DashboardCategory category =
+ mDashboardFeatureProvider.getTilesForCategory(getCategoryKey());
if (category == null) {
Log.d(TAG, "NO dynamic tiles for " + TAG);
return;
@@ -145,6 +164,13 @@
Log.d(TAG, "tile list is empty, skipping category " + category.title);
return;
}
+ // There are dashboard tiles, so we need to install SummaryLoader.
+ if (mSummaryLoader != null) {
+ mSummaryLoader.release();
+ }
+ mSummaryLoader = new SummaryLoader(getActivity(), getCategoryKey());
+ mSummaryLoader.setSummaryConsumer(this);
+ // Install dashboard tiles.
for (Tile tile : tiles) {
final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile);
if (TextUtils.isEmpty(key)) {