From b76de265a2574264c7bfe592837894c559cfd06d Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Mon, 11 Jul 2016 18:09:15 -0700 Subject: [PATCH] Reduce the number of times that dataset changed is triggerd in DashboardAdapter 1. Save the suggestion list and the category list into the instance state so that it will be available on warm start, and avoid the need to reload the data. 2. Add the condition list to the constructor parameters for DashboardAdapter, so that it does not need to setConditions() separately which will trigger notifyDataSetChanged() Bug: 30055644 Change-Id: Ia04fa3a25b13d2dacf6baf5f412d662a595fb6dd --- .../settings/dashboard/DashboardAdapter.java | 34 ++++++++++++++++--- .../settings/dashboard/DashboardSummary.java | 8 +++-- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java index 7c767943674..b49bb7b4459 100644 --- a/src/com/android/settings/dashboard/DashboardAdapter.java +++ b/src/com/android/settings/dashboard/DashboardAdapter.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; +import android.os.Bundle; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; @@ -45,10 +46,13 @@ import com.android.settingslib.drawer.Tile; import java.util.ArrayList; import java.util.List; +import java.util.Objects; public class DashboardAdapter extends RecyclerView.Adapter implements View.OnClickListener { public static final String TAG = "DashboardAdapter"; + private static final String STATE_SUGGESTION_LIST = "suggestion_list"; + private static final String STATE_CATEGORY_LIST = "category_list"; private static final int NS_SPACER = 0; private static final int NS_SUGGESTION = 1000; private static final int NS_ITEMS = 2000; @@ -80,13 +84,20 @@ public class DashboardAdapter extends RecyclerView.Adapter conditions) { mContext = context; mCache = new IconCache(context); mSuggestionParser = parser; + mConditions = conditions; setHasStableIds(true); setShowingAll(true); + + if (savedInstanceState != null) { + mSuggestions = savedInstanceState.getParcelableArrayList(STATE_SUGGESTION_LIST); + mCategories = savedInstanceState.getParcelableArrayList(STATE_CATEGORY_LIST); + } } public List getSuggestions() { @@ -94,8 +105,10 @@ public class DashboardAdapter extends RecyclerView.Adapter suggestions) { - mSuggestions = suggestions; - recountItems(); + if (!Objects.equals(mSuggestions, suggestions)) { + mSuggestions = suggestions; + recountItems(); + } } public Tile getTile(ComponentName component) { @@ -111,6 +124,9 @@ public class DashboardAdapter extends RecyclerView.Adapter categories) { + if (Objects.equals(mCategories, categories)) { + return; + } mCategories = categories; // TODO: Better place for tinting? @@ -133,8 +149,10 @@ public class DashboardAdapter extends RecyclerView.Adapter conditions) { - mConditions = conditions; - recountItems(); + if (!Objects.equals(mConditions, conditions)) { + mConditions = conditions; + recountItems(); + } } public boolean isShowingAll() { @@ -422,6 +440,12 @@ public class DashboardAdapter extends RecyclerView.Adapter(mSuggestions)); + outState.putParcelableArrayList(STATE_CATEGORY_LIST, + new ArrayList(mCategories)); + } + private static class IconCache { private final Context mContext; diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java index e04b255b15a..24b5aee7b7f 100644 --- a/src/com/android/settings/dashboard/DashboardSummary.java +++ b/src/com/android/settings/dashboard/DashboardSummary.java @@ -165,6 +165,9 @@ public class DashboardSummary extends InstrumentedFragment super.onSaveInstanceState(outState); if (mLayoutManager == null) return; outState.putInt(EXTRA_SCROLL_POSITION, mLayoutManager.findFirstVisibleItemPosition()); + if (mAdapter != null) { + mAdapter.onSaveInstanceState(outState); + } } @Override @@ -181,14 +184,13 @@ public class DashboardSummary extends InstrumentedFragment mDashboard.setHasFixedSize(true); mDashboard.setListener(this); mDashboard.addItemDecoration(new DashboardDecorator(getContext())); - mAdapter = new DashboardAdapter(getContext(), mSuggestionParser); - mAdapter.setConditions(mConditionManager.getConditions()); + mAdapter = new DashboardAdapter(getContext(), mSuggestionParser, bundle, + mConditionManager.getConditions()); mDashboard.setAdapter(mAdapter); mSummaryLoader.setAdapter(mAdapter); ConditionAdapterUtils.addDismiss(mDashboard); if (DEBUG_TIMING) Log.d(TAG, "onViewCreated took " + (System.currentTimeMillis() - startTime) + " ms"); - rebuildUI(); }