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