17d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan/* 27d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan * Copyright (C) 2016 The Android Open Source Project 37d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan * 47d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan * Licensed under the Apache License, Version 2.0 (the "License"); 57d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan * you may not use this file except in compliance with the License. 67d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan * You may obtain a copy of the License at 77d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan * 87d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan * http://www.apache.org/licenses/LICENSE-2.0 97d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan * 107d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan * Unless required by applicable law or agreed to in writing, software 117d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan * distributed under the License is distributed on an "AS IS" BASIS, 127d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan * See the License for the specific language governing permissions and 147d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan * limitations under the License. 157d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan */ 167d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan 177d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tanpackage com.android.documentsui; 187d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan 19d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewskiimport android.annotation.IntDef; 20800300826ebb50f5a26393bc966c27fa26e9a16fBen Linimport android.app.PendingIntent; 21174fc2e99583c863287eb1f3bcaefd66565f4392Ben Linimport android.content.ContentProvider; 220930d4ca4b5161a22b0ddeca86c06533624ad610Dooperimport android.content.Context; 23988d8a354b00dce7e24deee187c08a4591956ac9Steve McKayimport android.content.Intent; 247d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tanimport android.content.pm.ResolveInfo; 25988d8a354b00dce7e24deee187c08a4591956ac9Steve McKayimport android.net.Uri; 26174fc2e99583c863287eb1f3bcaefd66565f4392Ben Linimport android.view.DragEvent; 277d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan 28739f94ba0dc9be264d9596dac551fd63082d2fddSteve McKayimport com.android.documentsui.base.BooleanConsumer; 29208945c4e262868d3ebe0f55f1b895cd5a201cbbGarfield Tanimport com.android.documentsui.base.DocumentInfo; 30739f94ba0dc9be264d9596dac551fd63082d2fddSteve McKayimport com.android.documentsui.base.DocumentStack; 317d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tanimport com.android.documentsui.base.RootInfo; 326d20d190bc576bea1da48f79d868a5f383d3458bSteve McKayimport com.android.documentsui.dirlist.DocumentDetails; 330930d4ca4b5161a22b0ddeca86c06533624ad610Dooperimport com.android.documentsui.selection.Selection; 347d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan 35d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewskiimport java.lang.annotation.Retention; 36d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewskiimport java.lang.annotation.RetentionPolicy; 3730b0dc1896abc67a970b61ebfd420275a31c1e18Ben Linimport java.util.function.Consumer; 3830b0dc1896abc67a970b61ebfd420275a31c1e18Ben Lin 3930d8c7988e15336d995e4b5033ba533a8333446fJon Mannimport javax.annotation.Nullable; 4030d8c7988e15336d995e4b5033ba533a8333446fJon Mann 41739f94ba0dc9be264d9596dac551fd63082d2fddSteve McKaypublic interface ActionHandler { 427d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan 43d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski @IntDef({ 44d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski VIEW_TYPE_NONE, 45d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski VIEW_TYPE_REGULAR, 46d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski VIEW_TYPE_PREVIEW 47d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski }) 48d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski @Retention(RetentionPolicy.SOURCE) 49d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski public @interface ViewType {} 50d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski public static final int VIEW_TYPE_NONE = 0; 51d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski public static final int VIEW_TYPE_REGULAR = 1; 52d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski public static final int VIEW_TYPE_PREVIEW = 2; 53d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski 54800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin void onActivityResult(int requestCode, int resultCode, Intent data); 55800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin 56739f94ba0dc9be264d9596dac551fd63082d2fddSteve McKay void openSettings(RootInfo root); 577d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan 58b285b40dedbde396aea8080c3d09577677bc71bcGarfield Tan /** 59b285b40dedbde396aea8080c3d09577677bc71bcGarfield Tan * Drops documents on a root. 60b285b40dedbde396aea8080c3d09577677bc71bcGarfield Tan */ 61174fc2e99583c863287eb1f3bcaefd66565f4392Ben Lin boolean dropOn(DragEvent event, RootInfo root); 627d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan 63739f94ba0dc9be264d9596dac551fd63082d2fddSteve McKay /** 64739f94ba0dc9be264d9596dac551fd63082d2fddSteve McKay * Attempts to eject the identified root. Returns a boolean answer to listener. 65739f94ba0dc9be264d9596dac551fd63082d2fddSteve McKay */ 66739f94ba0dc9be264d9596dac551fd63082d2fddSteve McKay void ejectRoot(RootInfo root, BooleanConsumer listener); 677d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan 6830b0dc1896abc67a970b61ebfd420275a31c1e18Ben Lin /** 6930b0dc1896abc67a970b61ebfd420275a31c1e18Ben Lin * Attempts to fetch the DocumentInfo for the supplied root. Returns the DocumentInfo to the 7030b0dc1896abc67a970b61ebfd420275a31c1e18Ben Lin * callback. If the task times out, callback will be called with null DocumentInfo. Supply 7130b0dc1896abc67a970b61ebfd420275a31c1e18Ben Lin * {@link TimeoutTask#DEFAULT_TIMEOUT} if you don't want to the task to ever time out. 7230b0dc1896abc67a970b61ebfd420275a31c1e18Ben Lin */ 7330b0dc1896abc67a970b61ebfd420275a31c1e18Ben Lin void getRootDocument(RootInfo root, int timeout, Consumer<DocumentInfo> callback); 7430b0dc1896abc67a970b61ebfd420275a31c1e18Ben Lin 75e9abd2d49b31535c6c3f52fa439e48ab5e22451fBen Lin /** 76e9abd2d49b31535c6c3f52fa439e48ab5e22451fBen Lin * Attempts to refresh the given DocumentInfo, which should be at the top of the state stack. 77e9abd2d49b31535c6c3f52fa439e48ab5e22451fBen Lin * Returns a boolean answer to the callback, given by {@link ContentProvider#refresh}. 78e9abd2d49b31535c6c3f52fa439e48ab5e22451fBen Lin */ 79e9abd2d49b31535c6c3f52fa439e48ab5e22451fBen Lin void refreshDocument(DocumentInfo doc, BooleanConsumer callback); 80e9abd2d49b31535c6c3f52fa439e48ab5e22451fBen Lin 81800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin 82800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin /** 83800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin * Attempts to start the authentication process caused by 84800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin * {@link android.app.AuthenticationRequiredException}. 85800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin */ 86800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin void startAuthentication(PendingIntent intent); 87800300826ebb50f5a26393bc966c27fa26e9a16fBen Lin 88739f94ba0dc9be264d9596dac551fd63082d2fddSteve McKay void showAppDetails(ResolveInfo info); 897d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan 90739f94ba0dc9be264d9596dac551fd63082d2fddSteve McKay void openRoot(RootInfo root); 917d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan 92739f94ba0dc9be264d9596dac551fd63082d2fddSteve McKay void openRoot(ResolveInfo app); 936d20d190bc576bea1da48f79d868a5f383d3458bSteve McKay 94988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay void loadRoot(Uri uri); 95988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay 965b0a2c187a9e446b683687817d22cbe443585223Steve McKay void openSelectedInNewWindow(); 975b0a2c187a9e446b683687817d22cbe443585223Steve McKay 98739f94ba0dc9be264d9596dac551fd63082d2fddSteve McKay void openInNewWindow(DocumentStack path); 99b285b40dedbde396aea8080c3d09577677bc71bcGarfield Tan 100739f94ba0dc9be264d9596dac551fd63082d2fddSteve McKay void pasteIntoFolder(RootInfo root); 101b285b40dedbde396aea8080c3d09577677bc71bcGarfield Tan 10230d8c7988e15336d995e4b5033ba533a8333446fJon Mann void selectAllFiles(); 10330d8c7988e15336d995e4b5033ba533a8333446fJon Mann 104ff7f3aeec1b4fc7e0b8ddb0e8b6b6e105140f68eBen Lin void showCreateDirectoryDialog(); 105ff7f3aeec1b4fc7e0b8ddb0e8b6b6e105140f68eBen Lin 106f5042d025e07df7cadc952e38f2bfc1e1f0dc23bAustin Kolander void showInspector(DocumentInfo doc); 1070930d4ca4b5161a22b0ddeca86c06533624ad610Dooper 10830d8c7988e15336d995e4b5033ba533a8333446fJon Mann @Nullable DocumentInfo renameDocument(String name, DocumentInfo document); 10930d8c7988e15336d995e4b5033ba533a8333446fJon Mann 110d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski /** 111d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski * If container, then opens the container, otherwise views using the specified type of view. 112d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski * If the primary view type is unavailable, then fallback to the alternative type of view. 113d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski */ 114d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski boolean openDocument(DocumentDetails doc, @ViewType int type, @ViewType int fallback); 115c8889af6757ecb348fb8fd6dadf84d67d3478cbfSteve McKay 116d8d0ad2bb6b52095b77c537bdd4b79e642361b94Ben Lin /** 117d8d0ad2bb6b52095b77c537bdd4b79e642361b94Ben Lin * This is called when user hovers over a doc for enough time during a drag n' drop, to open a 118d8d0ad2bb6b52095b77c537bdd4b79e642361b94Ben Lin * folder that accepts drop. We should only open a container that's not an archive, since archives 119d8d0ad2bb6b52095b77c537bdd4b79e642361b94Ben Lin * do not accept dropping. 120d8d0ad2bb6b52095b77c537bdd4b79e642361b94Ben Lin */ 121d8d0ad2bb6b52095b77c537bdd4b79e642361b94Ben Lin void springOpenDirectory(DocumentInfo doc); 122d8d0ad2bb6b52095b77c537bdd4b79e642361b94Ben Lin 123208945c4e262868d3ebe0f55f1b895cd5a201cbbGarfield Tan void showChooserForDoc(DocumentInfo doc); 124208945c4e262868d3ebe0f55f1b895cd5a201cbbGarfield Tan 125e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan void openRootDocument(@Nullable DocumentInfo rootDoc); 126e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan 12763bf8135243605949a3bb140167ef91f5c6ae2aeGarfield Tan void openContainerDocument(DocumentInfo doc); 12863bf8135243605949a3bb140167ef91f5c6ae2aeGarfield Tan 129d947f0192142c7db40d7dfaa8d0c6caaa1cf7c36Ben Lin void cutToClipboard(); 130d947f0192142c7db40d7dfaa8d0c6caaa1cf7c36Ben Lin 131d947f0192142c7db40d7dfaa8d0c6caaa1cf7c36Ben Lin void copyToClipboard(); 132d947f0192142c7db40d7dfaa8d0c6caaa1cf7c36Ben Lin 133d947f0192142c7db40d7dfaa8d0c6caaa1cf7c36Ben Lin /** 134d947f0192142c7db40d7dfaa8d0c6caaa1cf7c36Ben Lin * In general, selected = selection or single focused item 135d947f0192142c7db40d7dfaa8d0c6caaa1cf7c36Ben Lin */ 136bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKay void deleteSelectedDocuments(); 137988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay 138d071895ec72bbb9414f6672ff808ec42b8e2d850Steve McKay void shareSelectedDocuments(); 139d071895ec72bbb9414f6672ff808ec42b8e2d850Steve McKay 140988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay /** 141988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * Called when initial activity setup is complete. Implementations 142988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * should override this method to set the initial location of the 143988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay * app. 144988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay */ 145988d8a354b00dce7e24deee187c08a4591956ac9Steve McKay void initLocation(Intent intent); 14692ae43d5d22331aad83e1a4302a7e1975f66354eSteve McKay 14730d8c7988e15336d995e4b5033ba533a8333446fJon Mann void registerDisplayStateChangedListener(Runnable l); 14830d8c7988e15336d995e4b5033ba533a8333446fJon Mann void unregisterDisplayStateChangedListener(Runnable l); 14930d8c7988e15336d995e4b5033ba533a8333446fJon Mann 150e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan void loadDocumentsForCurrentStack(); 151e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan 152253a99248f1f3d50cd357d902bfc52e7b9367446Jon Mann void viewInOwner(); 153253a99248f1f3d50cd357d902bfc52e7b9367446Jon Mann 154eb1d11b5d85c40ce845625aea1ecbf7e265d75f9Jon Mann void setDebugMode(boolean enabled); 155eb1d11b5d85c40ce845625aea1ecbf7e265d75f9Jon Mann void showDebugMessage(); 156eb1d11b5d85c40ce845625aea1ecbf7e265d75f9Jon Mann 15792ae43d5d22331aad83e1a4302a7e1975f66354eSteve McKay /** 15892ae43d5d22331aad83e1a4302a7e1975f66354eSteve McKay * Allow action handler to be initialized in a new scope. 159e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan * @return this 16092ae43d5d22331aad83e1a4302a7e1975f66354eSteve McKay */ 161e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tan <T extends ActionHandler> T reset(DirectoryReloadLock reloadLock); 1627d75f7bbd1693a33abb8de6b472ec1950e33eb8bGarfield Tan} 163