13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
50f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/android/bookmarks/bookmarks_bridge.h"
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/android/jni_string.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/containers/stack_container.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/i18n/string_compare.h"
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/prefs/pref_service.h"
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/bookmarks/enhanced_bookmarks_features.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/profiles/incognito_helpers.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/profiles/profile_android.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/undo/bookmark_undo_service.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/undo/bookmark_undo_service_factory.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/undo/undo_manager.h"
22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/common/pref_names.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h"
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_utils.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/bookmarks/browser/scoped_group_bookmark_actions.h"
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/bookmarks/common/android/bookmark_type.h"
27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "jni/BookmarksBridge_jni.h"
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using base::android::AttachCurrentThread;
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using base::android::ConvertUTF8ToJavaString;
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using base::android::ConvertUTF16ToJavaString;
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using base::android::ScopedJavaLocalRef;
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using base::android::ScopedJavaGlobalRef;
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using bookmarks::android::JavaBookmarkIdGetId;
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using bookmarks::android::JavaBookmarkIdGetType;
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using bookmarks::BookmarkType;
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using content::BrowserThread;
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass BookmarkNodeCreationTimeCompareFunctor {
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool operator()(const BookmarkNode* lhs, const BookmarkNode* rhs) {
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return lhs->date_added().ToJavaTime() > rhs->date_added().ToJavaTime();
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BookmarkTitleComparer {
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit BookmarkTitleComparer(const icu::Collator* collator)
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : collator_(collator) {}
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool operator()(const BookmarkNode* lhs, const BookmarkNode* rhs) {
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (collator_) {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return base::i18n::CompareString16WithCollator(
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          collator_, lhs->GetTitle(), rhs->GetTitle()) == UCOL_LESS;
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } else {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return lhs->GetTitle() < rhs->GetTitle();
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciprivate:
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const icu::Collator* collator_;
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<icu::Collator> GetICUCollator() {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UErrorCode error = U_ZERO_ERROR;
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<icu::Collator> collator_;
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  collator_.reset(icu::Collator::createInstance(error));
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (U_FAILURE(error))
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    collator_.reset(NULL);
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return collator_.Pass();
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)BookmarksBridge::BookmarksBridge(JNIEnv* env,
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 jobject obj,
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 jobject j_profile)
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : weak_java_ref_(env, obj),
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      bookmark_model_(NULL),
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      client_(NULL),
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      partner_bookmarks_shim_(NULL) {
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  profile_ = ProfileAndroid::FromProfileAndroid(j_profile);
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bookmark_model_ = BookmarkModelFactory::GetForProfile(profile_);
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  client_ = ChromeBookmarkClientFactory::GetForProfile(profile_);
91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Registers the notifications we are interested.
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bookmark_model_->AddObserver(this);
940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Create the partner Bookmarks shim as early as possible (but don't attach).
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  partner_bookmarks_shim_ = PartnerBookmarksShim::BuildForBrowserContext(
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      chrome::GetBrowserContextRedirectedInIncognito(profile_));
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  partner_bookmarks_shim_->AddObserver(this);
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  NotifyIfDoneLoading();
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Since a sync or import could have started before this class is
1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // initialized, we need to make sure that our initial state is
1040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // up to date.
1050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (bookmark_model_->IsDoingExtensiveChanges())
1060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    ExtensiveBookmarkChangesBeginning(bookmark_model_);
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)BookmarksBridge::~BookmarksBridge() {
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bookmark_model_->RemoveObserver(this);
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (partner_bookmarks_shim_)
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    partner_bookmarks_shim_->RemoveObserver(this);
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void BookmarksBridge::Destroy(JNIEnv*, jobject) {
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  delete this;
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// static
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool BookmarksBridge::RegisterBookmarksBridge(JNIEnv* env) {
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return RegisterNativesImpl(env);
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static jlong Init(JNIEnv* env, jobject obj, jobject j_profile) {
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  BookmarksBridge* delegate = new BookmarksBridge(env, obj, j_profile);
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return reinterpret_cast<intptr_t>(delegate);
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)static jlong GetNativeBookmarkModel(JNIEnv* env,
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                    jclass caller,
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                    jobject j_profile) {
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  BookmarkModel *bookmark_model_ = BookmarkModelFactory::GetForProfile(profile);
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return reinterpret_cast<jlong>(bookmark_model_);
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic jboolean IsEnhancedBookmarksFeatureEnabled(JNIEnv* env,
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  jclass clazz,
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  jobject j_profile) {
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return IsEnhancedBookmarksEnabled(profile->GetPrefs());
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static bool IsEditBookmarksEnabled() {
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return ProfileManager::GetLastUsedProfile()->GetPrefs()->GetBoolean(
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bookmarks::prefs::kEditBookmarksEnabled);
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static jboolean IsEditBookmarksEnabled(JNIEnv* env, jclass clazz) {
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return IsEditBookmarksEnabled();
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BookmarksBridge::LoadEmptyPartnerBookmarkShimForTesting(JNIEnv* env,
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                             jobject obj) {
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (partner_bookmarks_shim_->IsLoaded())
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  partner_bookmarks_shim_->SetPartnerBookmarksRoot(
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new BookmarkPermanentNode(0));
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(partner_bookmarks_shim_->IsLoaded());
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
162116680a4aac90f2aa7413d9095a592090648e557Ben MurdochScopedJavaLocalRef<jobject> BookmarksBridge::GetBookmarkByID(JNIEnv* env,
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                             jobject obj,
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                             jlong id,
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                             jint type) {
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(IsLoaded());
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return CreateJavaBookmark(GetNodeByID(id, type));
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool BookmarksBridge::IsDoingExtensiveChanges(JNIEnv* env, jobject obj) {
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return bookmark_model_->IsDoingExtensiveChanges();
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid BookmarksBridge::GetPermanentNodeIDs(JNIEnv* env,
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          jobject obj,
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          jobject j_result_obj) {
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(kkimlabs): Remove this function.
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(IsLoaded());
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::StackVector<const BookmarkNode*, 8> permanent_nodes;
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Save all the permanent nodes.
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const BookmarkNode* root_node = bookmark_model_->root_node();
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  permanent_nodes->push_back(root_node);
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (int i = 0; i < root_node->child_count(); ++i) {
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    permanent_nodes->push_back(root_node->GetChild(i));
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  permanent_nodes->push_back(
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      partner_bookmarks_shim_->GetPartnerBookmarksRoot());
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Write the permanent nodes to |j_result_obj|.
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (base::StackVector<const BookmarkNode*, 8>::ContainerType::const_iterator
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           it = permanent_nodes->begin();
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       it != permanent_nodes->end();
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       ++it) {
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (*it != NULL) {
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      Java_BookmarksBridge_addToBookmarkIdList(
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          env, j_result_obj, (*it)->id(), GetBookmarkType(*it));
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BookmarksBridge::GetTopLevelFolderParentIDs(JNIEnv* env,
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 jobject obj,
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 jobject j_result_obj) {
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Java_BookmarksBridge_addToBookmarkIdList(
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      env, j_result_obj, bookmark_model_->root_node()->id(),
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetBookmarkType(bookmark_model_->root_node()));
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Java_BookmarksBridge_addToBookmarkIdList(
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      env, j_result_obj, bookmark_model_->mobile_node()->id(),
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetBookmarkType(bookmark_model_->mobile_node()));
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Java_BookmarksBridge_addToBookmarkIdList(
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      env, j_result_obj, bookmark_model_->other_node()->id(),
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetBookmarkType(bookmark_model_->other_node()));
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BookmarksBridge::GetTopLevelFolderIDs(JNIEnv* env,
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           jobject obj,
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           jboolean get_special,
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           jboolean get_normal,
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           jobject j_result_obj) {
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(IsLoaded());
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<const BookmarkNode*> top_level_folders;
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (get_special) {
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (client_->managed_node() &&
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        client_->managed_node()->child_count() > 0) {
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      top_level_folders.push_back(client_->managed_node());
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (partner_bookmarks_shim_->HasPartnerBookmarks()) {
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      top_level_folders.push_back(
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          partner_bookmarks_shim_->GetPartnerBookmarksRoot());
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::size_t special_count = top_level_folders.size();
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (get_normal) {
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK_EQ(bookmark_model_->root_node()->child_count(), 4);
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    top_level_folders.push_back(bookmark_model_->bookmark_bar_node());
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const BookmarkNode* mobile_node = bookmark_model_->mobile_node();
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (int i = 0; i < mobile_node->child_count(); ++i) {
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const BookmarkNode* node = mobile_node->GetChild(i);
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (node->is_folder()) {
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        top_level_folders.push_back(node);
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const BookmarkNode* other_node = bookmark_model_->other_node();
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (int i = 0; i < other_node->child_count(); ++i) {
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const BookmarkNode* node = other_node->GetChild(i);
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (node->is_folder()) {
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        top_level_folders.push_back(node);
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<icu::Collator> collator = GetICUCollator();
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    std::stable_sort(top_level_folders.begin() + special_count,
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     top_level_folders.end(),
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     BookmarkTitleComparer(collator.get()));
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (std::vector<const BookmarkNode*>::const_iterator it =
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      top_level_folders.begin(); it != top_level_folders.end(); ++it) {
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Java_BookmarksBridge_addToBookmarkIdList(env,
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             j_result_obj,
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             (*it)->id(),
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             GetBookmarkType(*it));
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BookmarksBridge::GetUncategorizedBookmarkIDs(JNIEnv* env,
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  jobject obj,
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  jobject j_result_obj) {
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* mobile_node = bookmark_model_->mobile_node();
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (int i = 0; i < mobile_node->child_count(); ++i) {
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const BookmarkNode* node = mobile_node->GetChild(i);
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!node->is_folder()) {
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Java_BookmarksBridge_addToBookmarkIdList(env,
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               j_result_obj,
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               node->id(),
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               GetBookmarkType(node));
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* other_node = bookmark_model_->other_node();
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (int i = 0; i < other_node->child_count(); ++i) {
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const BookmarkNode* node = other_node->GetChild(i);
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!node->is_folder()) {
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Java_BookmarksBridge_addToBookmarkIdList(env,
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               j_result_obj,
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               node->id(),
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               GetBookmarkType(node));
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BookmarksBridge::GetAllFoldersWithDepths(JNIEnv* env,
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              jobject obj,
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              jobject j_folders_obj,
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              jobject j_depths_obj) {
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(IsLoaded());
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* desktop = bookmark_model_->bookmark_bar_node();
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* mobile = bookmark_model_->mobile_node();
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* other = bookmark_model_->other_node();
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<icu::Collator> collator = GetICUCollator();
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Vector to temporarily contain all child bookmarks at same level for sorting
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<const BookmarkNode*> bookmarkList;
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Stack for Depth-First Search of bookmark model. It stores nodes and their
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // heights.
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::stack<std::pair<const BookmarkNode*, int> > stk;
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (int i = 0; i < mobile->child_count(); ++i) {
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const BookmarkNode* child = mobile->GetChild(i);
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (child->is_folder() && client_->CanBeEditedByUser(child))
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bookmarkList.push_back(child);
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (int i = 0; i < other->child_count(); ++i) {
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const BookmarkNode* child = other->GetChild(i);
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (child->is_folder() && client_->CanBeEditedByUser(child))
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bookmarkList.push_back(child);
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bookmarkList.push_back(desktop);
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::stable_sort(bookmarkList.begin(),
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   bookmarkList.end(),
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   BookmarkTitleComparer(collator.get()));
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Push all sorted top folders in stack and give them depth of 0.
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Note the order to push folders to stack should be opposite to the order in
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // output.
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (std::vector<const BookmarkNode*>::reverse_iterator it =
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           bookmarkList.rbegin();
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       it != bookmarkList.rend();
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       ++it) {
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    stk.push(std::make_pair(*it, 0));
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  while (!stk.empty()) {
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const BookmarkNode* node = stk.top().first;
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int depth = stk.top().second;
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    stk.pop();
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Java_BookmarksBridge_addToBookmarkIdListWithDepth(env,
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                      j_folders_obj,
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                      node->id(),
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                      GetBookmarkType(node),
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                      j_depths_obj,
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                      depth);
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bookmarkList.clear();
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (int i = 0; i < node->child_count(); ++i) {
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const BookmarkNode* child = node->GetChild(i);
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (child->is_folder() && client_->CanBeEditedByUser(child))
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        bookmarkList.push_back(node->GetChild(i));
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    std::stable_sort(bookmarkList.begin(),
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     bookmarkList.end(),
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     BookmarkTitleComparer(collator.get()));
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (std::vector<const BookmarkNode*>::reverse_iterator it =
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             bookmarkList.rbegin();
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         it != bookmarkList.rend();
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         ++it) {
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      stk.push(std::make_pair(*it, depth + 1));
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciScopedJavaLocalRef<jobject> BookmarksBridge::GetMobileFolderId(JNIEnv* env,
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                               jobject obj) {
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* mobile_node = bookmark_model_->mobile_node();
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScopedJavaLocalRef<jobject> folder_id_obj =
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Java_BookmarksBridge_createBookmarkId(
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          env, mobile_node->id(), GetBookmarkType(mobile_node));
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return folder_id_obj;
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciScopedJavaLocalRef<jobject> BookmarksBridge::GetOtherFolderId(JNIEnv* env,
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                              jobject obj) {
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* other_node = bookmark_model_->other_node();
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScopedJavaLocalRef<jobject> folder_id_obj =
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Java_BookmarksBridge_createBookmarkId(
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          env, other_node->id(), GetBookmarkType(other_node));
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return folder_id_obj;
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciScopedJavaLocalRef<jobject> BookmarksBridge::GetDesktopFolderId(JNIEnv* env,
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                                jobject obj) {
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* desktop_node = bookmark_model_->bookmark_bar_node();
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScopedJavaLocalRef<jobject> folder_id_obj =
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Java_BookmarksBridge_createBookmarkId(
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          env, desktop_node->id(), GetBookmarkType(desktop_node));
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return folder_id_obj;
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
397116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid BookmarksBridge::GetChildIDs(JNIEnv* env,
398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  jobject obj,
399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  jlong id,
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  jint type,
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  jboolean get_folders,
402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  jboolean get_bookmarks,
403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  jobject j_result_obj) {
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(IsLoaded());
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const BookmarkNode* parent = GetNodeByID(id, type);
407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!parent->is_folder() || !IsReachable(parent))
408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Get the folder contents
411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (int i = 0; i < parent->child_count(); ++i) {
412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const BookmarkNode* child = parent->GetChild(i);
413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (!IsFolderAvailable(child) || !IsReachable(child))
414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      continue;
415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if ((child->is_folder() && get_folders) ||
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        (!child->is_folder() && get_bookmarks)) {
418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      Java_BookmarksBridge_addToBookmarkIdList(
419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          env, j_result_obj, child->id(), GetBookmarkType(child));
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Partner bookmark root node is under mobile node.
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (parent == bookmark_model_->mobile_node() && get_folders &&
425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      partner_bookmarks_shim_->HasPartnerBookmarks() &&
426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      IsReachable(partner_bookmarks_shim_->GetPartnerBookmarksRoot())) {
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Java_BookmarksBridge_addToBookmarkIdList(
428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        env,
429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        j_result_obj,
430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        partner_bookmarks_shim_->GetPartnerBookmarksRoot()->id(),
4316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        BookmarkType::PARTNER);
432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid BookmarksBridge::GetAllBookmarkIDsOrderedByCreationDate(
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    JNIEnv* env,
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    jobject obj,
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    jobject j_result_obj) {
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(IsLoaded());
440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::list<const BookmarkNode*> folders;
441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<const BookmarkNode*> result;
442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  folders.push_back(bookmark_model_->root_node());
443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  folders.push_back(partner_bookmarks_shim_->GetPartnerBookmarksRoot());
444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (std::list<const BookmarkNode*>::iterator folder_iter = folders.begin();
446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      folder_iter != folders.end(); ++folder_iter) {
447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (*folder_iter == NULL)
448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      continue;
449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::list<const BookmarkNode*>::iterator insert_iter = folder_iter;
451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ++insert_iter;
452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    for (int i = 0; i < (*folder_iter)->child_count(); ++i) {
454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const BookmarkNode* child = (*folder_iter)->GetChild(i);
455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (!IsFolderAvailable(child) || !IsReachable(child))
456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        continue;
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (child->is_folder()) {
459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        insert_iter = folders.insert(insert_iter, child);
460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      } else {
461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        result.push_back(child);
462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      }
463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::sort(
467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      result.begin(), result.end(), BookmarkNodeCreationTimeCompareFunctor());
468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (std::vector<const BookmarkNode*>::const_iterator iter = result.begin();
470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       iter != result.end();
471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       ++iter) {
472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const BookmarkNode* bookmark = *iter;
473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Java_BookmarksBridge_addToBookmarkIdList(
474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        env, j_result_obj, bookmark->id(), GetBookmarkType(bookmark));
475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
478116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid BookmarksBridge::SetBookmarkTitle(JNIEnv* env,
479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       jobject obj,
480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       jlong id,
481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       jint type,
482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       jstring j_title) {
483116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(IsLoaded());
484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const BookmarkNode* bookmark = GetNodeByID(id, type);
485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const base::string16 title =
486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::android::ConvertJavaStringToUTF16(env, j_title);
487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (partner_bookmarks_shim_->IsPartnerBookmark(bookmark)) {
489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    partner_bookmarks_shim_->RenameBookmark(bookmark, title);
490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bookmark_model_->SetTitle(bookmark, title);
492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
495116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid BookmarksBridge::SetBookmarkUrl(JNIEnv* env,
496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     jobject obj,
497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     jlong id,
498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     jint type,
499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     jstring url) {
500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(IsLoaded());
501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bookmark_model_->SetURL(
502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetNodeByID(id, type),
503116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GURL(base::android::ConvertJavaStringToUTF16(env, url)));
504116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool BookmarksBridge::DoesBookmarkExist(JNIEnv* env,
5075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                        jobject obj,
5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                        jlong id,
5095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                        jint type) {
5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(IsLoaded());
5115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return GetNodeByID(id, type);
5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void BookmarksBridge::GetBookmarksForFolder(JNIEnv* env,
5153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                            jobject obj,
5160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                            jobject j_folder_id_obj,
5173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                            jobject j_callback_obj,
5183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                            jobject j_result_obj) {
519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(IsLoaded());
5206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  long folder_id = JavaBookmarkIdGetId(env, j_folder_id_obj);
5216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  int type = JavaBookmarkIdGetType(env, j_folder_id_obj);
5220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const BookmarkNode* folder = GetFolderWithFallback(folder_id, type);
523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!folder->is_folder() || !IsReachable(folder))
525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Recreate the java bookmarkId object due to fallback.
528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ScopedJavaLocalRef<jobject> folder_id_obj =
529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      Java_BookmarksBridge_createBookmarkId(
530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          env, folder->id(), GetBookmarkType(folder));
531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  j_folder_id_obj = folder_id_obj.obj();
532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
533f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Get the folder contents.
5343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for (int i = 0; i < folder->child_count(); ++i) {
5353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const BookmarkNode* node = folder->GetChild(i);
536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!IsFolderAvailable(node))
537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      continue;
5383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ExtractBookmarkNodeInformation(node, j_result_obj);
5393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
5403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (folder == bookmark_model_->mobile_node() &&
542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      partner_bookmarks_shim_->HasPartnerBookmarks()) {
543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ExtractBookmarkNodeInformation(
544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        partner_bookmarks_shim_->GetPartnerBookmarksRoot(),
545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        j_result_obj);
546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
548116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (j_callback_obj) {
549116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Java_BookmarksCallback_onBookmarksAvailable(
550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        env, j_callback_obj, j_folder_id_obj, j_result_obj);
551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
5523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void BookmarksBridge::GetCurrentFolderHierarchy(JNIEnv* env,
5553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                                jobject obj,
5560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                                jobject j_folder_id_obj,
5573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                                jobject j_callback_obj,
5583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                                jobject j_result_obj) {
559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(IsLoaded());
5606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  long folder_id = JavaBookmarkIdGetId(env, j_folder_id_obj);
5616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  int type = JavaBookmarkIdGetType(env, j_folder_id_obj);
5620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const BookmarkNode* folder = GetFolderWithFallback(folder_id, type);
563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!folder->is_folder() || !IsReachable(folder))
565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Recreate the java bookmarkId object due to fallback.
568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ScopedJavaLocalRef<jobject> folder_id_obj =
569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      Java_BookmarksBridge_createBookmarkId(
570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          env, folder->id(), GetBookmarkType(folder));
571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  j_folder_id_obj = folder_id_obj.obj();
572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Get the folder hierarchy.
5743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const BookmarkNode* node = folder;
5753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  while (node) {
5763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ExtractBookmarkNodeInformation(node, j_result_obj);
5770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    node = GetParentNode(node);
5783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
5793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Java_BookmarksCallback_onBookmarksFolderHierarchyAvailable(
5810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      env, j_callback_obj, j_folder_id_obj, j_result_obj);
5823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciScopedJavaLocalRef<jobject> BookmarksBridge::AddFolder(JNIEnv* env,
5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                       jobject obj,
5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                       jobject j_parent_id_obj,
5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                       jint index,
5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                       jstring j_title) {
5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(IsLoaded());
5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  long bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj);
5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int type = JavaBookmarkIdGetType(env, j_parent_id_obj);
5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* parent = GetNodeByID(bookmark_id, type);
5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* new_node = bookmark_model_->AddFolder(
5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      parent, index, base::android::ConvertJavaStringToUTF16(env, j_title));
5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!new_node) {
5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return ScopedJavaLocalRef<jobject>();
5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScopedJavaLocalRef<jobject> new_java_obj =
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Java_BookmarksBridge_createBookmarkId(
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          env, new_node->id(), GetBookmarkType(new_node));
6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return new_java_obj;
6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
606424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void BookmarksBridge::DeleteBookmark(JNIEnv* env,
607424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                     jobject obj,
6080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                     jobject j_bookmark_id_obj) {
609424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(IsLoaded());
611424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
6126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  long bookmark_id = JavaBookmarkIdGetId(env, j_bookmark_id_obj);
6136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  int type = JavaBookmarkIdGetType(env, j_bookmark_id_obj);
6140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const BookmarkNode* node = GetNodeByID(bookmark_id, type);
615424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!IsEditable(node)) {
616424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    NOTREACHED();
617424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return;
618424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
619424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (partner_bookmarks_shim_->IsPartnerBookmark(node)) {
621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    partner_bookmarks_shim_->RemoveBookmark(node);
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const BookmarkNode* parent_node = GetParentNode(node);
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bookmark_model_->Remove(parent_node, parent_node->GetIndexOf(node));
625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
626424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
627424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BookmarksBridge::MoveBookmark(JNIEnv* env,
629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   jobject obj,
630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   jobject j_bookmark_id_obj,
631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   jobject j_parent_id_obj,
632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   jint index) {
633a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(IsLoaded());
635a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  long bookmark_id = JavaBookmarkIdGetId(env, j_bookmark_id_obj);
6376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  int type = JavaBookmarkIdGetType(env, j_bookmark_id_obj);
638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const BookmarkNode* node = GetNodeByID(bookmark_id, type);
639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!IsEditable(node)) {
640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NOTREACHED();
641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
6436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj);
6446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  type = JavaBookmarkIdGetType(env, j_parent_id_obj);
645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const BookmarkNode* new_parent_node = GetNodeByID(bookmark_id, type);
646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bookmark_model_->Move(node, new_parent_node, index);
647a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciScopedJavaLocalRef<jobject> BookmarksBridge::AddBookmark(
6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    JNIEnv* env,
6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    jobject obj,
6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    jobject j_parent_id_obj,
6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    jint index,
6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    jstring j_title,
6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    jstring j_url) {
6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(IsLoaded());
6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  long bookmark_id = JavaBookmarkIdGetId(env, j_parent_id_obj);
6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int type = JavaBookmarkIdGetType(env, j_parent_id_obj);
6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* parent = GetNodeByID(bookmark_id, type);
6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const BookmarkNode* new_node = bookmark_model_->AddURL(
6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      parent,
6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      index,
6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::android::ConvertJavaStringToUTF16(env, j_title),
6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GURL(base::android::ConvertJavaStringToUTF16(env, j_url)));
6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!new_node) {
6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return ScopedJavaLocalRef<jobject>();
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScopedJavaLocalRef<jobject> new_java_obj =
6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Java_BookmarksBridge_createBookmarkId(
6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          env, new_node->id(), GetBookmarkType(new_node));
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return new_java_obj;
6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BookmarksBridge::Undo(JNIEnv* env, jobject obj) {
6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(IsLoaded());
6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BookmarkUndoService* undo_service =
6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      BookmarkUndoServiceFactory::GetForProfile(profile_);
6811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UndoManager* undo_manager = undo_service->undo_manager();
6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  undo_manager->Undo();
6831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BookmarksBridge::StartGroupingUndos(JNIEnv* env, jobject obj) {
6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(IsLoaded());
6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!grouped_bookmark_actions_.get()); // shouldn't have started already
6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  grouped_bookmark_actions_.reset(
6901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new bookmarks::ScopedGroupBookmarkActions(bookmark_model_));
6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BookmarksBridge::EndGroupingUndos(JNIEnv* env, jobject obj) {
6941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
6951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(IsLoaded());
6961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(grouped_bookmark_actions_.get()); // should only call after start
6971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  grouped_bookmark_actions_.reset();
6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
70058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)ScopedJavaLocalRef<jobject> BookmarksBridge::CreateJavaBookmark(
70158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const BookmarkNode* node) {
7023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
70358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const BookmarkNode* parent = GetParentNode(node);
70558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int64 parent_id = parent ? parent->id() : -1;
70658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string url;
7083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (node->is_url())
7093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    url = node->url().spec();
71058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return Java_BookmarksBridge_createBookmarkItem(
71258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      env,
71358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      node->id(),
7140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      GetBookmarkType(node),
715f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ConvertUTF16ToJavaString(env, GetTitle(node)).obj(),
7163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ConvertUTF8ToJavaString(env, url).obj(),
71758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      node->is_folder(),
71858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      parent_id,
7190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      GetBookmarkType(parent),
720116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      IsEditable(node),
721116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      IsManaged(node));
72258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
72358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid BookmarksBridge::ExtractBookmarkNodeInformation(const BookmarkNode* node,
7250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                                     jobject j_result_obj) {
72658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsReachable(node))
728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Java_BookmarksBridge_addToList(
7300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      env, j_result_obj, CreateJavaBookmark(node).obj());
7313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
7323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst BookmarkNode* BookmarksBridge::GetNodeByID(long node_id, int type) {
7340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const BookmarkNode* node;
7356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (type == BookmarkType::PARTNER) {
736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    node = partner_bookmarks_shim_->GetNodeByID(
737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        static_cast<int64>(node_id));
7383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else {
739116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    node = bookmarks::GetBookmarkNodeByID(bookmark_model_,
740116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          static_cast<int64>(node_id));
7413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
7420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return node;
7430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
7440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst BookmarkNode* BookmarksBridge::GetFolderWithFallback(long folder_id,
7460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                                           int type) {
7470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const BookmarkNode* folder = GetNodeByID(folder_id, type);
748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!folder || folder->type() == BookmarkNode::URL ||
749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      !IsFolderAvailable(folder)) {
750f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!client_->managed_node()->empty())
751f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      folder = client_->managed_node();
752f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    else
753f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      folder = bookmark_model_->mobile_node();
754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
7553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return folder;
7563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
7573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
758424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool BookmarksBridge::IsEditable(const BookmarkNode* node) const {
759f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!node || (node->type() != BookmarkNode::FOLDER &&
760f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      node->type() != BookmarkNode::URL)) {
761f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
762f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
763f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsEditBookmarksEnabled())
764f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
765f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (partner_bookmarks_shim_->IsPartnerBookmark(node))
766effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return partner_bookmarks_shim_->IsEditable(node);
767f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return client_->CanBeEditedByUser(node);
7680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
7690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
770116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool BookmarksBridge::IsManaged(const BookmarkNode* node) const {
771116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return client_->IsDescendantOfManagedNode(node);
772116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
773116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)const BookmarkNode* BookmarksBridge::GetParentNode(const BookmarkNode* node) {
775f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(IsLoaded());
776f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (node == partner_bookmarks_shim_->GetPartnerBookmarksRoot()) {
7770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return bookmark_model_->mobile_node();
778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
7790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return node->parent();
780f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
7810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
7820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)int BookmarksBridge::GetBookmarkType(const BookmarkNode* node) {
784f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (partner_bookmarks_shim_->IsPartnerBookmark(node))
7856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return BookmarkType::PARTNER;
7860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  else
7876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return BookmarkType::NORMAL;
788424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
789424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
790a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 BookmarksBridge::GetTitle(const BookmarkNode* node) const {
791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (partner_bookmarks_shim_->IsPartnerBookmark(node))
792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return partner_bookmarks_shim_->GetTitle(node);
793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return node->GetTitle();
794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool BookmarksBridge::IsReachable(const BookmarkNode* node) const {
797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!partner_bookmarks_shim_->IsPartnerBookmark(node))
798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return true;
799f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return partner_bookmarks_shim_->IsReachable(node);
800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
801f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool BookmarksBridge::IsLoaded() const {
803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return (bookmark_model_->loaded() && partner_bookmarks_shim_->IsLoaded());
804f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
805f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
806f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool BookmarksBridge::IsFolderAvailable(
807f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const BookmarkNode* folder) const {
808f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The managed bookmarks folder is not shown if there are no bookmarks
809f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // configured via policy.
810f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (folder == client_->managed_node() && folder->empty())
811f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
812f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
813a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SigninManager* signin = SigninManagerFactory::GetForProfile(
814a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      profile_->GetOriginalProfile());
815f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return (folder->type() != BookmarkNode::BOOKMARK_BAR &&
816f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      folder->type() != BookmarkNode::OTHER_NODE) ||
8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (signin && signin->IsAuthenticated());
818f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
819f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
820f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void BookmarksBridge::NotifyIfDoneLoading() {
821f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsLoaded())
822f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
823f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
824f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
825f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (obj.is_null())
826f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
827f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Java_BookmarksBridge_bookmarkModelLoaded(env, obj.obj());
828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
829f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// ------------- Observer-related methods ------------- //
8313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void BookmarksBridge::BookmarkModelChanged() {
833f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsLoaded())
834f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
835f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Called when there are changes to the bookmark model. It is most
837f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // likely changes to the partner bookmarks.
8380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
8390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
8400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (obj.is_null())
8410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return;
8420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  Java_BookmarksBridge_bookmarkModelChanged(env, obj.obj());
8433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
8443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BookmarksBridge::BookmarkModelLoaded(BookmarkModel* model,
8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                          bool ids_reassigned) {
847f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  NotifyIfDoneLoading();
8483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
8493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void BookmarksBridge::BookmarkModelBeingDeleted(BookmarkModel* model) {
851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsLoaded())
852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
8553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
8563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (obj.is_null())
8573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
8583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Java_BookmarksBridge_bookmarkModelDeleted(env, obj.obj());
8593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
86058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
86158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void BookmarksBridge::BookmarkNodeMoved(BookmarkModel* model,
86258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                        const BookmarkNode* old_parent,
86358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                        int old_index,
86458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                        const BookmarkNode* new_parent,
86558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                        int new_index) {
866f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsLoaded())
867f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
868f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
86958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
87058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
87158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (obj.is_null())
87258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
87358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Java_BookmarksBridge_bookmarkNodeMoved(
87458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      env,
87558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      obj.obj(),
87658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CreateJavaBookmark(old_parent).obj(),
87758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      old_index,
87858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CreateJavaBookmark(new_parent).obj(),
87958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new_index);
88058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
88158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
88258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void BookmarksBridge::BookmarkNodeAdded(BookmarkModel* model,
88358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                        const BookmarkNode* parent,
88458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                        int index) {
885f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsLoaded())
886f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
887f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
88858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
88958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
89058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (obj.is_null())
89158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
89258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Java_BookmarksBridge_bookmarkNodeAdded(
89358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      env,
89458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      obj.obj(),
89558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CreateJavaBookmark(parent).obj(),
89658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      index);
89758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
89858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
89958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void BookmarksBridge::BookmarkNodeRemoved(BookmarkModel* model,
90058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                          const BookmarkNode* parent,
90158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                          int old_index,
902010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          const BookmarkNode* node,
903010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          const std::set<GURL>& removed_urls) {
904f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsLoaded())
905f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
906f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
90758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
90858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
90958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (obj.is_null())
91058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
91158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Java_BookmarksBridge_bookmarkNodeRemoved(
91258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      env,
91358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      obj.obj(),
91458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CreateJavaBookmark(parent).obj(),
91558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      old_index,
91658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CreateJavaBookmark(node).obj());
91758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
91858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
91958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void BookmarksBridge::BookmarkNodeChanged(BookmarkModel* model,
92058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                          const BookmarkNode* node) {
921f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsLoaded())
922f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
923f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
92458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
92558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
92658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (obj.is_null())
92758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
92858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Java_BookmarksBridge_bookmarkNodeChanged(
92958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      env,
93058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      obj.obj(),
93158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CreateJavaBookmark(node).obj());
93258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
93358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
93458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void BookmarksBridge::BookmarkNodeChildrenReordered(BookmarkModel* model,
93558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                                    const BookmarkNode* node) {
936f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsLoaded())
937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
938f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
93958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
94058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
94158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (obj.is_null())
94258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
94358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Java_BookmarksBridge_bookmarkNodeChildrenReordered(
94458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      env,
94558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      obj.obj(),
94658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CreateJavaBookmark(node).obj());
94758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
94858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
94958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void BookmarksBridge::ExtensiveBookmarkChangesBeginning(BookmarkModel* model) {
950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsLoaded())
951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
95358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
95458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
95558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (obj.is_null())
95658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
95758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Java_BookmarksBridge_extensiveBookmarkChangesBeginning(env, obj.obj());
95858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
95958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
96058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void BookmarksBridge::ExtensiveBookmarkChangesEnded(BookmarkModel* model) {
961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsLoaded())
962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
96458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
96558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_ref_.get(env);
96658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (obj.is_null())
96758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
96858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Java_BookmarksBridge_extensiveBookmarkChangesEnded(env, obj.obj());
96958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void BookmarksBridge::PartnerShimChanged(PartnerBookmarksShim* shim) {
972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsLoaded())
973f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
974f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
975f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  BookmarkModelChanged();
976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
977f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
978f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void BookmarksBridge::PartnerShimLoaded(PartnerBookmarksShim* shim) {
979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  NotifyIfDoneLoading();
980f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
981f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
982f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void BookmarksBridge::ShimBeingDeleted(PartnerBookmarksShim* shim) {
983f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  partner_bookmarks_shim_ = NULL;
984f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
985