15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_ANDROID_PROVIDER_CHROME_BROWSER_PROVIDER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_ANDROID_PROVIDER_CHROME_BROWSER_PROVIDER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/android/jni_weak_ref.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/scoped_java_ref.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/task/cancelable_task_tracker.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/base_bookmark_model_observer.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/history/core/android/android_history_types.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AndroidHistoryProviderService;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FaviconService;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TopSites;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sql {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Statement;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class implements the native methods of ChromeBrowserProvider.java
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeBrowserProvider : public BaseBookmarkModelObserver,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              public content::NotificationObserver {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeBrowserProvider(JNIEnv* env, jobject obj);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Destroy(JNIEnv*, jobject);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // JNI registration.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool RegisterChromeBrowserProvider(JNIEnv* env);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds either a new bookmark or bookmark folder based on |is_folder|.  The
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bookmark is added to the beginning of the specified parent and if the
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // parent ID is not valid (i.e. < 0) then it will be added to the bookmark
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bar.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jlong AddBookmark(JNIEnv* env, jobject,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    jstring jurl,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    jstring jtitle,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    jboolean is_folder,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    jlong parent_id);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes a bookmark (or folder) with the specified ID.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jint RemoveBookmark(JNIEnv*, jobject, jlong id);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates a bookmark (or folder) with the the new title and new URL.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The |url| field will be ignored if the bookmark node is a folder.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If a valid |parent_id| (>= 0) different from the currently specified
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // parent is given, the node will be moved to that folder as the first
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // child.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jint UpdateBookmark(JNIEnv* env,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      jobject,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      jlong id,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      jstring url,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      jstring title,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      jlong parent_id);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The below are methods to support Android public API.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bookmark and history APIs. -----------------------------------------------
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jlong AddBookmarkFromAPI(JNIEnv* env,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           jobject obj,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           jstring url,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           jobject created,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           jobject isBookmark,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           jobject date,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           jbyteArray favicon,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           jstring title,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           jobject visits,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           jlong parent_id);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::android::ScopedJavaLocalRef<jobject> QueryBookmarkFromAPI(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JNIEnv* env,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jobject obj,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jobjectArray projection,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jstring selections,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jobjectArray selection_args,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jstring sort_order);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jint UpdateBookmarkFromAPI(JNIEnv* env,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jobject obj,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jstring url,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jobject created,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jobject isBookmark,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jobject date,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jbyteArray favicon,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jstring title,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jobject visits,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jlong parent_id,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jstring selections,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jobjectArray selection_args);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jint RemoveBookmarkFromAPI(JNIEnv* env,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jobject obj,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jstring selections,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jobjectArray selection_args);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jint RemoveHistoryFromAPI(JNIEnv* env,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            jobject obj,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            jstring selections,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            jobjectArray selection_args);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jlong AddSearchTermFromAPI(JNIEnv* env,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jobject obj,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jstring search_term,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             jobject date);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::android::ScopedJavaLocalRef<jobject> QuerySearchTermFromAPI(
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JNIEnv* env,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jobject obj,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jobjectArray projection,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jstring selections,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jobjectArray selection_args,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jstring sort_order);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jint RemoveSearchTermFromAPI(JNIEnv* env,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               jobject obj,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               jstring selections,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               jobjectArray selection_args);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jint UpdateSearchTermFromAPI(JNIEnv* env,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               jobject obj,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               jstring search_term,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               jobject date,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               jstring selections,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               jobjectArray selection_args);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Custom provider API methods. ---------------------------------------------
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jlong CreateBookmarksFolderOnce(JNIEnv* env,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  jobject obj,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  jstring title,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  jlong parent_id);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void RemoveAllUserBookmarks(JNIEnv* env, jobject obj);
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::android::ScopedJavaLocalRef<jobject> GetEditableBookmarkFolders(
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      JNIEnv* env,
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      jobject obj);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::android::ScopedJavaLocalRef<jobject> GetBookmarkNode(
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JNIEnv* env,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jobject obj,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jlong id,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jboolean get_parent,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jboolean get_children);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::android::ScopedJavaLocalRef<jobject> GetMobileBookmarksFolder(
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JNIEnv* env,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jobject obj);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jboolean IsBookmarkInMobileBookmarksBranch(JNIEnv* env,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             jobject obj,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             jlong id);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jboolean BookmarkNodeExists(JNIEnv* env,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              jobject obj,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              jlong id);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::android::ScopedJavaLocalRef<jbyteArray> GetFaviconOrTouchIcon(
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      JNIEnv* env,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jobject obj,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jstring url);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::android::ScopedJavaLocalRef<jbyteArray> GetThumbnail(JNIEnv* env,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                             jobject obj,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                             jstring url);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ChromeBrowserProvider();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override BaseBookmarkModelObserver.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BookmarkModelChanged() OVERRIDE;
1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void ExtensiveBookmarkChangesBeginning(BookmarkModel* model) OVERRIDE;
1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override NotificationObserver.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JavaObjectWeakGlobalRef weak_java_provider_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* bookmark_model_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::TopSites* top_sites_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<AndroidHistoryProviderService> service_;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::CancelableTaskTracker cancelable_task_tracker_;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to register/unregister notification observer.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar notification_registrar_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool handling_extensive_changes_;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ChromeBrowserProvider);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_ANDROID_PROVIDER_CHROME_BROWSER_PROVIDER_H_
206