Merge "Dashboard performance work" into nyc-dev
diff --git a/res/layout/dashboard_tile.xml b/res/layout/dashboard_tile.xml
index d05af83..fa7a63b 100644
--- a/res/layout/dashboard_tile.xml
+++ b/res/layout/dashboard_tile.xml
@@ -16,6 +16,7 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/dashboard_tile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java
index 8b29273..fadc023 100644
--- a/src/com/android/settings/dashboard/DashboardAdapter.java
+++ b/src/com/android/settings/dashboard/DashboardAdapter.java
@@ -18,9 +18,12 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.TypedValue;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
@@ -60,9 +63,9 @@
private final List<Object> mItems = new ArrayList<>();
private final List<Integer> mTypes = new ArrayList<>();
private final List<Integer> mIds = new ArrayList<>();
+ private final IconCache mCache;
private final Context mContext;
- private final SuggestionsChecks mSuggestionsChecks;
private List<DashboardCategory> mCategories;
private List<Condition> mConditions;
@@ -79,7 +82,7 @@
public DashboardAdapter(Context context) {
mContext = context;
- mSuggestionsChecks = new SuggestionsChecks(mContext);
+ mCache = new IconCache(context);
setHasStableIds(true);
setShowingAll(true);
@@ -89,15 +92,9 @@
return mSuggestions;
}
- public void setSuggestions(SuggestionParser suggestionParser) {
- mSuggestionParser = suggestionParser;
- mSuggestions = suggestionParser.getSuggestions();
- for (int i = 0; i < mSuggestions.size(); i++) {
- if (mSuggestionsChecks.isSuggestionComplete(mSuggestions.get(i))) {
- disableSuggestion(mSuggestions.get(i));
- mSuggestions.remove(i--);
- }
- }
+ public void setSuggestions(List<Tile> suggestions, SuggestionParser parser) {
+ mSuggestions = suggestions;
+ mSuggestionParser = parser;
recountItems();
}
@@ -226,12 +223,8 @@
case R.layout.dashboard_tile:
final Tile tile = (Tile) mItems.get(position);
onBindTile(holder, tile);
- holder.itemView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- ((SettingsActivity) mContext).openTile(tile);
- }
- });
+ holder.itemView.setTag(tile);
+ holder.itemView.setOnClickListener(this);
break;
case R.layout.suggestion_header:
onBindSuggestionHeader(holder);
@@ -289,7 +282,7 @@
popup.show();
}
- private void disableSuggestion(Tile suggestion) {
+ public void disableSuggestion(Tile suggestion) {
if (mSuggestionParser.dismissSuggestion(suggestion)) {
mContext.getPackageManager().setComponentEnabledSetting(
suggestion.intent.getComponent(),
@@ -323,7 +316,7 @@
}
private void onBindTile(DashboardItemHolder holder, Tile tile) {
- holder.icon.setImageIcon(tile.icon);
+ holder.icon.setImageDrawable(mCache.getIcon(tile.icon));
holder.title.setText(tile.title);
if (!TextUtils.isEmpty(tile.summary)) {
holder.summary.setText(tile.summary);
@@ -365,6 +358,10 @@
@Override
public void onClick(View v) {
+ if (v.getId() == R.id.dashboard_tile) {
+ ((SettingsActivity) mContext).openTile((Tile) v.getTag());
+ return;
+ }
if (v.getTag() == mExpandedCondition) {
MetricsLogger.action(mContext, MetricsEvent.ACTION_SETTINGS_CONDITION_CLICK,
mExpandedCondition.getMetricsConstant());
@@ -409,6 +406,25 @@
return packageName;
}
+ private static class IconCache {
+
+ private final Context mContext;
+ private final ArrayMap<Icon, Drawable> 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 66b3730..2e93880 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.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.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 @@
private ConditionManager mConditionManager;
private SuggestionParser mSuggestionParser;
private LinearLayoutManager mLayoutManager;
+ private SuggestionsChecks mSuggestionsChecks;
@Override
protected int getMetricsCategory() {
@@ -88,6 +90,7 @@
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 @@
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 @@
return;
}
- long start = System.currentTimeMillis();
- // TODO: Cache summaries from old categories somehow.
List<DashboardCategory> 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 @@
Log.d(TAG, "onConditionsChanged");
mAdapter.setConditions(mConditionManager.getConditions());
}
+
+ private class SuggestionLoader extends AsyncTask<Void, Void, List<Tile>> {
+
+ @Override
+ protected List<Tile> doInBackground(Void... params) {
+ List<Tile> 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<Tile> 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 0d02ae2..128ac27 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 @@
private final Context mContext;
private final ArrayList<Condition> mConditions;
- private final File mXmlFile;
+ private File mXmlFile;
private final ArrayList<ConditionListener> mListeners = new ArrayList<>();
private ConditionManager(Context context) {
mContext = context;
mConditions = new ArrayList<Condition>();
- mXmlFile = new File(context.getFilesDir(), FILE_NAME);
- if (mXmlFile.exists()) {
- readFromXml();
- }
- addMissingConditions();
+ new ConditionLoader().execute();
}
public void refreshAll() {
@@ -209,12 +206,33 @@
public void addListener(ConditionListener listener) {
mListeners.add(listener);
+ listener.onConditionsChanged();
}
public void remListener(ConditionListener listener) {
mListeners.remove(listener);
}
+ private class ConditionLoader extends AsyncTask<Void, Void, Void> {
+ @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());