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