diff options
author | Christian Schneppe <christian@pix-art.de> | 2017-01-29 20:06:28 +0100 |
---|---|---|
committer | Christian Schneppe <christian@pix-art.de> | 2017-01-29 20:06:28 +0100 |
commit | 475e29b622ef5c87e3a3b3a36020bf99958467cd (patch) | |
tree | 75a7df26cb66eaf5fd16ef4aab3eb50080975291 /src/main/java/de/pixart/messenger/services | |
parent | 91e6a152c066d1bcff15a9585d6830feb1a53288 (diff) |
configurable local message retention period.
Diffstat (limited to 'src/main/java/de/pixart/messenger/services')
-rw-r--r-- | src/main/java/de/pixart/messenger/services/MessageArchiveService.java | 11 | ||||
-rw-r--r-- | src/main/java/de/pixart/messenger/services/XmppConnectionService.java | 67 |
2 files changed, 61 insertions, 17 deletions
diff --git a/src/main/java/de/pixart/messenger/services/MessageArchiveService.java b/src/main/java/de/pixart/messenger/services/MessageArchiveService.java index 4a1fe2a87..003f12991 100644 --- a/src/main/java/de/pixart/messenger/services/MessageArchiveService.java +++ b/src/main/java/de/pixart/messenger/services/MessageArchiveService.java @@ -56,6 +56,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { startCatchup = lastClearDate.first; reference = null; } + startCatchup = Math.max(startCatchup,mXmppConnectionService.getAutomaticMessageDeletionDate()); long endCatchup = account.getXmppConnection().getLastSessionEstablished(); final Query query; if (startCatchup == 0) { @@ -107,12 +108,14 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { public Query query(Conversation conversation, long start, long end) { synchronized (this.queries) { - if (start > end) { - return null; - } final Query query = new Query(conversation, start, end, PagingOrder.REVERSE); if (start == 0) { query.reference = conversation.getFirstMamReference(); + Log.d(Config.LOGTAG, "setting mam reference"); + } + query.start = Math.max(start, mXmppConnectionService.getAutomaticMessageDeletionDate()); + if (start > end) { + return null; } this.queries.add(query); this.execute(query); @@ -222,7 +225,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { query.getConversation().setFirstMamReference(first == null ? null : first.getContent()); } if (complete || relevant == null || abort) { - final boolean done = (complete || query.getMessageCount() == 0) && query.getStart() == 0; + final boolean done = (complete || query.getMessageCount() == 0) && query.getStart() <= mXmppConnectionService.getAutomaticMessageDeletionDate(); this.finalizeQuery(query, done); Log.d(Config.LOGTAG, query.getAccount().getJid().toBareJid() + ": finished mam after " + query.getTotalCount() + " messages. messages left=" + Boolean.toString(!done)); if (query.getWith() == null && query.getMessageCount() > 0) { diff --git a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java index 1c7118f0f..55b87074a 100644 --- a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java +++ b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java @@ -69,6 +69,7 @@ import java.util.ListIterator; import java.util.Locale; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicLong; import de.duenndns.ssl.MemorizingTrustManager; import de.pixart.messenger.Config; @@ -300,6 +301,7 @@ public class XmppConnectionService extends Service { } }; private int keyStatusUpdatedListenerCount = 0; + private AtomicLong mLastExpiryRun = new AtomicLong(0); private SecureRandom mRandom; private LruCache<Pair<String, String>, ServiceDiscoveryResult> discoCache = new LruCache<>(20); private OnStatusChanged statusListener = new OnStatusChanged() { @@ -518,7 +520,6 @@ public class XmppConnectionService extends Service { if (!progressTracker.contains(p) && p != 100 && p != 0) { progressTracker.add(p); if (informableCallback != null) { - informableCallback.inform(getString(R.string.transcoding_video_progress, p)); } } @@ -560,7 +561,6 @@ public class XmppConnectionService extends Service { } else { processAsFile(); } - } }); } @@ -715,6 +715,9 @@ public class XmppConnectionService extends Service { } } } + if (SystemClock.elapsedRealtime() - mLastExpiryRun.get() >= Config.EXPIRY_INTERVAL) { + expireOldMessages(); + } return START_STICKY; } @@ -925,6 +928,33 @@ public class XmppConnectionService extends Service { } } + private void expireOldMessages() { + expireOldMessages(false); + } + + public void expireOldMessages(final boolean resetHasMessagesLeftOnServer) { + mLastExpiryRun.set(SystemClock.elapsedRealtime()); + mDatabaseExecutor.execute(new Runnable() { + @Override + public void run() { + long timestamp = getAutomaticMessageDeletionDate(); + if (timestamp > 0) { + databaseBackend.expireOldMessages(timestamp); + synchronized (XmppConnectionService.this.conversations) { + for (Conversation conversation : XmppConnectionService.this.conversations) { + conversation.expireOldMessages(timestamp); + if (resetHasMessagesLeftOnServer) { + conversation.messagesLoaded.set(true); + conversation.setHasMessagesLeftOnServer(true); + } + } + } + updateConversationUi(); + } + } + }); + } + public boolean hasInternetConnection() { ConnectivityManager cm = (ConnectivityManager) getApplicationContext() .getSystemService(Context.CONNECTIVITY_SERVICE); @@ -1338,12 +1368,10 @@ public class XmppConnectionService extends Service { if (addToConversation) { conversation.add(message); } - if (message.getEncryption() == Message.ENCRYPTION_NONE || saveEncryptedMessages()) { - if (saveInDb) { - databaseBackend.createMessage(message); - } else if (message.edited()) { - databaseBackend.updateMessage(message, message.getEditedId()); - } + if (saveInDb) { + databaseBackend.createMessage(message); + } else if (message.edited()) { + databaseBackend.updateMessage(message, message.getEditedId()); } updateConversationUi(); } @@ -1453,6 +1481,12 @@ public class XmppConnectionService extends Service { Runnable runnable = new Runnable() { @Override public void run() { + long deletionDate = getAutomaticMessageDeletionDate(); + mLastExpiryRun.set(SystemClock.elapsedRealtime()); + if (deletionDate > 0) { + Log.d(Config.LOGTAG, "deleting messages that are older than " + AbstractGenerator.getTimestamp(deletionDate)); + databaseBackend.expireOldMessages(deletionDate); + } Log.d(Config.LOGTAG, "restoring roster"); for (Account account : accounts) { databaseBackend.readRoster(account.getRoster()); @@ -1624,8 +1658,10 @@ public class XmppConnectionService extends Service { MessageArchiveService.Query query = getMessageArchiveService().query(conversation, 0, timestamp); if (query != null) { query.setCallback(callback); + callback.informUser(R.string.fetching_history_from_server); + } else { + callback.informUser(R.string.not_fetching_history_retention_period); } - callback.informUser(R.string.fetching_history_from_server); } } } @@ -3152,6 +3188,15 @@ public class XmppConnectionService extends Service { .getDefaultSharedPreferences(getApplicationContext()); } + public long getAutomaticMessageDeletionDate() { + try { + final long timeout = Long.parseLong(getPreferences().getString(SettingsActivity.AUTOMATIC_MESSAGE_DELETION, "0")) * 1000; + return timeout == 0 ? timeout : System.currentTimeMillis() - timeout; + } catch (NumberFormatException e) { + return 0; + } + } + public boolean confirmMessages() { return getPreferences().getBoolean("confirm_messages", true); } @@ -3164,10 +3209,6 @@ public class XmppConnectionService extends Service { return getPreferences().getBoolean("chat_states", true); } - public boolean saveEncryptedMessages() { - return !getPreferences().getBoolean("dont_save_encrypted", false); - } - private boolean respectAutojoin() { return getPreferences().getBoolean("autojoin", true); } |