Loading api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -20865,6 +20865,7 @@ package android.provider { field public static final int FLAG_PROVIDES_IMAGES = 32; // 0x20 field public static final int FLAG_PROVIDES_VIDEO = 16; // 0x10 field public static final int FLAG_SUPPORTS_CREATE = 1; // 0x1 field public static final int FLAG_SUPPORTS_RECENTS = 64; // 0x40 field public static final int ROOT_TYPE_DEVICE = 3; // 0x3 field public static final int ROOT_TYPE_SERVICE = 1; // 0x1 field public static final int ROOT_TYPE_SHORTCUT = 2; // 0x2 core/java/android/provider/DocumentsContract.java +9 −0 Original line number Diff line number Diff line Loading @@ -411,6 +411,15 @@ public final class DocumentsContract { * @see Intent#EXTRA_MIME_TYPES */ public static final int FLAG_PROVIDES_IMAGES = 1 << 5; /** * Flag indicating that this root can report recently modified * documents. * * @see #COLUMN_FLAGS * @see DocumentsContract#buildRecentDocumentsUri(String, String) */ public static final int FLAG_SUPPORTS_RECENTS = 1 << 6; } /** Loading packages/DocumentsUI/Android.mk +1 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 guava LOCAL_PACKAGE_NAME := DocumentsUI LOCAL_CERTIFICATE := platform Loading packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +53 −34 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ import android.widget.Toast; import com.android.documentsui.DocumentsActivity.State; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.RootInfo; import com.android.internal.util.Predicate; import com.google.android.collect.Lists; Loading @@ -86,6 +87,7 @@ public class DirectoryFragment extends Fragment { public static final int TYPE_NORMAL = 1; public static final int TYPE_SEARCH = 2; public static final int TYPE_RECENT_OPEN = 3; private int mType = TYPE_NORMAL; Loading @@ -95,7 +97,10 @@ public class DirectoryFragment extends Fragment { private LoaderCallbacks<DirectoryResult> mCallbacks; private static final String EXTRA_TYPE = "type"; private static final String EXTRA_URI = "uri"; private static final String EXTRA_AUTHORITY = "authority"; private static final String EXTRA_ROOT_ID = "rootId"; private static final String EXTRA_DOC_ID = "docId"; private static final String EXTRA_QUERY = "query"; private static AtomicInteger sLoaderId = new AtomicInteger(4000); Loading @@ -104,24 +109,26 @@ public class DirectoryFragment extends Fragment { private final int mLoaderId = sLoaderId.incrementAndGet(); public static void showNormal(FragmentManager fm, Uri uri) { show(fm, TYPE_NORMAL, uri); show(fm, TYPE_NORMAL, uri.getAuthority(), null, DocumentsContract.getDocumentId(uri), null); } public static void showSearch(FragmentManager fm, Uri uri, String query) { final Uri searchUri = DocumentsContract.buildSearchDocumentsUri( uri.getAuthority(), DocumentsContract.getDocumentId(uri), query); show(fm, TYPE_SEARCH, searchUri); show(fm, TYPE_SEARCH, uri.getAuthority(), null, DocumentsContract.getDocumentId(uri), query); } @Deprecated public static void showRecentsOpen(FragmentManager fm) { // TODO: new recents behavior show(fm, TYPE_RECENT_OPEN, null, null, null, null); } private static void show(FragmentManager fm, int type, Uri uri) { private static void show(FragmentManager fm, int type, String authority, String rootId, String docId, String query) { final Bundle args = new Bundle(); args.putInt(EXTRA_TYPE, type); args.putParcelable(EXTRA_URI, uri); args.putString(EXTRA_AUTHORITY, authority); args.putString(EXTRA_ROOT_ID, rootId); args.putString(EXTRA_DOC_ID, docId); args.putString(EXTRA_QUERY, query); final DirectoryFragment fragment = new DirectoryFragment(); fragment.setArguments(args); Loading Loading @@ -160,9 +167,8 @@ public class DirectoryFragment extends Fragment { super.onActivityCreated(savedInstanceState); final Context context = getActivity(); final Uri uri = getArguments().getParcelable(EXTRA_URI); mAdapter = new DocumentsAdapter(uri.getAuthority()); mAdapter = new DocumentsAdapter(); mType = getArguments().getInt(EXTRA_TYPE); mCallbacks = new LoaderCallbacks<DirectoryResult>() { Loading @@ -170,15 +176,26 @@ public class DirectoryFragment extends Fragment { public Loader<DirectoryResult> onCreateLoader(int id, Bundle args) { final State state = getDisplayState(DirectoryFragment.this); final String authority = getArguments().getString(EXTRA_AUTHORITY); final String rootId = getArguments().getString(EXTRA_ROOT_ID); final String docId = getArguments().getString(EXTRA_DOC_ID); final String query = getArguments().getString(EXTRA_QUERY); Uri contentsUri; if (mType == TYPE_NORMAL) { contentsUri = DocumentsContract.buildChildDocumentsUri( uri.getAuthority(), DocumentsContract.getDocumentId(uri)); } else { contentsUri = uri; } switch (mType) { case TYPE_NORMAL: contentsUri = DocumentsContract.buildChildDocumentsUri(authority, docId); return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder); case TYPE_SEARCH: contentsUri = DocumentsContract.buildSearchDocumentsUri( authority, docId, query); return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder); case TYPE_RECENT_OPEN: return new RecentLoader(context); default: throw new IllegalStateException("Unknown type " + mType); return new DirectoryLoader(context, contentsUri, state.sortOrder); } } @Override Loading Loading @@ -246,8 +263,7 @@ public class DirectoryFragment extends Fragment { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final Cursor cursor = mAdapter.getItem(position); final Uri uri = getArguments().getParcelable(EXTRA_URI); final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(uri, cursor); final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor); if (mFilter.apply(doc)) { ((DocumentsActivity) getActivity()).onDocumentPicked(doc); } Loading Loading @@ -285,8 +301,7 @@ public class DirectoryFragment extends Fragment { for (int i = 0; i < size; i++) { if (checked.valueAt(i)) { final Cursor cursor = mAdapter.getItem(checked.keyAt(i)); final Uri uri = getArguments().getParcelable(EXTRA_URI); final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(uri, cursor); final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor); docs.add(doc); } } Loading Loading @@ -401,14 +416,8 @@ public class DirectoryFragment extends Fragment { } private class DocumentsAdapter extends BaseAdapter { private final String mAuthority; private Cursor mCursor; public DocumentsAdapter(String authority) { mAuthority = authority; } public void swapCursor(Cursor cursor) { mCursor = cursor; Loading Loading @@ -443,6 +452,8 @@ public class DirectoryFragment extends Fragment { final Cursor cursor = getItem(position); final String docAuthority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY); final String docRootId = getCursorString(cursor, RootCursorWrapper.COLUMN_ROOT_ID); final String docId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); final String docDisplayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME); Loading @@ -466,7 +477,7 @@ public class DirectoryFragment extends Fragment { } if ((docFlags & Document.FLAG_SUPPORTS_THUMBNAIL) != 0) { final Uri uri = DocumentsContract.buildDocumentUri(mAuthority, docId); final Uri uri = DocumentsContract.buildDocumentUri(docAuthority, docId); final Bitmap cachedResult = thumbs.get(uri); if (cachedResult != null) { icon.setImageBitmap(cachedResult); Loading @@ -477,13 +488,20 @@ public class DirectoryFragment extends Fragment { task.execute(uri); } } else if (docIcon != 0) { icon.setImageDrawable(DocumentInfo.loadIcon(context, mAuthority, docIcon)); icon.setImageDrawable(DocumentInfo.loadIcon(context, docAuthority, docIcon)); } else { icon.setImageDrawable(RootsCache.resolveDocumentIcon(context, docMimeType)); } title.setText(docDisplayName); if (mType == TYPE_RECENT_OPEN) { final RootInfo root = roots.getRoot(docAuthority, docRootId); icon1.setVisibility(View.VISIBLE); icon1.setImageDrawable(root.loadIcon(context)); summary.setText(root.getDirectoryString()); summary.setVisibility(View.VISIBLE); } else { icon1.setVisibility(View.GONE); if (docSummary != null) { summary.setText(docSummary); Loading @@ -491,6 +509,7 @@ public class DirectoryFragment extends Fragment { } else { summary.setVisibility(View.INVISIBLE); } } if (summaryGrid != null) { summaryGrid.setVisibility( Loading packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +12 −6 Original line number Diff line number Diff line Loading @@ -48,14 +48,16 @@ class DirectoryResult implements AutoCloseable { public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver(); private final String mRootId; private final Uri mUri; private final int mSortOrder; private CancellationSignal mSignal; private DirectoryResult mResult; public DirectoryLoader(Context context, Uri uri, int sortOrder) { public DirectoryLoader(Context context, String rootId, Uri uri, int sortOrder) { super(context); mRootId = rootId; mUri = uri; mSortOrder = sortOrder; } Loading @@ -69,12 +71,16 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { mSignal = new CancellationSignal(); } final DirectoryResult result = new DirectoryResult(); final String authority = mUri.getAuthority(); try { result.client = getContext() .getContentResolver().acquireUnstableContentProviderClient(mUri.getAuthority()); .getContentResolver().acquireUnstableContentProviderClient(authority); final Cursor cursor = result.client.query( mUri, null, null, null, getQuerySortOrder(), mSignal); result.cursor = new SortingCursorWrapper(cursor, mSortOrder); mUri, null, null, null, getQuerySortOrder(mSortOrder), mSignal); final Cursor withRoot = new RootCursorWrapper(mUri.getAuthority(), mRootId, cursor, -1); final Cursor sorted = new SortingCursorWrapper(withRoot, mSortOrder); result.cursor = sorted; result.cursor.registerContentObserver(mObserver); } catch (Exception e) { result.exception = e; Loading Loading @@ -149,8 +155,8 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { getContext().getContentResolver().unregisterContentObserver(mObserver); } private String getQuerySortOrder() { switch (mSortOrder) { public static String getQuerySortOrder(int sortOrder) { switch (sortOrder) { case SORT_ORDER_DISPLAY_NAME: return Document.COLUMN_DISPLAY_NAME + " ASC"; case SORT_ORDER_LAST_MODIFIED: Loading Loading
api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -20865,6 +20865,7 @@ package android.provider { field public static final int FLAG_PROVIDES_IMAGES = 32; // 0x20 field public static final int FLAG_PROVIDES_VIDEO = 16; // 0x10 field public static final int FLAG_SUPPORTS_CREATE = 1; // 0x1 field public static final int FLAG_SUPPORTS_RECENTS = 64; // 0x40 field public static final int ROOT_TYPE_DEVICE = 3; // 0x3 field public static final int ROOT_TYPE_SERVICE = 1; // 0x1 field public static final int ROOT_TYPE_SHORTCUT = 2; // 0x2
core/java/android/provider/DocumentsContract.java +9 −0 Original line number Diff line number Diff line Loading @@ -411,6 +411,15 @@ public final class DocumentsContract { * @see Intent#EXTRA_MIME_TYPES */ public static final int FLAG_PROVIDES_IMAGES = 1 << 5; /** * Flag indicating that this root can report recently modified * documents. * * @see #COLUMN_FLAGS * @see DocumentsContract#buildRecentDocumentsUri(String, String) */ public static final int FLAG_SUPPORTS_RECENTS = 1 << 6; } /** Loading
packages/DocumentsUI/Android.mk +1 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 guava LOCAL_PACKAGE_NAME := DocumentsUI LOCAL_CERTIFICATE := platform Loading
packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +53 −34 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ import android.widget.Toast; import com.android.documentsui.DocumentsActivity.State; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.RootInfo; import com.android.internal.util.Predicate; import com.google.android.collect.Lists; Loading @@ -86,6 +87,7 @@ public class DirectoryFragment extends Fragment { public static final int TYPE_NORMAL = 1; public static final int TYPE_SEARCH = 2; public static final int TYPE_RECENT_OPEN = 3; private int mType = TYPE_NORMAL; Loading @@ -95,7 +97,10 @@ public class DirectoryFragment extends Fragment { private LoaderCallbacks<DirectoryResult> mCallbacks; private static final String EXTRA_TYPE = "type"; private static final String EXTRA_URI = "uri"; private static final String EXTRA_AUTHORITY = "authority"; private static final String EXTRA_ROOT_ID = "rootId"; private static final String EXTRA_DOC_ID = "docId"; private static final String EXTRA_QUERY = "query"; private static AtomicInteger sLoaderId = new AtomicInteger(4000); Loading @@ -104,24 +109,26 @@ public class DirectoryFragment extends Fragment { private final int mLoaderId = sLoaderId.incrementAndGet(); public static void showNormal(FragmentManager fm, Uri uri) { show(fm, TYPE_NORMAL, uri); show(fm, TYPE_NORMAL, uri.getAuthority(), null, DocumentsContract.getDocumentId(uri), null); } public static void showSearch(FragmentManager fm, Uri uri, String query) { final Uri searchUri = DocumentsContract.buildSearchDocumentsUri( uri.getAuthority(), DocumentsContract.getDocumentId(uri), query); show(fm, TYPE_SEARCH, searchUri); show(fm, TYPE_SEARCH, uri.getAuthority(), null, DocumentsContract.getDocumentId(uri), query); } @Deprecated public static void showRecentsOpen(FragmentManager fm) { // TODO: new recents behavior show(fm, TYPE_RECENT_OPEN, null, null, null, null); } private static void show(FragmentManager fm, int type, Uri uri) { private static void show(FragmentManager fm, int type, String authority, String rootId, String docId, String query) { final Bundle args = new Bundle(); args.putInt(EXTRA_TYPE, type); args.putParcelable(EXTRA_URI, uri); args.putString(EXTRA_AUTHORITY, authority); args.putString(EXTRA_ROOT_ID, rootId); args.putString(EXTRA_DOC_ID, docId); args.putString(EXTRA_QUERY, query); final DirectoryFragment fragment = new DirectoryFragment(); fragment.setArguments(args); Loading Loading @@ -160,9 +167,8 @@ public class DirectoryFragment extends Fragment { super.onActivityCreated(savedInstanceState); final Context context = getActivity(); final Uri uri = getArguments().getParcelable(EXTRA_URI); mAdapter = new DocumentsAdapter(uri.getAuthority()); mAdapter = new DocumentsAdapter(); mType = getArguments().getInt(EXTRA_TYPE); mCallbacks = new LoaderCallbacks<DirectoryResult>() { Loading @@ -170,15 +176,26 @@ public class DirectoryFragment extends Fragment { public Loader<DirectoryResult> onCreateLoader(int id, Bundle args) { final State state = getDisplayState(DirectoryFragment.this); final String authority = getArguments().getString(EXTRA_AUTHORITY); final String rootId = getArguments().getString(EXTRA_ROOT_ID); final String docId = getArguments().getString(EXTRA_DOC_ID); final String query = getArguments().getString(EXTRA_QUERY); Uri contentsUri; if (mType == TYPE_NORMAL) { contentsUri = DocumentsContract.buildChildDocumentsUri( uri.getAuthority(), DocumentsContract.getDocumentId(uri)); } else { contentsUri = uri; } switch (mType) { case TYPE_NORMAL: contentsUri = DocumentsContract.buildChildDocumentsUri(authority, docId); return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder); case TYPE_SEARCH: contentsUri = DocumentsContract.buildSearchDocumentsUri( authority, docId, query); return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder); case TYPE_RECENT_OPEN: return new RecentLoader(context); default: throw new IllegalStateException("Unknown type " + mType); return new DirectoryLoader(context, contentsUri, state.sortOrder); } } @Override Loading Loading @@ -246,8 +263,7 @@ public class DirectoryFragment extends Fragment { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final Cursor cursor = mAdapter.getItem(position); final Uri uri = getArguments().getParcelable(EXTRA_URI); final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(uri, cursor); final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor); if (mFilter.apply(doc)) { ((DocumentsActivity) getActivity()).onDocumentPicked(doc); } Loading Loading @@ -285,8 +301,7 @@ public class DirectoryFragment extends Fragment { for (int i = 0; i < size; i++) { if (checked.valueAt(i)) { final Cursor cursor = mAdapter.getItem(checked.keyAt(i)); final Uri uri = getArguments().getParcelable(EXTRA_URI); final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(uri, cursor); final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor); docs.add(doc); } } Loading Loading @@ -401,14 +416,8 @@ public class DirectoryFragment extends Fragment { } private class DocumentsAdapter extends BaseAdapter { private final String mAuthority; private Cursor mCursor; public DocumentsAdapter(String authority) { mAuthority = authority; } public void swapCursor(Cursor cursor) { mCursor = cursor; Loading Loading @@ -443,6 +452,8 @@ public class DirectoryFragment extends Fragment { final Cursor cursor = getItem(position); final String docAuthority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY); final String docRootId = getCursorString(cursor, RootCursorWrapper.COLUMN_ROOT_ID); final String docId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); final String docDisplayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME); Loading @@ -466,7 +477,7 @@ public class DirectoryFragment extends Fragment { } if ((docFlags & Document.FLAG_SUPPORTS_THUMBNAIL) != 0) { final Uri uri = DocumentsContract.buildDocumentUri(mAuthority, docId); final Uri uri = DocumentsContract.buildDocumentUri(docAuthority, docId); final Bitmap cachedResult = thumbs.get(uri); if (cachedResult != null) { icon.setImageBitmap(cachedResult); Loading @@ -477,13 +488,20 @@ public class DirectoryFragment extends Fragment { task.execute(uri); } } else if (docIcon != 0) { icon.setImageDrawable(DocumentInfo.loadIcon(context, mAuthority, docIcon)); icon.setImageDrawable(DocumentInfo.loadIcon(context, docAuthority, docIcon)); } else { icon.setImageDrawable(RootsCache.resolveDocumentIcon(context, docMimeType)); } title.setText(docDisplayName); if (mType == TYPE_RECENT_OPEN) { final RootInfo root = roots.getRoot(docAuthority, docRootId); icon1.setVisibility(View.VISIBLE); icon1.setImageDrawable(root.loadIcon(context)); summary.setText(root.getDirectoryString()); summary.setVisibility(View.VISIBLE); } else { icon1.setVisibility(View.GONE); if (docSummary != null) { summary.setText(docSummary); Loading @@ -491,6 +509,7 @@ public class DirectoryFragment extends Fragment { } else { summary.setVisibility(View.INVISIBLE); } } if (summaryGrid != null) { summaryGrid.setVisibility( Loading
packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +12 −6 Original line number Diff line number Diff line Loading @@ -48,14 +48,16 @@ class DirectoryResult implements AutoCloseable { public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver(); private final String mRootId; private final Uri mUri; private final int mSortOrder; private CancellationSignal mSignal; private DirectoryResult mResult; public DirectoryLoader(Context context, Uri uri, int sortOrder) { public DirectoryLoader(Context context, String rootId, Uri uri, int sortOrder) { super(context); mRootId = rootId; mUri = uri; mSortOrder = sortOrder; } Loading @@ -69,12 +71,16 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { mSignal = new CancellationSignal(); } final DirectoryResult result = new DirectoryResult(); final String authority = mUri.getAuthority(); try { result.client = getContext() .getContentResolver().acquireUnstableContentProviderClient(mUri.getAuthority()); .getContentResolver().acquireUnstableContentProviderClient(authority); final Cursor cursor = result.client.query( mUri, null, null, null, getQuerySortOrder(), mSignal); result.cursor = new SortingCursorWrapper(cursor, mSortOrder); mUri, null, null, null, getQuerySortOrder(mSortOrder), mSignal); final Cursor withRoot = new RootCursorWrapper(mUri.getAuthority(), mRootId, cursor, -1); final Cursor sorted = new SortingCursorWrapper(withRoot, mSortOrder); result.cursor = sorted; result.cursor.registerContentObserver(mObserver); } catch (Exception e) { result.exception = e; Loading Loading @@ -149,8 +155,8 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { getContext().getContentResolver().unregisterContentObserver(mObserver); } private String getQuerySortOrder() { switch (mSortOrder) { public static String getQuerySortOrder(int sortOrder) { switch (sortOrder) { case SORT_ORDER_DISPLAY_NAME: return Document.COLUMN_DISPLAY_NAME + " ASC"; case SORT_ORDER_LAST_MODIFIED: Loading