/* * 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); } }