summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcramya@chromium.org <cramya@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-19 21:14:23 +0000
committercramya@chromium.org <cramya@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-19 21:14:23 +0000
commitc7f8da06fa5494659d0d9d68b5e3ff402be955c5 (patch)
treeea3bd61a589477e1f3ce0e0be291fa53977d715b
parent60749e1c3bc06c226a427f82363acc71ec976d03 (diff)
downloadchromium_src-c7f8da06fa5494659d0d9d68b5e3ff402be955c5.zip
chromium_src-c7f8da06fa5494659d0d9d68b5e3ff402be955c5.tar.gz
chromium_src-c7f8da06fa5494659d0d9d68b5e3ff402be955c5.tar.bz2
This CL contains the native methods to extract bookmark information,
folder details and the favicon information. Review URL: https://chromiumcodereview.appspot.com/22470009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@218321 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java227
-rw-r--r--chrome/browser/android/bookmarks_bridge.cc138
-rw-r--r--chrome/browser/android/bookmarks_bridge.h59
-rw-r--r--chrome/browser/android/chrome_jni_registrar.cc2
-rw-r--r--chrome/chrome_browser.gypi3
5 files changed, 429 insertions, 0 deletions
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java
new file mode 100644
index 0000000..db0c485
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java
@@ -0,0 +1,227 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser;
+
+import org.chromium.base.CalledByNative;
+import org.chromium.chrome.browser.profiles.Profile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Handler to fetch the bookmarks, titles, urls and folder hierarchy.
+ */
+public class BookmarksBridge {
+
+ private final Profile mProfile;
+ private int mNativeBookmarksBridge;
+ private boolean mIsNativeBookmarkModelLoaded;
+ private List<DelayedBookmarkCallback> mDelayedBookmarkCallbacks =
+ new ArrayList<DelayedBookmarkCallback>();
+
+ /**
+ * Interface for callback object for fetching bookmarks and folder hierarchy.
+ */
+ public interface BookmarksCallback {
+
+ /**
+ * Callback method for fetching bookmarks for a folder and the folder hierarchy.
+ * @param folderId The folder id to which the bookmarks belong.
+ * @param bookmarksList List holding the fetched bookmarks and details.
+ */
+ @CalledByNative("BookmarksCallback")
+ public void onBookmarksAvailable(long folderId, List<BookmarkItem> bookmarksList);
+
+ /**
+ * Callback method for fetching the folder hierarchy.
+ * @param folderId The folder id to which the bookmarks belong.
+ * @param bookmarksList List holding the fetched folder details.
+ */
+ @CalledByNative("BookmarksCallback")
+ public void onBookmarksFolderHierarchyAvailable(long folderId,
+ List<BookmarkItem> bookmarksList);
+
+ }
+
+ /**
+ * Handler to fetch the bookmarks, titles, urls and folder hierarchy.
+ * @param profile Profile instance corresponding to the active profile.
+ */
+ public BookmarksBridge(Profile profile) {
+ mProfile = profile;
+ mNativeBookmarksBridge = nativeInit(profile);
+ }
+
+ /**
+ * Destroys this instance so no further calls can be executed.
+ */
+ public void destroy() {
+ if (mNativeBookmarksBridge != 0) {
+ nativeDestroy(mNativeBookmarksBridge);
+ mNativeBookmarksBridge = 0;
+ mIsNativeBookmarkModelLoaded = false;
+ }
+ }
+
+ /**
+ * Fetches the bookmarks of the current folder. Callback will be
+ * synchronous if the bookmark model is already loaded and async if it is loaded in the
+ * background.
+ * @param folderId The current folder id.
+ * @param callback Instance of a callback object.
+ */
+ public void getBookmarksForFolder(long folderId, BookmarksCallback callback) {
+ if (mIsNativeBookmarkModelLoaded) {
+ nativeGetBookmarksForFolder(mNativeBookmarksBridge, folderId, callback,
+ new ArrayList<BookmarkItem>());
+ } else {
+ mDelayedBookmarkCallbacks.add(new DelayedBookmarkCallback(folderId, callback,
+ DelayedBookmarkCallback.GET_BOOKMARKS_FOR_FOLDER, this));
+ }
+ }
+
+ /**
+ * Fetches the folder hierarchy of the given folder. Callback will be
+ * synchronous if the bookmark model is already loaded and async if it is loaded in the
+ * background.
+ * @param folderId The current folder id.
+ * @param callback Instance of a callback object.
+ */
+ public void getCurrentFolderHierarchy(long folderId, BookmarksCallback callback) {
+ if (mIsNativeBookmarkModelLoaded) {
+ nativeGetCurrentFolderHierarchy(mNativeBookmarksBridge, folderId, callback,
+ new ArrayList<BookmarkItem>());
+ } else {
+ mDelayedBookmarkCallbacks.add(new DelayedBookmarkCallback(folderId, callback,
+ DelayedBookmarkCallback.GET_CURRENT_FOLDER_HIERARCHY, this));
+ }
+ }
+
+ @CalledByNative
+ public void bookmarkModelLoaded() {
+ mIsNativeBookmarkModelLoaded = true;
+ if (!mDelayedBookmarkCallbacks.isEmpty()) {
+ for (int i = 0; i < mDelayedBookmarkCallbacks.size(); i++) {
+ mDelayedBookmarkCallbacks.get(i).callCallbackMethod();
+ }
+ mDelayedBookmarkCallbacks.clear();
+ }
+ }
+
+ @CalledByNative
+ public void bookmarkModelDeleted() {
+ destroy();
+ }
+
+ @CalledByNative
+ private static void create(List<BookmarkItem> bookmarksList, long id, String title, String url,
+ boolean isFolder, long parentId) {
+ bookmarksList.add(new BookmarkItem(id, title, url, isFolder, parentId));
+ }
+
+ private native void nativeGetBookmarksForFolder(int nativeBookmarksBridge,
+ long folderId, BookmarksCallback callback,
+ List<BookmarkItem> bookmarksList);
+ private native void nativeGetCurrentFolderHierarchy(int nativeBookmarksBridge,
+ long folderId, BookmarksCallback callback,
+ List<BookmarkItem> bookmarksList);
+ private native int nativeInit(Profile profile);
+ private native void nativeDestroy(int nativeBookmarksBridge);
+
+ /**
+ * Simple object representing the bookmark item.
+ */
+ public static class BookmarkItem {
+
+ private final String mTitle;
+ private final String mUrl;
+ private final long mId;
+ private final boolean mIsFolder;
+ private final long mParentId;
+
+ private BookmarkItem(long id, String title, String url, boolean isFolder, long parentId) {
+ mId = id;
+ mTitle = title;
+ mUrl = url;
+ mIsFolder = isFolder;
+ mParentId = parentId;
+ }
+
+ /**
+ * @return Title of the bookmark item.
+ */
+ public String getTitle() {
+ return mTitle;
+ }
+
+ /**
+ * @return Url of the bookmark item.
+ */
+ public String getUrl() {
+ return mUrl;
+ }
+
+ /**
+ * @return Id of the bookmark item.
+ */
+ public long getId() {
+ return mId;
+ }
+
+ /**
+ * @return Whether item is a folder or a bookmark.
+ */
+ public boolean isFolder() {
+ return mIsFolder;
+ }
+
+ /**
+ * @return Parent id of the bookmark item.
+ */
+ public long getParentId() {
+ return mParentId;
+ }
+ }
+
+ /**
+ * Details about callbacks that need to be called once the bookmark model has loaded.
+ */
+ private static class DelayedBookmarkCallback {
+
+ private static final int GET_BOOKMARKS_FOR_FOLDER = 0;
+ private static final int GET_CURRENT_FOLDER_HIERARCHY = 1;
+
+ private final BookmarksCallback mCallback;
+ private final long mFolderId;
+ private final int mCallbackMethod;
+ private final BookmarksBridge mHandler;
+
+ private DelayedBookmarkCallback(long folderId, BookmarksCallback callback, int method,
+ BookmarksBridge handler) {
+ mFolderId = folderId;
+ mCallback = callback;
+ mCallbackMethod = method;
+ mHandler = handler;
+ }
+
+ /**
+ * Invoke the callback method.
+ */
+ private void callCallbackMethod() {
+ switch(mCallbackMethod) {
+ case GET_BOOKMARKS_FOR_FOLDER:
+ mHandler.getBookmarksForFolder(mFolderId, mCallback);
+ break;
+ case GET_CURRENT_FOLDER_HIERARCHY:
+ mHandler.getCurrentFolderHierarchy(mFolderId, mCallback);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+}
+
diff --git a/chrome/browser/android/bookmarks_bridge.cc b/chrome/browser/android/bookmarks_bridge.cc
new file mode 100644
index 0000000..c957358
--- /dev/null
+++ b/chrome/browser/android/bookmarks_bridge.cc
@@ -0,0 +1,138 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/android/bookmarks_bridge.h"
+
+#include "base/android/jni_string.h"
+#include "chrome/browser/bookmarks/bookmark_model.h"
+#include "chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_android.h"
+#include "content/public/browser/browser_thread.h"
+#include "jni/BookmarksBridge_jni.h"
+
+using base::android::AttachCurrentThread;
+using base::android::ConvertUTF8ToJavaString;
+using base::android::ConvertUTF16ToJavaString;
+using base::android::ScopedJavaGlobalRef;
+using content::BrowserThread;
+
+BookmarksBridge::BookmarksBridge(JNIEnv* env,
+ jobject obj,
+ jobject j_profile)
+ : weak_java_ref_(env, obj) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
+ bookmark_model_ = BookmarkModelFactory::GetForProfile(profile);
+ // Registers the notifications we are interested.
+ bookmark_model_->AddObserver(this);
+ if (bookmark_model_->loaded()) {
+ Java_BookmarksBridge_bookmarkModelLoaded(env, obj);
+ }
+}
+
+BookmarksBridge::~BookmarksBridge() {
+ bookmark_model_->RemoveObserver(this);
+}
+
+void BookmarksBridge::Destroy(JNIEnv*, jobject) {
+ delete this;
+}
+
+// static
+bool BookmarksBridge::RegisterBookmarksBridge(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+static jint Init(JNIEnv* env, jobject obj, jobject j_profile) {
+ BookmarksBridge* delegate = new BookmarksBridge(env, obj, j_profile);
+ return reinterpret_cast<jint>(delegate);
+}
+
+void BookmarksBridge::GetBookmarksForFolder(JNIEnv* env,
+ jobject obj,
+ jlong folder_id,
+ jobject j_callback_obj,
+ jobject j_result_obj) {
+ DCHECK(bookmark_model_->loaded());
+ const BookmarkNode* folder = GetFolderNodeFromId(folder_id);
+ // Get the folder contents
+ for (int i = 0; i < folder->child_count(); ++i) {
+ const BookmarkNode* node = folder->GetChild(i);
+ ExtractBookmarkNodeInformation(node, j_result_obj);
+ }
+
+ Java_BookmarksCallback_onBookmarksAvailable(
+ env, j_callback_obj, folder->id(), j_result_obj);
+}
+
+void BookmarksBridge::GetCurrentFolderHierarchy(JNIEnv* env,
+ jobject obj,
+ jlong folder_id,
+ jobject j_callback_obj,
+ jobject j_result_obj) {
+ DCHECK(bookmark_model_->loaded());
+ const BookmarkNode* folder = GetFolderNodeFromId(folder_id);
+ // Get the folder heirarchy
+ const BookmarkNode* node = folder;
+ while (node) {
+ ExtractBookmarkNodeInformation(node, j_result_obj);
+ node = node->parent();
+ }
+
+ Java_BookmarksCallback_onBookmarksFolderHierarchyAvailable(
+ env, j_callback_obj, folder->id(), j_result_obj);
+}
+
+void BookmarksBridge::ExtractBookmarkNodeInformation(
+ const BookmarkNode* node,
+ jobject j_result_obj) {
+ JNIEnv* env = AttachCurrentThread();
+ const BookmarkNode* parent = node->parent();
+ int64 parent_id = -1;
+ if (parent)
+ parent_id = node->parent()->id();
+ std::string url;
+ if (node->is_url())
+ url = node->url().spec();
+ Java_BookmarksBridge_create(
+ env, j_result_obj, node->id(),
+ ConvertUTF16ToJavaString(env, node->GetTitle()).obj(),
+ ConvertUTF8ToJavaString(env, url).obj(),
+ node->is_folder(), parent_id);
+}
+
+const BookmarkNode* BookmarksBridge::GetFolderNodeFromId(jlong folder_id) {
+ const BookmarkNode* folder;
+ if (folder_id == -1) {
+ folder = bookmark_model_->mobile_node();
+ } else {
+ folder = bookmark_model_->GetNodeByID(
+ static_cast<int64>(folder_id));
+ }
+ if (!folder)
+ folder = bookmark_model_->mobile_node();
+ return folder;
+}
+
+// ------------- Observer-related methods ------------- //
+
+void BookmarksBridge::BookmarkModelChanged() {
+}
+
+void BookmarksBridge::Loaded(BookmarkModel* model, bool ids_reassigned) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
+ if (obj.is_null())
+ return;
+ Java_BookmarksBridge_bookmarkModelLoaded(env, obj.obj());
+}
+
+void BookmarksBridge::BookmarkModelBeingDeleted(BookmarkModel* model) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
+ if (obj.is_null())
+ return;
+ Java_BookmarksBridge_bookmarkModelDeleted(env, obj.obj());
+}
diff --git a/chrome/browser/android/bookmarks_bridge.h b/chrome/browser/android/bookmarks_bridge.h
new file mode 100644
index 0000000..ad8d8f6
--- /dev/null
+++ b/chrome/browser/android/bookmarks_bridge.h
@@ -0,0 +1,59 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ANDROID_BOOKMARKS_BRIDGE_H_
+#define CHROME_BROWSER_ANDROID_BOOKMARKS_BRIDGE_H_
+
+#include <jni.h>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_helper.h"
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "chrome/browser/bookmarks/base_bookmark_model_observer.h"
+
+class Profile;
+
+// The delegate to fetch bookmarks information for the Android native
+// bookmark page. This fetches the bookmarks, title, urls, folder
+// hierarchy.
+class BookmarksBridge : public BaseBookmarkModelObserver {
+ public:
+ BookmarksBridge(JNIEnv* env, jobject obj, jobject j_profile);
+ void Destroy(JNIEnv*, jobject);
+
+ static bool RegisterBookmarksBridge(JNIEnv* env);
+
+ void GetBookmarksForFolder(JNIEnv* env,
+ jobject obj,
+ jlong folder_id,
+ jobject j_callback_obj,
+ jobject j_result_obj);
+
+ void GetCurrentFolderHierarchy(JNIEnv* env,
+ jobject obj,
+ jlong folder_id,
+ jobject j_callback_obj,
+ jobject j_result_obj);
+
+ private:
+ virtual ~BookmarksBridge();
+
+ void ExtractBookmarkNodeInformation(
+ const BookmarkNode* node,
+ jobject j_result_obj);
+ const BookmarkNode* GetFolderNodeFromId(jlong folder_id);
+
+ // Override BaseBookmarkModelObserver.
+ virtual void BookmarkModelChanged() OVERRIDE;
+ virtual void Loaded(BookmarkModel* model, bool ids_reassigned) OVERRIDE;
+ virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE;
+
+ JavaObjectWeakGlobalRef weak_java_ref_;
+ BookmarkModel* bookmark_model_;
+
+ DISALLOW_COPY_AND_ASSIGN(BookmarksBridge);
+};
+
+#endif // CHROME_BROWSER_ANDROID_BOOKMARKS_BRIDGE_H_
diff --git a/chrome/browser/android/chrome_jni_registrar.cc b/chrome/browser/android/chrome_jni_registrar.cc
index a35d641..b1afd29 100644
--- a/chrome/browser/android/chrome_jni_registrar.cc
+++ b/chrome/browser/android/chrome_jni_registrar.cc
@@ -7,6 +7,7 @@
#include "base/android/jni_android.h"
#include "base/android/jni_registrar.h"
#include "base/debug/trace_event.h"
+#include "chrome/browser/android/bookmarks_bridge.h"
#include "chrome/browser/android/chrome_web_contents_delegate_android.h"
#include "chrome/browser/android/content_view_util.h"
#include "chrome/browser/android/dev_tools_server.h"
@@ -64,6 +65,7 @@ static base::android::RegistrationMethod kChromeRegisteredMethods[] = {
autofill::AutofillDialogResult::RegisterAutofillDialogResult },
{ "AutofillPopup",
autofill::AutofillPopupViewAndroid::RegisterAutofillPopupViewAndroid },
+ { "BookmarksBridge", BookmarksBridge::RegisterBookmarksBridge },
{ "CertificateViewer", RegisterCertificateViewer },
{ "ChromeBrowserProvider",
ChromeBrowserProvider::RegisterChromeBrowserProvider },
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index debdb7b..ae4a0fe 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -85,6 +85,8 @@
'browser/accessibility/accessibility_events.h',
'browser/accessibility/invert_bubble_prefs.cc',
'browser/accessibility/invert_bubble_prefs.h',
+ 'browser/android/bookmarks_bridge.cc',
+ 'browser/android/bookmarks_bridge.h',
'browser/android/chrome_jni_registrar.cc',
'browser/android/chrome_jni_registrar.h',
'browser/android/chrome_startup_flags.cc',
@@ -3420,6 +3422,7 @@
'android/java/src/org/chromium/chrome/browser/autofill/AutofillDialogResult.java',
'android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupGlue.java',
'android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java',
+ 'android/java/src/org/chromium/chrome/browser/BookmarksBridge.java',
'android/java/src/org/chromium/chrome/browser/CertificateViewer.java',
'android/java/src/org/chromium/chrome/browser/ChromeBrowserProvider.java',
'android/java/src/org/chromium/chrome/browser/ChromeHttpAuthHandler.java',