From 655e66bceba7595a2b80e7a328433e6ed5dc28a9 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Mon, 23 Jan 2012 15:51:41 -0800 Subject: Inform ContentObservers about the changed content Uri. Added a new method ContentObserver.onChange(boolean, Uri) that receives the changed content Uri. This can help applications make better decisions about how to interpret a change notification. Change-Id: I8e35378b6485fe22c5bc240ba07557d269af0836 --- core/java/android/database/ContentObserver.java | 79 ++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 9 deletions(-) (limited to 'core/java/android/database/ContentObserver.java') diff --git a/core/java/android/database/ContentObserver.java b/core/java/android/database/ContentObserver.java index 4c20262..e4fbc28 100644 --- a/core/java/android/database/ContentObserver.java +++ b/core/java/android/database/ContentObserver.java @@ -16,6 +16,7 @@ package android.database; +import android.net.Uri; import android.os.Handler; /** @@ -83,6 +84,9 @@ public abstract class ContentObserver { /** * This method is called when a content change occurs. + *

+ * Subclasses should override this method to handle content changes. + *

* * @param selfChange True if this is a self-change notification. */ @@ -91,32 +95,89 @@ public abstract class ContentObserver { } /** - * Dispatches a change notification to the observer. + * This method is called when a content change occurs. + * Includes the changed content Uri when available. + *

+ * Subclasses should override this method to handle content changes. + * To ensure correct operation on older versions of the framework that + * did not provide a Uri argument, applications should also implement + * the {@link #onChange(boolean)} overload of this method whenever they + * implement the {@link #onChange(boolean, Uri)} overload. + *

+ * Example implementation: + *


+     * // Implement the onChange(boolean) method to delegate the change notification to
+     * // the onChange(boolean, Uri) method to ensure correct operation on older versions
+     * // of the framework that did not have the onChange(boolean, Uri) method.
+     * {@literal @Override}
+     * public void onChange(boolean selfChange) {
+     *     onChange(selfChange, null);
+     * }
+     *
+     * // Implement the onChange(boolean, Uri) method to take advantage of the new Uri argument.
+     * {@literal @Override}
+     * public void onChange(boolean selfChange, Uri uri) {
+     *     // Handle change.
+     * }
+     * 
+ *

* + * @param selfChange True if this is a self-change notification. + * @param uri The Uri of the changed content, or null if unknown. + */ + public void onChange(boolean selfChange, Uri uri) { + onChange(selfChange); + } + + /** + * Dispatches a change notification to the observer. + *

* If a {@link Handler} was supplied to the {@link ContentObserver} constructor, * then a call to the {@link #onChange} method is posted to the handler's message queue. * Otherwise, the {@link #onChange} method is invoked immediately on this thread. + *

* * @param selfChange True if this is a self-change notification. + * + * @deprecated Use {@link #dispatchChange(boolean, Uri)} instead. */ + @Deprecated public final void dispatchChange(boolean selfChange) { + dispatchChange(selfChange, null); + } + + /** + * Dispatches a change notification to the observer. + * Includes the changed content Uri when available. + *

+ * If a {@link Handler} was supplied to the {@link ContentObserver} constructor, + * then a call to the {@link #onChange} method is posted to the handler's message queue. + * Otherwise, the {@link #onChange} method is invoked immediately on this thread. + *

+ * + * @param selfChange True if this is a self-change notification. + * @param uri The Uri of the changed content, or null if unknown. + */ + public final void dispatchChange(boolean selfChange, Uri uri) { if (mHandler == null) { - onChange(selfChange); + onChange(selfChange, uri); } else { - mHandler.post(new NotificationRunnable(selfChange)); + mHandler.post(new NotificationRunnable(selfChange, uri)); } } private final class NotificationRunnable implements Runnable { - private final boolean mSelf; + private final boolean mSelfChange; + private final Uri mUri; - public NotificationRunnable(boolean self) { - mSelf = self; + public NotificationRunnable(boolean selfChange, Uri uri) { + mSelfChange = selfChange; + mUri = uri; } @Override public void run() { - ContentObserver.this.onChange(mSelf); + ContentObserver.this.onChange(mSelfChange, mUri); } } @@ -128,10 +189,10 @@ public abstract class ContentObserver { } @Override - public void onChange(boolean selfChange) { + public void onChange(boolean selfChange, Uri uri) { ContentObserver contentObserver = mContentObserver; if (contentObserver != null) { - contentObserver.dispatchChange(selfChange); + contentObserver.dispatchChange(selfChange, uri); } } -- cgit v1.1