Home | History | Annotate | Download | only in sorting
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.documentsui.sorting;
     18 
     19 import android.view.View;
     20 
     21 import com.android.documentsui.R;
     22 import com.android.documentsui.sorting.SortModel.SortDimensionId;
     23 
     24 import javax.annotation.Nullable;
     25 
     26 /**
     27  * View controller for table header that associates header cells in table header and columns.
     28  */
     29 public final class TableHeaderController implements SortController.WidgetController {
     30     private View mTableHeader;
     31 
     32     private final HeaderCell mTitleCell;
     33     private final HeaderCell mSummaryCell;
     34     private final HeaderCell mSizeCell;
     35     private final HeaderCell mFileTypeCell;
     36     private final HeaderCell mDateCell;
     37 
     38     // We assign this here porque each method reference creates a new object
     39     // instance (which is wasteful).
     40     private final View.OnClickListener mOnCellClickListener = this::onCellClicked;
     41     private final SortModel.UpdateListener mModelListener = this::onModelUpdate;
     42 
     43     private final SortModel mModel;
     44 
     45     private TableHeaderController(SortModel sortModel, View tableHeader) {
     46         assert(sortModel != null);
     47         assert(tableHeader != null);
     48 
     49         mModel = sortModel;
     50         mTableHeader = tableHeader;
     51 
     52         mTitleCell = (HeaderCell) tableHeader.findViewById(android.R.id.title);
     53         mSummaryCell = (HeaderCell) tableHeader.findViewById(android.R.id.summary);
     54         mSizeCell = (HeaderCell) tableHeader.findViewById(R.id.size);
     55         mFileTypeCell = (HeaderCell) tableHeader.findViewById(R.id.file_type);
     56         mDateCell = (HeaderCell) tableHeader.findViewById(R.id.date);
     57 
     58         onModelUpdate(mModel, SortModel.UPDATE_TYPE_UNSPECIFIED);
     59 
     60         mModel.addListener(mModelListener);
     61     }
     62 
     63     private void onModelUpdate(SortModel model, int updateTypeUnspecified) {
     64         bindCell(mTitleCell, SortModel.SORT_DIMENSION_ID_TITLE);
     65         bindCell(mSummaryCell, SortModel.SORT_DIMENSION_ID_SUMMARY);
     66         bindCell(mSizeCell, SortModel.SORT_DIMENSION_ID_SIZE);
     67         bindCell(mFileTypeCell, SortModel.SORT_DIMENSION_ID_FILE_TYPE);
     68         bindCell(mDateCell, SortModel.SORT_DIMENSION_ID_DATE);
     69     }
     70 
     71     @Override
     72     public void setVisibility(int visibility) {
     73         mTableHeader.setVisibility(visibility);
     74     }
     75 
     76     @Override
     77     public void destroy() {
     78         mModel.removeListener(mModelListener);
     79     }
     80 
     81     private void bindCell(HeaderCell cell, @SortDimensionId int id) {
     82         assert(cell != null);
     83         SortDimension dimension = mModel.getDimensionById(id);
     84 
     85         cell.setTag(dimension);
     86 
     87         cell.onBind(dimension);
     88         if (dimension.getVisibility() == View.VISIBLE
     89                 && dimension.getSortCapability() != SortDimension.SORT_CAPABILITY_NONE) {
     90             cell.setOnClickListener(mOnCellClickListener);
     91         } else {
     92             cell.setOnClickListener(null);
     93         }
     94     }
     95 
     96     private void onCellClicked(View v) {
     97         SortDimension dimension = (SortDimension) v.getTag();
     98 
     99         mModel.sortByUser(dimension.getId(), dimension.getNextDirection());
    100     }
    101 
    102     public static @Nullable TableHeaderController create(
    103             SortModel sortModel, @Nullable View tableHeader) {
    104         return (tableHeader == null) ? null : new TableHeaderController(sortModel, tableHeader);
    105     }
    106 }
    107