[DO NOT MERGE] Fix the blank space on contextual card loading timeout
Root cause: Sometimes loading contextual cards exceeds 1 second and a timeout expires. In the past, we used the timeout in order not to update homepage UI and to avoid screen scrolling. But we've introduced a mechanism of card space pre-allocation to avoid flickering, so when the timeout expires, the pre-allocated space will be always blank. Solution: Display a card on timeout if the one-card space is pre-allocated. Fixes: 165886791 Test: robotest Change-Id: I79b29c5fd6d9c4fe6b53dd4f5eab4cd3a606d76d
This commit is contained in:
@@ -266,6 +266,15 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
|
|||||||
SettingsEnums.ACTION_CONTEXTUAL_CARD_LOAD_TIMEOUT,
|
SettingsEnums.ACTION_CONTEXTUAL_CARD_LOAD_TIMEOUT,
|
||||||
SettingsEnums.SETTINGS_HOMEPAGE,
|
SettingsEnums.SETTINGS_HOMEPAGE,
|
||||||
null /* key */, (int) loadTime /* value */);
|
null /* key */, (int) loadTime /* value */);
|
||||||
|
|
||||||
|
// display a card on timeout if the one-card space is pre-allocated
|
||||||
|
if (!cards.isEmpty() && ContextualCardLoader.getCardCount(mContext) == 1) {
|
||||||
|
onContextualCardUpdated(cards.stream()
|
||||||
|
.collect(groupingBy(ContextualCard::getCardType)));
|
||||||
|
metricsFeatureProvider.action(mContext,
|
||||||
|
SettingsEnums.ACTION_CONTEXTUAL_CARD_SHOW,
|
||||||
|
ContextualCardLogUtils.buildCardListLog(cards));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// only log homepage display upon a fresh launch
|
// only log homepage display upon a fresh launch
|
||||||
final long totalTime = System.currentTimeMillis() - mStartTime;
|
final long totalTime = System.currentTimeMillis() - mStartTime;
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.settings.homepage.contextualcards;
|
package com.android.settings.homepage.contextualcards;
|
||||||
|
|
||||||
|
import static com.android.settings.homepage.contextualcards.ContextualCardLoader.CONTEXTUAL_CARD_COUNT;
|
||||||
import static com.android.settings.homepage.contextualcards.ContextualCardManager.KEY_CONTEXTUAL_CARDS;
|
import static com.android.settings.homepage.contextualcards.ContextualCardManager.KEY_CONTEXTUAL_CARDS;
|
||||||
import static com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer.VIEW_TYPE_FULL_WIDTH;
|
import static com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer.VIEW_TYPE_FULL_WIDTH;
|
||||||
import static com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH;
|
import static com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH;
|
||||||
@@ -307,7 +308,7 @@ public class ContextualCardManagerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onFinishCardLoading_fastLoad_shouldCallOnContextualCardUpdated() {
|
public void onFinishCardLoading_fastLoad_shouldUpdateContextualCard() {
|
||||||
mManager.mStartTime = System.currentTimeMillis();
|
mManager.mStartTime = System.currentTimeMillis();
|
||||||
final ContextualCardManager manager = spy(mManager);
|
final ContextualCardManager manager = spy(mManager);
|
||||||
doNothing().when(manager).onContextualCardUpdated(anyMap());
|
doNothing().when(manager).onContextualCardUpdated(anyMap());
|
||||||
@@ -318,7 +319,7 @@ public class ContextualCardManagerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onFinishCardLoading_slowLoad_shouldSkipOnContextualCardUpdated() {
|
public void onFinishCardLoading_slowLoadAndNoCard_shouldNotUpdateContextualCard() {
|
||||||
mManager.mStartTime = 0;
|
mManager.mStartTime = 0;
|
||||||
final ContextualCardManager manager = spy(mManager);
|
final ContextualCardManager manager = spy(mManager);
|
||||||
doNothing().when(manager).onContextualCardUpdated(anyMap());
|
doNothing().when(manager).onContextualCardUpdated(anyMap());
|
||||||
@@ -328,6 +329,30 @@ public class ContextualCardManagerTest {
|
|||||||
verify(manager, never()).onContextualCardUpdated(anyMap());
|
verify(manager, never()).onContextualCardUpdated(anyMap());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onFinishCardLoading_slowLoadAndNotPreAllocateSpace_shouldNotUpdateContextualCard() {
|
||||||
|
mManager.mStartTime = 0;
|
||||||
|
Settings.Global.putInt(mContext.getContentResolver(), CONTEXTUAL_CARD_COUNT, 3);
|
||||||
|
final ContextualCardManager manager = spy(mManager);
|
||||||
|
doNothing().when(manager).onContextualCardUpdated(anyMap());
|
||||||
|
|
||||||
|
manager.onFinishCardLoading(Arrays.asList(buildContextualCard(TEST_SLICE_URI)));
|
||||||
|
|
||||||
|
verify(manager, never()).onContextualCardUpdated(anyMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onFinishCardLoading_slowLoadAndPreAllocateSpace_shouldUpdateContextualCard() {
|
||||||
|
mManager.mStartTime = 0;
|
||||||
|
Settings.Global.putInt(mContext.getContentResolver(), CONTEXTUAL_CARD_COUNT, 1);
|
||||||
|
final ContextualCardManager manager = spy(mManager);
|
||||||
|
doNothing().when(manager).onContextualCardUpdated(anyMap());
|
||||||
|
|
||||||
|
manager.onFinishCardLoading(Arrays.asList(buildContextualCard(TEST_SLICE_URI)));
|
||||||
|
|
||||||
|
verify(manager).onContextualCardUpdated(anyMap());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onFinishCardLoading_newLaunch_twoLoadedCards_shouldShowTwoCards() {
|
public void onFinishCardLoading_newLaunch_twoLoadedCards_shouldShowTwoCards() {
|
||||||
mManager.mStartTime = System.currentTimeMillis();
|
mManager.mStartTime = System.currentTimeMillis();
|
||||||
|
Reference in New Issue
Block a user