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;
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.base.VisibleForTesting;
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import org.chromium.chrome.browser.profiles.Profile;
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import org.chromium.components.bookmarks.BookmarkId;
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.components.bookmarks.BookmarkType;
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import java.util.ArrayList;
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import java.util.List;
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)/**
18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Provides the communication channel for Android to fetch and manipulate the
19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * bookmark model stored in native.
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) */
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)public class BookmarksBridge {
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    private final Profile mProfile;
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private boolean mIsDoingExtensiveChanges;
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private long mNativeBookmarksBridge;
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    private boolean mIsNativeBookmarkModelLoaded;
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private final List<DelayedBookmarkCallback> mDelayedBookmarkCallbacks =
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            new ArrayList<DelayedBookmarkCallback>();
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private final ObserverList<BookmarkModelObserver> mObservers =
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            new ObserverList<BookmarkModelObserver>();
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Interface for callback object for fetching bookmarks and folder hierarchy.
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public interface BookmarksCallback {
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        /**
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * Callback method for fetching bookmarks for a folder and the folder hierarchy.
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * @param folderId The folder id to which the bookmarks belong.
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * @param bookmarksList List holding the fetched bookmarks and details.
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         */
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        @CalledByNative("BookmarksCallback")
410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        void onBookmarksAvailable(BookmarkId folderId, List<BookmarkItem> bookmarksList);
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        /**
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * Callback method for fetching the folder hierarchy.
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * @param folderId The folder id to which the bookmarks belong.
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * @param bookmarksList List holding the fetched folder details.
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         */
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        @CalledByNative("BookmarksCallback")
490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        void onBookmarksFolderHierarchyAvailable(BookmarkId folderId,
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                List<BookmarkItem> bookmarksList);
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /**
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Base empty implementation observer class that provides listeners to be notified of changes
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * to the bookmark model. It's mandatory to implement one method, bookmarkModelChanged. Other
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * methods are optional and if they aren't overridden, the default implementation of them will
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * eventually call bookmarkModelChanged. Unless noted otherwise, all the functions won't be
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * called during extensive change.
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     */
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public abstract static class BookmarkModelObserver {
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        /**
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * Invoked when a node has moved.
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param oldParent The parent before the move.
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param oldIndex The index of the node in the old parent.
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param newParent The parent after the move.
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param newIndex The index of the node in the new parent.
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         */
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        public void bookmarkNodeMoved(
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, int newIndex) {
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            bookmarkModelChanged();
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        /**
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * Invoked when a node has been added.
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param parent The parent of the node being added.
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param index The index of the added node.
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         */
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        public void bookmarkNodeAdded(BookmarkItem parent, int index) {
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            bookmarkModelChanged();
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        /**
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         * Invoked when a node has been removed, the item may still be starred though. This can
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         * be called during extensive change, and have the flag argument indicating it.
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         * @param parent The parent of the node that was removed.
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         * @param oldIndex The index of the removed node in the parent before it was removed.
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         * @param node The node that was removed.
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         * @param isDoingExtensiveChanges whether extensive changes are happening.
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         */
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node,
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                boolean isDoingExtensiveChanges) {
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (isDoingExtensiveChanges) return;
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            bookmarkNodeRemoved(parent, oldIndex, node);
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        /**
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * Invoked when a node has been removed, the item may still be starred though.
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         *
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param parent The parent of the node that was removed.
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param oldIndex The index of the removed node in the parent before it was removed.
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param node The node that was removed.
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         */
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node) {
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            bookmarkModelChanged();
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        /**
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * Invoked when the title or url of a node changes.
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param node The node being changed.
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         */
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        public void bookmarkNodeChanged(BookmarkItem node) {
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            bookmarkModelChanged();
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        /**
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * Invoked when the children (just direct children, not descendants) of a node have been
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * reordered in some way, such as sorted.
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         * @param node The node whose children are being reordered.
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         */
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        public void bookmarkNodeChildrenReordered(BookmarkItem node) {
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            bookmarkModelChanged();
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        /**
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         * Called when the native side of bookmark is loaded and now in usable state.
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         */
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        public void bookmarkModelLoaded() {
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            bookmarkModelChanged();
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
1310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        /**
1330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)         *  Called when there are changes to the bookmark model that don't trigger any of the other
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         *  callback methods or it wasn't handled by other callback methods.
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         *  Examples:
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         *  - On partner bookmarks change.
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         *  - On extensive change finished.
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         *  - Falling back from other methods that are not overridden in this class.
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         */
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        public abstract void bookmarkModelChanged();
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Handler to fetch the bookmarks, titles, urls and folder hierarchy.
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * @param profile Profile instance corresponding to the active profile.
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public BookmarksBridge(Profile profile) {
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        mProfile = profile;
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        mNativeBookmarksBridge = nativeInit(profile);
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mIsDoingExtensiveChanges = nativeIsDoingExtensiveChanges(mNativeBookmarksBridge);
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Destroys this instance so no further calls can be executed.
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public void destroy() {
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        if (mNativeBookmarksBridge != 0) {
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            nativeDestroy(mNativeBookmarksBridge);
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mNativeBookmarksBridge = 0;
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mIsNativeBookmarkModelLoaded = false;
1610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            mDelayedBookmarkCallbacks.clear();
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mObservers.clear();
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /**
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Load an empty partner bookmark shim for testing. The root node for bookmark will be an
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * empty node.
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @VisibleForTesting
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void loadEmptyPartnerBookmarkShimForTesting() {
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nativeLoadEmptyPartnerBookmarkShimForTesting(mNativeBookmarksBridge);
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     * Add an observer to bookmark model changes.
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     * @param observer The observer to be added.
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     */
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    public void addObserver(BookmarkModelObserver observer) {
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mObservers.addObserver(observer);
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /**
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     * Remove an observer of bookmark model changes.
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     * @param observer The observer to be removed.
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     */
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    public void removeObserver(BookmarkModelObserver observer) {
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mObservers.removeObserver(observer);
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * @return Whether or not the underlying bookmark model is loaded.
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     */
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public boolean isBookmarkModelLoaded() {
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        return mIsNativeBookmarkModelLoaded;
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /**
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * @return A BookmarkItem instance for the given BookmarkId.
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     */
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public BookmarkItem getBookmarkById(BookmarkId id) {
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        assert mIsNativeBookmarkModelLoaded;
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        return nativeGetBookmarkByID(mNativeBookmarksBridge, id.getId(), id.getType());
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /**
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * @return All the permanent nodes.
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     */
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public List<BookmarkId> getPermanentNodeIDs() {
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        assert mIsNativeBookmarkModelLoaded;
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        List<BookmarkId> result = new ArrayList<BookmarkId>();
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        nativeGetPermanentNodeIDs(mNativeBookmarksBridge, result);
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        return result;
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /**
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @return The top level folder's parents, which are root node, mobile node, and other node.
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public List<BookmarkId> getTopLevelFolderParentIDs() {
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert mIsNativeBookmarkModelLoaded;
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        List<BookmarkId> result = new ArrayList<BookmarkId>();
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nativeGetTopLevelFolderParentIDs(mNativeBookmarksBridge, result);
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return result;
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @param getSpecial Whether special top folders should be returned.
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @param getNormal  Whether normal top folders should be returned.
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @return The top level folders. Note that special folders come first and normal top folders
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *         will be in the alphabetical order. Special top folders are managed bookmark and
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *         partner bookmark. Normal top folders are desktop permanent folder, and the
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *         sub-folders of mobile permanent folder and others permanent folder.
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public List<BookmarkId> getTopLevelFolderIDs(boolean getSpecial, boolean getNormal) {
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert mIsNativeBookmarkModelLoaded;
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        List<BookmarkId> result = new ArrayList<BookmarkId>();
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nativeGetTopLevelFolderIDs(mNativeBookmarksBridge, getSpecial, getNormal, result);
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return result;
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @return The uncategorized bookmark IDs. They are direct descendant bookmarks of mobile and
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *         other folders.
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public List<BookmarkId> getUncategorizedBookmarkIDs() {
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert mIsNativeBookmarkModelLoaded;
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        List<BookmarkId> result = new ArrayList<BookmarkId>();
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nativeGetUncategorizedBookmarkIDs(mNativeBookmarksBridge, result);
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return result;
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Populates folderList with BookmarkIds of folders users can move bookmarks
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * to and all folders have corresponding depth value in depthList. Folders
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * having depths of 0 will be shown as top-layered folders. These include
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * "Desktop Folder" itself as well as all children of "mobile" and "other".
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Children of 0-depth folders have depth of 1, and so on.
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * The result list will be sorted alphabetically by title. "mobile", "other",
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * root node, managed folder, partner folder are NOT included as results.
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void getAllFoldersWithDepths(List<BookmarkId> folderList,
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            List<Integer> depthList) {
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert mIsNativeBookmarkModelLoaded;
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nativeGetAllFoldersWithDepths(mNativeBookmarksBridge, folderList, depthList);
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @return The BookmarkId for Mobile folder node
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public BookmarkId getMobileFolderId() {
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert mIsNativeBookmarkModelLoaded;
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return nativeGetMobileFolderId(mNativeBookmarksBridge);
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @return Id representing the special "other" folder from bookmark model.
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @VisibleForTesting
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public BookmarkId getOtherFolderId() {
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert mIsNativeBookmarkModelLoaded;
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return nativeGetOtherFolderId(mNativeBookmarksBridge);
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @return BokmarkId representing special "desktop" folder, namely "bookmark bar".
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @VisibleForTesting
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public BookmarkId getDesktopFolderId() {
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert mIsNativeBookmarkModelLoaded;
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return nativeGetDesktopFolderId(mNativeBookmarksBridge);
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * Reads sub-folder IDs, sub-bookmark IDs, or both of the given folder.
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     *
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * @param getFolders   Whether sub-folders should be returned.
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * @param getBookmarks Whether sub-bookmarks should be returned.
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * @return Child IDs of the given folder, with the specified type.
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     */
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public List<BookmarkId> getChildIDs(BookmarkId id, boolean getFolders, boolean getBookmarks) {
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        assert mIsNativeBookmarkModelLoaded;
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        List<BookmarkId> result = new ArrayList<BookmarkId>();
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        nativeGetChildIDs(mNativeBookmarksBridge,
3056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                id.getId(),
3066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                id.getType(),
307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                getFolders,
308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                getBookmarks,
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                result);
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        return result;
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /**
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * @return All bookmark IDs ordered by descending creation date.
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     */
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public List<BookmarkId> getAllBookmarkIDsOrderedByCreationDate() {
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        assert mIsNativeBookmarkModelLoaded;
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        List<BookmarkId> result = new ArrayList<BookmarkId>();
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        nativeGetAllBookmarkIDsOrderedByCreationDate(mNativeBookmarksBridge, result);
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        return result;
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /**
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * Set title of the given bookmark.
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     */
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public void setBookmarkTitle(BookmarkId id, String title) {
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        assert mIsNativeBookmarkModelLoaded;
3286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        nativeSetBookmarkTitle(mNativeBookmarksBridge, id.getId(), id.getType(), title);
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /**
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * Set URL of the given bookmark.
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     */
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public void setBookmarkUrl(BookmarkId id, String url) {
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        assert mIsNativeBookmarkModelLoaded;
3366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        nativeSetBookmarkUrl(mNativeBookmarksBridge, id.getId(), id.getType(), url);
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /**
3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * @return Whether the given bookmark exist in the current bookmark model, e.g., not deleted.
3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     */
3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    public boolean doesBookmarkExist(BookmarkId id) {
3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        assert mIsNativeBookmarkModelLoaded;
3446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        return nativeDoesBookmarkExist(mNativeBookmarksBridge, id.getId(), id.getType());
3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    /**
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * Fetches the bookmarks of the given folder. This is an always-synchronous version of another
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * getBookmarksForForder function.
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     *
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * @param folderId The parent folder id.
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * @return Bookmarks of the given folder.
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     */
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public List<BookmarkItem> getBookmarksForFolder(BookmarkId folderId) {
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        assert mIsNativeBookmarkModelLoaded;
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        List<BookmarkItem> result = new ArrayList<BookmarkItem>();
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        nativeGetBookmarksForFolder(mNativeBookmarksBridge, folderId, null, result);
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        return result;
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /**
3623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Fetches the bookmarks of the current folder. Callback will be
3633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * synchronous if the bookmark model is already loaded and async if it is loaded in the
3643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * background.
3653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * @param folderId The current folder id.
3663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * @param callback Instance of a callback object.
3673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
3680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    public void getBookmarksForFolder(BookmarkId folderId, BookmarksCallback callback) {
3693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        if (mIsNativeBookmarkModelLoaded) {
3703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            nativeGetBookmarksForFolder(mNativeBookmarksBridge, folderId, callback,
3713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    new ArrayList<BookmarkItem>());
3723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        } else {
3733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mDelayedBookmarkCallbacks.add(new DelayedBookmarkCallback(folderId, callback,
3743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    DelayedBookmarkCallback.GET_BOOKMARKS_FOR_FOLDER, this));
3753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
3763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
3773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
3793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Fetches the folder hierarchy of the given folder. Callback will be
3803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * synchronous if the bookmark model is already loaded and async if it is loaded in the
3813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * background.
3823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * @param folderId The current folder id.
3833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * @param callback Instance of a callback object.
3843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
3850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    public void getCurrentFolderHierarchy(BookmarkId folderId, BookmarksCallback callback) {
3863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        if (mIsNativeBookmarkModelLoaded) {
3873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            nativeGetCurrentFolderHierarchy(mNativeBookmarksBridge, folderId, callback,
3883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    new ArrayList<BookmarkItem>());
3893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        } else {
3903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mDelayedBookmarkCallbacks.add(new DelayedBookmarkCallback(folderId, callback,
3913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    DelayedBookmarkCallback.GET_CURRENT_FOLDER_HIERARCHY, this));
3923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
3933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
3943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
395424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    /**
396424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)     * Deletes a specified bookmark node.
397424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)     * @param bookmarkId The ID of the bookmark to be deleted.
398424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)     */
3990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    public void deleteBookmark(BookmarkId bookmarkId) {
400424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        nativeDeleteBookmark(mNativeBookmarksBridge, bookmarkId);
401424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
402424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    /**
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     * Move the bookmark to the new index within same folder or to a different folder.
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     * @param bookmarkId The id of the bookmark that is being moved.
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     * @param newParentId The parent folder id.
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     * @param index The new index for the bookmark.
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     */
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    public void moveBookmark(BookmarkId bookmarkId, BookmarkId newParentId, int index) {
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        nativeMoveBookmark(mNativeBookmarksBridge, bookmarkId, newParentId, index);
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    /**
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Add a new folder to the given parent folder
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @param parent Folder where to add. Must be a normal editable folder, instead of a partner
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *               bookmark folder or a managed bookomark folder or root node of the entire
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *               bookmark model.
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @param index The position to locate the new folder
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @param title The title text of the new folder
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @return Id of the added node. If adding failed (index is invalid, string is null, parent is
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *         not editable), returns null.
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public BookmarkId addFolder(BookmarkId parent, int index, String title) {
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert parent.getType() == BookmarkType.BOOKMARK_TYPE_NORMAL;
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert index >= 0;
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert title != null;
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return nativeAddFolder(mNativeBookmarksBridge, parent, index, title);
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Add a new bookmark to a specific position below parent
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @param parent Folder where to add. Must be a normal editable folder, instead of a partner
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *               bookmark folder or a managed bookomark folder or root node of the entire
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *               bookmark model.
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @param index The position where the bookmark will be placed in parent folder
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @param title Title of the new bookmark
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @param url Url of the new bookmark
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * @return Id of the added node. If adding failed (index is invalid, string is null, parent is
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *         not editable), returns null.
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public BookmarkId addBookmark(BookmarkId parent, int index, String title, String url) {
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert parent.getType() == BookmarkType.BOOKMARK_TYPE_NORMAL;
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert index >= 0;
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert title != null;
4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert url != null;
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return nativeAddBookmark(mNativeBookmarksBridge, parent, index, title, url);
4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Undo the last undoable action on the top of the bookmark undo stack
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void undo() {
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nativeUndo(mNativeBookmarksBridge);
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Start grouping actions for a single undo operation
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Note: This only works with BookmarkModel, not partner bookmarks.
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void startGroupingUndos() {
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nativeStartGroupingUndos(mNativeBookmarksBridge);
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * End grouping actions for a single undo operation
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Note: This only works with BookmarkModel, not partner bookmarks.
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void endGroupingUndos() {
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        nativeEndGroupingUndos(mNativeBookmarksBridge);
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
4776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     * A bridge function to BookmarkModelFactory::GetForProfile.
4786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     */
4796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public static long getNativeBookmarkModel(Profile profile) {
4806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        return nativeGetNativeBookmarkModel(profile);
4816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
4826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    public static boolean isEditBookmarksEnabled() {
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        return nativeIsEditBookmarksEnabled();
4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public static boolean isEnhancedBookmarksEnabled(Profile profile) {
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return nativeIsEnhancedBookmarksFeatureEnabled(profile);
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    @CalledByNative
492424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    private void bookmarkModelLoaded() {
4933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        mIsNativeBookmarkModelLoaded = true;
494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        for (BookmarkModelObserver observer : mObservers) {
496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            observer.bookmarkModelLoaded();
497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        }
498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        if (!mDelayedBookmarkCallbacks.isEmpty()) {
5003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            for (int i = 0; i < mDelayedBookmarkCallbacks.size(); i++) {
5013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                mDelayedBookmarkCallbacks.get(i).callCallbackMethod();
5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            }
5033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mDelayedBookmarkCallbacks.clear();
5043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
5053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
5063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    @CalledByNative
50858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void bookmarkModelDeleted() {
5093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        destroy();
5103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
5113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    @CalledByNative
51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void bookmarkNodeMoved(
51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, int newIndex) {
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (mIsDoingExtensiveChanges) return;
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        for (BookmarkModelObserver observer : mObservers) {
51858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            observer.bookmarkNodeMoved(oldParent, oldIndex, newParent, newIndex);
51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        }
52058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
52158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
52358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void bookmarkNodeAdded(BookmarkItem parent, int index) {
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (mIsDoingExtensiveChanges) return;
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
52658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        for (BookmarkModelObserver observer : mObservers) {
52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            observer.bookmarkNodeAdded(parent, index);
52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        }
52958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
53058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
53158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
53258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node) {
53358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        for (BookmarkModelObserver observer : mObservers) {
5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            observer.bookmarkNodeRemoved(parent, oldIndex, node,
5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    mIsDoingExtensiveChanges);
53658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        }
53758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
53858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
53958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
54058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void bookmarkNodeChanged(BookmarkItem node) {
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (mIsDoingExtensiveChanges) return;
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
54358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        for (BookmarkModelObserver observer : mObservers) {
54458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            observer.bookmarkNodeChanged(node);
54558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        }
54658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
54758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
54858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
54958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void bookmarkNodeChildrenReordered(BookmarkItem node) {
5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (mIsDoingExtensiveChanges) return;
5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
55258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        for (BookmarkModelObserver observer : mObservers) {
55358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            observer.bookmarkNodeChildrenReordered(node);
55458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        }
55558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
55658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void extensiveBookmarkChangesBeginning() {
5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mIsDoingExtensiveChanges = true;
56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
56158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
56258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
56358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private void extensiveBookmarkChangesEnded() {
5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mIsDoingExtensiveChanges = false;
5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        bookmarkModelChanged();
56658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
56758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
56858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
5690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    private void bookmarkModelChanged() {
5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (mIsDoingExtensiveChanges) return;
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        for (BookmarkModelObserver observer : mObservers) {
5730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            observer.bookmarkModelChanged();
5740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        }
5750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
5760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    @CalledByNative
5780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    private static BookmarkItem createBookmarkItem(long id, int type, String title, String url,
579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            boolean isFolder, long parentId, int parentIdType, boolean isEditable,
580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            boolean isManaged) {
5810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        return new BookmarkItem(new BookmarkId(id, type), title, url, isFolder,
582116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                new BookmarkId(parentId, parentIdType), isEditable, isManaged);
58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    @CalledByNative
58658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private static void addToList(List<BookmarkItem> bookmarksList, BookmarkItem bookmark) {
58758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        bookmarksList.add(bookmark);
5883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
5893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    @CalledByNative
591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    private static void addToBookmarkIdList(List<BookmarkId> bookmarkIdList, long id, int type) {
592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        bookmarkIdList.add(new BookmarkId(id, type));
593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
595116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    @CalledByNative
5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private static void addToBookmarkIdListWithDepth(List<BookmarkId> folderList, long id,
5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            int type, List<Integer> depthList, int depth) {
5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        folderList.add(new BookmarkId(id, type));
5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        depthList.add(depth);
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @CalledByNative
603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private static BookmarkId createBookmarkId(long id, int type) {
604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        return new BookmarkId(id, type);
605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    private native BookmarkItem nativeGetBookmarkByID(long nativeBookmarksBridge, long id,
608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            int type);
609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    private native void nativeGetPermanentNodeIDs(long nativeBookmarksBridge,
610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            List<BookmarkId> bookmarksList);
6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native void nativeGetTopLevelFolderParentIDs(long nativeBookmarksBridge,
6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            List<BookmarkId> bookmarksList);
6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native void nativeGetTopLevelFolderIDs(long nativeBookmarksBridge, boolean getSpecial,
6141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            boolean getNormal, List<BookmarkId> bookmarksList);
6151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native void nativeGetUncategorizedBookmarkIDs(long nativeBookmarksBridge,
6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            List<BookmarkId> bookmarksList);
6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native void nativeGetAllFoldersWithDepths(long nativeBookmarksBridge,
6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            List<BookmarkId> folderList, List<Integer> depthList);
6191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native BookmarkId nativeGetMobileFolderId(long nativeBookmarksBridge);
6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native BookmarkId nativeGetOtherFolderId(long nativeBookmarksBridge);
6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native BookmarkId nativeGetDesktopFolderId(long nativeBookmarksBridge);
622116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    private native void nativeGetChildIDs(long nativeBookmarksBridge, long id, int type,
623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            boolean getFolders, boolean getBookmarks, List<BookmarkId> bookmarksList);
624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    private native void nativeGetAllBookmarkIDsOrderedByCreationDate(long nativeBookmarksBridge,
625116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            List<BookmarkId> result);
626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    private native void nativeSetBookmarkTitle(long nativeBookmarksBridge, long id, int type,
627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            String title);
628116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    private native void nativeSetBookmarkUrl(long nativeBookmarksBridge, long id, int type,
629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            String url);
6305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    private native boolean nativeDoesBookmarkExist(long nativeBookmarksBridge, long id, int type);
631f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private native void nativeGetBookmarksForFolder(long nativeBookmarksBridge,
6320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            BookmarkId folderId, BookmarksCallback callback,
6333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            List<BookmarkItem> bookmarksList);
634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private native void nativeGetCurrentFolderHierarchy(long nativeBookmarksBridge,
6350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            BookmarkId folderId, BookmarksCallback callback,
6363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            List<BookmarkItem> bookmarksList);
6371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native BookmarkId nativeAddFolder(long nativeBookmarksBridge, BookmarkId parent,
6381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            int index, String title);
639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private native void nativeDeleteBookmark(long nativeBookmarksBridge, BookmarkId bookmarkId);
640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    private native void nativeMoveBookmark(long nativeBookmarksBridge, BookmarkId bookmarkId,
641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            BookmarkId newParentId, int index);
6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native BookmarkId nativeAddBookmark(long nativeBookmarksBridge, BookmarkId parent,
6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            int index, String title, String url);
6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native void nativeUndo(long nativeBookmarksBridge);
6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native void nativeStartGroupingUndos(long nativeBookmarksBridge);
6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native void nativeEndGroupingUndos(long nativeBookmarksBridge);
6476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    private static native long nativeGetNativeBookmarkModel(Profile profile);
6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private static native boolean nativeIsEnhancedBookmarksFeatureEnabled(Profile profile);
6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native void nativeLoadEmptyPartnerBookmarkShimForTesting(long nativeBookmarksBridge);
6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private native long nativeInit(Profile profile);
6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private native boolean nativeIsDoingExtensiveChanges(long nativeBookmarksBridge);
653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private native void nativeDestroy(long nativeBookmarksBridge);
6544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private static native boolean nativeIsEditBookmarksEnabled();
6553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
6573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Simple object representing the bookmark item.
6583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
6593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public static class BookmarkItem {
6603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final String mTitle;
6623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final String mUrl;
6630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        private final BookmarkId mId;
6643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final boolean mIsFolder;
6650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        private final BookmarkId mParentId;
666424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        private final boolean mIsEditable;
667116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        private final boolean mIsManaged;
6683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        private BookmarkItem(BookmarkId id, String title, String url, boolean isFolder,
670116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                BookmarkId parentId, boolean isEditable, boolean isManaged) {
6713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mId = id;
6723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mTitle = title;
6733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mUrl = url;
6743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mIsFolder = isFolder;
6753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mParentId = parentId;
676424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            mIsEditable = isEditable;
677116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            mIsManaged = isManaged;
6783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
6793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
680424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        /** @return Title of the bookmark item. */
6813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        public String getTitle() {
6823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            return mTitle;
6833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
6843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
685424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        /** @return Url of the bookmark item. */
6863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        public String getUrl() {
6873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            return mUrl;
6883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
6893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
690424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        /** @return Id of the bookmark item. */
6910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        public BookmarkId getId() {
6923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            return mId;
6933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
6943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
695424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        /** @return Whether item is a folder or a bookmark. */
6963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        public boolean isFolder() {
6973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            return mIsFolder;
6983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
6993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
700424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        /** @return Parent id of the bookmark item. */
7010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        public BookmarkId getParentId() {
7023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            return mParentId;
7033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
704424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
705424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        /** @return Whether this bookmark can be edited. */
706424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        public boolean isEditable() {
707424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            return mIsEditable;
708424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        }
709116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
710116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        /** @return Whether this is a managed bookmark. */
711116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        public boolean isManaged() {
712116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            return mIsManaged;
713116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        }
7143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
7153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /**
7173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     * Details about callbacks that need to be called once the bookmark model has loaded.
7183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
7193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    private static class DelayedBookmarkCallback {
7203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private static final int GET_BOOKMARKS_FOR_FOLDER = 0;
7223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private static final int GET_CURRENT_FOLDER_HIERARCHY = 1;
7233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final BookmarksCallback mCallback;
7250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        private final BookmarkId mFolderId;
7263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final int mCallbackMethod;
7273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final BookmarksBridge mHandler;
7283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        private DelayedBookmarkCallback(BookmarkId folderId, BookmarksCallback callback,
7300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                int method, BookmarksBridge handler) {
7313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mFolderId = folderId;
7323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mCallback = callback;
7333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mCallbackMethod = method;
7343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mHandler = handler;
7353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
7363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        /**
7383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         * Invoke the callback method.
7393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         */
7403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private void callCallbackMethod() {
7410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            switch (mCallbackMethod) {
7423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                case GET_BOOKMARKS_FOR_FOLDER:
7433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    mHandler.getBookmarksForFolder(mFolderId, mCallback);
7443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    break;
7453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                case GET_CURRENT_FOLDER_HIERARCHY:
7463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    mHandler.getCurrentFolderHierarchy(mFolderId, mCallback);
7473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    break;
7483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                default:
7490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                    assert false;
7503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    break;
7513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            }
7523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
7533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
7543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
755