1255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu/*
2255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu * Copyright (C) 2015 The Android Open Source Project
3255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu *
4255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu * in compliance with the License. You may obtain a copy of the License at
6255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu *
7255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu * http://www.apache.org/licenses/LICENSE-2.0
8255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu *
9255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu * Unless required by applicable law or agreed to in writing, software distributed under the License
10255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu * or implied. See the License for the specific language governing permissions and limitations under
12255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu * the License.
13255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu */
14ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.leanback.app;
15255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.leanback.app.BrowseSupportFragmentTestActivity.EXTRA_HEADERS_STATE;
17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.leanback.app.BrowseSupportFragmentTestActivity.EXTRA_LOAD_DATA_DELAY;
18ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.leanback.app.BrowseSupportFragmentTestActivity.EXTRA_NUM_ROWS;
19ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.leanback.app.BrowseSupportFragmentTestActivity.EXTRA_REPEAT_PER_ROW;
208619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikasimport static androidx.leanback.app.BrowseSupportFragmentTestActivity
218619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikas        .EXTRA_SET_ADAPTER_AFTER_DATA_LOAD;
228619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikasimport static androidx.leanback.app.BrowseSupportFragmentTestActivity
238619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikas        .EXTRA_TEST_ENTRANCE_TRANSITION;
243103f63e99d47573823957f7aa34308555873221Aurimas Liutikas
25255e7911fa9ef664618b74bb9959e00479a9bec1Dake Guimport android.os.Bundle;
26255e7911fa9ef664618b74bb9959e00479a9bec1Dake Guimport android.os.Handler;
278619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikasimport android.util.Log;
288619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikasimport android.view.View;
298619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikas
30ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ArrayObjectAdapter;
31ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.HeaderItem;
32ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ListRow;
33ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.ListRowPresenter;
34ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.OnItemViewClickedListener;
35ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.OnItemViewSelectedListener;
36ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.Presenter;
37ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.Row;
38ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.RowPresenter;
39ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.leanback.widget.VerticalGridView;
40255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
41255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gupublic class BrowseTestSupportFragment extends BrowseSupportFragment {
42255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    private static final String TAG = "BrowseTestSupportFragment";
43255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
44255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    final static int DEFAULT_NUM_ROWS = 100;
45255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    final static int DEFAULT_REPEAT_PER_ROW = 20;
46255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    final static long DEFAULT_LOAD_DATA_DELAY = 2000;
47255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    final static boolean DEFAULT_TEST_ENTRANCE_TRANSITION = true;
4835d7a6c31606ed4ca38deda3cacae080a95c95c9susnata    final static boolean DEFAULT_SET_ADAPTER_AFTER_DATA_LOAD = false;
49255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
50255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    private ArrayObjectAdapter mRowsAdapter;
51255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
52255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    // For good performance, it's important to use a single instance of
53255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    // a card presenter for all rows using that presenter.
54255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    final static StringPresenter sCardPresenter = new StringPresenter();
55255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
56804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu    int NUM_ROWS;
57804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu    int REPEAT_PER_ROW;
584ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu    boolean mEntranceTransitionStarted;
594ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu    boolean mEntranceTransitionEnded;
60804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu
61255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    @Override
62255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    public void onCreate(Bundle savedInstanceState) {
63255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        Log.i(TAG, "onCreate");
64255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        super.onCreate(savedInstanceState);
65255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
66804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu        Bundle arguments = getArguments();
67804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu        NUM_ROWS = arguments.getInt(EXTRA_NUM_ROWS, BrowseTestSupportFragment.DEFAULT_NUM_ROWS);
68804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu        REPEAT_PER_ROW = arguments.getInt(EXTRA_REPEAT_PER_ROW,
69804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu                DEFAULT_REPEAT_PER_ROW);
70804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu        long LOAD_DATA_DELAY = arguments.getLong(EXTRA_LOAD_DATA_DELAY,
71804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu                DEFAULT_LOAD_DATA_DELAY);
72804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu        boolean TEST_ENTRANCE_TRANSITION = arguments.getBoolean(
73804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu                EXTRA_TEST_ENTRANCE_TRANSITION,
74804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu                DEFAULT_TEST_ENTRANCE_TRANSITION);
75804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu        final boolean SET_ADAPTER_AFTER_DATA_LOAD = arguments.getBoolean(
76804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu                EXTRA_SET_ADAPTER_AFTER_DATA_LOAD,
77804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu                DEFAULT_SET_ADAPTER_AFTER_DATA_LOAD);
78804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu
7935d7a6c31606ed4ca38deda3cacae080a95c95c9susnata        if (!SET_ADAPTER_AFTER_DATA_LOAD) {
8035d7a6c31606ed4ca38deda3cacae080a95c95c9susnata            setupRows();
8135d7a6c31606ed4ca38deda3cacae080a95c95c9susnata        }
8235d7a6c31606ed4ca38deda3cacae080a95c95c9susnata
83255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        setTitle("BrowseTestSupportFragment");
84f89c67eeac3938f245c858774cc7c9f87fb7487dDake Gu        setHeadersState(arguments.getInt(EXTRA_HEADERS_STATE, HEADERS_ENABLED));
85255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
86255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        setOnSearchClickedListener(new View.OnClickListener() {
87255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            @Override
88255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            public void onClick(View view) {
89255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu                Log.i(TAG, "onSearchClicked");
90255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            }
91255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        });
92255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
93255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        setOnItemViewClickedListener(new ItemViewClickedListener());
94255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
95255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            @Override
96255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
97255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu                    RowPresenter.ViewHolder rowViewHolder, Row row) {
988da2c8555e4a9b8689f9f973089f3010ec44ed6cDake Gu                Log.i(TAG, "onItemSelected: " + item + " row " + row);
99255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            }
100255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        });
101255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        if (TEST_ENTRANCE_TRANSITION) {
102255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            // don't run entrance transition if fragment is restored.
103255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            if (savedInstanceState == null) {
104255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu                prepareEntranceTransition();
105255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            }
106255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        }
107255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        // simulates in a real world use case  data being loaded two seconds later
108255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        new Handler().postDelayed(new Runnable() {
109255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            @Override
110255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            public void run() {
111804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu                if (getActivity() == null || getActivity().isDestroyed()) {
112804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu                    return;
113804ebd45e0287b6f421373fb6bd2a453a3acfda0Dake Gu                }
11435d7a6c31606ed4ca38deda3cacae080a95c95c9susnata                if (SET_ADAPTER_AFTER_DATA_LOAD) {
11535d7a6c31606ed4ca38deda3cacae080a95c95c9susnata                    setupRows();
11635d7a6c31606ed4ca38deda3cacae080a95c95c9susnata                }
117255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu                loadData();
118255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu                startEntranceTransition();
119255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            }
120255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        }, LOAD_DATA_DELAY);
121255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    }
122255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
123255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    private void setupRows() {
124255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        ListRowPresenter lrp = new ListRowPresenter();
125255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
126255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        mRowsAdapter = new ArrayObjectAdapter(lrp);
127255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
128255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        setAdapter(mRowsAdapter);
129255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    }
130255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
1314ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu    @Override
1324ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu    protected void onEntranceTransitionStart() {
1334ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu        super.onEntranceTransitionStart();
1344ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu        mEntranceTransitionStarted = true;
1354ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu    }
1364ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu
1374ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu    @Override
1384ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu    protected void onEntranceTransitionEnd() {
1394ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu        super.onEntranceTransitionEnd();
1404ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu        mEntranceTransitionEnded = true;
1414ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu    }
1424ccbc343ff7e498b8fe9418cc8bd371be0d7acc5Dake Gu
143255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    private void loadData() {
144255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        for (int i = 0; i < NUM_ROWS; ++i) {
145255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(sCardPresenter);
1463bd47bb01a2654f8399e89d227d40f99393b1844Dake Gu            int index = 0;
147255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            for (int j = 0; j < REPEAT_PER_ROW; ++j) {
1483bd47bb01a2654f8399e89d227d40f99393b1844Dake Gu                listRowAdapter.add("Hello world-" + (index++));
1493bd47bb01a2654f8399e89d227d40f99393b1844Dake Gu                listRowAdapter.add("This is a test-" + (index++));
1503bd47bb01a2654f8399e89d227d40f99393b1844Dake Gu                listRowAdapter.add("Android TV-" + (index++));
1513bd47bb01a2654f8399e89d227d40f99393b1844Dake Gu                listRowAdapter.add("Leanback-" + (index++));
1523bd47bb01a2654f8399e89d227d40f99393b1844Dake Gu                listRowAdapter.add("Hello world-" + (index++));
1533bd47bb01a2654f8399e89d227d40f99393b1844Dake Gu                listRowAdapter.add("Android TV-" + (index++));
1543bd47bb01a2654f8399e89d227d40f99393b1844Dake Gu                listRowAdapter.add("Leanback-" + (index++));
1553bd47bb01a2654f8399e89d227d40f99393b1844Dake Gu                listRowAdapter.add("GuidedStepSupportFragment-" + (index++));
156255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            }
157255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            HeaderItem header = new HeaderItem(i, "Row " + i);
158255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            mRowsAdapter.add(new ListRow(header, listRowAdapter));
159255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        }
160255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    }
161255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu
162255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    private final class ItemViewClickedListener implements OnItemViewClickedListener {
163255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        @Override
164255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
165255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu                RowPresenter.ViewHolder rowViewHolder, Row row) {
166255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu            Log.i(TAG, "onItemClicked: " + item + " row " + row);
167255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu        }
168255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu    }
169d447d1a3819bd66e2ab8c93c6947e982feb11bf7susnata
170d447d1a3819bd66e2ab8c93c6947e982feb11bf7susnata    public VerticalGridView getGridView() {
171d447d1a3819bd66e2ab8c93c6947e982feb11bf7susnata        return getRowsSupportFragment().getVerticalGridView();
172d447d1a3819bd66e2ab8c93c6947e982feb11bf7susnata    }
173255e7911fa9ef664618b74bb9959e00479a9bec1Dake Gu}
174