OLD | NEW |
| (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 "chrome/browser/android/enhanced_bookmarks/enhanced_bookmarks_bridge.h" | |
6 | |
7 #include "base/android/jni_array.h" | |
8 #include "base/android/jni_string.h" | |
9 #include "base/prefs/pref_service.h" | |
10 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | |
11 #include "chrome/browser/enhanced_bookmarks/chrome_bookmark_server_cluster_servi
ce.h" | |
12 #include "chrome/browser/enhanced_bookmarks/chrome_bookmark_server_cluster_servi
ce_factory.h" | |
13 #include "chrome/browser/enhanced_bookmarks/enhanced_bookmark_model_factory.h" | |
14 #include "chrome/browser/profiles/profile_android.h" | |
15 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | |
16 #include "chrome/browser/signin/signin_manager_factory.h" | |
17 #include "chrome/common/chrome_version_info.h" | |
18 #include "chrome/common/pref_names.h" | |
19 #include "components/bookmarks/browser/bookmark_model.h" | |
20 #include "components/bookmarks/browser/bookmark_utils.h" | |
21 #include "components/bookmarks/common/android/bookmark_id.h" | |
22 #include "components/bookmarks/common/android/bookmark_type.h" | |
23 #include "components/enhanced_bookmarks/enhanced_bookmark_model.h" | |
24 #include "components/signin/core/browser/signin_manager.h" | |
25 #include "content/public/browser/browser_thread.h" | |
26 #include "jni/EnhancedBookmarksBridge_jni.h" | |
27 | |
28 using base::android::AttachCurrentThread; | |
29 using bookmarks::android::JavaBookmarkIdCreateBookmarkId; | |
30 using bookmarks::android::JavaBookmarkIdGetId; | |
31 using bookmarks::android::JavaBookmarkIdGetType; | |
32 using bookmarks::BookmarkType; | |
33 using content::BrowserThread; | |
34 | |
35 namespace enhanced_bookmarks { | |
36 namespace android { | |
37 | |
38 EnhancedBookmarksBridge::EnhancedBookmarksBridge(JNIEnv* env, | |
39 jobject obj, | |
40 Profile* profile) : weak_java_ref_(env, obj) { | |
41 profile_ = profile; | |
42 enhanced_bookmark_model_ = | |
43 EnhancedBookmarkModelFactory::GetForBrowserContext(profile_); | |
44 enhanced_bookmark_model_->SetVersionSuffix(chrome::VersionInfo().OSType()); | |
45 cluster_service_ = | |
46 ChromeBookmarkServerClusterServiceFactory::GetForBrowserContext(profile_); | |
47 cluster_service_->AddObserver(this); | |
48 search_service_.reset(new BookmarkServerSearchService( | |
49 profile_->GetRequestContext(), | |
50 ProfileOAuth2TokenServiceFactory::GetForProfile(profile_), | |
51 SigninManagerFactory::GetForProfile(profile_), | |
52 EnhancedBookmarkModelFactory::GetForBrowserContext(profile_))); | |
53 search_service_->AddObserver(this); | |
54 } | |
55 | |
56 EnhancedBookmarksBridge::~EnhancedBookmarksBridge() { | |
57 cluster_service_->RemoveObserver(this); | |
58 search_service_->RemoveObserver(this); | |
59 } | |
60 | |
61 void EnhancedBookmarksBridge::Destroy(JNIEnv*, jobject) { | |
62 delete this; | |
63 } | |
64 | |
65 ScopedJavaLocalRef<jstring> EnhancedBookmarksBridge::GetBookmarkDescription( | |
66 JNIEnv* env, jobject obj, jlong id, jint type) { | |
67 DCHECK(enhanced_bookmark_model_->loaded()); | |
68 if (type != BookmarkType::BOOKMARK_TYPE_NORMAL) { | |
69 return base::android::ConvertUTF8ToJavaString(env, std::string()); | |
70 } | |
71 | |
72 const BookmarkNode* node = bookmarks::GetBookmarkNodeByID( | |
73 enhanced_bookmark_model_->bookmark_model(), static_cast<int64>(id)); | |
74 | |
75 return node ? base::android::ConvertUTF8ToJavaString( | |
76 env, enhanced_bookmark_model_->GetDescription(node)) | |
77 : ScopedJavaLocalRef<jstring>(); | |
78 } | |
79 | |
80 void EnhancedBookmarksBridge::SetBookmarkDescription(JNIEnv* env, | |
81 jobject obj, | |
82 jlong id, | |
83 jint type, | |
84 jstring description) { | |
85 DCHECK(enhanced_bookmark_model_->loaded()); | |
86 DCHECK_EQ(type, BookmarkType::BOOKMARK_TYPE_NORMAL); | |
87 | |
88 const BookmarkNode* node = bookmarks::GetBookmarkNodeByID( | |
89 enhanced_bookmark_model_->bookmark_model(), static_cast<int64>(id)); | |
90 | |
91 enhanced_bookmark_model_->SetDescription( | |
92 node, base::android::ConvertJavaStringToUTF8(env, description)); | |
93 } | |
94 | |
95 ScopedJavaLocalRef<jobjectArray> EnhancedBookmarksBridge::GetFiltersForBookmark( | |
96 JNIEnv* env, | |
97 jobject obj, | |
98 jlong id, | |
99 jint type) { | |
100 DCHECK(enhanced_bookmark_model_->loaded()); | |
101 if (type != BookmarkType::BOOKMARK_TYPE_NORMAL) { | |
102 return base::android::ToJavaArrayOfStrings(env, std::vector<std::string>()); | |
103 } | |
104 | |
105 const BookmarkNode* node = bookmarks::GetBookmarkNodeByID( | |
106 enhanced_bookmark_model_->bookmark_model(), static_cast<int64>(id)); | |
107 std::vector<std::string> filters = | |
108 cluster_service_->ClustersForBookmark(node); | |
109 return base::android::ToJavaArrayOfStrings(env, filters); | |
110 } | |
111 | |
112 void EnhancedBookmarksBridge::GetBookmarksForFilter(JNIEnv* env, | |
113 jobject obj, | |
114 jstring j_filter, | |
115 jobject j_result_obj) { | |
116 DCHECK(enhanced_bookmark_model_->loaded()); | |
117 const std::string title = | |
118 base::android::ConvertJavaStringToUTF8(env, j_filter); | |
119 const std::vector<const BookmarkNode*> bookmarks = | |
120 cluster_service_->BookmarksForClusterNamed(title); | |
121 for (const BookmarkNode* node : bookmarks) { | |
122 Java_EnhancedBookmarksBridge_addToBookmarkIdList( | |
123 env, j_result_obj, node->id(), node->type()); | |
124 } | |
125 } | |
126 | |
127 ScopedJavaLocalRef<jobjectArray> EnhancedBookmarksBridge::GetFilters( | |
128 JNIEnv* env, | |
129 jobject obj) { | |
130 DCHECK(enhanced_bookmark_model_->loaded()); | |
131 const std::vector<std::string> filters = cluster_service_->GetClusters(); | |
132 return base::android::ToJavaArrayOfStrings(env, filters); | |
133 } | |
134 | |
135 ScopedJavaLocalRef<jobject> EnhancedBookmarksBridge::AddFolder(JNIEnv* env, | |
136 jobject obj, | |
137 jobject j_parent_id_obj, | |
138 jint index, | |
139 jstring j_title) { | |
140 DCHECK(enhanced_bookmark_model_->loaded()); | |
141 long bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj); | |
142 const BookmarkNode* parent = bookmarks::GetBookmarkNodeByID( | |
143 enhanced_bookmark_model_->bookmark_model(), | |
144 static_cast<int64>(bookmark_id)); | |
145 const BookmarkNode* new_node = enhanced_bookmark_model_->AddFolder( | |
146 parent, index, base::android::ConvertJavaStringToUTF16(env, j_title)); | |
147 if (!new_node) { | |
148 NOTREACHED(); | |
149 return ScopedJavaLocalRef<jobject>(); | |
150 } | |
151 ScopedJavaLocalRef<jobject> new_java_obj = | |
152 JavaBookmarkIdCreateBookmarkId(env, new_node->id(), new_node->type()); | |
153 return new_java_obj; | |
154 } | |
155 | |
156 void EnhancedBookmarksBridge::MoveBookmark(JNIEnv* env, | |
157 jobject obj, | |
158 jobject j_bookmark_id_obj, | |
159 jobject j_parent_id_obj) { | |
160 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
161 DCHECK(enhanced_bookmark_model_->loaded()); | |
162 | |
163 long bookmark_id = JavaBookmarkIdGetId(env, j_bookmark_id_obj); | |
164 const BookmarkNode* node = bookmarks::GetBookmarkNodeByID( | |
165 enhanced_bookmark_model_->bookmark_model(), | |
166 static_cast<int64>(bookmark_id)); | |
167 if (!IsEditable(node)) { | |
168 NOTREACHED(); | |
169 return; | |
170 } | |
171 bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj); | |
172 const BookmarkNode* new_parent_node = bookmarks::GetBookmarkNodeByID( | |
173 enhanced_bookmark_model_->bookmark_model(), | |
174 static_cast<int64>(bookmark_id)); | |
175 enhanced_bookmark_model_->Move(node, new_parent_node, | |
176 new_parent_node->child_count()); | |
177 } | |
178 | |
179 ScopedJavaLocalRef<jobject> EnhancedBookmarksBridge::AddBookmark( | |
180 JNIEnv* env, | |
181 jobject obj, | |
182 jobject j_parent_id_obj, | |
183 jint index, | |
184 jstring j_title, | |
185 jstring j_url) { | |
186 DCHECK(enhanced_bookmark_model_->loaded()); | |
187 long bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj); | |
188 const BookmarkNode* parent = bookmarks::GetBookmarkNodeByID( | |
189 enhanced_bookmark_model_->bookmark_model(), | |
190 static_cast<int64>(bookmark_id)); | |
191 | |
192 const BookmarkNode* new_node = enhanced_bookmark_model_->AddURL( | |
193 parent, | |
194 index, | |
195 base::android::ConvertJavaStringToUTF16(env, j_title), | |
196 GURL(base::android::ConvertJavaStringToUTF16(env, j_url)), | |
197 base::Time::Now()); | |
198 if (!new_node) { | |
199 NOTREACHED(); | |
200 return ScopedJavaLocalRef<jobject>(); | |
201 } | |
202 ScopedJavaLocalRef<jobject> new_java_obj = | |
203 JavaBookmarkIdCreateBookmarkId(env, new_node->id(), new_node->type()); | |
204 return new_java_obj; | |
205 } | |
206 | |
207 void EnhancedBookmarksBridge::SendSearchRequest(JNIEnv* env, | |
208 jobject obj, | |
209 jstring j_query) { | |
210 search_service_->Search(base::android::ConvertJavaStringToUTF8(env, j_query)); | |
211 } | |
212 | |
213 ScopedJavaLocalRef<jobject> EnhancedBookmarksBridge::GetSearchResults( | |
214 JNIEnv* env, | |
215 jobject obj, | |
216 jstring j_query) { | |
217 DCHECK(enhanced_bookmark_model_->loaded()); | |
218 | |
219 ScopedJavaLocalRef<jobject> j_list = | |
220 Java_EnhancedBookmarksBridge_createBookmarkIdList(env); | |
221 scoped_ptr<std::vector<const BookmarkNode*>> results = | |
222 search_service_->ResultForQuery( | |
223 base::android::ConvertJavaStringToUTF8(env, j_query)); | |
224 | |
225 // If result is null, return a null java reference. | |
226 if (!results.get()) | |
227 return ScopedJavaLocalRef<jobject>(); | |
228 | |
229 for (const BookmarkNode* node : *results) { | |
230 Java_EnhancedBookmarksBridge_addToBookmarkIdList(env, j_list.obj(), | |
231 node->id(), node->type()); | |
232 } | |
233 return j_list; | |
234 } | |
235 | |
236 void EnhancedBookmarksBridge::OnChange(BookmarkServerService* service) { | |
237 DCHECK(enhanced_bookmark_model_->loaded()); | |
238 JNIEnv* env = AttachCurrentThread(); | |
239 | |
240 ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env); | |
241 if (obj.is_null()) | |
242 return; | |
243 | |
244 if (service == cluster_service_) { | |
245 Java_EnhancedBookmarksBridge_onFiltersChanged(env, obj.obj()); | |
246 } else if (service == search_service_.get()){ | |
247 Java_EnhancedBookmarksBridge_onSearchResultReturned(env, obj.obj()); | |
248 } | |
249 } | |
250 | |
251 bool EnhancedBookmarksBridge::IsEditable(const BookmarkNode* node) const { | |
252 if (!node || (node->type() != BookmarkNode::FOLDER && | |
253 node->type() != BookmarkNode::URL)) { | |
254 return false; | |
255 } | |
256 return profile_->GetPrefs()->GetBoolean( | |
257 bookmarks::prefs::kEditBookmarksEnabled); | |
258 } | |
259 | |
260 static jlong Init(JNIEnv* env, jobject obj, jobject j_profile) { | |
261 return reinterpret_cast<jlong>(new EnhancedBookmarksBridge( | |
262 env, obj, ProfileAndroid::FromProfileAndroid(j_profile))); | |
263 } | |
264 | |
265 bool RegisterEnhancedBookmarksBridge(JNIEnv* env) { | |
266 return RegisterNativesImpl(env); | |
267 } | |
268 | |
269 } // namespace android | |
270 } // namespace enhanced_bookmarks | |
OLD | NEW |