ConversationFragment.java

  1package eu.siacs.conversations.ui;
  2
  3import java.util.ArrayList;
  4import java.util.List;
  5import java.util.Set;
  6
  7import net.java.otr4j.session.SessionStatus;
  8import eu.siacs.conversations.R;
  9import eu.siacs.conversations.crypto.PgpEngine;
 10import eu.siacs.conversations.entities.Account;
 11import eu.siacs.conversations.entities.Contact;
 12import eu.siacs.conversations.entities.Conversation;
 13import eu.siacs.conversations.entities.Message;
 14import eu.siacs.conversations.entities.MucOptions;
 15import eu.siacs.conversations.entities.Presences;
 16import eu.siacs.conversations.services.XmppConnectionService;
 17import eu.siacs.conversations.ui.EditMessage.OnEnterPressed;
 18import eu.siacs.conversations.ui.XmppActivity.OnPresenceSelected;
 19import eu.siacs.conversations.ui.XmppActivity.OnValueEdited;
 20import eu.siacs.conversations.ui.adapter.MessageAdapter;
 21import eu.siacs.conversations.ui.adapter.MessageAdapter.OnContactPictureClicked;
 22import eu.siacs.conversations.ui.adapter.MessageAdapter.OnContactPictureLongClicked;
 23import eu.siacs.conversations.utils.UIHelper;
 24import android.app.AlertDialog;
 25import android.app.Fragment;
 26import android.app.PendingIntent;
 27import android.content.Context;
 28import android.content.DialogInterface;
 29import android.content.Intent;
 30import android.content.IntentSender;
 31import android.content.IntentSender.SendIntentException;
 32import android.os.Bundle;
 33import android.text.Editable;
 34import android.text.Selection;
 35import android.view.Gravity;
 36import android.view.KeyEvent;
 37import android.view.LayoutInflater;
 38import android.view.View;
 39import android.view.View.OnClickListener;
 40import android.view.ViewGroup;
 41import android.view.inputmethod.EditorInfo;
 42import android.view.inputmethod.InputMethodManager;
 43import android.widget.AbsListView.OnScrollListener;
 44import android.widget.TextView.OnEditorActionListener;
 45import android.widget.AbsListView;
 46
 47import android.widget.ListView;
 48import android.widget.ImageButton;
 49import android.widget.RelativeLayout;
 50import android.widget.TextView;
 51import android.widget.Toast;
 52
 53public class ConversationFragment extends Fragment {
 54
 55	protected Conversation conversation;
 56	protected ListView messagesView;
 57	protected LayoutInflater inflater;
 58	protected List<Message> messageList = new ArrayList<Message>();
 59	protected MessageAdapter messageListAdapter;
 60	protected Contact contact;
 61
 62	protected String queuedPqpMessage = null;
 63
 64	private EditMessage mEditMessage;
 65	private ImageButton mSendButton;
 66	private String pastedText = null;
 67	private RelativeLayout snackbar;
 68	private TextView snackbarMessage;
 69	private TextView snackbarAction;
 70
 71	private boolean messagesLoaded = false;
 72
 73	private IntentSender askForPassphraseIntent = null;
 74
 75	private OnEditorActionListener mEditorActionListener = new OnEditorActionListener() {
 76
 77		@Override
 78		public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
 79			if (actionId == EditorInfo.IME_ACTION_SEND) {
 80				InputMethodManager imm = (InputMethodManager) v.getContext()
 81						.getSystemService(Context.INPUT_METHOD_SERVICE);
 82				imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
 83				sendMessage();
 84				return true;
 85			} else {
 86				return false;
 87			}
 88		}
 89	};
 90
 91	private OnClickListener mSendButtonListener = new OnClickListener() {
 92
 93		@Override
 94		public void onClick(View v) {
 95			sendMessage();
 96		}
 97	};
 98	protected OnClickListener clickToDecryptListener = new OnClickListener() {
 99
100		@Override
101		public void onClick(View v) {
102			if (activity.hasPgp() && askForPassphraseIntent != null) {
103				try {
104					getActivity().startIntentSenderForResult(
105							askForPassphraseIntent,
106							ConversationActivity.REQUEST_DECRYPT_PGP, null, 0,
107							0, 0);
108				} catch (SendIntentException e) {
109					//
110				}
111			}
112		}
113	};
114
115	private OnClickListener clickToMuc = new OnClickListener() {
116
117		@Override
118		public void onClick(View v) {
119			Intent intent = new Intent(getActivity(),
120					ConferenceDetailsActivity.class);
121			intent.setAction(ConferenceDetailsActivity.ACTION_VIEW_MUC);
122			intent.putExtra("uuid", conversation.getUuid());
123			startActivity(intent);
124		}
125	};
126
127	private OnClickListener leaveMuc = new OnClickListener() {
128
129		@Override
130		public void onClick(View v) {
131			activity.endConversation(conversation);
132		}
133	};
134
135	private OnClickListener enterPassword = new OnClickListener() {
136
137		@Override
138		public void onClick(View v) {
139			MucOptions muc = conversation.getMucOptions();
140			String password = muc.getPassword();
141			if (password == null) {
142				password = "";
143			}
144			activity.quickPasswordEdit(password, new OnValueEdited() {
145
146				@Override
147				public void onValueEdited(String value) {
148					activity.xmppConnectionService.providePasswordForMuc(
149							conversation, value);
150				}
151			});
152		}
153	};
154
155	private OnScrollListener mOnScrollListener = new OnScrollListener() {
156
157		@Override
158		public void onScrollStateChanged(AbsListView view, int scrollState) {
159			// TODO Auto-generated method stub
160
161		}
162
163		@Override
164		public void onScroll(AbsListView view, int firstVisibleItem,
165				int visibleItemCount, int totalItemCount) {
166			if (firstVisibleItem == 0 && messagesLoaded) {
167				long timestamp = messageList.get(0).getTimeSent();
168				messagesLoaded = false;
169				int size = activity.xmppConnectionService.loadMoreMessages(
170						conversation, timestamp);
171				messageList.clear();
172				messageList.addAll(conversation.getMessages());
173				messageListAdapter.notifyDataSetChanged();
174				if (size != 0) {
175					messagesLoaded = true;
176				}
177				messagesView.setSelectionFromTop(size + 1, 0);
178			}
179		}
180	};
181
182	private ConversationActivity activity;
183
184	private void sendMessage() {
185		if (this.conversation == null) {
186			return;
187		}
188		if (mEditMessage.getText().length() < 1) {
189			if (this.conversation.getMode() == Conversation.MODE_MULTI) {
190				conversation.setNextPresence(null);
191				updateChatMsgHint();
192			}
193			return;
194		}
195		Message message = new Message(conversation, mEditMessage.getText()
196				.toString(), conversation.getNextEncryption(activity
197				.forceEncryption()));
198		if (conversation.getMode() == Conversation.MODE_MULTI) {
199			if (conversation.getNextPresence() != null) {
200				message.setPresence(conversation.getNextPresence());
201				message.setType(Message.TYPE_PRIVATE);
202				conversation.setNextPresence(null);
203			}
204		}
205		if (conversation.getNextEncryption(activity.forceEncryption()) == Message.ENCRYPTION_OTR) {
206			sendOtrMessage(message);
207		} else if (conversation.getNextEncryption(activity.forceEncryption()) == Message.ENCRYPTION_PGP) {
208			sendPgpMessage(message);
209		} else {
210			sendPlainTextMessage(message);
211		}
212	}
213
214	public void updateChatMsgHint() {
215		if (conversation.getMode() == Conversation.MODE_MULTI
216				&& conversation.getNextPresence() != null) {
217			this.mEditMessage.setHint(getString(
218					R.string.send_private_message_to,
219					conversation.getNextPresence()));
220		} else {
221			switch (conversation.getNextEncryption(activity.forceEncryption())) {
222			case Message.ENCRYPTION_NONE:
223				mEditMessage
224						.setHint(getString(R.string.send_plain_text_message));
225				break;
226			case Message.ENCRYPTION_OTR:
227				mEditMessage.setHint(getString(R.string.send_otr_message));
228				break;
229			case Message.ENCRYPTION_PGP:
230				mEditMessage.setHint(getString(R.string.send_pgp_message));
231				break;
232			default:
233				break;
234			}
235		}
236	}
237
238	@Override
239	public View onCreateView(final LayoutInflater inflater,
240			ViewGroup container, Bundle savedInstanceState) {
241		final View view = inflater.inflate(R.layout.fragment_conversation,
242				container, false);
243		mEditMessage = (EditMessage) view.findViewById(R.id.textinput);
244		mEditMessage.setOnClickListener(new OnClickListener() {
245
246			@Override
247			public void onClick(View v) {
248				if (activity.getSlidingPaneLayout().isSlideable()) {
249					activity.getSlidingPaneLayout().closePane();
250				}
251			}
252		});
253		mEditMessage.setOnEditorActionListener(mEditorActionListener);
254		mEditMessage.setOnEnterPressedListener(new OnEnterPressed() {
255
256			@Override
257			public void onEnterPressed() {
258				sendMessage();
259			}
260		});
261
262		mSendButton = (ImageButton) view.findViewById(R.id.textSendButton);
263		mSendButton.setOnClickListener(this.mSendButtonListener);
264
265		snackbar = (RelativeLayout) view.findViewById(R.id.snackbar);
266		snackbarMessage = (TextView) view.findViewById(R.id.snackbar_message);
267		snackbarAction = (TextView) view.findViewById(R.id.snackbar_action);
268
269		messagesView = (ListView) view.findViewById(R.id.messages_view);
270		messagesView.setOnScrollListener(mOnScrollListener);
271		messagesView.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
272		messageListAdapter = new MessageAdapter(
273				(ConversationActivity) getActivity(), this.messageList);
274		messageListAdapter
275				.setOnContactPictureClicked(new OnContactPictureClicked() {
276
277					@Override
278					public void onContactPictureClicked(Message message) {
279						if (message.getStatus() <= Message.STATUS_RECEIVED) {
280							if (message.getConversation().getMode() == Conversation.MODE_MULTI) {
281								if (message.getPresence() != null) {
282									highlightInConference(message.getPresence());
283								} else {
284									highlightInConference(message
285											.getCounterpart());
286								}
287							} else {
288								Contact contact = message.getConversation()
289										.getContact();
290								if (contact.showInRoster()) {
291									activity.switchToContactDetails(contact);
292								} else {
293									activity.showAddToRosterDialog(message
294											.getConversation());
295								}
296							}
297						}
298					}
299				});
300		messageListAdapter
301				.setOnContactPictureLongClicked(new OnContactPictureLongClicked() {
302
303					@Override
304					public void onContactPictureLongClicked(Message message) {
305						if (message.getStatus() <= Message.STATUS_RECEIVED) {
306							if (message.getConversation().getMode() == Conversation.MODE_MULTI) {
307								if (message.getPresence() != null) {
308									privateMessageWith(message.getPresence());
309								} else {
310									privateMessageWith(message.getCounterpart());
311								}
312							}
313						}
314					}
315				});
316		messagesView.setAdapter(messageListAdapter);
317
318		return view;
319	}
320
321	protected void privateMessageWith(String counterpart) {
322		this.mEditMessage.setText("");
323		this.conversation.setNextPresence(counterpart);
324		updateChatMsgHint();
325	}
326
327	protected void highlightInConference(String nick) {
328		String oldString = mEditMessage.getText().toString().trim();
329		if (oldString.isEmpty() || mEditMessage.getSelectionStart() == 0) {
330			mEditMessage.getText().insert(0, nick + ": ");
331		} else {
332			if (mEditMessage.getText().charAt(
333					mEditMessage.getSelectionStart() - 1) != ' ') {
334				nick = " " + nick;
335			}
336			mEditMessage.getText().insert(mEditMessage.getSelectionStart(),
337					nick + " ");
338		}
339	}
340
341	@Override
342	public void onStart() {
343		super.onStart();
344		this.activity = (ConversationActivity) getActivity();
345		if (activity.xmppConnectionServiceBound) {
346			this.onBackendConnected();
347		}
348	}
349
350	@Override
351	public void onStop() {
352		super.onStop();
353		if (this.conversation != null) {
354			this.conversation.setNextMessage(mEditMessage.getText().toString());
355		}
356	}
357
358	public void onBackendConnected() {
359		this.activity = (ConversationActivity) getActivity();
360		this.conversation = activity.getSelectedConversation();
361		if (this.conversation == null) {
362			return;
363		}
364		String oldString = conversation.getNextMessage().trim();
365		if (this.pastedText == null) {
366			this.mEditMessage.setText(oldString);
367		} else {
368
369			if (oldString.isEmpty()) {
370				mEditMessage.setText(pastedText);
371			} else {
372				mEditMessage.setText(oldString + " " + pastedText);
373			}
374			pastedText = null;
375		}
376		int position = mEditMessage.length();
377		Editable etext = mEditMessage.getText();
378		Selection.setSelection(etext, position);
379		if (activity.getSlidingPaneLayout().isSlideable()) {
380			if (!activity.shouldPaneBeOpen()) {
381				activity.getSlidingPaneLayout().closePane();
382				activity.openConversation(conversation);
383			}
384		}
385		if (this.conversation.getMode() == Conversation.MODE_MULTI) {
386			conversation.setNextPresence(null);
387		}
388		updateMessages();
389	}
390
391	private void decryptMessage(Message message) {
392		PgpEngine engine = activity.xmppConnectionService.getPgpEngine();
393		if (engine != null) {
394			engine.decrypt(message, new UiCallback<Message>() {
395
396				@Override
397				public void userInputRequried(PendingIntent pi, Message message) {
398					askForPassphraseIntent = pi.getIntentSender();
399					showSnackbar(R.string.openpgp_messages_found,
400							R.string.decrypt, clickToDecryptListener);
401				}
402
403				@Override
404				public void success(Message message) {
405					activity.xmppConnectionService.databaseBackend
406							.updateMessage(message);
407					updateMessages();
408				}
409
410				@Override
411				public void error(int error, Message message) {
412					message.setEncryption(Message.ENCRYPTION_DECRYPTION_FAILED);
413					// updateMessages();
414				}
415			});
416		}
417	}
418
419	public void updateMessages() {
420		if (getView() == null) {
421			return;
422		}
423		hideSnackbar();
424		final ConversationActivity activity = (ConversationActivity) getActivity();
425		if (this.conversation != null) {
426			final Contact contact = this.conversation.getContact();
427			if (this.conversation.isMuted()) {
428				showSnackbar(R.string.notifications_disabled, R.string.enable,
429						new OnClickListener() {
430
431							@Override
432							public void onClick(View v) {
433								conversation.setMutedTill(0);
434								updateMessages();
435							}
436						});
437			} else if (!contact.showInRoster()
438					&& contact
439							.getOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST)) {
440				showSnackbar(R.string.contact_added_you, R.string.add_back,
441						new OnClickListener() {
442
443							@Override
444							public void onClick(View v) {
445								activity.xmppConnectionService
446										.createContact(contact);
447								activity.switchToContactDetails(contact);
448							}
449						});
450			}
451			for (Message message : this.conversation.getMessages()) {
452				if ((message.getEncryption() == Message.ENCRYPTION_PGP)
453						&& ((message.getStatus() == Message.STATUS_RECEIVED) || (message
454								.getStatus() == Message.STATUS_SEND))) {
455					decryptMessage(message);
456					break;
457				}
458			}
459			this.messageList.clear();
460			if (this.conversation.getMessages().size() == 0) {
461				messagesLoaded = false;
462			} else {
463				this.messageList.addAll(this.conversation.getMessages());
464				messagesLoaded = true;
465				updateStatusMessages();
466			}
467			this.messageListAdapter.notifyDataSetChanged();
468			if (conversation.getMode() == Conversation.MODE_SINGLE) {
469				if (messageList.size() >= 1) {
470					makeFingerprintWarning(conversation.getLatestEncryption());
471				}
472			} else {
473				if (!conversation.getMucOptions().online()
474						&& conversation.getAccount().getStatus() == Account.STATUS_ONLINE) {
475					int error = conversation.getMucOptions().getError();
476					switch (error) {
477					case MucOptions.ERROR_NICK_IN_USE:
478						showSnackbar(R.string.nick_in_use, R.string.edit,
479								clickToMuc);
480						break;
481					case MucOptions.ERROR_ROOM_NOT_FOUND:
482						showSnackbar(R.string.conference_not_found,
483								R.string.leave, leaveMuc);
484						break;
485					case MucOptions.ERROR_PASSWORD_REQUIRED:
486						showSnackbar(R.string.conference_requires_password,
487								R.string.enter_password, enterPassword);
488						break;
489					default:
490						break;
491					}
492				}
493			}
494			getActivity().invalidateOptionsMenu();
495			updateChatMsgHint();
496			if (!activity.shouldPaneBeOpen()) {
497				activity.xmppConnectionService.markRead(conversation);
498				activity.updateConversationList();
499			}
500			this.updateSendButton();
501		}
502	}
503
504	private void messageSent() {
505		int size = this.messageList.size();
506		if (size >= 1 && this.messagesView.getLastVisiblePosition() != size - 1) {
507			messagesView.setSelection(size - 1);
508		}
509		mEditMessage.setText("");
510		updateChatMsgHint();
511	}
512
513	public void updateSendButton() {
514		Conversation c = this.conversation;
515		if (activity.useSendButtonToIndicateStatus() && c != null
516				&& c.getAccount().getStatus() == Account.STATUS_ONLINE) {
517			if (c.getMode() == Conversation.MODE_SINGLE) {
518				switch (c.getContact().getMostAvailableStatus()) {
519				case Presences.CHAT:
520					this.mSendButton
521							.setImageResource(R.drawable.ic_action_send_now_online);
522					break;
523				case Presences.ONLINE:
524					this.mSendButton
525							.setImageResource(R.drawable.ic_action_send_now_online);
526					break;
527				case Presences.AWAY:
528					this.mSendButton
529							.setImageResource(R.drawable.ic_action_send_now_away);
530					break;
531				case Presences.XA:
532					this.mSendButton
533							.setImageResource(R.drawable.ic_action_send_now_away);
534					break;
535				case Presences.DND:
536					this.mSendButton
537							.setImageResource(R.drawable.ic_action_send_now_dnd);
538					break;
539				default:
540					this.mSendButton
541							.setImageResource(R.drawable.ic_action_send_now_offline);
542					break;
543				}
544			} else if (c.getMode() == Conversation.MODE_MULTI) {
545				if (c.getMucOptions().online()) {
546					this.mSendButton
547							.setImageResource(R.drawable.ic_action_send_now_online);
548				} else {
549					this.mSendButton
550							.setImageResource(R.drawable.ic_action_send_now_offline);
551				}
552			} else {
553				this.mSendButton
554						.setImageResource(R.drawable.ic_action_send_now_offline);
555			}
556		} else {
557			this.mSendButton
558					.setImageResource(R.drawable.ic_action_send_now_offline);
559		}
560	}
561
562	protected void updateStatusMessages() {
563		if (conversation.getMode() == Conversation.MODE_SINGLE) {
564			for (int i = this.messageList.size() - 1; i >= 0; --i) {
565				if (this.messageList.get(i).getStatus() == Message.STATUS_RECEIVED) {
566					return;
567				} else {
568					if (this.messageList.get(i).getStatus() == Message.STATUS_SEND_DISPLAYED) {
569						this.messageList.add(i + 1,
570								Message.createStatusMessage(conversation));
571						return;
572					}
573				}
574			}
575		}
576	}
577
578	protected void makeFingerprintWarning(int latestEncryption) {
579		Set<String> knownFingerprints = conversation.getContact()
580				.getOtrFingerprints();
581		if ((latestEncryption == Message.ENCRYPTION_OTR)
582				&& (conversation.hasValidOtrSession()
583						&& (!conversation.isMuted())
584						&& (conversation.getOtrSession().getSessionStatus() == SessionStatus.ENCRYPTED) && (!knownFingerprints
585							.contains(conversation.getOtrFingerprint())))) {
586			showSnackbar(R.string.unknown_otr_fingerprint, R.string.verify,
587					new OnClickListener() {
588
589						@Override
590						public void onClick(View v) {
591							if (conversation.getOtrFingerprint() != null) {
592								AlertDialog dialog = UIHelper
593										.getVerifyFingerprintDialog(
594												(ConversationActivity) getActivity(),
595												conversation, snackbar);
596								dialog.show();
597							}
598						}
599					});
600		}
601	}
602
603	protected void showSnackbar(int message, int action,
604			OnClickListener clickListener) {
605		snackbar.setVisibility(View.VISIBLE);
606		snackbar.setOnClickListener(null);
607		snackbarMessage.setText(message);
608		snackbarMessage.setOnClickListener(null);
609		snackbarAction.setText(action);
610		snackbarAction.setOnClickListener(clickListener);
611	}
612
613	protected void hideSnackbar() {
614		snackbar.setVisibility(View.GONE);
615	}
616
617	protected void sendPlainTextMessage(Message message) {
618		ConversationActivity activity = (ConversationActivity) getActivity();
619		activity.xmppConnectionService.sendMessage(message);
620		messageSent();
621	}
622
623	protected void sendPgpMessage(final Message message) {
624		final ConversationActivity activity = (ConversationActivity) getActivity();
625		final XmppConnectionService xmppService = activity.xmppConnectionService;
626		final Contact contact = message.getConversation().getContact();
627		if (activity.hasPgp()) {
628			if (conversation.getMode() == Conversation.MODE_SINGLE) {
629				if (contact.getPgpKeyId() != 0) {
630					xmppService.getPgpEngine().hasKey(contact,
631							new UiCallback<Contact>() {
632
633								@Override
634								public void userInputRequried(PendingIntent pi,
635										Contact contact) {
636									activity.runIntent(
637											pi,
638											ConversationActivity.REQUEST_ENCRYPT_MESSAGE);
639								}
640
641								@Override
642								public void success(Contact contact) {
643									messageSent();
644									activity.encryptTextMessage(message);
645								}
646
647								@Override
648								public void error(int error, Contact contact) {
649
650								}
651							});
652
653				} else {
654					showNoPGPKeyDialog(false,
655							new DialogInterface.OnClickListener() {
656
657								@Override
658								public void onClick(DialogInterface dialog,
659										int which) {
660									conversation
661											.setNextEncryption(Message.ENCRYPTION_NONE);
662									xmppService.databaseBackend
663											.updateConversation(conversation);
664									message.setEncryption(Message.ENCRYPTION_NONE);
665									xmppService.sendMessage(message);
666									messageSent();
667								}
668							});
669				}
670			} else {
671				if (conversation.getMucOptions().pgpKeysInUse()) {
672					if (!conversation.getMucOptions().everybodyHasKeys()) {
673						Toast warning = Toast
674								.makeText(getActivity(),
675										R.string.missing_public_keys,
676										Toast.LENGTH_LONG);
677						warning.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
678						warning.show();
679					}
680					activity.encryptTextMessage(message);
681					messageSent();
682				} else {
683					showNoPGPKeyDialog(true,
684							new DialogInterface.OnClickListener() {
685
686								@Override
687								public void onClick(DialogInterface dialog,
688										int which) {
689									conversation
690											.setNextEncryption(Message.ENCRYPTION_NONE);
691									message.setEncryption(Message.ENCRYPTION_NONE);
692									xmppService.databaseBackend
693											.updateConversation(conversation);
694									xmppService.sendMessage(message);
695									messageSent();
696								}
697							});
698				}
699			}
700		} else {
701			activity.showInstallPgpDialog();
702		}
703	}
704
705	public void showNoPGPKeyDialog(boolean plural,
706			DialogInterface.OnClickListener listener) {
707		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
708		builder.setIconAttribute(android.R.attr.alertDialogIcon);
709		if (plural) {
710			builder.setTitle(getString(R.string.no_pgp_keys));
711			builder.setMessage(getText(R.string.contacts_have_no_pgp_keys));
712		} else {
713			builder.setTitle(getString(R.string.no_pgp_key));
714			builder.setMessage(getText(R.string.contact_has_no_pgp_key));
715		}
716		builder.setNegativeButton(getString(R.string.cancel), null);
717		builder.setPositiveButton(getString(R.string.send_unencrypted),
718				listener);
719		builder.create().show();
720	}
721
722	protected void sendOtrMessage(final Message message) {
723		final ConversationActivity activity = (ConversationActivity) getActivity();
724		final XmppConnectionService xmppService = activity.xmppConnectionService;
725		if (conversation.hasValidOtrSession()) {
726			activity.xmppConnectionService.sendMessage(message);
727			messageSent();
728		} else {
729			activity.selectPresence(message.getConversation(),
730					new OnPresenceSelected() {
731
732						@Override
733						public void onPresenceSelected() {
734							message.setPresence(conversation.getNextPresence());
735							xmppService.sendMessage(message);
736							messageSent();
737						}
738					});
739		}
740	}
741
742	public void setText(String text) {
743		this.pastedText = text;
744	}
745
746	public void clearInputField() {
747		this.mEditMessage.setText("");
748	}
749}