Work on settings startup speed

- Cut down on amount stored in conditions xml
 - Remove extra work from dashboard startup
 - Move summary to min priority

Change-Id: I51ca3828e4446632d6faa60dcfbab3446d19d335
Fixes: 28134360
This commit is contained in:
Jason Monk
2016-04-12 11:35:02 -04:00
parent f8b2180b96
commit 5673ced93c
5 changed files with 58 additions and 31 deletions

View File

@@ -85,6 +85,10 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
setShowingAll(true); setShowingAll(true);
} }
public List<Tile> getSuggestions() {
return mSuggestions;
}
public void setSuggestions(SuggestionParser suggestionParser) { public void setSuggestions(SuggestionParser suggestionParser) {
mSuggestionParser = suggestionParser; mSuggestionParser = suggestionParser;
mSuggestions = suggestionParser.getSuggestions(); mSuggestions = suggestionParser.getSuggestions();

View File

@@ -77,19 +77,19 @@ public class DashboardSummary extends InstrumentedFragment
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
long startTime = System.currentTimeMillis();
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
long startTime = System.currentTimeMillis();
List<DashboardCategory> categories = List<DashboardCategory> categories =
((SettingsActivity) getActivity()).getDashboardCategories(); ((SettingsActivity) getActivity()).getDashboardCategories();
mSummaryLoader = new SummaryLoader(getActivity(), categories); mSummaryLoader = new SummaryLoader(getActivity(), categories);
setHasOptionsMenu(true); setHasOptionsMenu(true);
if (DEBUG_TIMING) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime)
+ " ms");
Context context = getContext(); Context context = getContext();
mConditionManager = ConditionManager.get(context); mConditionManager = ConditionManager.get(context);
mSuggestionParser = new SuggestionParser(context, mSuggestionParser = new SuggestionParser(context,
context.getSharedPreferences(SUGGESTIONS, 0), R.xml.suggestion_ordering); context.getSharedPreferences(SUGGESTIONS, 0), R.xml.suggestion_ordering);
if (DEBUG_TIMING) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime)
+ " ms");
} }
@Override @Override
@@ -108,17 +108,22 @@ public class DashboardSummary extends InstrumentedFragment
@Override @Override
public void onResume() { public void onResume() {
long startTime = System.currentTimeMillis();
super.onResume(); super.onResume();
((SettingsDrawerActivity) getActivity()).addCategoryListener(this); ((SettingsDrawerActivity) getActivity()).addCategoryListener(this);
mSummaryLoader.setListening(true); mSummaryLoader.setListening(true);
for (Condition c : mConditionManager.getVisibleConditions()) { for (Condition c : mConditionManager.getConditions()) {
if (c.shouldShow()) {
MetricsLogger.visible(getContext(), c.getMetricsConstant()); MetricsLogger.visible(getContext(), c.getMetricsConstant());
} }
for (Tile suggestion : mSuggestionParser.getSuggestions()) { }
for (Tile suggestion : mAdapter.getSuggestions()) {
MetricsLogger.action(getContext(), MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsLogger.action(getContext(), MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion)); DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion));
} }
if (DEBUG_TIMING) Log.d(TAG, "onResume took " + (System.currentTimeMillis() - startTime)
+ " ms");
} }
@Override @Override
@@ -127,10 +132,12 @@ public class DashboardSummary extends InstrumentedFragment
((SettingsDrawerActivity) getActivity()).remCategoryListener(this); ((SettingsDrawerActivity) getActivity()).remCategoryListener(this);
mSummaryLoader.setListening(false); mSummaryLoader.setListening(false);
for (Condition c : mConditionManager.getVisibleConditions()) { for (Condition c : mConditionManager.getConditions()) {
if (c.shouldShow()) {
MetricsLogger.hidden(getContext(), c.getMetricsConstant()); MetricsLogger.hidden(getContext(), c.getMetricsConstant());
} }
for (Tile suggestion : mSuggestionParser.getSuggestions()) { }
for (Tile suggestion : mAdapter.getSuggestions()) {
MetricsLogger.action(getContext(), MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, MetricsLogger.action(getContext(), MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION,
DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion)); DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion));
} }
@@ -138,12 +145,15 @@ public class DashboardSummary extends InstrumentedFragment
@Override @Override
public void onWindowFocusChanged(boolean hasWindowFocus) { public void onWindowFocusChanged(boolean hasWindowFocus) {
long startTime = System.currentTimeMillis();
if (hasWindowFocus) { if (hasWindowFocus) {
mConditionManager.addListener(this); mConditionManager.addListener(this);
mConditionManager.refreshAll(); mConditionManager.refreshAll();
} else { } else {
mConditionManager.remListener(this); mConditionManager.remListener(this);
} }
if (DEBUG_TIMING) Log.d(TAG, "onWindowFocusChanged took "
+ (System.currentTimeMillis() - startTime) + " ms");
} }
@Override @Override
@@ -161,6 +171,7 @@ public class DashboardSummary extends InstrumentedFragment
@Override @Override
public void onViewCreated(View view, Bundle bundle) { public void onViewCreated(View view, Bundle bundle) {
long startTime = System.currentTimeMillis();
mDashboard = (FocusRecyclerView) view.findViewById(R.id.dashboard_container); mDashboard = (FocusRecyclerView) view.findViewById(R.id.dashboard_container);
mLayoutManager = new LinearLayoutManager(getContext()); mLayoutManager = new LinearLayoutManager(getContext());
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
@@ -174,10 +185,11 @@ public class DashboardSummary extends InstrumentedFragment
mDashboard.addItemDecoration(new DashboardDecorator(getContext())); mDashboard.addItemDecoration(new DashboardDecorator(getContext()));
mAdapter = new DashboardAdapter(getContext()); mAdapter = new DashboardAdapter(getContext());
mAdapter.setConditions(mConditionManager.getConditions()); mAdapter.setConditions(mConditionManager.getConditions());
mAdapter.setSuggestions(mSuggestionParser);
mDashboard.setAdapter(mAdapter); mDashboard.setAdapter(mAdapter);
mSummaryLoader.setAdapter(mAdapter); mSummaryLoader.setAdapter(mAdapter);
ConditionAdapterUtils.addDismiss(mDashboard); ConditionAdapterUtils.addDismiss(mDashboard);
if (DEBUG_TIMING) Log.d(TAG, "onViewCreated took "
+ (System.currentTimeMillis() - startTime) + " ms");
rebuildUI(); rebuildUI();
} }

View File

@@ -17,11 +17,8 @@ package com.android.settings.dashboard;
import android.app.Activity; import android.app.Activity;
import android.content.ComponentName; import android.content.ComponentName;
import android.os.Bundle; import android.os.*;
import android.os.Handler; import android.os.Process;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Log; import android.util.Log;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
@@ -51,7 +48,7 @@ public class SummaryLoader {
public SummaryLoader(Activity activity, List<DashboardCategory> categories) { public SummaryLoader(Activity activity, List<DashboardCategory> categories) {
mHandler = new Handler(); mHandler = new Handler();
mWorkerThread = new HandlerThread("SummaryLoader"); mWorkerThread = new HandlerThread("SummaryLoader", Process.THREAD_PRIORITY_BACKGROUND);
mWorkerThread.start(); mWorkerThread.start();
mWorker = new Worker(mWorkerThread.getLooper()); mWorker = new Worker(mWorkerThread.getLooper());
mActivity = activity; mActivity = activity;

View File

@@ -35,7 +35,8 @@ public abstract class Condition {
private boolean mIsActive; private boolean mIsActive;
private long mLastStateChange; private long mLastStateChange;
public Condition(ConditionManager manager) { // All conditions must live in this package.
Condition(ConditionManager manager) {
mManager = manager; mManager = manager;
} }
@@ -45,11 +46,16 @@ public abstract class Condition {
mLastStateChange = bundle.getLong(KEY_LAST_STATE); mLastStateChange = bundle.getLong(KEY_LAST_STATE);
} }
void saveState(PersistableBundle bundle) { boolean saveState(PersistableBundle bundle) {
if (mIsSilenced) {
bundle.putBoolean(KEY_SILENCE, mIsSilenced); bundle.putBoolean(KEY_SILENCE, mIsSilenced);
}
if (mIsActive) {
bundle.putBoolean(KEY_ACTIVE, mIsActive); bundle.putBoolean(KEY_ACTIVE, mIsActive);
bundle.putLong(KEY_LAST_STATE, mLastStateChange); bundle.putLong(KEY_LAST_STATE, mLastStateChange);
} }
return mIsSilenced || mIsActive;
}
protected void notifyChanged() { protected void notifyChanged() {
mManager.notifyChanged(this); mManager.notifyChanged(this);

View File

@@ -38,10 +38,12 @@ public class ConditionManager {
private static final boolean DEBUG = true; private static final boolean DEBUG = true;
private static final String PKG = "com.android.settings.dashboard.conditional.";
private static final String FILE_NAME = "condition_state.xml"; private static final String FILE_NAME = "condition_state.xml";
private static final String TAG_CONDITIONS = "conditions"; private static final String TAG_CONDITIONS = "cs";
private static final String TAG_CONDITION = "condition"; private static final String TAG_CONDITION = "c";
private static final String ATTR_CLASS = "class"; private static final String ATTR_CLASS = "cls";
private static ConditionManager sInstance; private static ConditionManager sInstance;
@@ -80,6 +82,9 @@ public class ConditionManager {
if (TAG_CONDITION.equals(parser.getName())) { if (TAG_CONDITION.equals(parser.getName())) {
int depth = parser.getDepth(); int depth = parser.getDepth();
String clz = parser.getAttributeValue("", ATTR_CLASS); String clz = parser.getAttributeValue("", ATTR_CLASS);
if (!clz.startsWith(PKG)) {
clz = PKG + clz;
}
Condition condition = createCondition(Class.forName(clz)); Condition condition = createCondition(Class.forName(clz));
PersistableBundle bundle = PersistableBundle.restoreFromXml(parser); PersistableBundle bundle = PersistableBundle.restoreFromXml(parser);
if (DEBUG) Log.d(TAG, "Reading " + clz + " -- " + bundle); if (DEBUG) Log.d(TAG, "Reading " + clz + " -- " + bundle);
@@ -109,13 +114,15 @@ public class ConditionManager {
final int N = mConditions.size(); final int N = mConditions.size();
for (int i = 0; i < N; i++) { for (int i = 0; i < N; i++) {
serializer.startTag("", TAG_CONDITION);
serializer.attribute("", ATTR_CLASS, mConditions.get(i).getClass().getName());
PersistableBundle bundle = new PersistableBundle(); PersistableBundle bundle = new PersistableBundle();
mConditions.get(i).saveState(bundle); if (mConditions.get(i).saveState(bundle)) {
serializer.startTag("", TAG_CONDITION);
final String clz = mConditions.get(i).getClass().getSimpleName();
serializer.attribute("", ATTR_CLASS, clz);
bundle.saveToXml(serializer); bundle.saveToXml(serializer);
serializer.endTag("", TAG_CONDITION); serializer.endTag("", TAG_CONDITION);
} }
}
serializer.endTag("", TAG_CONDITIONS); serializer.endTag("", TAG_CONDITIONS);
serializer.flush(); serializer.flush();
@@ -133,6 +140,7 @@ public class ConditionManager {
addIfMissing(CellularDataCondition.class); addIfMissing(CellularDataCondition.class);
addIfMissing(BackgroundDataCondition.class); addIfMissing(BackgroundDataCondition.class);
addIfMissing(WorkModeCondition.class); addIfMissing(WorkModeCondition.class);
Collections.sort(mConditions, CONDITION_COMPARATOR);
} }
private void addIfMissing(Class<? extends Condition> clz) { private void addIfMissing(Class<? extends Condition> clz) {
@@ -187,12 +195,12 @@ public class ConditionManager {
conditions.add(mConditions.get(i)); conditions.add(mConditions.get(i));
} }
} }
Collections.sort(conditions, CONDITION_COMPARATOR);
return conditions; return conditions;
} }
public void notifyChanged(Condition condition) { public void notifyChanged(Condition condition) {
saveToXml(); saveToXml();
Collections.sort(mConditions, CONDITION_COMPARATOR);
final int N = mListeners.size(); final int N = mListeners.size();
for (int i = 0; i < N; i++) { for (int i = 0; i < N; i++) {
mListeners.get(i).onConditionsChanged(); mListeners.get(i).onConditionsChanged();
@@ -209,7 +217,7 @@ public class ConditionManager {
public static ConditionManager get(Context context) { public static ConditionManager get(Context context) {
if (sInstance == null) { if (sInstance == null) {
sInstance = new ConditionManager(context); sInstance = new ConditionManager(context.getApplicationContext());
} }
return sInstance; return sInstance;
} }