1// Copyright 2013 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_BOOKMARKS_BOOKMARKS_BRIDGE_H_
6#define CHROME_BROWSER_ANDROID_BOOKMARKS_BOOKMARKS_BRIDGE_H_
7
8#include <jni.h>
9
10#include "base/android/jni_android.h"
11#include "base/android/jni_weak_ref.h"
12#include "base/basictypes.h"
13#include "base/compiler_specific.h"
14#include "chrome/browser/android/bookmarks/partner_bookmarks_shim.h"
15#include "chrome/browser/bookmarks/chrome_bookmark_client.h"
16#include "components/bookmarks/browser/base_bookmark_model_observer.h"
17#include "components/bookmarks/common/android/bookmark_id.h"
18
19namespace bookmarks {
20class ScopedGroupBookmarkActions;
21}
22
23class Profile;
24
25// The delegate to fetch bookmarks information for the Android native
26// bookmark page. This fetches the bookmarks, title, urls, folder
27// hierarchy.
28class BookmarksBridge : public BaseBookmarkModelObserver,
29                        public PartnerBookmarksShim::Observer {
30 public:
31  BookmarksBridge(JNIEnv* env, jobject obj, jobject j_profile);
32  void Destroy(JNIEnv*, jobject);
33
34  static bool RegisterBookmarksBridge(JNIEnv* env);
35
36  bool IsDoingExtensiveChanges(JNIEnv* env, jobject obj);
37
38  void LoadEmptyPartnerBookmarkShimForTesting(JNIEnv* env, jobject obj);
39
40  base::android::ScopedJavaLocalRef<jobject> GetBookmarkByID(
41      JNIEnv* env,
42      jobject obj,
43      jlong id,
44      jint type);
45
46  void GetPermanentNodeIDs(JNIEnv* env,
47                           jobject obj,
48                           jobject j_result_obj);
49
50  void GetTopLevelFolderParentIDs(JNIEnv* env,
51                                  jobject obj,
52                                  jobject j_result_obj);
53
54  void GetTopLevelFolderIDs(JNIEnv* env,
55                            jobject obj,
56                            jboolean get_special,
57                            jboolean get_normal,
58                            jobject j_result_obj);
59
60  void GetUncategorizedBookmarkIDs(JNIEnv* env,
61                                   jobject obj,
62                                   jobject j_result_obj);
63  void GetAllFoldersWithDepths(JNIEnv* env,
64                               jobject obj,
65                               jobject j_folders_obj,
66                               jobject j_depths_obj);
67
68  base::android::ScopedJavaLocalRef<jobject> GetMobileFolderId(JNIEnv* env,
69                                                               jobject obj);
70
71  base::android::ScopedJavaLocalRef<jobject> GetOtherFolderId(JNIEnv* env,
72                                                              jobject obj);
73
74  base::android::ScopedJavaLocalRef<jobject> GetDesktopFolderId(JNIEnv* env,
75                                                                jobject obj);
76
77  void GetChildIDs(JNIEnv* env,
78                   jobject obj,
79                   jlong id,
80                   jint type,
81                   jboolean get_folders,
82                   jboolean get_bookmarks,
83                   jobject j_result_obj);
84
85  void GetAllBookmarkIDsOrderedByCreationDate(JNIEnv* env,
86                                              jobject obj,
87                                              jobject j_result_obj);
88
89  void SetBookmarkTitle(JNIEnv* env,
90                        jobject obj,
91                        jlong id,
92                        jint type,
93                        jstring title);
94
95  void SetBookmarkUrl(JNIEnv* env,
96                      jobject obj,
97                      jlong id,
98                      jint type,
99                      jstring url);
100
101  bool DoesBookmarkExist(JNIEnv* env, jobject obj, jlong id, jint type);
102
103  void GetBookmarksForFolder(JNIEnv* env,
104                             jobject obj,
105                             jobject j_folder_id_obj,
106                             jobject j_callback_obj,
107                             jobject j_result_obj);
108
109  void GetCurrentFolderHierarchy(JNIEnv* env,
110                                 jobject obj,
111                                 jobject j_folder_id_obj,
112                                 jobject j_callback_obj,
113                                 jobject j_result_obj);
114
115  base::android::ScopedJavaLocalRef<jobject> AddFolder(JNIEnv* env,
116                                                       jobject obj,
117                                                       jobject j_parent_id_obj,
118                                                       jint index,
119                                                       jstring j_title);
120
121  void DeleteBookmark(JNIEnv* env, jobject obj, jobject j_bookmark_id_obj);
122
123  void MoveBookmark(JNIEnv* env,
124                    jobject obj,
125                    jobject j_bookmark_id_obj,
126                    jobject j_parent_id_obj,
127                    jint index);
128
129  base::android::ScopedJavaLocalRef<jobject> AddBookmark(
130      JNIEnv* env,
131      jobject obj,
132      jobject j_parent_id_obj,
133      jint index,
134      jstring j_title,
135      jstring j_url);
136
137  void Undo(JNIEnv* env, jobject obj);
138
139  void StartGroupingUndos(JNIEnv* env, jobject obj);
140
141  void EndGroupingUndos(JNIEnv* env, jobject obj);
142
143 private:
144  virtual ~BookmarksBridge();
145
146  base::android::ScopedJavaLocalRef<jobject> CreateJavaBookmark(
147      const BookmarkNode* node);
148  void ExtractBookmarkNodeInformation(
149      const BookmarkNode* node,
150      jobject j_result_obj);
151  const BookmarkNode* GetNodeByID(long node_id, int type);
152  const BookmarkNode* GetFolderWithFallback(long folder_id, int type);
153  // Returns whether |node| can be modified by the user.
154  bool IsEditable(const BookmarkNode* node) const;
155  // Returns whether |node| is a managed bookmark.
156  bool IsManaged(const BookmarkNode* node) const;
157  const BookmarkNode* GetParentNode(const BookmarkNode* node);
158  int GetBookmarkType(const BookmarkNode* node);
159  base::string16 GetTitle(const BookmarkNode* node) const;
160  bool IsReachable(const BookmarkNode* node) const;
161  bool IsLoaded() const;
162  bool IsFolderAvailable(const BookmarkNode* folder) const;
163  void NotifyIfDoneLoading();
164
165  // Override BaseBookmarkModelObserver.
166  // Called when there are changes to the bookmark model that don't trigger
167  // any of the other callback methods. For example, this is called when
168  // partner bookmarks change.
169  virtual void BookmarkModelChanged() OVERRIDE;
170  virtual void BookmarkModelLoaded(BookmarkModel* model,
171                                   bool ids_reassigned) OVERRIDE;
172  virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE;
173  virtual void BookmarkNodeMoved(BookmarkModel* model,
174                                 const BookmarkNode* old_parent,
175                                 int old_index,
176                                 const BookmarkNode* new_parent,
177                                 int new_index) OVERRIDE;
178  virtual void BookmarkNodeAdded(BookmarkModel* model,
179                                 const BookmarkNode* parent,
180                                 int index) OVERRIDE;
181  virtual void BookmarkNodeRemoved(BookmarkModel* model,
182                                   const BookmarkNode* parent,
183                                   int old_index,
184                                   const BookmarkNode* node,
185                                   const std::set<GURL>& removed_urls) OVERRIDE;
186  virtual void BookmarkNodeChanged(BookmarkModel* model,
187                                   const BookmarkNode* node) OVERRIDE;
188  virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
189                                             const BookmarkNode* node) OVERRIDE;
190  virtual void ExtensiveBookmarkChangesBeginning(BookmarkModel* model) OVERRIDE;
191  virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE;
192
193  // Override PartnerBookmarksShim::Observer
194  virtual void PartnerShimChanged(PartnerBookmarksShim* shim) OVERRIDE;
195  virtual void PartnerShimLoaded(PartnerBookmarksShim* shim) OVERRIDE;
196  virtual void ShimBeingDeleted(PartnerBookmarksShim* shim) OVERRIDE;
197
198  Profile* profile_;
199  JavaObjectWeakGlobalRef weak_java_ref_;
200  BookmarkModel* bookmark_model_;  // weak
201  ChromeBookmarkClient* client_;   // weak
202  scoped_ptr<bookmarks::ScopedGroupBookmarkActions> grouped_bookmark_actions_;
203
204  // Information about the Partner bookmarks (must check for IsLoaded()).
205  // This is owned by profile.
206  PartnerBookmarksShim* partner_bookmarks_shim_;
207
208  DISALLOW_COPY_AND_ASSIGN(BookmarksBridge);
209};
210
211#endif  // CHROME_BROWSER_ANDROID_BOOKMARKS_BOOKMARKS_BRIDGE_H_
212