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