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:
jackqdyulei
2017-01-04 17:48:09 -08:00
parent 3d07ce6d46
commit 0bb598c4d0
4 changed files with 98 additions and 4 deletions

View File

@@ -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);
}

View File

@@ -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>> {

View File

@@ -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();
}
}

View File

@@ -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);
}
}