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:
@@ -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) {
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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() {
|
private void rebuildUI(boolean rebuildSuggestions) {
|
||||||
if (!isAdded()) {
|
if (rebuildSuggestions) {
|
||||||
Log.w(TAG, "Cannot build the DashboardSummary UI yet as the Fragment is not added");
|
// recheck to see if any suggestions have been changed.
|
||||||
return;
|
new SuggestionLoader().execute();
|
||||||
}
|
// Set categories on their own if loading suggestions takes too long.
|
||||||
|
mHandler.postDelayed(() -> {
|
||||||
// recheck to see if any suggestions have been changed.
|
updateCategoryAndSuggestion(null /* tiles */);
|
||||||
new SuggestionLoader().execute();
|
}, MAX_WAIT_MILLIS);
|
||||||
// Set categories on their own if loading suggestions takes too long.
|
} else {
|
||||||
mHandler.postDelayed(() -> {
|
|
||||||
updateCategoryAndSuggestion(null /* tiles */);
|
updateCategoryAndSuggestion(null /* tiles */);
|
||||||
}, MAX_WAIT_MILLIS);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user