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

Unified Diff: content/browser/android/ime_adapter_android.cc

Issue 2650113004: [WIP] Add support for Android SuggestionSpans when editing text (Closed)
Patch Set: Uploading the latest version from my repo so I can reference it 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/android/ime_adapter_android.h ('k') | content/browser/android/text_suggestion_host_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/android/ime_adapter_android.cc
diff --git a/content/browser/android/ime_adapter_android.cc b/content/browser/android/ime_adapter_android.cc
index 4e18e286f1d4f5db4a06d804ae4c4d226630f2e5..ace23c9b66122623779bf005fa68811a7f988e83 100644
--- a/content/browser/android/ime_adapter_android.cc
+++ b/content/browser/android/ime_adapter_android.cc
@@ -14,6 +14,7 @@
#include "base/android/scoped_java_ref.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
+#include "content/browser/android/text_suggestion_host_impl.h"
#include "content/browser/frame_host/interstitial_page_impl.h"
#include "content/browser/frame_host/render_frame_host_impl.h"
#include "content/browser/renderer_host/render_view_host_delegate.h"
@@ -26,12 +27,17 @@
#include "content/public/browser/native_web_keyboard_event.h"
#include "content/public/browser/web_contents.h"
#include "jni/ImeAdapter_jni.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
#include "third_party/WebKit/public/platform/WebInputEvent.h"
#include "third_party/WebKit/public/platform/WebTextInputType.h"
#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
+#include "third_party/WebKit/public/web/WebTextSuggestionInfo.h"
using base::android::AttachCurrentThread;
using base::android::ConvertJavaStringToUTF16;
+using base::android::ConvertUTF8ToJavaString;
+using base::android::GetClass;
+using base::android::MethodID;
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
@@ -94,6 +100,31 @@ void AppendBackgroundColorSpan(JNIEnv*,
SK_ColorTRANSPARENT, false, static_cast<unsigned>(background_color)));
}
+// Callback from Java to convert SuggestionSpan data to a
+// blink::WebCompositionUnderline instance, and append it to |underlines_ptr|.
+void AppendSuggestionSpan(JNIEnv* env,
+ const JavaParamRef<jclass>&,
+ jlong underlines_ptr,
+ jint start,
+ jint end,
+ jint underline_color,
+ jint flags,
+ const JavaParamRef<jobjectArray>& suggestions) {
+ DCHECK_GE(start, 0);
+ DCHECK_GE(end, 0);
+ std::vector<blink::WebCompositionUnderline>* underlines =
+ reinterpret_cast<std::vector<blink::WebCompositionUnderline>*>(
+ underlines_ptr);
+
+ std::vector<std::string> suggestions_vec;
+ AppendJavaStringArrayToStringVector(env, suggestions, &suggestions_vec);
+
+ underlines->push_back(blink::WebCompositionUnderline(
+ static_cast<unsigned>(start), static_cast<unsigned>(end),
+ static_cast<unsigned>(underline_color), true, SK_ColorTRANSPARENT,
+ suggestions_vec));
+}
+
// Callback from Java to convert UnderlineSpan data to a
// blink::WebCompositionUnderline instance, and append it to |underlines_ptr|.
void AppendUnderlineSpan(JNIEnv*,
@@ -116,6 +147,13 @@ ImeAdapterAndroid::ImeAdapterAndroid(JNIEnv* env,
WebContents* web_contents)
: WebContentsObserver(web_contents), rwhva_(nullptr) {
java_ime_adapter_ = JavaObjectWeakGlobalRef(env, obj);
+
+ RenderFrameHost* rfh = GetFocusedFrame();
+ if (!rfh)
+ return;
+
+ rfh->GetInterfaceRegistry()->AddInterface(
+ base::Bind(&TextSuggestionHostImpl::create, base::Unretained(this)));
}
ImeAdapterAndroid::~ImeAdapterAndroid() {
@@ -285,6 +323,12 @@ void ImeAdapterAndroid::FocusedNodeChanged(bool is_editable_node) {
if (!obj.is_null()) {
Java_ImeAdapter_focusedNodeChanged(env, obj, is_editable_node);
}
+
+ RenderFrameHost* rfh = GetFocusedFrame();
+ if (rfh) {
+ rfh->GetInterfaceRegistry()->AddInterface(
+ base::Bind(&TextSuggestionHostImpl::create, base::Unretained(this)));
+ }
}
void ImeAdapterAndroid::SetEditableSelectionOffsets(
@@ -323,6 +367,38 @@ void ImeAdapterAndroid::SetCharacterBounds(
coordinates_array_size));
}
+void ImeAdapterAndroid::ShowTextSuggestionMenu(
+ const std::vector<blink::mojom::TextSuggestionInfoPtr>& suggestion_infos) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env);
+
+ ScopedJavaLocalRef<jclass> clazz =
+ GetClass(env, "org/chromium/content/browser/input/SuggestionInfo");
+ jmethodID constructor = MethodID::Get<MethodID::TYPE_INSTANCE>(
+ env, clazz.obj(), "<init>",
+ "(JILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
+ ScopedJavaLocalRef<jobjectArray> suggestion_infos_for_java(
+ env, env->NewObjectArray(suggestion_infos.size(), clazz.obj(), nullptr));
+
+ for (size_t i = 0; i < suggestion_infos.size(); i++) {
+ const blink::mojom::TextSuggestionInfoPtr& suggestion_info_ptr =
+ suggestion_infos[i];
+
+ ScopedJavaLocalRef<jobject> suggestion_info_for_java(
+ env,
+ env->NewObject(
+ clazz.obj(), constructor, suggestion_info_ptr->suggestionID,
+ suggestion_info_ptr->suggestionIndex,
+ ConvertUTF8ToJavaString(env, suggestion_info_ptr->prefix).obj(),
+ ConvertUTF8ToJavaString(env, suggestion_info_ptr->suggestion).obj(),
+ ConvertUTF8ToJavaString(env, suggestion_info_ptr->suffix).obj()));
+ env->SetObjectArrayElement(suggestion_infos_for_java.obj(), i,
+ suggestion_info_for_java.obj());
+ }
+
+ Java_ImeAdapter_showSuggestionMenu(env, obj, suggestion_infos_for_java.obj());
+}
+
void ImeAdapterAndroid::SetComposingRegion(JNIEnv*,
const JavaParamRef<jobject>&,
int start,
@@ -382,6 +458,40 @@ void ImeAdapterAndroid::RequestCursorUpdate(
rwhi->GetRoutingID(), immediate_request, monitor_request));
}
+void ImeAdapterAndroid::ApplySuggestionReplacement(JNIEnv*,
+ const JavaParamRef<jobject>&,
+ long documentMarkerID,
+ int suggestionIndex) {
+ const blink::mojom::TextSuggestionBackendPtr& text_suggestion_backend =
+ GetTextSuggestionBackend();
+ if (!text_suggestion_backend)
+ return;
+
+ text_suggestion_backend->ApplySuggestionReplacement(documentMarkerID,
+ suggestionIndex);
+}
+
+void ImeAdapterAndroid::DeleteSuggestionHighlight(
+ JNIEnv*,
+ const JavaParamRef<jobject>&) {
+ const blink::mojom::TextSuggestionBackendPtr& text_suggestion_backend =
+ GetTextSuggestionBackend();
+ if (!text_suggestion_backend)
+ return;
+
+ text_suggestion_backend->DeleteSuggestionHighlight();
+}
+
+void ImeAdapterAndroid::SuggestionMenuClosed(JNIEnv*,
+ const JavaParamRef<jobject>&) {
+ const blink::mojom::TextSuggestionBackendPtr& text_suggestion_backend =
+ GetTextSuggestionBackend();
+ if (!text_suggestion_backend)
+ return;
+
+ text_suggestion_backend->SuggestionMenuClosed();
+}
+
RenderWidgetHostImpl* ImeAdapterAndroid::GetFocusedWidget() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
return rwhva_ ? rwhva_->GetFocusedWidget() : nullptr;
@@ -424,4 +534,17 @@ ImeAdapterAndroid::GetUnderlinesFromSpans(
return underlines;
}
+const blink::mojom::TextSuggestionBackendPtr&
+ImeAdapterAndroid::GetTextSuggestionBackend() {
+ if (!text_suggestion_backend_) {
+ RenderFrameHost* rfh = GetFocusedFrame();
+ if (rfh) {
+ rfh->GetRemoteInterfaces()->GetInterface(
+ mojo::MakeRequest(&text_suggestion_backend_));
+ }
+ }
+
+ return text_suggestion_backend_;
+}
+
} // namespace content
« no previous file with comments | « content/browser/android/ime_adapter_android.h ('k') | content/browser/android/text_suggestion_host_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698