HeadersFragment.java revision bd80644186ff8622c565f067dc3a4136a4dc0586
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.os.Bundle;
18import android.support.v17.leanback.R;
19import android.support.v17.leanback.widget.FocusHighlightHelper;
20import android.support.v17.leanback.widget.ItemBridgeAdapter;
21import android.support.v17.leanback.widget.Presenter;
22import android.support.v17.leanback.widget.PresenterSelector;
23import android.support.v17.leanback.widget.OnItemSelectedListener;
24import android.support.v17.leanback.widget.Row;
25import android.support.v17.leanback.widget.RowHeaderPresenter;
26import android.support.v17.leanback.widget.SinglePresenterSelector;
27import android.support.v17.leanback.widget.VerticalGridView;
28import android.support.v7.widget.RecyclerView;
29import android.view.LayoutInflater;
30import android.view.View;
31import android.view.ViewGroup;
32
33import java.util.List;
34
35/**
36 * An internal fragment containing a list of row headers.
37 */
38public class HeadersFragment extends BaseRowFragment {
39
40    interface OnHeaderClickedListener {
41        void onHeaderClicked();
42    }
43
44    private OnItemSelectedListener mOnItemSelectedListener;
45    private OnHeaderClickedListener mOnHeaderClickedListener;
46    private boolean mShow = true;
47
48    private static final PresenterSelector sHeaderPresenter = new SinglePresenterSelector(
49            new RowHeaderPresenter());
50
51    public HeadersFragment() {
52        setPresenterSelector(sHeaderPresenter);
53    }
54
55    public void setOnHeaderClickedListener(OnHeaderClickedListener listener) {
56        mOnHeaderClickedListener = listener;
57    }
58
59    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
60        mOnItemSelectedListener = listener;
61    }
62
63    @Override
64    protected void onRowSelected(ViewGroup parent, View view, int position, long id) {
65        if (mOnItemSelectedListener != null) {
66            if (position >= 0) {
67                Row row = (Row) getAdapter().get(position);
68                mOnItemSelectedListener.onItemSelected(null, row);
69            }
70        }
71    }
72
73    private final ItemBridgeAdapter.AdapterListener mAdapterListener =
74            new ItemBridgeAdapter.AdapterListener() {
75        @Override
76        public void onCreate(ItemBridgeAdapter.ViewHolder viewHolder) {
77            View headerView = viewHolder.getViewHolder().view;
78            headerView.setOnClickListener(new View.OnClickListener() {
79                @Override
80                public void onClick(View v) {
81                    if (mOnHeaderClickedListener != null) {
82                        mOnHeaderClickedListener.onHeaderClicked();
83                    }
84                }
85            });
86            headerView.setFocusable(true);
87            headerView.setFocusableInTouchMode(true);
88        }
89
90        @Override
91        public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder viewHolder) {
92            View headerView = viewHolder.getViewHolder().view;
93            headerView.setVisibility(mShow ? View.VISIBLE : View.INVISIBLE);
94        }
95    };
96
97    @Override
98    protected int getLayoutResourceId() {
99        return R.layout.lb_headers_fragment;
100    }
101
102    @Override
103    public void onViewCreated(View view, Bundle savedInstanceState) {
104        super.onViewCreated(view, savedInstanceState);
105        if (getBridgeAdapter() != null && getVerticalGridView() != null) {
106            FocusHighlightHelper.setupHeaderItemFocusHighlight(getVerticalGridView());
107        }
108    }
109
110    void getHeaderViews(List<View> headers, List<Integer> positions) {
111        final VerticalGridView listView = getVerticalGridView();
112        if (listView == null) {
113            return;
114        }
115        final int count = listView.getChildCount();
116        for (int i = 0; i < count; i++) {
117            View child = listView.getChildAt(i);
118            headers.add(child);
119            positions.add(listView.getChildViewHolder(child).getPosition());
120        }
121    }
122
123    void setHeadersVisiblity(boolean show) {
124        mShow = show;
125        final VerticalGridView listView = getVerticalGridView();
126        if (listView == null) {
127            return;
128        }
129        final int count = listView.getChildCount();
130        final int visibility = mShow ? View.VISIBLE : View.INVISIBLE;
131
132        // we should set visibility of selected view first so that it can
133        // regain the focus from parent (which is FOCUS_AFTER_DESCENDANT)
134        final int selectedPosition = listView.getSelectedPosition();
135        if (selectedPosition >= 0) {
136            RecyclerView.ViewHolder vh = listView.findViewHolderForPosition(selectedPosition);
137            if (vh != null) {
138                vh.itemView.setVisibility(visibility);
139            }
140        }
141        for (int i = 0; i < count; i++) {
142            View child = listView.getChildAt(i);
143            if (listView.getChildPosition(child) != selectedPosition) {
144                child.setVisibility(visibility);
145            }
146        }
147    }
148
149    @Override
150    protected void updateAdapter() {
151        super.updateAdapter();
152        ItemBridgeAdapter adapter = getBridgeAdapter();
153        if (adapter != null) {
154            adapter.setAdapterListener(mAdapterListener);
155        }
156        if (adapter != null && getVerticalGridView() != null) {
157            FocusHighlightHelper.setupHeaderItemFocusHighlight(getVerticalGridView());
158        }
159    }
160}
161