diff options
6 files changed, 71 insertions, 23 deletions
diff --git a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java index e19505f4b05a..313774ba469f 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java @@ -36,6 +36,8 @@ import android.widget.Toast; import com.android.documentsui.model.Document; +import java.io.FileNotFoundException; + /** * Dialog to create a new directory. */ @@ -73,12 +75,16 @@ public class CreateDirectoryFragment extends DialogFragment { final DocumentsActivity activity = (DocumentsActivity) getActivity(); final Document cwd = activity.getCurrentDirectory(); - final Uri childUri = resolver.insert(cwd.uri, values); - if (childUri != null) { + Uri childUri = resolver.insert(cwd.uri, values); + try { // Navigate into newly created child final Document childDoc = Document.fromUri(resolver, childUri); activity.onDocumentPicked(childDoc); - } else { + } catch (FileNotFoundException e) { + childUri = null; + } + + if (childUri == null) { Toast.makeText(context, R.string.save_error, Toast.LENGTH_SHORT).show(); } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java index a50c312659c0..94c2b6130d65 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java @@ -19,12 +19,14 @@ package com.android.documentsui; import static com.android.documentsui.DirectoryFragment.TYPE_NORMAL; import static com.android.documentsui.DirectoryFragment.TYPE_RECENT_OPEN; import static com.android.documentsui.DirectoryFragment.TYPE_SEARCH; +import static com.android.documentsui.DocumentsActivity.TAG; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.CancellationSignal; +import android.util.Log; import com.android.documentsui.model.Document; import com.android.internal.util.Predicate; @@ -32,6 +34,7 @@ import com.google.android.collect.Lists; import libcore.io.IoUtils; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -60,20 +63,24 @@ public class DirectoryLoader extends UriDerivativeLoader<List<Document>> { final Cursor cursor = resolver.query(uri, null, null, null, null, signal); try { while (cursor != null && cursor.moveToNext()) { - final Document doc; + Document doc = null; switch (mType) { case TYPE_NORMAL: case TYPE_SEARCH: doc = Document.fromDirectoryCursor(uri, cursor); break; case TYPE_RECENT_OPEN: - doc = Document.fromRecentOpenCursor(resolver, cursor); + try { + doc = Document.fromRecentOpenCursor(resolver, cursor); + } catch (FileNotFoundException e) { + Log.w(TAG, "Failed to find recent: " + e); + } break; default: throw new IllegalArgumentException("Unknown type"); } - if (mFilter == null || mFilter.apply(doc)) { + if (doc != null && (mFilter == null || mFilter.apply(doc))) { result.add(doc); } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java index fae567374062..8e7e087c487d 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java @@ -25,12 +25,10 @@ import android.content.ClipData; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Intent; -import android.content.SharedPreferences; import android.database.Cursor; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Bundle; -import android.preference.PreferenceManager; import android.provider.DocumentsContract.DocumentColumns; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.view.GravityCompat; @@ -53,6 +51,7 @@ import com.android.documentsui.model.Document; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.Root; +import java.io.FileNotFoundException; import java.util.Arrays; import java.util.List; @@ -138,6 +137,8 @@ public class DocumentsActivity extends Activity { cursor.getColumnIndex(RecentsProvider.COL_PATH)); mStack = DocumentStack.deserialize(getContentResolver(), raw); } + } catch (FileNotFoundException e) { + Log.w(TAG, "Failed to resume", e); } finally { cursor.close(); } @@ -470,7 +471,10 @@ public class DocumentsActivity extends Activity { mStack.clear(); if (!root.isRecents) { - onDocumentPicked(Document.fromRoot(getContentResolver(), root)); + try { + onDocumentPicked(Document.fromRoot(getContentResolver(), root)); + } catch (FileNotFoundException e) { + } } else { onCurrentDirectoryChanged(); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java index 1e018e73f04d..5cdc915dae9d 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java @@ -16,6 +16,8 @@ package com.android.documentsui; +import static com.android.documentsui.DocumentsActivity.TAG; + import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; @@ -28,6 +30,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.CancellationSignal; import android.text.TextUtils.TruncateAt; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -44,6 +47,7 @@ import com.google.android.collect.Lists; import libcore.io.IoUtils; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; @@ -136,8 +140,12 @@ public class RecentsCreateFragment extends Fragment { while (cursor != null && cursor.moveToNext()) { final String rawStack = cursor.getString( cursor.getColumnIndex(RecentsProvider.COL_PATH)); - final DocumentStack stack = DocumentStack.deserialize(resolver, rawStack); - result.add(stack); + try { + final DocumentStack stack = DocumentStack.deserialize(resolver, rawStack); + result.add(stack); + } catch (FileNotFoundException e) { + Log.w(TAG, "Failed to resolve stack: " + e); + } } } finally { IoUtils.closeQuietly(cursor); diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/Document.java b/packages/DocumentsUI/src/com/android/documentsui/model/Document.java index f2744658da5f..95922b40de3a 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/Document.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/Document.java @@ -21,10 +21,12 @@ import android.database.Cursor; import android.net.Uri; import android.provider.DocumentsContract; import android.provider.DocumentsContract.DocumentColumns; -import android.util.Log; import com.android.documentsui.RecentsProvider; +import libcore.io.IoUtils; + +import java.io.FileNotFoundException; import java.util.Comparator; /** @@ -50,7 +52,8 @@ public class Document { this.size = size; } - public static Document fromRoot(ContentResolver resolver, Root root) { + public static Document fromRoot(ContentResolver resolver, Root root) + throws FileNotFoundException { return fromUri(resolver, root.uri); } @@ -70,14 +73,16 @@ public class Document { return new Document(uri, mimeType, displayName, lastModified, flags, summary, size); } - public static Document fromRecentOpenCursor(ContentResolver resolver, Cursor recentCursor) { + public static Document fromRecentOpenCursor(ContentResolver resolver, Cursor recentCursor) + throws FileNotFoundException { final Uri uri = Uri.parse(getCursorString(recentCursor, RecentsProvider.COL_URI)); final long lastModified = getCursorLong(recentCursor, RecentsProvider.COL_TIMESTAMP); - final Cursor cursor = resolver.query(uri, null, null, null, null); + Cursor cursor = null; try { + cursor = resolver.query(uri, null, null, null, null); if (!cursor.moveToFirst()) { - throw new IllegalArgumentException("Missing details for " + uri); + throw new FileNotFoundException("Missing details for " + uri); } final String mimeType = getCursorString(cursor, DocumentColumns.MIME_TYPE); final String displayName = getCursorString(cursor, DocumentColumns.DISPLAY_NAME); @@ -87,16 +92,19 @@ public class Document { final long size = getCursorLong(cursor, DocumentColumns.SIZE); return new Document(uri, mimeType, displayName, lastModified, flags, summary, size); + } catch (Throwable t) { + throw asFileNotFoundException(t); } finally { - cursor.close(); + IoUtils.closeQuietly(cursor); } } - public static Document fromUri(ContentResolver resolver, Uri uri) { - final Cursor cursor = resolver.query(uri, null, null, null, null); + public static Document fromUri(ContentResolver resolver, Uri uri) throws FileNotFoundException { + Cursor cursor = null; try { + cursor = resolver.query(uri, null, null, null, null); if (!cursor.moveToFirst()) { - throw new IllegalArgumentException("Missing details for " + uri); + throw new FileNotFoundException("Missing details for " + uri); } final String mimeType = getCursorString(cursor, DocumentColumns.MIME_TYPE); final String displayName = getCursorString(cursor, DocumentColumns.DISPLAY_NAME); @@ -106,8 +114,10 @@ public class Document { final long size = getCursorLong(cursor, DocumentColumns.SIZE); return new Document(uri, mimeType, displayName, lastModified, flags, summary, size); + } catch (Throwable t) { + throw asFileNotFoundException(t); } finally { - cursor.close(); + IoUtils.closeQuietly(cursor); } } @@ -174,4 +184,14 @@ public class Document { return Long.compare(rhs.size, lhs.size); } } + + public static FileNotFoundException asFileNotFoundException(Throwable t) + throws FileNotFoundException { + if (t instanceof FileNotFoundException) { + throw (FileNotFoundException) t; + } + final FileNotFoundException fnfe = new FileNotFoundException(t.getMessage()); + fnfe.initCause(t); + throw fnfe; + } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java index 67dca07673b0..d6c852ed60d6 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java @@ -17,6 +17,7 @@ package com.android.documentsui.model; import static com.android.documentsui.DocumentsActivity.TAG; +import static com.android.documentsui.model.Document.asFileNotFoundException; import android.content.ContentResolver; import android.net.Uri; @@ -25,6 +26,7 @@ import android.util.Log; import org.json.JSONArray; import org.json.JSONException; +import java.io.FileNotFoundException; import java.util.LinkedList; /** @@ -41,7 +43,8 @@ public class DocumentStack extends LinkedList<Document> { return json.toString(); } - public static DocumentStack deserialize(ContentResolver resolver, String raw) { + public static DocumentStack deserialize(ContentResolver resolver, String raw) + throws FileNotFoundException { Log.d(TAG, "deserialize: " + raw); final DocumentStack stack = new DocumentStack(); @@ -53,7 +56,7 @@ public class DocumentStack extends LinkedList<Document> { stack.add(doc); } } catch (JSONException e) { - Log.w(TAG, "Failed to decode stack", e); + throw asFileNotFoundException(e); } // TODO: handle roots that have gone missing |