DetailsOverviewRowPresenter.java revision 7c004076d5289caa0af7b5fb04cf7a3374be56b1
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.content.Context; 17import android.graphics.Color; 18import android.support.v17.leanback.R; 19import android.util.TypedValue; 20import android.view.LayoutInflater; 21import android.view.View; 22import android.view.ViewGroup; 23import android.widget.FrameLayout; 24import android.widget.ImageView; 25 26import java.util.Collection; 27 28/** 29 * DetailsOverviewRowPresenter renders {@link DetailsOverviewRow} to display an 30 * overview of an item. Typically this row will be the first row in a fragment 31 * such as {@link android.support.v17.leanback.app.DetailsFragment 32 * DetailsFragment}. 33 * 34 * <p>The detailed description is rendered using a {@link Presenter}. 35 */ 36public class DetailsOverviewRowPresenter extends RowPresenter { 37 38 private static final String TAG = "DetailsOverviewRowPresenter"; 39 private static final boolean DEBUG = false; 40 41 public static class ViewHolder extends RowPresenter.ViewHolder { 42 final ImageView mImageView; 43 final FrameLayout mDetailsDescriptionFrame; 44 final HorizontalGridView mActionsRow; 45 Presenter.ViewHolder mDetailsDescriptionViewHolder; 46 47 public ViewHolder(View rootView) { 48 super(rootView); 49 mImageView = (ImageView) rootView.findViewById(R.id.details_overview_image); 50 mDetailsDescriptionFrame = 51 (FrameLayout) rootView.findViewById(R.id.details_overview_description); 52 mActionsRow = 53 (HorizontalGridView) rootView.findViewById(R.id.details_overview_actions); 54 } 55 } 56 57 private final Presenter mDetailsPresenter; 58 private final ActionPresenterSelector mActionPresenterSelector; 59 private final ItemBridgeAdapter mActionBridgeAdapter; 60 private int mBackgroundColor = Color.TRANSPARENT; 61 private boolean mBackgroundColorSet; 62 private boolean mIsStyleLarge = true; 63 64 /** 65 * Constructor that uses the given {@link Presenter} to render the detailed 66 * description for the row. 67 */ 68 public DetailsOverviewRowPresenter(Presenter detailsPresenter) { 69 setHeaderPresenter(null); 70 setSelectEffectEnabled(false); 71 mDetailsPresenter = detailsPresenter; 72 mActionPresenterSelector = new ActionPresenterSelector(); 73 mActionBridgeAdapter = new ItemBridgeAdapter(); 74 } 75 76 /** 77 * Sets the listener for action click events. 78 */ 79 public void setOnActionClickedListener(OnActionClickedListener listener) { 80 mActionPresenterSelector.setOnActionClickedListener(listener); 81 } 82 83 /** 84 * Gets the listener for action click events. 85 */ 86 public OnActionClickedListener getOnActionClickedListener() { 87 return mActionPresenterSelector.getOnActionClickedListener(); 88 } 89 90 /** 91 * Sets the background color. If not set a default from the theme will be used. 92 */ 93 public void setBackgroundColor(int color) { 94 mBackgroundColor = color; 95 mBackgroundColorSet = true; 96 } 97 98 /** 99 * Returns the background color. If no background color was set, returns transparent. 100 */ 101 public int getBackgroundColor() { 102 return mBackgroundColor; 103 } 104 105 /** 106 * Sets the layout style to be large or small. 107 * The default is large. 108 */ 109 public void setStyleLarge(boolean large) { 110 mIsStyleLarge = large; 111 } 112 113 /** 114 * Returns true if the layout style is large. 115 */ 116 public boolean isStyleLarge() { 117 return mIsStyleLarge; 118 } 119 120 private int getDefaultBackgroundColor(Context context) { 121 TypedValue outValue = new TypedValue(); 122 context.getTheme().resolveAttribute(android.R.attr.colorBackground, outValue, true); 123 return context.getResources().getColor(outValue.resourceId); 124 } 125 126 @Override 127 protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) { 128 View v = LayoutInflater.from(parent.getContext()) 129 .inflate(R.layout.lb_details_overview, parent, false); 130 ViewHolder vh = new ViewHolder(v); 131 132 vh.mDetailsDescriptionViewHolder = 133 mDetailsPresenter.onCreateViewHolder(vh.mDetailsDescriptionFrame); 134 vh.mDetailsDescriptionFrame.addView(vh.mDetailsDescriptionViewHolder.view); 135 136 initDetailsOverview(v.findViewById(R.id.details_overview)); 137 138 return vh; 139 } 140 141 private void initDetailsOverview(View view) { 142 int resId = mIsStyleLarge ? R.dimen.lb_details_overview_height_large : 143 R.dimen.lb_details_overview_height_small; 144 145 ViewGroup.LayoutParams lp = view.getLayoutParams(); 146 lp.height = view.getResources().getDimensionPixelSize(resId); 147 view.setLayoutParams(lp); 148 149 view.setBackgroundColor(mBackgroundColorSet ? 150 mBackgroundColor : getDefaultBackgroundColor(view.getContext())); 151 152 } 153 154 @Override 155 protected void onBindRowViewHolder(RowPresenter.ViewHolder holder, Object item) { 156 super.onBindRowViewHolder(holder, item); 157 158 DetailsOverviewRow row = (DetailsOverviewRow) item; 159 ViewHolder vh = (ViewHolder) holder; 160 if (row.getImageDrawable() != null) { 161 vh.mImageView.setImageDrawable(row.getImageDrawable()); 162 } 163 if (vh.mDetailsDescriptionViewHolder == null) { 164 } 165 mDetailsPresenter.onBindViewHolder(vh.mDetailsDescriptionViewHolder, row); 166 167 mActionBridgeAdapter.clear(); 168 ArrayObjectAdapter aoa = new ArrayObjectAdapter(mActionPresenterSelector); 169 aoa.addAll(0, (Collection)row.getActions()); 170 mActionBridgeAdapter.setAdapter(aoa); 171 vh.mActionsRow.setAdapter(mActionBridgeAdapter); 172 } 173 174 @Override 175 protected void onUnbindRowViewHolder(RowPresenter.ViewHolder holder) { 176 super.onUnbindRowViewHolder(holder); 177 178 ViewHolder vh = (ViewHolder) holder; 179 if (vh.mDetailsDescriptionViewHolder != null) { 180 mDetailsPresenter.onUnbindViewHolder(vh.mDetailsDescriptionViewHolder); 181 } 182 183 vh.mActionsRow.setAdapter(null); 184 } 185} 186