diff options
author | cramya@chromium.org <cramya@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-19 21:14:23 +0000 |
---|---|---|
committer | cramya@chromium.org <cramya@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-19 21:14:23 +0000 |
commit | c7f8da06fa5494659d0d9d68b5e3ff402be955c5 (patch) | |
tree | ea3bd61a589477e1f3ce0e0be291fa53977d715b | |
parent | 60749e1c3bc06c226a427f82363acc71ec976d03 (diff) | |
download | chromium_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.java | 227 | ||||
-rw-r--r-- | chrome/browser/android/bookmarks_bridge.cc | 138 | ||||
-rw-r--r-- | chrome/browser/android/bookmarks_bridge.h | 59 | ||||
-rw-r--r-- | chrome/browser/android/chrome_jni_registrar.cc | 2 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 3 |
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', |