diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a6407a6a6..8a449c3a8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -486,6 +486,9 @@
+
+
+
diff --git a/src/com/android/email/provider/EmailProvider.java b/src/com/android/email/provider/EmailProvider.java
index 798bfb050..bbedfdb26 100644
--- a/src/com/android/email/provider/EmailProvider.java
+++ b/src/com/android/email/provider/EmailProvider.java
@@ -23,6 +23,7 @@ import android.content.ContentProviderResult;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
+import android.content.Intent;
import android.content.Context;
import android.content.OperationApplicationException;
import android.content.UriMatcher;
@@ -86,6 +87,14 @@ public class EmailProvider extends ContentProvider {
public static final String ATTACHMENT_UPDATED_EXTRA_FLAGS =
"com.android.email.ATTACHMENT_UPDATED_FLAGS";
+ /**
+ * Notifies that changes happened. Certain UI components, e.g., widgets, can register for this
+ * {@link android.content.Intent} and update accordingly. However, this can be very broad and
+ * is NOT the preferred way of getting notification.
+ */
+ public static final String ACTION_NOTIFY_MESSAGE_LIST_DATASET_CHANGED =
+ "com.android.email.MESSAGE_LIST_DATASET_CHANGED";
+
public static final String EMAIL_MESSAGE_MIME_TYPE =
"vnd.android.cursor.item/email-message";
public static final String EMAIL_ATTACHMENT_MIME_TYPE =
@@ -2345,6 +2354,20 @@ outer:
} else {
resolver.notifyChange(baseUri, null);
}
+
+ // We want to send the message list changed notification if baseUri is Message.NOTIFIER_URI.
+ if (baseUri.equals(Message.NOTIFIER_URI)) {
+ sendMessageListDataChangedNotification();
+ }
+ }
+
+ private void sendMessageListDataChangedNotification() {
+ final Context context = getContext();
+ final Intent intent = new Intent(ACTION_NOTIFY_MESSAGE_LIST_DATASET_CHANGED);
+ // Ideally this intent would contain information about which account changed, to limit the
+ // updates to that particular account. Unfortunately, that information is not available in
+ // sendNotifierChange().
+ context.sendBroadcast(intent);
}
@Override
diff --git a/src/com/android/email/provider/WidgetProvider.java b/src/com/android/email/provider/WidgetProvider.java
index 9f7fc8512..0f6731b8b 100644
--- a/src/com/android/email/provider/WidgetProvider.java
+++ b/src/com/android/email/provider/WidgetProvider.java
@@ -19,12 +19,14 @@ package com.android.email.provider;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViewsService;
import com.android.email.Email;
+import com.android.email.R;
import com.android.email.widget.EmailWidget;
import com.android.email.widget.WidgetManager;
import com.android.emailcommon.Logging;
@@ -74,6 +76,20 @@ public class WidgetProvider extends AppWidgetProvider {
Log.d(EmailWidget.TAG, "onReceive");
}
super.onReceive(context, intent);
+
+ if (EmailProvider.ACTION_NOTIFY_MESSAGE_LIST_DATASET_CHANGED.equals(intent.getAction())) {
+ // Retrieve the list of current widgets.
+ final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
+ final ComponentName component = new ComponentName(context, WidgetProvider.class);
+ final int[] widgetIds = appWidgetManager.getAppWidgetIds(component);
+
+ // Ideally, this would only call notify AppWidgetViewDataChanged for the widgets, where
+ // the account had the change, but the current intent doesn't include this information.
+
+ // Calling notifyAppWidgetViewDataChanged will cause onDataSetChanged() to be called
+ // on the RemoteViewsService.RemoteViewsFactory, starting the service if necessary.
+ appWidgetManager.notifyAppWidgetViewDataChanged(widgetIds, R.id.message_list);
+ }
}
/**
diff --git a/src/com/android/email/widget/EmailWidget.java b/src/com/android/email/widget/EmailWidget.java
index 3f6a5c0c6..67a82f570 100644
--- a/src/com/android/email/widget/EmailWidget.java
+++ b/src/com/android/email/widget/EmailWidget.java
@@ -505,6 +505,10 @@ public class EmailWidget implements RemoteViewsService.RemoteViewsFactory,
@Override
public void onDataSetChanged() {
+ // Note: we are not doing anything special in onDataSetChanged(). Since this service has
+ // a reference to a loader that will keep itself updated, if the service is running, it
+ // shouldn't be necessary to for the query to be run again. If the service hadn't been
+ // running, the act of starting the service will also start the loader.
}
public void onDeleted() {