Commit 78cb62e9 authored by kkimlabs's avatar kkimlabs Committed by Commit bot

[Android] JNI bridges for querying top level bookmark folders.

The new enhanced bookmark UI redefines what top folders are:
- Sub-folders of mobile node and others node.
- Desktop node.
- Managed bookmark node.
- Partner bookmark node.

So we need JNI bridge functions to query them.

BUG=386785

Review URL: https://codereview.chromium.org/516323003

Cr-Commit-Position: refs/heads/master@{#293291}
parent fb879545
...@@ -178,6 +178,31 @@ public class BookmarksBridge { ...@@ -178,6 +178,31 @@ public class BookmarksBridge {
return result; return result;
} }
/**
* @return The top level folder's parents, which are root node, mobile node, and other node.
*/
public List<BookmarkId> getTopLevelFolderParentIDs() {
assert mIsNativeBookmarkModelLoaded;
List<BookmarkId> result = new ArrayList<BookmarkId>();
nativeGetTopLevelFolderParentIDs(mNativeBookmarksBridge, result);
return result;
}
/**
* @param getSpecial Whether special top folders should be returned.
* @param getNormal Whether normal top folders should be returned.
* @return The top level folders. Note that special folders come first and normal top folders
* will be in the alphabetical order. Special top folders are managed bookmark and
* partner bookmark. Normal top folders are desktop permanent folder, and the
* sub-folders of mobile permanent folder and others permanent folder.
*/
public List<BookmarkId> getTopLevelFolderIDs(boolean getSpecial, boolean getNormal) {
assert mIsNativeBookmarkModelLoaded;
List<BookmarkId> result = new ArrayList<BookmarkId>();
nativeGetTopLevelFolderIDs(mNativeBookmarksBridge, getSpecial, getNormal, result);
return result;
}
/** /**
* Reads sub-folder IDs, sub-bookmark IDs, or both of the given folder. * Reads sub-folder IDs, sub-bookmark IDs, or both of the given folder.
* *
...@@ -413,6 +438,10 @@ public class BookmarksBridge { ...@@ -413,6 +438,10 @@ public class BookmarksBridge {
int type); int type);
private native void nativeGetPermanentNodeIDs(long nativeBookmarksBridge, private native void nativeGetPermanentNodeIDs(long nativeBookmarksBridge,
List<BookmarkId> bookmarksList); List<BookmarkId> bookmarksList);
private native void nativeGetTopLevelFolderParentIDs(long nativeBookmarksBridge,
List<BookmarkId> bookmarksList);
private native void nativeGetTopLevelFolderIDs(long nativeBookmarksBridge, boolean getSpecial,
boolean getNormal, List<BookmarkId> bookmarksList);
private native void nativeGetChildIDs(long nativeBookmarksBridge, long id, int type, private native void nativeGetChildIDs(long nativeBookmarksBridge, long id, int type,
boolean getFolders, boolean getBookmarks, List<BookmarkId> bookmarksList); boolean getFolders, boolean getBookmarks, List<BookmarkId> bookmarksList);
private native void nativeGetAllBookmarkIDsOrderedByCreationDate(long nativeBookmarksBridge, private native void nativeGetAllBookmarkIDsOrderedByCreationDate(long nativeBookmarksBridge,
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "base/android/jni_string.h" #include "base/android/jni_string.h"
#include "base/containers/stack_container.h" #include "base/containers/stack_container.h"
#include "base/i18n/string_compare.h"
#include "base/prefs/pref_service.h" #include "base/prefs/pref_service.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h" #include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h"
...@@ -40,6 +41,35 @@ class BookmarkNodeCreationTimeCompareFunctor { ...@@ -40,6 +41,35 @@ class BookmarkNodeCreationTimeCompareFunctor {
return lhs->date_added().ToJavaTime() > rhs->date_added().ToJavaTime(); 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 } // namespace
BookmarksBridge::BookmarksBridge(JNIEnv* env, BookmarksBridge::BookmarksBridge(JNIEnv* env,
...@@ -119,6 +149,7 @@ ScopedJavaLocalRef<jobject> BookmarksBridge::GetBookmarkByID(JNIEnv* env, ...@@ -119,6 +149,7 @@ ScopedJavaLocalRef<jobject> BookmarksBridge::GetBookmarkByID(JNIEnv* env,
void BookmarksBridge::GetPermanentNodeIDs(JNIEnv* env, void BookmarksBridge::GetPermanentNodeIDs(JNIEnv* env,
jobject obj, jobject obj,
jobject j_result_obj) { jobject j_result_obj) {
// TODO(kkimlabs): Remove this function.
DCHECK(IsLoaded()); DCHECK(IsLoaded());
base::StackVector<const BookmarkNode*, 8> permanent_nodes; base::StackVector<const BookmarkNode*, 8> permanent_nodes;
...@@ -144,6 +175,76 @@ void BookmarksBridge::GetPermanentNodeIDs(JNIEnv* env, ...@@ -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, void BookmarksBridge::GetChildIDs(JNIEnv* env,
jobject obj, jobject obj,
jlong id, jlong id,
......
...@@ -39,6 +39,16 @@ class BookmarksBridge : public BaseBookmarkModelObserver, ...@@ -39,6 +39,16 @@ class BookmarksBridge : public BaseBookmarkModelObserver,
jobject obj, jobject obj,
jobject j_result_obj); jobject j_result_obj);
void GetTopLevelFolderParentIDs(JNIEnv* env,
jobject obj,
jobject j_result_obj);
void GetTopLevelFolderIDs(JNIEnv* env,
jobject obj,
jboolean get_special,
jboolean get_normal,
jobject j_result_obj);
void GetChildIDs(JNIEnv* env, void GetChildIDs(JNIEnv* env,
jobject obj, jobject obj,
jlong id, jlong id,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment