155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout/*
255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Copyright (C) 2014 The Android Open Source Project
355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout *
455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * in compliance with the License. You may obtain a copy of the License at
655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout *
755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * http://www.apache.org/licenses/LICENSE-2.0
855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout *
955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Unless required by applicable law or agreed to in writing, software distributed under the License
1055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
1155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * or implied. See the License for the specific language governing permissions and limitations under
1255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * the License.
1355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout */
1455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutpackage android.support.v17.leanback.app;
1555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
1655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.app.Fragment;
1755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.os.Bundle;
1855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.support.v17.leanback.widget.ItemBridgeAdapter;
1955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.support.v17.leanback.widget.ListRow;
202f5ebf3f6f7bb6a24856f389e369b247118ba119susnataimport android.support.v17.leanback.widget.ObjectAdapter;
210246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v17.leanback.widget.OnChildViewHolderSelectedListener;
222f5ebf3f6f7bb6a24856f389e369b247118ba119susnataimport android.support.v17.leanback.widget.PresenterSelector;
232f5ebf3f6f7bb6a24856f389e369b247118ba119susnataimport android.support.v17.leanback.widget.Row;
242f5ebf3f6f7bb6a24856f389e369b247118ba119susnataimport android.support.v17.leanback.widget.VerticalGridView;
250246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport android.support.v7.widget.RecyclerView;
2655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.view.LayoutInflater;
2755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.view.View;
2855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.view.ViewGroup;
2955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
3055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout/**
31a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn * An internal base class for a fragment containing a list of rows.
3255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout */
3355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutabstract class BaseRowFragment extends Fragment {
34fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak    private static final String CURRENT_SELECTED_POSITION = "currentSelectedPosition";
3555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    private ObjectAdapter mAdapter;
3699ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas    VerticalGridView mVerticalGridView;
3755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    private PresenterSelector mPresenterSelector;
3899ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas    ItemBridgeAdapter mBridgeAdapter;
3999ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas    int mSelectedPosition = -1;
40902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu    private boolean mPendingTransitionPrepare;
41bb0a680c10b84b83833a59634373140f8bd0750csusnata    private LateSelectionObserver mLateSelectionObserver = new LateSelectionObserver();
4255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
4342752c860a26deacca04ea9ebeb00ddb4d8ce2fcDake Gu    abstract int getLayoutResourceId();
4455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
450246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu    private final OnChildViewHolderSelectedListener mRowSelectedListener =
460246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu            new OnChildViewHolderSelectedListener() {
470246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu                @Override
480246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu                public void onChildViewHolderSelected(RecyclerView parent,
490246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu                        RecyclerView.ViewHolder view, int position, int subposition) {
500d841b3454f896da58deb506ca22730bfd04f34fDake Gu                    mSelectedPosition = position;
510246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu                    onRowSelected(parent, view, position, subposition);
520246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu                }
530246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu            };
5455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
550246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu    void onRowSelected(RecyclerView parent, RecyclerView.ViewHolder view,
560246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu            int position, int subposition) {
5755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
5855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
5955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    @Override
607a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu    public View onCreateView(LayoutInflater inflater, ViewGroup container,
617a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu            Bundle savedInstanceState) {
627a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu        View view = inflater.inflate(getLayoutResourceId(), container, false);
637a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu        mVerticalGridView = findGridViewFromRoot(view);
64902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu        if (mPendingTransitionPrepare) {
65902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu            mPendingTransitionPrepare = false;
66902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu            onTransitionPrepare();
67902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu        }
687a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu        return view;
697a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu    }
707a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu
7142752c860a26deacca04ea9ebeb00ddb4d8ce2fcDake Gu    VerticalGridView findGridViewFromRoot(View view) {
727a208cd35be79a69b1f4f36724b85ab96eb23e75Dake Gu        return (VerticalGridView) view;
7355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
7455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
7555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    @Override
7655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    public void onViewCreated(View view, Bundle savedInstanceState) {
77fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak        if (savedInstanceState != null) {
78fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak            mSelectedPosition = savedInstanceState.getInt(CURRENT_SELECTED_POSITION, -1);
79fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak        }
8055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        if (mBridgeAdapter != null) {
81bb0a680c10b84b83833a59634373140f8bd0750csusnata            setAdapterAndSelection();
82bb0a680c10b84b83833a59634373140f8bd0750csusnata        }
83bb0a680c10b84b83833a59634373140f8bd0750csusnata        mVerticalGridView.setOnChildViewHolderSelectedListener(mRowSelectedListener);
84bb0a680c10b84b83833a59634373140f8bd0750csusnata    }
85bb0a680c10b84b83833a59634373140f8bd0750csusnata
86bb0a680c10b84b83833a59634373140f8bd0750csusnata    /**
87bb0a680c10b84b83833a59634373140f8bd0750csusnata     * This class waits for the adapter to be updated before setting the selected
88bb0a680c10b84b83833a59634373140f8bd0750csusnata     * row.
89bb0a680c10b84b83833a59634373140f8bd0750csusnata     */
90bb0a680c10b84b83833a59634373140f8bd0750csusnata    private class LateSelectionObserver extends RecyclerView.AdapterDataObserver {
91bb0a680c10b84b83833a59634373140f8bd0750csusnata        boolean mIsLateSelection = false;
92bb0a680c10b84b83833a59634373140f8bd0750csusnata
9399ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas        LateSelectionObserver() {
9499ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas        }
9599ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas
9615375aa6fd54b036f97f99229aefab2822c8a1c9Aurimas Liutikas        @Override
97bb0a680c10b84b83833a59634373140f8bd0750csusnata        public void onChanged() {
98bb0a680c10b84b83833a59634373140f8bd0750csusnata            performLateSelection();
99bb0a680c10b84b83833a59634373140f8bd0750csusnata        }
100bb0a680c10b84b83833a59634373140f8bd0750csusnata
10115375aa6fd54b036f97f99229aefab2822c8a1c9Aurimas Liutikas        @Override
102bb0a680c10b84b83833a59634373140f8bd0750csusnata        public void onItemRangeInserted(int positionStart, int itemCount) {
103bb0a680c10b84b83833a59634373140f8bd0750csusnata            performLateSelection();
104bb0a680c10b84b83833a59634373140f8bd0750csusnata        }
105bb0a680c10b84b83833a59634373140f8bd0750csusnata
106bb0a680c10b84b83833a59634373140f8bd0750csusnata        void startLateSelection() {
107bb0a680c10b84b83833a59634373140f8bd0750csusnata            mIsLateSelection = true;
108bb0a680c10b84b83833a59634373140f8bd0750csusnata            mBridgeAdapter.registerAdapterDataObserver(this);
109bb0a680c10b84b83833a59634373140f8bd0750csusnata        }
110bb0a680c10b84b83833a59634373140f8bd0750csusnata
111bb0a680c10b84b83833a59634373140f8bd0750csusnata        void performLateSelection() {
112bb0a680c10b84b83833a59634373140f8bd0750csusnata            clear();
113bb0a680c10b84b83833a59634373140f8bd0750csusnata            if (mVerticalGridView != null) {
114a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn                mVerticalGridView.setSelectedPosition(mSelectedPosition);
11555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout            }
11655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        }
117bb0a680c10b84b83833a59634373140f8bd0750csusnata
118bb0a680c10b84b83833a59634373140f8bd0750csusnata        void clear() {
119bb0a680c10b84b83833a59634373140f8bd0750csusnata            if (mIsLateSelection) {
120bb0a680c10b84b83833a59634373140f8bd0750csusnata                mIsLateSelection = false;
121bb0a680c10b84b83833a59634373140f8bd0750csusnata                mBridgeAdapter.unregisterAdapterDataObserver(this);
122bb0a680c10b84b83833a59634373140f8bd0750csusnata            }
123bb0a680c10b84b83833a59634373140f8bd0750csusnata        }
124bb0a680c10b84b83833a59634373140f8bd0750csusnata    }
125bb0a680c10b84b83833a59634373140f8bd0750csusnata
126bb0a680c10b84b83833a59634373140f8bd0750csusnata    void setAdapterAndSelection() {
127bb0a680c10b84b83833a59634373140f8bd0750csusnata        mVerticalGridView.setAdapter(mBridgeAdapter);
128bb0a680c10b84b83833a59634373140f8bd0750csusnata        // We don't set the selected position unless we've data in the adapter.
129bb0a680c10b84b83833a59634373140f8bd0750csusnata        boolean lateSelection = mBridgeAdapter.getItemCount() == 0 && mSelectedPosition >= 0;
130bb0a680c10b84b83833a59634373140f8bd0750csusnata        if (lateSelection) {
131bb0a680c10b84b83833a59634373140f8bd0750csusnata            mLateSelectionObserver.startLateSelection();
132bb0a680c10b84b83833a59634373140f8bd0750csusnata        } else if (mSelectedPosition >= 0) {
133bb0a680c10b84b83833a59634373140f8bd0750csusnata            mVerticalGridView.setSelectedPosition(mSelectedPosition);
134bb0a680c10b84b83833a59634373140f8bd0750csusnata        }
13555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
13655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
13755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    @Override
13855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    public void onDestroyView() {
13955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        super.onDestroyView();
140bb0a680c10b84b83833a59634373140f8bd0750csusnata        mLateSelectionObserver.clear();
141a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn        mVerticalGridView = null;
14255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
14355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
144fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak    @Override
145fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak    public void onSaveInstanceState(Bundle outState) {
146fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak        super.onSaveInstanceState(outState);
147fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak        outState.putInt(CURRENT_SELECTED_POSITION, mSelectedPosition);
148fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak    }
149fb11ded6cfa3965883e68625e0c7e14b4b4fe0b3Susnata Basak
15055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    /**
151cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu     * Set the presenter selector used to create and bind views.
15255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout     */
153cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    public final void setPresenterSelector(PresenterSelector presenterSelector) {
15455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        mPresenterSelector = presenterSelector;
15555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        updateAdapter();
15655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
15755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
15855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    /**
159cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu     * Get the presenter selector used to create and bind views.
160cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu     */
161cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    public final PresenterSelector getPresenterSelector() {
162cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu        return mPresenterSelector;
163cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    }
164cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu
165cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    /**
16655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout     * Sets the adapter for the fragment.
16755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout     */
168cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    public final void setAdapter(ObjectAdapter rowsAdapter) {
16955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        mAdapter = rowsAdapter;
17055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        updateAdapter();
17155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
17255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
17355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    /**
17455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout     * Returns the list of rows.
17555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout     */
17655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    public final ObjectAdapter getAdapter() {
17755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        return mAdapter;
17855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
17955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
18055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    /**
18155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout     * Returns the bridge adapter.
18255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout     */
18342752c860a26deacca04ea9ebeb00ddb4d8ce2fcDake Gu    final ItemBridgeAdapter getBridgeAdapter() {
18455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        return mBridgeAdapter;
18555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
18655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
18755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    /**
1883f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Sets the selected row position with smooth animation.
18955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout     */
190025aa57d4fdd4e79289303c7dc54169311728f7bCraig Stout    public void setSelectedPosition(int position) {
1913f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu        setSelectedPosition(position, true);
1923f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    }
1933f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu
1943f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    /**
1950d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu     * Gets position of currently selected row.
1960d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu     * @return Position of currently selected row.
1970d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu     */
1982f1bd591e01fe93f605844d4a10cde7116315b7cDake Gu    public int getSelectedPosition() {
1990d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu        return mSelectedPosition;
2000d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu    }
2010d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu
2020d73d42df7cf4b325b8f49660e3326204915ce8fDake Gu    /**
2033f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     * Sets the selected row position.
2043f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu     */
2053f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu    public void setSelectedPosition(int position, boolean smooth) {
2060d841b3454f896da58deb506ca22730bfd04f34fDake Gu        if (mSelectedPosition == position) {
2070d841b3454f896da58deb506ca22730bfd04f34fDake Gu            return;
2080d841b3454f896da58deb506ca22730bfd04f34fDake Gu        }
20955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        mSelectedPosition = position;
210a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn        if(mVerticalGridView != null && mVerticalGridView.getAdapter() != null) {
211bb0a680c10b84b83833a59634373140f8bd0750csusnata            if (mLateSelectionObserver.mIsLateSelection) {
212bb0a680c10b84b83833a59634373140f8bd0750csusnata                return;
213bb0a680c10b84b83833a59634373140f8bd0750csusnata            }
2143f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            if (smooth) {
2153f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                mVerticalGridView.setSelectedPositionSmooth(position);
2163f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            } else {
2173f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu                mVerticalGridView.setSelectedPosition(position);
2183f0f3eb255bde49549a77c0b5d252decaa2a0202Dake Gu            }
21955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        }
22055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
22155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
222a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn    final VerticalGridView getVerticalGridView() {
223a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn        return mVerticalGridView;
22455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
22555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
22642752c860a26deacca04ea9ebeb00ddb4d8ce2fcDake Gu    void updateAdapter() {
227e71207666a1a915e5a5bdf7503bd936f4d87b48bDake Gu        if (mBridgeAdapter != null) {
228e71207666a1a915e5a5bdf7503bd936f4d87b48bDake Gu            // detach observer from ObjectAdapter
229bb0a680c10b84b83833a59634373140f8bd0750csusnata            mLateSelectionObserver.clear();
230e71207666a1a915e5a5bdf7503bd936f4d87b48bDake Gu            mBridgeAdapter.clear();
231e71207666a1a915e5a5bdf7503bd936f4d87b48bDake Gu            mBridgeAdapter = null;
232e71207666a1a915e5a5bdf7503bd936f4d87b48bDake Gu        }
23355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
23455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        if (mAdapter != null) {
23555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout            // If presenter selector is null, adapter ps will be used
23655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout            mBridgeAdapter = new ItemBridgeAdapter(mAdapter, mPresenterSelector);
23755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        }
238a8a3b898da49324e83ea32c3f08776a481312166Tim Kilbourn        if (mVerticalGridView != null) {
239bb0a680c10b84b83833a59634373140f8bd0750csusnata            setAdapterAndSelection();
24055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        }
24155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
24255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
24342752c860a26deacca04ea9ebeb00ddb4d8ce2fcDake Gu    Object getItem(Row row, int position) {
24455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        if (row instanceof ListRow) {
24555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout            return ((ListRow) row).getAdapter().get(position);
24655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        } else {
24755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout            return null;
24855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        }
24955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
2502f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu
2512f5ebf3f6f7bb6a24856f389e369b247118ba119susnata    public boolean onTransitionPrepare() {
2522f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu        if (mVerticalGridView != null) {
2532f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu            mVerticalGridView.setAnimateChildLayout(false);
254902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu            mVerticalGridView.setScrollEnabled(false);
255902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu            return true;
2562f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu        }
257902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu        mPendingTransitionPrepare = true;
258902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu        return false;
259902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu    }
260902e68c114f86e8002516ff3f0248b722b6c5711Dake Gu
2612f5ebf3f6f7bb6a24856f389e369b247118ba119susnata    public void onTransitionStart() {
2624a4e0872bdf0548188e81740eb62085215e7f976Dake Gu        if (mVerticalGridView != null) {
2634a4e0872bdf0548188e81740eb62085215e7f976Dake Gu            mVerticalGridView.setPruneChild(false);
2644a4e0872bdf0548188e81740eb62085215e7f976Dake Gu            mVerticalGridView.setLayoutFrozen(true);
2654a4e0872bdf0548188e81740eb62085215e7f976Dake Gu            mVerticalGridView.setFocusSearchDisabled(true);
2664a4e0872bdf0548188e81740eb62085215e7f976Dake Gu        }
2672f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    }
2682f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu
2692f5ebf3f6f7bb6a24856f389e369b247118ba119susnata    public void onTransitionEnd() {
2704a4e0872bdf0548188e81740eb62085215e7f976Dake Gu        // be careful that fragment might be destroyed before header transition ends.
2714a4e0872bdf0548188e81740eb62085215e7f976Dake Gu        if (mVerticalGridView != null) {
2724a4e0872bdf0548188e81740eb62085215e7f976Dake Gu            mVerticalGridView.setLayoutFrozen(false);
2734a4e0872bdf0548188e81740eb62085215e7f976Dake Gu            mVerticalGridView.setAnimateChildLayout(true);
2744a4e0872bdf0548188e81740eb62085215e7f976Dake Gu            mVerticalGridView.setPruneChild(true);
2754a4e0872bdf0548188e81740eb62085215e7f976Dake Gu            mVerticalGridView.setFocusSearchDisabled(false);
2764a4e0872bdf0548188e81740eb62085215e7f976Dake Gu            mVerticalGridView.setScrollEnabled(true);
2774a4e0872bdf0548188e81740eb62085215e7f976Dake Gu        }
2782f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    }
279e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu
2802f5ebf3f6f7bb6a24856f389e369b247118ba119susnata    public void setAlignment(int windowAlignOffsetTop) {
281e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu        if (mVerticalGridView != null) {
282e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu            // align the top edge of item
283e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu            mVerticalGridView.setItemAlignmentOffset(0);
284e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu            mVerticalGridView.setItemAlignmentOffsetPercent(
285e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu                    VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
286e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu
287e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu            // align to a fixed position from top
2882f5ebf3f6f7bb6a24856f389e369b247118ba119susnata            mVerticalGridView.setWindowAlignmentOffset(windowAlignOffsetTop);
289e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu            mVerticalGridView.setWindowAlignmentOffsetPercent(
290e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu                    VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED);
291e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu            mVerticalGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
292e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu        }
293e43e9266c4b7e4902fefb5d2a0cacca90a3d2681Dake Gu    }
29455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout}
295