HeadersFragment.java revision d736653bfee7fc83fc68d57d0e0bee5fa807287f
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(R.layout.lb_header)); 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 } else { 76 mOnItemSelectedListener.onItemSelected(null, null); 77 } 78 } 79 } 80 81 private final ItemBridgeAdapter.AdapterListener mAdapterListener = 82 new ItemBridgeAdapter.AdapterListener() { 83 @Override 84 public void onCreate(ItemBridgeAdapter.ViewHolder viewHolder) { 85 View headerView = viewHolder.getViewHolder().view; 86 headerView.setOnClickListener(new View.OnClickListener() { 87 @Override 88 public void onClick(View v) { 89 if (mOnHeaderClickedListener != null) { 90 mOnHeaderClickedListener.onHeaderClicked(); 91 } 92 } 93 }); 94 headerView.setFocusable(true); 95 headerView.setFocusableInTouchMode(true); 96 headerView.addOnLayoutChangeListener(sLayoutChangeListener); 97 } 98 99 }; 100 101 private static OnLayoutChangeListener sLayoutChangeListener = new OnLayoutChangeListener() { 102 @Override 103 public void onLayoutChange(View v, int left, int top, int right, int bottom, 104 int oldLeft, int oldTop, int oldRight, int oldBottom) { 105 v.setPivotX(0); 106 v.setPivotY(v.getMeasuredHeight() / 2); 107 } 108 }; 109 110 @Override 111 protected int getLayoutResourceId() { 112 return R.layout.lb_headers_fragment; 113 } 114 115 @Override 116 public void onViewCreated(View view, Bundle savedInstanceState) { 117 super.onViewCreated(view, savedInstanceState); 118 final VerticalGridView listView = getVerticalGridView(); 119 if (listView == null) { 120 return; 121 } 122 if (getBridgeAdapter() != null) { 123 FocusHighlightHelper.setupHeaderItemFocusHighlight(listView); 124 } 125 listView.setBackgroundColor(getBackgroundColor()); 126 } 127 128 void setHeadersVisiblity(boolean show) { 129 mShow = show; 130 final VerticalGridView listView = getVerticalGridView(); 131 if (listView != null) { 132 listView.setLayoutEnabled(show); 133 } 134 } 135 136 @Override 137 protected void updateAdapter() { 138 super.updateAdapter(); 139 ItemBridgeAdapter adapter = getBridgeAdapter(); 140 if (adapter != null) { 141 adapter.setAdapterListener(mAdapterListener); 142 } 143 if (adapter != null && getVerticalGridView() != null) { 144 FocusHighlightHelper.setupHeaderItemFocusHighlight(getVerticalGridView()); 145 } 146 } 147 148 void setBackgroundColor(int color) { 149 mBackgroundColor = color; 150 mBackgroundColorSet = true; 151 152 if (getVerticalGridView() != null) { 153 getVerticalGridView().setBackgroundColor(mBackgroundColor); 154 } 155 } 156 157 int getBackgroundColor() { 158 if (getActivity() == null) { 159 throw new IllegalStateException("Activity must be attached"); 160 } 161 162 if (mBackgroundColorSet) { 163 return mBackgroundColor; 164 } 165 166 TypedValue outValue = new TypedValue(); 167 getActivity().getTheme().resolveAttribute(android.R.attr.colorBackground, outValue, true); 168 return getResources().getColor(outValue.resourceId); 169 } 170} 171