Index: chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java |
index fc22a8e0145a99d572dbba9323e996e8bc7d9554..e62d2a056021621948f3ed524c944017fb3bef58 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java |
@@ -94,6 +94,8 @@ public class ContextualSearchManager implements ContextualSearchManagementDelega |
// timer). |
private static final int TAP_NEAR_PREVIOUS_DETECTION_DELAY_MS = 100; |
+ private static final int NANOSECONDS_IN_A_MILLISECOND = 1000000; |
+ |
private final ObserverList<ContextualSearchObserver> mObservers = |
new ObserverList<ContextualSearchObserver>(); |
@@ -102,6 +104,9 @@ public class ContextualSearchManager implements ContextualSearchManagementDelega |
private final ViewTreeObserver.OnGlobalFocusChangeListener mOnFocusChangeListener; |
private final TabModelObserver mTabModelObserver; |
+ // The Ranker logger to use to write Tap Suppression Ranker logs to UMA. |
+ private final ContextualSearchRankerLogger mTapSuppressionRankerLogger; |
+ |
private ContextualSearchSelectionController mSelectionController; |
private ContextualSearchNetworkCommunicator mNetworkCommunicator; |
private ContextualSearchPolicy mPolicy; |
@@ -224,15 +229,12 @@ public class ContextualSearchManager implements ContextualSearchManagementDelega |
}; |
mSelectionController = new ContextualSearchSelectionController(activity, this); |
- |
mNetworkCommunicator = this; |
- |
mPolicy = new ContextualSearchPolicy(mSelectionController, mNetworkCommunicator); |
- |
mTranslateController = new ContextualSearchTranslateController(activity, mPolicy, this); |
- |
mInternalStateController = new ContextualSearchInternalStateController( |
mPolicy, getContextualSearchInternalStateHandler()); |
+ mTapSuppressionRankerLogger = new ContextualSearchRankerLoggerImpl(); |
} |
/** |
@@ -1291,10 +1293,40 @@ public class ContextualSearchManager implements ContextualSearchManagementDelega |
} |
@Override |
- public void handleNonSuppressedTap() { |
+ public void handleNonSuppressedTap(long tapTimeNanoseconds) { |
if (mIsAccessibilityModeEnabled) return; |
- mInternalStateController.notifyFinishedWorkOn(InternalState.DECIDING_SUPPRESSION); |
+ // If there's a wait-after-tap experiment then we may want to delay a bit longer for |
+ // the user to take an action like scrolling that will reset our internal state. |
+ long delayBeforeFinishingWorkMs = 0; |
+ if (ContextualSearchFieldTrial.getWaitAfterTapDelayMs() > 0 && tapTimeNanoseconds > 0) { |
+ delayBeforeFinishingWorkMs = ContextualSearchFieldTrial.getWaitAfterTapDelayMs() |
+ - (System.nanoTime() - tapTimeNanoseconds) / NANOSECONDS_IN_A_MILLISECOND; |
+ } |
+ |
+ // Finish work on the current state, either immediately or with a delay. |
+ if (delayBeforeFinishingWorkMs <= 0) { |
+ finishSuppressionDecision(); |
+ } else { |
+ new Handler().postDelayed(new Runnable() { |
+ @Override |
+ public void run() { |
+ finishSuppressionDecision(); |
+ } |
+ }, delayBeforeFinishingWorkMs); |
+ } |
+ } |
+ |
+ /** |
+ * Finishes work on the suppression decision if that work is still in progress. |
+ * If no longer working on the suppression decision then resets the Ranker-logger. |
+ */ |
+ private void finishSuppressionDecision() { |
+ if (mInternalStateController.isStillWorkingOn(InternalState.DECIDING_SUPPRESSION)) { |
+ mInternalStateController.notifyFinishedWorkOn(InternalState.DECIDING_SUPPRESSION); |
+ } else { |
+ mTapSuppressionRankerLogger.reset(); |
+ } |
} |
@Override |
@@ -1308,7 +1340,7 @@ public class ContextualSearchManager implements ContextualSearchManagementDelega |
mHeuristics.add(mQuickAnswersHeuristic); |
mSearchPanel.getPanelMetrics().setResultsSeenExperiments(mHeuristics); |
- mSearchPanel.getPanelMetrics().setRankerLogExperiments(mHeuristics, getBasePageUrl()); |
+ mSearchPanel.getPanelMetrics().setRankerLogger(mTapSuppressionRankerLogger); |
} |
@Override |
@@ -1442,7 +1474,12 @@ public class ContextualSearchManager implements ContextualSearchManagementDelega |
@Override |
public void decideSuppression() { |
mInternalStateController.notifyStartingWorkOn(InternalState.DECIDING_SUPPRESSION); |
- mSelectionController.handleShouldSuppressTap(); |
+ // Ranker will handle the suppression, but our legacy implementation uses |
+ // TapSuppressionHeuristics (run from the ContextualSearchSelectionConroller). |
+ mTapSuppressionRankerLogger.setupLoggingForPage(getBasePageUrl()); |
+ |
+ // TODO(donnd): Move handleShouldSuppressTap out of the Selection Controller. |
+ mSelectionController.handleShouldSuppressTap(mTapSuppressionRankerLogger); |
} |
/** Starts showing the Tap UI by selecting a word around the current caret. */ |