blob: 297584f832ed895a64b51bab998a3c805e162531 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.documentsui.dirlist;
import static com.android.documentsui.base.DocumentInfo.getCursorString;
import android.content.Context;
import android.database.Cursor;
import android.provider.DocumentsContract.Document;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.android.documentsui.Model;
import com.android.documentsui.base.EventListener;
import com.android.documentsui.base.Features;
import com.android.documentsui.base.State;
import java.util.List;
/**
* DocumentsAdapter provides glue between a directory Model, and RecylcerView. We've
* abstracted this a bit in order to decompose some specialized support
* for adding dummy layout objects (@see SectionBreakDocumentsAdapter). Handling of the
* dummy layout objects was error prone when interspersed with the core mode / adapter code.
*
* @see ModelBackedDocumentsAdapter
* @see DirectoryAddonsAdapter
*/
public abstract class DocumentsAdapter
extends RecyclerView.Adapter<DocumentHolder> {
// Item types used by ModelBackedDocumentsAdapter
public static final int ITEM_TYPE_DOCUMENT = 1;
public static final int ITEM_TYPE_DIRECTORY = 2;
// Item types used by SectionBreakDocumentsAdapterWrapper
public static final int ITEM_TYPE_SECTION_BREAK = Integer.MAX_VALUE;
public static final int ITEM_TYPE_HEADER_MESSAGE = Integer.MAX_VALUE - 1;
public static final int ITEM_TYPE_INFLATED_MESSAGE = Integer.MAX_VALUE - 2;
// Payloads for notifyItemChange to distinguish between selection and other events.
static final String SELECTION_CHANGED_MARKER = "Selection-Changed";
/**
* Returns a list of model IDs of items currently in the adapter.
*
* @return A list of Model IDs.
*/
public abstract List<String> getModelIds();
/**
* Triggers item-change notifications by stable ID (as opposed to position).
* Passing an unrecognized ID will result in a warning in logcat, but no other error.
*/
public abstract void onItemSelectionChanged(String id);
/**
* @return The model ID of the item at the given adapter position.
*/
public abstract String getModelId(int position);
abstract EventListener<Model.Update> getModelUpdateListener();
/**
* Returns a class that yields the span size for a particular element. This is
* primarily useful in {@link DirectoryAddonsAdapter} where
* we adjust sizes.
*/
GridLayoutManager.SpanSizeLookup createSpanSizeLookup() {
throw new UnsupportedOperationException();
}
public boolean hasModelIds() {
return !getModelIds().isEmpty();
}
static boolean isDirectory(Cursor cursor) {
final String mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
return Document.MIME_TYPE_DIR.equals(mimeType);
}
boolean isDirectory(Model model, int position) {
String modelId = getModelIds().get(position);
Cursor cursor = model.getItem(modelId);
return isDirectory(cursor);
}
/**
* Environmental access for View adapter implementations.
*/
interface Environment {
Context getContext();
Features getFeatures();
int getColumnCount();
State getDisplayState();
boolean isInSearchMode();
boolean isSelected(String id);
Model getModel();
boolean isDocumentEnabled(String mimeType, int flags);
void initDocumentHolder(DocumentHolder holder);
void onBindDocumentHolder(DocumentHolder holder, Cursor cursor);
}
}