From 6d8c77f6752563edb5afe5155ea3471e93ddd553 Mon Sep 17 00:00:00 2001 From: "cramya@chromium.org" Date: Sat, 2 Nov 2013 01:15:54 +0000 Subject: Add support for managed bookmarks in the android new NTP. These bookmarks can not be edited or deleted. Moved all bookmarks files to chrome/browser/android/bookmarks Moved managed_bookmarks_shim.* to chrome/browser/android/bookmarks BUG=311740 NOTRY=true Review URL: https://codereview.chromium.org/45453005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@232540 0039d316-1c4b-4281-b951-d872f2087c98 --- .../chromium/chrome/browser/BookmarksBridge.java | 177 +++++++++-- .../browser/android/bookmarks/bookmarks_bridge.cc | 340 +++++++++++++++++++++ .../browser/android/bookmarks/bookmarks_bridge.h | 98 ++++++ .../android/bookmarks/managed_bookmarks_shim.cc | 111 +++++++ .../android/bookmarks/managed_bookmarks_shim.h | 56 ++++ chrome/browser/android/bookmarks_bridge.cc | 275 ----------------- chrome/browser/android/bookmarks_bridge.h | 85 ------ chrome/browser/android/chrome_jni_registrar.cc | 2 +- .../ui/webui/ntp/android/bookmarks_handler.h | 2 +- .../ui/webui/ntp/android/managed_bookmarks_shim.cc | 111 ------- .../ui/webui/ntp/android/managed_bookmarks_shim.h | 56 ---- chrome/chrome_browser.gypi | 6 +- chrome/chrome_browser_ui.gypi | 2 - 13 files changed, 767 insertions(+), 554 deletions(-) create mode 100644 chrome/browser/android/bookmarks/bookmarks_bridge.cc create mode 100644 chrome/browser/android/bookmarks/bookmarks_bridge.h create mode 100644 chrome/browser/android/bookmarks/managed_bookmarks_shim.cc create mode 100644 chrome/browser/android/bookmarks/managed_bookmarks_shim.h delete mode 100644 chrome/browser/android/bookmarks_bridge.cc delete mode 100644 chrome/browser/android/bookmarks_bridge.h delete mode 100644 chrome/browser/ui/webui/ntp/android/managed_bookmarks_shim.cc delete mode 100644 chrome/browser/ui/webui/ntp/android/managed_bookmarks_shim.h diff --git a/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java index 48c7603..f06c945 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java @@ -4,6 +4,9 @@ package org.chromium.chrome.browser; +import android.text.TextUtils; +import android.util.Log; + import org.chromium.base.CalledByNative; import org.chromium.base.ObserverList; import org.chromium.chrome.browser.profiles.Profile; @@ -17,6 +20,14 @@ import java.util.List; */ public class BookmarksBridge { + // Should mirror constants in chrome/browser/android/bookmarks/bookmarks_bridge.cc + public static final int BOOKMARK_TYPE_NORMAL = 0; + public static final int BOOKMARK_TYPE_MANAGED = 1; + public static final int BOOKMARK_TYPE_PARTNER = 2; + + public static final int INVALID_FOLDER_ID = -2; + public static final int ROOT_FOLDER_ID = -1; + private final Profile mProfile; private int mNativeBookmarksBridge; private boolean mIsNativeBookmarkModelLoaded; @@ -35,7 +46,7 @@ public class BookmarksBridge { * @param bookmarksList List holding the fetched bookmarks and details. */ @CalledByNative("BookmarksCallback") - void onBookmarksAvailable(long folderId, List bookmarksList); + void onBookmarksAvailable(BookmarkId folderId, List bookmarksList); /** * Callback method for fetching the folder hierarchy. @@ -43,7 +54,7 @@ public class BookmarksBridge { * @param bookmarksList List holding the fetched folder details. */ @CalledByNative("BookmarksCallback") - void onBookmarksFolderHierarchyAvailable(long folderId, + void onBookmarksFolderHierarchyAvailable(BookmarkId folderId, List bookmarksList); } @@ -102,6 +113,12 @@ public class BookmarksBridge { * update themselves if they were waiting for the update to finish. */ void extensiveBookmarkChangesEnded(); + + /** + * Called when there are changes to the bookmark model that don't trigger any of the other + * callback methods. For example, this is called when managed or partner bookmarks change. + */ + void bookmarkModelChanged(); } /** @@ -121,6 +138,7 @@ public class BookmarksBridge { nativeDestroy(mNativeBookmarksBridge); mNativeBookmarksBridge = 0; mIsNativeBookmarkModelLoaded = false; + mDelayedBookmarkCallbacks.clear(); } mObservers.clear(); } @@ -148,7 +166,7 @@ public class BookmarksBridge { * @param folderId The current folder id. * @param callback Instance of a callback object. */ - public void getBookmarksForFolder(long folderId, BookmarksCallback callback) { + public void getBookmarksForFolder(BookmarkId folderId, BookmarksCallback callback) { if (mIsNativeBookmarkModelLoaded) { nativeGetBookmarksForFolder(mNativeBookmarksBridge, folderId, callback, new ArrayList()); @@ -165,7 +183,7 @@ public class BookmarksBridge { * @param folderId The current folder id. * @param callback Instance of a callback object. */ - public void getCurrentFolderHierarchy(long folderId, BookmarksCallback callback) { + public void getCurrentFolderHierarchy(BookmarkId folderId, BookmarksCallback callback) { if (mIsNativeBookmarkModelLoaded) { nativeGetCurrentFolderHierarchy(mNativeBookmarksBridge, folderId, callback, new ArrayList()); @@ -179,7 +197,7 @@ public class BookmarksBridge { * Deletes a specified bookmark node. * @param bookmarkId The ID of the bookmark to be deleted. */ - public void deleteBookmark(long bookmarkId) { + public void deleteBookmark(BookmarkId bookmarkId) { nativeDeleteBookmark(mNativeBookmarksBridge, bookmarkId); } @@ -254,9 +272,17 @@ public class BookmarksBridge { } @CalledByNative - private static BookmarkItem create(long id, String title, String url, - boolean isFolder, long parentId, boolean isEditable) { - return new BookmarkItem(id, title, url, isFolder, parentId, isEditable); + private void bookmarkModelChanged() { + for (BookmarkModelObserver observer : mObservers) { + observer.bookmarkModelChanged(); + } + } + + @CalledByNative + private static BookmarkItem createBookmarkItem(long id, int type, String title, String url, + boolean isFolder, long parentId, int parentIdType, boolean isEditable) { + return new BookmarkItem(new BookmarkId(id, type), title, url, isFolder, + new BookmarkId(parentId, parentIdType), isEditable); } @CalledByNative @@ -265,30 +291,138 @@ public class BookmarksBridge { } private native void nativeGetBookmarksForFolder(int nativeBookmarksBridge, - long folderId, BookmarksCallback callback, + BookmarkId folderId, BookmarksCallback callback, List bookmarksList); private native void nativeGetCurrentFolderHierarchy(int nativeBookmarksBridge, - long folderId, BookmarksCallback callback, + BookmarkId folderId, BookmarksCallback callback, List bookmarksList); - private native void nativeDeleteBookmark(int nativeBookmarksBridge, long bookmarkId); + private native void nativeDeleteBookmark(int nativeBookmarksBridge, BookmarkId bookmarkId); private native int nativeInit(Profile profile); private native void nativeDestroy(int nativeBookmarksBridge); private static native boolean nativeIsEditBookmarksEnabled(); /** + * Simple object representing the bookmark id. + */ + public static class BookmarkId { + private static final String LOG_TAG = "BookmarkId"; + private static final char TYPE_MANAGED = 'm'; + private static final char TYPE_PARTNER = 'p'; + + private final long mId; + private final int mType; + + public BookmarkId(long id, int type) { + mId = id; + mType = type; + } + + /** + * @param c The char representing the type. + * @return The Bookmark type from a char representing the type. + */ + private static int getBookmarkTypeFromChar(char c) { + switch (c) { + case TYPE_MANAGED: + return BOOKMARK_TYPE_MANAGED; + case TYPE_PARTNER: + return BOOKMARK_TYPE_PARTNER; + default: + return BOOKMARK_TYPE_NORMAL; + } + } + + /** + * @param c The char representing the bookmark type. + * @return Whether the char representing the bookmark type is a valid type. + */ + private static boolean isValidBookmarkTypeFromChar(char c) { + return (c == TYPE_MANAGED || c == TYPE_PARTNER); + } + + /** + * @param s The bookmark id string (Eg: m1 for managed bookmark id 1). + * @return the Bookmark id from the string which is a concatenation of bookmark type and + * the bookmark id. + */ + public static BookmarkId getBookmarkIdFromString(String s) { + long id = ROOT_FOLDER_ID; + int type = BOOKMARK_TYPE_NORMAL; + if (TextUtils.isEmpty(s)) return new BookmarkId(id, type); + char folderTypeChar = s.charAt(0); + if (isValidBookmarkTypeFromChar(folderTypeChar)) { + type = getBookmarkTypeFromChar(folderTypeChar); + s = s.substring(1); + } + try { + id = Long.parseLong(s); + } catch (NumberFormatException exception) { + Log.e(LOG_TAG, "Error parsing url to extract the bookmark folder id.", exception); + } + return new BookmarkId(id, type); + } + + /** + * @return The id of the bookmark. + */ + @CalledByNative("BookmarkId") + public long getId() { + return mId; + } + + /** + * @return The bookmark type. + */ + @CalledByNative("BookmarkId") + public int getType() { + return mType; + } + + private String getBookmarkTypeString() { + switch (mType) { + case BOOKMARK_TYPE_MANAGED: + return String.valueOf(TYPE_MANAGED); + case BOOKMARK_TYPE_PARTNER: + return String.valueOf(TYPE_PARTNER); + case BOOKMARK_TYPE_NORMAL: + default: + return ""; + } + } + + @Override + public String toString() { + return getBookmarkTypeString() + mId; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof BookmarkId)) return false; + BookmarkId item = (BookmarkId) o; + return (item.mId == mId && item.mType == mType); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + } + + /** * Simple object representing the bookmark item. */ public static class BookmarkItem { private final String mTitle; private final String mUrl; - private final long mId; + private final BookmarkId mId; private final boolean mIsFolder; - private final long mParentId; + private final BookmarkId mParentId; private final boolean mIsEditable; - private BookmarkItem(long id, String title, String url, boolean isFolder, long parentId, - boolean isEditable) { + + private BookmarkItem(BookmarkId id, String title, String url, boolean isFolder, + BookmarkId parentId, boolean isEditable) { mId = id; mTitle = title; mUrl = url; @@ -308,7 +442,7 @@ public class BookmarksBridge { } /** @return Id of the bookmark item. */ - public long getId() { + public BookmarkId getId() { return mId; } @@ -318,7 +452,7 @@ public class BookmarksBridge { } /** @return Parent id of the bookmark item. */ - public long getParentId() { + public BookmarkId getParentId() { return mParentId; } @@ -337,12 +471,12 @@ public class BookmarksBridge { private static final int GET_CURRENT_FOLDER_HIERARCHY = 1; private final BookmarksCallback mCallback; - private final long mFolderId; + private final BookmarkId mFolderId; private final int mCallbackMethod; private final BookmarksBridge mHandler; - private DelayedBookmarkCallback(long folderId, BookmarksCallback callback, int method, - BookmarksBridge handler) { + private DelayedBookmarkCallback(BookmarkId folderId, BookmarksCallback callback, + int method, BookmarksBridge handler) { mFolderId = folderId; mCallback = callback; mCallbackMethod = method; @@ -353,7 +487,7 @@ public class BookmarksBridge { * Invoke the callback method. */ private void callCallbackMethod() { - switch(mCallbackMethod) { + switch (mCallbackMethod) { case GET_BOOKMARKS_FOR_FOLDER: mHandler.getBookmarksForFolder(mFolderId, mCallback); break; @@ -361,6 +495,7 @@ public class BookmarksBridge { mHandler.getCurrentFolderHierarchy(mFolderId, mCallback); break; default: + assert false; break; } } diff --git a/chrome/browser/android/bookmarks/bookmarks_bridge.cc b/chrome/browser/android/bookmarks/bookmarks_bridge.cc new file mode 100644 index 0000000..c355b49 --- /dev/null +++ b/chrome/browser/android/bookmarks/bookmarks_bridge.cc @@ -0,0 +1,340 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/android/bookmarks/bookmarks_bridge.h" + +#include "base/android/jni_string.h" +#include "base/prefs/pref_service.h" +#include "chrome/browser/bookmarks/bookmark_model.h" +#include "chrome/browser/bookmarks/bookmark_model_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_android.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/common/pref_names.h" +#include "content/public/browser/browser_thread.h" +#include "jni/BookmarksBridge_jni.h" + +using base::android::AttachCurrentThread; +using base::android::ConvertUTF8ToJavaString; +using base::android::ConvertUTF16ToJavaString; +using base::android::ScopedJavaLocalRef; +using base::android::ScopedJavaGlobalRef; +using content::BrowserThread; + +// Should mirror constants in BookmarkBridge.java +static const int kBookmarkTypeNormal = 0; +static const int kBookmarkTypeManaged = 1; + +BookmarksBridge::BookmarksBridge(JNIEnv* env, + jobject obj, + jobject j_profile) + : weak_java_ref_(env, obj) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); + bookmark_model_ = BookmarkModelFactory::GetForProfile(profile); + + // Registers the notifications we are interested. + bookmark_model_->AddObserver(this); + if (bookmark_model_->loaded()) + Java_BookmarksBridge_bookmarkModelLoaded(env, obj); + + managed_bookmarks_shim_.reset(new ManagedBookmarksShim(profile->GetPrefs())); + managed_bookmarks_shim_->AddObserver(this); + + // Since a sync or import could have started before this class is + // initialized, we need to make sure that our initial state is + // up to date. + if (bookmark_model_->IsDoingExtensiveChanges()) + ExtensiveBookmarkChangesBeginning(bookmark_model_); +} + +BookmarksBridge::~BookmarksBridge() { + bookmark_model_->RemoveObserver(this); + if (managed_bookmarks_shim_) + managed_bookmarks_shim_->RemoveObserver(this); +} + +void BookmarksBridge::Destroy(JNIEnv*, jobject) { + delete this; +} + +// static +bool BookmarksBridge::RegisterBookmarksBridge(JNIEnv* env) { + return RegisterNativesImpl(env); +} + +static jint Init(JNIEnv* env, jobject obj, jobject j_profile) { + BookmarksBridge* delegate = new BookmarksBridge(env, obj, j_profile); + return reinterpret_cast(delegate); +} + +static bool IsEditBookmarksEnabled() { + return ProfileManager::GetLastUsedProfile()->GetPrefs()->GetBoolean( + prefs::kEditBookmarksEnabled); +} + +static jboolean IsEditBookmarksEnabled(JNIEnv* env, jclass clazz) { + return IsEditBookmarksEnabled(); +} + +void BookmarksBridge::GetBookmarksForFolder(JNIEnv* env, + jobject obj, + jobject j_folder_id_obj, + jobject j_callback_obj, + jobject j_result_obj) { + DCHECK(bookmark_model_->loaded()); + long folder_id = Java_BookmarkId_getId(env, j_folder_id_obj); + int type = Java_BookmarkId_getType(env, j_folder_id_obj); + const BookmarkNode* folder = GetFolderWithFallback(folder_id, type); + // If this is the Mobile bookmarks folder then add the "Managed bookmarks" + // folder first, so that it's the first entry. + if (folder == bookmark_model_->mobile_node() && + managed_bookmarks_shim_->HasManagedBookmarks()) { + ExtractBookmarkNodeInformation( + managed_bookmarks_shim_->GetManagedBookmarksRoot(), + j_result_obj); + } + // Get the folder contents + for (int i = 0; i < folder->child_count(); ++i) { + const BookmarkNode* node = folder->GetChild(i); + ExtractBookmarkNodeInformation(node, j_result_obj); + } + + Java_BookmarksCallback_onBookmarksAvailable( + env, j_callback_obj, j_folder_id_obj, j_result_obj); +} + +void BookmarksBridge::GetCurrentFolderHierarchy(JNIEnv* env, + jobject obj, + jobject j_folder_id_obj, + jobject j_callback_obj, + jobject j_result_obj) { + DCHECK(bookmark_model_->loaded()); + long folder_id = Java_BookmarkId_getId(env, j_folder_id_obj); + int type = Java_BookmarkId_getType(env, j_folder_id_obj); + const BookmarkNode* folder = GetFolderWithFallback(folder_id, type); + // Get the folder heirarchy + const BookmarkNode* node = folder; + while (node) { + ExtractBookmarkNodeInformation(node, j_result_obj); + node = GetParentNode(node); + } + + Java_BookmarksCallback_onBookmarksFolderHierarchyAvailable( + env, j_callback_obj, j_folder_id_obj, j_result_obj); +} + +void BookmarksBridge::DeleteBookmark(JNIEnv* env, + jobject obj, + jobject j_bookmark_id_obj) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + DCHECK(bookmark_model_->loaded()); + + long bookmark_id = Java_BookmarkId_getId(env, j_bookmark_id_obj); + int type = Java_BookmarkId_getType(env, j_bookmark_id_obj); + const BookmarkNode* node = GetNodeByID(bookmark_id, type); + if (!IsEditable(node)) { + NOTREACHED(); + return; + } + + const BookmarkNode* parent_node = GetParentNode(node); + bookmark_model_->Remove(parent_node, parent_node->GetIndexOf(node)); +} + +ScopedJavaLocalRef BookmarksBridge::CreateJavaBookmark( + const BookmarkNode* node) { + JNIEnv* env = AttachCurrentThread(); + + const BookmarkNode* parent = GetParentNode(node); + int64 parent_id = parent ? parent->id() : -1; + + std::string url; + if (node->is_url()) + url = node->url().spec(); + + return Java_BookmarksBridge_createBookmarkItem( + env, + node->id(), + GetBookmarkType(node), + ConvertUTF16ToJavaString(env, node->GetTitle()).obj(), + ConvertUTF8ToJavaString(env, url).obj(), + node->is_folder(), + parent_id, + GetBookmarkType(parent), + IsEditable(node)); +} + +void BookmarksBridge::ExtractBookmarkNodeInformation( + const BookmarkNode* node, + jobject j_result_obj) { + JNIEnv* env = AttachCurrentThread(); + Java_BookmarksBridge_addToList( + env, + j_result_obj, + CreateJavaBookmark(node).obj()); +} + +const BookmarkNode* BookmarksBridge::GetNodeByID(long node_id, + int type) { + const BookmarkNode* node; + if (type == kBookmarkTypeManaged) { + node = managed_bookmarks_shim_->GetNodeByID( + static_cast(node_id)); + } else { + node = bookmark_model_->GetNodeByID(static_cast(node_id)); + } + return node; +} + +const BookmarkNode* BookmarksBridge::GetFolderWithFallback( + long folder_id, int type) { + const BookmarkNode* folder = GetNodeByID(folder_id, type); + if (!folder || folder->type() == BookmarkNode::URL) + folder = bookmark_model_->mobile_node(); + return folder; +} + +bool BookmarksBridge::IsEditable(const BookmarkNode* node) const { + return node && + (node->type() == BookmarkNode::FOLDER || + node->type() == BookmarkNode::URL) && + !managed_bookmarks_shim_->IsManagedBookmark(node) && + IsEditBookmarksEnabled(); +} + +const BookmarkNode* BookmarksBridge::GetParentNode(const BookmarkNode* node) { + DCHECK(bookmark_model_->loaded()); + if (node == managed_bookmarks_shim_->GetManagedBookmarksRoot()) + return bookmark_model_->mobile_node(); + else + return node->parent(); +} + +int BookmarksBridge::GetBookmarkType(const BookmarkNode* node) { + if (managed_bookmarks_shim_->IsManagedBookmark(node)) + return kBookmarkTypeManaged; + else + return kBookmarkTypeNormal; +} + +// ------------- Observer-related methods ------------- // + +void BookmarksBridge::BookmarkModelChanged() { + // Called when there are changes to the bookmark model. It is most + // likely changes to either managed or partner bookmarks. + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef obj = weak_java_ref_.get(env); + if (obj.is_null()) + return; + Java_BookmarksBridge_bookmarkModelChanged(env, obj.obj()); +} + +void BookmarksBridge::Loaded(BookmarkModel* model, bool ids_reassigned) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef obj = weak_java_ref_.get(env); + if (obj.is_null()) + return; + Java_BookmarksBridge_bookmarkModelLoaded(env, obj.obj()); +} + +void BookmarksBridge::BookmarkModelBeingDeleted(BookmarkModel* model) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef obj = weak_java_ref_.get(env); + if (obj.is_null()) + return; + Java_BookmarksBridge_bookmarkModelDeleted(env, obj.obj()); +} + +void BookmarksBridge::BookmarkNodeMoved(BookmarkModel* model, + const BookmarkNode* old_parent, + int old_index, + const BookmarkNode* new_parent, + int new_index) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef obj = weak_java_ref_.get(env); + if (obj.is_null()) + return; + Java_BookmarksBridge_bookmarkNodeMoved( + env, + obj.obj(), + CreateJavaBookmark(old_parent).obj(), + old_index, + CreateJavaBookmark(new_parent).obj(), + new_index); +} + +void BookmarksBridge::BookmarkNodeAdded(BookmarkModel* model, + const BookmarkNode* parent, + int index) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef obj = weak_java_ref_.get(env); + if (obj.is_null()) + return; + Java_BookmarksBridge_bookmarkNodeAdded( + env, + obj.obj(), + CreateJavaBookmark(parent).obj(), + index); +} + +void BookmarksBridge::BookmarkNodeRemoved(BookmarkModel* model, + const BookmarkNode* parent, + int old_index, + const BookmarkNode* node) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef obj = weak_java_ref_.get(env); + if (obj.is_null()) + return; + Java_BookmarksBridge_bookmarkNodeRemoved( + env, + obj.obj(), + CreateJavaBookmark(parent).obj(), + old_index, + CreateJavaBookmark(node).obj()); +} + +void BookmarksBridge::BookmarkNodeChanged(BookmarkModel* model, + const BookmarkNode* node) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef obj = weak_java_ref_.get(env); + if (obj.is_null()) + return; + Java_BookmarksBridge_bookmarkNodeChanged( + env, + obj.obj(), + CreateJavaBookmark(node).obj()); +} + +void BookmarksBridge::BookmarkNodeChildrenReordered(BookmarkModel* model, + const BookmarkNode* node) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef obj = weak_java_ref_.get(env); + if (obj.is_null()) + return; + Java_BookmarksBridge_bookmarkNodeChildrenReordered( + env, + obj.obj(), + CreateJavaBookmark(node).obj()); +} + +void BookmarksBridge::ExtensiveBookmarkChangesBeginning(BookmarkModel* model) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef obj = weak_java_ref_.get(env); + if (obj.is_null()) + return; + Java_BookmarksBridge_extensiveBookmarkChangesBeginning(env, obj.obj()); +} + +void BookmarksBridge::ExtensiveBookmarkChangesEnded(BookmarkModel* model) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef obj = weak_java_ref_.get(env); + if (obj.is_null()) + return; + Java_BookmarksBridge_extensiveBookmarkChangesEnded(env, obj.obj()); +} + +void BookmarksBridge::OnManagedBookmarksChanged() { + BookmarkModelChanged(); +} diff --git a/chrome/browser/android/bookmarks/bookmarks_bridge.h b/chrome/browser/android/bookmarks/bookmarks_bridge.h new file mode 100644 index 0000000..3bb5e20 --- /dev/null +++ b/chrome/browser/android/bookmarks/bookmarks_bridge.h @@ -0,0 +1,98 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ANDROID_BOOKMARKS_BOOKMARKS_BRIDGE_H_ +#define CHROME_BROWSER_ANDROID_BOOKMARKS_BOOKMARKS_BRIDGE_H_ + +#include + +#include "base/android/jni_android.h" +#include "base/android/jni_helper.h" +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "chrome/browser/android/bookmarks/managed_bookmarks_shim.h" +#include "chrome/browser/bookmarks/base_bookmark_model_observer.h" + +class Profile; + +// The delegate to fetch bookmarks information for the Android native +// bookmark page. This fetches the bookmarks, title, urls, folder +// hierarchy. +class BookmarksBridge : public BaseBookmarkModelObserver, + public ManagedBookmarksShim::Observer { + public: + BookmarksBridge(JNIEnv* env, jobject obj, jobject j_profile); + void Destroy(JNIEnv*, jobject); + + static bool RegisterBookmarksBridge(JNIEnv* env); + + void GetBookmarksForFolder(JNIEnv* env, + jobject obj, + jobject j_folder_id_obj, + jobject j_callback_obj, + jobject j_result_obj); + + void GetCurrentFolderHierarchy(JNIEnv* env, + jobject obj, + jobject j_folder_id_obj, + jobject j_callback_obj, + jobject j_result_obj); + + void DeleteBookmark(JNIEnv* env, + jobject obj, + jobject j_bookmark_id_obj); + + private: + virtual ~BookmarksBridge(); + + base::android::ScopedJavaLocalRef CreateJavaBookmark( + const BookmarkNode* node); + void ExtractBookmarkNodeInformation( + const BookmarkNode* node, + jobject j_result_obj); + const BookmarkNode* GetNodeByID(long node_id, int type); + const BookmarkNode* GetFolderWithFallback(long folder_id, int type); + // Returns true if |node| can be modified by the user. + bool IsEditable(const BookmarkNode* node) const; + const BookmarkNode* GetParentNode(const BookmarkNode* node); + int GetBookmarkType(const BookmarkNode* node); + + // Override BaseBookmarkModelObserver. + // Called when there are changes to the bookmark model that don't trigger + // any of the other callback methods. For example, this is called when + // managed or partner bookmarks change. + virtual void BookmarkModelChanged() OVERRIDE; + virtual void Loaded(BookmarkModel* model, bool ids_reassigned) OVERRIDE; + virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE; + virtual void BookmarkNodeMoved(BookmarkModel* model, + const BookmarkNode* old_parent, + int old_index, + const BookmarkNode* new_parent, + int new_index) OVERRIDE; + virtual void BookmarkNodeAdded(BookmarkModel* model, + const BookmarkNode* parent, + int index) OVERRIDE; + virtual void BookmarkNodeRemoved(BookmarkModel* model, + const BookmarkNode* parent, + int old_index, + const BookmarkNode* node) OVERRIDE; + virtual void BookmarkNodeChanged(BookmarkModel* model, + const BookmarkNode* node) OVERRIDE; + virtual void BookmarkNodeChildrenReordered(BookmarkModel* model, + const BookmarkNode* node) OVERRIDE; + virtual void ExtensiveBookmarkChangesBeginning(BookmarkModel* model) OVERRIDE; + virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE; + + // Override ManagedBookmarksShim::Observer + virtual void OnManagedBookmarksChanged() OVERRIDE; + + JavaObjectWeakGlobalRef weak_java_ref_; + BookmarkModel* bookmark_model_; // weak + + scoped_ptr managed_bookmarks_shim_; + + DISALLOW_COPY_AND_ASSIGN(BookmarksBridge); +}; + +#endif // CHROME_BROWSER_ANDROID_BOOKMARKS_BOOKMARKS_BRIDGE_H_ diff --git a/chrome/browser/android/bookmarks/managed_bookmarks_shim.cc b/chrome/browser/android/bookmarks/managed_bookmarks_shim.cc new file mode 100644 index 0000000..2fb6ab6 --- /dev/null +++ b/chrome/browser/android/bookmarks/managed_bookmarks_shim.cc @@ -0,0 +1,111 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/android/bookmarks/managed_bookmarks_shim.h" + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/prefs/pref_service.h" +#include "base/strings/utf_string_conversions.h" +#include "chrome/browser/bookmarks/bookmark_model.h" +#include "chrome/browser/policy/configuration_policy_handler_android.h" +#include "chrome/common/pref_names.h" +#include "google_apis/gaia/gaia_auth_util.h" +#include "grit/generated_resources.h" +#include "ui/base/l10n/l10n_util.h" + +using policy::ManagedBookmarksPolicyHandler; + +ManagedBookmarksShim::ManagedBookmarksShim(PrefService* prefs) + : prefs_(prefs) { + registrar_.Init(prefs_); + registrar_.Add( + prefs::kManagedBookmarks, + base::Bind(&ManagedBookmarksShim::Reload, base::Unretained(this))); + Reload(); +} + +ManagedBookmarksShim::~ManagedBookmarksShim() {} + +void ManagedBookmarksShim::AddObserver(Observer* observer) { + observers_.AddObserver(observer); +} + +void ManagedBookmarksShim::RemoveObserver(Observer* observer) { + observers_.RemoveObserver(observer); +} + +bool ManagedBookmarksShim::HasManagedBookmarks() const { + return !root_->empty(); +} + +bool ManagedBookmarksShim::IsManagedBookmark(const BookmarkNode* node) const { + while (node != NULL) { + if (node == root_.get()) + return true; + node = node->parent(); + } + return false; +} + +const BookmarkNode* ManagedBookmarksShim::GetManagedBookmarksRoot() const { + return root_.get(); +} + +const BookmarkNode* ManagedBookmarksShim::GetNodeByID(int64 id) const { + if (root_->id() == id) + return root_.get(); + for (int i = 0; i < root_->child_count(); ++i) { + const BookmarkNode* child = root_->GetChild(i); + if (child->id() == id) + return child; + } + return NULL; +} + +void ManagedBookmarksShim::Reload() { + std::string domain; + std::string username = prefs_->GetString(prefs::kGoogleServicesUsername); + if (!username.empty()) + domain = gaia::ExtractDomainName(username); + string16 root_node_name; + if (domain.empty()) { + root_node_name = + l10n_util::GetStringUTF16(IDS_POLICY_MANAGED_BOOKMARKS_DEFAULT_NAME); + } else { + root_node_name = l10n_util::GetStringFUTF16(IDS_POLICY_MANAGED_BOOKMARKS, + base::UTF8ToUTF16(domain)); + } + + root_.reset(new BookmarkPermanentNode(0)); + root_->SetTitle(root_node_name); + + const base::ListValue* list = prefs_->GetList(prefs::kManagedBookmarks); + int64 id = 1; + if (list) { + for (base::ListValue::const_iterator it = list->begin(); + it != list->end(); ++it) { + const base::DictionaryValue* dict = NULL; + if (!*it || !(*it)->GetAsDictionary(&dict)) { + NOTREACHED(); + continue; + } + + string16 name; + std::string url; + if (!dict->GetString(ManagedBookmarksPolicyHandler::kName, &name) || + !dict->GetString(ManagedBookmarksPolicyHandler::kUrl, &url)) { + NOTREACHED(); + continue; + } + + BookmarkNode* node = new BookmarkNode(id++, GURL(url)); + node->set_type(BookmarkNode::URL); + node->SetTitle(name); + root_->Add(node, root_->child_count()); + } + } + + FOR_EACH_OBSERVER(Observer, observers_, OnManagedBookmarksChanged()); +} diff --git a/chrome/browser/android/bookmarks/managed_bookmarks_shim.h b/chrome/browser/android/bookmarks/managed_bookmarks_shim.h new file mode 100644 index 0000000..94955ee --- /dev/null +++ b/chrome/browser/android/bookmarks/managed_bookmarks_shim.h @@ -0,0 +1,56 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ANDROID_BOOKMARKS_MANAGED_BOOKMARKS_SHIM_H_ +#define CHROME_BROWSER_ANDROID_BOOKMARKS_MANAGED_BOOKMARKS_SHIM_H_ + +#include "base/basictypes.h" +#include "base/memory/scoped_ptr.h" +#include "base/observer_list.h" +#include "base/prefs/pref_change_registrar.h" + +class BookmarkNode; +class PrefService; + +// A shim that lives on top of a BookmarkModel that allows the injection of +// policy managed bookmarks without submitting changes to the user configured +// bookmark model. +// Policy managed bookmarks live on a subfolder of the Mobile bookmarks called +// "Managed bookmarks" that isn't editable by the user. +class ManagedBookmarksShim { + public: + class Observer { + public: + virtual ~Observer() {} + virtual void OnManagedBookmarksChanged() = 0; + }; + + // Will read managed bookmarks from the given PrefService. The preference + // that contains the bookmarks is managed by policy, and is updated when the + // policy changes. + explicit ManagedBookmarksShim(PrefService* prefs); + ~ManagedBookmarksShim(); + + void AddObserver(Observer* observer); + void RemoveObserver(Observer* observer); + + // Returns true if there exists at least one managed bookmark. + bool HasManagedBookmarks() const; + bool IsManagedBookmark(const BookmarkNode* node) const; + const BookmarkNode* GetManagedBookmarksRoot() const; + const BookmarkNode* GetNodeByID(int64 id) const; + const BookmarkNode* GetParentOf(const BookmarkNode* node) const; + + private: + void Reload(); + + PrefService* prefs_; + PrefChangeRegistrar registrar_; + scoped_ptr root_; + ObserverList observers_; + + DISALLOW_COPY_AND_ASSIGN(ManagedBookmarksShim); +}; + +#endif // CHROME_BROWSER_ANDROID_BOOKMARKS_MANAGED_BOOKMARKS_SHIM_H_ diff --git a/chrome/browser/android/bookmarks_bridge.cc b/chrome/browser/android/bookmarks_bridge.cc deleted file mode 100644 index 031e929..0000000 --- a/chrome/browser/android/bookmarks_bridge.cc +++ /dev/null @@ -1,275 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/android/bookmarks_bridge.h" - -#include "base/android/jni_string.h" -#include "base/prefs/pref_service.h" -#include "chrome/browser/bookmarks/bookmark_model.h" -#include "chrome/browser/bookmarks/bookmark_model_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/profiles/profile_android.h" -#include "chrome/browser/profiles/profile_manager.h" -#include "chrome/common/pref_names.h" -#include "content/public/browser/browser_thread.h" -#include "jni/BookmarksBridge_jni.h" - -using base::android::AttachCurrentThread; -using base::android::ConvertUTF8ToJavaString; -using base::android::ConvertUTF16ToJavaString; -using base::android::ScopedJavaLocalRef; -using base::android::ScopedJavaGlobalRef; -using content::BrowserThread; - -BookmarksBridge::BookmarksBridge(JNIEnv* env, - jobject obj, - jobject j_profile) - : weak_java_ref_(env, obj) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); - bookmark_model_ = BookmarkModelFactory::GetForProfile(profile); - - // Registers the notifications we are interested. - bookmark_model_->AddObserver(this); - if (bookmark_model_->loaded()) - Java_BookmarksBridge_bookmarkModelLoaded(env, obj); -} - -BookmarksBridge::~BookmarksBridge() { - bookmark_model_->RemoveObserver(this); -} - -void BookmarksBridge::Destroy(JNIEnv*, jobject) { - delete this; -} - -// static -bool BookmarksBridge::RegisterBookmarksBridge(JNIEnv* env) { - return RegisterNativesImpl(env); -} - -static jint Init(JNIEnv* env, jobject obj, jobject j_profile) { - BookmarksBridge* delegate = new BookmarksBridge(env, obj, j_profile); - return reinterpret_cast(delegate); -} - -static bool IsEditBookmarksEnabled() { - return ProfileManager::GetLastUsedProfile()->GetPrefs()->GetBoolean( - prefs::kEditBookmarksEnabled); -} - -static jboolean IsEditBookmarksEnabled(JNIEnv* env, jclass clazz) { - return IsEditBookmarksEnabled(); -} - -void BookmarksBridge::GetBookmarksForFolder(JNIEnv* env, - jobject obj, - jlong folder_id, - jobject j_callback_obj, - jobject j_result_obj) { - DCHECK(bookmark_model_->loaded()); - const BookmarkNode* folder = GetFolderNodeFromId(folder_id); - // Get the folder contents - for (int i = 0; i < folder->child_count(); ++i) { - const BookmarkNode* node = folder->GetChild(i); - ExtractBookmarkNodeInformation(node, j_result_obj); - } - - Java_BookmarksCallback_onBookmarksAvailable( - env, j_callback_obj, folder->id(), j_result_obj); -} - -void BookmarksBridge::GetCurrentFolderHierarchy(JNIEnv* env, - jobject obj, - jlong folder_id, - jobject j_callback_obj, - jobject j_result_obj) { - DCHECK(bookmark_model_->loaded()); - const BookmarkNode* folder = GetFolderNodeFromId(folder_id); - // Get the folder heirarchy - const BookmarkNode* node = folder; - while (node) { - ExtractBookmarkNodeInformation(node, j_result_obj); - node = node->parent(); - } - - Java_BookmarksCallback_onBookmarksFolderHierarchyAvailable( - env, j_callback_obj, folder->id(), j_result_obj); -} - -void BookmarksBridge::DeleteBookmark(JNIEnv* env, - jobject obj, - jlong bookmark_id) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - DCHECK(bookmark_model_->loaded()); - - const BookmarkNode* node = bookmark_model_->GetNodeByID(bookmark_id); - if (!IsEditable(node)) { - NOTREACHED(); - return; - } - - const BookmarkNode* parent_node = node->parent(); - bookmark_model_->Remove(parent_node, parent_node->GetIndexOf(node)); -} - -ScopedJavaLocalRef BookmarksBridge::CreateJavaBookmark( - const BookmarkNode* node) { - JNIEnv* env = AttachCurrentThread(); - - const BookmarkNode* parent = node->parent(); - int64 parent_id = parent ? parent->id() : -1; - - std::string url; - if (node->is_url()) - url = node->url().spec(); - - return Java_BookmarksBridge_create( - env, - node->id(), - ConvertUTF16ToJavaString(env, node->GetTitle()).obj(), - ConvertUTF8ToJavaString(env, url).obj(), - node->is_folder(), - parent_id, - IsEditable(node)); -} - -void BookmarksBridge::ExtractBookmarkNodeInformation( - const BookmarkNode* node, - jobject j_result_obj) { - JNIEnv* env = AttachCurrentThread(); - Java_BookmarksBridge_addToList( - env, - j_result_obj, - CreateJavaBookmark(node).obj()); -} - -const BookmarkNode* BookmarksBridge::GetFolderNodeFromId(jlong folder_id) { - const BookmarkNode* folder; - if (folder_id == -1) { - folder = bookmark_model_->mobile_node(); - } else { - folder = bookmark_model_->GetNodeByID( - static_cast(folder_id)); - } - if (!folder) - folder = bookmark_model_->mobile_node(); - return folder; -} - -bool BookmarksBridge::IsEditable(const BookmarkNode* node) const { - return node && - (node->type() == BookmarkNode::FOLDER || - node->type() == BookmarkNode::URL) && - IsEditBookmarksEnabled(); -} - -// ------------- Observer-related methods ------------- // - -void BookmarksBridge::BookmarkModelChanged() { -} - -void BookmarksBridge::Loaded(BookmarkModel* model, bool ids_reassigned) { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef obj = weak_java_ref_.get(env); - if (obj.is_null()) - return; - Java_BookmarksBridge_bookmarkModelLoaded(env, obj.obj()); -} - -void BookmarksBridge::BookmarkModelBeingDeleted(BookmarkModel* model) { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef obj = weak_java_ref_.get(env); - if (obj.is_null()) - return; - Java_BookmarksBridge_bookmarkModelDeleted(env, obj.obj()); -} - -void BookmarksBridge::BookmarkNodeMoved(BookmarkModel* model, - const BookmarkNode* old_parent, - int old_index, - const BookmarkNode* new_parent, - int new_index) { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef obj = weak_java_ref_.get(env); - if (obj.is_null()) - return; - Java_BookmarksBridge_bookmarkNodeMoved( - env, - obj.obj(), - CreateJavaBookmark(old_parent).obj(), - old_index, - CreateJavaBookmark(new_parent).obj(), - new_index); -} - -void BookmarksBridge::BookmarkNodeAdded(BookmarkModel* model, - const BookmarkNode* parent, - int index) { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef obj = weak_java_ref_.get(env); - if (obj.is_null()) - return; - Java_BookmarksBridge_bookmarkNodeAdded( - env, - obj.obj(), - CreateJavaBookmark(parent).obj(), - index); -} - -void BookmarksBridge::BookmarkNodeRemoved(BookmarkModel* model, - const BookmarkNode* parent, - int old_index, - const BookmarkNode* node) { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef obj = weak_java_ref_.get(env); - if (obj.is_null()) - return; - Java_BookmarksBridge_bookmarkNodeRemoved( - env, - obj.obj(), - CreateJavaBookmark(parent).obj(), - old_index, - CreateJavaBookmark(node).obj()); -} - -void BookmarksBridge::BookmarkNodeChanged(BookmarkModel* model, - const BookmarkNode* node) { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef obj = weak_java_ref_.get(env); - if (obj.is_null()) - return; - Java_BookmarksBridge_bookmarkNodeChanged( - env, - obj.obj(), - CreateJavaBookmark(node).obj()); -} - -void BookmarksBridge::BookmarkNodeChildrenReordered(BookmarkModel* model, - const BookmarkNode* node) { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef obj = weak_java_ref_.get(env); - if (obj.is_null()) - return; - Java_BookmarksBridge_bookmarkNodeChildrenReordered( - env, - obj.obj(), - CreateJavaBookmark(node).obj()); -} - -void BookmarksBridge::ExtensiveBookmarkChangesBeginning(BookmarkModel* model) { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef obj = weak_java_ref_.get(env); - if (obj.is_null()) - return; - Java_BookmarksBridge_extensiveBookmarkChangesBeginning(env, obj.obj()); -} - -void BookmarksBridge::ExtensiveBookmarkChangesEnded(BookmarkModel* model) { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef obj = weak_java_ref_.get(env); - if (obj.is_null()) - return; - Java_BookmarksBridge_extensiveBookmarkChangesEnded(env, obj.obj()); -} diff --git a/chrome/browser/android/bookmarks_bridge.h b/chrome/browser/android/bookmarks_bridge.h deleted file mode 100644 index 742edea..0000000 --- a/chrome/browser/android/bookmarks_bridge.h +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_ANDROID_BOOKMARKS_BRIDGE_H_ -#define CHROME_BROWSER_ANDROID_BOOKMARKS_BRIDGE_H_ - -#include - -#include "base/android/jni_android.h" -#include "base/android/jni_helper.h" -#include "base/basictypes.h" -#include "base/compiler_specific.h" -#include "chrome/browser/bookmarks/base_bookmark_model_observer.h" - -class Profile; - -// The delegate to fetch bookmarks information for the Android native -// bookmark page. This fetches the bookmarks, title, urls, folder -// hierarchy. -class BookmarksBridge : public BaseBookmarkModelObserver { - public: - BookmarksBridge(JNIEnv* env, jobject obj, jobject j_profile); - void Destroy(JNIEnv*, jobject); - - static bool RegisterBookmarksBridge(JNIEnv* env); - - void GetBookmarksForFolder(JNIEnv* env, - jobject obj, - jlong folder_id, - jobject j_callback_obj, - jobject j_result_obj); - - void GetCurrentFolderHierarchy(JNIEnv* env, - jobject obj, - jlong folder_id, - jobject j_callback_obj, - jobject j_result_obj); - - void DeleteBookmark(JNIEnv* env, - jobject obj, - jlong bookmark_id); - - private: - virtual ~BookmarksBridge(); - - base::android::ScopedJavaLocalRef CreateJavaBookmark( - const BookmarkNode* node); - void ExtractBookmarkNodeInformation( - const BookmarkNode* node, - jobject j_result_obj); - const BookmarkNode* GetFolderNodeFromId(jlong folder_id); - // Returns true if |node| can be modified by the user. - bool IsEditable(const BookmarkNode* node) const; - - // Override BaseBookmarkModelObserver. - virtual void BookmarkModelChanged() OVERRIDE; - virtual void Loaded(BookmarkModel* model, bool ids_reassigned) OVERRIDE; - virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE; - virtual void BookmarkNodeMoved(BookmarkModel* model, - const BookmarkNode* old_parent, - int old_index, - const BookmarkNode* new_parent, - int new_index) OVERRIDE; - virtual void BookmarkNodeAdded(BookmarkModel* model, - const BookmarkNode* parent, - int index) OVERRIDE; - virtual void BookmarkNodeRemoved(BookmarkModel* model, - const BookmarkNode* parent, - int old_index, - const BookmarkNode* node) OVERRIDE; - virtual void BookmarkNodeChanged(BookmarkModel* model, - const BookmarkNode* node) OVERRIDE; - virtual void BookmarkNodeChildrenReordered(BookmarkModel* model, - const BookmarkNode* node) OVERRIDE; - virtual void ExtensiveBookmarkChangesBeginning(BookmarkModel* model) OVERRIDE; - virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE; - - JavaObjectWeakGlobalRef weak_java_ref_; - BookmarkModel* bookmark_model_; // weak - - DISALLOW_COPY_AND_ASSIGN(BookmarksBridge); -}; - -#endif // CHROME_BROWSER_ANDROID_BOOKMARKS_BRIDGE_H_ diff --git a/chrome/browser/android/chrome_jni_registrar.cc b/chrome/browser/android/chrome_jni_registrar.cc index fb2774a..425305f 100644 --- a/chrome/browser/android/chrome_jni_registrar.cc +++ b/chrome/browser/android/chrome_jni_registrar.cc @@ -7,7 +7,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_registrar.h" #include "base/debug/trace_event.h" -#include "chrome/browser/android/bookmarks_bridge.h" +#include "chrome/browser/android/bookmarks/bookmarks_bridge.h" #include "chrome/browser/android/chrome_web_contents_delegate_android.h" #include "chrome/browser/android/chromium_application.h" #include "chrome/browser/android/content_view_util.h" diff --git a/chrome/browser/ui/webui/ntp/android/bookmarks_handler.h b/chrome/browser/ui/webui/ntp/android/bookmarks_handler.h index d7f0278..55214a1 100644 --- a/chrome/browser/ui/webui/ntp/android/bookmarks_handler.h +++ b/chrome/browser/ui/webui/ntp/android/bookmarks_handler.h @@ -7,9 +7,9 @@ #include "base/memory/scoped_ptr.h" #include "base/values.h" +#include "chrome/browser/android/bookmarks/managed_bookmarks_shim.h" #include "chrome/browser/bookmarks/base_bookmark_model_observer.h" #include "chrome/browser/favicon/favicon_service.h" -#include "chrome/browser/ui/webui/ntp/android/managed_bookmarks_shim.h" #include "chrome/browser/ui/webui/ntp/android/partner_bookmarks_shim.h" #include "chrome/common/cancelable_task_tracker.h" #include "content/public/browser/web_ui_message_handler.h" diff --git a/chrome/browser/ui/webui/ntp/android/managed_bookmarks_shim.cc b/chrome/browser/ui/webui/ntp/android/managed_bookmarks_shim.cc deleted file mode 100644 index 84fceb4..0000000 --- a/chrome/browser/ui/webui/ntp/android/managed_bookmarks_shim.cc +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/webui/ntp/android/managed_bookmarks_shim.h" - -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/prefs/pref_service.h" -#include "base/strings/utf_string_conversions.h" -#include "chrome/browser/bookmarks/bookmark_model.h" -#include "chrome/browser/policy/configuration_policy_handler_android.h" -#include "chrome/common/pref_names.h" -#include "google_apis/gaia/gaia_auth_util.h" -#include "grit/generated_resources.h" -#include "ui/base/l10n/l10n_util.h" - -using policy::ManagedBookmarksPolicyHandler; - -ManagedBookmarksShim::ManagedBookmarksShim(PrefService* prefs) - : prefs_(prefs) { - registrar_.Init(prefs_); - registrar_.Add( - prefs::kManagedBookmarks, - base::Bind(&ManagedBookmarksShim::Reload, base::Unretained(this))); - Reload(); -} - -ManagedBookmarksShim::~ManagedBookmarksShim() {} - -void ManagedBookmarksShim::AddObserver(Observer* observer) { - observers_.AddObserver(observer); -} - -void ManagedBookmarksShim::RemoveObserver(Observer* observer) { - observers_.RemoveObserver(observer); -} - -bool ManagedBookmarksShim::HasManagedBookmarks() const { - return !root_->empty(); -} - -bool ManagedBookmarksShim::IsManagedBookmark(const BookmarkNode* node) const { - while (node != NULL) { - if (node == root_.get()) - return true; - node = node->parent(); - } - return false; -} - -const BookmarkNode* ManagedBookmarksShim::GetManagedBookmarksRoot() const { - return root_.get(); -} - -const BookmarkNode* ManagedBookmarksShim::GetNodeByID(int64 id) const { - if (root_->id() == id) - return root_.get(); - for (int i = 0; i < root_->child_count(); ++i) { - const BookmarkNode* child = root_->GetChild(i); - if (child->id() == id) - return child; - } - return NULL; -} - -void ManagedBookmarksShim::Reload() { - std::string domain; - std::string username = prefs_->GetString(prefs::kGoogleServicesUsername); - if (!username.empty()) - domain = gaia::ExtractDomainName(username); - string16 root_node_name; - if (domain.empty()) { - root_node_name = - l10n_util::GetStringUTF16(IDS_POLICY_MANAGED_BOOKMARKS_DEFAULT_NAME); - } else { - root_node_name = l10n_util::GetStringFUTF16(IDS_POLICY_MANAGED_BOOKMARKS, - base::UTF8ToUTF16(domain)); - } - - root_.reset(new BookmarkPermanentNode(0)); - root_->SetTitle(root_node_name); - - const base::ListValue* list = prefs_->GetList(prefs::kManagedBookmarks); - int64 id = 1; - if (list) { - for (base::ListValue::const_iterator it = list->begin(); - it != list->end(); ++it) { - const base::DictionaryValue* dict = NULL; - if (!*it || !(*it)->GetAsDictionary(&dict)) { - NOTREACHED(); - continue; - } - - string16 name; - std::string url; - if (!dict->GetString(ManagedBookmarksPolicyHandler::kName, &name) || - !dict->GetString(ManagedBookmarksPolicyHandler::kUrl, &url)) { - NOTREACHED(); - continue; - } - - BookmarkNode* node = new BookmarkNode(id++, GURL(url)); - node->set_type(BookmarkNode::URL); - node->SetTitle(name); - root_->Add(node, root_->child_count()); - } - } - - FOR_EACH_OBSERVER(Observer, observers_, OnManagedBookmarksChanged()); -} diff --git a/chrome/browser/ui/webui/ntp/android/managed_bookmarks_shim.h b/chrome/browser/ui/webui/ntp/android/managed_bookmarks_shim.h deleted file mode 100644 index affb1ce..0000000 --- a/chrome/browser/ui/webui/ntp/android/managed_bookmarks_shim.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_WEBUI_NTP_ANDROID_MANAGED_BOOKMARKS_SHIM_H_ -#define CHROME_BROWSER_UI_WEBUI_NTP_ANDROID_MANAGED_BOOKMARKS_SHIM_H_ - -#include "base/basictypes.h" -#include "base/memory/scoped_ptr.h" -#include "base/observer_list.h" -#include "base/prefs/pref_change_registrar.h" - -class BookmarkNode; -class PrefService; - -// A shim that lives on top of a BookmarkModel that allows the injection of -// policy managed bookmarks without submitting changes to the user configured -// bookmark model. -// Policy managed bookmarks live on a subfolder of the Mobile bookmarks called -// "Managed bookmarks" that isn't editable by the user. -class ManagedBookmarksShim { - public: - class Observer { - public: - virtual ~Observer() {} - virtual void OnManagedBookmarksChanged() = 0; - }; - - // Will read managed bookmarks from the given PrefService. The preference - // that contains the bookmarks is managed by policy, and is updated when the - // policy changes. - explicit ManagedBookmarksShim(PrefService* prefs); - ~ManagedBookmarksShim(); - - void AddObserver(Observer* observer); - void RemoveObserver(Observer* observer); - - // Returns true if there exists at least one managed bookmark. - bool HasManagedBookmarks() const; - bool IsManagedBookmark(const BookmarkNode* node) const; - const BookmarkNode* GetManagedBookmarksRoot() const; - const BookmarkNode* GetNodeByID(int64 id) const; - const BookmarkNode* GetParentOf(const BookmarkNode* node) const; - - private: - void Reload(); - - PrefService* prefs_; - PrefChangeRegistrar registrar_; - scoped_ptr root_; - ObserverList observers_; - - DISALLOW_COPY_AND_ASSIGN(ManagedBookmarksShim); -}; - -#endif // CHROME_BROWSER_UI_WEBUI_NTP_ANDROID_MANAGED_BOOKMARKS_SHIM_H_ diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 9590b86..4386064 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -92,8 +92,10 @@ 'browser/accessibility/accessibility_events.h', 'browser/accessibility/invert_bubble_prefs.cc', 'browser/accessibility/invert_bubble_prefs.h', - 'browser/android/bookmarks_bridge.cc', - 'browser/android/bookmarks_bridge.h', + 'browser/android/bookmarks/managed_bookmarks_shim.cc', + 'browser/android/bookmarks/managed_bookmarks_shim.h', + 'browser/android/bookmarks/bookmarks_bridge.cc', + 'browser/android/bookmarks/bookmarks_bridge.h', 'browser/android/chrome_jni_registrar.cc', 'browser/android/chrome_jni_registrar.h', 'browser/android/chrome_startup_flags.cc', diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi index db4ee28..15a0d94 100644 --- a/chrome/chrome_browser_ui.gypi +++ b/chrome/chrome_browser_ui.gypi @@ -2939,8 +2939,6 @@ 'browser/ui/webui/ntp/android/bookmarks_handler.h', 'browser/ui/webui/ntp/android/context_menu_handler.cc', 'browser/ui/webui/ntp/android/context_menu_handler.h', - 'browser/ui/webui/ntp/android/managed_bookmarks_shim.cc', - 'browser/ui/webui/ntp/android/managed_bookmarks_shim.h', 'browser/ui/webui/ntp/android/navigation_handler.cc', 'browser/ui/webui/ntp/android/navigation_handler.h', 'browser/ui/webui/ntp/android/new_tab_page_ready_handler.cc', -- cgit v1.1