| 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..71f1c2795801484c3de8722062d2f81855786407 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,35 @@ 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_;
|
| +};
|
| +
|
| +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_.Pass();
|
| +}
|
| +
|
| } // namespace
|
|
|
| BookmarksBridge::BookmarksBridge(JNIEnv* env,
|
| @@ -119,6 +149,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 +175,76 @@ 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());
|
| + }
|
| + if (partner_bookmarks_shim_->HasPartnerBookmarks()) {
|
| + 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(), 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) {
|
| + const BookmarkNode* node = mobile_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(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::GetChildIDs(JNIEnv* env,
|
| jobject obj,
|
| jlong id,
|
|
|