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
This commit is contained in:
@@ -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<DashboardAdapter.Dash
|
||||
private final IconCache mCache;
|
||||
private final Context mContext;
|
||||
private final MetricsFeatureProvider mMetricsFeatureProvider;
|
||||
private DashboardData mDashboardData;
|
||||
private SuggestionParser mSuggestionParser;
|
||||
|
||||
@VisibleForTesting DashboardData mDashboardData;
|
||||
|
||||
private View.OnClickListener mTileClickListener = new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
@@ -157,6 +159,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
Log.d(TAG, "adapter setConditions called");
|
||||
mDashboardData = new DashboardData.Builder(prevData)
|
||||
.setConditions(conditions)
|
||||
.setExpandedCondition(null)
|
||||
.build();
|
||||
notifyDashboardDataChanged(prevData);
|
||||
}
|
||||
|
@@ -27,7 +27,6 @@ import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsActivity;
|
||||
@@ -249,8 +248,11 @@ public class DashboardSummary extends InstrumentedPreferenceFragment
|
||||
@Override
|
||||
public void onConditionsChanged() {
|
||||
Log.d(TAG, "onConditionsChanged");
|
||||
final boolean scrollToTop = mLayoutManager.findFirstCompletelyVisibleItemPosition() <= 1;
|
||||
mAdapter.setConditions(mConditionManager.getConditions());
|
||||
mDashboard.scrollToPosition(0);
|
||||
if (scrollToTop) {
|
||||
mDashboard.scrollToPosition(0);
|
||||
}
|
||||
}
|
||||
|
||||
private class SuggestionLoader extends AsyncTask<Void, Void, List<Tile>> {
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user