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

Side by Side Diff: ui/base/ime/android/cursor_anchor_info_builder.cc

Issue 643193003: Support InputMethodManager#updateCursorAnchorInfo for Android 5.0 (C++ version) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Send ImeCompositionRangeChanged only when necessary Created 5 years, 10 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 2014 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 #include "ui/base/ime/android/cursor_anchor_info_builder.h"
6
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/android/jni_weak_ref.h"
10 #include "base/android/scoped_java_ref.h"
11 #include "base/containers/mru_cache.h"
12 #include "jni/CursorAnchorInfoBuilder_jni.h"
13
14 namespace ui {
15 namespace {
16
17 using base::android::AttachCurrentThread;
18
19 const size_t kComposingTextCacheSize = 2;
20
21 class CursorAnchorInfoBuilderImpl final
22 : public CursorAnchorInfoBuilder {
23 public:
24 CursorAnchorInfoBuilderImpl();
25 ~CursorAnchorInfoBuilderImpl() override;
26
27 void AddCharacterBounds(int index,
28 const gfx::RectF& rect,
29 uint32 flags) override;
30 base::android::ScopedJavaLocalRef<jobject> Build() override;
31 void Reset() override;
32 void SetComposingText(int composingTextStart,
33 base::StringPiece16 composingText) override;
34 void SetInsertionMarkerLocation(float horizontalPosition,
35 float lineTop,
36 float lineBaseline,
37 float lineBottom,
38 uint32 flags) override;
39 void SetScaleAndTranslate(float scale,
40 const gfx::Vector2dF& translate) override;
41 void SetSelectionRange(const gfx::Range& range) override;
42
43 static bool Register(JNIEnv* env);
44
45 private:
46 base::android::ScopedJavaGlobalRef<jobject> builder_;
47 base::MRUCache<base::string16, base::android::ScopedJavaGlobalRef<jstring>>
48 composing_text_cache_;
49
50 DISALLOW_COPY_AND_ASSIGN(CursorAnchorInfoBuilderImpl);
51 };
52
53 CursorAnchorInfoBuilderImpl::CursorAnchorInfoBuilderImpl()
54 : builder_(Java_CursorAnchorInfoBuilder_create(AttachCurrentThread())),
55 composing_text_cache_(kComposingTextCacheSize) {
56 }
57
58 CursorAnchorInfoBuilderImpl::~CursorAnchorInfoBuilderImpl() {
59 }
60
61 void CursorAnchorInfoBuilderImpl::AddCharacterBounds(
62 int index, const gfx::RectF& rect, uint32 flags) {
63 JNIEnv* env = AttachCurrentThread();
64 Java_CursorAnchorInfoBuilder_addCharacterBounds(
65 env,
66 builder_.obj(),
67 index,
68 rect.x(),
69 rect.y(),
70 rect.right(),
71 rect.bottom(),
72 flags);
73 }
74
75 base::android::ScopedJavaLocalRef<jobject>
76 CursorAnchorInfoBuilderImpl::Build() {
77 JNIEnv* env = AttachCurrentThread();
78 return Java_CursorAnchorInfoBuilder_build(env, builder_.obj());
79 }
80
81 void CursorAnchorInfoBuilderImpl::Reset() {
82 JNIEnv* env = AttachCurrentThread();
83 Java_CursorAnchorInfoBuilder_reset(env, builder_.obj());
84 }
85
86 void CursorAnchorInfoBuilderImpl::SetComposingText(
87 int composing_text_start, base::StringPiece16 composing_text) {
88 JNIEnv* env = AttachCurrentThread();
89 const auto& key = composing_text.as_string();
90 auto it = composing_text_cache_.Get(key);
91 if (it != composing_text_cache_.end()) {
92 Java_CursorAnchorInfoBuilder_setComposingText(
93 env, builder_.obj(), composing_text_start, it->second.obj());
94 } else {
95 auto jstr = base::android::ConvertUTF16ToJavaString(env, composing_text);
96 Java_CursorAnchorInfoBuilder_setComposingText(
97 env, builder_.obj(), composing_text_start, jstr.obj());
98 composing_text_cache_.Put(
99 key, base::android::ScopedJavaGlobalRef<jstring>(jstr));
100 }
101 }
102
103 void CursorAnchorInfoBuilderImpl::SetInsertionMarkerLocation(
104 float horizontalPosition,
105 float lineTop,
106 float lineBaseline,
107 float lineBottom,
108 uint32 flags) {
109 JNIEnv* env = AttachCurrentThread();
110 Java_CursorAnchorInfoBuilder_setInsertionMarkerLocation(
111 env,
112 builder_.obj(),
113 horizontalPosition,
114 lineTop,
115 lineBaseline,
116 lineBottom,
117 static_cast<jint>(flags));
118 }
119
120 void CursorAnchorInfoBuilderImpl::SetScaleAndTranslate(
121 float scale,
122 const gfx::Vector2dF& translate) {
123 JNIEnv* env = AttachCurrentThread();
124 Java_CursorAnchorInfoBuilder_setScaleAndTranslate(
125 env,
126 builder_.obj(),
127 scale,
128 translate.x(),
129 translate.y());
130 }
131
132 void CursorAnchorInfoBuilderImpl::SetSelectionRange(const gfx::Range& range) {
133 JNIEnv* env = AttachCurrentThread();
134 Java_CursorAnchorInfoBuilder_setSelectionRange(
135 env, builder_.obj(), range.start(), range.end());
136 }
137
138 } // namespace
139
140 CursorAnchorInfoBuilder::CursorAnchorInfoBuilder() {
141 }
142
143 CursorAnchorInfoBuilder::~CursorAnchorInfoBuilder() {
144 }
145
146 // static
147 scoped_ptr<CursorAnchorInfoBuilder>
148 CursorAnchorInfoBuilder::Create() {
149 return scoped_ptr<CursorAnchorInfoBuilder>(new CursorAnchorInfoBuilderImpl);
150 }
151
152 // static
153 bool CursorAnchorInfoBuilder::Register(JNIEnv* env) {
154 return RegisterNativesImpl(env);
155 }
156
157 } // namespace ui
OLDNEW
« no previous file with comments | « ui/base/ime/android/cursor_anchor_info_builder.h ('k') | ui/base/ime/android/cursor_anchor_info_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698