1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14package android.support.v17.leanback.widget; 15 16import android.graphics.Paint; 17import android.support.v17.leanback.R; 18import android.view.LayoutInflater; 19import android.view.View; 20import android.view.ViewGroup; 21import android.widget.TextView; 22 23/** 24 * RowHeaderPresenter provides a default implementation for header using TextView. 25 * If subclass override and creates its own view, subclass must also override 26 * {@link #onSelectLevelChanged(ViewHolder)}. 27 */ 28public class RowHeaderPresenter extends Presenter { 29 30 private final int mLayoutResourceId; 31 private final Paint mFontMeasurePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 32 33 public RowHeaderPresenter() { 34 this(R.layout.lb_row_header); 35 } 36 37 /** 38 * @hide 39 */ 40 public RowHeaderPresenter(int layoutResourceId) { 41 mLayoutResourceId = layoutResourceId; 42 } 43 44 public static class ViewHolder extends Presenter.ViewHolder { 45 float mSelectLevel; 46 int mOriginalTextColor; 47 float mUnselectAlpha; 48 49 public ViewHolder(View view) { 50 super(view); 51 } 52 public final float getSelectLevel() { 53 return mSelectLevel; 54 } 55 } 56 57 @Override 58 public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { 59 RowHeaderView headerView = (RowHeaderView) LayoutInflater.from(parent.getContext()) 60 .inflate(mLayoutResourceId, parent, false); 61 62 ViewHolder viewHolder = new ViewHolder(headerView); 63 viewHolder.mOriginalTextColor = headerView.getCurrentTextColor(); 64 viewHolder.mUnselectAlpha = parent.getResources().getFraction( 65 R.fraction.lb_browse_header_unselect_alpha, 1, 1); 66 return viewHolder; 67 } 68 69 @Override 70 public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) { 71 setSelectLevel((ViewHolder) viewHolder, 0); 72 Row rowItem = (Row) item; 73 if (rowItem != null) { 74 HeaderItem headerItem = rowItem.getHeaderItem(); 75 if (headerItem != null) { 76 String text = headerItem.getName(); 77 ((RowHeaderView) viewHolder.view).setText(text); 78 } 79 } 80 } 81 82 @Override 83 public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { 84 } 85 86 public final void setSelectLevel(ViewHolder holder, float selectLevel) { 87 holder.mSelectLevel = selectLevel; 88 onSelectLevelChanged(holder); 89 } 90 91 protected void onSelectLevelChanged(ViewHolder holder) { 92 holder.view.setAlpha(holder.mUnselectAlpha + holder.mSelectLevel * 93 (1f - holder.mUnselectAlpha)); 94 } 95 96 /** 97 * Returns the space (distance in pixels) below the baseline of the 98 * text view, if one exists; otherwise, returns 0. 99 */ 100 public int getSpaceUnderBaseline(ViewHolder holder) { 101 int space = holder.view.getPaddingBottom(); 102 if (holder.view instanceof TextView) { 103 space += (int) getFontDescent((TextView) holder.view, mFontMeasurePaint); 104 } 105 return space; 106 } 107 108 protected static float getFontDescent(TextView textView, Paint fontMeasurePaint) { 109 if (fontMeasurePaint.getTextSize() != textView.getTextSize()) { 110 fontMeasurePaint.setTextSize(textView.getTextSize()); 111 } 112 if (fontMeasurePaint.getTypeface() != textView.getTypeface()) { 113 fontMeasurePaint.setTypeface(textView.getTypeface()); 114 } 115 return fontMeasurePaint.descent(); 116 } 117} 118