DetailsFragment.java revision 1caf420879768ae8aebe8c27546707a28f3bb659
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.OnChildSelectedListener;
19c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.OnItemClickedListener;
20c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.OnItemSelectedListener;
21c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.Row;
22c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.support.v17.leanback.widget.VerticalGridView;
23c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.util.Log;
24c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.app.Fragment;
25c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.os.Bundle;
26c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.LayoutInflater;
27c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.View;
28c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournimport android.view.ViewGroup;
29c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
30c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn/**
31c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Wrapper fragment for leanback details screens.
32c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */
33c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournpublic class DetailsFragment extends Fragment {
34c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private static final String TAG = "DetailsFragment";
35c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private static boolean DEBUG = false;
36c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
37b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu    private RowsFragment mRowsFragment;
38c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
39b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu    private ObjectAdapter mAdapter;
40c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private int mContainerListAlignTop;
41c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private OnItemSelectedListener mExternalOnItemSelectedListener;
42b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu    private OnItemClickedListener mOnItemClickedListener;
43c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private int mSelectedPosition = -1;
44c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
45c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
46c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Sets the list of rows for the fragment.
47c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
48c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void setAdapter(ObjectAdapter adapter) {
49b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        mAdapter = adapter;
50b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        if (mRowsFragment != null) {
51b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu            mRowsFragment.setAdapter(adapter);
52b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        }
53c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
54c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
55c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
56c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Returns the list of rows.
57c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
58c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public ObjectAdapter getAdapter() {
59b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        return mAdapter;
60c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
61c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
62c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
63c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Sets an item selection listener.
64c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
65c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
66c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mExternalOnItemSelectedListener = listener;
67c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
68c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
69c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
70c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Sets an item Clicked listener.
71c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
72c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void setOnItemClickedListener(OnItemClickedListener listener) {
73b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        mOnItemClickedListener = listener;
74b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        if (mRowsFragment != null) {
75b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu            mRowsFragment.setOnItemClickedListener(listener);
76b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        }
77c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
78c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
79c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
80c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Returns the item Clicked listener.
81c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
82c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public OnItemClickedListener getOnItemClickedListener() {
83b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        return mOnItemClickedListener;
84c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
85c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
86c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    @Override
87c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void onCreate(Bundle savedInstanceState) {
88c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        super.onCreate(savedInstanceState);
89c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
90c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mContainerListAlignTop =
91c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            getResources().getDimensionPixelSize(R.dimen.lb_details_rows_align_top);
92c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
93c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
94c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    @Override
95c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public View onCreateView(LayoutInflater inflater, ViewGroup container,
96c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            Bundle savedInstanceState) {
97b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        View view = inflater.inflate(R.layout.lb_details_fragment, container, false);
981caf420879768ae8aebe8c27546707a28f3bb659Craig Stout        mRowsFragment = (RowsFragment) getChildFragmentManager().findFragmentById(
991caf420879768ae8aebe8c27546707a28f3bb659Craig Stout                R.id.fragment_dock);
1001caf420879768ae8aebe8c27546707a28f3bb659Craig Stout        if (mRowsFragment == null) {
101b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu            mRowsFragment = new RowsFragment();
102b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu            getChildFragmentManager().beginTransaction()
1031caf420879768ae8aebe8c27546707a28f3bb659Craig Stout                    .replace(R.id.fragment_dock, mRowsFragment).commit();
104b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        }
105b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        mRowsFragment.setOnItemSelectedListener(mRowSelectedListener);
106b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        mRowsFragment.setOnItemClickedListener(mOnItemClickedListener);
107b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        mRowsFragment.setAdapter(mAdapter);
108b70539172cdeb5672ed7128f69383d1fc1458ccbDake Gu        return view;
109c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
110c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
111c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private OnItemSelectedListener mRowSelectedListener = new OnItemSelectedListener() {
112c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        @Override
113c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        public void onItemSelected(Object item, Row row) {
114c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            if (mExternalOnItemSelectedListener != null) {
115c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn                mExternalOnItemSelectedListener.onItemSelected(item, row);
116c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            }
117c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        }
118c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    };
119c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
120c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private void setVerticalGridViewLayout(VerticalGridView listview) {
121c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        // align the top edge of item to a fixed position
122c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setItemAlignmentOffset(0);
123c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
124c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setWindowAlignmentOffset(mContainerListAlignTop);
125c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED);
126c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
127c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
128c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
129c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
130c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Setup dimensions that are only meaningful when the child Fragments are inside
131c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * DetailsFragment.
132c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
133c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private void setupChildFragmentLayout() {
134c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        VerticalGridView containerList = mRowsFragment.getVerticalGridView();
135c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        setVerticalGridViewLayout(containerList);
136c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
137c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
138c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    @Override
139c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void onStart() {
140c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        super.onStart();
141c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        setupChildFragmentLayout();
142c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mRowsFragment.getView().requestFocus();
143c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
144c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn}
145