Add a timeout waiting for contextual card loader.

- Intially setting it to 1 second.
- Also changed card appear animation from drop in to fade in. It looks
  less janky if we don't animate any size change.
- And some random code cleanup

Change-Id: I6e73bcf98fd9aa1d76ae002b94ab5b068dfecf1e
Fixes: 120916829
Test: robotests
This commit is contained in:
Fan Zhang
2018-12-12 15:07:59 -08:00
parent 07933cb967
commit ad12b76a98
9 changed files with 50 additions and 33 deletions

View File

@@ -18,25 +18,10 @@
<set xmlns:android="http://schemas.android.com/apk/res/android" <set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"> android:duration="500">
<!-- Move up the view by 20% of its own height, and let it fall down to its final position -->
<translate
android:fromYDelta="-20%"
android:toYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"/>
<!-- Fade in: alpha from 0 to 100% --> <!-- Fade in: alpha from 0 to 100% -->
<alpha <alpha
android:fromAlpha="0" android:fromAlpha="0"
android:toAlpha="1" android:toAlpha="1"
android:interpolator="@android:anim/decelerate_interpolator"/> android:interpolator="@android:anim/decelerate_interpolator"/>
<!-- Shrink from 105% to 100% -->
<scale
android:fromXScale="105%"
android:fromYScale="105%"
android:toXScale="100%"
android:toYScale="100%"
android:pivotX="50%"
android:pivotY="50%"
android:interpolator="@android:anim/decelerate_interpolator"/>
</set> </set>

View File

@@ -17,6 +17,6 @@
<layoutAnimation <layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/item_animation_fall_down" android:animation="@anim/item_animation_fade_in"
android:delay="15%" android:delay="15%"
android:animationOrder="normal"/> android:animationOrder="normal"/>

View File

@@ -25,6 +25,6 @@
android:id="@+id/card_container" android:id="@+id/card_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layoutAnimation="@anim/layout_animation_fall_down"/> android:layoutAnimation="@anim/layout_animation_fade_in"/>
</LinearLayout> </LinearLayout>

View File

@@ -24,16 +24,16 @@ import java.util.List;
public interface ContextualCardFeatureProvider { public interface ContextualCardFeatureProvider {
/** Homepage displays. */ /** Homepage displays. */
public void logHomepageDisplay(Context context, Long latency); void logHomepageDisplay(Context context, long latency);
/** When user clicks dismiss in contextual card */ /** When user clicks dismiss in contextual card */
public void logContextualCardDismiss(Context context, ContextualCard card); void logContextualCardDismiss(Context context, ContextualCard card);
/** After ContextualCardManager decides which cards will be displayed/hidden */ /** After ContextualCardManager decides which cards will be displayed/hidden */
public void logContextualCardDisplay(Context context, List<ContextualCard> showedCards, void logContextualCardDisplay(Context context, List<ContextualCard> showedCards,
List<ContextualCard> hiddenCards); List<ContextualCard> hiddenCards);
/** When user clicks toggle/title area of a contextual card. */ /** When user clicks toggle/title area of a contextual card. */
public void logContextualCardClick(Context context, ContextualCard card, int row, void logContextualCardClick(Context context, ContextualCard card, int row,
int tapTarget); int tapTarget);
} }

View File

@@ -85,11 +85,10 @@ public class ContextualCardFeatureProviderImpl implements ContextualCardFeatureP
private static final int TARGET_SLIDER = 3; private static final int TARGET_SLIDER = 3;
@Override @Override
public void logHomepageDisplay(Context context, Long latency) { public void logHomepageDisplay(Context context, long latency) {
final Intent intent = new Intent(); sendBroadcast(context, new Intent()
intent.putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_HOME_SHOW); .putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_HOME_SHOW)
intent.putExtra(EXTRA_LATENCY, latency); .putExtra(EXTRA_LATENCY, latency));
sendBroadcast(context, intent);
} }
@Override @Override

View File

@@ -31,6 +31,7 @@ import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.text.format.DateUtils;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@@ -49,6 +50,7 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard>
@VisibleForTesting @VisibleForTesting
static final int DEFAULT_CARD_COUNT = 4; static final int DEFAULT_CARD_COUNT = 4;
static final int CARD_CONTENT_LOADER_ID = 1; static final int CARD_CONTENT_LOADER_ID = 1;
static final long CARD_CONTENT_LOADER_TIMEOUT_MS = DateUtils.SECOND_IN_MILLIS;
private static final String TAG = "ContextualCardLoader"; private static final String TAG = "ContextualCardLoader";

View File

@@ -59,12 +59,15 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
ContextualCardUpdateListener { ContextualCardUpdateListener {
private static final String TAG = "ContextualCardManager"; private static final String TAG = "ContextualCardManager";
//The list for Settings Custom Card //The list for Settings Custom Card
private static final int[] SETTINGS_CARDS = private static final int[] SETTINGS_CARDS =
{ContextualCard.CardType.CONDITIONAL, ContextualCard.CardType.LEGACY_SUGGESTION}; {ContextualCard.CardType.CONDITIONAL, ContextualCard.CardType.LEGACY_SUGGESTION};
@VisibleForTesting @VisibleForTesting
final List<ContextualCard> mContextualCards; final List<ContextualCard> mContextualCards;
@VisibleForTesting
long mStartTime;
private final Context mContext; private final Context mContext;
private final ControllerRendererPool mControllerRendererPool; private final ControllerRendererPool mControllerRendererPool;
@@ -72,7 +75,6 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
private final List<LifecycleObserver> mLifecycleObservers; private final List<LifecycleObserver> mLifecycleObservers;
private ContextualCardUpdateListener mListener; private ContextualCardUpdateListener mListener;
private long mStartTime;
public ContextualCardManager(Context context, Lifecycle lifecycle) { public ContextualCardManager(Context context, Lifecycle lifecycle) {
mContext = context; mContext = context;
@@ -169,11 +171,14 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
@Override @Override
public void onFinishCardLoading(List<ContextualCard> cards) { public void onFinishCardLoading(List<ContextualCard> cards) {
onContextualCardUpdated(cards.stream().collect(groupingBy(ContextualCard::getCardType))); final long loadTime = System.currentTimeMillis() - mStartTime;
final long elapsedTime = System.currentTimeMillis() - mStartTime; if (loadTime <= ContextualCardLoader.CARD_CONTENT_LOADER_TIMEOUT_MS) {
final ContextualCardFeatureProvider contextualCardFeatureProvider = onContextualCardUpdated(
FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider(); cards.stream().collect(groupingBy(ContextualCard::getCardType)));
contextualCardFeatureProvider.logHomepageDisplay(mContext, elapsedTime); }
final long totalTime = System.currentTimeMillis() - mStartTime;
FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider()
.logHomepageDisplay(mContext, totalTime);
} }
public ControllerRendererPool getControllerRendererPool() { public ControllerRendererPool getControllerRendererPool() {

View File

@@ -109,7 +109,6 @@ public class ConditionContextualCardController implements ContextualCardControll
final Map<Integer, List<ContextualCard>> conditionalCards = final Map<Integer, List<ContextualCard>> conditionalCards =
buildConditionalCardsWithFooterOrHeader(conditionCards); buildConditionalCardsWithFooterOrHeader(conditionCards);
mListener.onContextualCardUpdated(conditionalCards); mListener.onContextualCardUpdated(conditionalCards);
} }
/** /**

View File

@@ -18,6 +18,13 @@ package com.android.settings.homepage.contextualcards;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyMap;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.util.ArrayMap; import android.util.ArrayMap;
@@ -36,6 +43,7 @@ import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
public class ContextualCardManagerTest { public class ContextualCardManagerTest {
@@ -107,6 +115,25 @@ public class ContextualCardManagerTest {
.isEqualTo(ContextualCard.CardType.CONDITIONAL_FOOTER); .isEqualTo(ContextualCard.CardType.CONDITIONAL_FOOTER);
} }
@Test
public void onFinishCardLoading_fastLoad_shouldCallOnContextualCardUpdated() {
mManager.mStartTime = System.currentTimeMillis();
final ContextualCardManager manager = spy(mManager);
doNothing().when(manager).onContextualCardUpdated(anyMap());
manager.onFinishCardLoading(new ArrayList<>());
verify(manager).onContextualCardUpdated(nullable(Map.class));
}
@Test
public void onFinishCardLoading_slowLoad_shouldSkipOnContextualCardUpdated() {
mManager.mStartTime = 0;
final ContextualCardManager manager = spy(mManager);
doNothing().when(manager).onContextualCardUpdated(anyMap());
manager.onFinishCardLoading(new ArrayList<>());
verify(manager, never()).onContextualCardUpdated(anyMap());
}
private ContextualCard buildContextualCard(String sliceUri) { private ContextualCard buildContextualCard(String sliceUri) {
return new ContextualCard.Builder() return new ContextualCard.Builder()