Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4636)

Unified Diff: chrome/browser/android/bookmarks/bookmarks_bridge.cc

Issue 1708433002: Move BookmarksBridge into package with other bookmarks classes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebased Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/android/bookmarks/bookmarks_bridge.h ('k') | chrome/browser/android/chrome_jni_registrar.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/android/bookmarks/bookmarks_bridge.cc
diff --git a/chrome/browser/android/bookmarks/bookmarks_bridge.cc b/chrome/browser/android/bookmarks/bookmarks_bridge.cc
deleted file mode 100644
index 846db5569ef7e87e5a6f62ed436c3b1a4ed8d745..0000000000000000000000000000000000000000
--- a/chrome/browser/android/bookmarks/bookmarks_bridge.cc
+++ /dev/null
@@ -1,1109 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/android/bookmarks/bookmarks_bridge.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/android/jni_array.h"
-#include "base/android/jni_string.h"
-#include "base/containers/stack_container.h"
-#include "base/i18n/string_compare.h"
-#include "chrome/browser/bookmarks/bookmark_model_factory.h"
-#include "chrome/browser/bookmarks/managed_bookmark_service_factory.h"
-#include "chrome/browser/profiles/incognito_helpers.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_android.h"
-#include "chrome/browser/signin/signin_manager_factory.h"
-#include "chrome/browser/undo/bookmark_undo_service_factory.h"
-#include "components/bookmarks/browser/bookmark_match.h"
-#include "components/bookmarks/browser/bookmark_model.h"
-#include "components/bookmarks/browser/bookmark_utils.h"
-#include "components/bookmarks/browser/scoped_group_bookmark_actions.h"
-#include "components/bookmarks/common/android/bookmark_type.h"
-#include "components/bookmarks/common/bookmark_pref_names.h"
-#include "components/bookmarks/managed/managed_bookmark_service.h"
-#include "components/prefs/pref_service.h"
-#include "components/query_parser/query_parser.h"
-#include "components/signin/core/browser/signin_manager.h"
-#include "components/undo/bookmark_undo_service.h"
-#include "components/undo/undo_manager.h"
-#include "content/public/browser/browser_thread.h"
-#include "grit/components_strings.h"
-#include "jni/BookmarksBridge_jni.h"
-#include "ui/base/l10n/l10n_util.h"
-
-using base::android::AttachCurrentThread;
-using base::android::ConvertUTF8ToJavaString;
-using base::android::ConvertUTF16ToJavaString;
-using base::android::ScopedJavaLocalRef;
-using base::android::ScopedJavaGlobalRef;
-using base::android::ToJavaIntArray;
-using bookmarks::android::JavaBookmarkIdCreateBookmarkId;
-using bookmarks::android::JavaBookmarkIdGetId;
-using bookmarks::android::JavaBookmarkIdGetType;
-using bookmarks::BookmarkModel;
-using bookmarks::BookmarkNode;
-using bookmarks::BookmarkPermanentNode;
-using bookmarks::BookmarkType;
-using content::BrowserThread;
-
-namespace {
-
-class BookmarkNodeCreationTimeCompareFunctor {
- public:
- bool operator()(const BookmarkNode* lhs, const BookmarkNode* rhs) {
- return lhs->date_added().ToJavaTime() > rhs->date_added().ToJavaTime();
- }
-};
-
-class BookmarkTitleComparer {
- public:
- explicit BookmarkTitleComparer(BookmarksBridge* bookmarks_bridge,
- const icu::Collator* collator)
- : bookmarks_bridge_(bookmarks_bridge),
- collator_(collator) {}
-
- bool operator()(const BookmarkNode* lhs, const BookmarkNode* rhs) {
- if (collator_) {
- return base::i18n::CompareString16WithCollator(
- *collator_, bookmarks_bridge_->GetTitle(lhs),
- bookmarks_bridge_->GetTitle(rhs)) == UCOL_LESS;
- } else {
- return lhs->GetTitle() < rhs->GetTitle();
- }
- }
-
-private:
- BookmarksBridge* bookmarks_bridge_; // weak
- const icu::Collator* collator_;
-};
-
-scoped_ptr<icu::Collator> GetICUCollator() {
- UErrorCode error = U_ZERO_ERROR;
- scoped_ptr<icu::Collator> collator_;
- collator_.reset(icu::Collator::createInstance(error));
- if (U_FAILURE(error))
- collator_.reset(NULL);
-
- return collator_;
-}
-
-} // namespace
-
-BookmarksBridge::BookmarksBridge(JNIEnv* env, jobject obj, jobject j_profile)
- : weak_java_ref_(env, obj),
- bookmark_model_(NULL),
- managed_bookmark_service_(NULL),
- partner_bookmarks_shim_(NULL) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- profile_ = ProfileAndroid::FromProfileAndroid(j_profile);
- bookmark_model_ = BookmarkModelFactory::GetForProfile(profile_);
- managed_bookmark_service_ =
- ManagedBookmarkServiceFactory::GetForProfile(profile_);
-
- // Registers the notifications we are interested.
- bookmark_model_->AddObserver(this);
-
- // Create the partner Bookmarks shim as early as possible (but don't attach).
- partner_bookmarks_shim_ = PartnerBookmarksShim::BuildForBrowserContext(
- chrome::GetBrowserContextRedirectedInIncognito(profile_));
- partner_bookmarks_shim_->AddObserver(this);
-
- pref_change_registrar_.Init(profile_->GetPrefs());
- pref_change_registrar_.Add(
- bookmarks::prefs::kEditBookmarksEnabled,
- base::Bind(&BookmarksBridge::EditBookmarksEnabledChanged,
- base::Unretained(this)));
-
- NotifyIfDoneLoading();
-
- // Since a sync or import could have started before this class is
- // initialized, we need to make sure that our initial state is
- // up to date.
- if (bookmark_model_->IsDoingExtensiveChanges())
- ExtensiveBookmarkChangesBeginning(bookmark_model_);
-}
-
-BookmarksBridge::~BookmarksBridge() {
- bookmark_model_->RemoveObserver(this);
- if (partner_bookmarks_shim_)
- partner_bookmarks_shim_->RemoveObserver(this);
-}
-
-void BookmarksBridge::Destroy(JNIEnv*, const JavaParamRef<jobject>&) {
- delete this;
-}
-
-// static
-bool BookmarksBridge::RegisterBookmarksBridge(JNIEnv* env) {
- return RegisterNativesImpl(env);
-}
-
-static jlong Init(JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- const JavaParamRef<jobject>& j_profile) {
- BookmarksBridge* delegate = new BookmarksBridge(env, obj, j_profile);
- return reinterpret_cast<intptr_t>(delegate);
-}
-
-jboolean BookmarksBridge::IsEditBookmarksEnabled(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj) {
- return IsEditBookmarksEnabled();
-}
-
-void BookmarksBridge::LoadEmptyPartnerBookmarkShimForTesting(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj) {
- if (partner_bookmarks_shim_->IsLoaded())
- return;
- partner_bookmarks_shim_->SetPartnerBookmarksRoot(
- new BookmarkPermanentNode(0));
- DCHECK(partner_bookmarks_shim_->IsLoaded());
-}
-
-ScopedJavaLocalRef<jobject> BookmarksBridge::GetBookmarkByID(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- jlong id,
- jint type) {
- DCHECK(IsLoaded());
- const BookmarkNode* node = GetNodeByID(id, type);
- return node ? CreateJavaBookmark(node) : ScopedJavaLocalRef<jobject>();
-}
-
-bool BookmarksBridge::IsDoingExtensiveChanges(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj) {
- return bookmark_model_->IsDoingExtensiveChanges();
-}
-
-void BookmarksBridge::GetPermanentNodeIDs(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- const JavaParamRef<jobject>& j_result_obj) {
- // TODO(kkimlabs): Remove this function.
- DCHECK(IsLoaded());
-
- base::StackVector<const BookmarkNode*, 8> permanent_nodes;
-
- // Save all the permanent nodes.
- const BookmarkNode* root_node = bookmark_model_->root_node();
- permanent_nodes->push_back(root_node);
- for (int i = 0; i < root_node->child_count(); ++i) {
- permanent_nodes->push_back(root_node->GetChild(i));
- }
- permanent_nodes->push_back(
- partner_bookmarks_shim_->GetPartnerBookmarksRoot());
-
- // Write the permanent nodes to |j_result_obj|.
- for (base::StackVector<const BookmarkNode*, 8>::ContainerType::const_iterator
- it = permanent_nodes->begin();
- it != permanent_nodes->end();
- ++it) {
- if (*it != NULL) {
- Java_BookmarksBridge_addToBookmarkIdList(
- env, j_result_obj, (*it)->id(), GetBookmarkType(*it));
- }
- }
-}
-
-void BookmarksBridge::GetTopLevelFolderParentIDs(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- const JavaParamRef<jobject>& j_result_obj) {
- Java_BookmarksBridge_addToBookmarkIdList(
- env, j_result_obj, bookmark_model_->root_node()->id(),
- GetBookmarkType(bookmark_model_->root_node()));
-}
-
-void BookmarksBridge::GetTopLevelFolderIDs(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- jboolean get_special,
- jboolean get_normal,
- const JavaParamRef<jobject>& j_result_obj) {
- DCHECK(IsLoaded());
- std::vector<const BookmarkNode*> top_level_folders;
-
- if (get_special) {
- if (managed_bookmark_service_->managed_node() &&
- managed_bookmark_service_->managed_node()->child_count() > 0) {
- top_level_folders.push_back(managed_bookmark_service_->managed_node());
- }
- if (managed_bookmark_service_->supervised_node() &&
- managed_bookmark_service_->supervised_node()->child_count() > 0) {
- top_level_folders.push_back(managed_bookmark_service_->supervised_node());
- }
- if (partner_bookmarks_shim_->HasPartnerBookmarks()
- && IsReachable(partner_bookmarks_shim_->GetPartnerBookmarksRoot())) {
- top_level_folders.push_back(
- partner_bookmarks_shim_->GetPartnerBookmarksRoot());
- }
- }
- std::size_t special_count = top_level_folders.size();
-
- if (get_normal) {
- DCHECK_EQ(bookmark_model_->root_node()->child_count(), 5);
-
- const BookmarkNode* mobile_node = bookmark_model_->mobile_node();
- for (int i = 0; i < mobile_node->child_count(); ++i) {
- const BookmarkNode* node = mobile_node->GetChild(i);
- if (node->is_folder()) {
- top_level_folders.push_back(node);
- }
- }
-
- const BookmarkNode* bookmark_bar_node =
- bookmark_model_->bookmark_bar_node();
- for (int i = 0; i < bookmark_bar_node->child_count(); ++i) {
- const BookmarkNode* node = bookmark_bar_node->GetChild(i);
- if (node->is_folder()) {
- top_level_folders.push_back(node);
- }
- }
-
- const BookmarkNode* other_node = bookmark_model_->other_node();
- for (int i = 0; i < other_node->child_count(); ++i) {
- const BookmarkNode* node = other_node->GetChild(i);
- if (node->is_folder()) {
- top_level_folders.push_back(node);
- }
- }
-
- scoped_ptr<icu::Collator> collator = GetICUCollator();
- std::stable_sort(top_level_folders.begin() + special_count,
- top_level_folders.end(),
- BookmarkTitleComparer(this, collator.get()));
- }
-
- for (std::vector<const BookmarkNode*>::const_iterator it =
- top_level_folders.begin(); it != top_level_folders.end(); ++it) {
- Java_BookmarksBridge_addToBookmarkIdList(env,
- j_result_obj,
- (*it)->id(),
- GetBookmarkType(*it));
- }
-}
-
-void BookmarksBridge::GetAllFoldersWithDepths(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- const JavaParamRef<jobject>& j_folders_obj,
- const JavaParamRef<jobject>& j_depths_obj) {
- DCHECK(IsLoaded());
-
- scoped_ptr<icu::Collator> collator = GetICUCollator();
-
- // Vector to temporarily contain all child bookmarks at same level for sorting
- std::vector<const BookmarkNode*> bookmarkList;
-
- // Stack for Depth-First Search of bookmark model. It stores nodes and their
- // heights.
- std::stack<std::pair<const BookmarkNode*, int> > stk;
-
- bookmarkList.push_back(bookmark_model_->mobile_node());
- bookmarkList.push_back(bookmark_model_->bookmark_bar_node());
- bookmarkList.push_back(bookmark_model_->other_node());
-
- // Push all sorted top folders in stack and give them depth of 0.
- // Note the order to push folders to stack should be opposite to the order in
- // output.
- for (std::vector<const BookmarkNode*>::reverse_iterator it =
- bookmarkList.rbegin();
- it != bookmarkList.rend();
- ++it) {
- stk.push(std::make_pair(*it, 0));
- }
-
- while (!stk.empty()) {
- const BookmarkNode* node = stk.top().first;
- int depth = stk.top().second;
- stk.pop();
- Java_BookmarksBridge_addToBookmarkIdListWithDepth(env,
- j_folders_obj,
- node->id(),
- GetBookmarkType(node),
- j_depths_obj,
- depth);
- bookmarkList.clear();
- for (int i = 0; i < node->child_count(); ++i) {
- const BookmarkNode* child = node->GetChild(i);
- if (child->is_folder() &&
- managed_bookmark_service_->CanBeEditedByUser(child)) {
- bookmarkList.push_back(node->GetChild(i));
- }
- }
- std::stable_sort(bookmarkList.begin(),
- bookmarkList.end(),
- BookmarkTitleComparer(this, collator.get()));
- for (std::vector<const BookmarkNode*>::reverse_iterator it =
- bookmarkList.rbegin();
- it != bookmarkList.rend();
- ++it) {
- stk.push(std::make_pair(*it, depth + 1));
- }
- }
-}
-
-ScopedJavaLocalRef<jobject> BookmarksBridge::GetRootFolderId(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj) {
- const BookmarkNode* root_node = bookmark_model_->root_node();
- ScopedJavaLocalRef<jobject> folder_id_obj =
- JavaBookmarkIdCreateBookmarkId(
- env, root_node->id(), GetBookmarkType(root_node));
- return folder_id_obj;
-}
-
-ScopedJavaLocalRef<jobject> BookmarksBridge::GetMobileFolderId(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj) {
- const BookmarkNode* mobile_node = bookmark_model_->mobile_node();
- ScopedJavaLocalRef<jobject> folder_id_obj =
- JavaBookmarkIdCreateBookmarkId(
- env, mobile_node->id(), GetBookmarkType(mobile_node));
- return folder_id_obj;
-}
-
-ScopedJavaLocalRef<jobject> BookmarksBridge::GetOtherFolderId(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj) {
- const BookmarkNode* other_node = bookmark_model_->other_node();
- ScopedJavaLocalRef<jobject> folder_id_obj =
- JavaBookmarkIdCreateBookmarkId(
- env, other_node->id(), GetBookmarkType(other_node));
- return folder_id_obj;
-}
-
-ScopedJavaLocalRef<jobject> BookmarksBridge::GetDesktopFolderId(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj) {
- const BookmarkNode* desktop_node = bookmark_model_->bookmark_bar_node();
- ScopedJavaLocalRef<jobject> folder_id_obj =
- JavaBookmarkIdCreateBookmarkId(
- env, desktop_node->id(), GetBookmarkType(desktop_node));
- return folder_id_obj;
-}
-
-jint BookmarksBridge::GetChildCount(JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- jlong id,
- jint type) {
- DCHECK(IsLoaded());
- const BookmarkNode* node = GetNodeByID(id, type);
- return node->child_count();
-}
-
-void BookmarksBridge::GetChildIDs(JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- jlong id,
- jint type,
- jboolean get_folders,
- jboolean get_bookmarks,
- const JavaParamRef<jobject>& j_result_obj) {
- DCHECK(IsLoaded());
-
- const BookmarkNode* parent = GetNodeByID(id, type);
- if (!parent->is_folder() || !IsReachable(parent))
- return;
-
- // Get the folder contents
- for (int i = 0; i < parent->child_count(); ++i) {
- const BookmarkNode* child = parent->GetChild(i);
- if (!IsFolderAvailable(child) || !IsReachable(child))
- continue;
-
- if ((child->is_folder() && get_folders) ||
- (!child->is_folder() && get_bookmarks)) {
- Java_BookmarksBridge_addToBookmarkIdList(
- env, j_result_obj, child->id(), GetBookmarkType(child));
- }
- }
-
- // Partner bookmark root node is under mobile node.
- if (parent == bookmark_model_->mobile_node() && get_folders &&
- partner_bookmarks_shim_->HasPartnerBookmarks() &&
- IsReachable(partner_bookmarks_shim_->GetPartnerBookmarksRoot())) {
- Java_BookmarksBridge_addToBookmarkIdList(
- env,
- j_result_obj,
- partner_bookmarks_shim_->GetPartnerBookmarksRoot()->id(),
- BookmarkType::BOOKMARK_TYPE_PARTNER);
- }
-}
-
-ScopedJavaLocalRef<jobject> BookmarksBridge::GetChildAt(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- jlong id,
- jint type,
- jint index) {
- DCHECK(IsLoaded());
-
- const BookmarkNode* parent = GetNodeByID(id, type);
- DCHECK(parent);
- const BookmarkNode* child = parent->GetChild(index);
- return JavaBookmarkIdCreateBookmarkId(
- env, child->id(), GetBookmarkType(child));
-}
-
-void BookmarksBridge::GetAllBookmarkIDsOrderedByCreationDate(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- const JavaParamRef<jobject>& j_result_obj) {
- DCHECK(IsLoaded());
- std::list<const BookmarkNode*> folders;
- std::vector<const BookmarkNode*> result;
- folders.push_back(bookmark_model_->root_node());
-
- for (std::list<const BookmarkNode*>::iterator folder_iter = folders.begin();
- folder_iter != folders.end(); ++folder_iter) {
- if (*folder_iter == NULL)
- continue;
-
- std::list<const BookmarkNode*>::iterator insert_iter = folder_iter;
- ++insert_iter;
-
- for (int i = 0; i < (*folder_iter)->child_count(); ++i) {
- const BookmarkNode* child = (*folder_iter)->GetChild(i);
- if (!IsReachable(child) ||
- bookmarks::IsDescendantOf(
- child, managed_bookmark_service_->managed_node()) ||
- bookmarks::IsDescendantOf(
- child, managed_bookmark_service_->supervised_node())) {
- continue;
- }
-
- if (child->is_folder()) {
- insert_iter = folders.insert(insert_iter, child);
- } else {
- result.push_back(child);
- }
- }
- }
-
- std::sort(
- result.begin(), result.end(), BookmarkNodeCreationTimeCompareFunctor());
-
- for (std::vector<const BookmarkNode*>::const_iterator iter = result.begin();
- iter != result.end();
- ++iter) {
- const BookmarkNode* bookmark = *iter;
- Java_BookmarksBridge_addToBookmarkIdList(
- env, j_result_obj, bookmark->id(), GetBookmarkType(bookmark));
- }
-}
-
-void BookmarksBridge::SetBookmarkTitle(JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- jlong id,
- jint type,
- const JavaParamRef<jstring>& j_title) {
- DCHECK(IsLoaded());
- const BookmarkNode* bookmark = GetNodeByID(id, type);
- const base::string16 title =
- base::android::ConvertJavaStringToUTF16(env, j_title);
-
- if (partner_bookmarks_shim_->IsPartnerBookmark(bookmark)) {
- partner_bookmarks_shim_->RenameBookmark(bookmark, title);
- } else {
- bookmark_model_->SetTitle(bookmark, title);
- }
-}
-
-void BookmarksBridge::SetBookmarkUrl(JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- jlong id,
- jint type,
- const JavaParamRef<jstring>& url) {
- DCHECK(IsLoaded());
- bookmark_model_->SetURL(
- GetNodeByID(id, type),
- GURL(base::android::ConvertJavaStringToUTF16(env, url)));
-}
-
-bool BookmarksBridge::DoesBookmarkExist(JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- jlong id,
- jint type) {
- DCHECK(IsLoaded());
-
- const BookmarkNode* node = GetNodeByID(id, type);
-
- if (!node)
- return false;
-
- if (type == BookmarkType::BOOKMARK_TYPE_NORMAL) {
- return true;
- } else {
- DCHECK(type == BookmarkType::BOOKMARK_TYPE_PARTNER);
- return partner_bookmarks_shim_->IsReachable(node);
- }
-}
-
-void BookmarksBridge::GetBookmarksForFolder(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- const JavaParamRef<jobject>& j_folder_id_obj,
- const JavaParamRef<jobject>& j_callback_obj,
- const JavaParamRef<jobject>& j_result_obj) {
- DCHECK(IsLoaded());
- long folder_id = JavaBookmarkIdGetId(env, j_folder_id_obj);
- int type = JavaBookmarkIdGetType(env, j_folder_id_obj);
- const BookmarkNode* folder = GetFolderWithFallback(folder_id, type);
-
- if (!folder->is_folder() || !IsReachable(folder))
- return;
-
- // Recreate the java bookmarkId object due to fallback.
- ScopedJavaLocalRef<jobject> folder_id_obj =
- JavaBookmarkIdCreateBookmarkId(
- env, folder->id(), GetBookmarkType(folder));
-
- // Get the folder contents.
- for (int i = 0; i < folder->child_count(); ++i) {
- const BookmarkNode* node = folder->GetChild(i);
- if (!IsFolderAvailable(node))
- continue;
- ExtractBookmarkNodeInformation(node, j_result_obj);
- }
-
- if (folder == bookmark_model_->mobile_node() &&
- partner_bookmarks_shim_->HasPartnerBookmarks()) {
- ExtractBookmarkNodeInformation(
- partner_bookmarks_shim_->GetPartnerBookmarksRoot(),
- j_result_obj);
- }
-
- if (j_callback_obj) {
- Java_BookmarksCallback_onBookmarksAvailable(
- env, j_callback_obj, folder_id_obj.obj(), j_result_obj);
- }
-}
-
-jboolean BookmarksBridge::IsFolderVisible(JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- jlong id,
- jint type) {
- if (type == BookmarkType::BOOKMARK_TYPE_NORMAL) {
- const BookmarkNode* node = bookmarks::GetBookmarkNodeByID(
- bookmark_model_, static_cast<int64_t>(id));
- return node->IsVisible();
- } else if (type == BookmarkType::BOOKMARK_TYPE_PARTNER) {
- const BookmarkNode* node = partner_bookmarks_shim_->GetNodeByID(
- static_cast<long>(id));
- return partner_bookmarks_shim_->IsReachable(node);
- }
-
- NOTREACHED();
- return false;
-}
-
-void BookmarksBridge::GetCurrentFolderHierarchy(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- const JavaParamRef<jobject>& j_folder_id_obj,
- const JavaParamRef<jobject>& j_callback_obj,
- const JavaParamRef<jobject>& j_result_obj) {
- DCHECK(IsLoaded());
- long folder_id = JavaBookmarkIdGetId(env, j_folder_id_obj);
- int type = JavaBookmarkIdGetType(env, j_folder_id_obj);
- const BookmarkNode* folder = GetFolderWithFallback(folder_id, type);
-
- if (!folder->is_folder() || !IsReachable(folder))
- return;
-
- // Recreate the java bookmarkId object due to fallback.
- ScopedJavaLocalRef<jobject> folder_id_obj =
- JavaBookmarkIdCreateBookmarkId(
- env, folder->id(), GetBookmarkType(folder));
-
- // Get the folder hierarchy.
- const BookmarkNode* node = folder;
- while (node) {
- ExtractBookmarkNodeInformation(node, j_result_obj);
- node = GetParentNode(node);
- }
-
- Java_BookmarksCallback_onBookmarksFolderHierarchyAvailable(
- env, j_callback_obj, folder_id_obj.obj(), j_result_obj);
-}
-
-void BookmarksBridge::SearchBookmarks(JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- const JavaParamRef<jobject>& j_list,
- const JavaParamRef<jstring>& j_query,
- jint max_results) {
- DCHECK(bookmark_model_->loaded());
-
- std::vector<bookmarks::BookmarkMatch> results;
- bookmark_model_->GetBookmarksMatching(
- base::android::ConvertJavaStringToUTF16(env, j_query),
- max_results,
- query_parser::MatchingAlgorithm::ALWAYS_PREFIX_SEARCH,
- &results);
- for (const bookmarks::BookmarkMatch& match : results) {
- const BookmarkNode* node = match.node;
-
- std::vector<int> title_match_start_positions;
- std::vector<int> title_match_end_positions;
- for (auto position : match.title_match_positions) {
- title_match_start_positions.push_back(position.first);
- title_match_end_positions.push_back(position.second);
- }
-
- std::vector<int> url_match_start_positions;
- std::vector<int> url_match_end_positions;
- for (auto position : match.url_match_positions) {
- url_match_start_positions.push_back(position.first);
- url_match_end_positions.push_back(position.second);
- }
-
- Java_BookmarksBridge_addToBookmarkMatchList(
- env, j_list, node->id(), node->type(),
- ToJavaIntArray(env, title_match_start_positions).obj(),
- ToJavaIntArray(env, title_match_end_positions).obj(),
- ToJavaIntArray(env, url_match_start_positions).obj(),
- ToJavaIntArray(env, url_match_end_positions).obj());
- }
-}
-
-ScopedJavaLocalRef<jobject> BookmarksBridge::AddFolder(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- const JavaParamRef<jobject>& j_parent_id_obj,
- jint index,
- const JavaParamRef<jstring>& j_title) {
- DCHECK(IsLoaded());
- long bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj);
- int type = JavaBookmarkIdGetType(env, j_parent_id_obj);
- const BookmarkNode* parent = GetNodeByID(bookmark_id, type);
-
- const BookmarkNode* new_node = bookmark_model_->AddFolder(
- parent, index, base::android::ConvertJavaStringToUTF16(env, j_title));
- if (!new_node) {
- NOTREACHED();
- return ScopedJavaLocalRef<jobject>();
- }
- ScopedJavaLocalRef<jobject> new_java_obj =
- JavaBookmarkIdCreateBookmarkId(
- env, new_node->id(), GetBookmarkType(new_node));
- return new_java_obj;
-}
-
-void BookmarksBridge::DeleteBookmark(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- const JavaParamRef<jobject>& j_bookmark_id_obj) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- DCHECK(IsLoaded());
-
- long bookmark_id = JavaBookmarkIdGetId(env, j_bookmark_id_obj);
- int type = JavaBookmarkIdGetType(env, j_bookmark_id_obj);
- const BookmarkNode* node = GetNodeByID(bookmark_id, type);
- if (!IsEditable(node)) {
- NOTREACHED();
- return;
- }
-
- if (partner_bookmarks_shim_->IsPartnerBookmark(node))
- partner_bookmarks_shim_->RemoveBookmark(node);
- else
- bookmark_model_->Remove(node);
-}
-
-void BookmarksBridge::MoveBookmark(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- const JavaParamRef<jobject>& j_bookmark_id_obj,
- const JavaParamRef<jobject>& j_parent_id_obj,
- jint index) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- DCHECK(IsLoaded());
-
- long bookmark_id = JavaBookmarkIdGetId(env, j_bookmark_id_obj);
- int type = JavaBookmarkIdGetType(env, j_bookmark_id_obj);
- const BookmarkNode* node = GetNodeByID(bookmark_id, type);
- if (!IsEditable(node)) {
- NOTREACHED();
- return;
- }
- bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj);
- type = JavaBookmarkIdGetType(env, j_parent_id_obj);
- const BookmarkNode* new_parent_node = GetNodeByID(bookmark_id, type);
- bookmark_model_->Move(node, new_parent_node, index);
-}
-
-ScopedJavaLocalRef<jobject> BookmarksBridge::AddBookmark(
- JNIEnv* env,
- const JavaParamRef<jobject>& obj,
- const JavaParamRef<jobject>& j_parent_id_obj,
- jint index,
- const JavaParamRef<jstring>& j_title,
- const JavaParamRef<jstring>& j_url) {
- DCHECK(IsLoaded());
- long bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj);
- int type = JavaBookmarkIdGetType(env, j_parent_id_obj);
- const BookmarkNode* parent = GetNodeByID(bookmark_id, type);
-
- const BookmarkNode* new_node = bookmark_model_->AddURL(
- parent,
- index,
- base::android::ConvertJavaStringToUTF16(env, j_title),
- GURL(base::android::ConvertJavaStringToUTF16(env, j_url)));
- if (!new_node) {
- NOTREACHED();
- return ScopedJavaLocalRef<jobject>();
- }
- ScopedJavaLocalRef<jobject> new_java_obj =
- JavaBookmarkIdCreateBookmarkId(
- env, new_node->id(), GetBookmarkType(new_node));
- return new_java_obj;
-}
-
-void BookmarksBridge::Undo(JNIEnv* env, const JavaParamRef<jobject>& obj) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- DCHECK(IsLoaded());
- BookmarkUndoService* undo_service =
- BookmarkUndoServiceFactory::GetForProfile(profile_);
- UndoManager* undo_manager = undo_service->undo_manager();
- undo_manager->Undo();
-}
-
-void BookmarksBridge::StartGroupingUndos(JNIEnv* env,
- const JavaParamRef<jobject>& obj) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- DCHECK(IsLoaded());
- DCHECK(!grouped_bookmark_actions_.get()); // shouldn't have started already
- grouped_bookmark_actions_.reset(
- new bookmarks::ScopedGroupBookmarkActions(bookmark_model_));
-}
-
-void BookmarksBridge::EndGroupingUndos(JNIEnv* env,
- const JavaParamRef<jobject>& obj) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- DCHECK(IsLoaded());
- DCHECK(grouped_bookmark_actions_.get()); // should only call after start
- grouped_bookmark_actions_.reset();
-}
-
-base::string16 BookmarksBridge::GetTitle(const BookmarkNode* node) const {
- if (partner_bookmarks_shim_->IsPartnerBookmark(node))
- return partner_bookmarks_shim_->GetTitle(node);
-
- return node->GetTitle();
-}
-
-ScopedJavaLocalRef<jobject> BookmarksBridge::CreateJavaBookmark(
- const BookmarkNode* node) {
- JNIEnv* env = AttachCurrentThread();
-
- const BookmarkNode* parent = GetParentNode(node);
- int64_t parent_id = parent ? parent->id() : -1;
-
- std::string url;
- if (node->is_url())
- url = node->url().spec();
-
- return Java_BookmarksBridge_createBookmarkItem(
- env,
- node->id(),
- GetBookmarkType(node),
- ConvertUTF16ToJavaString(env, GetTitle(node)).obj(),
- ConvertUTF8ToJavaString(env, url).obj(),
- node->is_folder(),
- parent_id,
- GetBookmarkType(parent),
- IsEditable(node),
- IsManaged(node));
-}
-
-void BookmarksBridge::ExtractBookmarkNodeInformation(const BookmarkNode* node,
- jobject j_result_obj) {
- JNIEnv* env = AttachCurrentThread();
- if (!IsReachable(node))
- return;
- Java_BookmarksBridge_addToList(
- env, j_result_obj, CreateJavaBookmark(node).obj());
-}
-
-const BookmarkNode* BookmarksBridge::GetNodeByID(long node_id, int type) {
- const BookmarkNode* node;
- if (type == BookmarkType::BOOKMARK_TYPE_PARTNER) {
- node = partner_bookmarks_shim_->GetNodeByID(static_cast<int64_t>(node_id));
- } else {
- node = bookmarks::GetBookmarkNodeByID(bookmark_model_,
- static_cast<int64_t>(node_id));
- }
- return node;
-}
-
-const BookmarkNode* BookmarksBridge::GetFolderWithFallback(long folder_id,
- int type) {
- const BookmarkNode* folder = GetNodeByID(folder_id, type);
- if (!folder || folder->type() == BookmarkNode::URL ||
- !IsFolderAvailable(folder)) {
- if (!managed_bookmark_service_->managed_node()->empty())
- folder = managed_bookmark_service_->managed_node();
- else
- folder = bookmark_model_->mobile_node();
- }
- return folder;
-}
-
-bool BookmarksBridge::IsEditBookmarksEnabled() const {
- return profile_->GetPrefs()->GetBoolean(
- bookmarks::prefs::kEditBookmarksEnabled);
-}
-
-void BookmarksBridge::EditBookmarksEnabledChanged() {
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
- if (obj.is_null())
- return;
- Java_BookmarksBridge_editBookmarksEnabledChanged(env, obj.obj());
-}
-
-bool BookmarksBridge::IsEditable(const BookmarkNode* node) const {
- if (!node || (node->type() != BookmarkNode::FOLDER &&
- node->type() != BookmarkNode::URL)) {
- return false;
- }
- if (!IsEditBookmarksEnabled())
- return false;
- if (partner_bookmarks_shim_->IsPartnerBookmark(node))
- return partner_bookmarks_shim_->IsEditable(node);
- return managed_bookmark_service_->CanBeEditedByUser(node);
-}
-
-bool BookmarksBridge::IsManaged(const BookmarkNode* node) const {
- return bookmarks::IsDescendantOf(node,
- managed_bookmark_service_->managed_node());
-}
-
-const BookmarkNode* BookmarksBridge::GetParentNode(const BookmarkNode* node) {
- DCHECK(IsLoaded());
- if (node == partner_bookmarks_shim_->GetPartnerBookmarksRoot()) {
- return bookmark_model_->mobile_node();
- } else {
- return node->parent();
- }
-}
-
-int BookmarksBridge::GetBookmarkType(const BookmarkNode* node) {
- if (partner_bookmarks_shim_->IsPartnerBookmark(node))
- return BookmarkType::BOOKMARK_TYPE_PARTNER;
- else
- return BookmarkType::BOOKMARK_TYPE_NORMAL;
-}
-
-bool BookmarksBridge::IsReachable(const BookmarkNode* node) const {
- if (!partner_bookmarks_shim_->IsPartnerBookmark(node))
- return true;
- return partner_bookmarks_shim_->IsReachable(node);
-}
-
-bool BookmarksBridge::IsLoaded() const {
- return (bookmark_model_->loaded() && partner_bookmarks_shim_->IsLoaded());
-}
-
-bool BookmarksBridge::IsFolderAvailable(
- const BookmarkNode* folder) const {
- // The managed bookmarks folder is not shown if there are no bookmarks
- // configured via policy.
- if (folder == managed_bookmark_service_->managed_node() && folder->empty())
- return false;
- // Similarly, the supervised bookmarks folder is not shown if there are no
- // bookmarks configured by the custodian.
- if (folder == managed_bookmark_service_->supervised_node() && folder->empty())
- return false;
-
- SigninManager* signin = SigninManagerFactory::GetForProfile(
- profile_->GetOriginalProfile());
- return (folder->type() != BookmarkNode::BOOKMARK_BAR &&
- folder->type() != BookmarkNode::OTHER_NODE) ||
- (signin && signin->IsAuthenticated());
-}
-
-void BookmarksBridge::NotifyIfDoneLoading() {
- if (!IsLoaded())
- return;
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
- if (obj.is_null())
- return;
- Java_BookmarksBridge_bookmarkModelLoaded(env, obj.obj());
-}
-
-// ------------- Observer-related methods ------------- //
-
-void BookmarksBridge::BookmarkModelChanged() {
- if (!IsLoaded())
- return;
-
- // Called when there are changes to the bookmark model. It is most
- // likely changes to the partner bookmarks.
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
- if (obj.is_null())
- return;
- Java_BookmarksBridge_bookmarkModelChanged(env, obj.obj());
-}
-
-void BookmarksBridge::BookmarkModelLoaded(BookmarkModel* model,
- bool ids_reassigned) {
- NotifyIfDoneLoading();
-}
-
-void BookmarksBridge::BookmarkModelBeingDeleted(BookmarkModel* model) {
- if (!IsLoaded())
- return;
-
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
- if (obj.is_null())
- return;
- Java_BookmarksBridge_bookmarkModelDeleted(env, obj.obj());
-}
-
-void BookmarksBridge::BookmarkNodeMoved(BookmarkModel* model,
- const BookmarkNode* old_parent,
- int old_index,
- const BookmarkNode* new_parent,
- int new_index) {
- if (!IsLoaded())
- return;
-
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
- if (obj.is_null())
- return;
- Java_BookmarksBridge_bookmarkNodeMoved(
- env,
- obj.obj(),
- CreateJavaBookmark(old_parent).obj(),
- old_index,
- CreateJavaBookmark(new_parent).obj(),
- new_index);
-}
-
-void BookmarksBridge::BookmarkNodeAdded(BookmarkModel* model,
- const BookmarkNode* parent,
- int index) {
- if (!IsLoaded())
- return;
-
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
- if (obj.is_null())
- return;
- Java_BookmarksBridge_bookmarkNodeAdded(
- env,
- obj.obj(),
- CreateJavaBookmark(parent).obj(),
- index);
-}
-
-void BookmarksBridge::BookmarkNodeRemoved(BookmarkModel* model,
- const BookmarkNode* parent,
- int old_index,
- const BookmarkNode* node,
- const std::set<GURL>& removed_urls) {
- if (!IsLoaded())
- return;
-
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
- if (obj.is_null())
- return;
- Java_BookmarksBridge_bookmarkNodeRemoved(
- env,
- obj.obj(),
- CreateJavaBookmark(parent).obj(),
- old_index,
- CreateJavaBookmark(node).obj());
-}
-
-void BookmarksBridge::BookmarkAllUserNodesRemoved(
- BookmarkModel* model,
- const std::set<GURL>& removed_urls) {
- if (!IsLoaded())
- return;
-
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
- if (obj.is_null())
- return;
- Java_BookmarksBridge_bookmarkAllUserNodesRemoved(env, obj.obj());
-}
-
-void BookmarksBridge::BookmarkNodeChanged(BookmarkModel* model,
- const BookmarkNode* node) {
- if (!IsLoaded())
- return;
-
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
- if (obj.is_null())
- return;
- Java_BookmarksBridge_bookmarkNodeChanged(
- env,
- obj.obj(),
- CreateJavaBookmark(node).obj());
-}
-
-void BookmarksBridge::BookmarkNodeChildrenReordered(BookmarkModel* model,
- const BookmarkNode* node) {
- if (!IsLoaded())
- return;
-
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
- if (obj.is_null())
- return;
- Java_BookmarksBridge_bookmarkNodeChildrenReordered(
- env,
- obj.obj(),
- CreateJavaBookmark(node).obj());
-}
-
-void BookmarksBridge::ExtensiveBookmarkChangesBeginning(BookmarkModel* model) {
- if (!IsLoaded())
- return;
-
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
- if (obj.is_null())
- return;
- Java_BookmarksBridge_extensiveBookmarkChangesBeginning(env, obj.obj());
-}
-
-void BookmarksBridge::ExtensiveBookmarkChangesEnded(BookmarkModel* model) {
- if (!IsLoaded())
- return;
-
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
- if (obj.is_null())
- return;
- Java_BookmarksBridge_extensiveBookmarkChangesEnded(env, obj.obj());
-}
-
-void BookmarksBridge::PartnerShimChanged(PartnerBookmarksShim* shim) {
- if (!IsLoaded())
- return;
-
- BookmarkModelChanged();
-}
-
-void BookmarksBridge::PartnerShimLoaded(PartnerBookmarksShim* shim) {
- NotifyIfDoneLoading();
-}
-
-void BookmarksBridge::ShimBeingDeleted(PartnerBookmarksShim* shim) {
- partner_bookmarks_shim_ = NULL;
-}
« no previous file with comments | « chrome/browser/android/bookmarks/bookmarks_bridge.h ('k') | chrome/browser/android/chrome_jni_registrar.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698