• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14 
15 package com.example.android.leanback;
16 
17 import java.util.HashMap;
18 import java.util.List;
19 import java.util.Locale;
20 import java.util.Map;
21 
22 import android.annotation.SuppressLint;
23 import android.content.Intent;
24 import android.os.Bundle;
25 import android.os.Handler;
26 import android.support.v17.leanback.widget.ArrayObjectAdapter;
27 import android.support.v17.leanback.widget.HeaderItem;
28 import android.support.v17.leanback.widget.ListRow;
29 import android.support.v17.leanback.widget.ListRowPresenter;
30 import android.support.v17.leanback.widget.ObjectAdapter;
31 import android.support.v17.leanback.widget.OnItemClickedListener;
32 import android.support.v17.leanback.widget.Row;
33 import android.text.TextUtils;
34 import android.util.Log;
35 
36 /*
37  * This class demonstrates how to do in-app search
38  */
39 @SuppressLint("DefaultLocale")
40 public class SearchFragment extends android.support.v17.leanback.app.SearchFragment
41         implements android.support.v17.leanback.app.SearchFragment.SearchResultProvider {
42     private static final String TAG = "SearchFragment";
43     private static final int SEARCH_DELAY_MS = 300;
44 
45     private ArrayObjectAdapter mRowsAdapter;
46     private Handler mHandler = new Handler();
47     private SearchRunnable mDelayedLoad;
48 
49     @Override
onCreate(Bundle savedInstanceState)50     public void onCreate(Bundle savedInstanceState) {
51         super.onCreate(savedInstanceState);
52 
53         mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
54         setSearchResultProvider(this);
55         setOnItemClickedListener(getDefaultItemClickedListener());
56         mDelayedLoad = new SearchRunnable();
57     }
58 
59     @Override
getResultsAdapter()60     public ObjectAdapter getResultsAdapter() {
61         return mRowsAdapter;
62     }
63 
queryByWords(String words)64     private void queryByWords(String words) {
65         mRowsAdapter.clear();
66         if (!TextUtils.isEmpty(words)) {
67             mDelayedLoad.setSearchQuery(words);
68             mHandler.removeCallbacks(mDelayedLoad);
69             mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
70         }
71     }
72 
73     @Override
onQueryTextChange(String newQuery)74     public boolean onQueryTextChange(String newQuery) {
75         Log.i(TAG, String.format("Search Query Text Change %s", newQuery));
76         queryByWords(newQuery);
77         return true;
78     }
79 
80     @Override
onQueryTextSubmit(String query)81     public boolean onQueryTextSubmit(String query) {
82         Log.i(TAG, String.format("Search Query Text Submit %s", query));
83         queryByWords(query);
84         return true;
85     }
86 
loadRows(String query)87     private void loadRows(String query) {
88         HashMap<String, List<Movie>> movies = VideoProvider.getMovieList();
89         ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
90         for (Map.Entry<String, List<Movie>> entry : movies.entrySet())
91         {
92             for (int i = 0; i < entry.getValue().size(); i++) {
93                 Movie movie = entry.getValue().get(i);
94                 if (movie.getTitle().toLowerCase(Locale.ENGLISH)
95                         .indexOf(query.toLowerCase(Locale.ENGLISH)) >= 0
96                         || movie.getDescription().toLowerCase(Locale.ENGLISH)
97                                 .indexOf(query.toLowerCase(Locale.ENGLISH)) >= 0) {
98                     listRowAdapter.add(movie);
99                 }
100             }
101         }
102         HeaderItem header = new HeaderItem(0, getResources().getString(R.string.search_results),
103                 null);
104         mRowsAdapter.add(new ListRow(header, listRowAdapter));
105     }
106 
getDefaultItemClickedListener()107     protected OnItemClickedListener getDefaultItemClickedListener() {
108         return new OnItemClickedListener() {
109             @Override
110             public void onItemClicked(Object item, Row row) {
111                 if (item instanceof Movie) {
112                     Movie movie = (Movie) item;
113                     Intent intent = new Intent(getActivity(), DetailsActivity.class);
114                     intent.putExtra(getResources().getString(R.string.movie), movie);
115                     startActivity(intent);
116                 }
117             }
118         };
119     }
120 
121     private class SearchRunnable implements Runnable {
122 
123         private volatile String searchQuery;
124 
125         public SearchRunnable() {
126         }
127 
128         public void run() {
129             loadRows(searchQuery);
130         }
131 
132         public void setSearchQuery(String value) {
133             this.searchQuery = value;
134         }
135     }
136 }
137