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

Commit f339f259 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Documents management mode; API adjustment.

Create documents manage mode to support Downloads and transient
storage devices.  Locks user into requested backend root, and forces
file sizes on and sorting by last modified.

Separate API constants for Documents versus Roots, and give concrete
MIME types for roots.

Treat null sizes as unknown.  Documents are always enabled in list
so that divider is drawn.  Mark external storage file as writable.

Bug: 10329983, 10332993, 10332952
Change-Id: I05f4fdf5b04041a38e1ba7fb30202a3b0c615bf6
parent 1d890e0d
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -32,6 +32,12 @@
                <category android:name="android.intent.category.OPENABLE" />
                <data android:mimeType="*/*" />
            </intent-filter>
            <!-- data expected to point at existing root to manage -->
            <intent-filter>
                <action android:name="android.intent.action.MANAGE_DOCUMENT" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/root" />
            </intent-filter>
        </activity>

        <activity
+2 −2
Original line number Diff line number Diff line
@@ -27,8 +27,8 @@ import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.net.Uri;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.DocumentColumns;
import android.provider.DocumentsContract.Documents;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
@@ -69,7 +69,7 @@ public class CreateDirectoryFragment extends DialogFragment {
                final String displayName = text1.getText().toString();

                final ContentValues values = new ContentValues();
                values.put(DocumentColumns.MIME_TYPE, DocumentsContract.MIME_TYPE_DIRECTORY);
                values.put(DocumentColumns.MIME_TYPE, Documents.MIME_TYPE_DIR);
                values.put(DocumentColumns.DISPLAY_NAME, displayName);

                final DocumentsActivity activity = (DocumentsActivity) getActivity();
+4 −17
Original line number Diff line number Diff line
@@ -190,10 +190,6 @@ public class DirectoryFragment extends Fragment {
    @Override
    public void onStart() {
        super.onStart();

        final Context context = getActivity();
        getDisplayState(this).showSize = SettingsActivity.getDisplayFileSize(context);

        getLoaderManager().restartLoader(mLoaderId, getArguments(), mCallbacks);
    }

@@ -244,8 +240,10 @@ public class DirectoryFragment extends Fragment {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            final Document doc = mAdapter.getItem(position);
            if (mFilter.apply(doc)) {
                ((DocumentsActivity) getActivity()).onDocumentPicked(doc);
            }
        }
    };

    private MultiChoiceModeListener mMultiListener = new MultiChoiceModeListener() {
@@ -389,7 +387,7 @@ public class DirectoryFragment extends Fragment {

            if (state.showSize) {
                size.setVisibility(View.VISIBLE);
                if (doc.isDirectory()) {
                if (doc.isDirectory() || doc.size == -1) {
                    size.setText(null);
                } else {
                    size.setText(Formatter.formatFileSize(context, doc.size));
@@ -415,16 +413,5 @@ public class DirectoryFragment extends Fragment {
        public long getItemId(int position) {
            return getItem(position).uri.hashCode();
        }

        @Override
        public boolean areAllItemsEnabled() {
            return false;
        }

        @Override
        public boolean isEnabled(int position) {
            final Document doc = getItem(position);
            return mFilter.apply(doc);
        }
    }
}
+67 −19
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.database.Cursor;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.DocumentColumns;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
@@ -63,6 +64,7 @@ public class DocumentsActivity extends Activity {
    public static final int ACTION_OPEN = 1;
    public static final int ACTION_CREATE = 2;
    public static final int ACTION_GET_CONTENT = 3;
    public static final int ACTION_MANAGE = 4;

    private int mAction;

@@ -91,6 +93,8 @@ public class DocumentsActivity extends Activity {
            mAction = ACTION_CREATE;
        } else if (Intent.ACTION_GET_CONTENT.equals(action)) {
            mAction = ACTION_GET_CONTENT;
        } else if (Intent.ACTION_MANAGE_DOCUMENT.equals(action)) {
            mAction = ACTION_MANAGE;
        }

        if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
@@ -98,7 +102,9 @@ public class DocumentsActivity extends Activity {
                    Intent.EXTRA_ALLOW_MULTIPLE, false);
        }

        if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
        if (mAction == ACTION_MANAGE) {
            mDisplayState.acceptMimes = new String[] { "*/*" };
        } else if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
            mDisplayState.acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
        } else {
            mDisplayState.acceptMimes = new String[] { intent.getType() };
@@ -120,10 +126,14 @@ public class DocumentsActivity extends Activity {
            moreApps.setComponent(null);
            moreApps.setPackage(null);
            RootsFragment.show(getFragmentManager(), moreApps);
        } else {
        } else if (mAction == ACTION_OPEN || mAction == ACTION_CREATE) {
            RootsFragment.show(getFragmentManager(), null);
        }

        if (mAction == ACTION_MANAGE) {
            mDisplayState.sortOrder = DisplayState.SORT_ORDER_DATE;
        }

        mRootsContainer = findViewById(R.id.container_roots);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
@@ -134,6 +144,22 @@ public class DocumentsActivity extends Activity {
        mDrawerLayout.setDrawerListener(mDrawerListener);
        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

        if (mAction == ACTION_MANAGE) {
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

            final Uri rootUri = intent.getData();
            final String authority = rootUri.getAuthority();
            final String rootId = DocumentsContract.getRootId(rootUri);

            final Root root = RootsCache.findRoot(this, authority, rootId);
            if (root != null) {
                onRootPicked(root, true);
            } else {
                Log.w(TAG, "Failed to find root: " + rootUri);
                finish();
            }

        } else {
            mDrawerLayout.openDrawer(mRootsContainer);

            // Restore last stack for calling package
@@ -155,6 +181,18 @@ public class DocumentsActivity extends Activity {

            onCurrentDirectoryChanged();
        }
    }

    @Override
    public void onStart() {
        super.onStart();

        if (mAction == ACTION_MANAGE) {
            mDisplayState.showSize = true;
        } else {
            mDisplayState.showSize = SettingsActivity.getDisplayFileSize(this);
        }
    }

    private DrawerListener mDrawerListener = new DrawerListener() {
        @Override
@@ -190,7 +228,6 @@ public class DocumentsActivity extends Activity {
        final ActionBar actionBar = getActionBar();

        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setDisplayHomeAsUpEnabled(true);

        if (mDrawerLayout.isDrawerOpen(mRootsContainer)) {
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
@@ -202,6 +239,9 @@ public class DocumentsActivity extends Activity {
                actionBar.setTitle(R.string.title_save);
            }

            actionBar.setDisplayHomeAsUpEnabled(true);
            mDrawerToggle.setDrawerIndicatorEnabled(true);

        } else {
            final Root root = getCurrentRoot();
            actionBar.setIcon(root != null ? root.icon : null);
@@ -217,8 +257,13 @@ public class DocumentsActivity extends Activity {
            }

            if (mStack.size() > 1) {
                actionBar.setDisplayHomeAsUpEnabled(true);
                mDrawerToggle.setDrawerIndicatorEnabled(false);
            } else if (mAction == ACTION_MANAGE) {
                actionBar.setDisplayHomeAsUpEnabled(false);
                mDrawerToggle.setDrawerIndicatorEnabled(false);
            } else {
                actionBar.setDisplayHomeAsUpEnabled(true);
                mDrawerToggle.setDrawerIndicatorEnabled(true);
            }
        }
@@ -269,6 +314,7 @@ public class DocumentsActivity extends Activity {
        final MenuItem search = menu.findItem(R.id.menu_search);
        final MenuItem grid =  menu.findItem(R.id.menu_grid);
        final MenuItem list = menu.findItem(R.id.menu_list);
        final MenuItem settings = menu.findItem(R.id.menu_settings);

        grid.setVisible(mDisplayState.mode != DisplayState.MODE_GRID);
        list.setVisible(mDisplayState.mode != DisplayState.MODE_LIST);
@@ -293,6 +339,8 @@ public class DocumentsActivity extends Activity {
        // TODO: close any search in-progress when hiding
        search.setVisible(searchVisible);

        settings.setVisible(mAction != ACTION_MANAGE);

        return true;
    }

+3 −1
Original line number Diff line number Diff line
@@ -49,7 +49,9 @@ public class MimePredicate implements Predicate<Document> {
    }

    public static boolean mimeMatches(String filter, String test) {
        if (filter.equals(test)) {
        if (test == null) {
            return false;
        } else if (filter.equals(test)) {
            return true;
        } else if ("*/*".equals(filter)) {
            return true;
Loading