Loading res/values/config.xml +12 −1 Original line number Diff line number Diff line Loading @@ -19,9 +19,20 @@ <string name="trusted_quick_viewer_package" translatable="false"></string> <bool name="show_documents_root">false</bool> <bool name="enable_archive_creation">false</bool> <!-- Indicates if search view is taking the whole toolbar space. On larger layouts we reduce this to an input-box adjacent to menu actions. --> <bool name="full_bar_search_view">true</bool> <!-- New features must be added behind a boolean flag prefixed w/ "feature_". --> <bool name="feature_archive_creation">false</bool> <bool name="feature_remote_actions">true</bool> <bool name="feature_content_paging">true</bool> <bool name="feature_folders_in_search_results">true</bool> <bool name="feature_system_keyboard_navigation">true</bool> <bool name="feature_launch_to_document">true</bool> <bool name="feature_content_refresh">true</bool> <bool name="feature_virtual_files_sharing">true</bool> </resources> src/com/android/documentsui/AbstractActionHandler.java +9 −4 Original line number Diff line number Diff line Loading @@ -32,11 +32,11 @@ import android.view.DragEvent; import com.android.documentsui.AbstractActionHandler.CommonAddons; import com.android.documentsui.LoadDocStackTask.LoadDocStackCallback; import com.android.documentsui.archives.ArchivesProvider; import com.android.documentsui.base.BooleanConsumer; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.Lookup; import com.android.documentsui.base.Providers; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.base.State; Loading Loading @@ -130,8 +130,13 @@ public abstract class AbstractActionHandler<T extends Activity & CommonAddons> @Override public void refreshDocument(DocumentInfo doc, BooleanConsumer callback) { RefreshTask task = new RefreshTask(mState, doc, REFRESH_SPINNER_TIMEOUT, mActivity.getApplicationContext(), mActivity::isDestroyed, RefreshTask task = new RefreshTask( mInjector.features, mState, doc, REFRESH_SPINNER_TIMEOUT, mActivity.getApplicationContext(), mActivity::isDestroyed, callback); task.executeOnExecutor(mExecutors.lookup(doc == null ? null : doc.authority)); } Loading Loading @@ -343,7 +348,7 @@ public abstract class AbstractActionHandler<T extends Activity & CommonAddons> protected final boolean launchToDocument(Uri uri) { // We don't support launching to a document in an archive. if (!ArchivesProvider.AUTHORITY.equals(uri.getAuthority())) { if (!Providers.isArchiveUri(uri)) { loadDocument(uri, this::onStackLoaded); return true; } Loading src/com/android/documentsui/DirectoryLoader.java +14 −4 Original line number Diff line number Diff line Loading @@ -16,10 +16,13 @@ package com.android.documentsui; import static com.android.documentsui.base.Shared.VERBOSE; import android.content.AsyncTaskLoader; import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; Loading @@ -36,7 +39,6 @@ import com.android.documentsui.base.DebugFlags; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.FilteringCursorWrapper; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.roots.RootCursorWrapper; import com.android.documentsui.sorting.SortModel; Loading Loading @@ -100,7 +102,8 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { } result.client = client; if (Shared.ENABLE_OMC_API_FEATURES) { Resources resources = getContext().getResources(); if (resources.getBoolean(R.bool.feature_content_paging)) { Bundle queryArgs = new Bundle(); mModel.addQuerySortArgs(queryArgs); Loading @@ -122,12 +125,19 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { cursor = new RootCursorWrapper(mUri.getAuthority(), mRoot.rootId, cursor, -1); if (mSearchMode && !Shared.ENABLE_OMC_API_FEATURES) { if (mSearchMode && !resources.getBoolean(R.bool.feature_folders_in_search_results)) { // There is no findDocumentPath API. Enable filtering on folders in search mode. cursor = new FilteringCursorWrapper(cursor, null, SEARCH_REJECT_MIMES); } // TODO: When API tweaks have landed, use ContentResolver.EXTRA_HONORED_ARGS // instead of checking directly for ContentResolver.QUERY_ARG_SORT_COLUMNS (won't work) if (resources.getBoolean(R.bool.feature_content_paging) && cursor.getExtras().containsKey(ContentResolver.QUERY_ARG_SORT_COLUMNS)) { if (VERBOSE) Log.d(TAG, "Skipping sort of pre-sorted cursor. Booya!"); } else { cursor = mModel.sortCursor(cursor); } result.cursor = cursor; } catch (Exception e) { Log.w(TAG, "Failed to query", e); Loading src/com/android/documentsui/FocusManager.java +6 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.documentsui; import static com.android.documentsui.base.DocumentInfo.getCursorString; import static com.android.documentsui.base.Shared.DEBUG; import static com.android.internal.util.Preconditions.checkNotNull; import android.annotation.ColorRes; import android.annotation.Nullable; Loading @@ -41,8 +42,8 @@ import android.widget.TextView; import com.android.documentsui.base.EventListener; import com.android.documentsui.base.Events; import com.android.documentsui.base.Features; import com.android.documentsui.base.Procedure; import com.android.documentsui.base.Shared; import com.android.documentsui.dirlist.DocumentHolder; import com.android.documentsui.dirlist.DocumentsAdapter; import com.android.documentsui.dirlist.FocusHandler; Loading @@ -60,6 +61,7 @@ public final class FocusManager implements FocusHandler { private final ContentScope mScope = new ContentScope(); private final Features mFeatures; private final SelectionManager mSelectionMgr; private final DrawerController mDrawer; private final Procedure mRootsFocuser; Loading @@ -68,11 +70,13 @@ public final class FocusManager implements FocusHandler { private boolean mNavDrawerHasFocus; public FocusManager( Features features, SelectionManager selectionMgr, DrawerController drawer, Procedure rootsFocuser, @ColorRes int color) { mFeatures = checkNotNull(features); mSelectionMgr = selectionMgr; mDrawer = drawer; mRootsFocuser = rootsFocuser; Loading @@ -84,7 +88,7 @@ public final class FocusManager implements FocusHandler { public boolean advanceFocusArea() { // This should only be called in pre-O devices. // O has built-in keyboard navigation support. assert(!Shared.ENABLE_OMC_API_FEATURES); assert(!mFeatures.isSystemKeyboardNavigationEnabled()); boolean focusChanged = false; if (mNavDrawerHasFocus) { mDrawer.setOpen(false); Loading src/com/android/documentsui/Injector.java +7 −2 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.view.View; import com.android.documentsui.MenuManager.SelectionDetails; import com.android.documentsui.base.EventHandler; import com.android.documentsui.base.Features; import com.android.documentsui.dirlist.DocumentsAdapter; import com.android.documentsui.dirlist.Model; import com.android.documentsui.prefs.ScopedPreferences; Loading @@ -41,6 +42,7 @@ import java.lang.annotation.Target; */ public class Injector<T extends ActionHandler> { public final Features features; public final ActivityConfig config; public final ScopedPreferences prefs; public final MessageBuilder messages; Loading @@ -60,21 +62,24 @@ public class Injector<T extends ActionHandler> { @ContentScoped public SelectionManager selectionMgr; private final Model mModel = new Model(); private DocumentsAdapter mAdapter; private final Model mModel; // must be initialized before calling super.onCreate because prefs // are used in State initialization. public Injector( Features features, ActivityConfig config, ScopedPreferences prefs, MessageBuilder messages, DialogController dialogs) { this.features = features; this.config = config; this.prefs = prefs; this.messages = messages; this.dialogs = dialogs; mModel = new Model(this.features); } public Model getModel() { Loading Loading
res/values/config.xml +12 −1 Original line number Diff line number Diff line Loading @@ -19,9 +19,20 @@ <string name="trusted_quick_viewer_package" translatable="false"></string> <bool name="show_documents_root">false</bool> <bool name="enable_archive_creation">false</bool> <!-- Indicates if search view is taking the whole toolbar space. On larger layouts we reduce this to an input-box adjacent to menu actions. --> <bool name="full_bar_search_view">true</bool> <!-- New features must be added behind a boolean flag prefixed w/ "feature_". --> <bool name="feature_archive_creation">false</bool> <bool name="feature_remote_actions">true</bool> <bool name="feature_content_paging">true</bool> <bool name="feature_folders_in_search_results">true</bool> <bool name="feature_system_keyboard_navigation">true</bool> <bool name="feature_launch_to_document">true</bool> <bool name="feature_content_refresh">true</bool> <bool name="feature_virtual_files_sharing">true</bool> </resources>
src/com/android/documentsui/AbstractActionHandler.java +9 −4 Original line number Diff line number Diff line Loading @@ -32,11 +32,11 @@ import android.view.DragEvent; import com.android.documentsui.AbstractActionHandler.CommonAddons; import com.android.documentsui.LoadDocStackTask.LoadDocStackCallback; import com.android.documentsui.archives.ArchivesProvider; import com.android.documentsui.base.BooleanConsumer; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.Lookup; import com.android.documentsui.base.Providers; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.base.State; Loading Loading @@ -130,8 +130,13 @@ public abstract class AbstractActionHandler<T extends Activity & CommonAddons> @Override public void refreshDocument(DocumentInfo doc, BooleanConsumer callback) { RefreshTask task = new RefreshTask(mState, doc, REFRESH_SPINNER_TIMEOUT, mActivity.getApplicationContext(), mActivity::isDestroyed, RefreshTask task = new RefreshTask( mInjector.features, mState, doc, REFRESH_SPINNER_TIMEOUT, mActivity.getApplicationContext(), mActivity::isDestroyed, callback); task.executeOnExecutor(mExecutors.lookup(doc == null ? null : doc.authority)); } Loading Loading @@ -343,7 +348,7 @@ public abstract class AbstractActionHandler<T extends Activity & CommonAddons> protected final boolean launchToDocument(Uri uri) { // We don't support launching to a document in an archive. if (!ArchivesProvider.AUTHORITY.equals(uri.getAuthority())) { if (!Providers.isArchiveUri(uri)) { loadDocument(uri, this::onStackLoaded); return true; } Loading
src/com/android/documentsui/DirectoryLoader.java +14 −4 Original line number Diff line number Diff line Loading @@ -16,10 +16,13 @@ package com.android.documentsui; import static com.android.documentsui.base.Shared.VERBOSE; import android.content.AsyncTaskLoader; import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; Loading @@ -36,7 +39,6 @@ import com.android.documentsui.base.DebugFlags; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.FilteringCursorWrapper; import com.android.documentsui.base.RootInfo; import com.android.documentsui.base.Shared; import com.android.documentsui.roots.RootCursorWrapper; import com.android.documentsui.sorting.SortModel; Loading Loading @@ -100,7 +102,8 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { } result.client = client; if (Shared.ENABLE_OMC_API_FEATURES) { Resources resources = getContext().getResources(); if (resources.getBoolean(R.bool.feature_content_paging)) { Bundle queryArgs = new Bundle(); mModel.addQuerySortArgs(queryArgs); Loading @@ -122,12 +125,19 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { cursor = new RootCursorWrapper(mUri.getAuthority(), mRoot.rootId, cursor, -1); if (mSearchMode && !Shared.ENABLE_OMC_API_FEATURES) { if (mSearchMode && !resources.getBoolean(R.bool.feature_folders_in_search_results)) { // There is no findDocumentPath API. Enable filtering on folders in search mode. cursor = new FilteringCursorWrapper(cursor, null, SEARCH_REJECT_MIMES); } // TODO: When API tweaks have landed, use ContentResolver.EXTRA_HONORED_ARGS // instead of checking directly for ContentResolver.QUERY_ARG_SORT_COLUMNS (won't work) if (resources.getBoolean(R.bool.feature_content_paging) && cursor.getExtras().containsKey(ContentResolver.QUERY_ARG_SORT_COLUMNS)) { if (VERBOSE) Log.d(TAG, "Skipping sort of pre-sorted cursor. Booya!"); } else { cursor = mModel.sortCursor(cursor); } result.cursor = cursor; } catch (Exception e) { Log.w(TAG, "Failed to query", e); Loading
src/com/android/documentsui/FocusManager.java +6 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.documentsui; import static com.android.documentsui.base.DocumentInfo.getCursorString; import static com.android.documentsui.base.Shared.DEBUG; import static com.android.internal.util.Preconditions.checkNotNull; import android.annotation.ColorRes; import android.annotation.Nullable; Loading @@ -41,8 +42,8 @@ import android.widget.TextView; import com.android.documentsui.base.EventListener; import com.android.documentsui.base.Events; import com.android.documentsui.base.Features; import com.android.documentsui.base.Procedure; import com.android.documentsui.base.Shared; import com.android.documentsui.dirlist.DocumentHolder; import com.android.documentsui.dirlist.DocumentsAdapter; import com.android.documentsui.dirlist.FocusHandler; Loading @@ -60,6 +61,7 @@ public final class FocusManager implements FocusHandler { private final ContentScope mScope = new ContentScope(); private final Features mFeatures; private final SelectionManager mSelectionMgr; private final DrawerController mDrawer; private final Procedure mRootsFocuser; Loading @@ -68,11 +70,13 @@ public final class FocusManager implements FocusHandler { private boolean mNavDrawerHasFocus; public FocusManager( Features features, SelectionManager selectionMgr, DrawerController drawer, Procedure rootsFocuser, @ColorRes int color) { mFeatures = checkNotNull(features); mSelectionMgr = selectionMgr; mDrawer = drawer; mRootsFocuser = rootsFocuser; Loading @@ -84,7 +88,7 @@ public final class FocusManager implements FocusHandler { public boolean advanceFocusArea() { // This should only be called in pre-O devices. // O has built-in keyboard navigation support. assert(!Shared.ENABLE_OMC_API_FEATURES); assert(!mFeatures.isSystemKeyboardNavigationEnabled()); boolean focusChanged = false; if (mNavDrawerHasFocus) { mDrawer.setOpen(false); Loading
src/com/android/documentsui/Injector.java +7 −2 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.view.View; import com.android.documentsui.MenuManager.SelectionDetails; import com.android.documentsui.base.EventHandler; import com.android.documentsui.base.Features; import com.android.documentsui.dirlist.DocumentsAdapter; import com.android.documentsui.dirlist.Model; import com.android.documentsui.prefs.ScopedPreferences; Loading @@ -41,6 +42,7 @@ import java.lang.annotation.Target; */ public class Injector<T extends ActionHandler> { public final Features features; public final ActivityConfig config; public final ScopedPreferences prefs; public final MessageBuilder messages; Loading @@ -60,21 +62,24 @@ public class Injector<T extends ActionHandler> { @ContentScoped public SelectionManager selectionMgr; private final Model mModel = new Model(); private DocumentsAdapter mAdapter; private final Model mModel; // must be initialized before calling super.onCreate because prefs // are used in State initialization. public Injector( Features features, ActivityConfig config, ScopedPreferences prefs, MessageBuilder messages, DialogController dialogs) { this.features = features; this.config = config; this.prefs = prefs; this.messages = messages; this.dialogs = dialogs; mModel = new Model(this.features); } public Model getModel() { Loading