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							setResult(RESULT_OK, data);
 81							finish();
 82							return true;
 83					}
 84					return false;
 85				}
 86
 87				@Override
 88				public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
 89					Contact item = (Contact) getListItems().get(position);
 90					if (checked) {
 91						selected.add(item);
 92					} else {
 93						selected.remove(item);
 94					}
 95					int numSelected = selected.size();
 96					MenuItem selectButton = mode.getMenu().findItem(R.id.selection_submit);
 97					String buttonText = getResources().getQuantityString(R.plurals.select_contact,
 98							numSelected, numSelected);
 99					selectButton.setTitle(buttonText);
100				}
101			});
102		}
103
104		getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
105
106			@Override
107			public void onItemClick(final AdapterView<?> parent, final View view,
108					final int position, final long id) {
109				final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
110				imm.hideSoftInputFromWindow(getSearchEditText().getWindowToken(),
111						InputMethodManager.HIDE_IMPLICIT_ONLY);
112				final Intent request = getIntent();
113				final Intent data = new Intent();
114				final ListItem mListItem = getListItems().get(position);
115				data.putExtra("contact", mListItem.getJid().toString());
116				String account = request.getStringExtra(EXTRA_ACCOUNT);
117				if (account == null && mListItem instanceof Contact) {
118					account = ((Contact) mListItem).getAccount().getJid().toBareJid().toString();
119				}
120				data.putExtra(EXTRA_ACCOUNT, account);
121				data.putExtra("conversation",
122						request.getStringExtra("conversation"));
123				data.putExtra("multiple", false);
124				setResult(RESULT_OK, data);
125				finish();
126			}
127		});
128
129	}
130
131	@Override
132	public boolean onCreateOptionsMenu(final Menu menu) {
133		super.onCreateOptionsMenu(menu);
134		final Intent i = getIntent();
135		boolean showEnterJid = i != null && i.getBooleanExtra("show_enter_jid", false);
136		menu.findItem(R.id.action_create_contact).setVisible(showEnterJid);
137		return true;
138	}
139
140	protected void filterContacts(final String needle) {
141		getListItems().clear();
142		for (final Account account : xmppConnectionService.getAccounts()) {
143			if (account.getStatus() != Account.State.DISABLED) {
144				for (final Contact contact : account.getRoster().getContacts()) {
145					if (contact.showInRoster() &&
146							!filterContacts.contains(contact.getJid().toBareJid().toString())
147							&& contact.match(this, needle)) {
148						getListItems().add(contact);
149					}
150				}
151			}
152		}
153		Collections.sort(getListItems());
154		getListItemAdapter().notifyDataSetChanged();
155	}
156
157	private String[] getSelectedContactJids() {
158		List<String> result = new ArrayList<>();
159		for (Contact contact : selected) {
160			result.add(contact.getJid().toString());
161		}
162		return result.toArray(new String[result.size()]);
163	}
164
165
166	public void refreshUiReal() {
167		//nothing to do. This Activity doesn't implement any listeners
168	}
169
170	@Override
171	public boolean onOptionsItemSelected(MenuItem item) {
172		switch (item.getItemId()) {
173			case R.id.action_create_contact:
174				showEnterJidDialog();
175				return true;
176		}
177		return super.onOptionsItemSelected(item);
178	}
179
180	protected void showEnterJidDialog() {
181		EnterJidDialog dialog = new EnterJidDialog(
182			this, mKnownHosts, mActivatedAccounts,
183			getString(R.string.enter_contact), getString(R.string.select),
184			null, getIntent().getStringExtra(EXTRA_ACCOUNT), true
185		);
186
187		dialog.setOnEnterJidDialogPositiveListener(new EnterJidDialog.OnEnterJidDialogPositiveListener() {
188			@Override
189			public boolean onEnterJidDialogPositive(Jid accountJid, Jid contactJid) throws EnterJidDialog.JidError {
190				final Intent request = getIntent();
191				final Intent data = new Intent();
192				data.putExtra("contact", contactJid.toString());
193				data.putExtra(EXTRA_ACCOUNT, accountJid.toString());
194				data.putExtra("conversation",
195						request.getStringExtra("conversation"));
196				data.putExtra("multiple", false);
197				setResult(RESULT_OK, data);
198				finish();
199
200				return true;
201			}
202		});
203
204		dialog.show();
205	}
206
207	@Override
208	void onBackendConnected() {
209		filterContacts();
210
211		this.mActivatedAccounts.clear();
212		for (Account account : xmppConnectionService.getAccounts()) {
213			if (account.getStatus() != Account.State.DISABLED) {
214				if (Config.DOMAIN_LOCK != null) {
215					this.mActivatedAccounts.add(account.getJid().getLocalpart());
216				} else {
217					this.mActivatedAccounts.add(account.getJid().toBareJid().toString());
218				}
219			}
220		}
221		this.mKnownHosts = xmppConnectionService.getKnownHosts();
222	}
223}