Commit dc84b288 authored by Donn Denman's avatar Donn Denman Committed by Commit Bot

[TTS] CSRankerLogger -> CSInteractionRecorder.

Renames the ContextualSearchRankerLogger interface to have a more
generic name, in preparation for using it in a more generic way: to
record outcomes that can later be sent to the server for logging and
offline processing.

The ContextualSearchRankerLogger is now the
ContextualSearchInteractionRecoder.

BUG=872902

Change-Id: Ic21bb32227c6587ba179509b369d8e1b48fc1d8e
Reviewed-on: https://chromium-review.googlesource.com/1169968
Commit-Queue: Donn Denman <donnd@chromium.org>
Reviewed-by: default avatarTheresa <twellington@chromium.org>
Cr-Commit-Position: refs/heads/master@{#582984}
parent dc52847f
......@@ -8,7 +8,7 @@ import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.PanelState;
import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchHeuristics;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchIPH;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchRankerLogger;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchInteractionRecorder;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchUma;
import org.chromium.chrome.browser.contextualsearch.EngagementSuppression;
import org.chromium.chrome.browser.contextualsearch.QuickActionCategory;
......@@ -56,10 +56,9 @@ public class ContextualSearchPanelMetrics {
private long mPanelOpenedBeyondPeekDurationMs;
// The current set of heuristics that should be logged with results seen when the panel closes.
private ContextualSearchHeuristics mResultsSeenExperiments;
// The current set of heuristics to be logged through ranker with results seen when the panel
// closes.
private ContextualSearchRankerLogger mRankerLogger;
// Whether Ranker Outcomes are valid, because we showed the panel.
// The interaction recorder to use to record results seen when the panel closes.
private ContextualSearchInteractionRecorder mInteractionRecorder;
// Whether interaction Outcomes are valid, because we showed the panel.
private boolean mAreOutcomesValid;
/**
......@@ -156,7 +155,7 @@ public class ContextualSearchPanelMetrics {
ContextualSearchIPH.doSearchFinishedNotifications(profile, mWasSearchContentViewSeen,
mWasActivatedByTap, mWasContextualCardsDataShown);
writeRankerLoggerOutcomesAndReset();
writeInteractionOutcomesAndReset();
}
if (isStartingSearch) {
......@@ -327,37 +326,38 @@ public class ContextualSearchPanelMetrics {
/**
* Sets up logging through Ranker for outcomes.
* @param rankerLogger The {@link ContextualSearchRankerLogger} currently being used to measure
* or suppress the UI by Ranker.
* @param interactionRecorder The {@link ContextualSearchInteractionRecorder} currently being
* used to measure to recorder user interaction outcomes.
*/
public void setRankerLogger(ContextualSearchRankerLogger rankerLogger) {
mRankerLogger = rankerLogger;
public void setInteractionRecorder(ContextualSearchInteractionRecorder interactionRecorder) {
mInteractionRecorder = interactionRecorder;
mAreOutcomesValid = false;
}
/**
* Writes all the outcome features to the Ranker Logger and resets the logger.
* Writes all the outcome features to the Interaction Recorder and resets it.
*/
public void writeRankerLoggerOutcomesAndReset() {
if (mRankerLogger != null && mWasActivatedByTap && mAreOutcomesValid) {
public void writeInteractionOutcomesAndReset() {
if (mInteractionRecorder != null && mWasActivatedByTap && mAreOutcomesValid) {
// Tell Ranker about the primary outcome.
mRankerLogger.logOutcome(ContextualSearchRankerLogger.Feature.OUTCOME_WAS_PANEL_OPENED,
mInteractionRecorder.logOutcome(
ContextualSearchInteractionRecorder.Feature.OUTCOME_WAS_PANEL_OPENED,
mWasSearchContentViewSeen);
ContextualSearchUma.logRankerInference(
mWasSearchContentViewSeen, mRankerLogger.getPredictionForTapSuppression());
mRankerLogger.logOutcome(
ContextualSearchRankerLogger.Feature.OUTCOME_WAS_CARDS_DATA_SHOWN,
ContextualSearchUma.logRankerInference(mWasSearchContentViewSeen,
mInteractionRecorder.getPredictionForTapSuppression());
mInteractionRecorder.logOutcome(
ContextualSearchInteractionRecorder.Feature.OUTCOME_WAS_CARDS_DATA_SHOWN,
mWasContextualCardsDataShown);
if (mWasQuickActionShown) {
mRankerLogger.logOutcome(
ContextualSearchRankerLogger.Feature.OUTCOME_WAS_QUICK_ACTION_CLICKED,
mInteractionRecorder.logOutcome(ContextualSearchInteractionRecorder.Feature
.OUTCOME_WAS_QUICK_ACTION_CLICKED,
mWasQuickActionClicked);
}
if (mResultsSeenExperiments != null) {
mResultsSeenExperiments.logRankerTapSuppressionOutcome(mRankerLogger);
mResultsSeenExperiments.logRankerTapSuppressionOutcome(mInteractionRecorder);
}
mRankerLogger.writeLogAndReset();
mRankerLogger = null;
mInteractionRecorder.writeLogAndReset();
mInteractionRecorder = null;
}
}
......
......@@ -75,9 +75,9 @@ public class BarOverlapTapSuppression extends ContextualSearchHeuristic {
}
@Override
protected void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
logger.logFeature(
ContextualSearchRankerLogger.Feature.WAS_SCREEN_BOTTOM, mIsConditionSatisfied);
protected void logRankerTapSuppression(ContextualSearchInteractionRecorder recorder) {
recorder.logFeature(ContextualSearchInteractionRecorder.Feature.WAS_SCREEN_BOTTOM,
mIsConditionSatisfied);
}
/**
......
......@@ -103,9 +103,9 @@ class ContextualSearchEntityHeuristic extends ContextualSearchHeuristic {
}
@Override
protected void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
logger.logFeature(ContextualSearchRankerLogger.Feature.IS_ENTITY, mIsProbablyEntity);
logger.logFeature(ContextualSearchRankerLogger.Feature.IS_ENTITY_ELIGIBLE,
protected void logRankerTapSuppression(ContextualSearchInteractionRecorder logger) {
logger.logFeature(ContextualSearchInteractionRecorder.Feature.IS_ENTITY, mIsProbablyEntity);
logger.logFeature(ContextualSearchInteractionRecorder.Feature.IS_ENTITY_ELIGIBLE,
mIsContextCamelCaseForProperNouns);
}
......
......@@ -64,18 +64,18 @@ abstract class ContextualSearchHeuristic {
}
/**
* Logs the heuristic to UMA through Ranker logging for the purpose of Tap Suppression.
* @param logger A logger to log to.
* Logs the heuristic to UMA and UKM through Ranker logging for the purpose of Tap Suppression.
* @param recorder A logger to log to.
*/
protected void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
protected void logRankerTapSuppression(ContextualSearchInteractionRecorder recorder) {
// Default is to not log.
}
/**
* Logs a Ranker outcome using the heuristic for the purpose of Ranker Tap Suppression.
* @param logger A logger to log to.
* @param recorder A logger to log to.
*/
protected void logRankerTapSuppressionOutcome(ContextualSearchRankerLogger logger) {
protected void logRankerTapSuppressionOutcome(ContextualSearchInteractionRecorder recorder) {
// Default is to not log.
}
......
......@@ -79,22 +79,22 @@ public class ContextualSearchHeuristics {
}
/**
* Logs all the heuristics that want to provide a Ranker "feature" to the given logger.
* @param logger The logger to log to.
* Logs all the heuristics that want to provide a Ranker "feature" to the given recorder.
* @param recorder The recorder to log to.
*/
public void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
public void logRankerTapSuppression(ContextualSearchInteractionRecorder recorder) {
for (ContextualSearchHeuristic heuristic : mHeuristics) {
heuristic.logRankerTapSuppression(logger);
heuristic.logRankerTapSuppression(recorder);
}
}
/**
* Logs all the heuristics that want to provide outcomes to Ranker to the given logger.
* @param logger The logger to log to.
* Logs all the heuristics that want to provide outcomes to Ranker to the given recorder.
* @param recorder The logger to log to.
*/
public void logRankerTapSuppressionOutcome(ContextualSearchRankerLogger logger) {
public void logRankerTapSuppressionOutcome(ContextualSearchInteractionRecorder recorder) {
for (ContextualSearchHeuristic heuristic : mHeuristics) {
heuristic.logRankerTapSuppressionOutcome(logger);
heuristic.logRankerTapSuppressionOutcome(recorder);
}
}
......
......@@ -13,9 +13,9 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* An interface for logging to UMA via Ranker.
* An interface for recording user interactions. One implementation does logging to Ranker.
*/
public interface ContextualSearchRankerLogger {
public interface ContextualSearchInteractionRecorder {
// NOTE: this list needs to be kept in sync with the white list in
// predictor_config_definitions.cc, the names list in ContextualSearchRankerLoggerImpl.java
// and with ukm.xml!
......
......@@ -116,7 +116,7 @@ public class ContextualSearchManager
private final TabModelObserver mTabModelObserver;
// The Ranker logger to use to write Tap Suppression Ranker logs to UMA.
private final ContextualSearchRankerLogger mTapSuppressionRankerLogger;
private final ContextualSearchInteractionRecorder mTapSuppressionInteractionRecorder;
private final ContextualSearchSelectionClient mContextualSearchSelectionClient;
......@@ -246,7 +246,7 @@ public class ContextualSearchManager
mTranslateController = new ContextualSearchTranslateController(mPolicy, this);
mInternalStateController = new ContextualSearchInternalStateController(
mPolicy, getContextualSearchInternalStateHandler());
mTapSuppressionRankerLogger = new ContextualSearchRankerLoggerImpl();
mTapSuppressionInteractionRecorder = new ContextualSearchRankerLoggerImpl();
mContextualSearchSelectionClient = new ContextualSearchSelectionClient();
mInProductHelp = new ContextualSearchIPH();
}
......@@ -1411,7 +1411,7 @@ public class ContextualSearchManager
if (mInternalStateController.isStillWorkingOn(InternalState.DECIDING_SUPPRESSION)) {
mInternalStateController.notifyFinishedWorkOn(InternalState.DECIDING_SUPPRESSION);
} else {
mTapSuppressionRankerLogger.reset();
mTapSuppressionInteractionRecorder.reset();
}
}
......@@ -1497,15 +1497,15 @@ public class ContextualSearchManager
}
@Override
public void logNonHeuristicFeatures(ContextualSearchRankerLogger rankerLogger) {
public void logNonHeuristicFeatures(ContextualSearchInteractionRecorder rankerLogger) {
boolean didOptIn = !mPolicy.isUserUndecided();
rankerLogger.logFeature(ContextualSearchRankerLogger.Feature.DID_OPT_IN, didOptIn);
rankerLogger.logFeature(ContextualSearchInteractionRecorder.Feature.DID_OPT_IN, didOptIn);
boolean isHttp = mPolicy.isBasePageHTTP(getBasePageURL());
rankerLogger.logFeature(ContextualSearchRankerLogger.Feature.IS_HTTP, isHttp);
rankerLogger.logFeature(ContextualSearchInteractionRecorder.Feature.IS_HTTP, isHttp);
String contentLanguage = mContext.getDetectedLanguage();
boolean isLanguageMismatch = mTranslateController.needsTranslation(contentLanguage);
rankerLogger.logFeature(
ContextualSearchRankerLogger.Feature.IS_LANGUAGE_MISMATCH, isLanguageMismatch);
rankerLogger.logFeature(ContextualSearchInteractionRecorder.Feature.IS_LANGUAGE_MISMATCH,
isLanguageMismatch);
}
/** Shows the given selection as the Search Term in the Bar. */
......@@ -1529,7 +1529,7 @@ public class ContextualSearchManager
// Make sure we write to Ranker and reset at the end of every search, even if the
// panel was not showing because it was a suppressed tap.
mSearchPanel.getPanelMetrics().writeRankerLoggerOutcomesAndReset();
mSearchPanel.getPanelMetrics().writeInteractionOutcomesAndReset();
if (isSearchPanelShowing()) {
mSearchPanel.closePanel(reason, false);
} else {
......@@ -1590,11 +1590,12 @@ public class ContextualSearchManager
// If it's chained we need to log the outcomes and reset, because we won't be hiding
// the panel at the end of the previous search (we'll update it to the new Search).
if (isSearchPanelShowing()) {
mSearchPanel.getPanelMetrics().writeRankerLoggerOutcomesAndReset();
mSearchPanel.getPanelMetrics().writeInteractionOutcomesAndReset();
}
// Set up the next batch of Ranker logging.
mTapSuppressionRankerLogger.setupLoggingForPage(getBaseWebContents());
mSearchPanel.getPanelMetrics().setRankerLogger(mTapSuppressionRankerLogger);
mTapSuppressionInteractionRecorder.setupLoggingForPage(getBaseWebContents());
mSearchPanel.getPanelMetrics().setInteractionRecorder(
mTapSuppressionInteractionRecorder);
ContextualSearchUma.logRankerFeaturesAvailable(false);
mInternalStateController.notifyFinishedWorkOn(InternalState.TAP_GESTURE_COMMIT);
}
......@@ -1604,7 +1605,8 @@ public class ContextualSearchManager
public void decideSuppression() {
mInternalStateController.notifyStartingWorkOn(InternalState.DECIDING_SUPPRESSION);
// TODO(donnd): Move handleShouldSuppressTap out of the Selection Controller.
mSelectionController.handleShouldSuppressTap(mContext, mTapSuppressionRankerLogger);
mSelectionController.handleShouldSuppressTap(
mContext, mTapSuppressionInteractionRecorder);
}
/** Starts showing the Tap UI by selecting a word around the current caret. */
......@@ -1777,8 +1779,8 @@ public class ContextualSearchManager
}
@VisibleForTesting
ContextualSearchRankerLogger getRankerLogger() {
return mTapSuppressionRankerLogger;
ContextualSearchInteractionRecorder getRankerLogger() {
return mTapSuppressionInteractionRecorder;
}
// ============================================================================================
......
......@@ -17,7 +17,7 @@ import java.util.Map;
/**
* Implements the UMA logging for Ranker that's used for Contextual Search Tap Suppression.
*/
public class ContextualSearchRankerLoggerImpl implements ContextualSearchRankerLogger {
public class ContextualSearchRankerLoggerImpl implements ContextualSearchInteractionRecorder {
private static final String TAG = "ContextualSearch";
// Names for all our features and labels.
......@@ -233,7 +233,7 @@ public class ContextualSearchRankerLoggerImpl implements ContextualSearchRankerL
}
/**
* Logs the given {@link ContextualSearchRankerLogger.Feature} with the given value
* Logs the given {@link ContextualSearchInteractionRecorder.Feature} with the given value
* {@link Object}.
* @param feature The feature to log.
* @param value An {@link Object} value to log (must be convertible to a {@code long}).
......
......@@ -376,11 +376,11 @@ public class ContextualSearchSelectionController {
* This should be called when the context is fully built (by gathering surrounding text
* if needed, etc) but before showing any UX.
* @param contextualSearchContext The {@link ContextualSearchContext} for the Tap gesture.
* @param rankerLogger The {@link ContextualSearchRankerLogger} currently being used to measure
* or suppress the UI by Ranker.
* @param interactionRecorder The {@link ContextualSearchInteractionRecorder} currently being
* used to measure or suppress the UI by Ranker.
*/
void handleShouldSuppressTap(ContextualSearchContext contextualSearchContext,
ContextualSearchRankerLogger rankerLogger) {
ContextualSearchInteractionRecorder interactionRecorder) {
int x = (int) mX;
int y = (int) mY;
......@@ -401,16 +401,16 @@ public class ContextualSearchSelectionController {
// Make sure Tap Suppression features are consistent.
assert !ContextualSearchFieldTrial.isContextualSearchMlTapSuppressionEnabled()
|| rankerLogger.isQueryEnabled()
|| interactionRecorder.isQueryEnabled()
: "Tap Suppression requires the Ranker Query feature to be enabled!";
// If we're suppressing based on heuristics then Ranker doesn't need to know about it.
@AssistRankerPrediction
int tapPrediction = AssistRankerPrediction.UNDETERMINED;
if (!shouldSuppressTapBasedOnHeuristics) {
tapHeuristics.logRankerTapSuppression(rankerLogger);
mHandler.logNonHeuristicFeatures(rankerLogger);
tapPrediction = rankerLogger.runPredictionForTapSuppression();
tapHeuristics.logRankerTapSuppression(interactionRecorder);
mHandler.logNonHeuristicFeatures(interactionRecorder);
tapPrediction = interactionRecorder.runPredictionForTapSuppression();
ContextualSearchUma.logRankerPrediction(tapPrediction);
}
......
......@@ -73,7 +73,8 @@ interface ContextualSearchSelectionHandler {
/**
* Logs all the features that we can obtain without accessing heuristics, i.e. from global
* state.
* @param rankerLogger The {@link ContextualSearchRankerLogger} to log the features to.
* @param interactionRecorder The {@link ContextualSearchInteractionRecorder} to log the
* features to.
*/
public void logNonHeuristicFeatures(ContextualSearchRankerLogger rankerLogger);
public void logNonHeuristicFeatures(ContextualSearchInteractionRecorder interactionRecorder);
}
......@@ -84,22 +84,26 @@ public class CtrSuppression extends ContextualSearchHeuristic {
}
@Override
protected void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
protected void logRankerTapSuppression(ContextualSearchInteractionRecorder recorder) {
if (nativeHasPreviousWeekData(mNativePointer)) {
int previousWeekImpressions = nativeGetPreviousWeekImpressions(mNativePointer);
int previousWeekCtr = (int) (100 * nativeGetPreviousWeekCtr(mNativePointer));
logger.logFeature(ContextualSearchRankerLogger.Feature.PREVIOUS_WEEK_IMPRESSIONS_COUNT,
recorder.logFeature(
ContextualSearchInteractionRecorder.Feature.PREVIOUS_WEEK_IMPRESSIONS_COUNT,
previousWeekImpressions);
logger.logFeature(ContextualSearchRankerLogger.Feature.PREVIOUS_WEEK_CTR_PERCENT,
recorder.logFeature(
ContextualSearchInteractionRecorder.Feature.PREVIOUS_WEEK_CTR_PERCENT,
previousWeekCtr);
}
if (nativeHasPrevious28DayData(mNativePointer)) {
int previous28DayImpressions = nativeGetPrevious28DayImpressions(mNativePointer);
int previous28DayCtr = (int) (100 * nativeGetPrevious28DayCtr(mNativePointer));
logger.logFeature(ContextualSearchRankerLogger.Feature.PREVIOUS_28DAY_IMPRESSIONS_COUNT,
recorder.logFeature(
ContextualSearchInteractionRecorder.Feature.PREVIOUS_28DAY_IMPRESSIONS_COUNT,
previous28DayImpressions);
logger.logFeature(ContextualSearchRankerLogger.Feature.PREVIOUS_28DAY_CTR_PERCENT,
recorder.logFeature(
ContextualSearchInteractionRecorder.Feature.PREVIOUS_28DAY_CTR_PERCENT,
previous28DayCtr);
}
}
......
......@@ -88,31 +88,32 @@ public class EngagementSuppression extends ContextualSearchHeuristic {
}
@Override
protected void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
protected void logRankerTapSuppression(ContextualSearchInteractionRecorder logger) {
// These counters are updated in ContextualSearchPolcy when taps and opens are registered.
logger.logFeature(ContextualSearchRankerLogger.Feature.TAP_COUNT,
logger.logFeature(ContextualSearchInteractionRecorder.Feature.TAP_COUNT,
mPreferenceManager.readInt(
ChromePreferenceManager.CONTEXTUAL_SEARCH_ALL_TIME_TAP_COUNT));
logger.logFeature(ContextualSearchRankerLogger.Feature.OPEN_COUNT,
logger.logFeature(ContextualSearchInteractionRecorder.Feature.OPEN_COUNT,
mPreferenceManager.readInt(
ChromePreferenceManager.CONTEXTUAL_SEARCH_ALL_TIME_OPEN_COUNT));
logger.logFeature(ContextualSearchRankerLogger.Feature.QUICK_ANSWER_COUNT,
logger.logFeature(ContextualSearchInteractionRecorder.Feature.QUICK_ANSWER_COUNT,
mPreferenceManager.readInt(
ChromePreferenceManager.CONTEXTUAL_SEARCH_ALL_TIME_TAP_QUICK_ANSWER_COUNT));
// These counters are updated in the #registerX static methods of this class.
logger.logFeature(ContextualSearchRankerLogger.Feature.ENTITY_IMPRESSIONS_COUNT,
logger.logFeature(ContextualSearchInteractionRecorder.Feature.ENTITY_IMPRESSIONS_COUNT,
mPreferenceManager.readInt(
ChromePreferenceManager.CONTEXTUAL_SEARCH_ENTITY_IMPRESSIONS_COUNT));
logger.logFeature(ContextualSearchRankerLogger.Feature.ENTITY_OPENS_COUNT,
logger.logFeature(ContextualSearchInteractionRecorder.Feature.ENTITY_OPENS_COUNT,
mPreferenceManager.readInt(
ChromePreferenceManager.CONTEXTUAL_SEARCH_ENTITY_OPENS_COUNT));
logger.logFeature(ContextualSearchRankerLogger.Feature.QUICK_ACTION_IMPRESSIONS_COUNT,
logger.logFeature(
ContextualSearchInteractionRecorder.Feature.QUICK_ACTION_IMPRESSIONS_COUNT,
mPreferenceManager.readInt(
ChromePreferenceManager.CONTEXTUAL_SEARCH_QUICK_ACTION_IMPRESSIONS_COUNT));
logger.logFeature(ContextualSearchRankerLogger.Feature.QUICK_ACTIONS_TAKEN_COUNT,
logger.logFeature(ContextualSearchInteractionRecorder.Feature.QUICK_ACTIONS_TAKEN_COUNT,
mPreferenceManager.readInt(
ChromePreferenceManager.CONTEXTUAL_SEARCH_QUICK_ACTIONS_TAKEN_COUNT));
logger.logFeature(ContextualSearchRankerLogger.Feature.QUICK_ACTIONS_IGNORED_COUNT,
logger.logFeature(ContextualSearchInteractionRecorder.Feature.QUICK_ACTIONS_IGNORED_COUNT,
mPreferenceManager.readInt(
ChromePreferenceManager.CONTEXTUAL_SEARCH_QUICK_ACTIONS_IGNORED_COUNT));
}
......
......@@ -47,8 +47,8 @@ public class NearTopTapSuppression extends ContextualSearchHeuristic {
}
@Override
protected void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
logger.logFeature(ContextualSearchRankerLogger.Feature.SCREEN_TOP_DPS, mYDp);
protected void logRankerTapSuppression(ContextualSearchInteractionRecorder logger) {
logger.logFeature(ContextualSearchInteractionRecorder.Feature.SCREEN_TOP_DPS, mYDp);
}
// TODO(twellington): Define a default value to use when determining if the condition is
......
......@@ -57,8 +57,8 @@ class QuickAnswersHeuristic extends ContextualSearchHeuristic {
}
@Override
protected void logRankerTapSuppressionOutcome(ContextualSearchRankerLogger logger) {
logger.logOutcome(
ContextualSearchRankerLogger.Feature.OUTCOME_WAS_QUICK_ANSWER_SEEN, mDidAnswer);
protected void logRankerTapSuppressionOutcome(ContextualSearchInteractionRecorder logger) {
logger.logOutcome(ContextualSearchInteractionRecorder.Feature.OUTCOME_WAS_QUICK_ANSWER_SEEN,
mDidAnswer);
}
}
......@@ -49,8 +49,8 @@ public class RecentScrollTapSuppression extends ContextualSearchHeuristic {
}
@Override
protected void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
logger.logFeature(ContextualSearchRankerLogger.Feature.DURATION_AFTER_SCROLL_MS,
protected void logRankerTapSuppression(ContextualSearchInteractionRecorder logger) {
logger.logFeature(ContextualSearchInteractionRecorder.Feature.DURATION_AFTER_SCROLL_MS,
mDurationSinceRecentScrollMs);
}
}
......@@ -46,8 +46,8 @@ class SecondTapMlOverride extends ContextualSearchHeuristic {
}
@Override
protected void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
logger.logFeature(ContextualSearchRankerLogger.Feature.IS_SECOND_TAP_OVERRIDE,
protected void logRankerTapSuppression(ContextualSearchInteractionRecorder logger) {
logger.logFeature(ContextualSearchInteractionRecorder.Feature.IS_SECOND_TAP_OVERRIDE,
shouldOverrideMlTapSuppression());
}
......
......@@ -49,9 +49,9 @@ class ShortTextRunSuppression extends ContextualSearchHeuristic {
}
@Override
protected void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
logger.logFeature(
ContextualSearchRankerLogger.Feature.PORTION_OF_ELEMENT, mWordElementRatioDecile);
protected void logRankerTapSuppression(ContextualSearchInteractionRecorder logger) {
logger.logFeature(ContextualSearchInteractionRecorder.Feature.PORTION_OF_ELEMENT,
mWordElementRatioDecile);
}
/**
......
......@@ -43,8 +43,9 @@ class SmallTextSuppression extends ContextualSearchHeuristic {
}
@Override
protected void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
logger.logFeature(ContextualSearchRankerLogger.Feature.FONT_SIZE, mDecilizedFontSize);
protected void logRankerTapSuppression(ContextualSearchInteractionRecorder logger) {
logger.logFeature(
ContextualSearchInteractionRecorder.Feature.FONT_SIZE, mDecilizedFontSize);
}
/**
......
......@@ -44,8 +44,9 @@ class TapDurationSuppression extends ContextualSearchHeuristic {
}
@Override
protected void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
logger.logFeature(ContextualSearchRankerLogger.Feature.TAP_DURATION_MS, mTapDurationMs);
protected void logRankerTapSuppression(ContextualSearchInteractionRecorder logger) {
logger.logFeature(
ContextualSearchInteractionRecorder.Feature.TAP_DURATION_MS, mTapDurationMs);
}
@Override
......
......@@ -53,8 +53,9 @@ class TapWordEdgeSuppression extends ContextualSearchHeuristic {
}
@Override
protected void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
logger.logFeature(ContextualSearchRankerLogger.Feature.IS_WORD_EDGE, mIsConditionSatisfied);
protected void logRankerTapSuppression(ContextualSearchInteractionRecorder logger) {
logger.logFeature(
ContextualSearchInteractionRecorder.Feature.IS_WORD_EDGE, mIsConditionSatisfied);
}
/**
......
......@@ -64,11 +64,11 @@ class TapWordLengthSuppression extends ContextualSearchHeuristic {
}
@Override
protected void logRankerTapSuppression(ContextualSearchRankerLogger logger) {
logger.logFeature(
ContextualSearchRankerLogger.Feature.IS_SHORT_WORD, mIsShortWordConditionSatisfied);
logger.logFeature(
ContextualSearchRankerLogger.Feature.IS_LONG_WORD, mIsLongWordConditionSatisfied);
protected void logRankerTapSuppression(ContextualSearchInteractionRecorder logger) {
logger.logFeature(ContextualSearchInteractionRecorder.Feature.IS_SHORT_WORD,
mIsShortWordConditionSatisfied);
logger.logFeature(ContextualSearchInteractionRecorder.Feature.IS_LONG_WORD,
mIsLongWordConditionSatisfied);
}
/**
......
......@@ -298,7 +298,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchNetworkCommunicator.java",
"java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchObserver.java",
"java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java",
"java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRankerLogger.java",
"java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInteractionRecorder.java",
"java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRankerLoggerImpl.java",
"java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequest.java",
"java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java",
......
......@@ -147,7 +147,7 @@ public class ContextualSearchManagerTest {
new HashSet<Integer>(ContextualSearchRankerLoggerImpl.OUTCOMES.keySet());
// We don't log whether the quick action was clicked unless we actually have a quick action.
expectedOutcomes.remove(
ContextualSearchRankerLogger.Feature.OUTCOME_WAS_QUICK_ACTION_CLICKED);
ContextualSearchInteractionRecorder.Feature.OUTCOME_WAS_QUICK_ACTION_CLICKED);
EXPECTED_RANKER_OUTCOMES = Collections.unmodifiableSet(expectedOutcomes);
}
// Integer values should contain @Feature values only.
......@@ -157,12 +157,14 @@ public class ContextualSearchManagerTest {
Set<Integer> expectedFeatures =
new HashSet<Integer>(ContextualSearchRankerLoggerImpl.FEATURES.keySet());
// We don't log previous user impressions and CTR if not available for the current user.
expectedFeatures.remove(ContextualSearchRankerLogger.Feature.PREVIOUS_WEEK_CTR_PERCENT);
expectedFeatures.remove(
ContextualSearchRankerLogger.Feature.PREVIOUS_WEEK_IMPRESSIONS_COUNT);
expectedFeatures.remove(ContextualSearchRankerLogger.Feature.PREVIOUS_28DAY_CTR_PERCENT);
ContextualSearchInteractionRecorder.Feature.PREVIOUS_WEEK_CTR_PERCENT);
expectedFeatures.remove(
ContextualSearchRankerLogger.Feature.PREVIOUS_28DAY_IMPRESSIONS_COUNT);
ContextualSearchInteractionRecorder.Feature.PREVIOUS_WEEK_IMPRESSIONS_COUNT);
expectedFeatures.remove(
ContextualSearchInteractionRecorder.Feature.PREVIOUS_28DAY_CTR_PERCENT);
expectedFeatures.remove(
ContextualSearchInteractionRecorder.Feature.PREVIOUS_28DAY_IMPRESSIONS_COUNT);
EXPECTED_RANKER_FEATURES = Collections.unmodifiableSet(expectedFeatures);
}
......@@ -1111,20 +1113,22 @@ public class ContextualSearchManagerTest {
}
/** @return The value of the given logged feature, or {@code null} if not logged. */
private Object loggedToRanker(@ContextualSearchRankerLogger.Feature int feature) {
private Object loggedToRanker(@ContextualSearchInteractionRecorder.Feature int feature) {
return getRankerLogger().getFeaturesLogged().get(feature);
}
/** Asserts that all the expected features have been logged to Ranker. **/
private void assertLoggedAllExpectedFeaturesToRanker() {
for (@ContextualSearchRankerLogger.Feature Integer feature : EXPECTED_RANKER_FEATURES) {
for (@ContextualSearchInteractionRecorder.Feature Integer feature :
EXPECTED_RANKER_FEATURES) {
Assert.assertNotNull(loggedToRanker(feature));
}
}
/** Asserts that all the expected outcomes have been logged to Ranker. **/
private void assertLoggedAllExpectedOutcomesToRanker() {
for (@ContextualSearchRankerLogger.Feature Integer feature : EXPECTED_RANKER_OUTCOMES) {
for (@ContextualSearchInteractionRecorder.Feature Integer feature :
EXPECTED_RANKER_OUTCOMES) {
Assert.assertNotNull("Expected this outcome to be logged: " + feature,
getRankerLogger().getOutcomesLogged().get(feature));
}
......@@ -1206,7 +1210,7 @@ public class ContextualSearchManagerTest {
assertLoggedAllExpectedFeaturesToRanker();
Assert.assertEquals(
true, loggedToRanker(ContextualSearchRankerLogger.Feature.IS_LONG_WORD));
true, loggedToRanker(ContextualSearchInteractionRecorder.Feature.IS_LONG_WORD));
// The panel must be closed for outcomes to be logged.
// Close the panel by clicking far away in order to make sure the outcomes get logged by
// the hideContextualSearchUi call to writeRankerLoggerOutcomesAndReset.
......
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