diff --git a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java index 44d7136258ae0..50273afeceb60 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java @@ -32,6 +32,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; +import android.database.ContentObserver; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; @@ -46,7 +47,6 @@ import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; -import android.view.WindowManager; import android.widget.Spinner; import com.android.documentsui.SearchViewManager.SearchManagerListener; @@ -78,6 +78,12 @@ public abstract class BaseActivity extends Activity List mEventListeners = new ArrayList<>(); private final String mTag; + private final ContentObserver mRootsCacheObserver = new ContentObserver(new Handler()) { + @Override + public void onChange(boolean selfChange) { + new HandleRootsChangedTask(BaseActivity.this).execute(getCurrentRoot()); + } + }; @LayoutRes private int mLayoutId; @@ -118,14 +124,8 @@ public abstract class BaseActivity extends Activity mRoots = DocumentsApplication.getRootsCache(this); - mRoots.setOnCacheUpdateListener( - new RootsCache.OnCacheUpdateListener() { - @Override - public void onCacheUpdate() { - new HandleRootsChangedTask(BaseActivity.this) - .execute(getCurrentRoot()); - } - }); + getContentResolver().registerContentObserver( + RootsCache.sNotificationUri, false, mRootsCacheObserver); mSearchManager = new SearchViewManager(this, icicle); @@ -190,7 +190,7 @@ public abstract class BaseActivity extends Activity @Override protected void onDestroy() { - mRoots.setOnCacheUpdateListener(null); + getContentResolver().unregisterContentObserver(mRootsCacheObserver); super.onDestroy(); } @@ -793,6 +793,7 @@ public abstract class BaseActivity extends Activity private static final class HandleRootsChangedTask extends PairedTask { + RootInfo mCurrentRoot; DocumentInfo mDefaultRootDocument; public HandleRootsChangedTask(BaseActivity activity) { @@ -802,11 +803,10 @@ public abstract class BaseActivity extends Activity @Override protected RootInfo run(RootInfo... roots) { assert(roots.length == 1); - - final RootInfo currentRoot = roots[0]; + mCurrentRoot = roots[0]; final Collection cachedRoots = mOwner.mRoots.getRootsBlocking(); for (final RootInfo root : cachedRoots) { - if (root.getUri().equals(currentRoot.getUri())) { + if (root.getUri().equals(mCurrentRoot.getUri())) { // We don't need to change the current root as the current root was not removed. return null; } @@ -827,6 +827,14 @@ public abstract class BaseActivity extends Activity return; } + // If the activity has been launched for the specific root and it is removed, finish the + // activity. + final Uri uri = mOwner.getIntent().getData(); + if (uri != null && uri.equals(mCurrentRoot.getUri())) { + mOwner.finish(); + return; + } + // Clear entire backstack and start in new root. mOwner.mState.onRootChanged(defaultRoot); mOwner.mSearchManager.update(defaultRoot); diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java index 559348e038dd1..88eeb49ec1691 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java @@ -67,7 +67,6 @@ public class RootsCache { private final Context mContext; private final ContentObserver mObserver; - private OnCacheUpdateListener mCacheUpdateListener; private final RootInfo mRecentsRoot; @@ -119,10 +118,6 @@ public class RootsCache { } } - static interface OnCacheUpdateListener { - void onCacheUpdate(); - } - /** * Gather roots from all known storage providers. */ @@ -280,13 +275,6 @@ public class RootsCache { return null; } - @Override - protected void onPostExecute(Void result) { - if (mCacheUpdateListener != null) { - mCacheUpdateListener.onCacheUpdate(); - } - } - private void handleDocumentsProvider(ProviderInfo info) { // Ignore stopped packages for now; we might query them // later during UI interaction. @@ -445,10 +433,6 @@ public class RootsCache { } } - public void setOnCacheUpdateListener(OnCacheUpdateListener cacheUpdateListener) { - mCacheUpdateListener = cacheUpdateListener; - } - /** * Returns the default root for the specified state. */