BaseRowFragment.java revision 42752c860a26deacca04ea9ebeb00ddb4d8ce2fc
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.app.Fragment;
17import android.os.Bundle;
18import android.support.v17.leanback.widget.ObjectAdapter;
19import android.support.v17.leanback.widget.PresenterSelector;
20import android.support.v17.leanback.widget.ItemBridgeAdapter;
21import android.support.v17.leanback.widget.VerticalGridView;
22import android.support.v17.leanback.widget.Row;
23import android.support.v17.leanback.widget.ListRow;
24import android.support.v17.leanback.widget.OnChildSelectedListener;
25import android.view.LayoutInflater;
26import android.view.View;
27import android.view.ViewGroup;
28
29/**
30 * An internal base class for a fragment containing a list of rows.
31 */
32abstract class BaseRowFragment extends Fragment {
33    private ObjectAdapter mAdapter;
34    private VerticalGridView mVerticalGridView;
35    private PresenterSelector mPresenterSelector;
36    private ItemBridgeAdapter mBridgeAdapter;
37    private int mSelectedPosition = -1;
38
39    abstract int getLayoutResourceId();
40
41    private final OnChildSelectedListener mRowSelectedListener = new OnChildSelectedListener() {
42        @Override
43        public void onChildSelected(ViewGroup parent, View view, int position, long id) {
44            onRowSelected(parent, view, position, id);
45        }
46    };
47
48    void onRowSelected(ViewGroup parent, View view, int position, long id) {
49    }
50
51    @Override
52    public View onCreateView(LayoutInflater inflater, ViewGroup container,
53            Bundle savedInstanceState) {
54        View view = inflater.inflate(getLayoutResourceId(), container, false);
55        mVerticalGridView = findGridViewFromRoot(view);
56        return view;
57    }
58
59    VerticalGridView findGridViewFromRoot(View view) {
60        return (VerticalGridView) view;
61    }
62
63    @Override
64    public void onViewCreated(View view, Bundle savedInstanceState) {
65        if (mBridgeAdapter != null) {
66            mVerticalGridView.setAdapter(mBridgeAdapter);
67            if (mSelectedPosition != -1) {
68                mVerticalGridView.setSelectedPosition(mSelectedPosition);
69            }
70        }
71        mVerticalGridView.setOnChildSelectedListener(mRowSelectedListener);
72    }
73
74    @Override
75    public void onDestroyView() {
76        super.onDestroyView();
77        mVerticalGridView = null;
78    }
79
80    /**
81     * Set the presenter selector used to create and bind views.
82     */
83    public final void setPresenterSelector(PresenterSelector presenterSelector) {
84        mPresenterSelector = presenterSelector;
85        updateAdapter();
86    }
87
88    /**
89     * Get the presenter selector used to create and bind views.
90     */
91    public final PresenterSelector getPresenterSelector() {
92        return mPresenterSelector;
93    }
94
95    /**
96     * Sets the adapter for the fragment.
97     */
98    public final void setAdapter(ObjectAdapter rowsAdapter) {
99        mAdapter = rowsAdapter;
100        updateAdapter();
101    }
102
103    /**
104     * Returns the list of rows.
105     */
106    public final ObjectAdapter getAdapter() {
107        return mAdapter;
108    }
109
110    /**
111     * Returns the bridge adapter.
112     */
113    final ItemBridgeAdapter getBridgeAdapter() {
114        return mBridgeAdapter;
115    }
116
117    /**
118     * Set the selected item position.
119     */
120    public void setSelectedPosition(int position) {
121        mSelectedPosition = position;
122        if(mVerticalGridView != null && mVerticalGridView.getAdapter() != null) {
123            mVerticalGridView.setSelectedPositionSmooth(position);
124        }
125    }
126
127    final VerticalGridView getVerticalGridView() {
128        return mVerticalGridView;
129    }
130
131    void updateAdapter() {
132        mBridgeAdapter = null;
133
134        if (mAdapter != null) {
135            // If presenter selector is null, adapter ps will be used
136            mBridgeAdapter = new ItemBridgeAdapter(mAdapter, mPresenterSelector);
137        }
138        if (mVerticalGridView != null) {
139            mVerticalGridView.setAdapter(mBridgeAdapter);
140            if (mBridgeAdapter != null && mSelectedPosition != -1) {
141                mVerticalGridView.setSelectedPosition(mSelectedPosition);
142            }
143        }
144    }
145
146    Object getItem(Row row, int position) {
147        if (row instanceof ListRow) {
148            return ((ListRow) row).getAdapter().get(position);
149        } else {
150            return null;
151        }
152    }
153
154    void onTransitionStart() {
155        if (mVerticalGridView != null) {
156            mVerticalGridView.setAnimateChildLayout(false);
157            mVerticalGridView.setPruneChild(false);
158            mVerticalGridView.setFocusSearchDisabled(true);
159        }
160    }
161
162    void onTransitionEnd() {
163        if (mVerticalGridView != null) {
164            mVerticalGridView.setAnimateChildLayout(true);
165            mVerticalGridView.setPruneChild(true);
166            mVerticalGridView.setFocusSearchDisabled(false);
167        }
168    }
169
170    void setItemAlignment() {
171        if (mVerticalGridView != null) {
172            // align the top edge of item
173            mVerticalGridView.setItemAlignmentOffset(0);
174            mVerticalGridView.setItemAlignmentOffsetPercent(
175                    VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
176        }
177    }
178
179    void setWindowAlignmentFromTop(int alignedTop) {
180        if (mVerticalGridView != null) {
181            // align to a fixed position from top
182            mVerticalGridView.setWindowAlignmentOffset(alignedTop);
183            mVerticalGridView.setWindowAlignmentOffsetPercent(
184                    VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED);
185            mVerticalGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
186        }
187    }
188}
189