BaseRowFragment.java revision ac5fe7c617c66850fff75a9fce9979c6e5674b0f
1// CHECKSTYLE:OFF Generated code
2/* This file is auto-generated from BaseRowSupportFragment.java.  DO NOT MODIFY. */
3
4/*
5 * Copyright (C) 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software distributed under the License
13 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14 * or implied. See the License for the specific language governing permissions and limitations under
15 * the License.
16 */
17package androidx.leanback.app;
18
19import android.os.Bundle;
20import androidx.annotation.NonNull;
21import androidx.annotation.Nullable;
22import androidx.leanback.widget.ItemBridgeAdapter;
23import androidx.leanback.widget.ListRow;
24import androidx.leanback.widget.ObjectAdapter;
25import androidx.leanback.widget.OnChildViewHolderSelectedListener;
26import androidx.leanback.widget.PresenterSelector;
27import androidx.leanback.widget.Row;
28import androidx.leanback.widget.VerticalGridView;
29import android.app.Fragment;
30import androidx.recyclerview.widget.RecyclerView;
31import android.view.LayoutInflater;
32import android.view.View;
33import android.view.ViewGroup;
34
35/**
36 * An internal base class for a fragment containing a list of rows.
37 * @deprecated use {@link BaseRowSupportFragment}
38 */
39@Deprecated
40abstract class BaseRowFragment extends Fragment {
41    private static final String CURRENT_SELECTED_POSITION = "currentSelectedPosition";
42    private ObjectAdapter mAdapter;
43    VerticalGridView mVerticalGridView;
44    private PresenterSelector mPresenterSelector;
45    final ItemBridgeAdapter mBridgeAdapter = new ItemBridgeAdapter();
46    int mSelectedPosition = -1;
47    private boolean mPendingTransitionPrepare;
48    private LateSelectionObserver mLateSelectionObserver = new LateSelectionObserver();
49
50    abstract int getLayoutResourceId();
51
52    private final OnChildViewHolderSelectedListener mRowSelectedListener =
53            new OnChildViewHolderSelectedListener() {
54                @Override
55                public void onChildViewHolderSelected(RecyclerView parent,
56                        RecyclerView.ViewHolder view, int position, int subposition) {
57                    if (!mLateSelectionObserver.mIsLateSelection) {
58                        mSelectedPosition = position;
59                        onRowSelected(parent, view, position, subposition);
60                    }
61                }
62            };
63
64    void onRowSelected(RecyclerView parent, RecyclerView.ViewHolder view,
65            int position, int subposition) {
66    }
67
68    @Override
69    public View onCreateView(LayoutInflater inflater, ViewGroup container,
70            Bundle savedInstanceState) {
71        View view = inflater.inflate(getLayoutResourceId(), container, false);
72        mVerticalGridView = findGridViewFromRoot(view);
73        if (mPendingTransitionPrepare) {
74            mPendingTransitionPrepare = false;
75            onTransitionPrepare();
76        }
77        return view;
78    }
79
80    VerticalGridView findGridViewFromRoot(View view) {
81        return (VerticalGridView) view;
82    }
83
84    @Override
85    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
86        if (savedInstanceState != null) {
87            mSelectedPosition = savedInstanceState.getInt(CURRENT_SELECTED_POSITION, -1);
88        }
89        setAdapterAndSelection();
90        mVerticalGridView.setOnChildViewHolderSelectedListener(mRowSelectedListener);
91    }
92
93    /**
94     * This class waits for the adapter to be updated before setting the selected
95     * row.
96     */
97    private class LateSelectionObserver extends RecyclerView.AdapterDataObserver {
98        boolean mIsLateSelection = false;
99
100        LateSelectionObserver() {
101        }
102
103        @Override
104        public void onChanged() {
105            performLateSelection();
106        }
107
108        @Override
109        public void onItemRangeInserted(int positionStart, int itemCount) {
110            performLateSelection();
111        }
112
113        void startLateSelection() {
114            mIsLateSelection = true;
115            mBridgeAdapter.registerAdapterDataObserver(this);
116        }
117
118        void performLateSelection() {
119            clear();
120            if (mVerticalGridView != null) {
121                mVerticalGridView.setSelectedPosition(mSelectedPosition);
122            }
123        }
124
125        void clear() {
126            if (mIsLateSelection) {
127                mIsLateSelection = false;
128                mBridgeAdapter.unregisterAdapterDataObserver(this);
129            }
130        }
131    }
132
133    void setAdapterAndSelection() {
134        if (mAdapter == null) {
135            // delay until ItemBridgeAdapter has wrappedAdapter. Once we assign ItemBridgeAdapter
136            // to RecyclerView, it will not be allowed to change "hasStableId" to true.
137            return;
138        }
139        if (mVerticalGridView.getAdapter() != mBridgeAdapter) {
140            // avoid extra layout if ItemBridgeAdapter was already set.
141            mVerticalGridView.setAdapter(mBridgeAdapter);
142        }
143        // We don't set the selected position unless we've data in the adapter.
144        boolean lateSelection = mBridgeAdapter.getItemCount() == 0 && mSelectedPosition >= 0;
145        if (lateSelection) {
146            mLateSelectionObserver.startLateSelection();
147        } else if (mSelectedPosition >= 0) {
148            mVerticalGridView.setSelectedPosition(mSelectedPosition);
149        }
150    }
151
152    @Override
153    public void onDestroyView() {
154        super.onDestroyView();
155        mLateSelectionObserver.clear();
156        mVerticalGridView = null;
157    }
158
159    @Override
160    public void onSaveInstanceState(Bundle outState) {
161        super.onSaveInstanceState(outState);
162        outState.putInt(CURRENT_SELECTED_POSITION, mSelectedPosition);
163    }
164
165    /**
166     * Set the presenter selector used to create and bind views.
167     */
168    public final void setPresenterSelector(PresenterSelector presenterSelector) {
169        if (mPresenterSelector != presenterSelector) {
170            mPresenterSelector = presenterSelector;
171            updateAdapter();
172        }
173    }
174
175    /**
176     * Get the presenter selector used to create and bind views.
177     */
178    public final PresenterSelector getPresenterSelector() {
179        return mPresenterSelector;
180    }
181
182    /**
183     * Sets the adapter that represents a list of rows.
184     * @param rowsAdapter Adapter that represents list of rows.
185     */
186    public final void setAdapter(ObjectAdapter rowsAdapter) {
187        if (mAdapter != rowsAdapter) {
188            mAdapter = rowsAdapter;
189            updateAdapter();
190        }
191    }
192
193    /**
194     * Returns the Adapter that represents list of rows.
195     * @return Adapter that represents list of rows.
196     */
197    public final ObjectAdapter getAdapter() {
198        return mAdapter;
199    }
200
201    /**
202     * Returns the RecyclerView.Adapter that wraps {@link #getAdapter()}.
203     * @return The RecyclerView.Adapter that wraps {@link #getAdapter()}.
204     */
205    public final ItemBridgeAdapter getBridgeAdapter() {
206        return mBridgeAdapter;
207    }
208
209    /**
210     * Sets the selected row position with smooth animation.
211     */
212    public void setSelectedPosition(int position) {
213        setSelectedPosition(position, true);
214    }
215
216    /**
217     * Gets position of currently selected row.
218     * @return Position of currently selected row.
219     */
220    public int getSelectedPosition() {
221        return mSelectedPosition;
222    }
223
224    /**
225     * Sets the selected row position.
226     */
227    public void setSelectedPosition(int position, boolean smooth) {
228        if (mSelectedPosition == position) {
229            return;
230        }
231        mSelectedPosition = position;
232        if (mVerticalGridView != null) {
233            if (mLateSelectionObserver.mIsLateSelection) {
234                return;
235            }
236            if (smooth) {
237                mVerticalGridView.setSelectedPositionSmooth(position);
238            } else {
239                mVerticalGridView.setSelectedPosition(position);
240            }
241        }
242    }
243
244    public final VerticalGridView getVerticalGridView() {
245        return mVerticalGridView;
246    }
247
248    void updateAdapter() {
249        mBridgeAdapter.setAdapter(mAdapter);
250        mBridgeAdapter.setPresenter(mPresenterSelector);
251
252        if (mVerticalGridView != null) {
253            setAdapterAndSelection();
254        }
255    }
256
257    Object getItem(Row row, int position) {
258        if (row instanceof ListRow) {
259            return ((ListRow) row).getAdapter().get(position);
260        } else {
261            return null;
262        }
263    }
264
265    public boolean onTransitionPrepare() {
266        if (mVerticalGridView != null) {
267            mVerticalGridView.setAnimateChildLayout(false);
268            mVerticalGridView.setScrollEnabled(false);
269            return true;
270        }
271        mPendingTransitionPrepare = true;
272        return false;
273    }
274
275    public void onTransitionStart() {
276        if (mVerticalGridView != null) {
277            mVerticalGridView.setPruneChild(false);
278            mVerticalGridView.setLayoutFrozen(true);
279            mVerticalGridView.setFocusSearchDisabled(true);
280        }
281    }
282
283    public void onTransitionEnd() {
284        // be careful that fragment might be destroyed before header transition ends.
285        if (mVerticalGridView != null) {
286            mVerticalGridView.setLayoutFrozen(false);
287            mVerticalGridView.setAnimateChildLayout(true);
288            mVerticalGridView.setPruneChild(true);
289            mVerticalGridView.setFocusSearchDisabled(false);
290            mVerticalGridView.setScrollEnabled(true);
291        }
292    }
293
294    public void setAlignment(int windowAlignOffsetTop) {
295        if (mVerticalGridView != null) {
296            // align the top edge of item
297            mVerticalGridView.setItemAlignmentOffset(0);
298            mVerticalGridView.setItemAlignmentOffsetPercent(
299                    VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
300
301            // align to a fixed position from top
302            mVerticalGridView.setWindowAlignmentOffset(windowAlignOffsetTop);
303            mVerticalGridView.setWindowAlignmentOffsetPercent(
304                    VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED);
305            mVerticalGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
306        }
307    }
308}
309