SearchSupportFragment.java revision 57ac90cf3fc528ac56b6b83718541624173b1368
1// CHECKSTYLE:OFF Generated code
2/* This file is auto-generated from SearchFragment.java.  DO NOT MODIFY. */
3
4package com.example.android.leanback;
5
6import android.content.Context;
7import android.content.Intent;
8import android.os.Bundle;
9import android.os.Handler;
10import android.support.v17.leanback.widget.ArrayObjectAdapter;
11import android.support.v17.leanback.widget.DiffCallback;
12import android.support.v17.leanback.widget.HeaderItem;
13import android.support.v17.leanback.widget.ImageCardView;
14import android.support.v17.leanback.widget.ListRow;
15import android.support.v17.leanback.widget.ListRowPresenter;
16import android.support.v17.leanback.widget.ObjectAdapter;
17import android.support.v17.leanback.widget.OnItemViewClickedListener;
18import android.support.v17.leanback.widget.Presenter;
19import android.support.v17.leanback.widget.Row;
20import android.support.v17.leanback.widget.RowPresenter;
21import android.support.v4.app.ActivityOptionsCompat;
22import android.support.v4.content.res.ResourcesCompat;
23import android.text.TextUtils;
24import android.util.Log;
25
26import java.util.ArrayList;
27
28public class SearchSupportFragment extends android.support.v17.leanback.app.SearchSupportFragment
29        implements android.support.v17.leanback.app.SearchSupportFragment.SearchResultProvider {
30    private static final String TAG = "leanback.SearchSupportFragment";
31    private static final int NUM_ROWS = 3;
32    private static final int SEARCH_DELAY_MS = 1000;
33
34    private ArrayObjectAdapter mRowsAdapter;
35    private Handler mHandler = new Handler();
36    private String mQuery;
37
38    // Flag to represent if data set one is presented in the fragment
39    private boolean mIsDataSetOnePresented;
40
41    // Adapter for first row
42    private ArrayObjectAdapter mFirstRowAdapter;
43
44    // The diff callback which defines the standard to judge if two items are the same or if
45    // two items have the same content.
46    private DiffCallback<PhotoItem> mDiffCallback = new DiffCallback<PhotoItem>() {
47
48        // when two photo items have the same id, they are the same from adapter's
49        // perspective
50        @Override
51        public boolean areItemsTheSame(PhotoItem oldItem, PhotoItem newItem) {
52            return oldItem.getId() == newItem.getId();
53        }
54
55        // when two photo items is equal to each other (based on the equal method defined in
56        // PhotoItem), they have the same content.
57        @Override
58        public boolean areContentsTheSame(PhotoItem oldItem, PhotoItem newItem) {
59            return oldItem.equals(newItem);
60        }
61    };
62
63    @Override
64    public void onCreate(Bundle savedInstanceState) {
65        super.onCreate(savedInstanceState);
66
67        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
68
69        final Context context = getActivity();
70        setBadgeDrawable(ResourcesCompat.getDrawable(context.getResources(),
71                R.drawable.ic_title, context.getTheme()));
72        setTitle("Leanback Sample App");
73        setSearchResultProvider(this);
74        setOnItemViewClickedListener(new ItemViewClickedListener());
75    }
76
77    @Override
78    public ObjectAdapter getResultsAdapter() {
79        return mRowsAdapter;
80    }
81
82    @Override
83    public boolean onQueryTextChange(String newQuery) {
84        Log.i(TAG, String.format("Search Query Text Change %s", newQuery));
85        mRowsAdapter.clear();
86        loadQuery(newQuery);
87        return true;
88    }
89
90    @Override
91    public boolean onQueryTextSubmit(String query) {
92        Log.i(TAG, String.format("Search Query Text Submit %s", query));
93        mRowsAdapter.clear();
94        loadQuery(query);
95        return true;
96    }
97
98    private void loadQuery(String query) {
99        mQuery = query;
100        mHandler.removeCallbacks(mDelayedLoad);
101        if (!TextUtils.isEmpty(query) && !query.equals("nil")) {
102            mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
103        }
104    }
105
106    private void loadRows() {
107        HeaderItem header = new HeaderItem(0, mQuery + " results row " + 0);
108
109        // Every time when the query event is fired, we will update the fake search result in the
110        // first row based on the flag mIsDataSetOnePresented flag.
111        // Also the first row adapter will only be created once so the animation will be triggered
112        // when the items in the adapter changed.
113        if (!mIsDataSetOnePresented) {
114            if (mFirstRowAdapter == null) {
115                mFirstRowAdapter = createFirstListRowAdapter();
116            } else {
117                mFirstRowAdapter.setItems(createDataSetOne(), mDiffCallback);
118            }
119            mIsDataSetOnePresented = true;
120        } else {
121            mFirstRowAdapter.setItems(createDataSetTwo(), mDiffCallback);
122            mIsDataSetOnePresented = false;
123        }
124        mRowsAdapter.add(new ListRow(header, mFirstRowAdapter));
125        for (int i = 1; i < NUM_ROWS + 1; ++i) {
126            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
127            listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
128            listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
129            header = new HeaderItem(i, mQuery + " results row " + i);
130            mRowsAdapter.add(new ListRow(header, listRowAdapter));
131        }
132    }
133
134    private Runnable mDelayedLoad = new Runnable() {
135        @Override
136        public void run() {
137            loadRows();
138        }
139    };
140
141    private final class ItemViewClickedListener implements OnItemViewClickedListener {
142        @Override
143        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
144                RowPresenter.ViewHolder rowViewHolder, Row row) {
145            Intent intent = new Intent(getActivity(), DetailsSupportActivity.class);
146            intent.putExtra(DetailsSupportActivity.EXTRA_ITEM, (PhotoItem) item);
147
148            Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
149                    getActivity(),
150                    ((ImageCardView) itemViewHolder.view).getMainImageView(),
151                    DetailsSupportActivity.SHARED_ELEMENT_NAME).toBundle();
152            getActivity().startActivity(intent, bundle);
153        }
154    }
155
156
157    private ArrayObjectAdapter createFirstListRowAdapter() {
158        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
159        listRowAdapter.setItems(createDataSetOne(), mDiffCallback);
160        mIsDataSetOnePresented = true;
161        return listRowAdapter;
162    }
163
164    /**
165     * Create a data set (data set one) for the last row of this browse fragment. It will be
166     * changed by another set of data when user click one of the photo items in the list.
167     * Different with other rows in the browsing fragment, the photo item in last row all have been
168     * allocated with a unique id. And the id will be used to jduge if two photo items are the same
169     * or not.
170     *
171     * @return List of photoItem
172     */
173    private ArrayList<PhotoItem> createDataSetOne() {
174        ArrayList<PhotoItem> photoItems = new ArrayList<>();
175        photoItems.add(new PhotoItem(
176                "Hello world",
177                R.drawable.gallery_photo_1,
178                1));
179        photoItems.add(new PhotoItem(
180                "This is a test",
181                "Only a test",
182                R.drawable.gallery_photo_2,
183                2));
184        photoItems.add(new PhotoItem(
185                "Android TV",
186                "by Google",
187                R.drawable.gallery_photo_3,
188                3));
189        photoItems.add(new PhotoItem(
190                "Leanback",
191                R.drawable.gallery_photo_4,
192                4));
193        photoItems.add(new PhotoItem(
194                "GuidedStep (Slide left/right)",
195                R.drawable.gallery_photo_5,
196                5));
197        photoItems.add(new PhotoItem(
198                "GuidedStep (Slide bottom up)",
199                "Open GuidedStepFragment",
200                R.drawable.gallery_photo_6,
201                6));
202        photoItems.add(new PhotoItem(
203                "Android TV",
204                "open RowsActivity",
205                R.drawable.gallery_photo_7,
206                7));
207        photoItems.add(new PhotoItem(
208                "Leanback",
209                "open BrowseActivity",
210                R.drawable.gallery_photo_8,
211                8));
212        photoItems.add(new PhotoItem(
213                "Hello world",
214                R.drawable.gallery_photo_1,
215                1));
216        photoItems.add(new PhotoItem(
217                "This is a test",
218                "Only a test",
219                R.drawable.gallery_photo_2,
220                2));
221        photoItems.add(new PhotoItem(
222                "Android TV",
223                "by Google",
224                R.drawable.gallery_photo_3,
225                3));
226        photoItems.add(new PhotoItem(
227                "Leanback",
228                R.drawable.gallery_photo_4,
229                4));
230        return photoItems;
231    }
232
233    /**
234     * Create a new data set (data set one) for the last row of this browse fragment. It will be
235     * changed by another set of data when user click one of the photo items in the list.
236     * Different with other rows in the browsing fragment, the photo item in last row all have been
237     * allocated with a unique id. And the id will be used to jduge if two photo items are the same
238     * or not.
239     *
240     * @return List of photoItem
241     */
242    private ArrayList<PhotoItem> createDataSetTwo() {
243        ArrayList<PhotoItem> photoItems = new ArrayList<>();
244        photoItems.add(new PhotoItem(
245                "This is a test",
246                "Only a test",
247                R.drawable.gallery_photo_2,
248                2));
249        photoItems.add(new PhotoItem(
250                "Hello world",
251                R.drawable.gallery_photo_1,
252                1));
253        photoItems.add(new PhotoItem(
254                "Leanback",
255                R.drawable.gallery_photo_4,
256                4));
257        photoItems.add(new PhotoItem(
258                "Android TV",
259                "by Google",
260                R.drawable.gallery_photo_3,
261                3));
262        photoItems.add(new PhotoItem(
263                "change title",
264                R.drawable.gallery_photo_5,
265                5));
266        photoItems.add(new PhotoItem(
267                "GuidedStep (Slide bottom up)",
268                "change comment",
269                R.drawable.gallery_photo_6,
270                6));
271        photoItems.add(new PhotoItem(
272                "Android TV",
273                R.drawable.gallery_photo_7,
274                7));
275        photoItems.add(new PhotoItem(
276                "Leanback",
277                "open BrowseActivity",
278                R.drawable.gallery_photo_7,
279                8));
280        photoItems.add(new PhotoItem(
281                "Hello world",
282                R.drawable.gallery_photo_1,
283                10));
284        photoItems.add(new PhotoItem(
285                "This is a test",
286                "Only a test",
287                R.drawable.gallery_photo_2,
288                20));
289        photoItems.add(new PhotoItem(
290                "Android TV",
291                "by Google",
292                R.drawable.gallery_photo_3,
293                30));
294        photoItems.add(new PhotoItem(
295                "Leanback",
296                R.drawable.gallery_photo_4,
297                40));
298        return photoItems;
299    }
300
301}
302