1faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/*
2faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Copyright (C) 2013 The Android Open Source Project
3faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase *
4faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Licensed under the Apache License, Version 2.0 (the "License");
5faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * you may not use this file except in compliance with the License.
6faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * You may obtain a copy of the License at
7faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase *
8faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase *      http://www.apache.org/licenses/LICENSE-2.0
9faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase *
10faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Unless required by applicable law or agreed to in writing, software
11faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * distributed under the License is distributed on an "AS IS" BASIS,
12faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * See the License for the specific language governing permissions and
14faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * limitations under the License.
15faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */
16faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haasepackage com.android.transitiontests;
17faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
18faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.app.Activity;
19faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.content.Context;
20faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.os.Bundle;
21faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.View;
22faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.ViewTreeObserver;
23d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.Fade;
24d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.Scene;
25faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.widget.AdapterView;
26faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.widget.ArrayAdapter;
27faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.widget.LinearLayout;
28faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.widget.ListView;
29faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.widget.TextView;
30d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.AutoTransition;
31d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.ChangeBounds;
32d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.Transition;
33d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.TransitionSet;
34d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haaseimport android.transition.TransitionManager;
35faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
36faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport java.util.ArrayList;
37faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport java.util.HashMap;
38faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport java.util.List;
39faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
40faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haasepublic class ListViewAddRemove extends Activity {
41faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
42faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    final ArrayList<String> numList = new ArrayList<String>();
43faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
44faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
45faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    public void onCreate(Bundle savedInstanceState) {
46faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        super.onCreate(savedInstanceState);
47faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        setContentView(R.layout.list_view_add_remove);
48faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
49faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        final LinearLayout container = (LinearLayout) findViewById(R.id.container);
50faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
51faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        final ListView listview = (ListView) findViewById(R.id.listview);
52faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        for (int i = 0; i < 200; ++i) {
53faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            numList.add(Integer.toString(i));
54faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
55faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        final StableArrayAdapter adapter = new StableArrayAdapter(this,
56faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                android.R.layout.simple_list_item_1, numList);
57faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        listview.setAdapter(adapter);
58faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
59faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        final ViewTreeObserver observer = container.getViewTreeObserver();
60faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
61faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            public void onGlobalLayout() {
62faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                System.out.println("-------------------------------------");
63faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                System.out.println("onLayoutListener: listview view tops: ");
64faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                for (int i = 0; i < listview.getChildCount(); ++i) {
65faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    TextView view = (TextView) listview.getChildAt(i);
66faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    System.out.println("    " + view.getText() + ": " + view.getTop());
67faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                }
68faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
69faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        });
70faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
71faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        final Scene mySceneChanger = new Scene(listview);
72faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
73faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        mySceneChanger.setEnterAction(new Runnable() {
74faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            @Override
75faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            public void run() {
76faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                numList.remove(mItemToDelete);
77faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                adapter.notifyDataSetChanged();
78faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
79faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        });
80faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        final Transition myTransition = new AutoTransition();
81d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        final TransitionSet noFadeIn = new TransitionSet().
82d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                setOrdering(TransitionSet.ORDERING_SEQUENTIAL);
83faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        Fade fadeIn = new Fade(Fade.IN);
84faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        fadeIn.setDuration(50);
85d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        noFadeIn.addTransition(new Fade(Fade.OUT)).addTransition(new ChangeBounds()).addTransition(fadeIn);
86faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
87faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        myTransition.addListener(new Transition.TransitionListenerAdapter() {
88faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            @Override
89faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            public void onTransitionStart(Transition transition) {
90faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                System.out.println("---------ListView Tops: Before--------");
91faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                for (int i = 0; i < listview.getChildCount(); ++i) {
92faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    TextView view = (TextView) listview.getChildAt(i);
93faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    int position = listview.getPositionForView(view);
94faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                }
95faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
96faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
97faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            @Override
98faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            public void onTransitionEnd(Transition transition) {
99faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                System.out.println("---------ListView Tops: After--------");
100faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                for (int i = 0; i < listview.getChildCount(); ++i) {
101faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    TextView view = (TextView) listview.getChildAt(i);
102faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    int position = listview.getPositionForView(view);
103faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    if (view.hasTransientState()) {
104faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase//                        view.setHasTransientState(false);
105faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    }
106faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                }
107faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                myTransition.removeListener(this);
108faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
109faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        });
110faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
111faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
112faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
113faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            @Override
114faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
115faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                System.out.println("---------ListView Tops: OnClick--------");
116faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                String item = (String) parent.getItemAtPosition(position);
117faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                for (int i = 0; i < listview.getChildCount(); ++i) {
118faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    TextView v = (TextView) listview.getChildAt(i);
119faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    if (!item.equals(v.getText())) {
120faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase//                        v.setHasTransientState(true);
121faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    }
122faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                }
123faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase//                listview.setHasTransientState(true);
124faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                mItemToDelete = item;
125faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase//                numList.remove(item);
126faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                TransitionManager.go(mySceneChanger, noFadeIn);
127faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase//                view.postDelayed(new Runnable() {
128faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase//                    @Override
129faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase//                    public void run() {
130faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase//                        for (int i = 0; i < listview.getChildCount(); ++i) {
131faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase//                            TextView v = (TextView) listview.getChildAt(i);
132faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase//                            v.setHasTransientState(false);
133faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase//                        }
134faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase//                    }
135faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase//                }, 200);
136faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
137faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
138faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        });
139faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
140faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
141faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    String mItemToDelete = null;
142faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
143faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private class StableArrayAdapter extends ArrayAdapter<String> {
144faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
145faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();
146faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
147faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        public StableArrayAdapter(Context context, int textViewResourceId,
148faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                List<String> objects) {
149faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            super(context, textViewResourceId, objects);
150faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            for (int i = 0; i < objects.size(); ++i) {
151faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                mIdMap.put(objects.get(i), i);
152faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
153faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
154faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
155faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        @Override
156faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        public long getItemId(int position) {
157faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            String item = getItem(position);
158faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            return mIdMap.get(item);
159faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
160faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
161faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        @Override
162faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        public boolean hasStableIds() {
163faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            return true;
164faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
165faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
166faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
167faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase}
168