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