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