1c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay/*
2c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * Copyright (C) 2015 The Android Open Source Project
3c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay *
4c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * Licensed under the Apache License, Version 2.0 (the "License");
5c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * you may not use this file except in compliance with the License.
6c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * You may obtain a copy of the License at
7c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay *
8c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay *      http://www.apache.org/licenses/LICENSE-2.0
9c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay *
10c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * Unless required by applicable law or agreed to in writing, software
11c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * distributed under the License is distributed on an "AS IS" BASIS,
12c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * See the License for the specific language governing permissions and
14c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * limitations under the License.
15c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay */
16c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
17c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKaypackage com.android.documentsui.dirlist;
18c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
19d080506e3aa8547605cd4783eb660775d7d2b8eeSteve McKayimport static com.android.documentsui.base.DocumentInfo.getCursorString;
20c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
21c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKayimport android.content.Context;
22c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKayimport android.database.Cursor;
23c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKayimport android.provider.DocumentsContract.Document;
24c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKayimport android.support.v7.widget.GridLayoutManager;
25c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKayimport android.support.v7.widget.RecyclerView;
26c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
27a40e6e34c4a7b9c83d086f167ea4812240783a70Ben Linimport com.android.documentsui.ActionHandler;
28e967033315ed64bca8c89d601d187fd12754f1fbGarfield Tanimport com.android.documentsui.Model;
29990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKayimport com.android.documentsui.base.EventListener;
3098f8c5f502e049a6b85439d773949cdbaa0f78aeSteve McKayimport com.android.documentsui.base.Features;
31d9caa6ab53aa784acaf241c0ded3c4ae2d342bf8Steve McKayimport com.android.documentsui.base.State;
32c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
33c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKayimport java.util.List;
34c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
35c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay/**
36c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * DocumentsAdapter provides glue between a directory Model, and RecylcerView. We've
37c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * abstracted this a bit in order to decompose some specialized support
38c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * for adding dummy layout objects (@see SectionBreakDocumentsAdapter). Handling of the
39c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * dummy layout objects was error prone when interspersed with the core mode / adapter code.
40c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay *
41c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay * @see ModelBackedDocumentsAdapter
427b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin * @see DirectoryAddonsAdapter
43c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay */
4417b761eb2f837d3ac079c07fc33877d6049c3cbaSteve McKaypublic abstract class DocumentsAdapter
45990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay        extends RecyclerView.Adapter<DocumentHolder> {
467b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin    // Item types used by ModelBackedDocumentsAdapter
477b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin    public static final int ITEM_TYPE_DOCUMENT = 1;
487b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin    public static final int ITEM_TYPE_DIRECTORY = 2;
497b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin    // Item types used by SectionBreakDocumentsAdapterWrapper
507b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin    public static final int ITEM_TYPE_SECTION_BREAK = Integer.MAX_VALUE;
517b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin    public static final int ITEM_TYPE_HEADER_MESSAGE = Integer.MAX_VALUE - 1;
527b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin    public static final int ITEM_TYPE_INFLATED_MESSAGE = Integer.MAX_VALUE - 2;
53c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
54c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    // Payloads for notifyItemChange to distinguish between selection and other events.
55c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    static final String SELECTION_CHANGED_MARKER = "Selection-Changed";
56c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
57c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    /**
587b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin     * Returns a list of model IDs of items currently in the adapter.
59c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay     *
60c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay     * @return A list of Model IDs.
61c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay     */
6217b761eb2f837d3ac079c07fc33877d6049c3cbaSteve McKay    public abstract List<String> getModelIds();
63c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
64ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    public abstract int getAdapterPosition(String modelId);
65ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann
66c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    /**
67c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay     * Triggers item-change notifications by stable ID (as opposed to position).
68c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay     * Passing an unrecognized ID will result in a warning in logcat, but no other error.
69c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay     */
704f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKay    public abstract void onItemSelectionChanged(String id);
71c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
72c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    /**
73c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay     * @return The model ID of the item at the given adapter position.
74c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay     */
7517b761eb2f837d3ac079c07fc33877d6049c3cbaSteve McKay    public abstract String getModelId(int position);
76c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
77990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay    abstract EventListener<Model.Update> getModelUpdateListener();
78990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay
79c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    /**
80c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay     * Returns a class that yields the span size for a particular element. This is
817b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin     * primarily useful in {@link DirectoryAddonsAdapter} where
82c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay     * we adjust sizes.
83c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay     */
84c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    GridLayoutManager.SpanSizeLookup createSpanSizeLookup() {
85bc7df44746143ce68c5d0226732caeeb79000f8eBen Kwa        throw new UnsupportedOperationException();
86c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    }
87c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
887b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin    public boolean hasModelIds() {
897b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin        return !getModelIds().isEmpty();
907b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin    }
917b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin
92c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    static boolean isDirectory(Cursor cursor) {
93c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay        final String mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
94c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay        return Document.MIME_TYPE_DIR.equals(mimeType);
95c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    }
96c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
97c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    boolean isDirectory(Model model, int position) {
98c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay        String modelId = getModelIds().get(position);
99c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay        Cursor cursor = model.getItem(modelId);
100c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay        return isDirectory(cursor);
101c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    }
102c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay
103c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    /**
104c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay     * Environmental access for View adapter implementations.
105c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay     */
106c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    interface Environment {
107c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay        Context getContext();
10898f8c5f502e049a6b85439d773949cdbaa0f78aeSteve McKay        Features getFeatures();
109a40e6e34c4a7b9c83d086f167ea4812240783a70Ben Lin        ActionHandler getActionHandler();
110c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay        int getColumnCount();
111c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay        State getDisplayState();
1127b38f3465c3779384a17e84cc04609d9d68b56f4Ben Lin        boolean isInSearchMode();
113c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay        boolean isSelected(String id);
114c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay        Model getModel();
115c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay        boolean isDocumentEnabled(String mimeType, int flags);
116c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay        void initDocumentHolder(DocumentHolder holder);
117c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay        void onBindDocumentHolder(DocumentHolder holder, Cursor cursor);
118c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay    }
119c5ecf8900ee11d06c3f000b2e7be14fc47fe1791Steve McKay}
120