DetailsSupportFragment.java revision 61905b0b52c50018dcaebcd79699c39b8f28d622
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 */
14package android.support.v17.leanback.app;
15
16import android.support.v17.leanback.R;
17import android.support.v17.leanback.widget.ObjectAdapter;
18import android.support.v17.leanback.widget.OnItemClickedListener;
19import android.support.v17.leanback.widget.OnItemSelectedListener;
20import android.support.v17.leanback.widget.OnItemViewClickedListener;
21import android.support.v17.leanback.widget.OnItemViewSelectedListener;
22import android.support.v17.leanback.widget.Presenter;
23import android.support.v17.leanback.widget.Row;
24import android.support.v17.leanback.widget.RowPresenter;
25import android.support.v17.leanback.widget.VerticalGridView;
26import android.support.v4.app.Fragment;
27import android.os.Bundle;
28import android.view.LayoutInflater;
29import android.view.View;
30import android.view.ViewGroup;
31
32/**
33 * Wrapper fragment for leanback details screens.
34 */
35public class DetailsSupportFragment extends Fragment {
36    private static final String TAG = "DetailsSupportFragment";
37    private static boolean DEBUG = false;
38
39    private RowsSupportFragment mRowsSupportFragment;
40
41    private ObjectAdapter mAdapter;
42    private int mContainerListAlignTop;
43    private OnItemSelectedListener mExternalOnItemSelectedListener;
44    private OnItemClickedListener mOnItemClickedListener;
45    private OnItemViewSelectedListener mExternalOnItemViewSelectedListener;
46    private OnItemViewClickedListener mOnItemViewClickedListener;
47    private int mSelectedPosition = -1;
48
49    /**
50     * Sets the list of rows for the fragment.
51     */
52    public void setAdapter(ObjectAdapter adapter) {
53        mAdapter = adapter;
54        if (mRowsSupportFragment != null) {
55            mRowsSupportFragment.setAdapter(adapter);
56        }
57    }
58
59    /**
60     * Returns the list of rows.
61     */
62    public ObjectAdapter getAdapter() {
63        return mAdapter;
64    }
65
66    /**
67     * Sets an item selection listener.
68     * @deprecated Use {@link #setOnItemViewSelectedListener(OnItemViewSelectedListener)}
69     */
70    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
71        mExternalOnItemSelectedListener = listener;
72    }
73
74    /**
75     * Sets an item Clicked listener.
76     * @deprecated Use {@link #setOnItemViewClickedListener(OnItemViewClickedListener)}
77     */
78    public void setOnItemClickedListener(OnItemClickedListener listener) {
79        mOnItemClickedListener = listener;
80        if (mRowsSupportFragment != null) {
81            mRowsSupportFragment.setOnItemClickedListener(listener);
82        }
83    }
84
85    /**
86     * Sets an item selection listener.
87     */
88    public void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) {
89        mExternalOnItemViewSelectedListener = listener;
90    }
91
92    /**
93     * Sets an item Clicked listener.
94     */
95    public void setOnItemViewClickedListener(OnItemViewClickedListener listener) {
96        mOnItemViewClickedListener = listener;
97        if (mRowsSupportFragment != null) {
98            mRowsSupportFragment.setOnItemViewClickedListener(listener);
99        }
100    }
101
102    /**
103     * Returns the item Clicked listener.
104     * @deprecated Use {@link #getOnItemViewClickedListener()}
105     */
106    public OnItemClickedListener getOnItemClickedListener() {
107        return mOnItemClickedListener;
108    }
109
110    /**
111     * Returns the item Clicked listener.
112     */
113    public OnItemViewClickedListener getOnItemViewClickedListener() {
114        return mOnItemViewClickedListener;
115    }
116
117    @Override
118    public void onCreate(Bundle savedInstanceState) {
119        super.onCreate(savedInstanceState);
120
121        mContainerListAlignTop =
122            getResources().getDimensionPixelSize(R.dimen.lb_details_rows_align_top);
123    }
124
125    @Override
126    public View onCreateView(LayoutInflater inflater, ViewGroup container,
127            Bundle savedInstanceState) {
128        View view = inflater.inflate(R.layout.lb_details_fragment, container, false);
129        mRowsSupportFragment = (RowsSupportFragment) getChildFragmentManager().findFragmentById(
130                R.id.fragment_dock);
131        if (mRowsSupportFragment == null) {
132            mRowsSupportFragment = new RowsSupportFragment();
133            getChildFragmentManager().beginTransaction()
134                    .replace(R.id.fragment_dock, mRowsSupportFragment).commit();
135        }
136        mRowsSupportFragment.setAdapter(mAdapter);
137        mRowsSupportFragment.setOnItemSelectedListener(mExternalOnItemSelectedListener);
138        mRowsSupportFragment.setOnItemViewSelectedListener(mExternalOnItemViewSelectedListener);
139        mRowsSupportFragment.setOnItemClickedListener(mOnItemClickedListener);
140        mRowsSupportFragment.setOnItemViewClickedListener(mOnItemViewClickedListener);
141        return view;
142    }
143
144    void setVerticalGridViewLayout(VerticalGridView listview) {
145        // align the top edge of item to a fixed position
146        listview.setItemAlignmentOffset(0);
147        listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
148        listview.setWindowAlignmentOffset(mContainerListAlignTop);
149        listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED);
150        listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
151    }
152
153    VerticalGridView getVerticalGridView() {
154        return mRowsSupportFragment == null ? null : mRowsSupportFragment.getVerticalGridView();
155    }
156
157    RowsSupportFragment getRowsSupportFragment() {
158        return mRowsSupportFragment;
159    }
160
161    /**
162     * Setup dimensions that are only meaningful when the child Fragments are inside
163     * DetailsSupportFragment.
164     */
165    private void setupChildFragmentLayout() {
166        setVerticalGridViewLayout(mRowsSupportFragment.getVerticalGridView());
167    }
168
169    @Override
170    public void onStart() {
171        super.onStart();
172        setupChildFragmentLayout();
173        mRowsSupportFragment.getView().requestFocus();
174    }
175}
176