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