Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(278)

Side by Side Diff: content/public/android/java/src/org/chromium/content/browser/ContextSelectionClient.java

Issue 2740103006: Implement SmartText selection. (Closed)
Patch Set: Addressed Ted's comments with some questions Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 package org.chromium.content.browser;
6
7 import android.support.annotation.IntDef;
8 import android.text.TextUtils;
9
10 import org.chromium.base.annotations.CalledByNative;
11 import org.chromium.base.annotations.JNINamespace;
12 import org.chromium.content_public.browser.WebContents;
13 import org.chromium.ui.base.WindowAndroid;
14 import org.chromium.ui.touch_selection.SelectionEventType;
15
16 import java.lang.annotation.Retention;
17 import java.lang.annotation.RetentionPolicy;
18
19 /**
20 * A class that controls the classification of the textual selection.
21 * It requests the selection together with its surrounding text from the focused frame and sends it
22 * to ContextSelectionProvider which does the classification itself.
23 */
24 @JNINamespace("content")
25 public class ContextSelectionClient implements SelectionClient {
26 @IntDef({CLASSIFY, SUGGEST_AND_CLASSIFY})
27 @Retention(RetentionPolicy.SOURCE)
28 private @interface RequestType {}
29
30 // Request to obtain the type (e.g. phone number, e-mail address) and the mo st
31 // appropriate operation for the selected text.
32 private static final int CLASSIFY = 0;
33
34 // Request to obtain the type (e.g. phone number, e-mail address), the most
35 // appropriate operation for the selected text and a better selection bounda ries.
36 private static final int SUGGEST_AND_CLASSIFY = 1;
37
38 // The maximal number of characters on the left and on the right from the cu rrent selection.
39 // Used for surrounding text request.
40 private static final int NUM_EXTRA_CHARS = 100;
41
42 private long mNativeContextSelectionClient;
43 private ContextSelectionProvider mProvider;
44 private ContextSelectionProvider.ResultCallback mCallback;
45
46 /**
47 * Creates the ContextSelectionClient. Returns null in case ContextSelection Provider
48 * does not exist in the system.
49 */
50 public static ContextSelectionClient create(ContextSelectionProvider.ResultC allback callback,
51 WindowAndroid windowAndroid, WebContents webContent) {
Ted C 2017/03/30 00:12:40 s/webContent/webContents
Tima Vaisburd 2017/03/30 01:03:13 Done.
52 ContextSelectionProvider provider =
53 ContentClassFactory.get().createContextSelectionProvider(callbac k, windowAndroid);
Ted C 2017/03/30 00:12:39 FYI, the window android associated with a WebConte
Tima Vaisburd 2017/03/30 01:03:13 Yes, thank you. I will need to do either that or j
54
55 // ContextSelectionProvider might not exist.
56 if (provider == null) return null;
57
58 return new ContextSelectionClient(provider, callback, webContent);
59 }
60
61 private ContextSelectionClient(ContextSelectionProvider provider,
62 ContextSelectionProvider.ResultCallback callback, WebContents webCon tents) {
63 mProvider = provider;
64 mCallback = callback;
65 mNativeContextSelectionClient = nativeInit(webContents);
66 }
67
68 @CalledByNative
69 private void onNativeSideDestroyed(long nativeContextSelectionClient) {
70 assert nativeContextSelectionClient == mNativeContextSelectionClient;
71 mNativeContextSelectionClient = 0;
72 mProvider.cancelAllRequests();
73 }
74
75 // SelectionClient implementation
76 @Override
77 public void onSelectionChanged(String selection) {}
78
79 @Override
80 public void onSelectionEvent(int eventType, float posXPix, float posYPix) {
81 switch (eventType) {
82 case SelectionEventType.SELECTION_HANDLES_SHOWN:
83 // This event is sent when the long press is detected which caus es
84 // selection to appear for the first time. Temporarily hiding th e
85 // handles that happens e.g. during scroll does not affect this event.
86 requestSurroundingText(SUGGEST_AND_CLASSIFY);
87 break;
88
89 case SelectionEventType.SELECTION_HANDLES_CLEARED:
90 // The ActionMode should be stopped when this event comes.
91 cancelAllRequests();
92 break;
93
94 case SelectionEventType.SELECTION_HANDLE_DRAG_STOPPED:
95 // This event is sent after a user stopped dragging one of the
96 // selection handles, i.e. stopped modifying the selection.
97 requestSurroundingText(CLASSIFY);
98 break;
99
100 default:
101 break; // ignore
102 }
103 }
104
105 @Override
106 public void showUnhandledTapUIIfNeeded(int x, int y) {}
107
108 @Override
109 public boolean sendsSelectionPopupUpdates() {
110 return true;
111 }
112
113 private void cancelAllRequests() {
114 if (mNativeContextSelectionClient != 0) {
115 nativeCancelAllRequests(mNativeContextSelectionClient);
116 }
117
118 mProvider.cancelAllRequests();
119 }
120
121 private void requestSurroundingText(@RequestType int callbackData) {
122 if (mNativeContextSelectionClient == 0) {
123 onSurroundingTextReceived(callbackData, "", 0, 0);
124 return;
125 }
126
127 nativeRequestSurroundingText(mNativeContextSelectionClient, NUM_EXTRA_CH ARS, callbackData);
128 }
129
130 @CalledByNative
131 private void onSurroundingTextReceived(
132 @RequestType int callbackData, String text, int start, int end) {
133 if (TextUtils.isEmpty(text)) {
134 mCallback.onClassified(new ContextSelectionProvider.Result());
135 return;
136 }
137
138 switch (callbackData) {
139 case SUGGEST_AND_CLASSIFY:
140 mProvider.sendSuggestAndClassifyRequest(text, start, end);
141 break;
142
143 case CLASSIFY:
144 mProvider.sendClassifyRequest(text, start, end);
145 break;
146
147 default:
148 assert false : "Unexpected callback data";
149 break;
150 }
151 }
152
153 private native long nativeInit(WebContents webContents);
154 private native void nativeRequestSurroundingText(
155 long nativeContextSelectionClient, int numExtraCharacters, int callb ackData);
156 private native void nativeCancelAllRequests(long nativeContextSelectionClien t);
157 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698