refactored sendMessage and merged with resendMessage
This commit is contained in:
		
							parent
							
								
									148955a713
								
							
						
					
					
						commit
						bef731a3c8
					
				| @ -435,6 +435,26 @@ public class Message extends AbstractEntity { | ||||
| 		return (status > STATUS_RECEIVED || (contact != null && contact.trusted())); | ||||
| 	} | ||||
| 
 | ||||
| 	public boolean fixCounterpart() { | ||||
| 		Presences presences = conversation.getContact().getPresences(); | ||||
| 		if (counterpart != null && presences.has(counterpart.getResourcepart())) { | ||||
| 			return true; | ||||
| 		} else if (presences.size() >= 1) { | ||||
| 			try { | ||||
| 				counterpart = Jid.fromParts(conversation.getJid().getLocalpart(), | ||||
| 						conversation.getJid().getDomainpart(), | ||||
| 						presences.asStringArray()[0]); | ||||
| 				return true; | ||||
| 			} catch (InvalidJidException e) { | ||||
| 				counterpart = null; | ||||
| 				return false; | ||||
| 			} | ||||
| 		} else { | ||||
| 			counterpart = null; | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public enum Decision { | ||||
| 		MUST, | ||||
| 		SHOULD, | ||||
|  | ||||
| @ -28,6 +28,7 @@ import android.util.LruCache; | ||||
| import net.java.otr4j.OtrException; | ||||
| import net.java.otr4j.session.Session; | ||||
| import net.java.otr4j.session.SessionID; | ||||
| import net.java.otr4j.session.SessionImpl; | ||||
| import net.java.otr4j.session.SessionStatus; | ||||
| 
 | ||||
| import org.openintents.openpgp.util.OpenPgpApi; | ||||
| @ -684,51 +685,18 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa | ||||
| 	} | ||||
| 
 | ||||
| 	public void sendMessage(final Message message) { | ||||
| 		sendMessage(message,false); | ||||
| 	} | ||||
| 
 | ||||
| 	private void sendMessage(final Message message, final boolean resend) { | ||||
| 		final Account account = message.getConversation().getAccount(); | ||||
| 		final Conversation conversation = message.getConversation(); | ||||
| 		account.deactivateGracePeriod(); | ||||
| 		final Conversation conv = message.getConversation(); | ||||
| 		MessagePacket packet = null; | ||||
| 		boolean saveInDb = true; | ||||
| 		boolean send = false; | ||||
| 		if (account.getStatus() == Account.State.ONLINE | ||||
| 				&& account.getXmppConnection() != null) { | ||||
| 			if (message.needsUploading()) { | ||||
| 				if (message.getCounterpart() != null || account.httpUploadAvailable()) { | ||||
| 					if (message.getEncryption() == Message.ENCRYPTION_OTR) { | ||||
| 						if (!conv.hasValidOtrSession()) { | ||||
| 							conv.startOtrSession(message.getCounterpart().getResourcepart(),true); | ||||
| 		message.setStatus(Message.STATUS_WAITING); | ||||
| 						} else if (conv.hasValidOtrSession() | ||||
| 								&& conv.getOtrSession().getSessionStatus() == SessionStatus.ENCRYPTED) { | ||||
| 							mJingleConnectionManager.createNewConnection(message); | ||||
| 						} | ||||
| 					} else { | ||||
| 						this.sendFileMessage(message); | ||||
| 
 | ||||
| 					} | ||||
| 				} else { | ||||
| 					if (message.getEncryption() == Message.ENCRYPTION_OTR) { | ||||
| 						conv.startOtrIfNeeded(); | ||||
| 					} | ||||
| 					message.setStatus(Message.STATUS_WAITING); | ||||
| 				} | ||||
| 			} else { | ||||
| 				if (message.getEncryption() == Message.ENCRYPTION_OTR) { | ||||
| 					if (!conv.hasValidOtrSession() && (message.getCounterpart() != null)) { | ||||
| 						conv.startOtrSession(message.getCounterpart().getResourcepart(), true); | ||||
| 						message.setStatus(Message.STATUS_WAITING); | ||||
| 					} else if (conv.hasValidOtrSession()) { | ||||
| 						if (conv.getOtrSession().getSessionStatus() == SessionStatus.ENCRYPTED) { | ||||
| 							packet = mMessageGenerator.generateOtrChat(message); | ||||
| 							send = true; | ||||
| 						} else { | ||||
| 							message.setStatus(Message.STATUS_WAITING); | ||||
| 							conv.startOtrIfNeeded(); | ||||
| 						} | ||||
| 					} else { | ||||
| 						message.setStatus(Message.STATUS_WAITING); | ||||
| 					} | ||||
| 				} else if (message.getEncryption() == Message.ENCRYPTION_DECRYPTED) { | ||||
| 		if (!resend && message.getEncryption() != Message.ENCRYPTION_OTR) { | ||||
| 			message.getConversation().endOtrIfNeeded(); | ||||
| 			message.getConversation().findUnsentMessagesWithOtrEncryption(new Conversation.OnMessageFound() { | ||||
| 				@Override | ||||
| @ -736,28 +704,66 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa | ||||
| 					markMessage(message,Message.STATUS_SEND_FAILED); | ||||
| 				} | ||||
| 			}); | ||||
| 					packet = mMessageGenerator.generatePgpChat(message); | ||||
| 					send = true; | ||||
| 		} | ||||
| 
 | ||||
| 		if (account.isOnlineAndConnected()) { | ||||
| 			switch (message.getEncryption()) { | ||||
| 				case Message.ENCRYPTION_NONE: | ||||
| 					if (message.needsUploading()) { | ||||
| 						if (account.httpUploadAvailable() || message.fixCounterpart()) { | ||||
| 							this.sendFileMessage(message); | ||||
| 						} else { | ||||
| 					message.getConversation().endOtrIfNeeded(); | ||||
| 					message.getConversation().findUnsentMessagesWithOtrEncryption(new Conversation.OnMessageFound() { | ||||
| 						@Override | ||||
| 						public void onMessageFound(Message message) { | ||||
| 							markMessage(message,Message.STATUS_SEND_FAILED); | ||||
| 							break; | ||||
| 						} | ||||
| 					}); | ||||
| 					packet = mMessageGenerator.generateChat(message); | ||||
| 					send = true; | ||||
| 					} else { | ||||
| 						packet = mMessageGenerator.generateChat(message,resend); | ||||
| 					} | ||||
| 					break; | ||||
| 				case Message.ENCRYPTION_PGP: | ||||
| 				case Message.ENCRYPTION_DECRYPTED: | ||||
| 					if (message.needsUploading()) { | ||||
| 						if (account.httpUploadAvailable() || message.fixCounterpart()) { | ||||
| 							this.sendFileMessage(message); | ||||
| 						} else { | ||||
| 							break; | ||||
| 						} | ||||
| 					} else { | ||||
| 						packet = mMessageGenerator.generatePgpChat(message,resend); | ||||
| 					} | ||||
| 					break; | ||||
| 				case Message.ENCRYPTION_OTR: | ||||
| 					SessionImpl otrSession = conversation.getOtrSession(); | ||||
| 					if (otrSession != null && otrSession.getSessionStatus() == SessionStatus.ENCRYPTED) { | ||||
| 						try { | ||||
| 							message.setCounterpart(Jid.fromSessionID(otrSession.getSessionID())); | ||||
| 						} catch (InvalidJidException e) { | ||||
| 							break; | ||||
| 						} | ||||
| 						if (message.needsUploading()) { | ||||
| 							mJingleConnectionManager.createNewConnection(message); | ||||
| 						} else { | ||||
| 							packet = mMessageGenerator.generateOtrChat(message,resend); | ||||
| 						} | ||||
| 					} else if (otrSession == null) { | ||||
| 						if (message.fixCounterpart()) { | ||||
| 							conversation.startOtrSession(message.getCounterpart().getResourcepart(), true); | ||||
| 						} else { | ||||
| 							break; | ||||
| 						} | ||||
| 					} | ||||
| 			if (!account.getXmppConnection().getFeatures().sm() | ||||
| 					&& conv.getMode() != Conversation.MODE_MULTI) { | ||||
| 					break; | ||||
| 			} | ||||
| 			if (packet != null) { | ||||
| 				if (account.getXmppConnection().getFeatures().sm() || conversation.getMode() == Conversation.MODE_MULTI) { | ||||
| 					message.setStatus(Message.STATUS_UNSEND); | ||||
| 				} else { | ||||
| 					message.setStatus(Message.STATUS_SEND); | ||||
| 				} | ||||
| 			} | ||||
| 		} else { | ||||
| 			message.setStatus(Message.STATUS_WAITING); | ||||
| 			if (message.getType() == Message.TYPE_TEXT) { | ||||
| 				if (message.getEncryption() == Message.ENCRYPTION_DECRYPTED) { | ||||
| 			switch(message.getEncryption()) { | ||||
| 				case Message.ENCRYPTION_DECRYPTED: | ||||
| 					if (!message.needsUploading()) { | ||||
| 						String pgpBody = message.getEncryptedBody(); | ||||
| 						String decryptedBody = message.getBody(); | ||||
| 						message.setBody(pgpBody); | ||||
| @ -766,31 +772,39 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa | ||||
| 						saveInDb = false; | ||||
| 						message.setBody(decryptedBody); | ||||
| 						message.setEncryption(Message.ENCRYPTION_DECRYPTED); | ||||
| 				} else if (message.getEncryption() == Message.ENCRYPTION_OTR) { | ||||
| 					if (!conv.hasValidOtrSession() | ||||
| 							&& message.getCounterpart() != null) { | ||||
| 						conv.startOtrSession(message.getCounterpart().getResourcepart(), false); | ||||
| 					} | ||||
| 					break; | ||||
| 				case Message.ENCRYPTION_OTR: | ||||
| 					if (!conversation.hasValidOtrSession() && message.getCounterpart() != null) { | ||||
| 						conversation.startOtrSession(message.getCounterpart().getResourcepart(), false); | ||||
| 					} | ||||
| 					break; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (resend) { | ||||
| 			if (packet != null) { | ||||
| 				if (account.getXmppConnection().getFeatures().sm() || conversation.getMode() == Conversation.MODE_MULTI) { | ||||
| 					markMessage(message,Message.STATUS_UNSEND); | ||||
| 				} else { | ||||
| 					markMessage(message,Message.STATUS_SEND); | ||||
| 				} | ||||
| 		conv.add(message); | ||||
| 		if (saveInDb) { | ||||
| 			if (message.getEncryption() == Message.ENCRYPTION_NONE | ||||
| 					|| saveEncryptedMessages()) { | ||||
| 			} | ||||
| 		} else { | ||||
| 			conversation.add(message); | ||||
| 			if (saveInDb && (message.getEncryption() == Message.ENCRYPTION_NONE || saveEncryptedMessages())) { | ||||
| 				databaseBackend.createMessage(message); | ||||
| 			} | ||||
| 			updateConversationUi(); | ||||
| 		} | ||||
| 		if ((send) && (packet != null)) { | ||||
| 			if (conv.setOutgoingChatState(Config.DEFAULT_CHATSTATE)) { | ||||
| 		if (packet != null) { | ||||
| 			if (conversation.setOutgoingChatState(Config.DEFAULT_CHATSTATE)) { | ||||
| 				if (this.sendChatStates()) { | ||||
| 					packet.addChild(ChatState.toElement(conv.getOutgoingChatState())); | ||||
| 					packet.addChild(ChatState.toElement(conversation.getOutgoingChatState())); | ||||
| 				} | ||||
| 			} | ||||
| 			sendMessagePacket(account, packet); | ||||
| 		} | ||||
| 		updateConversationUi(); | ||||
| 	} | ||||
| 
 | ||||
| 	private void sendUnsentMessages(final Conversation conversation) { | ||||
| @ -804,72 +818,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa | ||||
| 	} | ||||
| 
 | ||||
| 	public void resendMessage(final Message message) { | ||||
| 		Account account = message.getConversation().getAccount(); | ||||
| 		MessagePacket packet = null; | ||||
| 		if (message.getEncryption() == Message.ENCRYPTION_OTR) { | ||||
| 			Presences presences = message.getConversation().getContact().getPresences(); | ||||
| 			if (!message.getConversation().hasValidOtrSession()) { | ||||
| 				if ((message.getCounterpart() != null) | ||||
| 						&& (presences.has(message.getCounterpart().getResourcepart()))) { | ||||
| 					message.getConversation().startOtrSession(message.getCounterpart().getResourcepart(), true); | ||||
| 				} else { | ||||
| 					if (presences.size() == 1) { | ||||
| 						String presence = presences.asStringArray()[0]; | ||||
| 						message.getConversation().startOtrSession(presence, true); | ||||
| 					} | ||||
| 				} | ||||
| 			} else { | ||||
| 				if (message.getConversation().getOtrSession().getSessionStatus() == SessionStatus.ENCRYPTED) { | ||||
| 					try { | ||||
| 						message.setCounterpart(Jid.fromSessionID(message.getConversation().getOtrSession().getSessionID())); | ||||
| 						if (message.needsUploading()) { | ||||
| 							mJingleConnectionManager.createNewConnection(message); | ||||
| 						} else { | ||||
| 							packet = mMessageGenerator.generateOtrChat(message, true); | ||||
| 						} | ||||
| 					} catch (final InvalidJidException ignored) { | ||||
| 
 | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} else if (message.needsUploading()) { | ||||
| 			Contact contact = message.getConversation().getContact(); | ||||
| 			Presences presences = contact.getPresences(); | ||||
| 			if (account.httpUploadAvailable() || (message.getCounterpart() != null && presences.has(message.getCounterpart().getResourcepart()))) { | ||||
| 				this.sendFileMessage(message); | ||||
| 			} else { | ||||
| 				if (presences.size() == 1) { | ||||
| 					String presence = presences.asStringArray()[0]; | ||||
| 					try { | ||||
| 						message.setCounterpart(Jid.fromParts(contact.getJid().getLocalpart(), contact.getJid().getDomainpart(), presence)); | ||||
| 					} catch (InvalidJidException e) { | ||||
| 						return; | ||||
| 					} | ||||
| 					this.sendFileMessage(message); | ||||
| 				} | ||||
| 			} | ||||
| 		} else { | ||||
| 			if (message.getEncryption() == Message.ENCRYPTION_NONE) { | ||||
| 				packet = mMessageGenerator.generateChat(message, true); | ||||
| 			} else if ((message.getEncryption() == Message.ENCRYPTION_DECRYPTED) | ||||
| 					|| (message.getEncryption() == Message.ENCRYPTION_PGP)) { | ||||
| 				packet = mMessageGenerator.generatePgpChat(message, true); | ||||
| 			} | ||||
| 		} | ||||
| 		if (packet != null) { | ||||
| 			if (!account.getXmppConnection().getFeatures().sm() | ||||
| 					&& message.getConversation().getMode() != Conversation.MODE_MULTI) { | ||||
| 				markMessage(message, Message.STATUS_SEND); | ||||
| 			} else { | ||||
| 				markMessage(message, Message.STATUS_UNSEND); | ||||
| 			} | ||||
| 			if (message.getConversation().setOutgoingChatState(Config.DEFAULT_CHATSTATE)) { | ||||
| 				if (this.sendChatStates()) { | ||||
| 					packet.addChild(ChatState.toElement(message.getConversation().getOutgoingChatState())); | ||||
| 				} | ||||
| 			} | ||||
| 			sendMessagePacket(account, packet); | ||||
| 		} | ||||
| 		sendMessage(message,true); | ||||
| 	} | ||||
| 
 | ||||
| 	public void fetchRosterFromServer(final Account account) { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Daniel Gultsch
						Daniel Gultsch