Fix session logic: enforce same type of encryption

Andreas Straub created

Change summary

src/main/java/eu/siacs/conversations/entities/Message.java          | 31 
src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java | 28 
2 files changed, 34 insertions(+), 25 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Message.java 🔗

@@ -709,4 +709,35 @@ public class Message extends AbstractEntity {
 		return conversation.getAccount().getAxolotlService().getFingerprintTrust(axolotlFingerprint)
 				== SQLiteAxolotlStore.Trust.TRUSTED;
 	}
+
+	private  int getPreviousEncryption() {
+		for (Message iterator = this.prev(); iterator != null; iterator = iterator.prev()){
+			if( iterator.isCarbon() || iterator.getStatus() == STATUS_RECEIVED ) {
+				continue;
+			}
+			return iterator.getEncryption();
+		}
+		return ENCRYPTION_NONE;
+	}
+
+	private int getNextEncryption() {
+		for (Message iterator = this.next(); iterator != null; iterator = iterator.next()){
+			if( iterator.isCarbon() || iterator.getStatus() == STATUS_RECEIVED ) {
+				continue;
+			}
+			return iterator.getEncryption();
+		}
+		return conversation.getNextEncryption(false);
+	}
+
+	public boolean isValidInSession() {
+		int pastEncryption = this.getPreviousEncryption();
+		int futureEncryption = this.getNextEncryption();
+
+		boolean inUnencryptedSession = pastEncryption == ENCRYPTION_NONE
+				|| futureEncryption == ENCRYPTION_NONE
+				|| pastEncryption != futureEncryption;
+
+		return inUnencryptedSession || this.getEncryption() == pastEncryption;
+	}
 }

src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java 🔗

@@ -569,32 +569,10 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 		}
 
 		if (type == RECEIVED) {
-			boolean wasEncrypted = false;
-			for (Message iterator = message.prev(); iterator != null; iterator = iterator.prev()){
-				if (iterator.getEncryption() != Message.ENCRYPTION_NONE) {
-					wasEncrypted = true;
-					break;
-				}
-				if (!iterator.isCarbon() && iterator.getType() == SENT) {
-					break;
-				}
-			}
-			boolean willBeEncrypted = conversation.getNextEncryption(false) != Message.ENCRYPTION_NONE;
-			for (Message iterator = message.next(); iterator != null; iterator = iterator.next()){
-				if (iterator.getEncryption() != Message.ENCRYPTION_NONE) {
-					willBeEncrypted = true;
-					break;
-				}
-				if (!iterator.isCarbon() && iterator.getType() == SENT) {
-					break;
-				}
-			}
-
-			if ( willBeEncrypted && wasEncrypted
-					&& message.getEncryption() == Message.ENCRYPTION_NONE) {
-				viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received_warning);
-			} else {
+			if(message.isValidInSession()) {
 				viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received);
+			} else {
+				viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received_warning);
 			}
 		}