1/* This file is auto-generated from BaseRowFragment.java.  DO NOT MODIFY. */
2
3/*
4 * Copyright (C) 2014 The Android Open Source Project
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
7 * in compliance with the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software distributed under the License
12 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
13 * or implied. See the License for the specific language governing permissions and limitations under
14 * the License.
15 */
16package android.support.v17.leanback.app;
17
18import android.support.v4.app.Fragment;
19import android.os.Bundle;
20import android.support.v17.leanback.widget.ObjectAdapter;
21import android.support.v17.leanback.widget.PresenterSelector;
22import android.support.v17.leanback.widget.ItemBridgeAdapter;
23import android.support.v17.leanback.widget.VerticalGridView;
24import android.support.v17.leanback.widget.Row;
25import android.support.v17.leanback.widget.ListRow;
26import android.support.v17.leanback.widget.OnChildViewHolderSelectedListener;
27import android.support.v7.widget.RecyclerView;
28import android.view.LayoutInflater;
29import android.view.View;
30import android.view.ViewGroup;
31
32/**
33 * An internal base class for a fragment containing a list of rows.
34 */
35abstract class BaseRowSupportFragment extends Fragment {
36    private ObjectAdapter mAdapter;
37    private VerticalGridView mVerticalGridView;
38    private PresenterSelector mPresenterSelector;
39    private ItemBridgeAdapter mBridgeAdapter;
40    private int mSelectedPosition = -1;
41    private boolean mPendingTransitionPrepare;
42
43    abstract int getLayoutResourceId();
44
45    private final OnChildViewHolderSelectedListener mRowSelectedListener =
46            new OnChildViewHolderSelectedListener() {
47                @Override
48                public void onChildViewHolderSelected(RecyclerView parent,
49                        RecyclerView.ViewHolder view, int position, int subposition) {
50                    onRowSelected(parent, view, position, subposition);
51                }
52            };
53
54    void onRowSelected(RecyclerView parent, RecyclerView.ViewHolder view,
55            int position, int subposition) {
56    }
57
58    @Override
59    public View onCreateView(LayoutInflater inflater, ViewGroup container,
60            Bundle savedInstanceState) {
61        View view = inflater.inflate(getLayoutResourceId(), container, false);
62        mVerticalGridView = findGridViewFromRoot(view);
63        if (mPendingTransitionPrepare) {
64            mPendingTransitionPrepare = false;
65            onTransitionPrepare();
66        }
67        return view;
68    }
69
70    VerticalGridView findGridViewFromRoot(View view) {
71        return (VerticalGridView) view;
72    }
73
74    @Override
75    public void onViewCreated(View view, Bundle savedInstanceState) {
76        if (mBridgeAdapter != null) {
77            mVerticalGridView.setAdapter(mBridgeAdapter);
78            if (mSelectedPosition != -1) {
79                mVerticalGridView.setSelectedPosition(mSelectedPosition);
80            }
81        }
82        mVerticalGridView.setOnChildViewHolderSelectedListener(mRowSelectedListener);
83    }
84
85    @Override
86    public void onDestroyView() {
87        super.onDestroyView();
88        mVerticalGridView = null;
89    }
90
91    /**
92     * Set the presenter selector used to create and bind views.
93     */
94    public final void setPresenterSelector(PresenterSelector presenterSelector) {
95        mPresenterSelector = presenterSelector;
96        updateAdapter();
97    }
98
99    /**
100     * Get the presenter selector used to create and bind views.
101     */
102    public final PresenterSelector getPresenterSelector() {
103        return mPresenterSelector;
104    }
105
106    /**
107     * Sets the adapter for the fragment.
108     */
109    public final void setAdapter(ObjectAdapter rowsAdapter) {
110        mAdapter = rowsAdapter;
111        updateAdapter();
112    }
113
114    /**
115     * Returns the list of rows.
116     */
117    public final ObjectAdapter getAdapter() {
118        return mAdapter;
119    }
120
121    /**
122     * Returns the bridge adapter.
123     */
124    final ItemBridgeAdapter getBridgeAdapter() {
125        return mBridgeAdapter;
126    }
127
128    /**
129     * Sets the selected row position with smooth animation.
130     */
131    public void setSelectedPosition(int position) {
132        setSelectedPosition(position, true);
133    }
134
135    /**
136     * Sets the selected row position.
137     */
138    public void setSelectedPosition(int position, boolean smooth) {
139        mSelectedPosition = position;
140        if(mVerticalGridView != null && mVerticalGridView.getAdapter() != null) {
141            if (smooth) {
142                mVerticalGridView.setSelectedPositionSmooth(position);
143            } else {
144                mVerticalGridView.setSelectedPosition(position);
145            }
146        }
147    }
148
149    final VerticalGridView getVerticalGridView() {
150        return mVerticalGridView;
151    }
152
153    void updateAdapter() {
154        if (mBridgeAdapter != null) {
155            // detach observer from ObjectAdapter
156            mBridgeAdapter.clear();
157            mBridgeAdapter = null;
158        }
159
160        if (mAdapter != null) {
161            // If presenter selector is null, adapter ps will be used
162            mBridgeAdapter = new ItemBridgeAdapter(mAdapter, mPresenterSelector);
163        }
164        if (mVerticalGridView != null) {
165            mVerticalGridView.setAdapter(mBridgeAdapter);
166            if (mBridgeAdapter != null && mSelectedPosition != -1) {
167                mVerticalGridView.setSelectedPosition(mSelectedPosition);
168            }
169        }
170    }
171
172    Object getItem(Row row, int position) {
173        if (row instanceof ListRow) {
174            return ((ListRow) row).getAdapter().get(position);
175        } else {
176            return null;
177        }
178    }
179
180    boolean onTransitionPrepare() {
181        if (mVerticalGridView != null) {
182            mVerticalGridView.setAnimateChildLayout(false);
183            mVerticalGridView.setScrollEnabled(false);
184            return true;
185        }
186        mPendingTransitionPrepare = true;
187        return false;
188    }
189
190    void onTransitionStart() {
191        if (mVerticalGridView != null) {
192            mVerticalGridView.setPruneChild(false);
193            mVerticalGridView.setLayoutFrozen(true);
194            mVerticalGridView.setFocusSearchDisabled(true);
195        }
196    }
197
198    void onTransitionEnd() {
199        // be careful that fragment might be destroyed before header transition ends.
200        if (mVerticalGridView != null) {
201            mVerticalGridView.setLayoutFrozen(false);
202            mVerticalGridView.setAnimateChildLayout(true);
203            mVerticalGridView.setPruneChild(true);
204            mVerticalGridView.setFocusSearchDisabled(false);
205            mVerticalGridView.setScrollEnabled(true);
206        }
207    }
208
209    void setItemAlignment() {
210        if (mVerticalGridView != null) {
211            // align the top edge of item
212            mVerticalGridView.setItemAlignmentOffset(0);
213            mVerticalGridView.setItemAlignmentOffsetPercent(
214                    VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
215        }
216    }
217
218    void setWindowAlignmentFromTop(int alignedTop) {
219        if (mVerticalGridView != null) {
220            // align to a fixed position from top
221            mVerticalGridView.setWindowAlignmentOffset(alignedTop);
222            mVerticalGridView.setWindowAlignmentOffsetPercent(
223                    VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED);
224            mVerticalGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
225        }
226    }
227}
228