OSDN Git Service

Dashboard performance work
authorJason Monk <jmonk@google.com>
Fri, 29 Apr 2016 13:25:36 +0000 (09:25 -0400)
committerJason Monk <jmonk@google.com>
Fri, 6 May 2016 17:17:47 +0000 (13:17 -0400)
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

res/layout/dashboard_tile.xml
src/com/android/settings/dashboard/DashboardAdapter.java
src/com/android/settings/dashboard/DashboardSummary.java
src/com/android/settings/dashboard/conditional/ConditionManager.java

index d05af83..fa7a63b 100644 (file)
@@ -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"
index 8b29273..fadc023 100644 (file)
@@ -18,9 +18,12 @@ package com.android.settings.dashboard;
 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 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
     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 class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
 
     public DashboardAdapter(Context context) {
         mContext = context;
-        mSuggestionsChecks = new SuggestionsChecks(mContext);
+        mCache = new IconCache(context);
 
         setHasStableIds(true);
         setShowingAll(true);
@@ -89,15 +92,9 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
         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 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
             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 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
         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 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
     }
 
     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 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
 
     @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 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
         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;
index 66b3730..2e93880 100644 (file)
@@ -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<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 @@ public class DashboardSummary extends InstrumentedFragment
         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);
+        }
+    }
 }
index 0d02ae2..128ac27 100644 (file)
@@ -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<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 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<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());