Commit 5ecabc8e authored by Vincent Boisselle's avatar Vincent Boisselle Committed by Commit Bot

Reload the cond upload bit on sign-in/out and back/fore-groudind

Change-Id: Ia01b8458da01d15fdf15beefbfa75c5b01a6fc12
Bug: 1138000
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2469517
Commit-Queue: Vincent Boisselle <vincb@google.com>
Reviewed-by: default avatarDan H <harringtond@chromium.org>
Cr-Commit-Position: refs/heads/master@{#818968}
parent b1fa07f8
......@@ -25,6 +25,12 @@ public interface AppLifecycleListener {
/** Called to clear all data then initiate a refresh. */
void onClearAllWithRefresh();
/** Called when user signs in. */
void onSignedIn();
/** Called when user signs out. */
void onSignedOut();
/**
* Called when the host wants the Feed to perform any heavyweight initialization it might need
* to do. This is the only trigger for the initialization process; if it’s not called, the host
......
......@@ -223,7 +223,7 @@ public final class ProcessScopeBuilder {
FeedSessionManagerFactory fsmFactory = new FeedSessionManagerFactory(taskQueue, store,
timingUtils, threadUtils, protocolAdapter, feedRequestManager,
actionUploadRequestManager, schedulerApi, mConfiguration, mClock, lifecycleListener,
mainThreadRunner, mBasicLoggingApi);
mainThreadRunner, mBasicLoggingApi, actionManager);
FeedSessionManager feedSessionManager = fsmFactory.create();
actionManager.initialize(feedSessionManager);
RequestManagerImpl clientRequestManager =
......
......@@ -4,6 +4,8 @@
package org.chromium.chrome.browser.feed.library.common.testing;
import static org.mockito.Mockito.mock;
import com.google.protobuf.GeneratedMessageLite.GeneratedExtension;
import org.chromium.chrome.browser.feed.library.api.client.lifecycle.AppLifecycleListener;
......@@ -14,6 +16,7 @@ import org.chromium.chrome.browser.feed.library.api.host.proto.ProtoExtensionPro
import org.chromium.chrome.browser.feed.library.api.host.scheduler.SchedulerApi;
import org.chromium.chrome.browser.feed.library.api.host.storage.ContentStorageDirect;
import org.chromium.chrome.browser.feed.library.api.host.storage.JournalStorageDirect;
import org.chromium.chrome.browser.feed.library.api.internal.actionmanager.ActionManager;
import org.chromium.chrome.browser.feed.library.api.internal.modelprovider.ModelProviderFactory;
import org.chromium.chrome.browser.feed.library.api.internal.protocoladapter.ProtocolAdapter;
import org.chromium.chrome.browser.feed.library.api.internal.scope.ClearAllListener;
......@@ -106,10 +109,11 @@ public class InfraIntegrationScope {
FakeActionUploadRequestManager fakeActionUploadRequestManager =
new FakeActionUploadRequestManager(mStore, new FakeViewActionManager(mStore),
FakeThreadUtils.withThreadChecks());
ActionManager actionManager = mock(ActionManager.class);
mFeedSessionManager = new FeedSessionManagerFactory(mTaskQueue, mStore, timingUtils,
fakeThreadUtils, mFeedProtocolAdapter, mFakeFeedRequestManager,
fakeActionUploadRequestManager, schedulerApi, configuration, fakeClock,
mAppLifecycleListener, fakeMainThreadRunner, fakeBasicLoggingApi)
mAppLifecycleListener, fakeMainThreadRunner, fakeBasicLoggingApi, actionManager)
.create();
new ClearAllListener(
mTaskQueue, mFeedSessionManager, mStore, fakeThreadUtils, mAppLifecycleListener);
......
......@@ -49,6 +49,18 @@ public final class FeedAppLifecycleListener
dispatchLifecycleEvent(LifecycleEvent.CLEAR_ALL_WITH_REFRESH);
}
@Override
public void onSignedIn() {
mThreadUtils.checkMainThread();
dispatchLifecycleEvent(LifecycleEvent.SIGNED_IN);
}
@Override
public void onSignedOut() {
mThreadUtils.checkMainThread();
dispatchLifecycleEvent(LifecycleEvent.SIGNED_OUT);
}
@Override
public void initialize() {
mThreadUtils.checkMainThread();
......
......@@ -14,13 +14,15 @@ public interface FeedLifecycleListener {
/** The types of lifecycle events. */
@StringDef({LifecycleEvent.ENTER_FOREGROUND, LifecycleEvent.ENTER_BACKGROUND,
LifecycleEvent.CLEAR_ALL, LifecycleEvent.CLEAR_ALL_WITH_REFRESH,
LifecycleEvent.INITIALIZE})
LifecycleEvent.INITIALIZE, LifecycleEvent.SIGNED_IN, LifecycleEvent.SIGNED_OUT})
@interface LifecycleEvent {
String ENTER_FOREGROUND = "foreground";
String ENTER_BACKGROUND = "background";
String CLEAR_ALL = "clearAll";
String CLEAR_ALL_WITH_REFRESH = "clearAllWithRefresh";
String INITIALIZE = "initialize";
String SIGNED_IN = "signedIn";
String SIGNED_OUT = "signedOut";
}
void onLifecycleEvent(@LifecycleEvent String event);
......
......@@ -8,6 +8,7 @@ import org.chromium.chrome.browser.feed.library.api.host.config.Configuration;
import org.chromium.chrome.browser.feed.library.api.host.config.Configuration.ConfigKey;
import org.chromium.chrome.browser.feed.library.api.host.logging.BasicLoggingApi;
import org.chromium.chrome.browser.feed.library.api.host.scheduler.SchedulerApi;
import org.chromium.chrome.browser.feed.library.api.internal.actionmanager.ActionManager;
import org.chromium.chrome.browser.feed.library.api.internal.common.ThreadUtils;
import org.chromium.chrome.browser.feed.library.api.internal.protocoladapter.ProtocolAdapter;
import org.chromium.chrome.browser.feed.library.api.internal.requestmanager.ActionUploadRequestManager;
......@@ -48,6 +49,7 @@ public final class FeedSessionManagerFactory {
private final FeedObservable<FeedLifecycleListener> mLifecycleListenerObservable;
private final MainThreadRunner mMainThreadRunner;
private final BasicLoggingApi mBasicLoggingApi;
private final ActionManager mActionManager;
public FeedSessionManagerFactory(TaskQueue taskQueue, Store store, TimingUtils timingUtils,
ThreadUtils threadUtils, ProtocolAdapter protocolAdapter,
......@@ -55,7 +57,8 @@ public final class FeedSessionManagerFactory {
ActionUploadRequestManager actionUploadRequestManager, SchedulerApi schedulerApi,
Configuration configuration, Clock clock,
FeedObservable<FeedLifecycleListener> lifecycleListenerObservable,
MainThreadRunner mainThreadRunner, BasicLoggingApi basicLoggingApi) {
MainThreadRunner mainThreadRunner, BasicLoggingApi basicLoggingApi,
ActionManager actionManager) {
this.mTaskQueue = taskQueue;
this.mStore = store;
this.mTimingUtils = timingUtils;
......@@ -69,6 +72,7 @@ public final class FeedSessionManagerFactory {
this.mLifecycleListenerObservable = lifecycleListenerObservable;
this.mMainThreadRunner = mainThreadRunner;
this.mBasicLoggingApi = basicLoggingApi;
this.mActionManager = actionManager;
}
/** Creates a new FeedSessionManager and initializes it */
......@@ -88,6 +92,6 @@ public final class FeedSessionManagerFactory {
sessionManagerMutation, contentCache, mStore, mTimingUtils, mThreadUtils,
mProtocolAdapter, mFeedRequestManager, mActionUploadRequestManager, mSchedulerApi,
mConfiguration, mClock, mLifecycleListenerObservable, mMainThreadRunner,
mBasicLoggingApi);
mBasicLoggingApi, mActionManager);
}
}
......@@ -21,6 +21,7 @@ import org.chromium.chrome.browser.feed.library.api.host.logging.Task;
import org.chromium.chrome.browser.feed.library.api.host.scheduler.SchedulerApi;
import org.chromium.chrome.browser.feed.library.api.host.scheduler.SchedulerApi.RequestBehavior;
import org.chromium.chrome.browser.feed.library.api.host.scheduler.SchedulerApi.SessionState;
import org.chromium.chrome.browser.feed.library.api.internal.actionmanager.ActionManager;
import org.chromium.chrome.browser.feed.library.api.internal.common.Model;
import org.chromium.chrome.browser.feed.library.api.internal.common.PayloadWithId;
import org.chromium.chrome.browser.feed.library.api.internal.common.ThreadUtils;
......@@ -60,6 +61,9 @@ import org.chromium.chrome.browser.feed.library.feedsessionmanager.internal.Sess
import org.chromium.chrome.browser.feed.library.feedsessionmanager.internal.SessionCache;
import org.chromium.chrome.browser.feed.library.feedsessionmanager.internal.SessionFactory;
import org.chromium.chrome.browser.feed.library.feedsessionmanager.internal.SessionManagerMutation;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.preferences.Pref;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamDataOperation;
import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamPayload;
import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamSharedState;
......@@ -71,6 +75,7 @@ import org.chromium.components.feed.core.proto.libraries.api.internal.StreamData
import org.chromium.components.feed.core.proto.wire.ConsistencyTokenProto.ConsistencyToken;
import org.chromium.components.feed.core.proto.wire.ContentIdProto.ContentId;
import org.chromium.components.feed.core.proto.wire.PietSharedStateItemProto.PietSharedStateItem;
import org.chromium.components.user_prefs.UserPrefs;
import java.util.ArrayList;
import java.util.Collections;
......@@ -136,6 +141,7 @@ public final class FeedSessionManagerImpl
private final Configuration mConfiguration;
private final MainThreadRunner mMainThreadRunner;
private final BasicLoggingApi mBasicLoggingApi;
private final ActionManager mActionManager;
private final long mSessionPopulationTimeoutMs;
private final boolean mUploadingActionsEnabled;
......@@ -157,7 +163,8 @@ public final class FeedSessionManagerImpl
ActionUploadRequestManager actionUploadRequestManager, SchedulerApi schedulerApi,
Configuration configuration, Clock clock,
FeedObservable<FeedLifecycleListener> lifecycleListenerObservable,
MainThreadRunner mainThreadRunner, BasicLoggingApi basicLoggingApi) {
MainThreadRunner mainThreadRunner, BasicLoggingApi basicLoggingApi,
ActionManager actionManager) {
this.mTaskQueue = taskQueue;
this.mSessionFactory = sessionFactory;
this.mSessionCache = sessionCache;
......@@ -175,6 +182,7 @@ public final class FeedSessionManagerImpl
this.mConfiguration = configuration;
this.mMainThreadRunner = mainThreadRunner;
this.mBasicLoggingApi = basicLoggingApi;
this.mActionManager = actionManager;
mUploadingActionsEnabled =
configuration.getValueOrDefault(ConfigKey.UNDOABLE_ACTIONS_ENABLED, false);
mSessionPopulationTimeoutMs =
......@@ -793,10 +801,32 @@ public final class FeedSessionManagerImpl
mOutstandingMutations.size());
mOutstandingMutations.clear();
break;
case LifecycleEvent.ENTER_FOREGROUND:
mActionManager.setCanUploadClicksAndViewsWhenNoticeCardIsPresent(canUpload());
break;
case LifecycleEvent.ENTER_BACKGROUND:
mActionManager.setCanUploadClicksAndViewsWhenNoticeCardIsPresent(canUpload());
break;
case LifecycleEvent.SIGNED_IN:
mActionManager.setCanUploadClicksAndViewsWhenNoticeCardIsPresent(canUpload());
break;
case LifecycleEvent.SIGNED_OUT:
mActionManager.setCanUploadClicksAndViewsWhenNoticeCardIsPresent(canUpload());
break;
default:
// Do nothing
}
}
private boolean canUpload() {
if (ChromeFeatureList.isEnabled(
ChromeFeatureList.INTEREST_FEEDV1_CLICKS_AND_VIEWS_CONDITIONAL_UPLOAD)) {
return UserPrefs.get(Profile.getLastUsedRegularProfile())
.getBoolean(Pref.HAS_REACHED_CLICK_AND_VIEW_ACTIONS_UPLOAD_CONDITIONS);
}
return true;
}
// TODO: implement longer term fix for reading/saving the consistency token
@Override
public void triggerUploadActions(Set<StreamUploadableAction> actions) {
......
......@@ -58,6 +58,18 @@ public class FeedAppLifecycleListenerTest {
verify(mLifecycleListener).onLifecycleEvent(LifecycleEvent.CLEAR_ALL_WITH_REFRESH);
}
@Test
public void onSignedIn() {
mAppLifecycleListener.onSignedIn();
verify(mLifecycleListener).onLifecycleEvent(LifecycleEvent.SIGNED_IN);
}
@Test
public void onSignedOut() {
mAppLifecycleListener.onSignedOut();
verify(mLifecycleListener).onLifecycleEvent(LifecycleEvent.SIGNED_OUT);
}
@Test
public void onInitialize() {
mAppLifecycleListener.initialize();
......
......@@ -8,6 +8,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
......@@ -19,7 +20,9 @@ import com.google.common.collect.ImmutableSet;
import com.google.protobuf.ByteString;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.robolectric.ParameterizedRobolectricTestRunner;
......@@ -28,6 +31,7 @@ import org.robolectric.ParameterizedRobolectricTestRunner.Parameters;
import org.robolectric.annotation.Config;
import org.chromium.base.Consumer;
import org.chromium.base.test.util.JniMocker;
import org.chromium.chrome.browser.feed.library.api.common.MutationContext;
import org.chromium.chrome.browser.feed.library.api.host.config.Configuration;
import org.chromium.chrome.browser.feed.library.api.host.config.Configuration.ConfigKey;
......@@ -36,6 +40,7 @@ import org.chromium.chrome.browser.feed.library.api.host.logging.RequestReason;
import org.chromium.chrome.browser.feed.library.api.host.scheduler.SchedulerApi;
import org.chromium.chrome.browser.feed.library.api.host.scheduler.SchedulerApi.RequestBehavior;
import org.chromium.chrome.browser.feed.library.api.host.scheduler.SchedulerApi.SessionState;
import org.chromium.chrome.browser.feed.library.api.internal.actionmanager.ActionManager;
import org.chromium.chrome.browser.feed.library.api.internal.common.Model;
import org.chromium.chrome.browser.feed.library.api.internal.common.SemanticPropertiesWithId;
import org.chromium.chrome.browser.feed.library.api.internal.common.testing.ContentIdGenerators;
......@@ -68,6 +73,10 @@ import org.chromium.chrome.browser.feed.library.testing.protocoladapter.FakeProt
import org.chromium.chrome.browser.feed.library.testing.requestmanager.FakeActionUploadRequestManager;
import org.chromium.chrome.browser.feed.library.testing.requestmanager.FakeFeedRequestManager;
import org.chromium.chrome.browser.feed.library.testing.store.FakeStore;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.preferences.Pref;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.test.util.browser.Features;
import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamDataOperation;
import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamPayload;
import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamSharedState;
......@@ -84,6 +93,9 @@ import org.chromium.components.feed.core.proto.wire.ConsistencyTokenProto.Consis
import org.chromium.components.feed.core.proto.wire.ContentIdProto.ContentId;
import org.chromium.components.feed.core.proto.wire.PietSharedStateItemProto.PietSharedStateItem;
import org.chromium.components.feed.core.proto.wire.ResponseProto.Response;
import org.chromium.components.prefs.PrefService;
import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.components.user_prefs.UserPrefsJni;
import org.chromium.testing.local.LocalRobolectricTestRunner;
import java.nio.charset.Charset;
......@@ -119,8 +131,23 @@ public class FeedSessionManagerImplTest {
private FakeTaskQueue mFakeTaskQueue;
private FakeThreadUtils mFakeThreadUtils;
private FeedAppLifecycleListener mAppLifecycleListener;
@Rule
public TestRule mFeaturesProcessorRule = new Features.JUnitProcessor();
@Rule
public JniMocker mocker = new JniMocker();
@Mock
private SchedulerApi mSchedulerApi;
@Mock
private UserPrefs.Natives mUserPrefsJniMock;
@Mock
private Profile mProfile;
@Mock
private PrefService mPrefService;
@Mock
private ActionManager mActionManager;
@Parameters
public static List<Object[]> data() {
......@@ -133,6 +160,11 @@ public class FeedSessionManagerImplTest {
@Before
public void setUp() {
initMocks(this);
mocker.mock(UserPrefsJni.TEST_HOOKS, mUserPrefsJniMock);
Profile.setLastUsedProfileForTesting(mProfile);
when(mUserPrefsJniMock.get(mProfile)).thenReturn(mPrefService);
mConfiguration = new Configuration.Builder()
.put(ConfigKey.UNDOABLE_ACTIONS_ENABLED, mUploadingActionsEnabled)
.put(ConfigKey.STORAGE_MISS_THRESHOLD, STORAGE_MISS_THRESHOLD)
......@@ -742,6 +774,38 @@ public class FeedSessionManagerImplTest {
verify(modelProviderObserver).onSessionStart(uiContext);
}
@Test
@Features.EnableFeatures(ChromeFeatureList.INTEREST_FEEDV1_CLICKS_AND_VIEWS_CONDITIONAL_UPLOAD)
public void testLifecycleEventsWhenConditionalUploadFeatureEnabled() {
when(mPrefService.getBoolean(Pref.HAS_REACHED_CLICK_AND_VIEW_ACTIONS_UPLOAD_CONDITIONS))
.thenReturn(false);
FeedSessionManagerImpl sessionManager = createFeedSessionManager(mConfiguration);
sessionManager.onLifecycleEvent(LifecycleEvent.ENTER_FOREGROUND);
sessionManager.onLifecycleEvent(LifecycleEvent.ENTER_BACKGROUND);
sessionManager.onLifecycleEvent(LifecycleEvent.SIGNED_IN);
sessionManager.onLifecycleEvent(LifecycleEvent.SIGNED_OUT);
verify(mActionManager, times(4)).setCanUploadClicksAndViewsWhenNoticeCardIsPresent(false);
}
@Test
@Features.DisableFeatures(ChromeFeatureList.INTEREST_FEEDV1_CLICKS_AND_VIEWS_CONDITIONAL_UPLOAD)
public void testLifecycleEventsWhenConditionalUploadFeatureDisabled() {
when(mPrefService.getBoolean(Pref.HAS_REACHED_CLICK_AND_VIEW_ACTIONS_UPLOAD_CONDITIONS))
.thenReturn(false);
FeedSessionManagerImpl sessionManager = createFeedSessionManager(mConfiguration);
sessionManager.onLifecycleEvent(LifecycleEvent.ENTER_FOREGROUND);
sessionManager.onLifecycleEvent(LifecycleEvent.ENTER_BACKGROUND);
sessionManager.onLifecycleEvent(LifecycleEvent.SIGNED_IN);
sessionManager.onLifecycleEvent(LifecycleEvent.SIGNED_OUT);
verify(mActionManager, times(4)).setCanUploadClicksAndViewsWhenNoticeCardIsPresent(true);
}
private int populateSession(FeedSessionManagerImpl sessionManager, int featureCnt, int idStart,
boolean reset,
/*@Nullable*/ String sharedStateId) {
......@@ -806,7 +870,7 @@ public class FeedSessionManagerImplTest {
return new FeedSessionManagerFactory(mFakeTaskQueue, mFakeStore, mTimingUtils,
mFakeThreadUtils, mFakeProtocolAdapter, mFakeRequestManager,
mFakeActionUploadRequestManager, mSchedulerApi, configuration, mFakeClock,
mAppLifecycleListener, mFakeMainThreadRunner, mFakeBasicLoggingApi)
mAppLifecycleListener, mFakeMainThreadRunner, mFakeBasicLoggingApi, mActionManager)
.create();
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment