From: Jason Monk Date: Fri, 29 Apr 2016 13:25:36 +0000 (-0400) Subject: Dashboard performance work X-Git-Tag: android-x86-7.1-r1~456^2~134^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=2386dfc18d7b1b293b630b6527e078c8c5086d07;p=android-x86%2Fpackages-apps-Settings.git Dashboard performance work Push more stuff to backround threads (this will cause conditions/suggestions to load slightly slower than normal content) and cache more info. Fixes: 28613950 Bug: 28435146 Change-Id: I1080930e8f31c7f12a2d89f266bfd3236979cf40 --- diff --git a/res/layout/dashboard_tile.xml b/res/layout/dashboard_tile.xml index d05af83495..fa7a63bde0 100644 --- a/res/layout/dashboard_tile.xml +++ b/res/layout/dashboard_tile.xml @@ -16,6 +16,7 @@ mItems = new ArrayList<>(); private final List mTypes = new ArrayList<>(); private final List mIds = new ArrayList<>(); + private final IconCache mCache; private final Context mContext; - private final SuggestionsChecks mSuggestionsChecks; private List mCategories; private List mConditions; @@ -79,7 +82,7 @@ public class DashboardAdapter extends RecyclerView.Adapter suggestions, SuggestionParser parser) { + mSuggestions = suggestions; + mSuggestionParser = parser; recountItems(); } @@ -226,12 +223,8 @@ public class DashboardAdapter extends RecyclerView.Adapter mMap = new ArrayMap<>(); + + public IconCache(Context context) { + mContext = context; + } + + public Drawable getIcon(Icon icon) { + Drawable drawable = mMap.get(icon); + if (drawable == null) { + drawable = icon.loadDrawable(mContext); + mMap.put(icon, drawable); + } + return drawable; + } + } + public static class DashboardItemHolder extends RecyclerView.ViewHolder { public final ImageView icon; public final TextView title; diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java index 66b3730e61..2e93880da0 100644 --- a/src/com/android/settings/dashboard/DashboardSummary.java +++ b/src/com/android/settings/dashboard/DashboardSummary.java @@ -17,6 +17,7 @@ package com.android.settings.dashboard; import android.content.Context; +import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.util.Log; @@ -27,7 +28,6 @@ import android.view.View; import android.view.ViewGroup; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; -import com.android.settingslib.HelpUtils; import com.android.settings.InstrumentedFragment; import com.android.settings.R; import com.android.settings.Settings; @@ -36,6 +36,7 @@ import com.android.settings.dashboard.conditional.Condition; import com.android.settings.dashboard.conditional.ConditionAdapterUtils; import com.android.settings.dashboard.conditional.ConditionManager; import com.android.settings.dashboard.conditional.FocusRecyclerView; +import com.android.settingslib.HelpUtils; import com.android.settingslib.SuggestionParser; import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.SettingsDrawerActivity; @@ -69,6 +70,7 @@ public class DashboardSummary extends InstrumentedFragment private ConditionManager mConditionManager; private SuggestionParser mSuggestionParser; private LinearLayoutManager mLayoutManager; + private SuggestionsChecks mSuggestionsChecks; @Override protected int getMetricsCategory() { @@ -88,6 +90,7 @@ public class DashboardSummary extends InstrumentedFragment mConditionManager = ConditionManager.get(context); mSuggestionParser = new SuggestionParser(context, context.getSharedPreferences(SUGGESTIONS, 0), R.xml.suggestion_ordering); + mSuggestionsChecks = new SuggestionsChecks(getContext()); if (DEBUG_TIMING) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime) + " ms"); } @@ -118,9 +121,11 @@ public class DashboardSummary extends InstrumentedFragment MetricsLogger.visible(getContext(), c.getMetricsConstant()); } } - for (Tile suggestion : mAdapter.getSuggestions()) { - MetricsLogger.action(getContext(), MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, - DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion)); + if (mAdapter.getSuggestions() != null) { + for (Tile suggestion : mAdapter.getSuggestions()) { + MetricsLogger.action(getContext(), MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, + DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion)); + } } if (DEBUG_TIMING) Log.d(TAG, "onResume took " + (System.currentTimeMillis() - startTime) + " ms"); @@ -200,17 +205,12 @@ public class DashboardSummary extends InstrumentedFragment return; } - long start = System.currentTimeMillis(); - // TODO: Cache summaries from old categories somehow. List categories = ((SettingsActivity) getActivity()).getDashboardCategories(); mAdapter.setCategories(categories); // recheck to see if any suggestions have been changed. - mAdapter.setSuggestions(mSuggestionParser); - - long delta = System.currentTimeMillis() - start; - Log.d(TAG, "rebuildUI took: " + delta + " ms"); + new SuggestionLoader().execute(); } @Override @@ -223,4 +223,24 @@ public class DashboardSummary extends InstrumentedFragment Log.d(TAG, "onConditionsChanged"); mAdapter.setConditions(mConditionManager.getConditions()); } + + private class SuggestionLoader extends AsyncTask> { + + @Override + protected List doInBackground(Void... params) { + List suggestions = mSuggestionParser.getSuggestions(); + for (int i = 0; i < suggestions.size(); i++) { + if (mSuggestionsChecks.isSuggestionComplete(suggestions.get(i))) { + mAdapter.disableSuggestion(suggestions.get(i)); + suggestions.remove(i--); + } + } + return suggestions; + } + + @Override + protected void onPostExecute(List tiles) { + mAdapter.setSuggestions(tiles, mSuggestionParser); + } + } } diff --git a/src/com/android/settings/dashboard/conditional/ConditionManager.java b/src/com/android/settings/dashboard/conditional/ConditionManager.java index 0d02ae2a44..128ac270a6 100644 --- a/src/com/android/settings/dashboard/conditional/ConditionManager.java +++ b/src/com/android/settings/dashboard/conditional/ConditionManager.java @@ -16,6 +16,7 @@ package com.android.settings.dashboard.conditional; import android.content.Context; +import android.os.AsyncTask; import android.os.PersistableBundle; import android.util.Log; import android.util.Xml; @@ -49,18 +50,14 @@ public class ConditionManager { private final Context mContext; private final ArrayList mConditions; - private final File mXmlFile; + private File mXmlFile; private final ArrayList mListeners = new ArrayList<>(); private ConditionManager(Context context) { mContext = context; mConditions = new ArrayList(); - mXmlFile = new File(context.getFilesDir(), FILE_NAME); - if (mXmlFile.exists()) { - readFromXml(); - } - addMissingConditions(); + new ConditionLoader().execute(); } public void refreshAll() { @@ -209,12 +206,33 @@ public class ConditionManager { public void addListener(ConditionListener listener) { mListeners.add(listener); + listener.onConditionsChanged(); } public void remListener(ConditionListener listener) { mListeners.remove(listener); } + private class ConditionLoader extends AsyncTask { + @Override + protected Void doInBackground(Void... params) { + mXmlFile = new File(mContext.getFilesDir(), FILE_NAME); + if (mXmlFile.exists()) { + readFromXml(); + } + addMissingConditions(); + return null; + } + + @Override + protected void onPostExecute(Void aVoid) { + final int N = mListeners.size(); + for (int i = 0; i < N; i++) { + mListeners.get(i).onConditionsChanged(); + } + } + } + public static ConditionManager get(Context context) { if (sInstance == null) { sInstance = new ConditionManager(context.getApplicationContext());