DetailsFragment.java revision d1adbdcb44a48e142d28a93189c57edfe62d93ce
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.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 DetailsFragment extends Fragment {
36    private static final String TAG = "DetailsFragment";
37    private static boolean DEBUG = false;
38
39    private RowsFragment mRowsFragment;
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 (mRowsFragment != null) {
55            mRowsFragment.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 (mRowsFragment != null) {
81            mRowsFragment.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 (mRowsFragment != null) {
98            mRowsFragment.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        mRowsFragment = (RowsFragment) getChildFragmentManager().findFragmentById(
130                R.id.fragment_dock);
131        if (mRowsFragment == null) {
132            mRowsFragment = new RowsFragment();
133            getChildFragmentManager().beginTransaction()
134                    .replace(R.id.fragment_dock, mRowsFragment).commit();
135        }
136        mRowsFragment.setAdapter(mAdapter);
137        mRowsFragment.setOnItemViewSelectedListener(mRowSelectedListener);
138        mRowsFragment.setOnItemClickedListener(mOnItemClickedListener);
139        mRowsFragment.setOnItemViewClickedListener(mOnItemViewClickedListener);
140        return view;
141    }
142
143    private OnItemViewSelectedListener mRowSelectedListener = new OnItemViewSelectedListener() {
144        @Override
145        public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
146                RowPresenter.ViewHolder rowViewHolder, Row row) {
147            if (mExternalOnItemSelectedListener != null) {
148                mExternalOnItemSelectedListener.onItemSelected(item, row);
149            }
150            if (mExternalOnItemViewSelectedListener != null) {
151                mExternalOnItemViewSelectedListener.onItemSelected(itemViewHolder, item,
152                        rowViewHolder, row);
153            }
154        }
155    };
156
157    void setVerticalGridViewLayout(VerticalGridView listview) {
158        // align the top edge of item to a fixed position
159        listview.setItemAlignmentOffset(0);
160        listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
161        listview.setWindowAlignmentOffset(mContainerListAlignTop);
162        listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED);
163        listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
164    }
165
166    VerticalGridView getVerticalGridView() {
167        return mRowsFragment == null ? null : mRowsFragment.getVerticalGridView();
168    }
169
170    RowsFragment getRowsFragment() {
171        return mRowsFragment;
172    }
173
174    /**
175     * Setup dimensions that are only meaningful when the child Fragments are inside
176     * DetailsFragment.
177     */
178    private void setupChildFragmentLayout() {
179        setVerticalGridViewLayout(mRowsFragment.getVerticalGridView());
180    }
181
182    @Override
183    public void onStart() {
184        super.onStart();
185        setupChildFragmentLayout();
186        mRowsFragment.getView().requestFocus();
187    }
188}
189