Index: chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java |
index aa90dddbbe452f8368c4c158442a024a061e8018..49b587974341a008d32dfa2d3d67e65a834b46ae 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java |
@@ -41,9 +41,6 @@ public class ContextualSearchSelectionController { |
// TODO(donnd): Fix in Blink, crbug.com/435778. |
private static final int INVALID_IF_NO_SELECTION_CHANGE_AFTER_TAP_MS = 50; |
- // The default navigation-detection-delay in milliseconds. |
- private static final int TAP_NAVIGATION_DETECTION_DELAY = 16; |
- |
private static final String CONTAINS_WORD_PATTERN = "(\\w|\\p{L}|\\p{N})+"; |
// A URL is: |
// 1: scheme:// |
@@ -69,7 +66,6 @@ public class ContextualSearchSelectionController { |
private boolean mWasTapGestureDetected; |
// Reflects whether the last tap was valid and whether we still have a tap-based selection. |
private ContextualSearchTapState mLastTapState; |
- private TapSuppressionHeuristics mTapHeuristics; |
private boolean mIsWaitingForInvalidTapDetection; |
private boolean mShouldHandleSelectionModification; |
private boolean mDidExpandSelection; |
@@ -81,6 +77,9 @@ public class ContextualSearchSelectionController { |
// The time of the most last scroll activity, or 0 if none. |
private long mLastScrollTimeNs; |
+ // When the last tap gesture happened. |
+ private long mTapTimeNanoseconds; |
+ |
// Tracks whether a Context Menu has just been shown and the UX has been dismissed. |
// The selection may be unreliable until the next reset. See crbug.com/628436. |
private boolean mIsContextMenuShown; |
@@ -239,6 +238,7 @@ public class ContextualSearchSelectionController { |
* @param selection The selection portion of the context. |
*/ |
void handleSelectionChanged(String selection) { |
+ System.out.println("ctxs CSSC handleSelectionChanged " + selection.length()); |
if (mDidExpandSelection) { |
mSelectedText = selection; |
mDidExpandSelection = false; |
@@ -262,7 +262,7 @@ public class ContextualSearchSelectionController { |
mSelectedText = selection; |
if (mWasTapGestureDetected) { |
- mSelectionType = SelectionType.TAP; |
+ assert mSelectionType == SelectionType.TAP; |
handleSelection(selection, mSelectionType); |
mWasTapGestureDetected = false; |
} else { |
@@ -281,6 +281,7 @@ public class ContextualSearchSelectionController { |
boolean shouldHandleSelection = false; |
switch (eventType) { |
case SelectionEventType.SELECTION_HANDLES_SHOWN: |
+ System.out.println("ctxs SELECTION_HANDLES_SHOWN"); |
if (!mIsContextMenuShown) { |
mWasTapGestureDetected = false; |
mSelectionType = SelectionType.LONG_PRESS; |
@@ -323,17 +324,19 @@ public class ContextualSearchSelectionController { |
private void handleSelection(String selection, SelectionType type) { |
mShouldHandleSelectionModification = true; |
boolean isValidSelection = validateSelectionSuppression(selection); |
- mHandler.handleSelection(selection, isValidSelection, type, mX, mY); |
+ mHandler.handleSelection(selection, isValidSelection, type, mX, mY, mTapTimeNanoseconds); |
} |
/** |
* Resets all internal state of this class, including the tap state. |
*/ |
private void resetAllStates() { |
+ System.out.println("ctxs resetAllStates"); |
resetSelectionStates(); |
mLastTapState = null; |
mLastScrollTimeNs = 0; |
mIsContextMenuShown = false; |
+ mTapTimeNanoseconds = 0; |
} |
/** |
@@ -364,39 +367,11 @@ public class ContextualSearchSelectionController { |
// TODO(donnd): refactor to avoid needing a new handler API method as suggested by Pedro. |
if (mSelectionType != SelectionType.LONG_PRESS) { |
mWasTapGestureDetected = true; |
- long tapTimeNanoseconds = System.nanoTime(); |
- // TODO(donnd): add a policy method to get adjusted tap count. |
- ChromePreferenceManager prefs = ChromePreferenceManager.getInstance(); |
- int adjustedTapsSinceOpen = prefs.getContextualSearchTapCount() |
- - prefs.getContextualSearchTapQuickAnswerCount(); |
- // Explicitly destroy the old heuristics so native code can dispose data. |
- if (mTapHeuristics != null) mTapHeuristics.destroy(); |
- mTapHeuristics = |
- new TapSuppressionHeuristics(this, mLastTapState, x, y, adjustedTapsSinceOpen); |
- // TODO(donnd): Move to be called when the panel closes to work with states that change. |
- mTapHeuristics.logConditionState(); |
- // Tell the manager what it needs in order to log metrics on whether the tap would have |
- // been suppressed if each of the heuristics were satisfied. |
- mHandler.handleMetricsForWouldSuppressTap(mTapHeuristics); |
+ mSelectionType = SelectionType.TAP; |
+ mTapTimeNanoseconds = System.nanoTime(); |
mX = x; |
mY = y; |
- boolean shouldSuppressTap = mTapHeuristics.shouldSuppressTap(); |
- if (shouldSuppressTap) { |
- mHandler.handleSuppressedTap(); |
- } else { |
- // TODO(donnd): Find a better way to determine that a navigation will be triggered |
- // by the tap, or merge with other time-consuming actions like gathering surrounding |
- // text or detecting page mutations. |
- new Handler().postDelayed(new Runnable() { |
- @Override |
- public void run() { |
- mHandler.handleValidTap(); |
- } |
- }, TAP_NAVIGATION_DETECTION_DELAY); |
- } |
- // Remember the tap state for subsequent tap evaluation. |
- mLastTapState = |
- new ContextualSearchTapState(x, y, tapTimeNanoseconds, shouldSuppressTap); |
+ mHandler.handleValidTap(); |
} else { |
// Long press; reset last tap state. |
mLastTapState = null; |
@@ -405,6 +380,45 @@ public class ContextualSearchSelectionController { |
} |
/** |
+ * DLD |
+ * Handles Tap suppression by making a callback to either the handler's handleSuppressedTap or |
+ * handleNonSuppressedTap after a possible delay. |
+ * This should be called when the context is fully build (by gathering surrounding text |
+ * if needed, etc) but before showing any UX. |
+ */ |
+ void handleShouldSuppressTap() { |
+ int x = (int) mX; |
+ int y = (int) mY; |
+ |
+ // TODO(donnd): add a policy method to get adjusted tap count. |
+ ChromePreferenceManager prefs = ChromePreferenceManager.getInstance(); |
+ int adjustedTapsSinceOpen = prefs.getContextualSearchTapCount() |
+ - prefs.getContextualSearchTapQuickAnswerCount(); |
+ TapSuppressionHeuristics tapHeuristics = |
+ new TapSuppressionHeuristics(this, mLastTapState, x, y, adjustedTapsSinceOpen); |
+ // TODO(donnd): Move to be called when the panel closes to work with states that change. |
+ tapHeuristics.logConditionState(); |
+ // Tell the manager what it needs in order to log metrics on whether the tap would have |
+ // been suppressed if each of the heuristics were satisfied. |
+ mHandler.handleMetricsForWouldSuppressTap(tapHeuristics); |
+ |
+ boolean shouldSuppressTap = tapHeuristics.shouldSuppressTap(); |
+ if (mTapTimeNanoseconds != 0) { |
+ // Remember the tap state for subsequent tap evaluation. |
+ mLastTapState = |
+ new ContextualSearchTapState(x, y, mTapTimeNanoseconds, shouldSuppressTap); |
+ } else { |
+ mLastTapState = null; |
+ } |
+ |
+ if (shouldSuppressTap) { |
+ mHandler.handleSuppressedTap(); |
+ } else { |
+ mHandler.handleNonSuppressedTap(); |
+ } |
+ } |
+ |
+ /** |
* Gets the base page ContentViewCore. |
* Deprecated, use getBaseWebContents instead. |
* @return The Base Page's {@link ContentViewCore}, or {@code null} if there is no current tab. |
@@ -470,6 +484,7 @@ public class ContextualSearchSelectionController { |
* Un-schedules all pending notifications to check if a tap was invalid. |
*/ |
private void unscheduleInvalidTapNotification() { |
+ System.out.println("ctxs unscheduleInvalidTapNotification."); // DLD? |
mRunnableHandler.removeCallbacks(mHandleInvalidTapRunnable); |
mIsWaitingForInvalidTapDetection = true; |
} |
@@ -478,7 +493,8 @@ public class ContextualSearchSelectionController { |
* Notify's the system that tap gesture has been completed. |
*/ |
private void onInvalidTapDetectionTimeout() { |
- mHandler.handleInvalidTap(); |
+ System.out.println("ctxs onInvalidTapDetectionTimeout -- invalid tap!"); // DLD? |
+ // mHandler.handleInvalidTap(); |
mIsWaitingForInvalidTapDetection = false; |
} |