Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java |
| index 15a18f5ee2bbc377643ff60ec0eacb5a9ceb4e2c..2e1b490c37af073bd88a8bb30e76d6600d2d4345 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/BookmarksBridge.java |
| @@ -18,6 +18,7 @@ import java.util.List; |
| */ |
| public class BookmarksBridge { |
| private final Profile mProfile; |
| + private boolean mExtensiveBookmarkChangesHappening; |
| private long mNativeBookmarksBridge; |
| private boolean mIsNativeBookmarkModelLoaded; |
| private final List<DelayedBookmarkCallback> mDelayedBookmarkCallbacks = |
| @@ -48,71 +49,95 @@ public class BookmarksBridge { |
| } |
| /** |
| - * Interface that provides listeners to be notified of changes to the bookmark model. |
| + * Base empty implementation observer class that provides listeners to be notified of changes |
| + * to the bookmark model. It's a mandatory to implement one method, |
|
Ian Wen
2014/09/10 21:48:51
s It's a mandatory/It's mandatory
Kibeom Kim (inactive)
2014/09/10 22:39:16
Done.
|
| + * bookmarkModelChangedNotDuringExtensiveChange. Other methods are optional and if they aren't |
| + * overridden, the default implementation of them will eventually call |
| + * bookmarkModelChangedNotDuringExtensiveChange. |
| */ |
| - public interface BookmarkModelObserver { |
| + public abstract static class BookmarkModelObserver { |
| /** |
| - * Invoked when a node has moved. |
| + * Invoked when a node has been removed, the item may still be starred though. |
| + * @param parent The parent of the node that was removed. |
| + * @param oldIndex The index of the removed node in the parent before it was removed. |
| + * @param node The node that was removed. |
| + * @param isExtensiveBookmarkChangesHappening whether extensive changes are happening. |
| + */ |
| + public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node, |
| + boolean isExtensiveBookmarkChangesHappening) { |
| + if (!isExtensiveBookmarkChangesHappening) { |
| + bookmarkNodeRemovedNotDuringExtensiveChange(parent, oldIndex, node); |
| + } |
| + } |
| + |
| + /** |
| + * Invoked when a node has moved. But only when it's not during extensive change. |
|
Ted C
2014/09/10 21:57:40
I wouldn't include "But only when it's not during
Kibeom Kim (inactive)
2014/09/10 22:39:16
Done.
|
| * @param oldParent The parent before the move. |
| * @param oldIndex The index of the node in the old parent. |
| * @param newParent The parent after the move. |
| * @param newIndex The index of the node in the new parent. |
| */ |
| - void bookmarkNodeMoved( |
| - BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, int newIndex); |
| + public void bookmarkNodeMovedNotDuringExtensiveChange( |
|
Ian Wen
2014/09/10 21:48:51
I wonder if we could rename these functions to be
Ted C
2014/09/10 21:57:39
I don't think we need these NotDuringExtensiveChan
|
| + BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, int newIndex) { |
| + bookmarkModelChangedNotDuringExtensiveChange(); |
| + } |
| /** |
| - * Invoked when a node has been added. |
| + * Invoked when a node has been added. But only when it's not during extensive change. |
| * @param parent The parent of the node being added. |
| * @param index The index of the added node. |
| */ |
| - void bookmarkNodeAdded(BookmarkItem parent, int index); |
| + public void bookmarkNodeAddedNotDuringExtensiveChange(BookmarkItem parent, int index) { |
| + bookmarkModelChangedNotDuringExtensiveChange(); |
| + } |
| /** |
| * Invoked when a node has been removed, the item may still be starred though. |
| + * But only when it's not during extensive change. |
| * @param parent The parent of the node that was removed. |
| * @param oldIndex The index of the removed node in the parent before it was removed. |
| * @param node The node that was removed. |
| */ |
| - void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node); |
| + public void bookmarkNodeRemovedNotDuringExtensiveChange(BookmarkItem parent, int oldIndex, |
| + BookmarkItem node) { |
| + bookmarkModelChangedNotDuringExtensiveChange(); |
| + } |
| /** |
| - * Invoked when the title or url of a node changes. |
| + * Invoked when the title or url of a node changes. But only when it's not during extensive |
| + * change. |
| * @param node The node being changed. |
| */ |
| - void bookmarkNodeChanged(BookmarkItem node); |
| + public void bookmarkNodeChangedNotDuringExtensiveChange(BookmarkItem node) { |
| + bookmarkModelChangedNotDuringExtensiveChange(); |
| + } |
| /** |
| * Invoked when the children (just direct children, not descendants) of a node have been |
| - * reordered in some way, such as sorted. |
| + * reordered in some way, such as sorted. But only when it's not during extensive change. |
| * @param node The node whose children are being reordered. |
| */ |
| - void bookmarkNodeChildrenReordered(BookmarkItem node); |
| - |
| - /** |
| - * Invoked before an extensive set of model changes is about to begin. This tells UI |
| - * intensive observers to wait until the updates finish to update themselves. These methods |
| - * should only be used for imports and sync. Observers should still respond to |
| - * BookmarkNodeRemoved immediately, to avoid holding onto stale node references. |
| - */ |
| - void extensiveBookmarkChangesBeginning(); |
| + public void bookmarkNodeChildrenReorderedNotDuringExtensiveChange(BookmarkItem node) { |
| + bookmarkModelChangedNotDuringExtensiveChange(); |
| + } |
| /** |
| - * Invoked after an extensive set of model changes has ended. This tells observers to |
| - * update themselves if they were waiting for the update to finish. |
| + * Called when the native side of bookmark is loaded and now in usable state. |
| */ |
| - void extensiveBookmarkChangesEnded(); |
| + public void bookmarkModelLoaded() { |
| + bookmarkModelChangedNotDuringExtensiveChange(); |
| + } |
| /** |
| * Called when there are changes to the bookmark model that don't trigger any of the other |
| - * callback methods. For example, this is called when partner bookmarks change. |
| + * callback methods or it wasn't handled by other callback methods. Also note that this |
|
Ted C
2014/09/10 21:57:39
This behavior is odd to me. I fear that this will
Kibeom Kim (inactive)
2014/09/10 22:39:16
I think it should be a common pattern. First, we c
|
| + * isn't called during extensive change. |
| + * Examples: |
| + * - On partner bookmarks change. |
| + * - On extensive change finished. |
| + * - Falling back from other methods that are not overridden in this class. |
| */ |
| - void bookmarkModelChanged(); |
| - |
| - /** |
| - * Called when the native side of bookmark is loaded and now in usable state. |
| - */ |
| - void bookmarkModelLoaded(); |
| + public abstract void bookmarkModelChangedNotDuringExtensiveChange(); |
| } |
| /** |
| @@ -372,57 +397,66 @@ public class BookmarksBridge { |
| @CalledByNative |
| private void bookmarkNodeMoved( |
| BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, int newIndex) { |
| - for (BookmarkModelObserver observer : mObservers) { |
| - observer.bookmarkNodeMoved(oldParent, oldIndex, newParent, newIndex); |
| + if (!mExtensiveBookmarkChangesHappening) { |
|
Ted C
2014/09/10 21:57:40
for all these i would early exit
if (mExtensiveBo
Kibeom Kim (inactive)
2014/09/10 22:39:16
Done.
|
| + for (BookmarkModelObserver observer : mObservers) { |
| + observer.bookmarkNodeMovedNotDuringExtensiveChange(oldParent, oldIndex, newParent, |
| + newIndex); |
| + } |
| } |
| } |
| @CalledByNative |
| private void bookmarkNodeAdded(BookmarkItem parent, int index) { |
| - for (BookmarkModelObserver observer : mObservers) { |
| - observer.bookmarkNodeAdded(parent, index); |
| + if (!mExtensiveBookmarkChangesHappening) { |
| + for (BookmarkModelObserver observer : mObservers) { |
| + observer.bookmarkNodeAddedNotDuringExtensiveChange(parent, index); |
| + } |
| } |
| } |
| @CalledByNative |
| private void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node) { |
| for (BookmarkModelObserver observer : mObservers) { |
| - observer.bookmarkNodeRemoved(parent, oldIndex, node); |
| + observer.bookmarkNodeRemoved(parent, oldIndex, node, |
| + mExtensiveBookmarkChangesHappening); |
| } |
| } |
| @CalledByNative |
| private void bookmarkNodeChanged(BookmarkItem node) { |
| - for (BookmarkModelObserver observer : mObservers) { |
| - observer.bookmarkNodeChanged(node); |
| + if (!mExtensiveBookmarkChangesHappening) { |
| + for (BookmarkModelObserver observer : mObservers) { |
| + observer.bookmarkNodeChangedNotDuringExtensiveChange(node); |
| + } |
| } |
| } |
| @CalledByNative |
| private void bookmarkNodeChildrenReordered(BookmarkItem node) { |
| - for (BookmarkModelObserver observer : mObservers) { |
| - observer.bookmarkNodeChildrenReordered(node); |
| + if (!mExtensiveBookmarkChangesHappening) { |
| + for (BookmarkModelObserver observer : mObservers) { |
| + observer.bookmarkNodeChildrenReorderedNotDuringExtensiveChange(node); |
| + } |
| } |
| } |
| @CalledByNative |
| private void extensiveBookmarkChangesBeginning() { |
| - for (BookmarkModelObserver observer : mObservers) { |
| - observer.extensiveBookmarkChangesBeginning(); |
| - } |
| + mExtensiveBookmarkChangesHappening = true; |
| } |
| @CalledByNative |
| private void extensiveBookmarkChangesEnded() { |
| - for (BookmarkModelObserver observer : mObservers) { |
| - observer.extensiveBookmarkChangesEnded(); |
| - } |
| + mExtensiveBookmarkChangesHappening = false; |
| + bookmarkModelChanged(); |
| } |
| @CalledByNative |
| private void bookmarkModelChanged() { |
| - for (BookmarkModelObserver observer : mObservers) { |
| - observer.bookmarkModelChanged(); |
| + if (!mExtensiveBookmarkChangesHappening) { |
| + for (BookmarkModelObserver observer : mObservers) { |
| + observer.bookmarkModelChangedNotDuringExtensiveChange(); |
| + } |
| } |
| } |