BookmarksBridge.java revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)package org.chromium.chrome.browser;
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import org.chromium.base.CalledByNative;
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import org.chromium.base.ObserverList;
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import org.chromium.chrome.browser.profiles.Profile;
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import java.util.ArrayList;
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import java.util.List;
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)/**
15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Provides the communication channel for Android to fetch and manipulate the
16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * bookmark model stored in native.
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) */
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)public class BookmarksBridge {
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    private final Profile mProfile;
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    private int mNativeBookmarksBridge;
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    private boolean mIsNativeBookmarkModelLoaded;
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private final List<DelayedBookmarkCallback> mDelayedBookmarkCallbacks
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            = new ArrayList<DelayedBookmarkCallback>();
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private final ObserverList<BookmarkModelObserver> mObservers
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            = new ObserverList<BookmarkModelObserver>();
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Interface for callback object for fetching bookmarks and folder hierarchy.
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public interface BookmarksCallback {
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        /**
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * Callback method for fetching bookmarks for a folder and the folder hierarchy.
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * @param folderId The folder id to which the bookmarks belong.
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * @param bookmarksList List holding the fetched bookmarks and details.
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         */
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        @CalledByNative("BookmarksCallback")
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        void onBookmarksAvailable(long folderId, List<BookmarkItem> bookmarksList);
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        /**
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * Callback method for fetching the folder hierarchy.
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * @param folderId The folder id to which the bookmarks belong.
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * @param bookmarksList List holding the fetched folder details.
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         */
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        @CalledByNative("BookmarksCallback")
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        void onBookmarksFolderHierarchyAvailable(long folderId,
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                List<BookmarkItem> bookmarksList);
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /**
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     * Interface that provides listeners to be notified of changes to the bookmark model.
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     */
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    public interface BookmarkModelObserver {
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        /**
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * Invoked when a node has moved.
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param oldParent The parent before the move.
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param oldIndex The index of the node in the old parent.
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param newParent The parent after the move.
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param newIndex The index of the node in the new parent.
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         */
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        void bookmarkNodeMoved(
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, int newIndex);
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        /**
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * Invoked when a node has been added.
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param parent The parent of the node being added.
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param index The index of the added node.
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         */
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        void bookmarkNodeAdded(BookmarkItem parent, int index);
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        /**
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * Invoked when a node has been removed, the item may still be starred though.
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param parent The parent of the node that was removed.
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param oldIndex The index of the removed node in the parent before it was removed.
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param node The node that was removed.
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         */
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node);
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        /**
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * Invoked when the title or url of a node changes.
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param node The node being changed.
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         */
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        void bookmarkNodeChanged(BookmarkItem node);
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        /**
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * Invoked when the children (just direct children, not descendants) of a node have been
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * reordered in some way, such as sorted.
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param node The node whose children are being reordered.
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         */
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        void bookmarkNodeChildrenReordered(BookmarkItem node);
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        /**
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * Invoked before an extensive set of model changes is about to begin.  This tells UI
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * intensive observers to wait until the updates finish to update themselves. These methods
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * should only be used for imports and sync. Observers should still respond to
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * BookmarkNodeRemoved immediately, to avoid holding onto stale node references.
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         */
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        void extensiveBookmarkChangesBeginning();
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        /**
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * Invoked after an extensive set of model changes has ended.  This tells observers to
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * update themselves if they were waiting for the update to finish.
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         */
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        void extensiveBookmarkChangesEnded();
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Handler to fetch the bookmarks, titles, urls and folder hierarchy.
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * @param profile Profile instance corresponding to the active profile.
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public BookmarksBridge(Profile profile) {
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        mProfile = profile;
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        mNativeBookmarksBridge = nativeInit(profile);
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Destroys this instance so no further calls can be executed.
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public void destroy() {
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        if (mNativeBookmarksBridge != 0) {
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            nativeDestroy(mNativeBookmarksBridge);
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mNativeBookmarksBridge = 0;
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mIsNativeBookmarkModelLoaded = false;
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mObservers.clear();
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /**
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     * Add an observer to bookmark model changes.
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     * @param observer The observer to be added.
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     */
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    public void addObserver(BookmarkModelObserver observer) {
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mObservers.addObserver(observer);
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /**
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     * Remove an observer of bookmark model changes.
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     * @param observer The observer to be removed.
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     */
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    public void removeObserver(BookmarkModelObserver observer) {
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mObservers.removeObserver(observer);
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Fetches the bookmarks of the current folder. Callback will be
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * synchronous if the bookmark model is already loaded and async if it is loaded in the
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * background.
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * @param folderId The current folder id.
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * @param callback Instance of a callback object.
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public void getBookmarksForFolder(long folderId, BookmarksCallback callback) {
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        if (mIsNativeBookmarkModelLoaded) {
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            nativeGetBookmarksForFolder(mNativeBookmarksBridge, folderId, callback,
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    new ArrayList<BookmarkItem>());
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        } else {
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mDelayedBookmarkCallbacks.add(new DelayedBookmarkCallback(folderId, callback,
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    DelayedBookmarkCallback.GET_BOOKMARKS_FOR_FOLDER, this));
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Fetches the folder hierarchy of the given folder. Callback will be
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * synchronous if the bookmark model is already loaded and async if it is loaded in the
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * background.
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * @param folderId The current folder id.
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * @param callback Instance of a callback object.
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public void getCurrentFolderHierarchy(long folderId, BookmarksCallback callback) {
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        if (mIsNativeBookmarkModelLoaded) {
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            nativeGetCurrentFolderHierarchy(mNativeBookmarksBridge, folderId, callback,
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    new ArrayList<BookmarkItem>());
1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        } else {
1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mDelayedBookmarkCallbacks.add(new DelayedBookmarkCallback(folderId, callback,
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    DelayedBookmarkCallback.GET_CURRENT_FOLDER_HIERARCHY, this));
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    /**
179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)     * Deletes a specified bookmark node.
180424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)     * @param bookmarkId The ID of the bookmark to be deleted.
181424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)     */
182424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    public void deleteBookmark(long bookmarkId) {
183424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        nativeDeleteBookmark(mNativeBookmarksBridge, bookmarkId);
184424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
185424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    public static boolean isEditBookmarksEnabled() {
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        return nativeIsEditBookmarksEnabled();
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    @CalledByNative
191424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    private void bookmarkModelLoaded() {
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        mIsNativeBookmarkModelLoaded = true;
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        if (!mDelayedBookmarkCallbacks.isEmpty()) {
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            for (int i = 0; i < mDelayedBookmarkCallbacks.size(); i++) {
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                mDelayedBookmarkCallbacks.get(i).callCallbackMethod();
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            }
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mDelayedBookmarkCallbacks.clear();
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    @CalledByNative
20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void bookmarkModelDeleted() {
2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        destroy();
2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
2053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    @CalledByNative
20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void bookmarkNodeMoved(
20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, int newIndex) {
20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        for (BookmarkModelObserver observer : mObservers) {
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            observer.bookmarkNodeMoved(oldParent, oldIndex, newParent, newIndex);
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        }
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void bookmarkNodeAdded(BookmarkItem parent, int index) {
21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        for (BookmarkModelObserver observer : mObservers) {
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            observer.bookmarkNodeAdded(parent, index);
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        }
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node) {
22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        for (BookmarkModelObserver observer : mObservers) {
22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            observer.bookmarkNodeRemoved(parent, oldIndex, node);
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        }
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void bookmarkNodeChanged(BookmarkItem node) {
23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        for (BookmarkModelObserver observer : mObservers) {
23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            observer.bookmarkNodeChanged(node);
23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        }
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void bookmarkNodeChildrenReordered(BookmarkItem node) {
23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        for (BookmarkModelObserver observer : mObservers) {
23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            observer.bookmarkNodeChildrenReordered(node);
23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        }
24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void extensiveBookmarkChangesBeginning() {
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        for (BookmarkModelObserver observer : mObservers) {
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            observer.extensiveBookmarkChangesBeginning();
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        }
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void extensiveBookmarkChangesEnded() {
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        for (BookmarkModelObserver observer : mObservers) {
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            observer.extensiveBookmarkChangesEnded();
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        }
25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private static BookmarkItem create(long id, String title, String url,
258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            boolean isFolder, long parentId, boolean isEditable) {
25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        return new BookmarkItem(id, title, url, isFolder, parentId, isEditable);
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private static void addToList(List<BookmarkItem> bookmarksList, BookmarkItem bookmark) {
26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        bookmarksList.add(bookmark);
2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    private native void nativeGetBookmarksForFolder(int nativeBookmarksBridge,
2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            long folderId, BookmarksCallback callback,
2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            List<BookmarkItem> bookmarksList);
2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    private native void nativeGetCurrentFolderHierarchy(int nativeBookmarksBridge,
2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            long folderId, BookmarksCallback callback,
2723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            List<BookmarkItem> bookmarksList);
273424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    private native void nativeDeleteBookmark(int nativeBookmarksBridge, long bookmarkId);
2743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    private native int nativeInit(Profile profile);
2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    private native void nativeDestroy(int nativeBookmarksBridge);
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private static native boolean nativeIsEditBookmarksEnabled();
2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
2793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Simple object representing the bookmark item.
2803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public static class BookmarkItem {
2823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final String mTitle;
2843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final String mUrl;
2853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final long mId;
2863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final boolean mIsFolder;
2873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final long mParentId;
288424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        private final boolean mIsEditable;
2893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
290424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        private BookmarkItem(long id, String title, String url, boolean isFolder, long parentId,
291424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                boolean isEditable) {
2923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mId = id;
2933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mTitle = title;
2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mUrl = url;
2953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mIsFolder = isFolder;
2963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mParentId = parentId;
297424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            mIsEditable = isEditable;
2983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
2993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
300424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        /** @return Title of the bookmark item. */
3013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        public String getTitle() {
3023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            return mTitle;
3033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
3043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
305424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        /** @return Url of the bookmark item. */
3063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        public String getUrl() {
3073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            return mUrl;
3083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
3093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
310424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        /** @return Id of the bookmark item. */
3113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        public long getId() {
3123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            return mId;
3133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
3143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
315424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        /** @return Whether item is a folder or a bookmark. */
3163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        public boolean isFolder() {
3173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            return mIsFolder;
3183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
3193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
320424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        /** @return Parent id of the bookmark item. */
3213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        public long getParentId() {
3223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            return mParentId;
3233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        /** @return Whether this bookmark can be edited. */
326424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        public boolean isEditable() {
327424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            return mIsEditable;
328424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        }
3293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
3303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
3323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Details about callbacks that need to be called once the bookmark model has loaded.
3333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
3343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    private static class DelayedBookmarkCallback {
3353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private static final int GET_BOOKMARKS_FOR_FOLDER = 0;
3373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private static final int GET_CURRENT_FOLDER_HIERARCHY = 1;
3383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final BookmarksCallback mCallback;
3403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final long mFolderId;
3413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final int mCallbackMethod;
3423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final BookmarksBridge mHandler;
3433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private DelayedBookmarkCallback(long folderId, BookmarksCallback callback, int method,
3453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                BookmarksBridge handler) {
3463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mFolderId = folderId;
3473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mCallback = callback;
3483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mCallbackMethod = method;
3493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mHandler = handler;
3503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
3513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        /**
3533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * Invoke the callback method.
3543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         */
3553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private void callCallbackMethod() {
3563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            switch(mCallbackMethod) {
3573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                case GET_BOOKMARKS_FOR_FOLDER:
3583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    mHandler.getBookmarksForFolder(mFolderId, mCallback);
3593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    break;
3603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                case GET_CURRENT_FOLDER_HIERARCHY:
3613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    mHandler.getCurrentFolderHierarchy(mFolderId, mCallback);
3623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    break;
3633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                default:
3643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    break;
3653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            }
3663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
3673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
3683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
371