VerticalGridFragment.java revision a8d3588c80a232042474aca55a69df78c8ac8cb3
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.app; 15 16import android.support.v17.leanback.R; 17import android.support.v17.leanback.widget.VerticalGridPresenter; 18import android.support.v17.leanback.widget.ObjectAdapter; 19import android.support.v17.leanback.widget.OnItemClickedListener; 20import android.support.v17.leanback.widget.OnItemSelectedListener; 21import android.support.v17.leanback.widget.Presenter; 22import android.support.v17.leanback.widget.PresenterSelector; 23import android.support.v17.leanback.widget.RowPresenter; 24import android.support.v17.leanback.widget.SearchOrbView; 25import android.support.v17.leanback.widget.VerticalGridView; 26import android.util.Log; 27import android.app.Fragment; 28import android.graphics.drawable.Drawable; 29import android.os.Bundle; 30import android.view.LayoutInflater; 31import android.view.View; 32import android.view.ViewGroup; 33import android.widget.ImageView; 34import android.widget.TextView; 35 36/** 37 * Leanback fragment for a vertical grid. 38 * 39 * Renders a vertical grid of objects given a {@link VerticalGridPresenter} and 40 * an {@link ObjectAdapter}. 41 */ 42public class VerticalGridFragment extends Fragment { 43 private static final String TAG = "VerticalGridFragment"; 44 private static boolean DEBUG = false; 45 46 private Params mParams; 47 private ObjectAdapter mAdapter; 48 private VerticalGridPresenter mGridPresenter; 49 private VerticalGridPresenter.ViewHolder mGridViewHolder; 50 private OnItemSelectedListener mOnItemSelectedListener; 51 private OnItemClickedListener mOnItemClickedListener; 52 private View.OnClickListener mExternalOnSearchClickedListener; 53 private int mSelectedPosition = -1; 54 55 private ImageView mBadgeView; 56 private TextView mTitleView; 57 private ViewGroup mBrowseTitle; 58 private SearchOrbView mSearchOrbView; 59 60 public static class Params { 61 private String mTitle; 62 private Drawable mBadgeDrawable; 63 64 /** 65 * Sets the badge image. 66 */ 67 public void setBadgeImage(Drawable drawable) { 68 mBadgeDrawable = drawable; 69 } 70 71 /** 72 * Returns the badge image. 73 */ 74 public Drawable getBadgeImage() { 75 return mBadgeDrawable; 76 } 77 78 /** 79 * Sets a title for the browse fragment. 80 */ 81 public void setTitle(String title) { 82 mTitle = title; 83 } 84 85 /** 86 * Returns the title for the browse fragment. 87 */ 88 public String getTitle() { 89 return mTitle; 90 } 91 } 92 93 /** 94 * Set fragment parameters. 95 */ 96 public void setParams(Params params) { 97 mParams = params; 98 setBadgeDrawable(mParams.mBadgeDrawable); 99 setTitle(mParams.mTitle); 100 } 101 102 /** 103 * Returns fragment parameters. 104 */ 105 public Params getParams() { 106 return mParams; 107 } 108 109 /** 110 * Set the grid presenter. 111 */ 112 public void setGridPresenter(VerticalGridPresenter gridPresenter) { 113 if (gridPresenter == null) { 114 throw new IllegalArgumentException("Grid presenter may not be null"); 115 } 116 mGridPresenter = gridPresenter; 117 if (mOnItemSelectedListener != null) { 118 mGridPresenter.setOnItemSelectedListener(mOnItemSelectedListener); 119 } 120 if (mOnItemClickedListener != null) { 121 mGridPresenter.setOnItemClickedListener(mOnItemClickedListener); 122 } 123 } 124 125 /** 126 * Returns the grid presenter. 127 */ 128 public VerticalGridPresenter getGridPresenter() { 129 return mGridPresenter; 130 } 131 132 /** 133 * Sets the object adapter for the fragment. 134 */ 135 public void setAdapter(ObjectAdapter adapter) { 136 mAdapter = adapter; 137 updateAdapter(); 138 } 139 140 /** 141 * Returns the object adapter. 142 */ 143 public ObjectAdapter getAdapter() { 144 return mAdapter; 145 } 146 147 /** 148 * Sets an item selection listener. 149 */ 150 public void setOnItemSelectedListener(OnItemSelectedListener listener) { 151 mOnItemSelectedListener = listener; 152 if (mGridPresenter != null) { 153 mGridPresenter.setOnItemSelectedListener(mOnItemSelectedListener); 154 } 155 } 156 157 // TODO: getitemselectedlistener? 158 159 /** 160 * Sets an item clicked listener. 161 */ 162 public void setOnItemClickedListener(OnItemClickedListener listener) { 163 mOnItemClickedListener = listener; 164 if (mGridPresenter != null) { 165 mGridPresenter.setOnItemClickedListener(mOnItemClickedListener); 166 } 167 } 168 169 /** 170 * Returns the item clicked listener. 171 */ 172 public OnItemClickedListener getOnItemClickedListener() { 173 return mOnItemClickedListener; 174 } 175 176 /** 177 * Sets a click listener for the search affordance. 178 * 179 * The presence of a listener will change the visibility of the search affordance in the 180 * title area. When set to non-null the title area will contain a call to search action. 181 * 182 * The listener onClick method will be invoked when the user click on the search action. 183 * 184 * @param listener The listener. 185 */ 186 public void setOnSearchClickedListener(View.OnClickListener listener) { 187 mExternalOnSearchClickedListener = listener; 188 if (mSearchOrbView != null) { 189 mSearchOrbView.setOnOrbClickedListener(listener); 190 } 191 } 192 193 private void setBadgeDrawable(Drawable drawable) { 194 if (mBadgeView == null) { 195 return; 196 } 197 mBadgeView.setImageDrawable(drawable); 198 if (drawable != null) { 199 mBadgeView.setVisibility(View.VISIBLE); 200 } else { 201 mBadgeView.setVisibility(View.GONE); 202 } 203 } 204 205 private void setTitle(String title) { 206 if (mTitleView != null) { 207 mTitleView.setText(title); 208 } 209 } 210 211 @Override 212 public View onCreateView(LayoutInflater inflater, ViewGroup container, 213 Bundle savedInstanceState) { 214 View root = inflater.inflate(R.layout.lb_vertical_grid_fragment, container, false); 215 216 mBrowseTitle = (ViewGroup) root.findViewById(R.id.browse_title_group); 217 mBadgeView = (ImageView) mBrowseTitle.findViewById(R.id.browse_badge); 218 mTitleView = (TextView) mBrowseTitle.findViewById(R.id.browse_title); 219 mSearchOrbView = (SearchOrbView) mBrowseTitle.findViewById(R.id.browse_orb); 220 if (mExternalOnSearchClickedListener != null) { 221 mSearchOrbView.setOnOrbClickedListener(mExternalOnSearchClickedListener); 222 } 223 224 if (mParams != null) { 225 setBadgeDrawable(mParams.mBadgeDrawable); 226 setTitle(mParams.mTitle); 227 } 228 229 return root; 230 } 231 232 @Override 233 public void onViewCreated(View view, Bundle savedInstanceState) { 234 ViewGroup gridDock = (ViewGroup) view.findViewById(R.id.browse_grid_dock); 235 mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock); 236 gridDock.addView(mGridViewHolder.view); 237 238 updateAdapter(); 239 } 240 241 @Override 242 public void onStart() { 243 super.onStart(); 244 mGridViewHolder.getGridView().requestFocus(); 245 } 246 247 @Override 248 public void onDestroyView() { 249 super.onDestroyView(); 250 mGridViewHolder = null; 251 } 252 253 /** 254 * Sets the selected item position. 255 */ 256 public void setSelectedPosition(int position) { 257 mSelectedPosition = position; 258 if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) { 259 mGridViewHolder.getGridView().setSelectedPositionSmooth(position); 260 } 261 } 262 263 private void updateAdapter() { 264 if (mGridViewHolder != null) { 265 mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter); 266 if (mSelectedPosition != -1) { 267 mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition); 268 } 269 } 270 } 271} 272