StartConversation.java

  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}