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