Skip redundant SuggestionLoader run during app start.

also skip DiffUtil when drawing first frame.


Fix: 34103984
Test: make RunSettingsRoboTests
Change-Id: I4891d1bca1f17c437444761eaf3002624934014d
This commit is contained in:
Fan Zhang
2017-02-07 17:40:59 -08:00
parent 38c15a53e2
commit efba6b4e14
4 changed files with 46 additions and 21 deletions

View File

@@ -527,8 +527,9 @@ public class SettingsActivity extends SettingsDrawerActivity
} }
} }
if (DEBUG_TIMING) Log.d(LOG_TAG, "onCreate took " + (System.currentTimeMillis() - startTime) if (DEBUG_TIMING) {
+ " ms"); Log.d(LOG_TAG, "onCreate took " + (System.currentTimeMillis() - startTime) + " ms");
}
} }
public void setDisplaySearchMenu(boolean displaySearch) { public void setDisplaySearchMenu(boolean displaySearch) {

View File

@@ -63,6 +63,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
private final MetricsFeatureProvider mMetricsFeatureProvider; private final MetricsFeatureProvider mMetricsFeatureProvider;
private final DashboardFeatureProvider mDashboardFeatureProvider; private final DashboardFeatureProvider mDashboardFeatureProvider;
private SuggestionParser mSuggestionParser; private SuggestionParser mSuggestionParser;
private boolean mFirstFrameDrawn;
@VisibleForTesting @VisibleForTesting
DashboardData mDashboardData; DashboardData mDashboardData;
@@ -162,6 +163,15 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
notifyDashboardDataChanged(prevData); notifyDashboardDataChanged(prevData);
} }
public void setCategory(List<DashboardCategory> category) {
final DashboardData prevData = mDashboardData;
Log.d(TAG, "adapter setCategory called");
mDashboardData = new DashboardData.Builder(prevData)
.setCategories(category)
.build();
notifyDashboardDataChanged(prevData);
}
public void setConditions(List<Condition> conditions) { public void setConditions(List<Condition> conditions) {
final DashboardData prevData = mDashboardData; final DashboardData prevData = mDashboardData;
Log.d(TAG, "adapter setConditions called"); Log.d(TAG, "adapter setConditions called");
@@ -304,11 +314,12 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
} }
private void notifyDashboardDataChanged(DashboardData prevData) { private void notifyDashboardDataChanged(DashboardData prevData) {
if (prevData != null) { if (mFirstFrameDrawn && prevData != null) {
final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DashboardData final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DashboardData
.ItemsDataDiffCallback(prevData.getItemList(), mDashboardData.getItemList())); .ItemsDataDiffCallback(prevData.getItemList(), mDashboardData.getItemList()));
diffResult.dispatchUpdatesTo(this); diffResult.dispatchUpdatesTo(this);
} else { } else {
mFirstFrameDrawn = true;
notifyDataSetChanged(); notifyDataSetChanged();
} }
} }

View File

@@ -27,6 +27,7 @@ import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
@@ -231,26 +232,25 @@ public class DashboardSummary extends InstrumentedFragment
Log.d(TAG, "onViewCreated took " Log.d(TAG, "onViewCreated took "
+ (System.currentTimeMillis() - startTime) + " ms"); + (System.currentTimeMillis() - startTime) + " ms");
} }
rebuildUI(); rebuildUI(true /* rebuildSuggestions */);
}
private void rebuildUI() {
if (!isAdded()) {
Log.w(TAG, "Cannot build the DashboardSummary UI yet as the Fragment is not added");
return;
} }
private void rebuildUI(boolean rebuildSuggestions) {
if (rebuildSuggestions) {
// recheck to see if any suggestions have been changed. // recheck to see if any suggestions have been changed.
new SuggestionLoader().execute(); new SuggestionLoader().execute();
// Set categories on their own if loading suggestions takes too long. // Set categories on their own if loading suggestions takes too long.
mHandler.postDelayed(() -> { mHandler.postDelayed(() -> {
updateCategoryAndSuggestion(null /* tiles */); updateCategoryAndSuggestion(null /* tiles */);
}, MAX_WAIT_MILLIS); }, MAX_WAIT_MILLIS);
} else {
updateCategoryAndSuggestion(null /* tiles */);
}
} }
@Override @Override
public void onCategoriesChanged() { public void onCategoriesChanged() {
rebuildUI(); rebuildUI(false /* rebuildSuggestions */);
} }
@Override @Override
@@ -264,7 +264,6 @@ public class DashboardSummary extends InstrumentedFragment
} }
private class SuggestionLoader extends AsyncTask<Void, Void, List<Tile>> { private class SuggestionLoader extends AsyncTask<Void, Void, List<Tile>> {
@Override @Override
protected List<Tile> doInBackground(Void... params) { protected List<Tile> doInBackground(Void... params) {
final Context context = getContext(); final Context context = getContext();
@@ -307,7 +306,7 @@ public class DashboardSummary extends InstrumentedFragment
} }
@VisibleForTesting @VisibleForTesting
void updateCategoryAndSuggestion(List<Tile> tiles) { void updateCategoryAndSuggestion(List<Tile> suggestions) {
final Activity activity = getActivity(); final Activity activity = getActivity();
if (activity == null) { if (activity == null) {
return; return;
@@ -319,10 +318,14 @@ public class DashboardSummary extends InstrumentedFragment
List<DashboardCategory> categories = new ArrayList<>(); List<DashboardCategory> categories = new ArrayList<>();
categories.add(mDashboardFeatureProvider.getTilesForCategory( categories.add(mDashboardFeatureProvider.getTilesForCategory(
CategoryKey.CATEGORY_HOMEPAGE)); CategoryKey.CATEGORY_HOMEPAGE));
mAdapter.setCategoriesAndSuggestions(categories, tiles); if (suggestions != null) {
mAdapter.setCategoriesAndSuggestions(categories, suggestions);
} else {
mAdapter.setCategory(categories);
}
} else { } else {
mAdapter.setCategoriesAndSuggestions( mAdapter.setCategoriesAndSuggestions(
((SettingsActivity) activity).getDashboardCategories(), tiles); ((SettingsActivity) activity).getDashboardCategories(), suggestions);
} }
} }
} }

View File

@@ -17,8 +17,8 @@
package com.android.settings.dashboard; package com.android.settings.dashboard;
import android.app.Activity; import android.app.Activity;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.dashboard.conditional.ConditionManager; import com.android.settings.dashboard.conditional.ConditionManager;
@@ -33,6 +33,7 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers; import org.robolectric.util.ReflectionHelpers;
import static org.mockito.Matchers.anyList;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
@@ -90,4 +91,13 @@ public class DashboardSummaryTest {
mSummary.onConditionsChanged(); mSummary.onConditionsChanged();
verify(mDashboard, never()).scrollToPosition(0); verify(mDashboard, never()).scrollToPosition(0);
} }
@Test
public void onCategoryChanged_updateCategoryOnly() {
doReturn(mock(Activity.class)).when(mSummary).getActivity();
when(mDashboardFeatureProvider.isEnabled()).thenReturn(true);
mSummary.onCategoriesChanged();
verify(mAdapter).setCategory(anyList());
}
} }