OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/android/bookmarks/bookmarks_bridge.h" | 5 #include "chrome/browser/android/bookmarks/bookmarks_bridge.h" |
6 | 6 |
7 #include "base/android/jni_string.h" | 7 #include "base/android/jni_string.h" |
8 #include "base/containers/stack_container.h" | 8 #include "base/containers/stack_container.h" |
9 #include "base/prefs/pref_service.h" | 9 #include "base/prefs/pref_service.h" |
10 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | 10 #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
11 #include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h" | 11 #include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h" |
12 #include "chrome/browser/profiles/incognito_helpers.h" | 12 #include "chrome/browser/profiles/incognito_helpers.h" |
13 #include "chrome/browser/profiles/profile.h" | 13 #include "chrome/browser/profiles/profile.h" |
14 #include "chrome/browser/profiles/profile_android.h" | 14 #include "chrome/browser/profiles/profile_android.h" |
15 #include "chrome/browser/profiles/profile_manager.h" | 15 #include "chrome/browser/profiles/profile_manager.h" |
16 #include "chrome/browser/signin/signin_manager_factory.h" | 16 #include "chrome/browser/signin/signin_manager_factory.h" |
17 #include "chrome/common/pref_names.h" | 17 #include "chrome/common/pref_names.h" |
18 #include "components/bookmarks/browser/bookmark_model.h" | 18 #include "components/bookmarks/browser/bookmark_model.h" |
19 #include "components/bookmarks/browser/bookmark_utils.h" | 19 #include "components/bookmarks/browser/bookmark_utils.h" |
| 20 #include "components/bookmarks/common/android/bookmark_type.h" |
20 #include "components/signin/core/browser/signin_manager.h" | 21 #include "components/signin/core/browser/signin_manager.h" |
21 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
22 #include "jni/BookmarksBridge_jni.h" | 23 #include "jni/BookmarksBridge_jni.h" |
23 | 24 |
24 using base::android::AttachCurrentThread; | 25 using base::android::AttachCurrentThread; |
25 using base::android::ConvertUTF8ToJavaString; | 26 using base::android::ConvertUTF8ToJavaString; |
26 using base::android::ConvertUTF16ToJavaString; | 27 using base::android::ConvertUTF16ToJavaString; |
27 using base::android::ScopedJavaLocalRef; | 28 using base::android::ScopedJavaLocalRef; |
28 using base::android::ScopedJavaGlobalRef; | 29 using base::android::ScopedJavaGlobalRef; |
| 30 using bookmarks::android::JavaBookmarkIdGetId; |
| 31 using bookmarks::android::JavaBookmarkIdGetType; |
| 32 using bookmarks::BookmarkType; |
29 using content::BrowserThread; | 33 using content::BrowserThread; |
30 | 34 |
31 // Should mirror constants in BookmarksBridge.java | 35 namespace { |
32 static const int kBookmarkTypeNormal = 0; | |
33 static const int kBookmarkTypePartner = 1; | |
34 | 36 |
35 namespace { | |
36 class BookmarkNodeCreationTimeCompareFunctor { | 37 class BookmarkNodeCreationTimeCompareFunctor { |
37 public: | 38 public: |
38 bool operator()(const BookmarkNode* lhs, const BookmarkNode* rhs) { | 39 bool operator()(const BookmarkNode* lhs, const BookmarkNode* rhs) { |
39 return lhs->date_added().ToJavaTime() > rhs->date_added().ToJavaTime(); | 40 return lhs->date_added().ToJavaTime() > rhs->date_added().ToJavaTime(); |
40 } | 41 } |
41 }; | 42 }; |
42 } // namespace | 43 } // namespace |
43 | 44 |
44 BookmarksBridge::BookmarksBridge(JNIEnv* env, | 45 BookmarksBridge::BookmarksBridge(JNIEnv* env, |
45 jobject obj, | 46 jobject obj, |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 // static | 84 // static |
84 bool BookmarksBridge::RegisterBookmarksBridge(JNIEnv* env) { | 85 bool BookmarksBridge::RegisterBookmarksBridge(JNIEnv* env) { |
85 return RegisterNativesImpl(env); | 86 return RegisterNativesImpl(env); |
86 } | 87 } |
87 | 88 |
88 static jlong Init(JNIEnv* env, jobject obj, jobject j_profile) { | 89 static jlong Init(JNIEnv* env, jobject obj, jobject j_profile) { |
89 BookmarksBridge* delegate = new BookmarksBridge(env, obj, j_profile); | 90 BookmarksBridge* delegate = new BookmarksBridge(env, obj, j_profile); |
90 return reinterpret_cast<intptr_t>(delegate); | 91 return reinterpret_cast<intptr_t>(delegate); |
91 } | 92 } |
92 | 93 |
| 94 static jlong GetNativeBookmarkModel(JNIEnv* env, |
| 95 jclass caller, |
| 96 jobject j_profile) { |
| 97 Profile *profile = ProfileAndroid::FromProfileAndroid(j_profile); |
| 98 BookmarkModel *bookmark_model_ = BookmarkModelFactory::GetForProfile(profile); |
| 99 return reinterpret_cast<jlong>(bookmark_model_); |
| 100 } |
| 101 |
93 static bool IsEditBookmarksEnabled() { | 102 static bool IsEditBookmarksEnabled() { |
94 return ProfileManager::GetLastUsedProfile()->GetPrefs()->GetBoolean( | 103 return ProfileManager::GetLastUsedProfile()->GetPrefs()->GetBoolean( |
95 prefs::kEditBookmarksEnabled); | 104 prefs::kEditBookmarksEnabled); |
96 } | 105 } |
97 | 106 |
98 static jboolean IsEditBookmarksEnabled(JNIEnv* env, jclass clazz) { | 107 static jboolean IsEditBookmarksEnabled(JNIEnv* env, jclass clazz) { |
99 return IsEditBookmarksEnabled(); | 108 return IsEditBookmarksEnabled(); |
100 } | 109 } |
101 | 110 |
102 ScopedJavaLocalRef<jobject> BookmarksBridge::GetBookmarkByID(JNIEnv* env, | 111 ScopedJavaLocalRef<jobject> BookmarksBridge::GetBookmarkByID(JNIEnv* env, |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 } | 171 } |
163 | 172 |
164 // Partner bookmark root node is under mobile node. | 173 // Partner bookmark root node is under mobile node. |
165 if (parent == bookmark_model_->mobile_node() && get_folders && | 174 if (parent == bookmark_model_->mobile_node() && get_folders && |
166 partner_bookmarks_shim_->HasPartnerBookmarks() && | 175 partner_bookmarks_shim_->HasPartnerBookmarks() && |
167 IsReachable(partner_bookmarks_shim_->GetPartnerBookmarksRoot())) { | 176 IsReachable(partner_bookmarks_shim_->GetPartnerBookmarksRoot())) { |
168 Java_BookmarksBridge_addToBookmarkIdList( | 177 Java_BookmarksBridge_addToBookmarkIdList( |
169 env, | 178 env, |
170 j_result_obj, | 179 j_result_obj, |
171 partner_bookmarks_shim_->GetPartnerBookmarksRoot()->id(), | 180 partner_bookmarks_shim_->GetPartnerBookmarksRoot()->id(), |
172 kBookmarkTypePartner); | 181 BookmarkType::PARTNER); |
173 } | 182 } |
174 } | 183 } |
175 | 184 |
176 void BookmarksBridge::GetAllBookmarkIDsOrderedByCreationDate( | 185 void BookmarksBridge::GetAllBookmarkIDsOrderedByCreationDate( |
177 JNIEnv* env, | 186 JNIEnv* env, |
178 jobject obj, | 187 jobject obj, |
179 jobject j_result_obj) { | 188 jobject j_result_obj) { |
180 DCHECK(IsLoaded()); | 189 DCHECK(IsLoaded()); |
181 std::list<const BookmarkNode*> folders; | 190 std::list<const BookmarkNode*> folders; |
182 std::vector<const BookmarkNode*> result; | 191 std::vector<const BookmarkNode*> result; |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 DCHECK(IsLoaded()); | 260 DCHECK(IsLoaded()); |
252 return GetNodeByID(id, type); | 261 return GetNodeByID(id, type); |
253 } | 262 } |
254 | 263 |
255 void BookmarksBridge::GetBookmarksForFolder(JNIEnv* env, | 264 void BookmarksBridge::GetBookmarksForFolder(JNIEnv* env, |
256 jobject obj, | 265 jobject obj, |
257 jobject j_folder_id_obj, | 266 jobject j_folder_id_obj, |
258 jobject j_callback_obj, | 267 jobject j_callback_obj, |
259 jobject j_result_obj) { | 268 jobject j_result_obj) { |
260 DCHECK(IsLoaded()); | 269 DCHECK(IsLoaded()); |
261 long folder_id = Java_BookmarkId_getId(env, j_folder_id_obj); | 270 long folder_id = JavaBookmarkIdGetId(env, j_folder_id_obj); |
262 int type = Java_BookmarkId_getType(env, j_folder_id_obj); | 271 int type = JavaBookmarkIdGetType(env, j_folder_id_obj); |
263 const BookmarkNode* folder = GetFolderWithFallback(folder_id, type); | 272 const BookmarkNode* folder = GetFolderWithFallback(folder_id, type); |
264 | 273 |
265 if (!folder->is_folder() || !IsReachable(folder)) | 274 if (!folder->is_folder() || !IsReachable(folder)) |
266 return; | 275 return; |
267 | 276 |
268 // Recreate the java bookmarkId object due to fallback. | 277 // Recreate the java bookmarkId object due to fallback. |
269 ScopedJavaLocalRef<jobject> folder_id_obj = | 278 ScopedJavaLocalRef<jobject> folder_id_obj = |
270 Java_BookmarksBridge_createBookmarkId( | 279 Java_BookmarksBridge_createBookmarkId( |
271 env, folder->id(), GetBookmarkType(folder)); | 280 env, folder->id(), GetBookmarkType(folder)); |
272 j_folder_id_obj = folder_id_obj.obj(); | 281 j_folder_id_obj = folder_id_obj.obj(); |
(...skipping 18 matching lines...) Expand all Loading... |
291 env, j_callback_obj, j_folder_id_obj, j_result_obj); | 300 env, j_callback_obj, j_folder_id_obj, j_result_obj); |
292 } | 301 } |
293 } | 302 } |
294 | 303 |
295 void BookmarksBridge::GetCurrentFolderHierarchy(JNIEnv* env, | 304 void BookmarksBridge::GetCurrentFolderHierarchy(JNIEnv* env, |
296 jobject obj, | 305 jobject obj, |
297 jobject j_folder_id_obj, | 306 jobject j_folder_id_obj, |
298 jobject j_callback_obj, | 307 jobject j_callback_obj, |
299 jobject j_result_obj) { | 308 jobject j_result_obj) { |
300 DCHECK(IsLoaded()); | 309 DCHECK(IsLoaded()); |
301 long folder_id = Java_BookmarkId_getId(env, j_folder_id_obj); | 310 long folder_id = JavaBookmarkIdGetId(env, j_folder_id_obj); |
302 int type = Java_BookmarkId_getType(env, j_folder_id_obj); | 311 int type = JavaBookmarkIdGetType(env, j_folder_id_obj); |
303 const BookmarkNode* folder = GetFolderWithFallback(folder_id, type); | 312 const BookmarkNode* folder = GetFolderWithFallback(folder_id, type); |
304 | 313 |
305 if (!folder->is_folder() || !IsReachable(folder)) | 314 if (!folder->is_folder() || !IsReachable(folder)) |
306 return; | 315 return; |
307 | 316 |
308 // Recreate the java bookmarkId object due to fallback. | 317 // Recreate the java bookmarkId object due to fallback. |
309 ScopedJavaLocalRef<jobject> folder_id_obj = | 318 ScopedJavaLocalRef<jobject> folder_id_obj = |
310 Java_BookmarksBridge_createBookmarkId( | 319 Java_BookmarksBridge_createBookmarkId( |
311 env, folder->id(), GetBookmarkType(folder)); | 320 env, folder->id(), GetBookmarkType(folder)); |
312 j_folder_id_obj = folder_id_obj.obj(); | 321 j_folder_id_obj = folder_id_obj.obj(); |
313 | 322 |
314 // Get the folder hierarchy. | 323 // Get the folder hierarchy. |
315 const BookmarkNode* node = folder; | 324 const BookmarkNode* node = folder; |
316 while (node) { | 325 while (node) { |
317 ExtractBookmarkNodeInformation(node, j_result_obj); | 326 ExtractBookmarkNodeInformation(node, j_result_obj); |
318 node = GetParentNode(node); | 327 node = GetParentNode(node); |
319 } | 328 } |
320 | 329 |
321 Java_BookmarksCallback_onBookmarksFolderHierarchyAvailable( | 330 Java_BookmarksCallback_onBookmarksFolderHierarchyAvailable( |
322 env, j_callback_obj, j_folder_id_obj, j_result_obj); | 331 env, j_callback_obj, j_folder_id_obj, j_result_obj); |
323 } | 332 } |
324 | 333 |
325 void BookmarksBridge::DeleteBookmark(JNIEnv* env, | 334 void BookmarksBridge::DeleteBookmark(JNIEnv* env, |
326 jobject obj, | 335 jobject obj, |
327 jobject j_bookmark_id_obj) { | 336 jobject j_bookmark_id_obj) { |
328 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 337 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
329 DCHECK(IsLoaded()); | 338 DCHECK(IsLoaded()); |
330 | 339 |
331 long bookmark_id = Java_BookmarkId_getId(env, j_bookmark_id_obj); | 340 long bookmark_id = JavaBookmarkIdGetId(env, j_bookmark_id_obj); |
332 int type = Java_BookmarkId_getType(env, j_bookmark_id_obj); | 341 int type = JavaBookmarkIdGetType(env, j_bookmark_id_obj); |
333 const BookmarkNode* node = GetNodeByID(bookmark_id, type); | 342 const BookmarkNode* node = GetNodeByID(bookmark_id, type); |
334 if (!IsEditable(node)) { | 343 if (!IsEditable(node)) { |
335 NOTREACHED(); | 344 NOTREACHED(); |
336 return; | 345 return; |
337 } | 346 } |
338 | 347 |
339 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) { | 348 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) { |
340 partner_bookmarks_shim_->RemoveBookmark(node); | 349 partner_bookmarks_shim_->RemoveBookmark(node); |
341 } else { | 350 } else { |
342 const BookmarkNode* parent_node = GetParentNode(node); | 351 const BookmarkNode* parent_node = GetParentNode(node); |
343 bookmark_model_->Remove(parent_node, parent_node->GetIndexOf(node)); | 352 bookmark_model_->Remove(parent_node, parent_node->GetIndexOf(node)); |
344 } | 353 } |
345 } | 354 } |
346 | 355 |
347 void BookmarksBridge::MoveBookmark(JNIEnv* env, | 356 void BookmarksBridge::MoveBookmark(JNIEnv* env, |
348 jobject obj, | 357 jobject obj, |
349 jobject j_bookmark_id_obj, | 358 jobject j_bookmark_id_obj, |
350 jobject j_parent_id_obj, | 359 jobject j_parent_id_obj, |
351 jint index) { | 360 jint index) { |
352 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 361 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
353 DCHECK(IsLoaded()); | 362 DCHECK(IsLoaded()); |
354 | 363 |
355 long bookmark_id = Java_BookmarkId_getId(env, j_bookmark_id_obj); | 364 long bookmark_id = JavaBookmarkIdGetId(env, j_bookmark_id_obj); |
356 int type = Java_BookmarkId_getType(env, j_bookmark_id_obj); | 365 int type = JavaBookmarkIdGetType(env, j_bookmark_id_obj); |
357 const BookmarkNode* node = GetNodeByID(bookmark_id, type); | 366 const BookmarkNode* node = GetNodeByID(bookmark_id, type); |
358 if (!IsEditable(node)) { | 367 if (!IsEditable(node)) { |
359 NOTREACHED(); | 368 NOTREACHED(); |
360 return; | 369 return; |
361 } | 370 } |
362 bookmark_id = Java_BookmarkId_getId(env, j_parent_id_obj); | 371 bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj); |
363 type = Java_BookmarkId_getType(env, j_parent_id_obj); | 372 type = JavaBookmarkIdGetType(env, j_parent_id_obj); |
364 const BookmarkNode* new_parent_node = GetNodeByID(bookmark_id, type); | 373 const BookmarkNode* new_parent_node = GetNodeByID(bookmark_id, type); |
365 bookmark_model_->Move(node, new_parent_node, index); | 374 bookmark_model_->Move(node, new_parent_node, index); |
366 } | 375 } |
367 | 376 |
368 ScopedJavaLocalRef<jobject> BookmarksBridge::CreateJavaBookmark( | 377 ScopedJavaLocalRef<jobject> BookmarksBridge::CreateJavaBookmark( |
369 const BookmarkNode* node) { | 378 const BookmarkNode* node) { |
370 JNIEnv* env = AttachCurrentThread(); | 379 JNIEnv* env = AttachCurrentThread(); |
371 | 380 |
372 const BookmarkNode* parent = GetParentNode(node); | 381 const BookmarkNode* parent = GetParentNode(node); |
373 int64 parent_id = parent ? parent->id() : -1; | 382 int64 parent_id = parent ? parent->id() : -1; |
(...skipping 19 matching lines...) Expand all Loading... |
393 jobject j_result_obj) { | 402 jobject j_result_obj) { |
394 JNIEnv* env = AttachCurrentThread(); | 403 JNIEnv* env = AttachCurrentThread(); |
395 if (!IsReachable(node)) | 404 if (!IsReachable(node)) |
396 return; | 405 return; |
397 Java_BookmarksBridge_addToList( | 406 Java_BookmarksBridge_addToList( |
398 env, j_result_obj, CreateJavaBookmark(node).obj()); | 407 env, j_result_obj, CreateJavaBookmark(node).obj()); |
399 } | 408 } |
400 | 409 |
401 const BookmarkNode* BookmarksBridge::GetNodeByID(long node_id, int type) { | 410 const BookmarkNode* BookmarksBridge::GetNodeByID(long node_id, int type) { |
402 const BookmarkNode* node; | 411 const BookmarkNode* node; |
403 if (type == kBookmarkTypePartner) { | 412 if (type == BookmarkType::PARTNER) { |
404 node = partner_bookmarks_shim_->GetNodeByID( | 413 node = partner_bookmarks_shim_->GetNodeByID( |
405 static_cast<int64>(node_id)); | 414 static_cast<int64>(node_id)); |
406 } else { | 415 } else { |
407 node = bookmarks::GetBookmarkNodeByID(bookmark_model_, | 416 node = bookmarks::GetBookmarkNodeByID(bookmark_model_, |
408 static_cast<int64>(node_id)); | 417 static_cast<int64>(node_id)); |
409 } | 418 } |
410 return node; | 419 return node; |
411 } | 420 } |
412 | 421 |
413 const BookmarkNode* BookmarksBridge::GetFolderWithFallback(long folder_id, | 422 const BookmarkNode* BookmarksBridge::GetFolderWithFallback(long folder_id, |
(...skipping 29 matching lines...) Expand all Loading... |
443 DCHECK(IsLoaded()); | 452 DCHECK(IsLoaded()); |
444 if (node == partner_bookmarks_shim_->GetPartnerBookmarksRoot()) { | 453 if (node == partner_bookmarks_shim_->GetPartnerBookmarksRoot()) { |
445 return bookmark_model_->mobile_node(); | 454 return bookmark_model_->mobile_node(); |
446 } else { | 455 } else { |
447 return node->parent(); | 456 return node->parent(); |
448 } | 457 } |
449 } | 458 } |
450 | 459 |
451 int BookmarksBridge::GetBookmarkType(const BookmarkNode* node) { | 460 int BookmarksBridge::GetBookmarkType(const BookmarkNode* node) { |
452 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) | 461 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) |
453 return kBookmarkTypePartner; | 462 return BookmarkType::PARTNER; |
454 else | 463 else |
455 return kBookmarkTypeNormal; | 464 return BookmarkType::NORMAL; |
456 } | 465 } |
457 | 466 |
458 base::string16 BookmarksBridge::GetTitle(const BookmarkNode* node) const { | 467 base::string16 BookmarksBridge::GetTitle(const BookmarkNode* node) const { |
459 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) | 468 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) |
460 return partner_bookmarks_shim_->GetTitle(node); | 469 return partner_bookmarks_shim_->GetTitle(node); |
461 return node->GetTitle(); | 470 return node->GetTitle(); |
462 } | 471 } |
463 | 472 |
464 bool BookmarksBridge::IsReachable(const BookmarkNode* node) const { | 473 bool BookmarksBridge::IsReachable(const BookmarkNode* node) const { |
465 if (!partner_bookmarks_shim_->IsPartnerBookmark(node)) | 474 if (!partner_bookmarks_shim_->IsPartnerBookmark(node)) |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 BookmarkModelChanged(); | 652 BookmarkModelChanged(); |
644 } | 653 } |
645 | 654 |
646 void BookmarksBridge::PartnerShimLoaded(PartnerBookmarksShim* shim) { | 655 void BookmarksBridge::PartnerShimLoaded(PartnerBookmarksShim* shim) { |
647 NotifyIfDoneLoading(); | 656 NotifyIfDoneLoading(); |
648 } | 657 } |
649 | 658 |
650 void BookmarksBridge::ShimBeingDeleted(PartnerBookmarksShim* shim) { | 659 void BookmarksBridge::ShimBeingDeleted(PartnerBookmarksShim* shim) { |
651 partner_bookmarks_shim_ = NULL; | 660 partner_bookmarks_shim_ = NULL; |
652 } | 661 } |
OLD | NEW |