Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / android / bookmarks / bookmarks_bridge.cc
index 418a1c9..7cd704a 100644 (file)
@@ -5,6 +5,7 @@
 #include "chrome/browser/android/bookmarks/bookmarks_bridge.h"
 
 #include "base/android/jni_string.h"
+#include "base/containers/stack_container.h"
 #include "base/prefs/pref_service.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h"
@@ -16,6 +17,7 @@
 #include "chrome/common/pref_names.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_utils.h"
+#include "components/bookmarks/common/android/bookmark_type.h"
 #include "components/signin/core/browser/signin_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "jni/BookmarksBridge_jni.h"
@@ -25,11 +27,20 @@ using base::android::ConvertUTF8ToJavaString;
 using base::android::ConvertUTF16ToJavaString;
 using base::android::ScopedJavaLocalRef;
 using base::android::ScopedJavaGlobalRef;
+using bookmarks::android::JavaBookmarkIdGetId;
+using bookmarks::android::JavaBookmarkIdGetType;
+using bookmarks::BookmarkType;
 using content::BrowserThread;
 
-// Should mirror constants in BookmarksBridge.java
-static const int kBookmarkTypeNormal = 0;
-static const int kBookmarkTypePartner = 1;
+namespace {
+
+class BookmarkNodeCreationTimeCompareFunctor {
+ public:
+  bool operator()(const BookmarkNode* lhs, const BookmarkNode* rhs) {
+    return lhs->date_added().ToJavaTime() > rhs->date_added().ToJavaTime();
+  }
+};
+}  // namespace
 
 BookmarksBridge::BookmarksBridge(JNIEnv* env,
                                  jobject obj,
@@ -80,6 +91,14 @@ static jlong Init(JNIEnv* env, jobject obj, jobject j_profile) {
   return reinterpret_cast<intptr_t>(delegate);
 }
 
+static jlong GetNativeBookmarkModel(JNIEnv* env,
+                                    jclass caller,
+                                    jobject j_profile) {
+  Profile *profile = ProfileAndroid::FromProfileAndroid(j_profile);
+  BookmarkModel *bookmark_model_ = BookmarkModelFactory::GetForProfile(profile);
+  return reinterpret_cast<jlong>(bookmark_model_);
+}
+
 static bool IsEditBookmarksEnabled() {
   return ProfileManager::GetLastUsedProfile()->GetPrefs()->GetBoolean(
       prefs::kEditBookmarksEnabled);
@@ -89,14 +108,167 @@ static jboolean IsEditBookmarksEnabled(JNIEnv* env, jclass clazz) {
   return IsEditBookmarksEnabled();
 }
 
+ScopedJavaLocalRef<jobject> BookmarksBridge::GetBookmarkByID(JNIEnv* env,
+                                                             jobject obj,
+                                                             jlong id,
+                                                             jint type) {
+  DCHECK(IsLoaded());
+  return CreateJavaBookmark(GetNodeByID(id, type));
+}
+
+void BookmarksBridge::GetPermanentNodeIDs(JNIEnv* env,
+                                          jobject obj,
+                                          jobject j_result_obj) {
+  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::GetChildIDs(JNIEnv* env,
+                                  jobject obj,
+                                  jlong id,
+                                  jint type,
+                                  jboolean get_folders,
+                                  jboolean get_bookmarks,
+                                  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::PARTNER);
+  }
+}
+
+void BookmarksBridge::GetAllBookmarkIDsOrderedByCreationDate(
+    JNIEnv* env,
+    jobject obj,
+    jobject j_result_obj) {
+  DCHECK(IsLoaded());
+  std::list<const BookmarkNode*> folders;
+  std::vector<const BookmarkNode*> result;
+  folders.push_back(bookmark_model_->root_node());
+  folders.push_back(partner_bookmarks_shim_->GetPartnerBookmarksRoot());
+
+  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 (!IsFolderAvailable(child) || !IsReachable(child))
+        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,
+                                       jobject obj,
+                                       jlong id,
+                                       jint type,
+                                       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,
+                                     jobject obj,
+                                     jlong id,
+                                     jint type,
+                                     jstring url) {
+  DCHECK(IsLoaded());
+  bookmark_model_->SetURL(
+      GetNodeByID(id, type),
+      GURL(base::android::ConvertJavaStringToUTF16(env, url)));
+}
+
+bool BookmarksBridge::DoesBookmarkExist(JNIEnv* env,
+                                        jobject obj,
+                                        jlong id,
+                                        jint type) {
+  DCHECK(IsLoaded());
+  return GetNodeByID(id, type);
+}
+
 void BookmarksBridge::GetBookmarksForFolder(JNIEnv* env,
                                             jobject obj,
                                             jobject j_folder_id_obj,
                                             jobject j_callback_obj,
                                             jobject j_result_obj) {
   DCHECK(IsLoaded());
-  long folder_id = Java_BookmarkId_getId(env, j_folder_id_obj);
-  int type = Java_BookmarkId_getType(env, j_folder_id_obj);
+  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))
@@ -123,8 +295,10 @@ void BookmarksBridge::GetBookmarksForFolder(JNIEnv* env,
         j_result_obj);
   }
 
-  Java_BookmarksCallback_onBookmarksAvailable(
-      env, j_callback_obj, j_folder_id_obj, j_result_obj);
+  if (j_callback_obj) {
+    Java_BookmarksCallback_onBookmarksAvailable(
+        env, j_callback_obj, j_folder_id_obj, j_result_obj);
+  }
 }
 
 void BookmarksBridge::GetCurrentFolderHierarchy(JNIEnv* env,
@@ -133,8 +307,8 @@ void BookmarksBridge::GetCurrentFolderHierarchy(JNIEnv* env,
                                                 jobject j_callback_obj,
                                                 jobject j_result_obj) {
   DCHECK(IsLoaded());
-  long folder_id = Java_BookmarkId_getId(env, j_folder_id_obj);
-  int type = Java_BookmarkId_getType(env, j_folder_id_obj);
+  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))
@@ -163,8 +337,8 @@ void BookmarksBridge::DeleteBookmark(JNIEnv* env,
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
   DCHECK(IsLoaded());
 
-  long bookmark_id = Java_BookmarkId_getId(env, j_bookmark_id_obj);
-  int type = Java_BookmarkId_getType(env, j_bookmark_id_obj);
+  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();
@@ -187,15 +361,15 @@ void BookmarksBridge::MoveBookmark(JNIEnv* env,
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
   DCHECK(IsLoaded());
 
-  long bookmark_id = Java_BookmarkId_getId(env, j_bookmark_id_obj);
-  int type = Java_BookmarkId_getType(env, j_bookmark_id_obj);
+  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 = Java_BookmarkId_getId(env, j_parent_id_obj);
-  type = Java_BookmarkId_getType(env, j_parent_id_obj);
+  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);
 }
@@ -235,11 +409,12 @@ void BookmarksBridge::ExtractBookmarkNodeInformation(const BookmarkNode* node,
 
 const BookmarkNode* BookmarksBridge::GetNodeByID(long node_id, int type) {
   const BookmarkNode* node;
-  if (type == kBookmarkTypePartner) {
+  if (type == BookmarkType::PARTNER) {
     node = partner_bookmarks_shim_->GetNodeByID(
         static_cast<int64>(node_id));
   } else {
-    node = GetBookmarkNodeByID(bookmark_model_, static_cast<int64>(node_id));
+    node = bookmarks::GetBookmarkNodeByID(bookmark_model_,
+                                          static_cast<int64>(node_id));
   }
   return node;
 }
@@ -284,9 +459,9 @@ const BookmarkNode* BookmarksBridge::GetParentNode(const BookmarkNode* node) {
 
 int BookmarksBridge::GetBookmarkType(const BookmarkNode* node) {
   if (partner_bookmarks_shim_->IsPartnerBookmark(node))
-    return kBookmarkTypePartner;
+    return BookmarkType::PARTNER;
   else
-    return kBookmarkTypeNormal;
+    return BookmarkType::NORMAL;
 }
 
 base::string16 BookmarksBridge::GetTitle(const BookmarkNode* node) const {