Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0c2d31bf authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Better handling of broken storage providers.

Begin throwing FNFE when storage provider doesn't know about document
or when it's having trouble.  Treat all provider errors as FNFE and
avoid crashing our UI.

Change-Id: I946f1ae4125791999464dc4ce494853d5d1c0629
parent 9fb567b5
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -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();
                }
            }
+10 −3
Original line number Diff line number Diff line
@@ -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:
                        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);
                }
            }
+7 −3
Original line number Diff line number Diff line
@@ -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) {
            try {
                onDocumentPicked(Document.fromRoot(getContentResolver(), root));
            } catch (FileNotFoundException e) {
            }
        } else {
            onCurrentDirectoryChanged();
        }
+10 −2
Original line number Diff line number Diff line
@@ -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));
                    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);
+30 −10
Original line number Diff line number Diff line
@@ -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;
    }
}
Loading