Merge "Fix jank in showing conditions and suggestions in cold start." into oc-mr1-dev am: 51c83353fe
am: e80bb0d5ce
Change-Id: Id3de7150516804bc7a08c665943769c27173fc9a
diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java
index fba27fb..be5fbdf 100644
--- a/src/com/android/settings/dashboard/DashboardSummary.java
+++ b/src/com/android/settings/dashboard/DashboardSummary.java
@@ -75,6 +75,7 @@
private DashboardFeatureProvider mDashboardFeatureProvider;
private SuggestionFeatureProvider mSuggestionFeatureProvider;
private boolean isOnCategoriesChangedCalled;
+ private boolean mOnConditionsChangedCalled;
@Override
public int getMetricsCategory() {
@@ -237,10 +238,21 @@
@Override
public void onConditionsChanged() {
Log.d(TAG, "onConditionsChanged");
- final boolean scrollToTop = mLayoutManager.findFirstCompletelyVisibleItemPosition() <= 1;
- mAdapter.setConditions(mConditionManager.getConditions());
- if (scrollToTop) {
- mDashboard.scrollToPosition(0);
+ // Bypass refreshing the conditions on the first call of onConditionsChanged.
+ // onConditionsChanged is called immediately everytime we start listening to the conditions
+ // change when we gain window focus. Since the conditions are passed to the adapter's
+ // constructor when we create the view, the first handling is not necessary.
+ // But, on the subsequent calls we need to handle it because there might be real changes to
+ // conditions.
+ if (mOnConditionsChangedCalled) {
+ final boolean scrollToTop =
+ mLayoutManager.findFirstCompletelyVisibleItemPosition() <= 1;
+ mAdapter.setConditions(mConditionManager.getConditions());
+ if (scrollToTop) {
+ mDashboard.scrollToPosition(0);
+ }
+ } else {
+ mOnConditionsChangedCalled = true;
}
}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java
index 967ed24..f3ed57c 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java
@@ -36,6 +36,7 @@
import org.robolectric.util.ReflectionHelpers;
import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -90,6 +91,7 @@
public void onConditionChanged_PositionAtTop_ScrollToTop() {
when(mLayoutManager.findFirstCompletelyVisibleItemPosition()).thenReturn(1);
mSummary.onConditionsChanged();
+ mSummary.onConditionsChanged();
verify(mDashboard).scrollToPosition(0);
}
@@ -97,10 +99,24 @@
public void onConditionChanged_PositionNotTop_RemainPosition() {
when(mLayoutManager.findFirstCompletelyVisibleItemPosition()).thenReturn(2);
mSummary.onConditionsChanged();
+ mSummary.onConditionsChanged();
verify(mDashboard, never()).scrollToPosition(0);
}
@Test
+ public void onConditionChanged_firstCall_shouldIgnore() {
+ mSummary.onConditionsChanged();
+ verify(mAdapter, never()).setConditions(any());
+ }
+
+ @Test
+ public void onConditionChanged_secondCall_shouldSetConditionsOnAdapter() {
+ mSummary.onConditionsChanged();
+ mSummary.onConditionsChanged();
+ verify(mAdapter).setConditions(any());
+ }
+
+ @Test
public void onCategoryChanged_noRebuildOnFirstCall() {
doReturn(mock(Activity.class)).when(mSummary).getActivity();
doNothing().when(mSummary).rebuildUI();