Update roots when data cleared, refresh UI.

Data cleared usually means accounts went away, so kick off roots
refresh.  Also update any visible UI after a refresh finishes.

Bug: 10899793
Change-Id: Id68c80b5e635e358cfd75f4961ce13cd1c7c5f82
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java
index 6b46e3a..547e343 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java
@@ -75,6 +75,7 @@
         packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
         packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
         packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+        packageFilter.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED);
         packageFilter.addDataScheme("package");
         registerReceiver(mCacheReceiver, packageFilter);
 
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
index b98e1ee..f6b43c7 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
@@ -60,8 +60,8 @@
 public class RootsCache {
     private static final boolean LOGD = true;
 
-    // TODO: cache roots in local provider to avoid spinning up backends
-    // TODO: root updates should trigger UI refresh
+    public static final Uri sNotificationUri = Uri.parse(
+            "content://com.android.documentsui.roots/");
 
     private final Context mContext;
     private final ContentObserver mObserver;
@@ -201,6 +201,7 @@
                 mStoppedAuthorities = mTaskStoppedAuthorities;
             }
             mFirstLoad.countDown();
+            resolver.notifyChange(sNotificationUri, null, false);
             return null;
         }
 
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RootsLoader.java
index 7108971..8d37cdf 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsLoader.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsLoader.java
@@ -25,6 +25,8 @@
 import java.util.Collection;
 
 public class RootsLoader extends AsyncTaskLoader<Collection<RootInfo>> {
+    private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();
+
     private final RootsCache mRoots;
     private final State mState;
 
@@ -34,6 +36,9 @@
         super(context);
         mRoots = roots;
         mState = state;
+
+        getContext().getContentResolver()
+                .registerContentObserver(RootsCache.sNotificationUri, false, mObserver);
     }
 
     @Override
@@ -77,5 +82,7 @@
         onStopLoading();
 
         mResult = null;
+
+        getContext().getContentResolver().unregisterContentObserver(mObserver);
     }
 }