diff options
author | Makoto Onuki <omakoto@google.com> | 2015-07-01 14:55:14 -0700 |
---|---|---|
committer | Makoto Onuki <omakoto@google.com> | 2015-07-01 15:11:46 -0700 |
commit | 14a6df7d7626b5e3c739e4dafd11073a471c91a8 (patch) | |
tree | bd7ee64b25b0870be3b3626b37d287f17bf52bf1 /packages | |
parent | 0794acc557f52960e52b369c6e4e5bf0bc575d02 (diff) | |
download | frameworks_base-14a6df7d7626b5e3c739e4dafd11073a471c91a8.zip frameworks_base-14a6df7d7626b5e3c739e4dafd11073a471c91a8.tar.gz frameworks_base-14a6df7d7626b5e3c739e4dafd11073a471c91a8.tar.bz2 |
If user ejects a storage from details, take user to...
... the storage list view
1. Change to ExternalStorageProvider
When available volumes have changed, it now notifies on
"content://com.android.externalstorage.documents" rather than on
"content://com.android.externalstorage.documents/root/", because it'll also
affect "content://com.android.externalstorage.documents/document/*/children".
2. Change to DocumentUI
- DirectoryLoader now won't crash when a provider returns null.
- DirectoryFragment now closes itself (i.e. emulate a back press) when a load
failed.
- It now correctly reloads contents when a volume is ejected thanks to 1.
Bug 21472170
Change-Id: Icf4bbc2ebb9067313dbbb67083cd4115b0a75c58
Diffstat (limited to 'packages')
3 files changed, 33 insertions, 2 deletions
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java index f4be9c5..006f6e9 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java @@ -50,6 +50,8 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.CancellationSignal; +import android.os.Handler; +import android.os.Looper; import android.os.OperationCanceledException; import android.os.Parcelable; import android.provider.DocumentsContract; @@ -135,6 +137,8 @@ public class DirectoryFragment extends Fragment { private final int mLoaderId = 42; + private final Handler mHandler = new Handler(Looper.getMainLooper()); + public static void showNormal(FragmentManager fm, RootInfo root, DocumentInfo doc, int anim) { show(fm, TYPE_NORMAL, root, doc, null, anim); } @@ -297,6 +301,21 @@ public class DirectoryFragment extends Fragment { @Override public void onLoadFinished(Loader<DirectoryResult> loader, DirectoryResult result) { + if (result == null || result.exception != null) { + // onBackPressed does a fragment transaction, which can't be done inside + // onLoadFinished + mHandler.post(new Runnable() { + @Override + public void run() { + final Activity activity = getActivity(); + if (activity != null) { + activity.onBackPressed(); + } + } + }); + return; + } + if (!isAdded()) return; mAdapter.swapResult(result); diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java index 8e4ec8c..a8a61d2 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java @@ -31,7 +31,10 @@ import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.CancellationSignal; +import android.os.Handler; +import android.os.Looper; import android.os.OperationCanceledException; +import android.os.RemoteException; import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; import android.util.Log; @@ -163,6 +166,10 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { cursor = client.query( mUri, null, null, null, getQuerySortOrder(result.sortOrder), mSignal); + if (cursor == null) { + throw new RemoteException("Provider returned null"); + } + cursor.registerContentObserver(mObserver); cursor = new RootCursorWrapper(mUri.getAuthority(), mRoot.rootId, cursor, -1); diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index 4143e15..4f0c6a41 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -62,6 +62,9 @@ public class ExternalStorageProvider extends DocumentsProvider { public static final String AUTHORITY = "com.android.externalstorage.documents"; + private static final Uri BASE_URI = + new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(AUTHORITY).build(); + // docId format: root:path/to/file private static final String[] DEFAULT_ROOT_PROJECTION = new String[] { @@ -170,8 +173,10 @@ public class ExternalStorageProvider extends DocumentsProvider { Log.d(TAG, "After updating volumes, found " + mRoots.size() + " active roots"); - getContext().getContentResolver() - .notifyChange(DocumentsContract.buildRootsUri(AUTHORITY), null, false); + // Note this affects content://com.android.externalstorage.documents/root/39BD-07C5 + // as well as content://com.android.externalstorage.documents/document/*/children, + // so just notify on content://com.android.externalstorage.documents/. + getContext().getContentResolver().notifyChange(BASE_URI, null, false); } private static String[] resolveRootProjection(String[] projection) { |