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.Config;
 23import eu.siacs.conversations.R;
 24import eu.siacs.conversations.entities.Account;
 25import eu.siacs.conversations.entities.Contact;
 26import eu.siacs.conversations.entities.ListItem;
 27import eu.siacs.conversations.xmpp.jid.Jid;
 28
 29public class ChooseContactActivity extends AbstractSearchableListItemActivity {
 30	private List<String> mActivatedAccounts = new ArrayList<String>();
 31	private List<String> mKnownHosts;
 32
 33	private Set<Contact> selected;
 34	private Set<String> filterContacts;
 35
 36	@Override
 37	public void onCreate(final Bundle savedInstanceState) {
 38		super.onCreate(savedInstanceState);
 39		filterContacts = new HashSet<>();
 40		String[] contacts = getIntent().getStringArrayExtra("filter_contacts");
 41		if (contacts != null) {
 42			Collections.addAll(filterContacts, contacts);
 43		}
 44
 45		if (getIntent().getBooleanExtra("multiple", false)) {
 46			getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
 47			getListView().setMultiChoiceModeListener(new MultiChoiceModeListener() {
 48
 49				@Override
 50				public  boolean onPrepareActionMode(ActionMode mode, Menu menu) {
 51					return false;
 52				}
 53
 54				@Override
 55				public boolean onCreateActionMode(ActionMode mode, Menu menu) {
 56					final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
 57					imm.hideSoftInputFromWindow(getSearchEditText().getWindowToken(),
 58							InputMethodManager.HIDE_IMPLICIT_ONLY);
 59					MenuInflater inflater = getMenuInflater();
 60					inflater.inflate(R.menu.select_multiple, menu);
 61					selected = new HashSet<Contact>();
 62					return true;
 63				}
 64
 65				@Override
 66				public void onDestroyActionMode(ActionMode mode) {
 67				}
 68
 69				@Override
 70				public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
 71					switch(item.getItemId()) {
 72						case R.id.selection_submit:
 73							final Intent request = getIntent();
 74							final Intent data = new Intent();
 75							data.putExtra("conversation",
 76									request.getStringExtra("conversation"));
 77							String[] selection = getSelectedContactJids();
 78							data.putExtra("contacts", selection);
 79							data.putExtra("multiple", true);
 80							data.putExtra(EXTRA_ACCOUNT,request.getStringExtra(EXTRA_ACCOUNT));
 81							data.putExtra("subject", request.getStringExtra("subject"));
 82							setResult(RESULT_OK, data);
 83							finish();
 84							return true;
 85					}
 86					return false;
 87				}
 88
 89				@Override
 90				public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
 91					Contact item = (Contact) getListItems().get(position);
 92					if (checked) {
 93						selected.add(item);
 94					} else {
 95						selected.remove(item);
 96					}
 97					int numSelected = selected.size();
 98					MenuItem selectButton = mode.getMenu().findItem(R.id.selection_submit);
 99					String buttonText = getResources().getQuantityString(R.plurals.select_contact,
100							numSelected, numSelected);
101					selectButton.setTitle(buttonText);
102				}
103			});
104		}
105
106		getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
107
108			@Override
109			public void onItemClick(final AdapterView<?> parent, final View view,
110					final int position, final long id) {
111				final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
112				imm.hideSoftInputFromWindow(getSearchEditText().getWindowToken(),
113						InputMethodManager.HIDE_IMPLICIT_ONLY);
114				final Intent request = getIntent();
115				final Intent data = new Intent();
116				final ListItem mListItem = getListItems().get(position);
117				data.putExtra("contact", mListItem.getJid().toString());
118				String account = request.getStringExtra(EXTRA_ACCOUNT);
119				if (account == null && mListItem instanceof Contact) {
120					account = ((Contact) mListItem).getAccount().getJid().toBareJid().toString();
121				}
122				data.putExtra(EXTRA_ACCOUNT, account);
123				data.putExtra("conversation",
124						request.getStringExtra("conversation"));
125				data.putExtra("multiple", false);
126				data.putExtra("subject", request.getStringExtra("subject"));
127				setResult(RESULT_OK, data);
128				finish();
129			}
130		});
131
132	}
133
134	@Override
135	public boolean onCreateOptionsMenu(final Menu menu) {
136		super.onCreateOptionsMenu(menu);
137		final Intent i = getIntent();
138		boolean showEnterJid = i != null && i.getBooleanExtra("show_enter_jid", false);
139		menu.findItem(R.id.action_create_contact).setVisible(showEnterJid);
140		return true;
141	}
142
143	protected void filterContacts(final String needle) {
144		getListItems().clear();
145		for (final Account account : xmppConnectionService.getAccounts()) {
146			if (account.getStatus() != Account.State.DISABLED) {
147				for (final Contact contact : account.getRoster().getContacts()) {
148					if (contact.showInRoster() &&
149							!filterContacts.contains(contact.getJid().toBareJid().toString())
150							&& contact.match(this, needle)) {
151						getListItems().add(contact);
152					}
153				}
154			}
155		}
156		Collections.sort(getListItems());
157		getListItemAdapter().notifyDataSetChanged();
158	}
159
160	private String[] getSelectedContactJids() {
161		List<String> result = new ArrayList<>();
162		for (Contact contact : selected) {
163			result.add(contact.getJid().toString());
164		}
165		return result.toArray(new String[result.size()]);
166	}
167
168
169	public void refreshUiReal() {
170		//nothing to do. This Activity doesn't implement any listeners
171	}
172
173	@Override
174	public boolean onOptionsItemSelected(MenuItem item) {
175		switch (item.getItemId()) {
176			case R.id.action_create_contact:
177				showEnterJidDialog();
178				return true;
179		}
180		return super.onOptionsItemSelected(item);
181	}
182
183	protected void showEnterJidDialog() {
184		EnterJidDialog dialog = new EnterJidDialog(
185			this, mKnownHosts, mActivatedAccounts,
186			getString(R.string.enter_contact), getString(R.string.select),
187			null, getIntent().getStringExtra(EXTRA_ACCOUNT), true
188		);
189
190		dialog.setOnEnterJidDialogPositiveListener(new EnterJidDialog.OnEnterJidDialogPositiveListener() {
191			@Override
192			public boolean onEnterJidDialogPositive(Jid accountJid, Jid contactJid) throws EnterJidDialog.JidError {
193				final Intent request = getIntent();
194				final Intent data = new Intent();
195				data.putExtra("contact", contactJid.toString());
196				data.putExtra(EXTRA_ACCOUNT, accountJid.toString());
197				data.putExtra("conversation",
198						request.getStringExtra("conversation"));
199				data.putExtra("multiple", false);
200				data.putExtra("subject", request.getStringExtra("subject"));
201				setResult(RESULT_OK, data);
202				finish();
203
204				return true;
205			}
206		});
207
208		dialog.show();
209	}
210
211	@Override
212	void onBackendConnected() {
213		filterContacts();
214
215		this.mActivatedAccounts.clear();
216		for (Account account : xmppConnectionService.getAccounts()) {
217			if (account.getStatus() != Account.State.DISABLED) {
218				if (Config.DOMAIN_LOCK != null) {
219					this.mActivatedAccounts.add(account.getJid().getLocalpart());
220				} else {
221					this.mActivatedAccounts.add(account.getJid().toBareJid().toString());
222				}
223			}
224		}
225		this.mKnownHosts = xmppConnectionService.getKnownHosts();
226	}
227}