Use "mid" stable id for condition cards conditionally.
When there is no suggestion, use "mid" stableId instead of "top" stableId for the header card. This avoid an animation jank: when user swipes away a suggestion, the condition summary header moves up instead of disappears then reappears. Old behavior: --- Suggestion --- --swipe--> /// Top Header /// /// Mid Header /// New behavior: --- Suggestion --- -- swipe --> /// Mid Header /// /// Mid Header /// (Notice the header id change) Change-Id: I63512d3d21382488e43dddb8819fabe4af40d101 Fixes: 65729560 Test: robotests
This commit is contained in:
@@ -222,15 +222,22 @@ public class DashboardData {
|
|||||||
final int hiddenSuggestion =
|
final int hiddenSuggestion =
|
||||||
hasSuggestions ? sizeOf(mSuggestions) - sizeOf(suggestions) : 0;
|
hasSuggestions ? sizeOf(mSuggestions) - sizeOf(suggestions) : 0;
|
||||||
|
|
||||||
|
final boolean hasSuggestionAndCollapsed = hasSuggestions
|
||||||
|
&& mSuggestionConditionMode == HEADER_MODE_COLLAPSED;
|
||||||
|
final boolean onlyHasConditionAndCollapsed = !hasSuggestions
|
||||||
|
&& hasConditions
|
||||||
|
&& mSuggestionConditionMode != HEADER_MODE_FULLY_EXPANDED;
|
||||||
|
|
||||||
/* Top suggestion/condition header. This will be present when there is any suggestion
|
/* Top suggestion/condition header. This will be present when there is any suggestion
|
||||||
* and the mode is collapsed, or it only has conditions and the mode is not fully
|
* and the mode is collapsed */
|
||||||
* expanded. */
|
|
||||||
addToItemList(new SuggestionConditionHeaderData(conditions, hiddenSuggestion),
|
addToItemList(new SuggestionConditionHeaderData(conditions, hiddenSuggestion),
|
||||||
R.layout.suggestion_condition_header,
|
R.layout.suggestion_condition_header,
|
||||||
STABLE_ID_SUGGESTION_CONDITION_TOP_HEADER,
|
STABLE_ID_SUGGESTION_CONDITION_TOP_HEADER, hasSuggestionAndCollapsed);
|
||||||
hasSuggestions && mSuggestionConditionMode == HEADER_MODE_COLLAPSED
|
|
||||||
|| !hasSuggestions && hasConditions
|
/* Use mid header if there is only condition & it's in collapsed mode */
|
||||||
&& mSuggestionConditionMode != HEADER_MODE_FULLY_EXPANDED);
|
addToItemList(new SuggestionConditionHeaderData(conditions, hiddenSuggestion),
|
||||||
|
R.layout.suggestion_condition_header,
|
||||||
|
STABLE_ID_SUGGESTION_CONDITION_MIDDLE_HEADER, onlyHasConditionAndCollapsed);
|
||||||
|
|
||||||
/* Suggestion container. This is the card view that contains the list of suggestions.
|
/* Suggestion container. This is the card view that contains the list of suggestions.
|
||||||
* This will be added whenever the suggestion list is not empty */
|
* This will be added whenever the suggestion list is not empty */
|
||||||
|
@@ -16,6 +16,13 @@
|
|||||||
|
|
||||||
package com.android.settings.dashboard;
|
package com.android.settings.dashboard;
|
||||||
|
|
||||||
|
import static com.android.settings.dashboard.DashboardData.STABLE_ID_CONDITION_CONTAINER;
|
||||||
|
import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONDITION_FOOTER;
|
||||||
|
import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONTAINER;
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.v7.util.DiffUtil;
|
import android.support.v7.util.DiffUtil;
|
||||||
import android.support.v7.util.ListUpdateCallback;
|
import android.support.v7.util.ListUpdateCallback;
|
||||||
@@ -39,15 +46,6 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import static com.android.settings.dashboard.DashboardData.STABLE_ID_CONDITION_CONTAINER;
|
|
||||||
import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONDITION_FOOTER;
|
|
||||||
import static com.android.settings.dashboard.DashboardData
|
|
||||||
.STABLE_ID_SUGGESTION_CONDITION_TOP_HEADER;
|
|
||||||
import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONTAINER;
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
import static org.mockito.Mockito.when;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||||
public class DashboardDataTest {
|
public class DashboardDataTest {
|
||||||
@@ -214,6 +212,38 @@ public class DashboardDataTest {
|
|||||||
mDashboardDataWithTwoConditions, testResultData);
|
mDashboardDataWithTwoConditions, testResultData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDiffUtil_RemoveOneSuggestion_causeItemRemoveAndChange() {
|
||||||
|
//Build testResultData
|
||||||
|
final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
|
||||||
|
testResultData.add(new ListUpdateResult.ResultData(
|
||||||
|
ListUpdateResult.ResultData.TYPE_OPERATION_REMOVE, 0, 1));
|
||||||
|
testResultData.add(new ListUpdateResult.ResultData(
|
||||||
|
ListUpdateResult.ResultData.TYPE_OPERATION_CHANGE, 1, 1));
|
||||||
|
// Build DashboardData
|
||||||
|
final List<Condition> oneItemConditions = new ArrayList<>();
|
||||||
|
when(mTestCondition.shouldShow()).thenReturn(true);
|
||||||
|
oneItemConditions.add(mTestCondition);
|
||||||
|
final List<Tile> suggestions = new ArrayList<>();
|
||||||
|
mTestSuggestion.title = TEST_SUGGESTION_TITLE;
|
||||||
|
suggestions.add(mTestSuggestion);
|
||||||
|
|
||||||
|
final DashboardData oldData = new DashboardData.Builder()
|
||||||
|
.setConditions(oneItemConditions)
|
||||||
|
.setCategory(mDashboardCategory)
|
||||||
|
.setSuggestions(suggestions)
|
||||||
|
.setSuggestionConditionMode(DashboardData.HEADER_MODE_DEFAULT)
|
||||||
|
.build();
|
||||||
|
final DashboardData newData = new DashboardData.Builder()
|
||||||
|
.setConditions(oneItemConditions)
|
||||||
|
.setSuggestions(null)
|
||||||
|
.setCategory(mDashboardCategory)
|
||||||
|
.setSuggestionConditionMode(DashboardData.HEADER_MODE_DEFAULT)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
testDiffUtil(oldData, newData, testResultData);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDiffUtil_DeleteAllData_ResultDataOneDeleted() {
|
public void testDiffUtil_DeleteAllData_ResultDataOneDeleted() {
|
||||||
//Build testResultData
|
//Build testResultData
|
||||||
|
Reference in New Issue
Block a user