Merge changes I6e73bcf9,I257ba108
* changes: Add a timeout waiting for contextual card loader. Set setting back to default when turning off dev option
This commit is contained in:
@@ -18,25 +18,10 @@
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:duration="500">
|
||||
|
||||
<!-- Move up the view by 20% of it’s 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% -->
|
||||
<alpha
|
||||
android:fromAlpha="0"
|
||||
android:toAlpha="1"
|
||||
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>
|
@@ -17,6 +17,6 @@
|
||||
|
||||
<layoutAnimation
|
||||
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:animationOrder="normal"/>
|
@@ -25,6 +25,6 @@
|
||||
android:id="@+id/card_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layoutAnimation="@anim/layout_animation_fall_down"/>
|
||||
android:layoutAnimation="@anim/layout_animation_fade_in"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
@@ -66,7 +66,7 @@ public class MobileDataAlwaysOnPreferenceController extends
|
||||
protected void onDeveloperOptionsSwitchDisabled() {
|
||||
super.onDeveloperOptionsSwitchDisabled();
|
||||
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.MOBILE_DATA_ALWAYS_ON,
|
||||
SETTING_VALUE_OFF);
|
||||
((SwitchPreference) mPreference).setChecked(false);
|
||||
SETTING_VALUE_ON);
|
||||
((SwitchPreference) mPreference).setChecked(true);
|
||||
}
|
||||
}
|
||||
|
@@ -24,16 +24,16 @@ import java.util.List;
|
||||
public interface ContextualCardFeatureProvider {
|
||||
|
||||
/** Homepage displays. */
|
||||
public void logHomepageDisplay(Context context, Long latency);
|
||||
void logHomepageDisplay(Context context, long latency);
|
||||
|
||||
/** 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 */
|
||||
public void logContextualCardDisplay(Context context, List<ContextualCard> showedCards,
|
||||
void logContextualCardDisplay(Context context, List<ContextualCard> showedCards,
|
||||
List<ContextualCard> hiddenCards);
|
||||
|
||||
/** 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);
|
||||
}
|
||||
|
@@ -85,11 +85,10 @@ public class ContextualCardFeatureProviderImpl implements ContextualCardFeatureP
|
||||
private static final int TARGET_SLIDER = 3;
|
||||
|
||||
@Override
|
||||
public void logHomepageDisplay(Context context, Long latency) {
|
||||
final Intent intent = new Intent();
|
||||
intent.putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_HOME_SHOW);
|
||||
intent.putExtra(EXTRA_LATENCY, latency);
|
||||
sendBroadcast(context, intent);
|
||||
public void logHomepageDisplay(Context context, long latency) {
|
||||
sendBroadcast(context, new Intent()
|
||||
.putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_HOME_SHOW)
|
||||
.putExtra(EXTRA_LATENCY, latency));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -31,6 +31,7 @@ import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -49,6 +50,7 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard>
|
||||
@VisibleForTesting
|
||||
static final int DEFAULT_CARD_COUNT = 4;
|
||||
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";
|
||||
|
||||
|
@@ -59,12 +59,15 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
|
||||
ContextualCardUpdateListener {
|
||||
|
||||
private static final String TAG = "ContextualCardManager";
|
||||
|
||||
//The list for Settings Custom Card
|
||||
private static final int[] SETTINGS_CARDS =
|
||||
{ContextualCard.CardType.CONDITIONAL, ContextualCard.CardType.LEGACY_SUGGESTION};
|
||||
|
||||
@VisibleForTesting
|
||||
final List<ContextualCard> mContextualCards;
|
||||
@VisibleForTesting
|
||||
long mStartTime;
|
||||
|
||||
private final Context mContext;
|
||||
private final ControllerRendererPool mControllerRendererPool;
|
||||
@@ -72,7 +75,6 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
|
||||
private final List<LifecycleObserver> mLifecycleObservers;
|
||||
|
||||
private ContextualCardUpdateListener mListener;
|
||||
private long mStartTime;
|
||||
|
||||
public ContextualCardManager(Context context, Lifecycle lifecycle) {
|
||||
mContext = context;
|
||||
@@ -169,11 +171,14 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
|
||||
|
||||
@Override
|
||||
public void onFinishCardLoading(List<ContextualCard> cards) {
|
||||
onContextualCardUpdated(cards.stream().collect(groupingBy(ContextualCard::getCardType)));
|
||||
final long elapsedTime = System.currentTimeMillis() - mStartTime;
|
||||
final ContextualCardFeatureProvider contextualCardFeatureProvider =
|
||||
FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider();
|
||||
contextualCardFeatureProvider.logHomepageDisplay(mContext, elapsedTime);
|
||||
final long loadTime = System.currentTimeMillis() - mStartTime;
|
||||
if (loadTime <= ContextualCardLoader.CARD_CONTENT_LOADER_TIMEOUT_MS) {
|
||||
onContextualCardUpdated(
|
||||
cards.stream().collect(groupingBy(ContextualCard::getCardType)));
|
||||
}
|
||||
final long totalTime = System.currentTimeMillis() - mStartTime;
|
||||
FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider()
|
||||
.logHomepageDisplay(mContext, totalTime);
|
||||
}
|
||||
|
||||
public ControllerRendererPool getControllerRendererPool() {
|
||||
|
@@ -109,7 +109,6 @@ public class ConditionContextualCardController implements ContextualCardControll
|
||||
final Map<Integer, List<ContextualCard>> conditionalCards =
|
||||
buildConditionalCardsWithFooterOrHeader(conditionCards);
|
||||
mListener.onContextualCardUpdated(conditionalCards);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -96,13 +96,13 @@ public class MobileDataAlwaysOnPreferenceControllerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onDeveloperOptionsSwitchDisabled_preferenceShouldBeDisabled() {
|
||||
public void onDeveloperOptionsSwitchDisabled_shouldDisableMobileDataAlwaysOn() {
|
||||
mController.onDeveloperOptionsSwitchDisabled();
|
||||
final int mode = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
Settings.Global.MOBILE_DATA_ALWAYS_ON, -1 /* default */);
|
||||
|
||||
assertThat(mode).isEqualTo(MobileDataAlwaysOnPreferenceController.SETTING_VALUE_OFF);
|
||||
assertThat(mode).isEqualTo(MobileDataAlwaysOnPreferenceController.SETTING_VALUE_ON);
|
||||
verify(mPreference).setEnabled(false);
|
||||
verify(mPreference).setChecked(false);
|
||||
verify(mPreference).setChecked(true);
|
||||
}
|
||||
}
|
||||
|
@@ -18,6 +18,13 @@ package com.android.settings.homepage.contextualcards;
|
||||
|
||||
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.net.Uri;
|
||||
import android.util.ArrayMap;
|
||||
@@ -36,6 +43,7 @@ import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
public class ContextualCardManagerTest {
|
||||
@@ -107,6 +115,25 @@ public class ContextualCardManagerTest {
|
||||
.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) {
|
||||
return new ContextualCard.Builder()
|
||||
|
Reference in New Issue
Block a user