| 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_array.h" | 7 #include "base/android/jni_array.h" |
| 8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
| 9 #include "base/containers/stack_container.h" | 9 #include "base/containers/stack_container.h" |
| 10 #include "base/i18n/string_compare.h" | 10 #include "base/i18n/string_compare.h" |
| 11 #include "base/prefs/pref_service.h" | 11 #include "base/prefs/pref_service.h" |
| 12 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | 12 #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
| 13 #include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h" | |
| 14 #include "chrome/browser/bookmarks/enhanced_bookmarks_features.h" | 13 #include "chrome/browser/bookmarks/enhanced_bookmarks_features.h" |
| 14 #include "chrome/browser/bookmarks/managed_bookmark_service_factory.h" |
| 15 #include "chrome/browser/profiles/incognito_helpers.h" | 15 #include "chrome/browser/profiles/incognito_helpers.h" |
| 16 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
| 17 #include "chrome/browser/profiles/profile_android.h" | 17 #include "chrome/browser/profiles/profile_android.h" |
| 18 #include "chrome/browser/signin/signin_manager_factory.h" | 18 #include "chrome/browser/signin/signin_manager_factory.h" |
| 19 #include "chrome/browser/undo/bookmark_undo_service_factory.h" | 19 #include "chrome/browser/undo/bookmark_undo_service_factory.h" |
| 20 #include "chrome/common/pref_names.h" | 20 #include "chrome/common/pref_names.h" |
| 21 #include "components/bookmarks/browser/bookmark_match.h" | 21 #include "components/bookmarks/browser/bookmark_match.h" |
| 22 #include "components/bookmarks/browser/bookmark_model.h" | 22 #include "components/bookmarks/browser/bookmark_model.h" |
| 23 #include "components/bookmarks/browser/bookmark_utils.h" | 23 #include "components/bookmarks/browser/bookmark_utils.h" |
| 24 #include "components/bookmarks/browser/scoped_group_bookmark_actions.h" | 24 #include "components/bookmarks/browser/scoped_group_bookmark_actions.h" |
| 25 #include "components/bookmarks/common/android/bookmark_type.h" | 25 #include "components/bookmarks/common/android/bookmark_type.h" |
| 26 #include "components/bookmarks/managed/managed_bookmark_service.h" |
| 26 #include "components/query_parser/query_parser.h" | 27 #include "components/query_parser/query_parser.h" |
| 27 #include "components/signin/core/browser/signin_manager.h" | 28 #include "components/signin/core/browser/signin_manager.h" |
| 28 #include "components/undo/bookmark_undo_service.h" | 29 #include "components/undo/bookmark_undo_service.h" |
| 29 #include "components/undo/undo_manager.h" | 30 #include "components/undo/undo_manager.h" |
| 30 #include "content/public/browser/browser_thread.h" | 31 #include "content/public/browser/browser_thread.h" |
| 31 #include "grit/components_strings.h" | 32 #include "grit/components_strings.h" |
| 32 #include "jni/BookmarksBridge_jni.h" | 33 #include "jni/BookmarksBridge_jni.h" |
| 33 #include "ui/base/l10n/l10n_util.h" | 34 #include "ui/base/l10n/l10n_util.h" |
| 34 | 35 |
| 35 using base::android::AttachCurrentThread; | 36 using base::android::AttachCurrentThread; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 scoped_ptr<icu::Collator> collator_; | 84 scoped_ptr<icu::Collator> collator_; |
| 84 collator_.reset(icu::Collator::createInstance(error)); | 85 collator_.reset(icu::Collator::createInstance(error)); |
| 85 if (U_FAILURE(error)) | 86 if (U_FAILURE(error)) |
| 86 collator_.reset(NULL); | 87 collator_.reset(NULL); |
| 87 | 88 |
| 88 return collator_.Pass(); | 89 return collator_.Pass(); |
| 89 } | 90 } |
| 90 | 91 |
| 91 } // namespace | 92 } // namespace |
| 92 | 93 |
| 93 BookmarksBridge::BookmarksBridge(JNIEnv* env, | 94 BookmarksBridge::BookmarksBridge(JNIEnv* env, jobject obj, jobject j_profile) |
| 94 jobject obj, | |
| 95 jobject j_profile) | |
| 96 : weak_java_ref_(env, obj), | 95 : weak_java_ref_(env, obj), |
| 97 bookmark_model_(NULL), | 96 bookmark_model_(NULL), |
| 98 client_(NULL), | 97 managed_bookmark_service_(NULL), |
| 99 partner_bookmarks_shim_(NULL) { | 98 partner_bookmarks_shim_(NULL) { |
| 100 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 99 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 101 profile_ = ProfileAndroid::FromProfileAndroid(j_profile); | 100 profile_ = ProfileAndroid::FromProfileAndroid(j_profile); |
| 102 bookmark_model_ = BookmarkModelFactory::GetForProfile(profile_); | 101 bookmark_model_ = BookmarkModelFactory::GetForProfile(profile_); |
| 103 client_ = ChromeBookmarkClientFactory::GetForProfile(profile_); | 102 managed_bookmark_service_ = |
| 103 ManagedBookmarkServiceFactory::GetForProfile(profile_); |
| 104 | 104 |
| 105 // Registers the notifications we are interested. | 105 // Registers the notifications we are interested. |
| 106 bookmark_model_->AddObserver(this); | 106 bookmark_model_->AddObserver(this); |
| 107 | 107 |
| 108 // Create the partner Bookmarks shim as early as possible (but don't attach). | 108 // Create the partner Bookmarks shim as early as possible (but don't attach). |
| 109 partner_bookmarks_shim_ = PartnerBookmarksShim::BuildForBrowserContext( | 109 partner_bookmarks_shim_ = PartnerBookmarksShim::BuildForBrowserContext( |
| 110 chrome::GetBrowserContextRedirectedInIncognito(profile_)); | 110 chrome::GetBrowserContextRedirectedInIncognito(profile_)); |
| 111 partner_bookmarks_shim_->AddObserver(this); | 111 partner_bookmarks_shim_->AddObserver(this); |
| 112 | 112 |
| 113 NotifyIfDoneLoading(); | 113 NotifyIfDoneLoading(); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 | 217 |
| 218 void BookmarksBridge::GetTopLevelFolderIDs(JNIEnv* env, | 218 void BookmarksBridge::GetTopLevelFolderIDs(JNIEnv* env, |
| 219 jobject obj, | 219 jobject obj, |
| 220 jboolean get_special, | 220 jboolean get_special, |
| 221 jboolean get_normal, | 221 jboolean get_normal, |
| 222 jobject j_result_obj) { | 222 jobject j_result_obj) { |
| 223 DCHECK(IsLoaded()); | 223 DCHECK(IsLoaded()); |
| 224 std::vector<const BookmarkNode*> top_level_folders; | 224 std::vector<const BookmarkNode*> top_level_folders; |
| 225 | 225 |
| 226 if (get_special) { | 226 if (get_special) { |
| 227 if (client_->managed_node() && | 227 if (managed_bookmark_service_->managed_node() && |
| 228 client_->managed_node()->child_count() > 0) { | 228 managed_bookmark_service_->managed_node()->child_count() > 0) { |
| 229 top_level_folders.push_back(client_->managed_node()); | 229 top_level_folders.push_back(managed_bookmark_service_->managed_node()); |
| 230 } | 230 } |
| 231 if (client_->supervised_node() && | 231 if (managed_bookmark_service_->supervised_node() && |
| 232 client_->supervised_node()->child_count() > 0) { | 232 managed_bookmark_service_->supervised_node()->child_count() > 0) { |
| 233 top_level_folders.push_back(client_->supervised_node()); | 233 top_level_folders.push_back(managed_bookmark_service_->supervised_node()); |
| 234 } | 234 } |
| 235 if (partner_bookmarks_shim_->HasPartnerBookmarks() | 235 if (partner_bookmarks_shim_->HasPartnerBookmarks() |
| 236 && IsReachable(partner_bookmarks_shim_->GetPartnerBookmarksRoot())) { | 236 && IsReachable(partner_bookmarks_shim_->GetPartnerBookmarksRoot())) { |
| 237 top_level_folders.push_back( | 237 top_level_folders.push_back( |
| 238 partner_bookmarks_shim_->GetPartnerBookmarksRoot()); | 238 partner_bookmarks_shim_->GetPartnerBookmarksRoot()); |
| 239 } | 239 } |
| 240 } | 240 } |
| 241 std::size_t special_count = top_level_folders.size(); | 241 std::size_t special_count = top_level_folders.size(); |
| 242 | 242 |
| 243 if (get_normal) { | 243 if (get_normal) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 stk.pop(); | 318 stk.pop(); |
| 319 Java_BookmarksBridge_addToBookmarkIdListWithDepth(env, | 319 Java_BookmarksBridge_addToBookmarkIdListWithDepth(env, |
| 320 j_folders_obj, | 320 j_folders_obj, |
| 321 node->id(), | 321 node->id(), |
| 322 GetBookmarkType(node), | 322 GetBookmarkType(node), |
| 323 j_depths_obj, | 323 j_depths_obj, |
| 324 depth); | 324 depth); |
| 325 bookmarkList.clear(); | 325 bookmarkList.clear(); |
| 326 for (int i = 0; i < node->child_count(); ++i) { | 326 for (int i = 0; i < node->child_count(); ++i) { |
| 327 const BookmarkNode* child = node->GetChild(i); | 327 const BookmarkNode* child = node->GetChild(i); |
| 328 if (child->is_folder() && client_->CanBeEditedByUser(child)) | 328 if (child->is_folder() && |
| 329 managed_bookmark_service_->CanBeEditedByUser(child)) { |
| 329 bookmarkList.push_back(node->GetChild(i)); | 330 bookmarkList.push_back(node->GetChild(i)); |
| 331 } |
| 330 } | 332 } |
| 331 std::stable_sort(bookmarkList.begin(), | 333 std::stable_sort(bookmarkList.begin(), |
| 332 bookmarkList.end(), | 334 bookmarkList.end(), |
| 333 BookmarkTitleComparer(this, collator.get())); | 335 BookmarkTitleComparer(this, collator.get())); |
| 334 for (std::vector<const BookmarkNode*>::reverse_iterator it = | 336 for (std::vector<const BookmarkNode*>::reverse_iterator it = |
| 335 bookmarkList.rbegin(); | 337 bookmarkList.rbegin(); |
| 336 it != bookmarkList.rend(); | 338 it != bookmarkList.rend(); |
| 337 ++it) { | 339 ++it) { |
| 338 stk.push(std::make_pair(*it, depth + 1)); | 340 stk.push(std::make_pair(*it, depth + 1)); |
| 339 } | 341 } |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 441 folder_iter != folders.end(); ++folder_iter) { | 443 folder_iter != folders.end(); ++folder_iter) { |
| 442 if (*folder_iter == NULL) | 444 if (*folder_iter == NULL) |
| 443 continue; | 445 continue; |
| 444 | 446 |
| 445 std::list<const BookmarkNode*>::iterator insert_iter = folder_iter; | 447 std::list<const BookmarkNode*>::iterator insert_iter = folder_iter; |
| 446 ++insert_iter; | 448 ++insert_iter; |
| 447 | 449 |
| 448 for (int i = 0; i < (*folder_iter)->child_count(); ++i) { | 450 for (int i = 0; i < (*folder_iter)->child_count(); ++i) { |
| 449 const BookmarkNode* child = (*folder_iter)->GetChild(i); | 451 const BookmarkNode* child = (*folder_iter)->GetChild(i); |
| 450 if (!IsReachable(child) || | 452 if (!IsReachable(child) || |
| 451 bookmarks::IsDescendantOf(child, client_->managed_node()) || | 453 bookmarks::IsDescendantOf( |
| 452 bookmarks::IsDescendantOf(child, client_->supervised_node())) { | 454 child, managed_bookmark_service_->managed_node()) || |
| 455 bookmarks::IsDescendantOf( |
| 456 child, managed_bookmark_service_->supervised_node())) { |
| 453 continue; | 457 continue; |
| 454 } | 458 } |
| 455 | 459 |
| 456 if (child->is_folder()) { | 460 if (child->is_folder()) { |
| 457 insert_iter = folders.insert(insert_iter, child); | 461 insert_iter = folders.insert(insert_iter, child); |
| 458 } else { | 462 } else { |
| 459 result.push_back(child); | 463 result.push_back(child); |
| 460 } | 464 } |
| 461 } | 465 } |
| 462 } | 466 } |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 766 static_cast<int64>(node_id)); | 770 static_cast<int64>(node_id)); |
| 767 } | 771 } |
| 768 return node; | 772 return node; |
| 769 } | 773 } |
| 770 | 774 |
| 771 const BookmarkNode* BookmarksBridge::GetFolderWithFallback(long folder_id, | 775 const BookmarkNode* BookmarksBridge::GetFolderWithFallback(long folder_id, |
| 772 int type) { | 776 int type) { |
| 773 const BookmarkNode* folder = GetNodeByID(folder_id, type); | 777 const BookmarkNode* folder = GetNodeByID(folder_id, type); |
| 774 if (!folder || folder->type() == BookmarkNode::URL || | 778 if (!folder || folder->type() == BookmarkNode::URL || |
| 775 !IsFolderAvailable(folder)) { | 779 !IsFolderAvailable(folder)) { |
| 776 if (!client_->managed_node()->empty()) | 780 if (!managed_bookmark_service_->managed_node()->empty()) |
| 777 folder = client_->managed_node(); | 781 folder = managed_bookmark_service_->managed_node(); |
| 778 else | 782 else |
| 779 folder = bookmark_model_->mobile_node(); | 783 folder = bookmark_model_->mobile_node(); |
| 780 } | 784 } |
| 781 return folder; | 785 return folder; |
| 782 } | 786 } |
| 783 | 787 |
| 784 bool BookmarksBridge::IsEditable(const BookmarkNode* node) const { | 788 bool BookmarksBridge::IsEditable(const BookmarkNode* node) const { |
| 785 if (!node || (node->type() != BookmarkNode::FOLDER && | 789 if (!node || (node->type() != BookmarkNode::FOLDER && |
| 786 node->type() != BookmarkNode::URL)) { | 790 node->type() != BookmarkNode::URL)) { |
| 787 return false; | 791 return false; |
| 788 } | 792 } |
| 789 if (!IsEditBookmarksEnabled(profile_)) | 793 if (!IsEditBookmarksEnabled(profile_)) |
| 790 return false; | 794 return false; |
| 791 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) | 795 if (partner_bookmarks_shim_->IsPartnerBookmark(node)) |
| 792 return partner_bookmarks_shim_->IsEditable(node); | 796 return partner_bookmarks_shim_->IsEditable(node); |
| 793 return client_->CanBeEditedByUser(node); | 797 return managed_bookmark_service_->CanBeEditedByUser(node); |
| 794 } | 798 } |
| 795 | 799 |
| 796 bool BookmarksBridge::IsManaged(const BookmarkNode* node) const { | 800 bool BookmarksBridge::IsManaged(const BookmarkNode* node) const { |
| 797 return bookmarks::IsDescendantOf(node, client_->managed_node()); | 801 return bookmarks::IsDescendantOf(node, |
| 802 managed_bookmark_service_->managed_node()); |
| 798 } | 803 } |
| 799 | 804 |
| 800 const BookmarkNode* BookmarksBridge::GetParentNode(const BookmarkNode* node) { | 805 const BookmarkNode* BookmarksBridge::GetParentNode(const BookmarkNode* node) { |
| 801 DCHECK(IsLoaded()); | 806 DCHECK(IsLoaded()); |
| 802 if (node == partner_bookmarks_shim_->GetPartnerBookmarksRoot()) { | 807 if (node == partner_bookmarks_shim_->GetPartnerBookmarksRoot()) { |
| 803 return bookmark_model_->mobile_node(); | 808 return bookmark_model_->mobile_node(); |
| 804 } else { | 809 } else { |
| 805 return node->parent(); | 810 return node->parent(); |
| 806 } | 811 } |
| 807 } | 812 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 820 } | 825 } |
| 821 | 826 |
| 822 bool BookmarksBridge::IsLoaded() const { | 827 bool BookmarksBridge::IsLoaded() const { |
| 823 return (bookmark_model_->loaded() && partner_bookmarks_shim_->IsLoaded()); | 828 return (bookmark_model_->loaded() && partner_bookmarks_shim_->IsLoaded()); |
| 824 } | 829 } |
| 825 | 830 |
| 826 bool BookmarksBridge::IsFolderAvailable( | 831 bool BookmarksBridge::IsFolderAvailable( |
| 827 const BookmarkNode* folder) const { | 832 const BookmarkNode* folder) const { |
| 828 // The managed bookmarks folder is not shown if there are no bookmarks | 833 // The managed bookmarks folder is not shown if there are no bookmarks |
| 829 // configured via policy. | 834 // configured via policy. |
| 830 if (folder == client_->managed_node() && folder->empty()) | 835 if (folder == managed_bookmark_service_->managed_node() && folder->empty()) |
| 831 return false; | 836 return false; |
| 832 // Similarly, the supervised bookmarks folder is not shown if there are no | 837 // Similarly, the supervised bookmarks folder is not shown if there are no |
| 833 // bookmarks configured by the custodian. | 838 // bookmarks configured by the custodian. |
| 834 if (folder == client_->supervised_node() && folder->empty()) | 839 if (folder == managed_bookmark_service_->supervised_node() && folder->empty()) |
| 835 return false; | 840 return false; |
| 836 | 841 |
| 837 SigninManager* signin = SigninManagerFactory::GetForProfile( | 842 SigninManager* signin = SigninManagerFactory::GetForProfile( |
| 838 profile_->GetOriginalProfile()); | 843 profile_->GetOriginalProfile()); |
| 839 return (folder->type() != BookmarkNode::BOOKMARK_BAR && | 844 return (folder->type() != BookmarkNode::BOOKMARK_BAR && |
| 840 folder->type() != BookmarkNode::OTHER_NODE) || | 845 folder->type() != BookmarkNode::OTHER_NODE) || |
| 841 (signin && signin->IsAuthenticated()); | 846 (signin && signin->IsAuthenticated()); |
| 842 } | 847 } |
| 843 | 848 |
| 844 void BookmarksBridge::NotifyIfDoneLoading() { | 849 void BookmarksBridge::NotifyIfDoneLoading() { |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1012 BookmarkModelChanged(); | 1017 BookmarkModelChanged(); |
| 1013 } | 1018 } |
| 1014 | 1019 |
| 1015 void BookmarksBridge::PartnerShimLoaded(PartnerBookmarksShim* shim) { | 1020 void BookmarksBridge::PartnerShimLoaded(PartnerBookmarksShim* shim) { |
| 1016 NotifyIfDoneLoading(); | 1021 NotifyIfDoneLoading(); |
| 1017 } | 1022 } |
| 1018 | 1023 |
| 1019 void BookmarksBridge::ShimBeingDeleted(PartnerBookmarksShim* shim) { | 1024 void BookmarksBridge::ShimBeingDeleted(PartnerBookmarksShim* shim) { |
| 1020 partner_bookmarks_shim_ = NULL; | 1025 partner_bookmarks_shim_ = NULL; |
| 1021 } | 1026 } |
| OLD | NEW |