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