BaseRowSupportFragment.java revision 50cf9ada93e50e906f20f5edf595234ada196d45
145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake// CHECKSTYLE:OFF Generated code
245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake/* This file is auto-generated from BaseRowFragment.java.  DO NOT MODIFY. */
345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake/*
5c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake * Copyright (C) 2014 The Android Open Source Project
645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake *
745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake * in compliance with the License. You may obtain a copy of the License at
945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake *
1045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * http://www.apache.org/licenses/LICENSE-2.0
1145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake *
1245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * Unless required by applicable law or agreed to in writing, software distributed under the License
1345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
1445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * or implied. See the License for the specific language governing permissions and limitations under
154bb142b1b712d8e67c81687d396685fba55abf77Andrew Svetlov * the License.
1645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake */
1745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakepackage android.support.v17.leanback.app;
18c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake
19c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drakeimport android.support.v4.app.Fragment;
2045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.os.Bundle;
2145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.support.v17.leanback.widget.ItemBridgeAdapter;
2245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.support.v17.leanback.widget.ListRow;
2345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.support.v17.leanback.widget.ObjectAdapter;
24711a5bdc44823fde2935343cc33b15b19f49930dMartin v. Löwisimport android.support.v17.leanback.widget.OnChildViewHolderSelectedListener;
2545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.support.v17.leanback.widget.PresenterSelector;
2645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.support.v17.leanback.widget.Row;
2704f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hyltonimport android.support.v17.leanback.widget.VerticalGridView;
2804f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hyltonimport android.support.v7.widget.RecyclerView;
2945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.view.LayoutInflater;
3045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.view.View;
3145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeimport android.view.ViewGroup;
3245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
3345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake/**
3445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake * An internal base class for a fragment containing a list of rows.
3545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake */
3645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drakeabstract class BaseRowSupportFragment extends Fragment {
3745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    private static final String CURRENT_SELECTED_POSITION = "currentSelectedPosition";
3845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    private ObjectAdapter mAdapter;
3945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    VerticalGridView mVerticalGridView;
4045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    private PresenterSelector mPresenterSelector;
4144627016da509b2bc59c38d7bf0ba592fe56a7a3Fred Drake    final ItemBridgeAdapter mBridgeAdapter = new ItemBridgeAdapter();
4245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    int mSelectedPosition = -1;
43c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake    private boolean mPendingTransitionPrepare;
4445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    private LateSelectionObserver mLateSelectionObserver = new LateSelectionObserver();
4545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
4616f6329e6153c4b92f2175a5560e372a762befe6Fred Drake    abstract int getLayoutResourceId();
4745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
48c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake    private final OnChildViewHolderSelectedListener mRowSelectedListener =
4945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake            new OnChildViewHolderSelectedListener() {
5045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake                @Override
5145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake                public void onChildViewHolderSelected(RecyclerView parent,
5245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake                        RecyclerView.ViewHolder view, int position, int subposition) {
534bb142b1b712d8e67c81687d396685fba55abf77Andrew Svetlov                    mSelectedPosition = position;
5445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake                    onRowSelected(parent, view, position, subposition);
5545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake                }
5645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake            };
5745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
58c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake    void onRowSelected(RecyclerView parent, RecyclerView.ViewHolder view,
5945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake            int position, int subposition) {
6045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    }
6145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
6245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    @Override
63c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake    public View onCreateView(LayoutInflater inflater, ViewGroup container,
64b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis            Bundle savedInstanceState) {
654bb142b1b712d8e67c81687d396685fba55abf77Andrew Svetlov        View view = inflater.inflate(getLayoutResourceId(), container, false);
66b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis        mVerticalGridView = findGridViewFromRoot(view);
67b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis        if (mPendingTransitionPrepare) {
68b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis            mPendingTransitionPrepare = false;
69b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis            onTransitionPrepare();
70b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis        }
71b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis        return view;
7245cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    }
7304f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hylton
7416f6329e6153c4b92f2175a5560e372a762befe6Fred Drake    VerticalGridView findGridViewFromRoot(View view) {
75b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis        return (VerticalGridView) view;
7645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    }
7745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
7804f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hylton    @Override
79b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis    public void onViewCreated(View view, Bundle savedInstanceState) {
8045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        if (savedInstanceState != null) {
8145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake            mSelectedPosition = savedInstanceState.getInt(CURRENT_SELECTED_POSITION, -1);
8204f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hylton        }
8304f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hylton        setAdapterAndSelection();
8445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        mVerticalGridView.setOnChildViewHolderSelectedListener(mRowSelectedListener);
8545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake    }
8604f39aa859764a9838240d28d6ac3a844c8b6aedJeremy Hylton
87b374dd3a818463592fa3ee8eb38f32b12d6e4a21Martin v. Löwis    /**
8845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake     * This class waits for the adapter to be updated before setting the selected
8945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake     * row.
9045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake     */
9104f4943d132d0d5e9829923706a2cb07a2b0ae9fMartin v. Löwis    private class LateSelectionObserver extends RecyclerView.AdapterDataObserver {
9204f4943d132d0d5e9829923706a2cb07a2b0ae9fMartin v. Löwis        boolean mIsLateSelection = false;
9304f4943d132d0d5e9829923706a2cb07a2b0ae9fMartin v. Löwis
946fd0b0d5bacb38ac88e74a767f11df2bb73ae49bFred Drake        LateSelectionObserver() {
956fd0b0d5bacb38ac88e74a767f11df2bb73ae49bFred Drake        }
96182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
976fd0b0d5bacb38ac88e74a767f11df2bb73ae49bFred Drake        @Override
986fd0b0d5bacb38ac88e74a767f11df2bb73ae49bFred Drake        public void onChanged() {
99182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            performLateSelection();
1006fd0b0d5bacb38ac88e74a767f11df2bb73ae49bFred Drake        }
10145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
102c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake        @Override
10345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        public void onItemRangeInserted(int positionStart, int itemCount) {
10445cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake            performLateSelection();
10545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        }
10645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
10745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        void startLateSelection() {
10845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake            mIsLateSelection = true;
10945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake            mBridgeAdapter.registerAdapterDataObserver(this);
11045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        }
11145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
112c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake        void performLateSelection() {
11345cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake            clear();
114c40cdf7238b3ee019a2605ff1f0aaf1a6fcfd358Fred Drake            if (mVerticalGridView != null) {
11545cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake                mVerticalGridView.setSelectedPosition(mSelectedPosition);
11645cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake            }
11745cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        }
11845cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake
11945cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake        void clear() {
12045cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake            if (mIsLateSelection) {
12145cd9de2bb2faa96bb18eb11d20261d7d1b8c20eFred Drake                mIsLateSelection = false;
122962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis                mBridgeAdapter.unregisterAdapterDataObserver(this);
123962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis            }
124962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis        }
125962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis    }
126962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis
127962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis    void setAdapterAndSelection() {
128962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis        mVerticalGridView.setAdapter(mBridgeAdapter);
129962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis        // We don't set the selected position unless we've data in the adapter.
130962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis        boolean lateSelection = mBridgeAdapter.getItemCount() == 0 && mSelectedPosition >= 0;
131962c9e7f9188c75a3889fcc7fd29fb1626e278d0Martin v. Löwis        if (lateSelection) {
132            mLateSelectionObserver.startLateSelection();
133        } else if (mSelectedPosition >= 0) {
134            mVerticalGridView.setSelectedPosition(mSelectedPosition);
135        }
136    }
137
138    @Override
139    public void onDestroyView() {
140        super.onDestroyView();
141        mLateSelectionObserver.clear();
142        mVerticalGridView = null;
143    }
144
145    @Override
146    public void onSaveInstanceState(Bundle outState) {
147        super.onSaveInstanceState(outState);
148        outState.putInt(CURRENT_SELECTED_POSITION, mSelectedPosition);
149    }
150
151    /**
152     * Set the presenter selector used to create and bind views.
153     */
154    public final void setPresenterSelector(PresenterSelector presenterSelector) {
155        mPresenterSelector = presenterSelector;
156        updateAdapter();
157    }
158
159    /**
160     * Get the presenter selector used to create and bind views.
161     */
162    public final PresenterSelector getPresenterSelector() {
163        return mPresenterSelector;
164    }
165
166    /**
167     * Sets the adapter for the fragment.
168     */
169    public final void setAdapter(ObjectAdapter rowsAdapter) {
170        mAdapter = rowsAdapter;
171        updateAdapter();
172    }
173
174    /**
175     * Returns the list of rows.
176     */
177    public final ObjectAdapter getAdapter() {
178        return mAdapter;
179    }
180
181    /**
182     * Returns the bridge adapter.
183     */
184    final ItemBridgeAdapter getBridgeAdapter() {
185        return mBridgeAdapter;
186    }
187
188    /**
189     * Sets the selected row position with smooth animation.
190     */
191    public void setSelectedPosition(int position) {
192        setSelectedPosition(position, true);
193    }
194
195    /**
196     * Gets position of currently selected row.
197     * @return Position of currently selected row.
198     */
199    public int getSelectedPosition() {
200        return mSelectedPosition;
201    }
202
203    /**
204     * Sets the selected row position.
205     */
206    public void setSelectedPosition(int position, boolean smooth) {
207        if (mSelectedPosition == position) {
208            return;
209        }
210        mSelectedPosition = position;
211        if (mVerticalGridView != null) {
212            if (mLateSelectionObserver.mIsLateSelection) {
213                return;
214            }
215            if (smooth) {
216                mVerticalGridView.setSelectedPositionSmooth(position);
217            } else {
218                mVerticalGridView.setSelectedPosition(position);
219            }
220        }
221    }
222
223    public final VerticalGridView getVerticalGridView() {
224        return mVerticalGridView;
225    }
226
227    void updateAdapter() {
228        mBridgeAdapter.setAdapter(mAdapter);
229        mBridgeAdapter.setPresenter(mPresenterSelector);
230
231        if (mVerticalGridView != null) {
232            setAdapterAndSelection();
233        }
234    }
235
236    Object getItem(Row row, int position) {
237        if (row instanceof ListRow) {
238            return ((ListRow) row).getAdapter().get(position);
239        } else {
240            return null;
241        }
242    }
243
244    public boolean onTransitionPrepare() {
245        if (mVerticalGridView != null) {
246            mVerticalGridView.setAnimateChildLayout(false);
247            mVerticalGridView.setScrollEnabled(false);
248            return true;
249        }
250        mPendingTransitionPrepare = true;
251        return false;
252    }
253
254    public void onTransitionStart() {
255        if (mVerticalGridView != null) {
256            mVerticalGridView.setPruneChild(false);
257            mVerticalGridView.setLayoutFrozen(true);
258            mVerticalGridView.setFocusSearchDisabled(true);
259        }
260    }
261
262    public void onTransitionEnd() {
263        // be careful that fragment might be destroyed before header transition ends.
264        if (mVerticalGridView != null) {
265            mVerticalGridView.setLayoutFrozen(false);
266            mVerticalGridView.setAnimateChildLayout(true);
267            mVerticalGridView.setPruneChild(true);
268            mVerticalGridView.setFocusSearchDisabled(false);
269            mVerticalGridView.setScrollEnabled(true);
270        }
271    }
272
273    public void setAlignment(int windowAlignOffsetTop) {
274        if (mVerticalGridView != null) {
275            // align the top edge of item
276            mVerticalGridView.setItemAlignmentOffset(0);
277            mVerticalGridView.setItemAlignmentOffsetPercent(
278                    VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
279
280            // align to a fixed position from top
281            mVerticalGridView.setWindowAlignmentOffset(windowAlignOffsetTop);
282            mVerticalGridView.setWindowAlignmentOffsetPercent(
283                    VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED);
284            mVerticalGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
285        }
286    }
287}
288