diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java index fba27fb7aac..be5fbdf15f7 100644 --- a/src/com/android/settings/dashboard/DashboardSummary.java +++ b/src/com/android/settings/dashboard/DashboardSummary.java @@ -75,6 +75,7 @@ public class DashboardSummary extends InstrumentedFragment private DashboardFeatureProvider mDashboardFeatureProvider; private SuggestionFeatureProvider mSuggestionFeatureProvider; private boolean isOnCategoriesChangedCalled; + private boolean mOnConditionsChangedCalled; @Override public int getMetricsCategory() { @@ -237,10 +238,21 @@ public class DashboardSummary extends InstrumentedFragment @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 967ed241a2a..f3ed57c2fb1 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.annotation.Config; 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 class DashboardSummaryTest { public void onConditionChanged_PositionAtTop_ScrollToTop() { when(mLayoutManager.findFirstCompletelyVisibleItemPosition()).thenReturn(1); mSummary.onConditionsChanged(); + mSummary.onConditionsChanged(); verify(mDashboard).scrollToPosition(0); } @@ -97,9 +99,23 @@ public class DashboardSummaryTest { 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();