ChooseContactActivity.java

  1package eu.siacs.conversations.ui;
  2
  3import android.content.Context;
  4import android.content.Intent;
  5import android.os.Bundle;
  6import android.view.ActionMode;
  7import android.view.Menu;
  8import android.view.MenuInflater;
  9import android.view.MenuItem;
 10import android.view.View;
 11import android.view.inputmethod.InputMethodManager;
 12import android.widget.AbsListView.MultiChoiceModeListener;
 13import android.widget.AdapterView;
 14import android.widget.ListView;
 15
 16import java.util.ArrayList;
 17import java.util.Collections;
 18import java.util.HashSet;
 19import java.util.List;
 20import java.util.Set;
 21
 22import eu.siacs.conversations.R;
 23import eu.siacs.conversations.entities.Account;
 24import eu.siacs.conversations.entities.Contact;
 25import eu.siacs.conversations.entities.ListItem;
 26
 27public class ChooseContactActivity extends AbstractSearchableListItemActivity {
 28
 29	private Set<Contact> selected;
 30	private Set<String> filterContacts;
 31
 32	@Override
 33	public void onCreate(final Bundle savedInstanceState) {
 34		super.onCreate(savedInstanceState);
 35		filterContacts = new HashSet<>();
 36		String[] contacts = getIntent().getStringArrayExtra("filter_contacts");
 37		if (contacts != null) {
 38			Collections.addAll(filterContacts, contacts);
 39		}
 40
 41		if (getIntent().getBooleanExtra("multiple", false)) {
 42			getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
 43			getListView().setMultiChoiceModeListener(new MultiChoiceModeListener() {
 44
 45				@Override
 46				public  boolean onPrepareActionMode(ActionMode mode, Menu menu) {
 47					return false;
 48				}
 49
 50				@Override
 51				public boolean onCreateActionMode(ActionMode mode, Menu menu) {
 52					final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
 53					imm.hideSoftInputFromWindow(getSearchEditText().getWindowToken(),
 54							InputMethodManager.HIDE_IMPLICIT_ONLY);
 55					MenuInflater inflater = getMenuInflater();
 56					inflater.inflate(R.menu.select_multiple, menu);
 57					selected = new HashSet<Contact>();
 58					return true;
 59				}
 60
 61				@Override
 62				public void onDestroyActionMode(ActionMode mode) {
 63				}
 64
 65				@Override
 66				public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
 67					switch(item.getItemId()) {
 68						case R.id.selection_submit:
 69							final Intent request = getIntent();
 70							final Intent data = new Intent();
 71							data.putExtra("conversation",
 72									request.getStringExtra("conversation"));
 73							String[] selection = getSelectedContactJids();
 74							data.putExtra("contacts", selection);
 75							data.putExtra("multiple", true);
 76							setResult(RESULT_OK, data);
 77							finish();
 78							return true;
 79					}
 80					return false;
 81				}
 82
 83				@Override
 84				public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
 85					Contact item = (Contact) getListItems().get(position);
 86					if (checked) {
 87						selected.add(item);
 88					} else {
 89						selected.remove(item);
 90					}
 91					int numSelected = selected.size();
 92					MenuItem selectButton = mode.getMenu().findItem(R.id.selection_submit);
 93					String buttonText = getResources().getQuantityString(R.plurals.select_contact,
 94							numSelected, numSelected);
 95					selectButton.setTitle(buttonText);
 96				}
 97			});
 98		}
 99
100		getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
101
102			@Override
103			public void onItemClick(final AdapterView<?> parent, final View view,
104					final int position, final long id) {
105				final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
106				imm.hideSoftInputFromWindow(getSearchEditText().getWindowToken(),
107						InputMethodManager.HIDE_IMPLICIT_ONLY);
108				final Intent request = getIntent();
109				final Intent data = new Intent();
110				final ListItem mListItem = getListItems().get(position);
111				data.putExtra("contact", mListItem.getJid().toString());
112				String account = request.getStringExtra("account");
113				if (account == null && mListItem instanceof Contact) {
114					account = ((Contact) mListItem).getAccount().getJid().toBareJid().toString();
115				}
116				data.putExtra("account", account);
117				data.putExtra("conversation",
118						request.getStringExtra("conversation"));
119				data.putExtra("multiple", false);
120				setResult(RESULT_OK, data);
121				finish();
122			}
123		});
124
125	}
126
127	protected void filterContacts(final String needle) {
128		getListItems().clear();
129		for (final Account account : xmppConnectionService.getAccounts()) {
130			if (account.getStatus() != Account.State.DISABLED) {
131				for (final Contact contact : account.getRoster().getContacts()) {
132					if (contact.showInRoster() &&
133							!filterContacts.contains(contact.getJid().toBareJid().toString())
134							&& contact.match(needle)) {
135						getListItems().add(contact);
136					}
137				}
138			}
139		}
140		Collections.sort(getListItems());
141		getListItemAdapter().notifyDataSetChanged();
142	}
143
144	private String[] getSelectedContactJids() {
145		List<String> result = new ArrayList<>();
146		for (Contact contact : selected) {
147			result.add(contact.getJid().toString());
148		}
149		return result.toArray(new String[result.size()]);
150	}
151
152
153	public void refreshUiReal() {
154		//nothing to do. This Activity doesn't implement any listeners
155	}
156}