use history clear date as minimum date for mam

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/Conversation.java          |  5 
src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java    | 28 
src/main/java/eu/siacs/conversations/services/MessageArchiveService.java | 15 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  1 
src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java      |  1 
5 files changed, 40 insertions(+), 10 deletions(-)

Detailed changes

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

@@ -53,6 +53,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
 	public static final String ATTRIBUTE_MUTED_TILL = "muted_till";
 	public static final String ATTRIBUTE_ALWAYS_NOTIFY = "always_notify";
 	public static final String ATTRIBUTE_CRYPTO_TARGETS = "crypto_targets";
+	public static final String ATTRIBUTE_LAST_CLEAR_HISTORY = "last_clear_history";
 
 	private String name;
 	private String contactUuid;
@@ -332,11 +333,11 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
 	}
 
 	public void setLastClearHistory(long time) {
-		setAttribute("last_clear_history",String.valueOf(time));
+		setAttribute(ATTRIBUTE_LAST_CLEAR_HISTORY,String.valueOf(time));
 	}
 
 	public long getLastClearHistory() {
-		return getLongAttribute("last_clear_history", 0);
+		return getLongAttribute(ATTRIBUTE_LAST_CLEAR_HISTORY, 0);
 	}
 
 	public List<Jid> getAcceptedCryptoTargets() {

src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java 🔗

@@ -11,6 +11,7 @@ import android.util.Base64;
 import android.util.Log;
 import android.util.Pair;
 
+import org.json.JSONObject;
 import org.whispersystems.libaxolotl.AxolotlAddress;
 import org.whispersystems.libaxolotl.IdentityKey;
 import org.whispersystems.libaxolotl.IdentityKeyPair;
@@ -44,6 +45,7 @@ import eu.siacs.conversations.entities.Message;
 import eu.siacs.conversations.entities.PresenceTemplate;
 import eu.siacs.conversations.entities.Roster;
 import eu.siacs.conversations.entities.ServiceDiscoveryResult;
+import eu.siacs.conversations.generator.AbstractGenerator;
 import eu.siacs.conversations.xmpp.jid.InvalidJidException;
 import eu.siacs.conversations.xmpp.jid.Jid;
 
@@ -727,21 +729,37 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 		}
 	}
 
+	public Pair<Long,String> getLastClearDate(Account account) {
+		SQLiteDatabase db = this.getReadableDatabase();
+		String[] columns = {Conversation.ATTRIBUTES};
+		String selection = Conversation.ACCOUNT + "=?";
+		String[] args = {account.getUuid()};
+		Cursor cursor = db.query(Conversation.TABLENAME,columns,selection,args,null,null,null);
+		long maxClearDate = 0;
+		while (cursor.moveToNext()) {
+			try {
+				final JSONObject jsonObject = new JSONObject(cursor.getString(0));
+				maxClearDate = Math.max(maxClearDate, jsonObject.getLong(Conversation.ATTRIBUTE_LAST_CLEAR_HISTORY));
+			} catch (Exception e) {
+				//ignored
+			}
+		}
+		cursor.close();
+		return new Pair<>(maxClearDate,null);
+	}
+
 	private Cursor getCursorForSession(Account account, AxolotlAddress contact) {
 		final SQLiteDatabase db = this.getReadableDatabase();
-		String[] columns = null;
 		String[] selectionArgs = {account.getUuid(),
 				contact.getName(),
 				Integer.toString(contact.getDeviceId())};
-		Cursor cursor = db.query(SQLiteAxolotlStore.SESSION_TABLENAME,
-				columns,
+		return db.query(SQLiteAxolotlStore.SESSION_TABLENAME,
+				null,
 				SQLiteAxolotlStore.ACCOUNT + " = ? AND "
 						+ SQLiteAxolotlStore.NAME + " = ? AND "
 						+ SQLiteAxolotlStore.DEVICE_ID + " = ? ",
 				selectionArgs,
 				null, null, null);
-
-		return cursor;
 	}
 
 	public SessionRecord loadSession(Account account, AxolotlAddress contact) {

src/main/java/eu/siacs/conversations/services/MessageArchiveService.java 🔗

@@ -45,8 +45,17 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
 				}
 			}
 		}
-		Pair<Long,String> pair = mXmppConnectionService.databaseBackend.getLastMessageReceived(account);
-		long startCatchup = pair == null ? 0 : pair.first;
+		final Pair<Long,String> lastMessageReceived = mXmppConnectionService.databaseBackend.getLastMessageReceived(account);
+		final Pair<Long,String> lastClearDate = mXmppConnectionService.databaseBackend.getLastClearDate(account);
+		long startCatchup;
+		final String reference;
+		if (lastMessageReceived != null && lastMessageReceived.first >= lastClearDate.first) {
+			startCatchup = lastMessageReceived.first;
+			reference = lastMessageReceived.second;
+		} else {
+			startCatchup = lastClearDate.first;
+			reference = null;
+		}
 		long endCatchup = account.getXmppConnection().getLastSessionEstablished();
 		final Query query;
 		if (startCatchup == 0) {
@@ -62,7 +71,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
 			query = new Query(account, startCatchup, endCatchup);
 		} else {
 			query = new Query(account, startCatchup, endCatchup);
-			query.reference = pair.second;
+			query.reference = reference;
 		}
 		this.queries.add(query);
 		this.execute(query);

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

@@ -481,6 +481,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 
 	private void loadMoreMessages(Conversation conversation) {
 		conversation.setLastClearHistory(0);
+		activity.xmppConnectionService.databaseBackend.updateConversation(conversation);
 		conversation.setHasMessagesLeftOnServer(true);
 		conversation.setFirstMamReference(null);
 		long timestamp = conversation.getLastMessageTransmitted();