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 17607dd961499eb12e2429126f876bcda4c35462..110c3e521b350a4a675e847cb959b944e07b02c0 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 mIsDoingExtensiveChanges; |
private long mNativeBookmarksBridge; |
private boolean mIsNativeBookmarkModelLoaded; |
private final List<DelayedBookmarkCallback> mDelayedBookmarkCallbacks = |
@@ -48,9 +49,13 @@ 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 mandatory to implement one method, bookmarkModelChanged. Other |
+ * methods are optional and if they aren't overridden, the default implementation of them will |
+ * eventually call bookmarkModelChanged. Unless noted otherwise, all the functions won't be |
+ * called during extensive change. |
*/ |
- public interface BookmarkModelObserver { |
+ public abstract static class BookmarkModelObserver { |
/** |
* Invoked when a node has moved. |
* @param oldParent The parent before the move. |
@@ -58,61 +63,79 @@ public class BookmarksBridge { |
* @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 bookmarkNodeMoved( |
+ BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, int newIndex) { |
+ bookmarkModelChanged(); |
+ } |
/** |
* Invoked when a node has been added. |
* @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 bookmarkNodeAdded(BookmarkItem parent, int index) { |
+ bookmarkModelChanged(); |
+ } |
+ |
+ /** |
+ * Invoked when a node has been removed, the item may still be starred though. This can |
+ * be called during extensive change, and have the flag argument indicating it. |
+ * @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 isDoingExtensiveChanges whether extensive changes are happening. |
+ */ |
+ public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node, |
+ boolean isDoingExtensiveChanges) { |
+ if (isDoingExtensiveChanges) return; |
+ |
+ bookmarkNodeRemoved(parent, oldIndex, node); |
+ } |
/** |
* 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. |
*/ |
- void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node); |
+ public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node) { |
+ bookmarkModelChanged(); |
+ } |
/** |
* Invoked when the title or url of a node changes. |
* @param node The node being changed. |
*/ |
- void bookmarkNodeChanged(BookmarkItem node); |
+ public void bookmarkNodeChanged(BookmarkItem node) { |
+ bookmarkModelChanged(); |
+ } |
/** |
* Invoked when the children (just direct children, not descendants) of a node have been |
* reordered in some way, such as sorted. |
* @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 bookmarkNodeChildrenReordered(BookmarkItem node) { |
+ bookmarkModelChanged(); |
+ } |
/** |
- * 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() { |
+ bookmarkModelChanged(); |
+ } |
/** |
* 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. |
- */ |
- void bookmarkModelChanged(); |
- |
- /** |
- * Called when the native side of bookmark is loaded and now in usable state. |
+ * callback methods or it wasn't handled by other callback methods. |
+ * Examples: |
+ * - On partner bookmarks change. |
+ * - On extensive change finished. |
+ * - Falling back from other methods that are not overridden in this class. |
*/ |
- void bookmarkModelLoaded(); |
+ public abstract void bookmarkModelChanged(); |
} |
/** |
@@ -122,6 +145,7 @@ public class BookmarksBridge { |
public BookmarksBridge(Profile profile) { |
mProfile = profile; |
mNativeBookmarksBridge = nativeInit(profile); |
+ mIsDoingExtensiveChanges = nativeIsDoingExtensiveChanges(mNativeBookmarksBridge); |
} |
/** |
@@ -396,6 +420,8 @@ public class BookmarksBridge { |
@CalledByNative |
private void bookmarkNodeMoved( |
BookmarkItem oldParent, int oldIndex, BookmarkItem newParent, int newIndex) { |
+ if (mIsDoingExtensiveChanges) return; |
+ |
for (BookmarkModelObserver observer : mObservers) { |
observer.bookmarkNodeMoved(oldParent, oldIndex, newParent, newIndex); |
} |
@@ -403,6 +429,8 @@ public class BookmarksBridge { |
@CalledByNative |
private void bookmarkNodeAdded(BookmarkItem parent, int index) { |
+ if (mIsDoingExtensiveChanges) return; |
+ |
for (BookmarkModelObserver observer : mObservers) { |
observer.bookmarkNodeAdded(parent, index); |
} |
@@ -411,12 +439,15 @@ public class BookmarksBridge { |
@CalledByNative |
private void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node) { |
for (BookmarkModelObserver observer : mObservers) { |
- observer.bookmarkNodeRemoved(parent, oldIndex, node); |
+ observer.bookmarkNodeRemoved(parent, oldIndex, node, |
+ mIsDoingExtensiveChanges); |
} |
} |
@CalledByNative |
private void bookmarkNodeChanged(BookmarkItem node) { |
+ if (mIsDoingExtensiveChanges) return; |
+ |
for (BookmarkModelObserver observer : mObservers) { |
observer.bookmarkNodeChanged(node); |
} |
@@ -424,6 +455,8 @@ public class BookmarksBridge { |
@CalledByNative |
private void bookmarkNodeChildrenReordered(BookmarkItem node) { |
+ if (mIsDoingExtensiveChanges) return; |
+ |
for (BookmarkModelObserver observer : mObservers) { |
observer.bookmarkNodeChildrenReordered(node); |
} |
@@ -431,20 +464,19 @@ public class BookmarksBridge { |
@CalledByNative |
private void extensiveBookmarkChangesBeginning() { |
- for (BookmarkModelObserver observer : mObservers) { |
- observer.extensiveBookmarkChangesBeginning(); |
- } |
+ mIsDoingExtensiveChanges = true; |
} |
@CalledByNative |
private void extensiveBookmarkChangesEnded() { |
- for (BookmarkModelObserver observer : mObservers) { |
- observer.extensiveBookmarkChangesEnded(); |
- } |
+ mIsDoingExtensiveChanges = false; |
+ bookmarkModelChanged(); |
} |
@CalledByNative |
private void bookmarkModelChanged() { |
+ if (mIsDoingExtensiveChanges) return; |
+ |
for (BookmarkModelObserver observer : mObservers) { |
observer.bookmarkModelChanged(); |
} |
@@ -514,6 +546,7 @@ public class BookmarksBridge { |
private static native long nativeGetNativeBookmarkModel(Profile profile); |
private static native boolean nativeIsEnhancedBookmarksFeatureEnabled(Profile profile); |
private native long nativeInit(Profile profile); |
+ private native boolean nativeIsDoingExtensiveChanges(long nativeBookmarksBridge); |
private native void nativeDestroy(long nativeBookmarksBridge); |
private static native boolean nativeIsEditBookmarksEnabled(); |