| 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 |