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

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

Merge "Updated documents UX around action bar." into klp-dev

parents bb45c8ac ded77187
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -29,13 +29,4 @@
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textAlignment="viewStart" />

    <TextView
        android:id="@android:id/summary"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textAlignment="viewStart" />

</LinearLayout>
+17 −0
Original line number Diff line number Diff line
@@ -27,6 +27,23 @@
        android:showAsAction="always|collapseActionView"
        android:actionViewClass="android.widget.SearchView"
        android:imeOptions="actionSearch" />
    <item
        android:id="@+id/menu_sort"
        android:title="@string/menu_sort"
        android:icon="@drawable/ic_menu_sort"
        android:showAsAction="always">
        <menu>
            <item
                android:id="@+id/menu_sort_name"
                android:title="@string/sort_name" />
            <item
                android:id="@+id/menu_sort_date"
                android:title="@string/sort_date" />
            <item
                android:id="@+id/menu_sort_size"
                android:title="@string/sort_size" />
        </menu>
    </item>
    <item
        android:id="@+id/menu_grid"
        android:title="@string/menu_grid"
+2 −7
Original line number Diff line number Diff line
@@ -397,15 +397,10 @@ public class DirectoryFragment extends Fragment {
                continue;
            }

            try {
                if (resolver.delete(doc.uri, null, null) != 1) {
            if (!DocumentsContract.deleteDocument(resolver, doc.uri)) {
                Log.w(TAG, "Failed to delete " + doc);
                hadTrouble = true;
            }
            } catch (Exception e) {
                Log.w(TAG, "Failed to delete " + doc + ": " + e);
                hadTrouble = true;
            }
        }

        if (hadTrouble) {
+79 −55
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import android.app.FragmentManager;
import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ComponentName;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
@@ -65,6 +64,8 @@ import com.android.documentsui.model.DocumentStack;
import com.android.documentsui.model.DurableUtils;
import com.android.documentsui.model.RootInfo;

import libcore.io.IoUtils;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
@@ -81,6 +82,8 @@ public class DocumentsActivity extends Activity {

    private static final String EXTRA_STATE = "state";

    private boolean mIgnoreNextNavigation;

    private RootsCache mRoots;
    private State mState;

@@ -192,12 +195,22 @@ public class DocumentsActivity extends Activity {
            } catch (IOException e) {
                Log.w(TAG, "Failed to resume", e);
            } finally {
                cursor.close();
                IoUtils.closeQuietly(cursor);
            }

            // If restored root isn't valid, fall back to recents
            final RootInfo root = getCurrentRoot();
            final List<RootInfo> matchingRoots = mRoots.getMatchingRoots(mState);
            if (!matchingRoots.contains(root)) {
                mState.stack.clear();
            }

            // Only open drawer when showing recents
            if (mState.stack.isRecents()) {
                mDrawerLayout.openDrawer(mRootsContainer);
            }
        }
    }

    @Override
    public void onStart() {
@@ -245,6 +258,14 @@ public class DocumentsActivity extends Activity {

        actionBar.setDisplayShowHomeEnabled(true);

        if (mState.action == ACTION_MANAGE) {
            actionBar.setDisplayHomeAsUpEnabled(false);
            mDrawerToggle.setDrawerIndicatorEnabled(false);
        } else {
            actionBar.setDisplayHomeAsUpEnabled(true);
            mDrawerToggle.setDrawerIndicatorEnabled(true);
        }

        if (mDrawerLayout.isDrawerOpen(mRootsContainer)) {
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
            actionBar.setIcon(new ColorDrawable());
@@ -254,33 +275,19 @@ public class DocumentsActivity extends Activity {
            } else if (mState.action == ACTION_CREATE) {
                actionBar.setTitle(R.string.title_save);
            }

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

        } else {
            final RootInfo root = getCurrentRoot();
            actionBar.setIcon(root != null ? root.loadIcon(this) : null);

            if (mRoots.isRecentsRoot(root)) {
            if (mState.stack.size() <= 1) {
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
                actionBar.setTitle(root.title);
            } else {
                mIgnoreNextNavigation = true;
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
                actionBar.setTitle(null);
                actionBar.setListNavigationCallbacks(mSortAdapter, mSortListener);
                actionBar.setSelectedNavigationItem(mState.sortOrder);
            }

            if (mState.stack.size() > 1) {
                actionBar.setDisplayHomeAsUpEnabled(true);
                mDrawerToggle.setDrawerIndicatorEnabled(false);
            } else if (mState.action == ACTION_MANAGE) {
                actionBar.setDisplayHomeAsUpEnabled(false);
                mDrawerToggle.setDrawerIndicatorEnabled(false);
            } else {
                actionBar.setDisplayHomeAsUpEnabled(true);
                mDrawerToggle.setDrawerIndicatorEnabled(true);
                actionBar.setListNavigationCallbacks(mStackAdapter, mStackListener);
                actionBar.setSelectedNavigationItem(mStackAdapter.getCount() - 1);
            }
        }
    }
@@ -328,6 +335,8 @@ public class DocumentsActivity extends Activity {

        final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
        final MenuItem search = menu.findItem(R.id.menu_search);
        final MenuItem sort = menu.findItem(R.id.menu_sort);
        final MenuItem sortSize = menu.findItem(R.id.menu_sort_size);
        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);
@@ -335,6 +344,11 @@ public class DocumentsActivity extends Activity {
        grid.setVisible(mState.mode != MODE_GRID);
        list.setVisible(mState.mode != MODE_LIST);

        // No sorting in recents
        sort.setVisible(cwd != null);
        // Only sort by size when visible
        sortSize.setVisible(mState.showSize);

        final boolean searchVisible;
        if (mState.action == ACTION_CREATE) {
            createDir.setVisible(cwd != null && cwd.isCreateSupported());
@@ -375,6 +389,18 @@ public class DocumentsActivity extends Activity {
            return true;
        } else if (id == R.id.menu_search) {
            return false;
        } else if (id == R.id.menu_sort_name) {
            mState.sortOrder = State.SORT_ORDER_DISPLAY_NAME;
            updateDisplayState();
            return true;
        } else if (id == R.id.menu_sort_date) {
            mState.sortOrder = State.SORT_ORDER_LAST_MODIFIED;
            updateDisplayState();
            return true;
        } else if (id == R.id.menu_sort_size) {
            mState.sortOrder = State.SORT_ORDER_SIZE;
            updateDisplayState();
            return true;
        } else if (id == R.id.menu_grid) {
            // TODO: persist explicit user mode for cwd
            mState.mode = MODE_GRID;
@@ -421,25 +447,15 @@ public class DocumentsActivity extends Activity {
        updateActionBar();
    }

    // TODO: support additional sort orders
    private BaseAdapter mSortAdapter = new BaseAdapter() {
    private BaseAdapter mStackAdapter = new BaseAdapter() {
        @Override
        public int getCount() {
            return mState.showSize ? 3 : 2;
            return mState.stack.size();
        }

        @Override
        public Object getItem(int position) {
            switch (position) {
                case 0:
                    return getText(R.string.sort_name);
                case 1:
                    return getText(R.string.sort_date);
                case 2:
                    return getText(R.string.sort_size);
                default:
                    return null;
            }
        public DocumentInfo getItem(int position) {
            return mState.stack.get(mState.stack.size() - position - 1);
        }

        @Override
@@ -455,17 +471,15 @@ public class DocumentsActivity extends Activity {
            }

            final TextView title = (TextView) convertView.findViewById(android.R.id.title);
            final TextView summary = (TextView) convertView.findViewById(android.R.id.summary);
            final DocumentInfo doc = getItem(position);

            if (mState.stack.size() > 0) {
                title.setText(mState.stack.getTitle(mRoots));
            if (position == 0) {
                final RootInfo root = getCurrentRoot();
                title.setText(root.title);
            } else {
                // No directory means recents
                title.setText(R.string.root_recent);
                title.setText(doc.displayName);
            }

            summary.setText((String) getItem(position));

            return convertView;
        }

@@ -477,17 +491,31 @@ public class DocumentsActivity extends Activity {
            }

            final TextView text1 = (TextView) convertView.findViewById(android.R.id.text1);
            text1.setText((String) getItem(position));
            final DocumentInfo doc = getItem(position);

            if (position == 0) {
                final RootInfo root = getCurrentRoot();
                text1.setText(root.title);
            } else {
                text1.setText(doc.displayName);
            }

            return convertView;
        }
    };

    private OnNavigationListener mSortListener = new OnNavigationListener() {
    private OnNavigationListener mStackListener = new OnNavigationListener() {
        @Override
        public boolean onNavigationItemSelected(int itemPosition, long itemId) {
            mState.sortOrder = itemPosition;
            updateDisplayState();
            if (mIgnoreNextNavigation) {
                mIgnoreNextNavigation = false;
                return false;
            }

            while (mState.stack.size() > itemPosition + 1) {
                mState.stack.pop();
            }
            onCurrentDirectoryChanged();
            return true;
        }
    };
@@ -629,16 +657,12 @@ public class DocumentsActivity extends Activity {
        final DocumentInfo cwd = getCurrentDirectory();
        final String authority = cwd.uri.getAuthority();

        final ContentProviderClient client = getContentResolver()
                .acquireUnstableContentProviderClient(authority);
        try {
        final Uri childUri = DocumentsContract.createDocument(
                getContentResolver(), cwd.uri, mimeType, displayName);
        if (childUri != null) {
            onFinished(childUri);
        } catch (Exception e) {
        } else {
            Toast.makeText(this, R.string.save_error, Toast.LENGTH_SHORT).show();
        } finally {
            ContentProviderClient.closeQuietly(client);
        }
    }

+5 −33
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.documentsui.model;

import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -26,7 +27,6 @@ import android.net.Uri;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;

import com.android.documentsui.RecentsProvider;
import com.android.documentsui.RootCursorWrapper;

import libcore.io.IoUtils;
@@ -117,41 +117,12 @@ public class DocumentInfo implements Durable {
        return doc;
    }

    @Deprecated
    public static DocumentInfo 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);

        Cursor cursor = null;
        try {
            cursor = resolver.query(uri, null, null, null, null);
            if (!cursor.moveToFirst()) {
                throw new FileNotFoundException("Missing details for " + uri);
            }

            final DocumentInfo doc = new DocumentInfo();
            doc.uri = uri;
            doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
            doc.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME);
            doc.lastModified = lastModified;
            doc.flags = getCursorInt(cursor, Document.COLUMN_FLAGS)
                    & Document.FLAG_SUPPORTS_THUMBNAIL;
            doc.summary = getCursorString(cursor, Document.COLUMN_SUMMARY);
            doc.size = getCursorLong(cursor, Document.COLUMN_SIZE);
            doc.icon = getCursorInt(cursor, Document.COLUMN_ICON);
            return doc;
        } catch (Throwable t) {
            throw asFileNotFoundException(t);
        } finally {
            IoUtils.closeQuietly(cursor);
        }
    }

    public static DocumentInfo fromUri(ContentResolver resolver, Uri uri) throws FileNotFoundException {
        final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
                uri.getAuthority());
        Cursor cursor = null;
        try {
            cursor = resolver.query(uri, null, null, null, null);
            cursor = client.query(uri, null, null, null, null);
            if (!cursor.moveToFirst()) {
                throw new FileNotFoundException("Missing details for " + uri);
            }
@@ -169,6 +140,7 @@ public class DocumentInfo implements Durable {
            throw asFileNotFoundException(t);
        } finally {
            IoUtils.closeQuietly(cursor);
            ContentProviderClient.closeQuietly(client);
        }
    }

Loading