blob: a56aea623adb1295fe0a79a8dc54e8a49da78ae0 [file] [log] [blame]
/*
* Copyright (C) 2014 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 android.support.v17.leanback.widget;
import android.graphics.Paint;
import android.support.v17.leanback.R;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
/**
* RowHeaderPresenter provides a default implementation for header using TextView.
* If subclass override and creates its own view, subclass must also override
* {@link #onSelectLevelChanged(ViewHolder)}.
*/
public class RowHeaderPresenter extends Presenter {
private final int mLayoutResourceId;
private final Paint mFontMeasurePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private boolean mNullItemVisibilityGone;
public RowHeaderPresenter() {
this(R.layout.lb_row_header);
}
/**
* @hide
*/
public RowHeaderPresenter(int layoutResourceId) {
mLayoutResourceId = layoutResourceId;
}
/**
* Optionally sets the view visibility to {@link View#GONE} when bound to null.
*/
public void setNullItemVisibilityGone(boolean nullItemVisibilityGone) {
mNullItemVisibilityGone = nullItemVisibilityGone;
}
/**
* Returns true if the view visibility is set to {@link View#GONE} when bound to null.
*/
public boolean isNullItemVisibilityGone() {
return mNullItemVisibilityGone;
}
public static class ViewHolder extends Presenter.ViewHolder {
float mSelectLevel;
int mOriginalTextColor;
float mUnselectAlpha;
public ViewHolder(View view) {
super(view);
}
public final float getSelectLevel() {
return mSelectLevel;
}
}
@Override
public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) {
RowHeaderView headerView = (RowHeaderView) LayoutInflater.from(parent.getContext())
.inflate(mLayoutResourceId, parent, false);
ViewHolder viewHolder = new ViewHolder(headerView);
viewHolder.mOriginalTextColor = headerView.getCurrentTextColor();
viewHolder.mUnselectAlpha = parent.getResources().getFraction(
R.fraction.lb_browse_header_unselect_alpha, 1, 1);
return viewHolder;
}
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
setSelectLevel((ViewHolder) viewHolder, 0);
HeaderItem headerItem = item == null ? null : ((Row) item).getHeaderItem();
if (headerItem == null) {
((RowHeaderView) viewHolder.view).setText(null);
if (mNullItemVisibilityGone) {
viewHolder.view.setVisibility(View.GONE);
}
} else {
viewHolder.view.setVisibility(View.VISIBLE);
((RowHeaderView) viewHolder.view).setText(headerItem.getName());
}
}
@Override
public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
((RowHeaderView) viewHolder.view).setText(null);
}
public final void setSelectLevel(ViewHolder holder, float selectLevel) {
holder.mSelectLevel = selectLevel;
onSelectLevelChanged(holder);
}
protected void onSelectLevelChanged(ViewHolder holder) {
holder.view.setAlpha(holder.mUnselectAlpha + holder.mSelectLevel *
(1f - holder.mUnselectAlpha));
}
/**
* Returns the space (distance in pixels) below the baseline of the
* text view, if one exists; otherwise, returns 0.
*/
public int getSpaceUnderBaseline(ViewHolder holder) {
int space = holder.view.getPaddingBottom();
if (holder.view instanceof TextView) {
space += (int) getFontDescent((TextView) holder.view, mFontMeasurePaint);
}
return space;
}
protected static float getFontDescent(TextView textView, Paint fontMeasurePaint) {
if (fontMeasurePaint.getTextSize() != textView.getTextSize()) {
fontMeasurePaint.setTextSize(textView.getTextSize());
}
if (fontMeasurePaint.getTypeface() != textView.getTypeface()) {
fontMeasurePaint.setTypeface(textView.getTypeface());
}
return fontMeasurePaint.descent();
}
}