Loading core/java/android/provider/DocumentsContract.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -65,7 +65,7 @@ public final class DocumentsContract { public static final String META_DATA_DOCUMENT_PROVIDER = "android.content.DOCUMENT_PROVIDER"; public static final String META_DATA_DOCUMENT_PROVIDER = "android.content.DOCUMENT_PROVIDER"; /** {@hide} */ /** {@hide} */ public static final String ACTION_ROOTS_CHANGED = "android.provider.action.ROOTS_CHANGED"; public static final String ACTION_DOCUMENT_CHANGED = "android.provider.action.DOCUMENT_CHANGED"; /** /** * {@link DocumentColumns#DOC_ID} value representing the root directory of a * {@link DocumentColumns#DOC_ID} value representing the root directory of a Loading Loading @@ -496,7 +496,7 @@ public final class DocumentsContract { * This signal is used to invalidate internal caches. * This signal is used to invalidate internal caches. */ */ public static void notifyRootsChanged(Context context, String authority) { public static void notifyRootsChanged(Context context, String authority) { final Intent intent = new Intent(ACTION_ROOTS_CHANGED); final Intent intent = new Intent(ACTION_DOCUMENT_CHANGED); intent.setData(buildRootsUri(authority)); intent.setData(buildRootsUri(authority)); context.sendBroadcast(intent); context.sendBroadcast(intent); } } Loading packages/DocumentsUI/AndroidManifest.xml +8 −0 Original line number Original line Diff line number Diff line Loading @@ -17,11 +17,19 @@ <intent-filter android:priority="100"> <intent-filter android:priority="100"> <action android:name="android.intent.action.OPEN_DOCUMENT" /> <action android:name="android.intent.action.OPEN_DOCUMENT" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.OPENABLE" /> <data android:mimeType="*/*" /> <data android:mimeType="*/*" /> </intent-filter> </intent-filter> <intent-filter android:priority="100"> <intent-filter android:priority="100"> <action android:name="android.intent.action.CREATE_DOCUMENT" /> <action android:name="android.intent.action.CREATE_DOCUMENT" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.OPENABLE" /> <data android:mimeType="*/*" /> </intent-filter> <intent-filter android:priority="100"> <action android:name="android.intent.action.GET_CONTENT" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.OPENABLE" /> <data android:mimeType="*/*" /> <data android:mimeType="*/*" /> </intent-filter> </intent-filter> </activity> </activity> Loading packages/DocumentsUI/res/values/strings.xml +1 −0 Original line number Original line Diff line number Diff line Loading @@ -47,6 +47,7 @@ <string name="root_type_service">Services</string> <string name="root_type_service">Services</string> <string name="root_type_shortcut">Shortcuts</string> <string name="root_type_shortcut">Shortcuts</string> <string name="root_type_device">Devices</string> <string name="root_type_device">Devices</string> <string name="root_type_apps">More apps</string> <string name="pref_advanced_devices">Display advanced devices</string> <string name="pref_advanced_devices">Display advanced devices</string> <string name="pref_file_size">Display file size</string> <string name="pref_file_size">Display file size</string> Loading packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +5 −1 Original line number Original line Diff line number Diff line Loading @@ -144,7 +144,7 @@ public class DirectoryFragment extends Fragment { final DisplayState state = getDisplayState(DirectoryFragment.this); final DisplayState state = getDisplayState(DirectoryFragment.this); mFilter = new MimePredicate(state.acceptMimes); mFilter = new MimePredicate(state.acceptMimes); final Uri contentsUri; Uri contentsUri; if (mType == TYPE_NORMAL) { if (mType == TYPE_NORMAL) { contentsUri = DocumentsContract.buildContentsUri(uri); contentsUri = DocumentsContract.buildContentsUri(uri); } else if (mType == TYPE_RECENT_OPEN) { } else if (mType == TYPE_RECENT_OPEN) { Loading @@ -153,6 +153,10 @@ public class DirectoryFragment extends Fragment { contentsUri = uri; contentsUri = uri; } } if (state.localOnly) { contentsUri = DocumentsContract.setLocalOnly(contentsUri); } final Comparator<Document> sortOrder; final Comparator<Document> sortOrder; if (state.sortOrder == DisplayState.SORT_ORDER_DATE || mType == TYPE_RECENT_OPEN) { if (state.sortOrder == DisplayState.SORT_ORDER_DATE || mType == TYPE_RECENT_OPEN) { sortOrder = new Document.DateComparator(); sortOrder = new Document.DateComparator(); Loading packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +34 −2 Original line number Original line Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.content.Context; import android.database.Cursor; import android.database.Cursor; import android.net.Uri; import android.net.Uri; import android.os.CancellationSignal; import android.os.CancellationSignal; import android.provider.DocumentsContract.DocumentColumns; import android.util.Log; import android.util.Log; import com.android.documentsui.model.Document; import com.android.documentsui.model.Document; Loading @@ -38,6 +39,7 @@ import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.ArrayList; import java.util.Collections; import java.util.Collections; import java.util.Comparator; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.List; public class DirectoryLoader extends UriDerivativeLoader<List<Document>> { public class DirectoryLoader extends UriDerivativeLoader<List<Document>> { Loading @@ -46,6 +48,17 @@ public class DirectoryLoader extends UriDerivativeLoader<List<Document>> { private Predicate<Document> mFilter; private Predicate<Document> mFilter; private Comparator<Document> mSortOrder; private Comparator<Document> mSortOrder; /** * Stub result that represents an internal error. */ public static class ExceptionResult extends LinkedList<Document> { public final Exception e; public ExceptionResult(Exception e) { this.e = e; } } public DirectoryLoader(Context context, Uri uri, int type, Predicate<Document> filter, public DirectoryLoader(Context context, Uri uri, int type, Predicate<Document> filter, Comparator<Document> sortOrder) { Comparator<Document> sortOrder) { super(context, uri); super(context, uri); Loading @@ -56,11 +69,18 @@ public class DirectoryLoader extends UriDerivativeLoader<List<Document>> { @Override @Override public List<Document> loadInBackground(Uri uri, CancellationSignal signal) { public List<Document> loadInBackground(Uri uri, CancellationSignal signal) { try { return loadInBackgroundInternal(uri, signal); } catch (Exception e) { return new ExceptionResult(e); } } private List<Document> loadInBackgroundInternal(Uri uri, CancellationSignal signal) { final ArrayList<Document> result = Lists.newArrayList(); final ArrayList<Document> result = Lists.newArrayList(); // TODO: send selection and sorting hints to backend final ContentResolver resolver = getContext().getContentResolver(); final ContentResolver resolver = getContext().getContentResolver(); final Cursor cursor = resolver.query(uri, null, null, null, null, signal); final Cursor cursor = resolver.query(uri, null, null, null, getQuerySortOrder(), signal); try { try { while (cursor != null && cursor.moveToNext()) { while (cursor != null && cursor.moveToNext()) { Document doc = null; Document doc = null; Loading Loading @@ -94,4 +114,16 @@ public class DirectoryLoader extends UriDerivativeLoader<List<Document>> { return result; return result; } } private String getQuerySortOrder() { if (mSortOrder instanceof Document.DateComparator) { return DocumentColumns.LAST_MODIFIED + " DESC"; } else if (mSortOrder instanceof Document.NameComparator) { return DocumentColumns.DISPLAY_NAME + " ASC"; } else if (mSortOrder instanceof Document.SizeComparator) { return DocumentColumns.SIZE + " DESC"; } else { return null; } } } } Loading
core/java/android/provider/DocumentsContract.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -65,7 +65,7 @@ public final class DocumentsContract { public static final String META_DATA_DOCUMENT_PROVIDER = "android.content.DOCUMENT_PROVIDER"; public static final String META_DATA_DOCUMENT_PROVIDER = "android.content.DOCUMENT_PROVIDER"; /** {@hide} */ /** {@hide} */ public static final String ACTION_ROOTS_CHANGED = "android.provider.action.ROOTS_CHANGED"; public static final String ACTION_DOCUMENT_CHANGED = "android.provider.action.DOCUMENT_CHANGED"; /** /** * {@link DocumentColumns#DOC_ID} value representing the root directory of a * {@link DocumentColumns#DOC_ID} value representing the root directory of a Loading Loading @@ -496,7 +496,7 @@ public final class DocumentsContract { * This signal is used to invalidate internal caches. * This signal is used to invalidate internal caches. */ */ public static void notifyRootsChanged(Context context, String authority) { public static void notifyRootsChanged(Context context, String authority) { final Intent intent = new Intent(ACTION_ROOTS_CHANGED); final Intent intent = new Intent(ACTION_DOCUMENT_CHANGED); intent.setData(buildRootsUri(authority)); intent.setData(buildRootsUri(authority)); context.sendBroadcast(intent); context.sendBroadcast(intent); } } Loading
packages/DocumentsUI/AndroidManifest.xml +8 −0 Original line number Original line Diff line number Diff line Loading @@ -17,11 +17,19 @@ <intent-filter android:priority="100"> <intent-filter android:priority="100"> <action android:name="android.intent.action.OPEN_DOCUMENT" /> <action android:name="android.intent.action.OPEN_DOCUMENT" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.OPENABLE" /> <data android:mimeType="*/*" /> <data android:mimeType="*/*" /> </intent-filter> </intent-filter> <intent-filter android:priority="100"> <intent-filter android:priority="100"> <action android:name="android.intent.action.CREATE_DOCUMENT" /> <action android:name="android.intent.action.CREATE_DOCUMENT" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.OPENABLE" /> <data android:mimeType="*/*" /> </intent-filter> <intent-filter android:priority="100"> <action android:name="android.intent.action.GET_CONTENT" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.OPENABLE" /> <data android:mimeType="*/*" /> <data android:mimeType="*/*" /> </intent-filter> </intent-filter> </activity> </activity> Loading
packages/DocumentsUI/res/values/strings.xml +1 −0 Original line number Original line Diff line number Diff line Loading @@ -47,6 +47,7 @@ <string name="root_type_service">Services</string> <string name="root_type_service">Services</string> <string name="root_type_shortcut">Shortcuts</string> <string name="root_type_shortcut">Shortcuts</string> <string name="root_type_device">Devices</string> <string name="root_type_device">Devices</string> <string name="root_type_apps">More apps</string> <string name="pref_advanced_devices">Display advanced devices</string> <string name="pref_advanced_devices">Display advanced devices</string> <string name="pref_file_size">Display file size</string> <string name="pref_file_size">Display file size</string> Loading
packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +5 −1 Original line number Original line Diff line number Diff line Loading @@ -144,7 +144,7 @@ public class DirectoryFragment extends Fragment { final DisplayState state = getDisplayState(DirectoryFragment.this); final DisplayState state = getDisplayState(DirectoryFragment.this); mFilter = new MimePredicate(state.acceptMimes); mFilter = new MimePredicate(state.acceptMimes); final Uri contentsUri; Uri contentsUri; if (mType == TYPE_NORMAL) { if (mType == TYPE_NORMAL) { contentsUri = DocumentsContract.buildContentsUri(uri); contentsUri = DocumentsContract.buildContentsUri(uri); } else if (mType == TYPE_RECENT_OPEN) { } else if (mType == TYPE_RECENT_OPEN) { Loading @@ -153,6 +153,10 @@ public class DirectoryFragment extends Fragment { contentsUri = uri; contentsUri = uri; } } if (state.localOnly) { contentsUri = DocumentsContract.setLocalOnly(contentsUri); } final Comparator<Document> sortOrder; final Comparator<Document> sortOrder; if (state.sortOrder == DisplayState.SORT_ORDER_DATE || mType == TYPE_RECENT_OPEN) { if (state.sortOrder == DisplayState.SORT_ORDER_DATE || mType == TYPE_RECENT_OPEN) { sortOrder = new Document.DateComparator(); sortOrder = new Document.DateComparator(); Loading
packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +34 −2 Original line number Original line Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.content.Context; import android.database.Cursor; import android.database.Cursor; import android.net.Uri; import android.net.Uri; import android.os.CancellationSignal; import android.os.CancellationSignal; import android.provider.DocumentsContract.DocumentColumns; import android.util.Log; import android.util.Log; import com.android.documentsui.model.Document; import com.android.documentsui.model.Document; Loading @@ -38,6 +39,7 @@ import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.ArrayList; import java.util.Collections; import java.util.Collections; import java.util.Comparator; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.List; public class DirectoryLoader extends UriDerivativeLoader<List<Document>> { public class DirectoryLoader extends UriDerivativeLoader<List<Document>> { Loading @@ -46,6 +48,17 @@ public class DirectoryLoader extends UriDerivativeLoader<List<Document>> { private Predicate<Document> mFilter; private Predicate<Document> mFilter; private Comparator<Document> mSortOrder; private Comparator<Document> mSortOrder; /** * Stub result that represents an internal error. */ public static class ExceptionResult extends LinkedList<Document> { public final Exception e; public ExceptionResult(Exception e) { this.e = e; } } public DirectoryLoader(Context context, Uri uri, int type, Predicate<Document> filter, public DirectoryLoader(Context context, Uri uri, int type, Predicate<Document> filter, Comparator<Document> sortOrder) { Comparator<Document> sortOrder) { super(context, uri); super(context, uri); Loading @@ -56,11 +69,18 @@ public class DirectoryLoader extends UriDerivativeLoader<List<Document>> { @Override @Override public List<Document> loadInBackground(Uri uri, CancellationSignal signal) { public List<Document> loadInBackground(Uri uri, CancellationSignal signal) { try { return loadInBackgroundInternal(uri, signal); } catch (Exception e) { return new ExceptionResult(e); } } private List<Document> loadInBackgroundInternal(Uri uri, CancellationSignal signal) { final ArrayList<Document> result = Lists.newArrayList(); final ArrayList<Document> result = Lists.newArrayList(); // TODO: send selection and sorting hints to backend final ContentResolver resolver = getContext().getContentResolver(); final ContentResolver resolver = getContext().getContentResolver(); final Cursor cursor = resolver.query(uri, null, null, null, null, signal); final Cursor cursor = resolver.query(uri, null, null, null, getQuerySortOrder(), signal); try { try { while (cursor != null && cursor.moveToNext()) { while (cursor != null && cursor.moveToNext()) { Document doc = null; Document doc = null; Loading Loading @@ -94,4 +114,16 @@ public class DirectoryLoader extends UriDerivativeLoader<List<Document>> { return result; return result; } } private String getQuerySortOrder() { if (mSortOrder instanceof Document.DateComparator) { return DocumentColumns.LAST_MODIFIED + " DESC"; } else if (mSortOrder instanceof Document.NameComparator) { return DocumentColumns.DISPLAY_NAME + " ASC"; } else if (mSortOrder instanceof Document.SizeComparator) { return DocumentColumns.SIZE + " DESC"; } else { return null; } } } }