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