Index: chrome/browser/android/enhanced_bookmarks/enhanced_bookmarks_bridge.cc |
diff --git a/chrome/browser/android/enhanced_bookmarks/enhanced_bookmarks_bridge.cc b/chrome/browser/android/enhanced_bookmarks/enhanced_bookmarks_bridge.cc |
index dc3fd1cf517971d0a92ee2ba5ef423cfb8fff4af..3f803e3b7a3aa93ac37302e11b8bdc5eadcc11d6 100644 |
--- a/chrome/browser/android/enhanced_bookmarks/enhanced_bookmarks_bridge.cc |
+++ b/chrome/browser/android/enhanced_bookmarks/enhanced_bookmarks_bridge.cc |
@@ -6,20 +6,28 @@ |
#include "base/android/jni_array.h" |
#include "base/android/jni_string.h" |
+#include "base/prefs/pref_service.h" |
#include "chrome/browser/bookmarks/bookmark_model_factory.h" |
#include "chrome/browser/enhanced_bookmarks/chrome_bookmark_server_cluster_service.h" |
#include "chrome/browser/enhanced_bookmarks/chrome_bookmark_server_cluster_service_factory.h" |
#include "chrome/browser/enhanced_bookmarks/enhanced_bookmark_model_factory.h" |
#include "chrome/browser/profiles/profile_android.h" |
#include "chrome/common/chrome_version_info.h" |
+#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_id.h" |
#include "components/bookmarks/common/android/bookmark_type.h" |
#include "components/enhanced_bookmarks/enhanced_bookmark_model.h" |
+#include "content/public/browser/browser_thread.h" |
#include "jni/EnhancedBookmarksBridge_jni.h" |
using base::android::AttachCurrentThread; |
+using bookmarks::android::JavaBookmarkIdCreateBookmarkId; |
+using bookmarks::android::JavaBookmarkIdGetId; |
+using bookmarks::android::JavaBookmarkIdGetType; |
using bookmarks::BookmarkType; |
+using content::BrowserThread; |
namespace enhanced_bookmarks { |
namespace android { |
@@ -96,6 +104,78 @@ ScopedJavaLocalRef<jobjectArray> EnhancedBookmarksBridge::GetFilters( |
return base::android::ToJavaArrayOfStrings(env, filters); |
} |
+ScopedJavaLocalRef<jobject> EnhancedBookmarksBridge::AddFolder(JNIEnv* env, |
+ jobject obj, |
+ jobject j_parent_id_obj, |
+ jint index, |
+ jstring j_title) { |
+ DCHECK(enhanced_bookmark_model_->loaded()); |
+ long bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj); |
+ const BookmarkNode* parent = bookmarks::GetBookmarkNodeByID( |
+ enhanced_bookmark_model_->bookmark_model(), |
+ static_cast<int64>(bookmark_id)); |
+ const BookmarkNode* new_node = enhanced_bookmark_model_->AddFolder( |
+ parent, index, base::android::ConvertJavaStringToUTF16(env, j_title)); |
+ if (!new_node) { |
+ NOTREACHED(); |
+ return ScopedJavaLocalRef<jobject>(); |
+ } |
+ ScopedJavaLocalRef<jobject> new_java_obj = |
+ JavaBookmarkIdCreateBookmarkId(env, new_node->id(), new_node->type()); |
+ return new_java_obj; |
+} |
+ |
+void EnhancedBookmarksBridge::MoveBookmark(JNIEnv* env, |
+ jobject obj, |
+ jobject j_bookmark_id_obj, |
+ jobject j_parent_id_obj, |
+ jint index) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(enhanced_bookmark_model_->loaded()); |
+ |
+ long bookmark_id = JavaBookmarkIdGetId(env, j_bookmark_id_obj); |
+ const BookmarkNode* node = bookmarks::GetBookmarkNodeByID( |
+ enhanced_bookmark_model_->bookmark_model(), |
+ static_cast<int64>(bookmark_id)); |
+ if (!IsEditable(node)) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj); |
+ const BookmarkNode* new_parent_node = bookmarks::GetBookmarkNodeByID( |
+ enhanced_bookmark_model_->bookmark_model(), |
+ static_cast<int64>(bookmark_id)); |
+ enhanced_bookmark_model_->Move(node, new_parent_node, index); |
+} |
+ |
+ScopedJavaLocalRef<jobject> EnhancedBookmarksBridge::AddBookmark( |
+ JNIEnv* env, |
+ jobject obj, |
+ jobject j_parent_id_obj, |
+ jint index, |
+ jstring j_title, |
+ jstring j_url) { |
+ DCHECK(enhanced_bookmark_model_->loaded()); |
+ long bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj); |
+ const BookmarkNode* parent = bookmarks::GetBookmarkNodeByID( |
+ enhanced_bookmark_model_->bookmark_model(), |
+ static_cast<int64>(bookmark_id)); |
+ |
+ const BookmarkNode* new_node = enhanced_bookmark_model_->AddURL( |
+ parent, |
+ index, |
+ base::android::ConvertJavaStringToUTF16(env, j_title), |
+ GURL(base::android::ConvertJavaStringToUTF16(env, j_url)), |
+ base::Time::Now()); |
+ if (!new_node) { |
+ NOTREACHED(); |
+ return ScopedJavaLocalRef<jobject>(); |
+ } |
+ ScopedJavaLocalRef<jobject> new_java_obj = |
+ JavaBookmarkIdCreateBookmarkId(env, new_node->id(), new_node->type()); |
+ return new_java_obj; |
+} |
+ |
void EnhancedBookmarksBridge::OnChange(BookmarkServerService* service) { |
DCHECK(enhanced_bookmark_model_->loaded()); |
JNIEnv* env = AttachCurrentThread(); |
@@ -107,6 +187,15 @@ void EnhancedBookmarksBridge::OnChange(BookmarkServerService* service) { |
Java_EnhancedBookmarksBridge_onFiltersChanged(env, obj.obj()); |
} |
+bool EnhancedBookmarksBridge::IsEditable(const BookmarkNode* node) const { |
Yaron
2014/10/29 21:50:43
BookmarksBridge::IsEditable has additional safety
danduong
2014/10/29 22:13:40
That's still the right layer. We haven't added any
danduong
2014/10/29 23:54:26
This layer.
|
+ if (!node || (node->type() != BookmarkNode::FOLDER && |
+ node->type() != BookmarkNode::URL)) { |
+ return false; |
+ } |
+ return profile_->GetPrefs()->GetBoolean( |
+ bookmarks::prefs::kEditBookmarksEnabled); |
+} |
+ |
static jlong Init(JNIEnv* env, jobject obj, jobject j_profile) { |
return reinterpret_cast<jlong>(new EnhancedBookmarksBridge( |
env, obj, ProfileAndroid::FromProfileAndroid(j_profile))); |