[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:
@@ -243,7 +243,7 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
|
|||||||
final MetricsFeatureProvider metricsFeatureProvider =
|
final MetricsFeatureProvider metricsFeatureProvider =
|
||||||
FeatureFactory.getFactory(mContext).getMetricsFeatureProvider();
|
FeatureFactory.getFactory(mContext).getMetricsFeatureProvider();
|
||||||
|
|
||||||
//navigate back to the homepage, screen rotate or after card dismissal
|
// navigate back to the homepage, screen rotate or after card dismissal
|
||||||
if (!mIsFirstLaunch) {
|
if (!mIsFirstLaunch) {
|
||||||
onContextualCardUpdated(cardsToKeep.stream()
|
onContextualCardUpdated(cardsToKeep.stream()
|
||||||
.collect(groupingBy(ContextualCard::getCardType)));
|
.collect(groupingBy(ContextualCard::getCardType)));
|
||||||
@@ -266,8 +266,17 @@ 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;
|
||||||
metricsFeatureProvider.action(mContext,
|
metricsFeatureProvider.action(mContext,
|
||||||
SettingsEnums.ACTION_CONTEXTUAL_HOME_SHOW, (int) totalTime);
|
SettingsEnums.ACTION_CONTEXTUAL_HOME_SHOW, (int) totalTime);
|
||||||
|
@@ -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