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