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 package com.example.android.leanback; 15 16 import android.content.Intent; 17 import android.os.Bundle; 18 import android.support.v17.leanback.widget.ArrayObjectAdapter; 19 import android.support.v17.leanback.widget.HeaderItem; 20 import android.support.v17.leanback.widget.ListRow; 21 import android.support.v17.leanback.widget.ListRowPresenter; 22 import android.support.v17.leanback.widget.OnItemClickedListener; 23 import android.support.v17.leanback.widget.Row; 24 import android.util.Log; 25 import android.view.View; 26 import android.os.Handler; 27 28 import java.util.Random; 29 30 public class BrowseAnimationFragment extends 31 android.support.v17.leanback.app.BrowseFragment { 32 private static final String TAG = "leanback.BrowseAnimationFragment"; 33 34 private static final int NUM_ROWS = 10; 35 private ArrayObjectAdapter mRowsAdapter; 36 private static Random sRand = new Random(); 37 38 static class Item { 39 final String mText; 40 final OnItemClickedListener mAction; 41 42 Item(String text, OnItemClickedListener action) { 43 mText = text; 44 mAction = action; 45 } 46 47 @Override 48 public String toString() { 49 return mText; 50 } 51 } 52 53 @Override 54 public void onCreate(Bundle savedInstanceState) { 55 Log.i(TAG, "onCreate"); 56 super.onCreate(savedInstanceState); 57 58 setBadgeDrawable( 59 getActivity().getResources().getDrawable(R.drawable.ic_title)); 60 setTitle("Leanback Sample App"); 61 setHeadersState(HEADERS_ENABLED); 62 63 setOnSearchClickedListener(new View.OnClickListener() { 64 @Override 65 public void onClick(View view) { 66 Intent intent = new Intent(getActivity(), SearchActivity.class); 67 startActivity(intent); 68 } 69 }); 70 71 setupRows(); 72 setOnItemClickedListener(new ItemClickedListener()); 73 } 74 75 private void setupRows() { 76 ListRowPresenter lrp = new ListRowPresenter(); 77 mRowsAdapter = new ArrayObjectAdapter(lrp); 78 for (int i = 0; i < NUM_ROWS; ++i) { 79 mRowsAdapter.add( 80 createRandomRow(new HeaderItem(i, "Row " + i))); 81 } 82 setAdapter(mRowsAdapter); 83 } 84 85 Item createRandomItem() { 86 switch (sRand.nextInt(15)) { 87 default: 88 case 0: 89 return new Item("Remove Item before", new OnItemClickedListener() { 90 @Override 91 public void onItemClicked(Object item, Row row) { 92 ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row) 93 .getAdapter()); 94 int index = adapter.indexOf(item); 95 if (index >= 0) { 96 if (index > 0) 97 index--; 98 adapter.removeItems(index, 1); 99 } 100 } 101 }); 102 case 1: 103 return new Item("Remove Item after", new OnItemClickedListener() { 104 @Override 105 public void onItemClicked(Object item, Row row) { 106 ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row) 107 .getAdapter()); 108 int index = adapter.indexOf(item); 109 if (index >= 0) { 110 if (index < adapter.size() - 1) 111 index++; 112 adapter.removeItems(index, 1); 113 } 114 } 115 }); 116 case 2: 117 return new Item("Remove Item", new OnItemClickedListener() { 118 @Override 119 public void onItemClicked(Object item, Row row) { 120 ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row) 121 .getAdapter()); 122 int index = adapter.indexOf(item); 123 if (index >= 0) { 124 adapter.removeItems(index, 1); 125 } 126 } 127 }); 128 case 3: 129 return new Item("Remove all Items", new OnItemClickedListener() { 130 @Override 131 public void onItemClicked(Object item, Row row) { 132 ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row) 133 .getAdapter()); 134 adapter.clear(); 135 } 136 }); 137 case 4: 138 return new Item("add item before", new OnItemClickedListener() { 139 @Override 140 public void onItemClicked(Object item, Row row) { 141 ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row) 142 .getAdapter()); 143 int index = adapter.indexOf(item); 144 if (index >= 0) { 145 adapter.add(index, createRandomItem()); 146 } 147 } 148 }); 149 case 5: 150 return new Item("add item after", new OnItemClickedListener() { 151 @Override 152 public void onItemClicked(Object item, Row row) { 153 ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row) 154 .getAdapter()); 155 int index = adapter.indexOf(item); 156 if (index >= 0) { 157 adapter.add(index + 1, createRandomItem()); 158 } 159 } 160 }); 161 case 6: 162 return new Item("add random items before", 163 new OnItemClickedListener() { 164 @Override 165 public void onItemClicked(Object item, Row row) { 166 ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row) 167 .getAdapter()); 168 int index = adapter.indexOf(item); 169 if (index >= 0) { 170 int count = sRand.nextInt(4) + 1; 171 for (int i = 0; i < count; i++) { 172 adapter.add(index + i, createRandomItem()); 173 } 174 } 175 } 176 }); 177 case 7: 178 return new Item("add random items after", 179 new OnItemClickedListener() { 180 @Override 181 public void onItemClicked(Object item, Row row) { 182 ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row) 183 .getAdapter()); 184 int index = adapter.indexOf(item); 185 if (index >= 0) { 186 int count = sRand.nextInt(4) + 1; 187 for (int i = 0; i < count; i++) { 188 adapter.add(index + 1 + i, 189 createRandomItem()); 190 } 191 } 192 } 193 }); 194 case 8: 195 return new Item("add row before", new OnItemClickedListener() { 196 @Override 197 public void onItemClicked(Object item, Row row) { 198 int index = mRowsAdapter.indexOf(row); 199 if (index >= 0) { 200 int headerId = sRand.nextInt(); 201 mRowsAdapter.add(index, createRandomRow(new HeaderItem( 202 headerId, "Row " + headerId))); 203 } 204 } 205 }); 206 case 9: 207 return new Item("add row after", new OnItemClickedListener() { 208 @Override 209 public void onItemClicked(Object item, Row row) { 210 int index = mRowsAdapter.indexOf(row); 211 if (index >= 0) { 212 int headerId = sRand.nextInt(); 213 mRowsAdapter.add( 214 index + 1, createRandomRow(new HeaderItem( 215 headerId, "Row " + headerId))); 216 } 217 } 218 }); 219 case 10: 220 return new Item("delete row", new OnItemClickedListener() { 221 @Override 222 public void onItemClicked(Object item, Row row) { 223 mRowsAdapter.remove(row); 224 } 225 }); 226 case 11: 227 return new Item("delete row before", new OnItemClickedListener() { 228 @Override 229 public void onItemClicked(Object item, Row row) { 230 int index = mRowsAdapter.indexOf(row); 231 if (index > 0) { 232 mRowsAdapter.removeItems(index - 1, 1); 233 } 234 } 235 }); 236 case 12: 237 return new Item("delete row after", new OnItemClickedListener() { 238 @Override 239 public void onItemClicked(Object item, Row row) { 240 int index = mRowsAdapter.indexOf(row); 241 if (index < mRowsAdapter.size() - 1) { 242 mRowsAdapter.removeItems(index + 1, 1); 243 } 244 } 245 }); 246 case 13: 247 return new Item("Replace Item before", new OnItemClickedListener() { 248 @Override 249 public void onItemClicked(Object item, Row row) { 250 ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row) 251 .getAdapter()); 252 int index = adapter.indexOf(item); 253 if (index >= 0) { 254 if (index > 0) 255 index--; 256 adapter.replace(index, createRandomItem()); 257 } 258 } 259 }); 260 case 14: 261 return new Item("Remove all then re-add", new OnItemClickedListener() { 262 @Override 263 public void onItemClicked(Object item, Row row) { 264 final ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row) 265 .getAdapter()); 266 adapter.clear(); 267 new Handler().postDelayed(new Runnable() { 268 @Override 269 public void run() { 270 adapter.add(0, createRandomItem()); 271 } 272 }, 1000); 273 } 274 }); 275 } 276 } 277 278 ListRow createRandomRow(HeaderItem header) { 279 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter( 280 new StringPresenter()); 281 for (int i = 0; i < 8; i++) { 282 listRowAdapter.add(createRandomItem()); 283 } 284 return new ListRow(header, listRowAdapter); 285 } 286 287 private final class ItemClickedListener implements OnItemClickedListener { 288 @Override 289 public void onItemClicked(Object item, Row row) { 290 ((Item) item).mAction.onItemClicked(item, row); 291 } 292 } 293 } 294