Commit 402ea42d authored by Vincent Boisselle's avatar Vincent Boisselle Committed by Commit Bot

Fill the acknowledgement bit in Feed V1

Bug: 1146458
Change-Id: I8289fe25d2b9b52687ae03e9308474f4ce9d2943
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2534399Reviewed-by: default avatarDan H <harringtond@chromium.org>
Commit-Queue: Vincent Boisselle <vincb@google.com>
Cr-Commit-Position: refs/heads/master@{#827523}
parent e6f430c8
...@@ -8,8 +8,6 @@ import android.content.Context; ...@@ -8,8 +8,6 @@ import android.content.Context;
import android.os.Build; import android.os.Build;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import androidx.annotation.VisibleForTesting;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import org.chromium.base.Consumer; import org.chromium.base.Consumer;
...@@ -52,6 +50,7 @@ import org.chromium.chrome.browser.signin.IdentityServicesProvider; ...@@ -52,6 +50,7 @@ import org.chromium.chrome.browser.signin.IdentityServicesProvider;
import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamToken; import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamToken;
import org.chromium.components.feed.core.proto.wire.ActionTypeProto; import org.chromium.components.feed.core.proto.wire.ActionTypeProto;
import org.chromium.components.feed.core.proto.wire.CapabilityProto.Capability; import org.chromium.components.feed.core.proto.wire.CapabilityProto.Capability;
import org.chromium.components.feed.core.proto.wire.ChromeFulfillmentInfoProto.ChromeFulfillmentInfo;
import org.chromium.components.feed.core.proto.wire.ClientInfoProto.ClientInfo; import org.chromium.components.feed.core.proto.wire.ClientInfoProto.ClientInfo;
import org.chromium.components.feed.core.proto.wire.ClientInfoProto.ClientInfo.PlatformType; import org.chromium.components.feed.core.proto.wire.ClientInfoProto.ClientInfo.PlatformType;
import org.chromium.components.feed.core.proto.wire.ConsistencyTokenProto.ConsistencyToken; import org.chromium.components.feed.core.proto.wire.ConsistencyTokenProto.ConsistencyToken;
...@@ -153,8 +152,8 @@ public class FeedRequestManagerImpl implements FeedRequestManager { ...@@ -153,8 +152,8 @@ public class FeedRequestManagerImpl implements FeedRequestManager {
Logger.i(TAG, "trigger refresh %s", reason); Logger.i(TAG, "trigger refresh %s", reason);
RequestBuilder request = newDefaultRequest(reason).setConsistencyToken(token); RequestBuilder request = newDefaultRequest(reason).setConsistencyToken(token);
if (shouldDismissNoticeCard()) { if (shouldAcknowledgeNoticeCard()) {
request.dismissNoticeCard(); request.acknowledgeNoticeCard();
} }
if (mThreadUtils.isMainThread()) { if (mThreadUtils.isMainThread()) {
...@@ -167,8 +166,7 @@ public class FeedRequestManagerImpl implements FeedRequestManager { ...@@ -167,8 +166,7 @@ public class FeedRequestManagerImpl implements FeedRequestManager {
} }
} }
@VisibleForTesting boolean shouldAcknowledgeNoticeCard() {
boolean shouldDismissNoticeCard() {
if (!ChromeFeatureList.isEnabled( if (!ChromeFeatureList.isEnabled(
ChromeFeatureList.INTEREST_FEED_NOTICE_CARD_AUTO_DISMISS)) { ChromeFeatureList.INTEREST_FEED_NOTICE_CARD_AUTO_DISMISS)) {
return false; return false;
...@@ -377,6 +375,7 @@ public class FeedRequestManagerImpl implements FeedRequestManager { ...@@ -377,6 +375,7 @@ public class FeedRequestManagerImpl implements FeedRequestManager {
@RequestReason @RequestReason
private final int mClientLoggingRequestReason; private final int mClientLoggingRequestReason;
private boolean mCardMenuTooltipWouldTrigger; private boolean mCardMenuTooltipWouldTrigger;
private boolean mIsNoticeCardAcknowledged;
RequestBuilder(Context context, ApplicationInfo applicationInfo, RequestBuilder(Context context, ApplicationInfo applicationInfo,
Configuration configuration, @RequestReason int requestReason) { Configuration configuration, @RequestReason int requestReason) {
...@@ -429,6 +428,10 @@ public class FeedRequestManagerImpl implements FeedRequestManager { ...@@ -429,6 +428,10 @@ public class FeedRequestManagerImpl implements FeedRequestManager {
if (mToken != null) { if (mToken != null) {
feedQuery.setPageToken(mToken); feedQuery.setPageToken(mToken);
} }
if (mIsNoticeCardAcknowledged) {
feedQuery.setChromeFulfillmentInfo(
ChromeFulfillmentInfo.newBuilder().setNoticeCardAcknowledged(true));
}
FeedRequest.Builder feedRequestBuilder = FeedRequest.Builder feedRequestBuilder =
FeedRequest.newBuilder().setFeedQuery(feedQuery); FeedRequest.newBuilder().setFeedQuery(feedQuery);
if (mConsistencyToken != null) { if (mConsistencyToken != null) {
...@@ -446,9 +449,9 @@ public class FeedRequestManagerImpl implements FeedRequestManager { ...@@ -446,9 +449,9 @@ public class FeedRequestManagerImpl implements FeedRequestManager {
return requestBuilder.build(); return requestBuilder.build();
} }
// TODO(b/1146458): Implement this function once we are decided on the right wire protocol public void acknowledgeNoticeCard() {
// to dismiss the notice card from the client. mIsNoticeCardAcknowledged = true;
public void dismissNoticeCard() {} }
private void addCapabilities(FeedRequest.Builder feedRequestBuilder) { private void addCapabilities(FeedRequest.Builder feedRequestBuilder) {
addCapabilityIfConfigEnabled( addCapabilityIfConfigEnabled(
......
...@@ -467,28 +467,66 @@ public class FeedRequestManagerImplTest { ...@@ -467,28 +467,66 @@ public class FeedRequestManagerImplTest {
@Test @Test
@Features.EnableFeatures({ChromeFeatureList.INTEREST_FEED_NOTICE_CARD_AUTO_DISMISS}) @Features.EnableFeatures({ChromeFeatureList.INTEREST_FEED_NOTICE_CARD_AUTO_DISMISS})
public void testTriggerRefresh_dismissNoticeCard() throws Exception { public void testTriggerRefresh_acknowledgeNoticeCard_whenClicksThresholdReached()
// Simulate enough views and clicks. throws Exception {
// Simulate enough clicks.
when(mPrefService.getInteger(Pref.NOTICE_CARD_CLICKS_COUNT)).thenReturn(1); when(mPrefService.getInteger(Pref.NOTICE_CARD_CLICKS_COUNT)).thenReturn(1);
when(mPrefService.getInteger(Pref.NOTICE_CARD_VIEWS_COUNT)).thenReturn(0);
mRequestManager.triggerRefresh(RequestReason.HOST_REQUESTED, input -> {});
HttpRequest httpRequest = mFakeNetworkClient.getLatestRequest();
assertHttpRequestFormattedCorrectly(httpRequest, mContext);
assertTrue(getRequestFromHttpRequest(httpRequest)
.getExtension(FeedRequest.feedRequest)
.getFeedQuery()
.getChromeFulfillmentInfo()
.getNoticeCardAcknowledged());
}
@Test
@Features.EnableFeatures({ChromeFeatureList.INTEREST_FEED_NOTICE_CARD_AUTO_DISMISS})
public void testTriggerRefresh_acknowledgeNoticeCard_whenViewsThresholdReached()
throws Exception {
// Simulate enough views.
when(mPrefService.getInteger(Pref.NOTICE_CARD_CLICKS_COUNT)).thenReturn(0);
when(mPrefService.getInteger(Pref.NOTICE_CARD_VIEWS_COUNT)).thenReturn(3); when(mPrefService.getInteger(Pref.NOTICE_CARD_VIEWS_COUNT)).thenReturn(3);
assertTrue(mRequestManager.shouldDismissNoticeCard()); mRequestManager.triggerRefresh(RequestReason.HOST_REQUESTED, input -> {});
HttpRequest httpRequest = mFakeNetworkClient.getLatestRequest();
assertHttpRequestFormattedCorrectly(httpRequest, mContext);
assertTrue(getRequestFromHttpRequest(httpRequest)
.getExtension(FeedRequest.feedRequest)
.getFeedQuery()
.getChromeFulfillmentInfo()
.getNoticeCardAcknowledged());
} }
@Test @Test
public void testTriggerRefresh_dontDismissNoticeCard_whenFeatureDisabled() throws Exception { public void testTriggerRefresh_dontAcknowledgeNoticeCard_whenFeatureDisabled()
throws Exception {
// Simulate enough views and clicks. // Simulate enough views and clicks.
when(mPrefService.getInteger(Pref.NOTICE_CARD_CLICKS_COUNT)).thenReturn(1); when(mPrefService.getInteger(Pref.NOTICE_CARD_CLICKS_COUNT)).thenReturn(1);
when(mPrefService.getInteger(Pref.NOTICE_CARD_VIEWS_COUNT)).thenReturn(3); when(mPrefService.getInteger(Pref.NOTICE_CARD_VIEWS_COUNT)).thenReturn(3);
mRequestManager.triggerRefresh(RequestReason.HOST_REQUESTED, input -> {}); mRequestManager.triggerRefresh(RequestReason.HOST_REQUESTED, input -> {});
assertFalse(mRequestManager.shouldDismissNoticeCard()); HttpRequest httpRequest = mFakeNetworkClient.getLatestRequest();
assertHttpRequestFormattedCorrectly(httpRequest, mContext);
assertFalse(getRequestFromHttpRequest(httpRequest)
.getExtension(FeedRequest.feedRequest)
.getFeedQuery()
.getChromeFulfillmentInfo()
.getNoticeCardAcknowledged());
} }
@Test @Test
@Features.EnableFeatures({ChromeFeatureList.INTEREST_FEED_NOTICE_CARD_AUTO_DISMISS}) @Features.EnableFeatures({ChromeFeatureList.INTEREST_FEED_NOTICE_CARD_AUTO_DISMISS})
public void testTriggerRefresh_dontDismissNoticeCard_whenCountThresholdsNotReached() public void testTriggerRefresh_dontAcknowledgeNoticeCard_whenCountThresholdsNotReached()
throws Exception { throws Exception {
// Simulate not enough views nor clicks. // Simulate not enough views nor clicks.
when(mPrefService.getInteger(Pref.NOTICE_CARD_CLICKS_COUNT)).thenReturn(0); when(mPrefService.getInteger(Pref.NOTICE_CARD_CLICKS_COUNT)).thenReturn(0);
...@@ -496,7 +534,14 @@ public class FeedRequestManagerImplTest { ...@@ -496,7 +534,14 @@ public class FeedRequestManagerImplTest {
mRequestManager.triggerRefresh(RequestReason.HOST_REQUESTED, input -> {}); mRequestManager.triggerRefresh(RequestReason.HOST_REQUESTED, input -> {});
assertFalse(mRequestManager.shouldDismissNoticeCard()); HttpRequest httpRequest = mFakeNetworkClient.getLatestRequest();
assertHttpRequestFormattedCorrectly(httpRequest, mContext);
assertFalse(getRequestFromHttpRequest(httpRequest)
.getExtension(FeedRequest.feedRequest)
.getFeedQuery()
.getChromeFulfillmentInfo()
.getNoticeCardAcknowledged());
} }
@Test @Test
......
...@@ -94,6 +94,7 @@ if (is_android) { ...@@ -94,6 +94,7 @@ if (is_android) {
"wire/action_request.proto", "wire/action_request.proto",
"wire/action_type.proto", "wire/action_type.proto",
"wire/capability.proto", "wire/capability.proto",
"wire/chrome_fulfillment_info.proto",
"wire/client_info.proto", "wire/client_info.proto",
"wire/consistency_token.proto", "wire/consistency_token.proto",
"wire/content_id.proto", "wire/content_id.proto",
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
syntax = "proto2"; syntax = "proto2";
package feedwire; package feedwire;
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
syntax = "proto2";
package feedwire1;
option optimize_for = LITE_RUNTIME;
option java_package = "org.chromium.components.feed.core.proto.wire";
option java_outer_classname = "ChromeFulfillmentInfoProto";
// Information on how to do content fulfillment for Chrome.
message ChromeFulfillmentInfo {
// Whether the notice card has already been acknowledged by the user based on
// their views and clicks on the card. This is different from when the user
// explicitly dismiss the notice card by touching the button.
optional bool notice_card_acknowledged = 1;
}
...@@ -11,6 +11,8 @@ option optimize_for = LITE_RUNTIME; ...@@ -11,6 +11,8 @@ option optimize_for = LITE_RUNTIME;
option java_package = "org.chromium.components.feed.core.proto.wire"; option java_package = "org.chromium.components.feed.core.proto.wire";
option java_outer_classname = "FeedQueryProto"; option java_outer_classname = "FeedQueryProto";
import "components/feed/core/proto/wire/chrome_fulfillment_info.proto";
message FeedQuery { message FeedQuery {
enum RequestReason { enum RequestReason {
// Bucket for any not listed. Should not be used (prefer adding a new // Bucket for any not listed. Should not be used (prefer adding a new
...@@ -49,4 +51,7 @@ message FeedQuery { ...@@ -49,4 +51,7 @@ message FeedQuery {
// Used to fetch the next page when scrolling copied from // Used to fetch the next page when scrolling copied from
// Token.next_page_token // Token.next_page_token
optional bytes page_token = 2; optional bytes page_token = 2;
// Information on how to do content fulfillment for Chrome.
optional ChromeFulfillmentInfo chrome_fulfillment_info = 3;
} }
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