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