DetailsFragment.java revision d1adbdcb44a48e142d28a93189c57edfe62d93ce
1c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn/*
2c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Copyright (C) 2014 The Android Open Source Project
3c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn *
4c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * in compliance with the License. You may obtain a copy of the License at
6c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn *
7c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * http://www.apache.org/licenses/LICENSE-2.0
8c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn *
9c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Unless required by applicable law or agreed to in writing, software distributed under the License
10c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * or implied. See the License for the specific language governing permissions and limitations under
12c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * the License.
13c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */
14c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournpackage android.support.v17.leanback.app;
15c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
16c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.R;
17c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.ObjectAdapter;
18c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.OnItemClickedListener;
19c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.OnItemSelectedListener;
20dc9b5676ab337317154fa7702033ae174617525bDake Guimport android.support.v17.leanback.widget.OnItemViewClickedListener;
21dc9b5676ab337317154fa7702033ae174617525bDake Guimport android.support.v17.leanback.widget.OnItemViewSelectedListener;
22dc9b5676ab337317154fa7702033ae174617525bDake Guimport android.support.v17.leanback.widget.Presenter;
23c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.Row;
24dc9b5676ab337317154fa7702033ae174617525bDake Guimport android.support.v17.leanback.widget.RowPresenter;
25c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.VerticalGridView;
26c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.app.Fragment;
27c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.os.Bundle;
28c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.LayoutInflater;
29c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.View;
30c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.ViewGroup;
31c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
32c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn/**
33c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Wrapper fragment for leanback details screens.
34c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */
35c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournpublic class DetailsFragment extends Fragment {
36c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private static final String TAG = "DetailsFragment";
37c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private static boolean DEBUG = false;
38c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
39b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu    private RowsFragment mRowsFragment;
40c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
41b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu    private ObjectAdapter mAdapter;
42c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private int mContainerListAlignTop;
43c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private OnItemSelectedListener mExternalOnItemSelectedListener;
44b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu    private OnItemClickedListener mOnItemClickedListener;
45dc9b5676ab337317154fa7702033ae174617525bDake Gu    private OnItemViewSelectedListener mExternalOnItemViewSelectedListener;
46dc9b5676ab337317154fa7702033ae174617525bDake Gu    private OnItemViewClickedListener mOnItemViewClickedListener;
47c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private int mSelectedPosition = -1;
48c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
49c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
50c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Sets the list of rows for the fragment.
51c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
52c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void setAdapter(ObjectAdapter adapter) {
53b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        mAdapter = adapter;
54b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        if (mRowsFragment != null) {
55b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu            mRowsFragment.setAdapter(adapter);
56b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        }
57c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
58c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
59c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
60c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Returns the list of rows.
61c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
62c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public ObjectAdapter getAdapter() {
63b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        return mAdapter;
64c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
65c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
66c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
67c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Sets an item selection listener.
68dc9b5676ab337317154fa7702033ae174617525bDake Gu     * @deprecated Use {@link #setOnItemViewSelectedListener(OnItemViewSelectedListener)}
69c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
70c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
71c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mExternalOnItemSelectedListener = listener;
72c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
73c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
74c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
75c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Sets an item Clicked listener.
76dc9b5676ab337317154fa7702033ae174617525bDake Gu     * @deprecated Use {@link #setOnItemViewClickedListener(OnItemViewClickedListener)}
77c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
78c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void setOnItemClickedListener(OnItemClickedListener listener) {
79b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        mOnItemClickedListener = listener;
80b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        if (mRowsFragment != null) {
81b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu            mRowsFragment.setOnItemClickedListener(listener);
82b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        }
83c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
84c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
85c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
86dc9b5676ab337317154fa7702033ae174617525bDake Gu     * Sets an item selection listener.
87dc9b5676ab337317154fa7702033ae174617525bDake Gu     */
88dc9b5676ab337317154fa7702033ae174617525bDake Gu    public void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) {
89dc9b5676ab337317154fa7702033ae174617525bDake Gu        mExternalOnItemViewSelectedListener = listener;
90dc9b5676ab337317154fa7702033ae174617525bDake Gu    }
91dc9b5676ab337317154fa7702033ae174617525bDake Gu
92dc9b5676ab337317154fa7702033ae174617525bDake Gu    /**
93dc9b5676ab337317154fa7702033ae174617525bDake Gu     * Sets an item Clicked listener.
94dc9b5676ab337317154fa7702033ae174617525bDake Gu     */
95dc9b5676ab337317154fa7702033ae174617525bDake Gu    public void setOnItemViewClickedListener(OnItemViewClickedListener listener) {
96dc9b5676ab337317154fa7702033ae174617525bDake Gu        mOnItemViewClickedListener = listener;
97dc9b5676ab337317154fa7702033ae174617525bDake Gu        if (mRowsFragment != null) {
98dc9b5676ab337317154fa7702033ae174617525bDake Gu            mRowsFragment.setOnItemViewClickedListener(listener);
99dc9b5676ab337317154fa7702033ae174617525bDake Gu        }
100dc9b5676ab337317154fa7702033ae174617525bDake Gu    }
101dc9b5676ab337317154fa7702033ae174617525bDake Gu
102dc9b5676ab337317154fa7702033ae174617525bDake Gu    /**
103c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Returns the item Clicked listener.
104dc9b5676ab337317154fa7702033ae174617525bDake Gu     * @deprecated Use {@link #getOnItemViewClickedListener()}
105c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
106c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public OnItemClickedListener getOnItemClickedListener() {
107b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        return mOnItemClickedListener;
108c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
109c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
110dc9b5676ab337317154fa7702033ae174617525bDake Gu    /**
111dc9b5676ab337317154fa7702033ae174617525bDake Gu     * Returns the item Clicked listener.
112dc9b5676ab337317154fa7702033ae174617525bDake Gu     */
113dc9b5676ab337317154fa7702033ae174617525bDake Gu    public OnItemViewClickedListener getOnItemViewClickedListener() {
114dc9b5676ab337317154fa7702033ae174617525bDake Gu        return mOnItemViewClickedListener;
115dc9b5676ab337317154fa7702033ae174617525bDake Gu    }
116dc9b5676ab337317154fa7702033ae174617525bDake Gu
117c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    @Override
118c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void onCreate(Bundle savedInstanceState) {
119c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        super.onCreate(savedInstanceState);
120c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
121c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mContainerListAlignTop =
122c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            getResources().getDimensionPixelSize(R.dimen.lb_details_rows_align_top);
123c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
124c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
125c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    @Override
126c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public View onCreateView(LayoutInflater inflater, ViewGroup container,
127c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            Bundle savedInstanceState) {
128b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        View view = inflater.inflate(R.layout.lb_details_fragment, container, false);
1291caf420879768ae8aebe8c27546707a28f3bb659Craig Stout        mRowsFragment = (RowsFragment) getChildFragmentManager().findFragmentById(
1301caf420879768ae8aebe8c27546707a28f3bb659Craig Stout                R.id.fragment_dock);
1311caf420879768ae8aebe8c27546707a28f3bb659Craig Stout        if (mRowsFragment == null) {
132b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu            mRowsFragment = new RowsFragment();
133b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu            getChildFragmentManager().beginTransaction()
1341caf420879768ae8aebe8c27546707a28f3bb659Craig Stout                    .replace(R.id.fragment_dock, mRowsFragment).commit();
135b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        }
1366c3b0b3d19683ea8c4069ec761f14dc2c7b8c5dcCraig Stout        mRowsFragment.setAdapter(mAdapter);
137dc9b5676ab337317154fa7702033ae174617525bDake Gu        mRowsFragment.setOnItemViewSelectedListener(mRowSelectedListener);
138b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        mRowsFragment.setOnItemClickedListener(mOnItemClickedListener);
139dc9b5676ab337317154fa7702033ae174617525bDake Gu        mRowsFragment.setOnItemViewClickedListener(mOnItemViewClickedListener);
140b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        return view;
141c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
142c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
143dc9b5676ab337317154fa7702033ae174617525bDake Gu    private OnItemViewSelectedListener mRowSelectedListener = new OnItemViewSelectedListener() {
144c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        @Override
145dc9b5676ab337317154fa7702033ae174617525bDake Gu        public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
146dc9b5676ab337317154fa7702033ae174617525bDake Gu                RowPresenter.ViewHolder rowViewHolder, Row row) {
147c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            if (mExternalOnItemSelectedListener != null) {
148c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn                mExternalOnItemSelectedListener.onItemSelected(item, row);
149c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            }
150dc9b5676ab337317154fa7702033ae174617525bDake Gu            if (mExternalOnItemViewSelectedListener != null) {
151dc9b5676ab337317154fa7702033ae174617525bDake Gu                mExternalOnItemViewSelectedListener.onItemSelected(itemViewHolder, item,
152dc9b5676ab337317154fa7702033ae174617525bDake Gu                        rowViewHolder, row);
153dc9b5676ab337317154fa7702033ae174617525bDake Gu            }
154c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        }
155c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    };
156c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
1577ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    void setVerticalGridViewLayout(VerticalGridView listview) {
158c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        // align the top edge of item to a fixed position
159c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setItemAlignmentOffset(0);
160c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
161c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setWindowAlignmentOffset(mContainerListAlignTop);
162c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED);
163c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
164c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
165c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
1667ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    VerticalGridView getVerticalGridView() {
1677ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        return mRowsFragment == null ? null : mRowsFragment.getVerticalGridView();
1687ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    }
1697ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
170d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    RowsFragment getRowsFragment() {
171d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        return mRowsFragment;
172d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    }
173d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
174c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
175c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Setup dimensions that are only meaningful when the child Fragments are inside
176c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * DetailsFragment.
177c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
178c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private void setupChildFragmentLayout() {
1797ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        setVerticalGridViewLayout(mRowsFragment.getVerticalGridView());
180c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
181c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
182c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    @Override
183c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void onStart() {
184c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        super.onStart();
185c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        setupChildFragmentLayout();
186c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mRowsFragment.getView().requestFocus();
187c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
188c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn}
189