1package eu.siacs.conversations.ui;
2
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.List;
6
7import android.app.ActionBar;
8import android.app.ActionBar.Tab;
9import android.app.ActionBar.TabListener;
10import android.app.Fragment;
11import android.app.FragmentTransaction;
12import android.app.ListFragment;
13import android.content.Context;
14import android.graphics.Color;
15import android.os.Bundle;
16import android.support.v13.app.FragmentPagerAdapter;
17import android.support.v4.view.ViewPager;
18import android.view.ContextMenu;
19import android.view.ContextMenu.ContextMenuInfo;
20import android.view.LayoutInflater;
21import android.view.Menu;
22import android.view.MenuItem;
23import android.view.View;
24import android.view.ViewGroup;
25import android.widget.AdapterView;
26import android.widget.AdapterView.AdapterContextMenuInfo;
27import android.widget.AdapterView.OnItemClickListener;
28import android.widget.ArrayAdapter;
29import android.widget.ImageView;
30import android.widget.ListView;
31import android.widget.SearchView;
32import android.widget.SearchView.OnQueryTextListener;
33import android.widget.TextView;
34import eu.siacs.conversations.R;
35import eu.siacs.conversations.entities.Account;
36import eu.siacs.conversations.entities.Contact;
37import eu.siacs.conversations.entities.Conversation;
38import eu.siacs.conversations.entities.ListItem;
39import eu.siacs.conversations.utils.UIHelper;
40
41public class StartConversation extends XmppActivity {
42
43 private Tab mContactsTab;
44 private Tab mConferencesTab;
45 private ViewPager mViewPager;
46 private SearchView mSearchView;
47
48 private MyListFragment mContactsListFragment = new MyListFragment();
49 private List<ListItem> contacts = new ArrayList<ListItem>();
50 private ArrayAdapter<ListItem> mContactsAdapter;
51
52 private MyListFragment mConferenceListFragment = new MyListFragment();
53 private List<ListItem> conferences = new ArrayList<ListItem>();
54 private ArrayAdapter<ListItem> mConferenceAdapter;
55
56 private TabListener mTabListener = new TabListener() {
57
58 @Override
59 public void onTabUnselected(Tab tab, FragmentTransaction ft) {
60 return;
61 }
62
63 @Override
64 public void onTabSelected(Tab tab, FragmentTransaction ft) {
65 mViewPager.setCurrentItem(tab.getPosition());
66 onTabChanged();
67 }
68
69 @Override
70 public void onTabReselected(Tab tab, FragmentTransaction ft) {
71 return;
72 }
73 };
74
75 private ViewPager.SimpleOnPageChangeListener mOnPageChangeListener = new ViewPager.SimpleOnPageChangeListener() {
76 @Override
77 public void onPageSelected(int position) {
78 getActionBar().setSelectedNavigationItem(position);
79 onTabChanged();
80 }
81 };
82 private OnQueryTextListener mOnQueryTextListener = new OnQueryTextListener() {
83
84 @Override
85 public boolean onQueryTextSubmit(String query) {
86 return true;
87 }
88
89 @Override
90 public boolean onQueryTextChange(String newText) {
91 filterContacts(newText);
92 return true;
93 }
94 };
95
96 @Override
97 public void onCreate(Bundle savedInstanceState) {
98 super.onCreate(savedInstanceState);
99 setContentView(R.layout.activity_start_conversation);
100 mViewPager = (ViewPager) findViewById(R.id.start_conversation_view_pager);
101 ActionBar actionBar = getActionBar();
102 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
103
104 mContactsTab = actionBar.newTab().setText(R.string.contacts)
105 .setTabListener(mTabListener);
106 mConferencesTab = actionBar.newTab().setText(R.string.conferences)
107 .setTabListener(mTabListener);
108 actionBar.addTab(mContactsTab);
109 actionBar.addTab(mConferencesTab);
110
111 mViewPager.setOnPageChangeListener(mOnPageChangeListener);
112 mViewPager.setAdapter(new FragmentPagerAdapter(getFragmentManager()) {
113
114 @Override
115 public int getCount() {
116 return 2;
117 }
118
119 @Override
120 public Fragment getItem(int position) {
121 if (position == 0) {
122 return mContactsListFragment;
123 } else {
124 return mConferenceListFragment;
125 }
126 }
127 });
128
129 mConferenceAdapter = new ListItemAdapter(conferences);
130 mConferenceListFragment.setListAdapter(mConferenceAdapter);
131
132 mContactsAdapter = new ListItemAdapter(contacts);
133 mContactsListFragment.setListAdapter(mContactsAdapter);
134 mContactsListFragment
135 .setOnListItemClickListener(new OnItemClickListener() {
136
137 @Override
138 public void onItemClick(AdapterView<?> arg0, View arg1,
139 int position, long arg3) {
140 openConversationForContact(position);
141 }
142 });
143
144 }
145
146 protected void openConversationForContact(int position) {
147 Contact contact = (Contact) contacts.get(position);
148 Conversation conversation = xmppConnectionService
149 .findOrCreateConversation(contact.getAccount(),
150 contact.getJid(), false);
151 switchToConversation(conversation, null, false);
152 }
153
154 protected void openDetailsForContact(int position) {
155 Contact contact = (Contact) contacts.get(position);
156 switchToContactDetails(contact);
157 }
158
159 protected void deleteContact(int position) {
160 Contact contact = (Contact) contacts.get(position);
161 xmppConnectionService.deleteContactOnServer(contact);
162 filterContacts(null);
163 }
164
165 @Override
166 public boolean onCreateOptionsMenu(Menu menu) {
167 getMenuInflater().inflate(R.menu.start_conversation, menu);
168 MenuItem menuCreateContact = (MenuItem) menu
169 .findItem(R.id.action_create_contact);
170 MenuItem menuCreateConference = (MenuItem) menu
171 .findItem(R.id.action_create_conference);
172 MenuItem menuSearch = (MenuItem) menu.findItem(R.id.action_search);
173 if (getActionBar().getSelectedNavigationIndex() == 0) {
174 menuCreateConference.setVisible(false);
175 } else {
176 menuCreateContact.setVisible(false);
177 }
178 mSearchView = (SearchView) menuSearch.getActionView();
179 int id = mSearchView.getContext().getResources()
180 .getIdentifier("android:id/search_src_text", null, null);
181 TextView textView = (TextView) mSearchView.findViewById(id);
182 textView.setTextColor(Color.WHITE);
183 mSearchView.setOnQueryTextListener(this.mOnQueryTextListener);
184 return true;
185 }
186
187 @Override
188 public boolean onOptionsItemSelected(MenuItem item) {
189 switch (item.getItemId()) {
190 default:
191 break;
192 }
193 return super.onOptionsItemSelected(item);
194 }
195
196 @Override
197 void onBackendConnected() {
198 filterContacts(null);
199 }
200
201 protected void filterContacts(String needle) {
202 this.contacts.clear();
203 for (Account account : xmppConnectionService.getAccounts()) {
204 if (account.getStatus() != Account.STATUS_DISABLED) {
205 for (Contact contact : account.getRoster().getContacts()) {
206 if (contact.showInRoster() && contact.match(needle)) {
207 this.contacts.add(contact);
208 }
209 }
210 }
211 }
212 Collections.sort(this.contacts);
213 mContactsAdapter.notifyDataSetChanged();
214 }
215
216 private void onTabChanged() {
217 invalidateOptionsMenu();
218 }
219
220 private class ListItemAdapter extends ArrayAdapter<ListItem> {
221
222 public ListItemAdapter(List<ListItem> objects) {
223 super(getApplicationContext(), 0, objects);
224 }
225
226 @Override
227 public View getView(int position, View view, ViewGroup parent) {
228 LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
229 ListItem item = getItem(position);
230 if (view == null) {
231 view = (View) inflater.inflate(R.layout.contact, null);
232 }
233 TextView name = (TextView) view
234 .findViewById(R.id.contact_display_name);
235 TextView jid = (TextView) view.findViewById(R.id.contact_jid);
236 ImageView picture = (ImageView) view
237 .findViewById(R.id.contact_photo);
238
239 jid.setText(item.getJid());
240 name.setText(item.getDisplayName());
241 picture.setImageBitmap(UIHelper.getContactPicture(item, 48,
242 this.getContext(), false));
243 return view;
244 }
245
246 }
247
248 public static class MyListFragment extends ListFragment {
249 private AdapterView.OnItemClickListener mOnItemClickListener;
250 private int mContextPosition = -1;
251
252 @Override
253 public void onListItemClick(ListView l, View v, int position, long id) {
254 if (mOnItemClickListener != null) {
255 mOnItemClickListener.onItemClick(l, v, position, id);
256 }
257 }
258
259 public void setOnListItemClickListener(AdapterView.OnItemClickListener l) {
260 this.mOnItemClickListener = l;
261 }
262
263 @Override
264 public void onViewCreated(View view, Bundle savedInstanceState) {
265 super.onViewCreated(view, savedInstanceState);
266 registerForContextMenu(getListView());
267 }
268
269 @Override
270 public void onCreateContextMenu(ContextMenu menu, View v,
271 ContextMenuInfo menuInfo) {
272 super.onCreateContextMenu(menu, v, menuInfo);
273 getActivity().getMenuInflater().inflate(R.menu.contact_context,
274 menu);
275 AdapterView.AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;
276 this.mContextPosition = acmi.position;
277 }
278
279 @Override
280 public boolean onContextItemSelected(MenuItem item) {
281 StartConversation activity = (StartConversation) getActivity();
282 switch(item.getItemId()) {
283 case R.id.context_start_conversation:
284 activity.openConversationForContact(mContextPosition);
285 break;
286 case R.id.context_contact_details:
287 activity.openDetailsForContact(mContextPosition);
288 break;
289 case R.id.context_delete_contact:
290 activity.deleteContact(mContextPosition);
291 break;
292 }
293 return true;
294 }
295 }
296}