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

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

Issue 516323003: [Android] JNI bridges for querying top level bookmark folders. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressed newt's nits Created 6 years, 3 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') | no next file » | 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
index 4002907cfa7a0e49ee8d92e6314820ace53b05a4..3d44b04d869e8c39d719cf2069d146242557be3f 100644
--- a/chrome/browser/android/bookmarks/bookmarks_bridge.cc
+++ b/chrome/browser/android/bookmarks/bookmarks_bridge.cc
@@ -6,6 +6,7 @@
#include "base/android/jni_string.h"
#include "base/containers/stack_container.h"
+#include "base/i18n/string_compare.h"
#include "base/prefs/pref_service.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h"
@@ -40,6 +41,46 @@ class BookmarkNodeCreationTimeCompareFunctor {
return lhs->date_added().ToJavaTime() > rhs->date_added().ToJavaTime();
}
};
+
+class BookmarkNodeTitleCompareFunctor {
newt (away) 2014/09/03 01:49:51 simplify this name? maybe BookmarkTitleComparer
Kibeom Kim (inactive) 2014/09/03 06:29:44 Done.
+ public:
+ explicit BookmarkNodeTitleCompareFunctor(const icu::Collator* collator)
+ : collator_(collator) {}
+
+ bool operator()(const BookmarkNode* lhs, const BookmarkNode* rhs) {
+ if (collator_) {
+ return base::i18n::CompareString16WithCollator(
+ collator_, lhs->GetTitle(), rhs->GetTitle()) == UCOL_LESS;
+ } else {
+ return lhs->GetTitle() < rhs->GetTitle();
+ }
+ }
+
+private:
+ const icu::Collator* collator_;
+};
+
+// Note: If you use this class to get BookmarkNodeTitleCompareFunctor, then
+// this factory must outlive the functor instance because this factory is
+// responsible for icu::Collator lifetime that the functor depends on.
+class BookmarkNodeTitleCompareFunctorFactory {
newt (away) 2014/09/03 00:51:50 What's the point of making this a separate class?
Kibeom Kim (inactive) 2014/09/03 00:56:00 I thought so.. and tried that first, it turned out
newt (away) 2014/09/03 01:49:51 I'd add a comment explaining this, since it's far
Kibeom Kim (inactive) 2014/09/03 06:29:44 Done.
+ public:
+ BookmarkNodeTitleCompareFunctorFactory() {
+ UErrorCode error = U_ZERO_ERROR;
+ collator_.reset(icu::Collator::createInstance(error));
+ if (U_FAILURE(error)) {
+ collator_.reset(NULL);
+ }
+ }
+
+ BookmarkNodeTitleCompareFunctor GetFunctor() {
+ return BookmarkNodeTitleCompareFunctor(collator_.get());
+ }
+
+ private:
+ scoped_ptr<icu::Collator> collator_;
+};
+
} // namespace
BookmarksBridge::BookmarksBridge(JNIEnv* env,
@@ -119,6 +160,7 @@ ScopedJavaLocalRef<jobject> BookmarksBridge::GetBookmarkByID(JNIEnv* env,
void BookmarksBridge::GetPermanentNodeIDs(JNIEnv* env,
jobject obj,
jobject j_result_obj) {
+ // TODO(kkimlabs): Remove this function.
DCHECK(IsLoaded());
base::StackVector<const BookmarkNode*, 8> permanent_nodes;
@@ -144,6 +186,66 @@ void BookmarksBridge::GetPermanentNodeIDs(JNIEnv* env,
}
}
+void BookmarksBridge::GetTopLevelFolderParentIDs(JNIEnv* env,
+ jobject obj,
+ jobject j_result_obj) {
+ Java_BookmarksBridge_addToBookmarkIdList(
+ env, j_result_obj, bookmark_model_->root_node()->id(),
+ GetBookmarkType(bookmark_model_->root_node()));
+ Java_BookmarksBridge_addToBookmarkIdList(
+ env, j_result_obj, bookmark_model_->mobile_node()->id(),
+ GetBookmarkType(bookmark_model_->mobile_node()));
+ Java_BookmarksBridge_addToBookmarkIdList(
+ env, j_result_obj, bookmark_model_->other_node()->id(),
+ GetBookmarkType(bookmark_model_->other_node()));
+}
+
+void BookmarksBridge::GetTopLevelFolderIDs(JNIEnv* env,
+ jobject obj,
+ jboolean get_special,
+ jboolean get_normal,
+ jobject j_result_obj) {
+ DCHECK(IsLoaded());
+ std::vector<const BookmarkNode*> top_level_folders;
+
+ if (get_special) {
+ if (client_->managed_node() &&
+ client_->managed_node()->child_count() > 0) {
+ top_level_folders.push_back(client_->managed_node());
+ }
+ // TODO(kkimlabs): add partner bookmark root node, if available.
+ }
+ std::size_t special_count = top_level_folders.size();
+
+ if (get_normal) {
+ DCHECK_EQ(bookmark_model_->root_node()->child_count(), 4);
+
+ top_level_folders.push_back(bookmark_model_->bookmark_bar_node());
+
+ const BookmarkNode* mobile_node = bookmark_model_->mobile_node();
+ for (int i = 0; i < mobile_node->child_count(); ++i) {
+ top_level_folders.push_back(mobile_node->GetChild(i));
+ }
+
+ const BookmarkNode* other_node = bookmark_model_->other_node();
+ for (int i = 0; i < other_node->child_count(); ++i) {
+ top_level_folders.push_back(other_node->GetChild(i));
+ }
+
+ std::stable_sort(top_level_folders.begin() + special_count,
+ top_level_folders.end(),
+ BookmarkNodeTitleCompareFunctorFactory().GetFunctor());
newt (away) 2014/09/03 01:49:51 It seems you're not obeying the lifetime rules you
Kibeom Kim (inactive) 2014/09/03 06:29:44 I think it's safe because BookmarkNodeTitleCompare
+ }
+
+ 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::GetChildIDs(JNIEnv* env,
jobject obj,
jlong id,
« no previous file with comments | « chrome/browser/android/bookmarks/bookmarks_bridge.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698