1eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarpackage com.android.example.bindingdemo;
2eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
3fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.Bindable;
46a5e8f49ed279b7ff0fe8097010ba985bf5c5ed6George Mountimport android.databinding.DataBindingUtil;
5fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.Observable;
6af516f3f11ae36cb2c5e3dfcbaad7e3f2db174cdYigit Boyarimport android.databinding.Observable.OnPropertyChangedCallback;
7eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.support.v7.app.ActionBarActivity;
8eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.os.Bundle;
9eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.support.v7.widget.LinearLayoutManager;
10eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.support.v7.widget.RecyclerView;
11eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.view.Menu;
12eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.view.MenuItem;
13eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.view.View;
14eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport android.view.ViewGroup;
15eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
16fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.PropertyChangeRegistry;
172e2043d30f95585de2069e1cbb23e022ab0e71c4George Mountimport com.android.example.bindingdemo.databinding.ListItemBinding;
182e2043d30f95585de2069e1cbb23e022ab0e71c4George Mountimport com.android.example.bindingdemo.databinding.MainActivityBinding;
19eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport com.android.example.bindingdemo.vo.User;
20eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport com.android.example.bindingdemo.vo.Users;
21eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
22eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport java.util.ArrayList;
23eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport java.util.Arrays;
24eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarimport java.util.List;
25eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
26a6e4583962e19e8e93b4ca3f9fe3d34560b6d96cYigit Boyarimport  com.android.example.bindingdemo.BR;
27eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyarpublic class MainActivity extends ActionBarActivity implements Observable {
28b617e5da04aa910be70204afb886b1ebebb80618George Mount    @Bindable
29eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    UserAdapter tkAdapter;
30b617e5da04aa910be70204afb886b1ebebb80618George Mount    @Bindable
31eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    UserAdapter robotAdapter;
32b617e5da04aa910be70204afb886b1ebebb80618George Mount    @Bindable
334c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount    MainActivityBinding dataBinder;
34b617e5da04aa910be70204afb886b1ebebb80618George Mount    @Bindable
35eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    User selected;
36293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount
375cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount   private final PropertyChangeRegistry mListeners = new PropertyChangeRegistry();
38eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    @Override
39eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    protected void onCreate(Bundle savedInstanceState) {
40eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        super.onCreate(savedInstanceState);
416a5e8f49ed279b7ff0fe8097010ba985bf5c5ed6George Mount        dataBinder =  DataBindingUtil.setContentView(this, R.layout.main_activity);
4234a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount        dataBinder.robotList.setHasFixedSize(true);
4334a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount        dataBinder.toolkittyList.setHasFixedSize(true);
44eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        tkAdapter = new UserAdapter(Users.toolkities);
45eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        robotAdapter = new UserAdapter(Users.robots);
4634a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount        dataBinder.toolkittyList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
4734a18e6a231f3b64726bd93e7e097a0d5a75995dGeorge Mount        dataBinder.robotList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
48eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        dataBinder.setActivity(this);
494c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount        dataBinder.executePendingBindings();
50eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    }
51eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
52eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    public UserAdapter getTkAdapter() {
53eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        return tkAdapter;
54eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    }
55eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
56eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    public UserAdapter getRobotAdapter() {
57eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        return robotAdapter;
58eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    }
59eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
60eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    public User getSelected() {
61eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        return selected;
62eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    }
63eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
64eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    private void setSelected(User selected) {
65eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        if (selected == this.selected) {
66eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            return;
67eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
68eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        this.selected = selected;
69a6e4583962e19e8e93b4ca3f9fe3d34560b6d96cYigit Boyar        mListeners.notifyChange(this, BR.selected);
70eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    }
71eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
72793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount    public void onSave(View v) {
73793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount        if (selected == null) {
74793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount            return;
75eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
76793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount        selected.setName(dataBinder.selectedName.getText().toString());
77793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount        selected.setLastName(dataBinder.selectedLastname.getText().toString());
78793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount    }
79eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
80793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount    public void onUnselect (View v) {
81793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount        setSelected(null);
82793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount    }
83eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
84793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount    public void onDelete(View v) {
85793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount        if (selected == null) {
86793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount            return;
87eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
88793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount        if (selected.getGroup() == User.KITTEN) {
89793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount            tkAdapter.remove(selected);
90793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount            selected.setGroup(User.ROBOT);
91793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount            robotAdapter.add(selected);
92793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount            dataBinder.robotList.smoothScrollToPosition(robotAdapter.getItemCount() - 1);
93793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount        } else {
94793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount            tkAdapter.add(selected);
95793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount            dataBinder.toolkittyList.smoothScrollToPosition(tkAdapter.getItemCount() - 1);
96793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount            selected.setGroup(User.KITTEN);
97793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount            robotAdapter.remove(selected);
98eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
99793e979f25e190162eacf46d6a4efc3efc1d2f91George Mount    }
100eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
101eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
102eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    @Override
103eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    public boolean onCreateOptionsMenu(Menu menu) {
104eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        // Inflate the menu; this adds items to the action bar if it is present.
105eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        getMenuInflater().inflate(R.menu.menu_main, menu);
106eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        return true;
107eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    }
108eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
109eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    @Override
110eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    public boolean onOptionsItemSelected(MenuItem item) {
111eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        // Handle action bar item clicks here. The action bar will
112eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        // automatically handle clicks on the Home/Up button, so long
113eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        // as you specify a parent activity in AndroidManifest.xml.
114eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        int id = item.getItemId();
115eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
116eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        //noinspection SimplifiableIfStatement
117eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        if (id == R.id.action_settings) {
118eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            return true;
119eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
120eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
121eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        return super.onOptionsItemSelected(item);
122eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    }
123eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
124eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    @Override
125af516f3f11ae36cb2c5e3dfcbaad7e3f2db174cdYigit Boyar    public void addOnPropertyChangedCallback(OnPropertyChangedCallback listener) {
126293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount        mListeners.add(listener);
127eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    }
128eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
129eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    @Override
130af516f3f11ae36cb2c5e3dfcbaad7e3f2db174cdYigit Boyar    public void removeOnPropertyChangedCallback(OnPropertyChangedCallback listener) {
131293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount        mListeners.remove(listener);
132eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    }
133eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
1344c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount    public class UserAdapter extends DataBoundAdapter<ListItemBinding> implements View.OnClickListener, Observable {
135293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount        final private List<User> userList = new ArrayList<>();
1365cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount        final private PropertyChangeRegistry mListeners = new PropertyChangeRegistry();
137293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount
138eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        public UserAdapter(User[] toolkities) {
1394c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount            super(R.layout.list_item, ListItemBinding.class);
140eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            userList.addAll(Arrays.asList(toolkities));
141eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
142eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
143eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        @Override
1444c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount        public DataBoundViewHolder<ListItemBinding> onCreateViewHolder(ViewGroup viewGroup, int type) {
1454c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount            DataBoundViewHolder<ListItemBinding> vh = super.onCreateViewHolder(viewGroup, type);
146eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            vh.dataBinder.setClickListener(this);
147eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            return vh;
148eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
149eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
150eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        @Override
1514c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount        public void onBindViewHolder(DataBoundViewHolder<ListItemBinding> vh, int index) {
152eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            vh.dataBinder.setUser(userList.get(index));
1534c5cc009bcbcfb19e33fb19db5ec80f83f7b3326George Mount            vh.dataBinder.executePendingBindings();
154eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
155eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
1567bdc3517f998d167a8d2922fbe5b3ee955a75016George Mount        @Bindable
157eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        @Override
158eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        public int getItemCount() {
159eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            return userList.size();
160eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
161eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
162eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        public void add(User user) {
163eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            if (userList.contains(user)) {
164eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar                return;
165eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            }
166eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            userList.add(user);
167eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            notifyItemInserted(userList.size() - 1);
168a6e4583962e19e8e93b4ca3f9fe3d34560b6d96cYigit Boyar            mListeners.notifyChange(this, BR.itemCount);
169eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
170eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
171eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        public void remove(User user) {
172eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            int i = userList.indexOf(user);
173eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            if (i < 0) {
174eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar                return;
175eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            }
176eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            userList.remove(i);
177eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            notifyItemRemoved(i);
178a6e4583962e19e8e93b4ca3f9fe3d34560b6d96cYigit Boyar            mListeners.notifyChange(this, BR.itemCount);
179eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
180eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
181eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        @Override
182eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        public void onClick(View v) {
183eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) v.getLayoutParams();
184658c71b9ba3211ac5c10f261a8c6f38b1916d3bfYigit Boyar            final int pos = lp.getViewAdapterPosition();
185eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            if (pos > -1 && pos < userList.size()) {
186eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar                v.requestFocus();
187eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar                setSelected(userList.get(pos));
188eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            } else {
189eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar                setSelected(null);
190eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar            }
191eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
192eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
193eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        @Override
194af516f3f11ae36cb2c5e3dfcbaad7e3f2db174cdYigit Boyar        public void addOnPropertyChangedCallback(OnPropertyChangedCallback listener) {
195293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount            mListeners.add(listener);
196eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
197eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar
198eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        @Override
199af516f3f11ae36cb2c5e3dfcbaad7e3f2db174cdYigit Boyar        public void removeOnPropertyChangedCallback(OnPropertyChangedCallback listener) {
200293de28642305ce210e1d2a1cfe0abfa4f737d7aGeorge Mount            mListeners.remove(listener);
201eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar        }
202eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar    }
203eb1062abaed1314c71cf80584fe8bcb8b2a6ba53Yigit Boyar}
204