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

Commit 26d4adf3 authored by Jeff Sharkey's avatar Jeff Sharkey Committed by Android (Google) Code Review
Browse files

Merge "Better handling of broken storage providers."

parents 52df1db3 0c2d31bf
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