DetailsOverviewRowPresenter.java revision d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1
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 FocusHighlightHelper.setupActionItemFocusHighlight(mActionBridgeAdapter); 75 } 76 77 /** 78 * Sets the listener for action click events. 79 */ 80 public void setOnActionClickedListener(OnActionClickedListener listener) { 81 mActionPresenterSelector.setOnActionClickedListener(listener); 82 } 83 84 /** 85 * Gets the listener for action click events. 86 */ 87 public OnActionClickedListener getOnActionClickedListener() { 88 return mActionPresenterSelector.getOnActionClickedListener(); 89 } 90 91 /** 92 * Sets the background color. If not set a default from the theme will be used. 93 */ 94 public void setBackgroundColor(int color) { 95 mBackgroundColor = color; 96 mBackgroundColorSet = true; 97 } 98 99 /** 100 * Returns the background color. If no background color was set, returns transparent. 101 */ 102 public int getBackgroundColor() { 103 return mBackgroundColor; 104 } 105 106 /** 107 * Sets the layout style to be large or small. 108 * The default is large. 109 */ 110 public void setStyleLarge(boolean large) { 111 mIsStyleLarge = large; 112 } 113 114 /** 115 * Returns true if the layout style is large. 116 */ 117 public boolean isStyleLarge() { 118 return mIsStyleLarge; 119 } 120 121 private int getDefaultBackgroundColor(Context context) { 122 TypedValue outValue = new TypedValue(); 123 context.getTheme().resolveAttribute(android.R.attr.colorBackground, outValue, true); 124 return context.getResources().getColor(outValue.resourceId); 125 } 126 127 @Override 128 protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) { 129 View v = LayoutInflater.from(parent.getContext()) 130 .inflate(R.layout.lb_details_overview, parent, false); 131 ViewHolder vh = new ViewHolder(v); 132 133 vh.mDetailsDescriptionViewHolder = 134 mDetailsPresenter.onCreateViewHolder(vh.mDetailsDescriptionFrame); 135 vh.mDetailsDescriptionFrame.addView(vh.mDetailsDescriptionViewHolder.view); 136 137 initDetailsOverview(v.findViewById(R.id.details_overview)); 138 139 return vh; 140 } 141 142 private void initDetailsOverview(View view) { 143 int resId = mIsStyleLarge ? R.dimen.lb_details_overview_height_large : 144 R.dimen.lb_details_overview_height_small; 145 146 ViewGroup.LayoutParams lp = view.getLayoutParams(); 147 lp.height = view.getResources().getDimensionPixelSize(resId); 148 view.setLayoutParams(lp); 149 150 view.setBackgroundColor(mBackgroundColorSet ? 151 mBackgroundColor : getDefaultBackgroundColor(view.getContext())); 152 153 } 154 155 @Override 156 protected void onBindRowViewHolder(RowPresenter.ViewHolder holder, Object item) { 157 super.onBindRowViewHolder(holder, item); 158 159 DetailsOverviewRow row = (DetailsOverviewRow) item; 160 ViewHolder vh = (ViewHolder) holder; 161 if (row.getImageDrawable() != null) { 162 vh.mImageView.setImageDrawable(row.getImageDrawable()); 163 } 164 if (vh.mDetailsDescriptionViewHolder == null) { 165 } 166 mDetailsPresenter.onBindViewHolder(vh.mDetailsDescriptionViewHolder, row); 167 168 mActionBridgeAdapter.clear(); 169 ArrayObjectAdapter aoa = new ArrayObjectAdapter(mActionPresenterSelector); 170 aoa.addAll(0, (Collection)row.getActions()); 171 mActionBridgeAdapter.setAdapter(aoa); 172 vh.mActionsRow.setAdapter(mActionBridgeAdapter); 173 } 174 175 @Override 176 protected void onUnbindRowViewHolder(RowPresenter.ViewHolder holder) { 177 super.onUnbindRowViewHolder(holder); 178 179 ViewHolder vh = (ViewHolder) holder; 180 if (vh.mDetailsDescriptionViewHolder != null) { 181 mDetailsPresenter.onUnbindViewHolder(vh.mDetailsDescriptionViewHolder); 182 } 183 184 vh.mActionsRow.setAdapter(null); 185 } 186} 187