blob: f3853c08f9a9bbbd47040311a41f22f878dcc175 [file] [log] [blame]
/*
* Copyright (C) 2016 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.sorting;
import android.view.View;
import com.android.documentsui.R;
import com.android.documentsui.sorting.SortModel.SortDimensionId;
import javax.annotation.Nullable;
/**
* View controller for table header that associates header cells in table header and columns.
*/
public final class TableHeaderController implements SortController.WidgetController {
private View mTableHeader;
private final HeaderCell mTitleCell;
private final HeaderCell mSummaryCell;
private final HeaderCell mSizeCell;
private final HeaderCell mFileTypeCell;
private final HeaderCell mDateCell;
// We assign this here porque each method reference creates a new object
// instance (which is wasteful).
private final View.OnClickListener mOnCellClickListener = this::onCellClicked;
private final SortModel.UpdateListener mModelListener = this::onModelUpdate;
private final SortModel mModel;
private TableHeaderController(SortModel sortModel, View tableHeader) {
assert(sortModel != null);
assert(tableHeader != null);
mModel = sortModel;
mTableHeader = tableHeader;
mTitleCell = (HeaderCell) tableHeader.findViewById(android.R.id.title);
mSummaryCell = (HeaderCell) tableHeader.findViewById(android.R.id.summary);
mSizeCell = (HeaderCell) tableHeader.findViewById(R.id.size);
mFileTypeCell = (HeaderCell) tableHeader.findViewById(R.id.file_type);
mDateCell = (HeaderCell) tableHeader.findViewById(R.id.date);
onModelUpdate(mModel, SortModel.UPDATE_TYPE_UNSPECIFIED);
mModel.addListener(mModelListener);
}
private void onModelUpdate(SortModel model, int updateTypeUnspecified) {
bindCell(mTitleCell, SortModel.SORT_DIMENSION_ID_TITLE);
bindCell(mSummaryCell, SortModel.SORT_DIMENSION_ID_SUMMARY);
bindCell(mSizeCell, SortModel.SORT_DIMENSION_ID_SIZE);
bindCell(mFileTypeCell, SortModel.SORT_DIMENSION_ID_FILE_TYPE);
bindCell(mDateCell, SortModel.SORT_DIMENSION_ID_DATE);
}
@Override
public void setVisibility(int visibility) {
mTableHeader.setVisibility(visibility);
}
@Override
public void destroy() {
mModel.removeListener(mModelListener);
}
private void bindCell(HeaderCell cell, @SortDimensionId int id) {
assert(cell != null);
SortDimension dimension = mModel.getDimensionById(id);
cell.setTag(dimension);
cell.onBind(dimension);
if (dimension.getVisibility() == View.VISIBLE
&& dimension.getSortCapability() != SortDimension.SORT_CAPABILITY_NONE) {
cell.setOnClickListener(mOnCellClickListener);
} else {
cell.setOnClickListener(null);
}
}
private void onCellClicked(View v) {
SortDimension dimension = (SortDimension) v.getTag();
mModel.sortByUser(dimension.getId(), dimension.getNextDirection());
}
public static @Nullable TableHeaderController create(
SortModel sortModel, @Nullable View tableHeader) {
return (tableHeader == null) ? null : new TableHeaderController(sortModel, tableHeader);
}
}