Merge "Add extra checks to widget to make sure it clears when the account goes away" into jb-ub-mail-ur10
diff --git a/src/com/android/mail/widget/BaseWidgetProvider.java b/src/com/android/mail/widget/BaseWidgetProvider.java
index 8d0be11..98a5ad6 100644
--- a/src/com/android/mail/widget/BaseWidgetProvider.java
+++ b/src/com/android/mail/widget/BaseWidgetProvider.java
@@ -52,7 +52,6 @@
     public static final String EXTRA_FOLDER_URI = "folder-uri";
     public static final String EXTRA_FOLDER_CONVERSATION_LIST_URI = "folder-conversation-list-uri";
     public static final String EXTRA_FOLDER_DISPLAY_NAME = "folder-display-name";
-    public static final String EXTRA_UNREAD = "unread";
     public static final String EXTRA_UPDATE_ALL_WIDGETS = "update-all-widgets";
     public static final String WIDGET_ACCOUNT_PREFIX = "widget-account-";
 
@@ -139,8 +138,8 @@
         } else if (Utils.ACTION_NOTIFY_DATASET_CHANGED.equals(action)) {
             // Receive notification for a certain account.
             final Bundle extras = intent.getExtras();
-            final Uri accountUri = (Uri)extras.getParcelable(Utils.EXTRA_ACCOUNT_URI);
-            final Uri folderUri = (Uri)extras.getParcelable(Utils.EXTRA_FOLDER_URI);
+            final Uri accountUri = extras.getParcelable(Utils.EXTRA_ACCOUNT_URI);
+            final Uri folderUri = extras.getParcelable(Utils.EXTRA_FOLDER_URI);
             final boolean updateAllWidgets = extras.getBoolean(EXTRA_UPDATE_ALL_WIDGETS, false);
 
             if (accountUri == null && Utils.isEmpty(folderUri) && !updateAllWidgets) {
@@ -383,12 +382,12 @@
                 WidgetService.class);
     }
 
-    private final void migrateAllLegacyWidgetInformation(Context context) {
+    private void migrateAllLegacyWidgetInformation(Context context) {
         final int[] currentWidgetIds = getCurrentWidgetIds(context);
         migrateLegacyWidgets(context, currentWidgetIds);
     }
 
-    private final void migrateLegacyWidgets(Context context, int[] widgetIds) {
+    private void migrateLegacyWidgets(Context context, int[] widgetIds) {
         for (int widgetId : widgetIds) {
             // We only want to bother to attempt to upgrade a widget if we don't already
             // have information about.
@@ -398,7 +397,7 @@
         }
     }
 
-    private final void validateAllWidgetInformation(Context context) {
+    private void validateAllWidgetInformation(Context context) {
         final int[] widgetIds = getCurrentWidgetIds(context);
         for (int widgetId : widgetIds) {
             final String accountFolder = MailPrefs.get(context).getWidgetConfiguration(widgetId);
diff --git a/src/com/android/mail/widget/WidgetService.java b/src/com/android/mail/widget/WidgetService.java
index daf57ce..7ad6095 100644
--- a/src/com/android/mail/widget/WidgetService.java
+++ b/src/com/android/mail/widget/WidgetService.java
@@ -60,7 +60,7 @@
     /**
      * Lock to avoid race condition between widgets.
      */
-    private static Object sWidgetLock = new Object();
+    private static final Object sWidgetLock = new Object();
 
     private static final String LOG_TAG = LogTag.getLogTag();
 
@@ -202,6 +202,7 @@
 
         private static final int FOLDER_LOADER_ID = 0;
         private static final int CONVERSATION_CURSOR_LOADER_ID = 1;
+        private static final int ACCOUNT_LOADER_ID = 2;
 
         private final Context mContext;
         private final int mAppWidgetId;
@@ -214,6 +215,7 @@
         private CursorLoader mConversationCursorLoader;
         private Cursor mConversationCursor;
         private CursorLoader mFolderLoader;
+        private CursorLoader mAccountLoader;
         private FolderUpdateHandler mFolderUpdateHandler;
         private int mFolderCount;
         private boolean mShouldShowViewMore;
@@ -232,8 +234,8 @@
             mFolderType = intent.getIntExtra(WidgetProvider.EXTRA_FOLDER_TYPE, FolderType.DEFAULT);
             mFolderDisplayName = intent.getStringExtra(WidgetProvider.EXTRA_FOLDER_DISPLAY_NAME);
 
-            Uri folderUri = intent.getParcelableExtra(WidgetProvider.EXTRA_FOLDER_URI);
-            Uri folderConversationListUri =
+            final Uri folderUri = intent.getParcelableExtra(WidgetProvider.EXTRA_FOLDER_URI);
+            final Uri folderConversationListUri =
                     intent.getParcelableExtra(WidgetProvider.EXTRA_FOLDER_CONVERSATION_LIST_URI);
             if (folderUri != null && folderConversationListUri != null) {
                 mFolderUri = folderUri;
@@ -241,6 +243,7 @@
             } else {
                 // This is a old intent created in version UR8 (or earlier).
                 String folderString = intent.getStringExtra(Utils.EXTRA_FOLDER);
+                //noinspection deprecation
                 Folder folder = Folder.fromString(folderString);
                 if (folder != null) {
                     mFolderUri = folder.folderUri.fullUri;
@@ -304,6 +307,10 @@
                     res.getInteger(R.integer.widget_folder_refresh_delay_ms));
             mFolderUpdateHandler.scheduleTask();
 
+            mAccountLoader = new CursorLoader(mContext, mAccount.uri,
+                    UIProvider.ACCOUNTS_PROJECTION_NO_CAPABILITIES, null, null, null);
+            mAccountLoader.registerListener(ACCOUNT_LOADER_ID, this);
+            mAccountLoader.startLoading();
         }
 
         @Override
@@ -325,6 +332,12 @@
                 mFolderLoader.unregisterListener(this);
                 mFolderLoader = null;
             }
+
+            if (mAccountLoader != null) {
+                mAccountLoader.reset();
+                mAccountLoader.unregisterListener(this);
+                mAccountLoader = null;
+            }
         }
 
         @Override
@@ -360,7 +373,7 @@
          * Returns the number of conversations that should be shown in the widget.  This method
          * doesn't update the boolean that indicates that the "show more" item should be included
          * in the list.
-         * @return
+         * @return count
          */
         private int getConversationCount() {
             synchronized (sWidgetLock) {
@@ -519,6 +532,11 @@
             final RemoteViews remoteViews =
                     new RemoteViews(mContext.getPackageName(), R.layout.widget);
 
+            if (!mService.isWidgetConfigured(mContext, mAppWidgetId, mAccount)) {
+                BaseWidgetProvider.updateWidget(mContext, mAppWidgetId, mAccount, mFolderType,
+                        mFolderUri, mFolderConversationListUri, mFolderDisplayName);
+            }
+
             if (loader == mFolderLoader) {
                 if (!isDataValid(data)) {
                     return;
@@ -586,6 +604,9 @@
                             mContext.getString(R.string.no_conversations));
                     appWidgetManager.partiallyUpdateAppWidget(mAppWidgetId, remoteViews);
                 }
+            } else if (loader == mAccountLoader) {
+                BaseWidgetProvider.updateWidget(mContext, mAppWidgetId, mAccount, mFolderType,
+                        mFolderUri, mFolderConversationListUri, mFolderDisplayName);
             }
         }