DetailsFragment.java revision c3047aae5913bf0f79ed65e2d4b6b74ca38d53de
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
37c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private final RowsFragment mRowsFragment = new RowsFragment();
38c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
39c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private int mContainerListMarginLeft;
40c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private int mContainerListWidth;
41c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private int mContainerListAlignTop;
42c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private OnItemSelectedListener mExternalOnItemSelectedListener;
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) {
49c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mRowsFragment.setAdapter(adapter);
50c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
51c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
52c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
53c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Returns the list of rows.
54c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
55c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public ObjectAdapter getAdapter() {
56c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        return mRowsFragment.getAdapter();
57c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
58c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
59c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
60c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Sets an item selection listener.
61c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
62c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
63c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mExternalOnItemSelectedListener = listener;
64c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
65c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
66c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
67c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Sets an item Clicked listener.
68c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
69c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void setOnItemClickedListener(OnItemClickedListener listener) {
70c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mRowsFragment.setOnItemClickedListener(listener);
71c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
72c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
73c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
74c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Returns the item Clicked listener.
75c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
76c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public OnItemClickedListener getOnItemClickedListener() {
77c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        return mRowsFragment.getOnItemClickedListener();
78c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
79c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
80c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    @Override
81c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void onCreate(Bundle savedInstanceState) {
82c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        super.onCreate(savedInstanceState);
83c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
84c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mContainerListMarginLeft = (int) getResources().getDimension(
85c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn                R.dimen.lb_details_rows_margin_left);
86c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mContainerListWidth =  getResources().getDimensionPixelSize(R.dimen.lb_details_rows_width);
87c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mContainerListAlignTop =
88c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            getResources().getDimensionPixelSize(R.dimen.lb_details_rows_align_top);
89c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
90c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
91c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    @Override
92c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public View onCreateView(LayoutInflater inflater, ViewGroup container,
93c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            Bundle savedInstanceState) {
94c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        return inflater.inflate(R.layout.lb_details_fragment, container, false);
95c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
96c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
97c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private OnItemSelectedListener mRowSelectedListener = new OnItemSelectedListener() {
98c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        @Override
99c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        public void onItemSelected(Object item, Row row) {
100c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            if (mExternalOnItemSelectedListener != null) {
101c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn                mExternalOnItemSelectedListener.onItemSelected(item, row);
102c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            }
103c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        }
104c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    };
105c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
106c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    @Override
107c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    public void onActivityCreated(Bundle savedInstanceState) {
108c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        super.onActivityCreated(savedInstanceState);
109c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
110c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        if (getChildFragmentManager().findFragmentById(R.id.details_container_dock) == null) {
111c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            getChildFragmentManager().beginTransaction()
112c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn                    .replace(R.id.details_container_dock, mRowsFragment).commit();
113c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn            mRowsFragment.setOnItemSelectedListener(mRowSelectedListener);
114c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        }
115c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
116c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
117c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private void setVerticalGridViewLayout(VerticalGridView listview) {
118c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        // align the top edge of item to a fixed position
119c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setItemAlignmentOffset(0);
120c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
121c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setWindowAlignmentOffset(mContainerListAlignTop);
122c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED);
123c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
124c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    }
125c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
126c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    /**
127c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * Setup dimensions that are only meaningful when the child Fragments are inside
128c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     * DetailsFragment.
129c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn     */
130c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn    private void setupChildFragmentLayout() {
131c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        VerticalGridView containerList = mRowsFragment.getVerticalGridView();
132c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        setVerticalGridViewLayout(containerList);
133c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn
134c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mRowsFragment.getVerticalGridView().getLayoutParams().width = mContainerListWidth;
135c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn        mRowsFragment.getVerticalGridView().requestLayout();
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