Chromium Code Reviews| 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..0994f6649c5601b7384acc1eb3fe90603d216d37 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,49 @@ class BookmarkNodeCreationTimeCompareFunctor { |
| return lhs->date_added().ToJavaTime() > rhs->date_added().ToJavaTime(); |
| } |
| }; |
| + |
| +class BookmarkTitleComparer { |
| + public: |
| + explicit BookmarkTitleComparer(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_; |
| +}; |
| + |
| +// Since std::sort requires the compare functor to be copy-constructible, |
| +// we are using this factory class to manage icu::Collator and create a thin |
| +// copy-constructible functor, BookmarkTitleComparer. |
| +// Note: This factory must outlive the functor instance it creates because |
| +// this factory is responsible for icu::Collator lifetime that the functor |
| +// depends on. |
| +class BookmarkTitleComparerFactory { |
| + public: |
| + BookmarkTitleComparerFactory() { |
| + UErrorCode error = U_ZERO_ERROR; |
| + collator_.reset(icu::Collator::createInstance(error)); |
| + if (U_FAILURE(error)) { |
| + collator_.reset(NULL); |
| + } |
| + } |
| + |
| + BookmarkTitleComparer GetFunctor() { |
| + return BookmarkTitleComparer(collator_.get()); |
| + } |
| + |
| + private: |
| + scoped_ptr<icu::Collator> collator_; |
| +}; |
| + |
| } // namespace |
| BookmarksBridge::BookmarksBridge(JNIEnv* env, |
| @@ -119,6 +163,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 +189,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(), |
|
Ted C
2014/09/03 17:43:17
-2 indent for these two lines
Kibeom Kim (inactive)
2014/09/03 18:15:01
Done.
|
| + 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. |
|
Ted C
2014/09/03 17:43:17
I think this should just be:
if (partner_bookmark
Kibeom Kim (inactive)
2014/09/03 18:15:02
Done.
|
| + } |
| + 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()); |
|
Ted C
2014/09/03 17:43:17
why the root node in the above function and the bo
Kibeom Kim (inactive)
2014/09/03 18:15:01
You mean the DCHECK? I just added for making sure
|
| + |
| + 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)); |
|
Ted C
2014/09/03 17:43:17
What if the child isn't a folder? same below?
I
Kibeom Kim (inactive)
2014/09/03 18:15:01
Actually... I needed a folder check here. When I w
|
| + } |
| + |
| + 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(), |
| + BookmarkTitleComparerFactory().GetFunctor()); |
| + } |
| + |
| + 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, |