1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_ANDROID_PROVIDER_CHROME_BROWSER_PROVIDER_H_
6 #define CHROME_BROWSER_ANDROID_PROVIDER_CHROME_BROWSER_PROVIDER_H_
8 #include "base/android/jni_helper.h"
9 #include "base/android/scoped_java_ref.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/synchronization/waitable_event.h"
12 #include "chrome/browser/bookmarks/base_bookmark_model_observer.h"
13 #include "chrome/browser/common/cancelable_request.h"
14 #include "chrome/browser/history/android/android_history_types.h"
15 #include "chrome/common/cancelable_task_tracker.h"
16 #include "content/public/browser/notification_observer.h"
17 #include "content/public/browser/notification_registrar.h"
19 class AndroidHistoryProviderService;
31 // This class implements the native methods of ChromeBrowserProvider.java
32 class ChromeBrowserProvider : public BaseBookmarkModelObserver,
33 public content::NotificationObserver {
35 ChromeBrowserProvider(JNIEnv* env, jobject obj);
36 void Destroy(JNIEnv*, jobject);
39 static bool RegisterChromeBrowserProvider(JNIEnv* env);
41 // Adds either a new bookmark or bookmark folder based on |is_folder|. The
42 // bookmark is added to the beginning of the specified parent and if the
43 // parent ID is not valid (i.e. < 0) then it will be added to the bookmark
45 jlong AddBookmark(JNIEnv* env, jobject,
51 // Removes a bookmark (or folder) with the specified ID.
52 jint RemoveBookmark(JNIEnv*, jobject, jlong id);
54 // Updates a bookmark (or folder) with the the new title and new URL.
55 // The |url| field will be ignored if the bookmark node is a folder.
56 // If a valid |parent_id| (>= 0) different from the currently specified
57 // parent is given, the node will be moved to that folder as the first
59 jint UpdateBookmark(JNIEnv* env,
66 // The below are methods to support Android public API.
67 // Bookmark and history APIs. -----------------------------------------------
68 jlong AddBookmarkFromAPI(JNIEnv* env,
79 base::android::ScopedJavaLocalRef<jobject> QueryBookmarkFromAPI(
82 jobjectArray projection,
84 jobjectArray selection_args,
87 jint UpdateBookmarkFromAPI(JNIEnv* env,
98 jobjectArray selection_args);
100 jint RemoveBookmarkFromAPI(JNIEnv* env,
103 jobjectArray selection_args);
105 jint RemoveHistoryFromAPI(JNIEnv* env,
108 jobjectArray selection_args);
110 jlong AddSearchTermFromAPI(JNIEnv* env,
115 base::android::ScopedJavaLocalRef<jobject> QuerySearchTermFromAPI(
118 jobjectArray projection,
120 jobjectArray selection_args,
123 jint RemoveSearchTermFromAPI(JNIEnv* env,
126 jobjectArray selection_args);
128 jint UpdateSearchTermFromAPI(JNIEnv* env,
133 jobjectArray selection_args);
135 // Custom provider API methods. ---------------------------------------------
136 jlong CreateBookmarksFolderOnce(JNIEnv* env,
141 void RemoveAllBookmarks(JNIEnv* env, jobject obj);
143 base::android::ScopedJavaLocalRef<jobject> GetAllBookmarkFolders(JNIEnv* env,
146 base::android::ScopedJavaLocalRef<jobject> GetBookmarkNode(
151 jboolean get_children);
153 base::android::ScopedJavaLocalRef<jobject> GetMobileBookmarksFolder(
157 jboolean IsBookmarkInMobileBookmarksBranch(JNIEnv* env,
161 jboolean BookmarkNodeExists(JNIEnv* env,
165 base::android::ScopedJavaLocalRef<jbyteArray> GetFaviconOrTouchIcon(
170 base::android::ScopedJavaLocalRef<jbyteArray> GetThumbnail(JNIEnv* env,
175 virtual ~ChromeBrowserProvider();
177 // Override BaseBookmarkModelObserver.
178 virtual void BookmarkModelChanged() OVERRIDE;
179 virtual void ExtensiveBookmarkChangesBeginning(BookmarkModel* model) OVERRIDE;
180 virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE;
182 // Override NotificationObserver.
183 virtual void Observe(int type,
184 const content::NotificationSource& source,
185 const content::NotificationDetails& details) OVERRIDE;
187 JavaObjectWeakGlobalRef weak_java_provider_;
190 BookmarkModel* bookmark_model_;
191 history::TopSites* top_sites_;
193 scoped_ptr<AndroidHistoryProviderService> service_;
194 scoped_ptr<FaviconService> favicon_service_;
196 // Different cancelable request consumers must be used for each service.
197 // This because a synchronization issue that could lead to flaky assertion
198 // failures otherwise.
199 // TODO(leandrogracia): use a single consumer once http://crbug.com/85970
201 CancelableRequestConsumer android_history_consumer_;
202 CancelableRequestConsumer favicon_consumer_;
204 CancelableTaskTracker cancelable_task_tracker_;
206 // Used to register/unregister notification observer.
207 content::NotificationRegistrar notification_registrar_;
209 bool handling_extensive_changes_;
211 DISALLOW_COPY_AND_ASSIGN(ChromeBrowserProvider);
214 #endif // CHROME_BROWSER_ANDROID_PROVIDER_CHROME_BROWSER_PROVIDER_H_