ChooseContactActivity.java

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