HeadersFragment.java revision 056561d81012983d2d27b8665c4aeabb427174cb
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 mHeadersEnabled = true; 51 private boolean mHeadersGone = false; 52 private int mBackgroundColor; 53 private boolean mBackgroundColorSet; 54 55 private static final PresenterSelector sHeaderPresenter = new SinglePresenterSelector( 56 new RowHeaderPresenter(R.layout.lb_header)); 57 58 public HeadersFragment() { 59 setPresenterSelector(sHeaderPresenter); 60 } 61 62 public void setOnHeaderClickedListener(OnHeaderClickedListener listener) { 63 mOnHeaderClickedListener = listener; 64 } 65 66 public void setOnItemSelectedListener(OnItemSelectedListener listener) { 67 mOnItemSelectedListener = listener; 68 } 69 70 @Override 71 protected void onRowSelected(ViewGroup parent, View view, int position, long id) { 72 if (mOnItemSelectedListener != null) { 73 if (position >= 0) { 74 Row row = (Row) getAdapter().get(position); 75 mOnItemSelectedListener.onItemSelected(null, row); 76 } else { 77 mOnItemSelectedListener.onItemSelected(null, null); 78 } 79 } 80 } 81 82 private final ItemBridgeAdapter.AdapterListener mAdapterListener = 83 new ItemBridgeAdapter.AdapterListener() { 84 @Override 85 public void onCreate(ItemBridgeAdapter.ViewHolder viewHolder) { 86 View headerView = viewHolder.getViewHolder().view; 87 headerView.setOnClickListener(new View.OnClickListener() { 88 @Override 89 public void onClick(View v) { 90 if (mOnHeaderClickedListener != null) { 91 mOnHeaderClickedListener.onHeaderClicked(); 92 } 93 } 94 }); 95 headerView.setFocusable(true); 96 headerView.setFocusableInTouchMode(true); 97 headerView.addOnLayoutChangeListener(sLayoutChangeListener); 98 } 99 100 }; 101 102 private static OnLayoutChangeListener sLayoutChangeListener = new OnLayoutChangeListener() { 103 @Override 104 public void onLayoutChange(View v, int left, int top, int right, int bottom, 105 int oldLeft, int oldTop, int oldRight, int oldBottom) { 106 v.setPivotX(0); 107 v.setPivotY(v.getMeasuredHeight() / 2); 108 } 109 }; 110 111 @Override 112 protected int getLayoutResourceId() { 113 return R.layout.lb_headers_fragment; 114 } 115 116 @Override 117 public void onViewCreated(View view, Bundle savedInstanceState) { 118 super.onViewCreated(view, savedInstanceState); 119 final VerticalGridView listView = getVerticalGridView(); 120 if (listView == null) { 121 return; 122 } 123 if (getBridgeAdapter() != null) { 124 FocusHighlightHelper.setupHeaderItemFocusHighlight(listView); 125 } 126 listView.setBackgroundColor(getBackgroundColor()); 127 listView.setVisibility(mHeadersGone ? View.GONE : View.VISIBLE); 128 listView.setLayoutEnabled(mHeadersEnabled); 129 } 130 131 void setHeadersEnabled(boolean enabled) { 132 mHeadersEnabled = enabled; 133 final VerticalGridView listView = getVerticalGridView(); 134 if (listView != null) { 135 listView.setLayoutEnabled(mHeadersEnabled); 136 } 137 } 138 139 void setHeadersGone(boolean gone) { 140 mHeadersGone = gone; 141 final VerticalGridView listView = getVerticalGridView(); 142 if (listView != null) { 143 listView.setVisibility(mHeadersGone ? View.GONE : View.VISIBLE); 144 } 145 } 146 147 @Override 148 protected void updateAdapter() { 149 super.updateAdapter(); 150 ItemBridgeAdapter adapter = getBridgeAdapter(); 151 if (adapter != null) { 152 adapter.setAdapterListener(mAdapterListener); 153 } 154 if (adapter != null && getVerticalGridView() != null) { 155 FocusHighlightHelper.setupHeaderItemFocusHighlight(getVerticalGridView()); 156 } 157 } 158 159 void setBackgroundColor(int color) { 160 mBackgroundColor = color; 161 mBackgroundColorSet = true; 162 163 if (getVerticalGridView() != null) { 164 getVerticalGridView().setBackgroundColor(mBackgroundColor); 165 } 166 } 167 168 int getBackgroundColor() { 169 if (getActivity() == null) { 170 throw new IllegalStateException("Activity must be attached"); 171 } 172 173 if (mBackgroundColorSet) { 174 return mBackgroundColor; 175 } 176 177 TypedValue outValue = new TypedValue(); 178 getActivity().getTheme().resolveAttribute(R.attr.defaultBrandColor, outValue, true); 179 return getResources().getColor(outValue.resourceId); 180 } 181} 182