aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/eu/siacs/conversations/ui/ConversationFragment.java')
-rw-r--r--src/main/java/eu/siacs/conversations/ui/ConversationFragment.java209
1 files changed, 109 insertions, 100 deletions
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
index 8754b9537..0742e17e3 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
@@ -35,7 +35,6 @@ import net.java.otr4j.session.SessionStatus;
import java.util.ArrayList;
import java.util.List;
-import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
import eu.siacs.conversations.R;
@@ -43,6 +42,9 @@ import eu.siacs.conversations.crypto.PgpEngine;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Conversation;
+import eu.siacs.conversations.entities.Downloadable;
+import eu.siacs.conversations.entities.DownloadableFile;
+import eu.siacs.conversations.entities.DownloadablePlaceholder;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.entities.MucOptions;
import eu.siacs.conversations.entities.Presences;
@@ -53,7 +55,7 @@ import eu.siacs.conversations.ui.XmppActivity.OnValueEdited;
import eu.siacs.conversations.ui.adapter.MessageAdapter;
import eu.siacs.conversations.ui.adapter.MessageAdapter.OnContactPictureClicked;
import eu.siacs.conversations.ui.adapter.MessageAdapter.OnContactPictureLongClicked;
-import eu.siacs.conversations.utils.UIHelper;
+import eu.siacs.conversations.xmpp.jid.Jid;
public class ConversationFragment extends Fragment {
@@ -92,11 +94,9 @@ public class ConversationFragment extends Fragment {
}
};
protected ListView messagesView;
- protected LayoutInflater inflater;
- protected List<Message> messageList = new ArrayList<Message>();
+ protected List<Message> messageList = new ArrayList<>();
protected MessageAdapter messageListAdapter;
protected Contact contact;
- protected String queuedPqpMessage = null;
private EditMessage mEditMessage;
private ImageButton mSendButton;
private RelativeLayout snackbar;
@@ -147,7 +147,20 @@ public class ConversationFragment extends Fragment {
}
}
};
- private ConcurrentLinkedQueue<Message> mEncryptedMessages = new ConcurrentLinkedQueue<Message>();
+ protected OnClickListener clickToVerify = new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ if (conversation.getOtrFingerprint() != null) {
+ Intent intent = new Intent(getActivity(), VerifyOTRActivity.class);
+ intent.setAction(VerifyOTRActivity.ACTION_VERIFY_CONTACT);
+ intent.putExtra("contact", conversation.getContact().getJid().toBareJid().toString());
+ intent.putExtra("account", conversation.getAccount().getJid().toBareJid().toString());
+ startActivity(intent);
+ }
+ }
+ };
+ private ConcurrentLinkedQueue<Message> mEncryptedMessages = new ConcurrentLinkedQueue<>();
private boolean mDecryptJobRunning = false;
private OnEditorActionListener mEditorActionListener = new OnEditorActionListener() {
@@ -191,7 +204,7 @@ public class ConversationFragment extends Fragment {
}
if (mEditMessage.getText().length() < 1) {
if (this.conversation.getMode() == Conversation.MODE_MULTI) {
- conversation.setNextPresence(null);
+ conversation.setNextCounterpart(null);
updateChatMsgHint();
}
return;
@@ -200,10 +213,10 @@ public class ConversationFragment extends Fragment {
.toString(), conversation.getNextEncryption(activity
.forceEncryption()));
if (conversation.getMode() == Conversation.MODE_MULTI) {
- if (conversation.getNextPresence() != null) {
- message.setPresence(conversation.getNextPresence());
+ if (conversation.getNextCounterpart() != null) {
+ message.setCounterpart(conversation.getNextCounterpart());
message.setType(Message.TYPE_PRIVATE);
- conversation.setNextPresence(null);
+ conversation.setNextCounterpart(null);
}
}
if (conversation.getNextEncryption(activity.forceEncryption()) == Message.ENCRYPTION_OTR) {
@@ -217,10 +230,10 @@ public class ConversationFragment extends Fragment {
public void updateChatMsgHint() {
if (conversation.getMode() == Conversation.MODE_MULTI
- && conversation.getNextPresence() != null) {
+ && conversation.getNextCounterpart() != null) {
this.mEditMessage.setHint(getString(
R.string.send_private_message_to,
- conversation.getNextPresence()));
+ conversation.getNextCounterpart().getResourcepart()));
} else {
switch (conversation.getNextEncryption(activity.forceEncryption())) {
case Message.ENCRYPTION_NONE:
@@ -280,11 +293,12 @@ public class ConversationFragment extends Fragment {
public void onContactPictureClicked(Message message) {
if (message.getStatus() <= Message.STATUS_RECEIVED) {
if (message.getConversation().getMode() == Conversation.MODE_MULTI) {
- if (message.getPresence() != null) {
- highlightInConference(message.getPresence());
- } else {
- highlightInConference(message
- .getCounterpart());
+ if (message.getCounterpart() != null) {
+ if (!message.getCounterpart().isBareJid()) {
+ highlightInConference(message.getCounterpart().getResourcepart());
+ } else {
+ highlightInConference(message.getCounterpart().toString());
+ }
}
} else {
Contact contact = message.getConversation()
@@ -296,10 +310,10 @@ public class ConversationFragment extends Fragment {
.getConversation());
}
}
- } else {
+ } else {
Account account = message.getConversation().getAccount();
Intent intent = new Intent(activity, EditAccountActivity.class);
- intent.putExtra("jid", account.getJid());
+ intent.putExtra("jid", account.getJid().toBareJid().toString());
startActivity(intent);
}
}
@@ -311,9 +325,7 @@ public class ConversationFragment extends Fragment {
public void onContactPictureLongClicked(Message message) {
if (message.getStatus() <= Message.STATUS_RECEIVED) {
if (message.getConversation().getMode() == Conversation.MODE_MULTI) {
- if (message.getPresence() != null) {
- privateMessageWith(message.getPresence());
- } else {
+ if (message.getCounterpart() != null) {
privateMessageWith(message.getCounterpart());
}
}
@@ -345,6 +357,7 @@ public class ConversationFragment extends Fragment {
MenuItem sendAgain = menu.findItem(R.id.send_again);
MenuItem copyUrl = menu.findItem(R.id.copy_url);
MenuItem downloadImage = menu.findItem(R.id.download_image);
+ MenuItem cancelTransmission = menu.findItem(R.id.cancel_transmission);
if (this.selectedMessage.getType() != Message.TYPE_TEXT
|| this.selectedMessage.getDownloadable() != null) {
copyText.setVisible(false);
@@ -361,12 +374,15 @@ public class ConversationFragment extends Fragment {
|| this.selectedMessage.getImageParams().url == null) {
copyUrl.setVisible(false);
}
-
if (this.selectedMessage.getType() != Message.TYPE_TEXT
|| this.selectedMessage.getDownloadable() != null
|| !this.selectedMessage.bodyContainsDownloadable()) {
downloadImage.setVisible(false);
}
+ if (this.selectedMessage.getDownloadable() == null
+ || this.selectedMessage.getDownloadable() instanceof DownloadablePlaceholder) {
+ cancelTransmission.setVisible(false);
+ }
}
}
@@ -388,6 +404,9 @@ public class ConversationFragment extends Fragment {
case R.id.download_image:
downloadImage(selectedMessage);
return true;
+ case R.id.cancel_transmission:
+ cancelTransmission(selectedMessage);
+ return true;
default:
return super.onContextItemSelected(item);
}
@@ -414,6 +433,14 @@ public class ConversationFragment extends Fragment {
}
private void resendMessage(Message message) {
+ if (message.getType() == Message.TYPE_FILE || message.getType() == Message.TYPE_IMAGE) {
+ DownloadableFile file = activity.xmppConnectionService.getFileBackend().getFile(message);
+ if (!file.exists()) {
+ Toast.makeText(activity,R.string.file_deleted,Toast.LENGTH_SHORT).show();
+ message.setDownloadable(new DownloadablePlaceholder(Downloadable.STATUS_DELETED));
+ return;
+ }
+ }
activity.xmppConnectionService.resendFailedMessages(message);
}
@@ -430,9 +457,16 @@ public class ConversationFragment extends Fragment {
.createNewConnection(message);
}
- protected void privateMessageWith(String counterpart) {
+ private void cancelTransmission(Message message) {
+ Downloadable downloadable = message.getDownloadable();
+ if (downloadable!=null) {
+ downloadable.cancel();
+ }
+ }
+
+ protected void privateMessageWith(final Jid counterpart) {
this.mEditMessage.setText("");
- this.conversation.setNextPresence(counterpart);
+ this.conversation.setNextCounterpart(counterpart);
updateChatMsgHint();
}
@@ -466,7 +500,7 @@ public class ConversationFragment extends Fragment {
this.activity = (ConversationActivity) getActivity();
this.conversation = conversation;
if (this.conversation.getMode() == Conversation.MODE_MULTI) {
- this.conversation.setNextPresence(null);
+ this.conversation.setNextCounterpart(null);
}
this.mEditMessage.setText("");
this.mEditMessage.append(this.conversation.getNextMessage());
@@ -507,6 +541,39 @@ public class ConversationFragment extends Fragment {
activity.switchToContactDetails(contact);
}
});
+ } else if (conversation.getMode() == Conversation.MODE_SINGLE) {
+ makeFingerprintWarning();
+ } else if (!conversation.getMucOptions().online()
+ && conversation.getAccount().getStatus() == Account.State.ONLINE) {
+ int error = conversation.getMucOptions().getError();
+ switch (error) {
+ case MucOptions.ERROR_NICK_IN_USE:
+ showSnackbar(R.string.nick_in_use, R.string.edit,
+ clickToMuc);
+ break;
+ case MucOptions.ERROR_ROOM_NOT_FOUND:
+ showSnackbar(R.string.conference_not_found,
+ R.string.leave, leaveMuc);
+ break;
+ case MucOptions.ERROR_PASSWORD_REQUIRED:
+ showSnackbar(R.string.conference_requires_password,
+ R.string.enter_password, enterPassword);
+ break;
+ case MucOptions.ERROR_BANNED:
+ showSnackbar(R.string.conference_banned,
+ R.string.leave, leaveMuc);
+ break;
+ case MucOptions.ERROR_MEMBERS_ONLY:
+ showSnackbar(R.string.conference_members_only,
+ R.string.leave, leaveMuc);
+ break;
+ case MucOptions.KICKED_FROM_ROOM:
+ showSnackbar(R.string.conference_kicked, R.string.join,
+ joinMuc);
+ break;
+ default:
+ break;
+ }
}
for (Message message : this.conversation.getMessages()) {
if (message.getEncryption() == Message.ENCRYPTION_PGP
@@ -528,44 +595,6 @@ public class ConversationFragment extends Fragment {
updateStatusMessages();
}
this.messageListAdapter.notifyDataSetChanged();
- if (conversation.getMode() == Conversation.MODE_SINGLE) {
- if (messageList.size() >= 1) {
- makeFingerprintWarning();
- }
- } else {
- if (!conversation.getMucOptions().online()
- && conversation.getAccount().getStatus() == Account.STATUS_ONLINE) {
- int error = conversation.getMucOptions().getError();
- switch (error) {
- case MucOptions.ERROR_NICK_IN_USE:
- showSnackbar(R.string.nick_in_use, R.string.edit,
- clickToMuc);
- break;
- case MucOptions.ERROR_ROOM_NOT_FOUND:
- showSnackbar(R.string.conference_not_found,
- R.string.leave, leaveMuc);
- break;
- case MucOptions.ERROR_PASSWORD_REQUIRED:
- showSnackbar(R.string.conference_requires_password,
- R.string.enter_password, enterPassword);
- break;
- case MucOptions.ERROR_BANNED:
- showSnackbar(R.string.conference_banned,
- R.string.leave, leaveMuc);
- break;
- case MucOptions.ERROR_MEMBERS_ONLY:
- showSnackbar(R.string.conference_members_only,
- R.string.leave, leaveMuc);
- break;
- case MucOptions.KICKED_FROM_ROOM:
- showSnackbar(R.string.conference_kicked, R.string.join,
- joinMuc);
- break;
- default:
- break;
- }
- }
- }
updateChatMsgHint();
if (!activity.isConversationsOverviewVisable() || !activity.isConversationsOverviewHideable()) {
activity.xmppConnectionService.markRead(conversation, true);
@@ -619,7 +648,7 @@ public class ConversationFragment extends Fragment {
public void updateSendButton() {
Conversation c = this.conversation;
if (activity.useSendButtonToIndicateStatus() && c != null
- && c.getAccount().getStatus() == Account.STATUS_ONLINE) {
+ && c.getAccount().getStatus() == Account.State.ONLINE) {
if (c.getMode() == Conversation.MODE_SINGLE) {
switch (c.getContact().getMostAvailableStatus()) {
case Presences.CHAT:
@@ -682,26 +711,11 @@ public class ConversationFragment extends Fragment {
}
protected void makeFingerprintWarning() {
- Set<String> knownFingerprints = conversation.getContact()
- .getOtrFingerprints();
- if (conversation.hasValidOtrSession()
- && (!conversation.isMuted())
- && (conversation.getOtrSession().getSessionStatus() == SessionStatus.ENCRYPTED) && (!knownFingerprints
- .contains(conversation.getOtrFingerprint()))) {
- showSnackbar(R.string.unknown_otr_fingerprint, R.string.verify,
- new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- if (conversation.getOtrFingerprint() != null) {
- AlertDialog dialog = UIHelper
- .getVerifyFingerprintDialog(
- (ConversationActivity) getActivity(),
- conversation, snackbar);
- dialog.show();
- }
- }
- });
+ if (conversation.smpRequested()) {
+ showSnackbar(R.string.smp_requested, R.string.verify, clickToVerify);
+ } else if (conversation.hasValidOtrSession() && (conversation.getOtrSession().getSessionStatus() == SessionStatus.ENCRYPTED)
+ && (!conversation.isOtrFingerprintVerified())) {
+ showSnackbar(R.string.unknown_otr_fingerprint, R.string.verify, clickToVerify);
}
}
@@ -827,21 +841,16 @@ public class ConversationFragment extends Fragment {
protected void sendOtrMessage(final Message message) {
final ConversationActivity activity = (ConversationActivity) getActivity();
final XmppConnectionService xmppService = activity.xmppConnectionService;
- if (conversation.hasValidOtrSession()) {
- activity.xmppConnectionService.sendMessage(message);
- messageSent();
- } else {
- activity.selectPresence(message.getConversation(),
- new OnPresenceSelected() {
-
- @Override
- public void onPresenceSelected() {
- message.setPresence(conversation.getNextPresence());
- xmppService.sendMessage(message);
- messageSent();
- }
- });
- }
+ activity.selectPresence(message.getConversation(),
+ new OnPresenceSelected() {
+
+ @Override
+ public void onPresenceSelected() {
+ message.setCounterpart(conversation.getNextCounterpart());
+ xmppService.sendMessage(message);
+ messageSent();
+ }
+ });
}
public void appendText(String text) {