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. 4 5 #ifndef CHROME_BROWSER_ANDROID_PROVIDER_CHROME_BROWSER_PROVIDER_H_ 6 #define CHROME_BROWSER_ANDROID_PROVIDER_CHROME_BROWSER_PROVIDER_H_ 7 8 #include "base/android/jni_weak_ref.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 "base/task/cancelable_task_tracker.h" 13 #include "components/bookmarks/browser/base_bookmark_model_observer.h" 14 #include "components/history/core/android/android_history_types.h" 15 #include "content/public/browser/notification_observer.h" 16 #include "content/public/browser/notification_registrar.h" 17 18 class AndroidHistoryProviderService; 19 class FaviconService; 20 class Profile; 21 22 namespace history { 23 class TopSites; 24 } 25 26 namespace sql { 27 class Statement; 28 } 29 30 // This class implements the native methods of ChromeBrowserProvider.java 31 class ChromeBrowserProvider : public BaseBookmarkModelObserver, 32 public content::NotificationObserver { 33 public: 34 ChromeBrowserProvider(JNIEnv* env, jobject obj); 35 void Destroy(JNIEnv*, jobject); 36 37 // JNI registration. 38 static bool RegisterChromeBrowserProvider(JNIEnv* env); 39 40 // Adds either a new bookmark or bookmark folder based on |is_folder|. The 41 // bookmark is added to the beginning of the specified parent and if the 42 // parent ID is not valid (i.e. < 0) then it will be added to the bookmark 43 // bar. 44 jlong AddBookmark(JNIEnv* env, jobject, 45 jstring jurl, 46 jstring jtitle, 47 jboolean is_folder, 48 jlong parent_id); 49 50 // Removes a bookmark (or folder) with the specified ID. 51 jint RemoveBookmark(JNIEnv*, jobject, jlong id); 52 53 // Updates a bookmark (or folder) with the the new title and new URL. 54 // The |url| field will be ignored if the bookmark node is a folder. 55 // If a valid |parent_id| (>= 0) different from the currently specified 56 // parent is given, the node will be moved to that folder as the first 57 // child. 58 jint UpdateBookmark(JNIEnv* env, 59 jobject, 60 jlong id, 61 jstring url, 62 jstring title, 63 jlong parent_id); 64 65 // The below are methods to support Android public API. 66 // Bookmark and history APIs. ----------------------------------------------- 67 jlong AddBookmarkFromAPI(JNIEnv* env, 68 jobject obj, 69 jstring url, 70 jobject created, 71 jobject isBookmark, 72 jobject date, 73 jbyteArray favicon, 74 jstring title, 75 jobject visits, 76 jlong parent_id); 77 78 base::android::ScopedJavaLocalRef<jobject> QueryBookmarkFromAPI( 79 JNIEnv* env, 80 jobject obj, 81 jobjectArray projection, 82 jstring selections, 83 jobjectArray selection_args, 84 jstring sort_order); 85 86 jint UpdateBookmarkFromAPI(JNIEnv* env, 87 jobject obj, 88 jstring url, 89 jobject created, 90 jobject isBookmark, 91 jobject date, 92 jbyteArray favicon, 93 jstring title, 94 jobject visits, 95 jlong parent_id, 96 jstring selections, 97 jobjectArray selection_args); 98 99 jint RemoveBookmarkFromAPI(JNIEnv* env, 100 jobject obj, 101 jstring selections, 102 jobjectArray selection_args); 103 104 jint RemoveHistoryFromAPI(JNIEnv* env, 105 jobject obj, 106 jstring selections, 107 jobjectArray selection_args); 108 109 jlong AddSearchTermFromAPI(JNIEnv* env, 110 jobject obj, 111 jstring search_term, 112 jobject date); 113 114 base::android::ScopedJavaLocalRef<jobject> QuerySearchTermFromAPI( 115 JNIEnv* env, 116 jobject obj, 117 jobjectArray projection, 118 jstring selections, 119 jobjectArray selection_args, 120 jstring sort_order); 121 122 jint RemoveSearchTermFromAPI(JNIEnv* env, 123 jobject obj, 124 jstring selections, 125 jobjectArray selection_args); 126 127 jint UpdateSearchTermFromAPI(JNIEnv* env, 128 jobject obj, 129 jstring search_term, 130 jobject date, 131 jstring selections, 132 jobjectArray selection_args); 133 134 // Custom provider API methods. --------------------------------------------- 135 jlong CreateBookmarksFolderOnce(JNIEnv* env, 136 jobject obj, 137 jstring title, 138 jlong parent_id); 139 140 void RemoveAllUserBookmarks(JNIEnv* env, jobject obj); 141 142 base::android::ScopedJavaLocalRef<jobject> GetEditableBookmarkFolders( 143 JNIEnv* env, 144 jobject obj); 145 146 base::android::ScopedJavaLocalRef<jobject> GetBookmarkNode( 147 JNIEnv* env, 148 jobject obj, 149 jlong id, 150 jboolean get_parent, 151 jboolean get_children); 152 153 base::android::ScopedJavaLocalRef<jobject> GetMobileBookmarksFolder( 154 JNIEnv* env, 155 jobject obj); 156 157 jboolean IsBookmarkInMobileBookmarksBranch(JNIEnv* env, 158 jobject obj, 159 jlong id); 160 161 jboolean BookmarkNodeExists(JNIEnv* env, 162 jobject obj, 163 jlong id); 164 165 base::android::ScopedJavaLocalRef<jbyteArray> GetFaviconOrTouchIcon( 166 JNIEnv* env, 167 jobject obj, 168 jstring url); 169 170 base::android::ScopedJavaLocalRef<jbyteArray> GetThumbnail(JNIEnv* env, 171 jobject obj, 172 jstring url); 173 174 private: 175 virtual ~ChromeBrowserProvider(); 176 177 // Override BaseBookmarkModelObserver. 178 virtual void BookmarkModelChanged() OVERRIDE; 179 virtual void ExtensiveBookmarkChangesBeginning(BookmarkModel* model) OVERRIDE; 180 virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE; 181 182 // Override NotificationObserver. 183 virtual void Observe(int type, 184 const content::NotificationSource& source, 185 const content::NotificationDetails& details) OVERRIDE; 186 187 JavaObjectWeakGlobalRef weak_java_provider_; 188 189 Profile* profile_; 190 BookmarkModel* bookmark_model_; 191 history::TopSites* top_sites_; 192 193 scoped_ptr<AndroidHistoryProviderService> service_; 194 195 base::CancelableTaskTracker cancelable_task_tracker_; 196 197 // Used to register/unregister notification observer. 198 content::NotificationRegistrar notification_registrar_; 199 200 bool handling_extensive_changes_; 201 202 DISALLOW_COPY_AND_ASSIGN(ChromeBrowserProvider); 203 }; 204 205 #endif // CHROME_BROWSER_ANDROID_PROVIDER_CHROME_BROWSER_PROVIDER_H_ 206