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