| 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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 } | 163 } |
| 163 | 164 |
| 164 // Partner bookmark root node is under mobile node. | 165 // Partner bookmark root node is under mobile node. |
| 165 if (parent == bookmark_model_->mobile_node() && get_folders && | 166 if (parent == bookmark_model_->mobile_node() && get_folders && |
| 166 partner_bookmarks_shim_->HasPartnerBookmarks() && | 167 partner_bookmarks_shim_->HasPartnerBookmarks() && |
| 167 IsReachable(partner_bookmarks_shim_->GetPartnerBookmarksRoot())) { | 168 IsReachable(partner_bookmarks_shim_->GetPartnerBookmarksRoot())) { |
| 168 Java_BookmarksBridge_addToBookmarkIdList( | 169 Java_BookmarksBridge_addToBookmarkIdList( |
| 169 env, | 170 env, |
| 170 j_result_obj, | 171 j_result_obj, |
| 171 partner_bookmarks_shim_->GetPartnerBookmarksRoot()->id(), | 172 partner_bookmarks_shim_->GetPartnerBookmarksRoot()->id(), |
| 172 kBookmarkTypePartner); | 173 BookmarkType::PARTNER); |
| 173 } | 174 } |
| 174 } | 175 } |
| 175 | 176 |
| 176 void BookmarksBridge::GetAllBookmarkIDsOrderedByCreationDate( | 177 void BookmarksBridge::GetAllBookmarkIDsOrderedByCreationDate( |
| 177 JNIEnv* env, | 178 JNIEnv* env, |
| 178 jobject obj, | 179 jobject obj, |
| 179 jobject j_result_obj) { | 180 jobject j_result_obj) { |
| 180 DCHECK(IsLoaded()); | 181 DCHECK(IsLoaded()); |
| 181 std::list<const BookmarkNode*> folders; | 182 std::list<const BookmarkNode*> folders; |
| 182 std::vector<const BookmarkNode*> result; | 183 std::vector<const BookmarkNode*> result; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 DCHECK(IsLoaded()); | 252 DCHECK(IsLoaded()); |
| 252 return GetNodeByID(id, type); | 253 return GetNodeByID(id, type); |
| 253 } | 254 } |
| 254 | 255 |
| 255 void BookmarksBridge::GetBookmarksForFolder(JNIEnv* env, | 256 void BookmarksBridge::GetBookmarksForFolder(JNIEnv* env, |
| 256 jobject obj, | 257 jobject obj, |
| 257 jobject j_folder_id_obj, | 258 jobject j_folder_id_obj, |
| 258 jobject j_callback_obj, | 259 jobject j_callback_obj, |
| 259 jobject j_result_obj) { | 260 jobject j_result_obj) { |
| 260 DCHECK(IsLoaded()); | 261 DCHECK(IsLoaded()); |
| 261 long folder_id = Java_BookmarkId_getId(env, j_folder_id_obj); | 262 long folder_id = JavaBookmarkIdGetId(env, j_folder_id_obj); |
| 262 int type = Java_BookmarkId_getType(env, j_folder_id_obj); | 263 int type = JavaBookmarkIdGetType(env, j_folder_id_obj); |
| 263 const BookmarkNode* folder = GetFolderWithFallback(folder_id, type); | 264 const BookmarkNode* folder = GetFolderWithFallback(folder_id, type); |
| 264 | 265 |
| 265 if (!folder->is_folder() || !IsReachable(folder)) | 266 if (!folder->is_folder() || !IsReachable(folder)) |
| 266 return; | 267 return; |
| 267 | 268 |
| 268 // Recreate the java bookmarkId object due to fallback. | 269 // Recreate the java bookmarkId object due to fallback. |
| 269 ScopedJavaLocalRef<jobject> folder_id_obj = | 270 ScopedJavaLocalRef<jobject> folder_id_obj = |
| 270 Java_BookmarksBridge_createBookmarkId( | 271 Java_BookmarksBridge_createBookmarkId( |
| 271 env, folder->id(), GetBookmarkType(folder)); | 272 env, folder->id(), GetBookmarkType(folder)); |
| 272 j_folder_id_obj = folder_id_obj.obj(); | 273 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); | 292 env, j_callback_obj, j_folder_id_obj, j_result_obj); |
| 292 } | 293 } |
| 293 } | 294 } |
| 294 | 295 |
| 295 void BookmarksBridge::GetCurrentFolderHierarchy(JNIEnv* env, | 296 void BookmarksBridge::GetCurrentFolderHierarchy(JNIEnv* env, |
| 296 jobject obj, | 297 jobject obj, |
| 297 jobject j_folder_id_obj, | 298 jobject j_folder_id_obj, |
| 298 jobject j_callback_obj, | 299 jobject j_callback_obj, |
| 299 jobject j_result_obj) { | 300 jobject j_result_obj) { |
| 300 DCHECK(IsLoaded()); | 301 DCHECK(IsLoaded()); |
| 301 long folder_id = Java_BookmarkId_getId(env, j_folder_id_obj); | 302 long folder_id = JavaBookmarkIdGetId(env, j_folder_id_obj); |
| 302 int type = Java_BookmarkId_getType(env, j_folder_id_obj); | 303 int type = JavaBookmarkIdGetType(env, j_folder_id_obj); |
| 303 const BookmarkNode* folder = GetFolderWithFallback(folder_id, type); | 304 const BookmarkNode* folder = GetFolderWithFallback(folder_id, type); |
| 304 | 305 |
| 305 if (!folder->is_folder() || !IsReachable(folder)) | 306 if (!folder->is_folder() || !IsReachable(folder)) |
| 306 return; | 307 return; |
| 307 | 308 |
| 308 // Recreate the java bookmarkId object due to fallback. | 309 // Recreate the java bookmarkId object due to fallback. |
| 309 ScopedJavaLocalRef<jobject> folder_id_obj = | 310 ScopedJavaLocalRef<jobject> folder_id_obj = |
| 310 Java_BookmarksBridge_createBookmarkId( | 311 Java_BookmarksBridge_createBookmarkId( |
| 311 env, folder->id(), GetBookmarkType(folder)); | 312 env, folder->id(), GetBookmarkType(folder)); |
| 312 j_folder_id_obj = folder_id_obj.obj(); | 313 j_folder_id_obj = folder_id_obj.obj(); |
| 313 | 314 |
| 314 // Get the folder hierarchy. | 315 // Get the folder hierarchy. |
| 315 const BookmarkNode* node = folder; | 316 const BookmarkNode* node = folder; |
| 316 while (node) { | 317 while (node) { |
| 317 ExtractBookmarkNodeInformation(node, j_result_obj); | 318 ExtractBookmarkNodeInformation(node, j_result_obj); |
| 318 node = GetParentNode(node); | 319 node = GetParentNode(node); |
| 319 } | 320 } |
| 320 | 321 |
| 321 Java_BookmarksCallback_onBookmarksFolderHierarchyAvailable( | 322 Java_BookmarksCallback_onBookmarksFolderHierarchyAvailable( |
| 322 env, j_callback_obj, j_folder_id_obj, j_result_obj); | 323 env, j_callback_obj, j_folder_id_obj, j_result_obj); |
| 323 } | 324 } |
| 324 | 325 |
| 325 void BookmarksBridge::DeleteBookmark(JNIEnv* env, | 326 void BookmarksBridge::DeleteBookmark(JNIEnv* env, |
| 326 jobject obj, | 327 jobject obj, |
| 327 jobject j_bookmark_id_obj) { | 328 jobject j_bookmark_id_obj) { |
| 328 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 329 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 329 DCHECK(IsLoaded()); | 330 DCHECK(IsLoaded()); |
| 330 | 331 |
| 331 long bookmark_id = Java_BookmarkId_getId(env, j_bookmark_id_obj); | 332 long bookmark_id = JavaBookmarkIdGetId(env, j_bookmark_id_obj); |
| 332 int type = Java_BookmarkId_getType(env, j_bookmark_id_obj); | 333 int type = JavaBookmarkIdGetType(env, j_bookmark_id_obj); |
| 333 const BookmarkNode* node = GetNodeByID(bookmark_id, type); | 334 const BookmarkNode* node = GetNodeByID(bookmark_id, type); |
| 334 if (!IsEditable(node)) { | 335 if (!IsEditable(node)) { |
| 335 NOTREACHED(); | 336 NOTREACHED(); |
| 336 return; | 337 return; |
| 337 } | 338 } |
| 338 | 339 |
| 339 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) { | 340 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) { |
| 340 partner_bookmarks_shim_->RemoveBookmark(node); | 341 partner_bookmarks_shim_->RemoveBookmark(node); |
| 341 } else { | 342 } else { |
| 342 const BookmarkNode* parent_node = GetParentNode(node); | 343 const BookmarkNode* parent_node = GetParentNode(node); |
| 343 bookmark_model_->Remove(parent_node, parent_node->GetIndexOf(node)); | 344 bookmark_model_->Remove(parent_node, parent_node->GetIndexOf(node)); |
| 344 } | 345 } |
| 345 } | 346 } |
| 346 | 347 |
| 347 void BookmarksBridge::MoveBookmark(JNIEnv* env, | 348 void BookmarksBridge::MoveBookmark(JNIEnv* env, |
| 348 jobject obj, | 349 jobject obj, |
| 349 jobject j_bookmark_id_obj, | 350 jobject j_bookmark_id_obj, |
| 350 jobject j_parent_id_obj, | 351 jobject j_parent_id_obj, |
| 351 jint index) { | 352 jint index) { |
| 352 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 353 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 353 DCHECK(IsLoaded()); | 354 DCHECK(IsLoaded()); |
| 354 | 355 |
| 355 long bookmark_id = Java_BookmarkId_getId(env, j_bookmark_id_obj); | 356 long bookmark_id = JavaBookmarkIdGetId(env, j_bookmark_id_obj); |
| 356 int type = Java_BookmarkId_getType(env, j_bookmark_id_obj); | 357 int type = JavaBookmarkIdGetType(env, j_bookmark_id_obj); |
| 357 const BookmarkNode* node = GetNodeByID(bookmark_id, type); | 358 const BookmarkNode* node = GetNodeByID(bookmark_id, type); |
| 358 if (!IsEditable(node)) { | 359 if (!IsEditable(node)) { |
| 359 NOTREACHED(); | 360 NOTREACHED(); |
| 360 return; | 361 return; |
| 361 } | 362 } |
| 362 bookmark_id = Java_BookmarkId_getId(env, j_parent_id_obj); | 363 bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj); |
| 363 type = Java_BookmarkId_getType(env, j_parent_id_obj); | 364 type = JavaBookmarkIdGetType(env, j_parent_id_obj); |
| 364 const BookmarkNode* new_parent_node = GetNodeByID(bookmark_id, type); | 365 const BookmarkNode* new_parent_node = GetNodeByID(bookmark_id, type); |
| 365 bookmark_model_->Move(node, new_parent_node, index); | 366 bookmark_model_->Move(node, new_parent_node, index); |
| 366 } | 367 } |
| 367 | 368 |
| 369 jlong BookmarksBridge::GetNativeBookmarkModel(JNIEnv*env, jobject obj) { |
| 370 return reinterpret_cast<jlong>(bookmark_model_); |
| 371 } |
| 372 |
| 368 ScopedJavaLocalRef<jobject> BookmarksBridge::CreateJavaBookmark( | 373 ScopedJavaLocalRef<jobject> BookmarksBridge::CreateJavaBookmark( |
| 369 const BookmarkNode* node) { | 374 const BookmarkNode* node) { |
| 370 JNIEnv* env = AttachCurrentThread(); | 375 JNIEnv* env = AttachCurrentThread(); |
| 371 | 376 |
| 372 const BookmarkNode* parent = GetParentNode(node); | 377 const BookmarkNode* parent = GetParentNode(node); |
| 373 int64 parent_id = parent ? parent->id() : -1; | 378 int64 parent_id = parent ? parent->id() : -1; |
| 374 | 379 |
| 375 std::string url; | 380 std::string url; |
| 376 if (node->is_url()) | 381 if (node->is_url()) |
| 377 url = node->url().spec(); | 382 url = node->url().spec(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 393 jobject j_result_obj) { | 398 jobject j_result_obj) { |
| 394 JNIEnv* env = AttachCurrentThread(); | 399 JNIEnv* env = AttachCurrentThread(); |
| 395 if (!IsReachable(node)) | 400 if (!IsReachable(node)) |
| 396 return; | 401 return; |
| 397 Java_BookmarksBridge_addToList( | 402 Java_BookmarksBridge_addToList( |
| 398 env, j_result_obj, CreateJavaBookmark(node).obj()); | 403 env, j_result_obj, CreateJavaBookmark(node).obj()); |
| 399 } | 404 } |
| 400 | 405 |
| 401 const BookmarkNode* BookmarksBridge::GetNodeByID(long node_id, int type) { | 406 const BookmarkNode* BookmarksBridge::GetNodeByID(long node_id, int type) { |
| 402 const BookmarkNode* node; | 407 const BookmarkNode* node; |
| 403 if (type == kBookmarkTypePartner) { | 408 if (type == BookmarkType::PARTNER) { |
| 404 node = partner_bookmarks_shim_->GetNodeByID( | 409 node = partner_bookmarks_shim_->GetNodeByID( |
| 405 static_cast<int64>(node_id)); | 410 static_cast<int64>(node_id)); |
| 406 } else { | 411 } else { |
| 407 node = bookmarks::GetBookmarkNodeByID(bookmark_model_, | 412 node = bookmarks::GetBookmarkNodeByID(bookmark_model_, |
| 408 static_cast<int64>(node_id)); | 413 static_cast<int64>(node_id)); |
| 409 } | 414 } |
| 410 return node; | 415 return node; |
| 411 } | 416 } |
| 412 | 417 |
| 413 const BookmarkNode* BookmarksBridge::GetFolderWithFallback(long folder_id, | 418 const BookmarkNode* BookmarksBridge::GetFolderWithFallback(long folder_id, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 443 DCHECK(IsLoaded()); | 448 DCHECK(IsLoaded()); |
| 444 if (node == partner_bookmarks_shim_->GetPartnerBookmarksRoot()) { | 449 if (node == partner_bookmarks_shim_->GetPartnerBookmarksRoot()) { |
| 445 return bookmark_model_->mobile_node(); | 450 return bookmark_model_->mobile_node(); |
| 446 } else { | 451 } else { |
| 447 return node->parent(); | 452 return node->parent(); |
| 448 } | 453 } |
| 449 } | 454 } |
| 450 | 455 |
| 451 int BookmarksBridge::GetBookmarkType(const BookmarkNode* node) { | 456 int BookmarksBridge::GetBookmarkType(const BookmarkNode* node) { |
| 452 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) | 457 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) |
| 453 return kBookmarkTypePartner; | 458 return BookmarkType::PARTNER; |
| 454 else | 459 else |
| 455 return kBookmarkTypeNormal; | 460 return BookmarkType::NORMAL; |
| 456 } | 461 } |
| 457 | 462 |
| 458 base::string16 BookmarksBridge::GetTitle(const BookmarkNode* node) const { | 463 base::string16 BookmarksBridge::GetTitle(const BookmarkNode* node) const { |
| 459 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) | 464 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) |
| 460 return partner_bookmarks_shim_->GetTitle(node); | 465 return partner_bookmarks_shim_->GetTitle(node); |
| 461 return node->GetTitle(); | 466 return node->GetTitle(); |
| 462 } | 467 } |
| 463 | 468 |
| 464 bool BookmarksBridge::IsReachable(const BookmarkNode* node) const { | 469 bool BookmarksBridge::IsReachable(const BookmarkNode* node) const { |
| 465 if (!partner_bookmarks_shim_->IsPartnerBookmark(node)) | 470 if (!partner_bookmarks_shim_->IsPartnerBookmark(node)) |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 BookmarkModelChanged(); | 648 BookmarkModelChanged(); |
| 644 } | 649 } |
| 645 | 650 |
| 646 void BookmarksBridge::PartnerShimLoaded(PartnerBookmarksShim* shim) { | 651 void BookmarksBridge::PartnerShimLoaded(PartnerBookmarksShim* shim) { |
| 647 NotifyIfDoneLoading(); | 652 NotifyIfDoneLoading(); |
| 648 } | 653 } |
| 649 | 654 |
| 650 void BookmarksBridge::ShimBeingDeleted(PartnerBookmarksShim* shim) { | 655 void BookmarksBridge::ShimBeingDeleted(PartnerBookmarksShim* shim) { |
| 651 partner_bookmarks_shim_ = NULL; | 656 partner_bookmarks_shim_ = NULL; |
| 652 } | 657 } |
| OLD | NEW |