HeadersFragment.java revision 4cf79b1c4d38a190317961891f9fd052836710fd
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 */ 14 15package android.support.v17.leanback.app; 16 17import android.graphics.Color; 18import android.os.Bundle; 19import android.support.v17.leanback.R; 20import android.support.v17.leanback.widget.FocusHighlightHelper; 21import android.support.v17.leanback.widget.ItemBridgeAdapter; 22import android.support.v17.leanback.widget.Presenter; 23import android.support.v17.leanback.widget.PresenterSelector; 24import android.support.v17.leanback.widget.OnItemSelectedListener; 25import android.support.v17.leanback.widget.Row; 26import android.support.v17.leanback.widget.RowHeaderPresenter; 27import android.support.v17.leanback.widget.SinglePresenterSelector; 28import android.support.v17.leanback.widget.VerticalGridView; 29import android.support.v7.widget.RecyclerView; 30import android.util.TypedValue; 31import android.view.LayoutInflater; 32import android.view.View; 33import android.view.ViewGroup; 34import android.view.View.OnLayoutChangeListener; 35 36import java.util.ArrayList; 37import java.util.List; 38 39/** 40 * An internal fragment containing a list of row headers. 41 */ 42public class HeadersFragment extends BaseRowFragment { 43 44 interface OnHeaderClickedListener { 45 void onHeaderClicked(); 46 } 47 48 private OnItemSelectedListener mOnItemSelectedListener; 49 private OnHeaderClickedListener mOnHeaderClickedListener; 50 private boolean mShow = true; 51 private int mBackgroundColor; 52 private boolean mBackgroundColorSet; 53 54 private static final PresenterSelector sHeaderPresenter = new SinglePresenterSelector( 55 new RowHeaderPresenter()); 56 57 public HeadersFragment() { 58 setPresenterSelector(sHeaderPresenter); 59 } 60 61 public void setOnHeaderClickedListener(OnHeaderClickedListener listener) { 62 mOnHeaderClickedListener = listener; 63 } 64 65 public void setOnItemSelectedListener(OnItemSelectedListener listener) { 66 mOnItemSelectedListener = listener; 67 } 68 69 @Override 70 protected void onRowSelected(ViewGroup parent, View view, int position, long id) { 71 if (mOnItemSelectedListener != null) { 72 if (position >= 0) { 73 Row row = (Row) getAdapter().get(position); 74 mOnItemSelectedListener.onItemSelected(null, row); 75 } 76 } 77 } 78 79 private final ItemBridgeAdapter.AdapterListener mAdapterListener = 80 new ItemBridgeAdapter.AdapterListener() { 81 @Override 82 public void onCreate(ItemBridgeAdapter.ViewHolder viewHolder) { 83 View headerView = viewHolder.getViewHolder().view; 84 headerView.setOnClickListener(new View.OnClickListener() { 85 @Override 86 public void onClick(View v) { 87 if (mOnHeaderClickedListener != null) { 88 mOnHeaderClickedListener.onHeaderClicked(); 89 } 90 } 91 }); 92 headerView.setFocusable(true); 93 headerView.setFocusableInTouchMode(true); 94 headerView.addOnLayoutChangeListener(sLayoutChangeListener); 95 } 96 97 @Override 98 public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder viewHolder) { 99 View headerView = viewHolder.getViewHolder().view; 100 if (mInTransition) { 101 updateHeaderViewForTransition(headerView, viewHolder.getPosition()); 102 } 103 } 104 }; 105 106 /** 107 * Preparing headerView for transition. 108 */ 109 private void updateHeaderViewForTransition(View headerView, Integer position) { 110 final VerticalGridView listView = getVerticalGridView(); 111 if (position == listView.getSelectedPosition()) { 112 headerView.setId(mReparentHeaderId); 113 } else { 114 headerView.setId(View.NO_ID); 115 } 116 headerView.setTag(R.id.lb_header_transition_position, position); 117 } 118 119 /** 120 * Preparing all headerViews for transition. 121 */ 122 private void updateHeaderViewsForTransition() { 123 final VerticalGridView listView = getVerticalGridView(); 124 if (listView == null) { 125 return; 126 } 127 final int count = listView.getChildCount(); 128 for (int i = 0; i < count; i++) { 129 View child = listView.getChildAt(i); 130 updateHeaderViewForTransition(child, 131 listView.getChildViewHolder(child).getPosition()); 132 } 133 } 134 135 @Override 136 void onTransitionStart() { 137 super.onTransitionStart(); 138 updateHeaderViewsForTransition(); 139 } 140 141 private static OnLayoutChangeListener sLayoutChangeListener = new OnLayoutChangeListener() { 142 @Override 143 public void onLayoutChange(View v, int left, int top, int right, int bottom, 144 int oldLeft, int oldTop, int oldRight, int oldBottom) { 145 v.setPivotX(0); 146 v.setPivotY(v.getMeasuredHeight() / 2); 147 } 148 }; 149 150 @Override 151 protected int getLayoutResourceId() { 152 return R.layout.lb_headers_fragment; 153 } 154 155 @Override 156 public void onViewCreated(View view, Bundle savedInstanceState) { 157 super.onViewCreated(view, savedInstanceState); 158 final VerticalGridView listView = getVerticalGridView(); 159 if (listView == null) { 160 return; 161 } 162 if (getBridgeAdapter() != null) { 163 FocusHighlightHelper.setupHeaderItemFocusHighlight(listView); 164 } 165 listView.setBackgroundColor(getBackgroundColor()); 166 } 167 168 void setHeadersVisiblity(boolean show) { 169 mShow = show; 170 final VerticalGridView listView = getVerticalGridView(); 171 if (listView != null) { 172 listView.setLayoutEnabled(show); 173 } 174 } 175 176 @Override 177 protected void updateAdapter() { 178 super.updateAdapter(); 179 ItemBridgeAdapter adapter = getBridgeAdapter(); 180 if (adapter != null) { 181 adapter.setAdapterListener(mAdapterListener); 182 } 183 if (adapter != null && getVerticalGridView() != null) { 184 FocusHighlightHelper.setupHeaderItemFocusHighlight(getVerticalGridView()); 185 } 186 } 187 188 void setBackgroundColor(int color) { 189 mBackgroundColor = color; 190 mBackgroundColorSet = true; 191 192 if (getVerticalGridView() != null) { 193 getVerticalGridView().setBackgroundColor(mBackgroundColor); 194 } 195 } 196 197 int getBackgroundColor() { 198 if (getActivity() == null) { 199 throw new IllegalStateException("Activity must be attached"); 200 } 201 202 if (mBackgroundColorSet) { 203 return mBackgroundColor; 204 } 205 206 TypedValue outValue = new TypedValue(); 207 getActivity().getTheme().resolveAttribute(android.R.attr.colorBackground, outValue, true); 208 return getResources().getColor(outValue.resourceId); 209 } 210} 211