diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java
index 856aaf2e0627617b3fb5bd036dbb01db11b4a014..c79a2f0be1a6c79b29a2834898e03e95590f31b5 100644
--- a/src/main/java/eu/siacs/conversations/entities/Conversation.java
+++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java
@@ -1148,6 +1148,17 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
return alwaysNotify() || getBooleanAttribute(ATTRIBUTE_NOTIFY_REPLIES, false);
}
+ public void setStoreInCache(final boolean cache) {
+ setAttribute("storeMedia", cache ? "cache" : "shared");
+ }
+
+ public boolean storeInCache() {
+ if ("cache".equals(getAttribute("storeMedia"))) return true;
+ if ("shared".equals(getAttribute("storeMedia"))) return false;
+ if (mode == Conversation.MODE_MULTI && !mucOptions.isPrivateAndNonAnonymous()) return true;
+ return false;
+ }
+
public boolean setAttribute(String key, boolean value) {
return setAttribute(key, String.valueOf(value));
}
diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java
index e8a7f3a34b98eac839dfba9351828736aac09561..387c91063ba429b21b3872b2886dc0b23ab99cc2 100644
--- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java
+++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java
@@ -82,6 +82,7 @@ import io.ipfs.cid.Cid;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
+import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.DownloadableFile;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.services.AttachFileToConversationRunnable;
@@ -1083,7 +1084,7 @@ public class FileBackend {
}
final File appDirectory =
new File(parentDirectory, mXmppConnectionService.getString(R.string.app_name));
- if (message == null || message.getStatus() == Message.STATUS_DUMMY) {
+ if (message == null || message.getStatus() == Message.STATUS_DUMMY || (message.getConversation() instanceof Conversation && ((Conversation) message.getConversation()).storeInCache())) {
final var mediaCache = new File(mXmppConnectionService.getCacheDir(), "/media");
return new File(mediaCache, filename);
} else {
diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
index 5914fd9bdea8bc8ffd5f2263d525c840e2fa52c7..69a9ccfc912728f665b24abad7077e7cf8bf8965 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
@@ -518,6 +518,13 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
xmppConnectionService.getAttachments(this.mConversation, limit, this);
this.binding.showMedia.setOnClickListener((v) -> MediaBrowserActivity.launch(this, mConversation));
}
+
+ binding.storeInCache.setChecked(mConversation.storeInCache());
+ binding.storeInCache.setOnCheckedChangeListener((v, checked) -> {
+ mConversation.setStoreInCache(checked);
+ xmppConnectionService.updateConversation(mConversation);
+ });
+
updateView();
}
}
diff --git a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java
index 318c150e4564b573c3b447832d7657ab6968fcca..ad52eeb1313f06d7c4f1d13ef46ddb166ef0f955 100644
--- a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java
@@ -735,6 +735,13 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
});
});
+ final var conversation = xmppConnectionService.findOrCreateConversation(account, contact.getJid(), false, true);
+ binding.storeInCache.setChecked(conversation.storeInCache());
+ binding.storeInCache.setOnCheckedChangeListener((v, checked) -> {
+ conversation.setStoreInCache(checked);
+ xmppConnectionService.updateConversation(conversation);
+ });
+
populateView();
}
}
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
index c298c6f79279e873683e2acf712970b075864010..b4daa16676cda35ec6064f5904cf06f74352d1db 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
@@ -1787,12 +1787,11 @@ public class ConversationFragment extends XmppFragment
}
if (m.isFileOrImage() && !deleted && !cancelable) {
final String path = m.getRelativeFilePath();
- if (path == null
- || !path.startsWith("/")
- || FileBackend.inConversationsDirectory(requireActivity(), path)) {
- saveAsSticker.setVisible(true);
+ if (path != null) {
+ final var file = new File(path);
+ if (file.canRead()) saveAsSticker.setVisible(true);
blockMedia.setVisible(true);
- deleteFile.setVisible(true);
+ if (file.canWrite()) deleteFile.setVisible(true);
deleteFile.setTitle(
activity.getString(
R.string.delete_x_file,
diff --git a/src/main/res/layout/activity_contact_details.xml b/src/main/res/layout/activity_contact_details.xml
index 5289f476760bbccd388fa1afda6dce6ce53862f7..406075539f8b7351461ba400302455021280d1bf 100644
--- a/src/main/res/layout/activity_contact_details.xml
+++ b/src/main/res/layout/activity_contact_details.xml
@@ -180,6 +180,29 @@
android:orientation="vertical"
android:padding="@dimen/card_padding_regular">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+