aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/services
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2017-01-29 20:06:28 +0100
committerChristian Schneppe <christian@pix-art.de>2017-01-29 20:06:28 +0100
commit475e29b622ef5c87e3a3b3a36020bf99958467cd (patch)
tree75a7df26cb66eaf5fd16ef4aab3eb50080975291 /src/main/java/de/pixart/messenger/services
parent91e6a152c066d1bcff15a9585d6830feb1a53288 (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.java11
-rw-r--r--src/main/java/de/pixart/messenger/services/XmppConnectionService.java67
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);
}