From 0bb598c4d0c556ed509b8a0d1a365437e566348e Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Wed, 4 Jan 2017 17:48:09 -0800 Subject: [PATCH] Fix the animation issue in DashboardSummary 1. When condition is inserted, only scroll to top when previous position is at the top. 2. Clean condition status after it is removed. So the next time you insert a condition view, it will always be collapsed. Bug: 33839780 Bug: 34115341 Test: make -j40 RunSettingsRoboTests Change-Id: I7f48524917c3119ec24b2f67ba506f381573a391 --- .../settings/dashboard/DashboardAdapter.java | 5 +- .../settings/dashboard/DashboardSummary.java | 6 +- .../dashboard/DashboardAdapterTest.java | 62 +++++++++++++++++++ .../dashboard/DashboardSummaryTest.java | 29 ++++++++- 4 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java index 8ff5607a590..8b97f04e4b5 100644 --- a/src/com/android/settings/dashboard/DashboardAdapter.java +++ b/src/com/android/settings/dashboard/DashboardAdapter.java @@ -20,6 +20,7 @@ import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.os.Bundle; +import android.support.annotation.VisibleForTesting; import android.support.v7.util.DiffUtil; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; @@ -58,9 +59,10 @@ public class DashboardAdapter extends RecyclerView.Adapter> { diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java new file mode 100644 index 00000000000..187e2debb65 --- /dev/null +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.dashboard; + +import android.content.Context; +import android.view.View; +import com.android.settings.SettingsRobolectricTestRunner; +import com.android.settings.TestConfig; +import com.android.settings.core.instrumentation.MetricsFeatureProvider; +import com.android.settings.dashboard.conditional.Condition; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.when; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class DashboardAdapterTest { + @Mock + private Context mContext; + @Mock + private View mView; + @Mock + private Condition mCondition; + @Mock + private MetricsFeatureProvider mMetricsFeatureProvider; + private DashboardAdapter mDashboardAdapter; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mDashboardAdapter = new DashboardAdapter(mContext, null, mMetricsFeatureProvider, + null, null); + when(mView.getTag()).thenReturn(mCondition); + } + + @Test + public void testSetConditions_AfterSetConditions_ExpandedConditionNull() { + mDashboardAdapter.onExpandClick(mView); + assertThat(mDashboardAdapter.mDashboardData.getExpandedCondition()).isEqualTo(mCondition); + mDashboardAdapter.setConditions(null); + assertThat(mDashboardAdapter.mDashboardData.getExpandedCondition()).isNull(); + } +} diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java index 69836d8a365..9627e2ce045 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java @@ -18,8 +18,11 @@ package com.android.settings.dashboard; import android.app.Activity; +import android.support.v7.widget.LinearLayoutManager; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settings.dashboard.conditional.ConditionManager; +import com.android.settings.dashboard.conditional.FocusRecyclerView; import com.android.settingslib.drawer.CategoryKey; import org.junit.Before; @@ -32,6 +35,7 @@ import org.robolectric.util.ReflectionHelpers; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -44,6 +48,12 @@ public class DashboardSummaryTest { private DashboardAdapter mAdapter; @Mock private DashboardFeatureProvider mDashboardFeatureProvider; + @Mock + private FocusRecyclerView mDashboard; + @Mock + private LinearLayoutManager mLayoutManager; + @Mock + private ConditionManager mConditionManager; private DashboardSummary mSummary; @@ -54,6 +64,9 @@ public class DashboardSummaryTest { ReflectionHelpers.setField(mSummary, "mAdapter", mAdapter); ReflectionHelpers.setField(mSummary, "mDashboardFeatureProvider", mDashboardFeatureProvider); + ReflectionHelpers.setField(mSummary, "mDashboard", mDashboard); + ReflectionHelpers.setField(mSummary, "mLayoutManager", mLayoutManager); + ReflectionHelpers.setField(mSummary, "mConditionManager", mConditionManager); } @Test @@ -63,4 +76,18 @@ public class DashboardSummaryTest { mSummary.updateCategoryAndSuggestion(null); verify(mDashboardFeatureProvider).getTilesForCategory(CategoryKey.CATEGORY_HOMEPAGE); } -} + + @Test + public void onConditionChanged_PositionAtTop_ScrollToTop() { + when(mLayoutManager.findFirstCompletelyVisibleItemPosition()).thenReturn(1); + mSummary.onConditionsChanged(); + verify(mDashboard).scrollToPosition(0); + } + + @Test + public void onConditionChanged_PositionNotTop_RemainPosition() { + when(mLayoutManager.findFirstCompletelyVisibleItemPosition()).thenReturn(2); + mSummary.onConditionsChanged(); + verify(mDashboard, never()).scrollToPosition(0); + } +} \ No newline at end of file