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