From 0c81558cb03f54af55de639cf372d88963e3e6ad Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Wed, 5 Jun 2024 20:44:30 -0500 Subject: [PATCH] Allow storing all media in cache on a per-chat basis --- .../conversations/entities/Conversation.java | 11 +++++++++ .../persistance/FileBackend.java | 3 ++- .../ui/ConferenceDetailsActivity.java | 7 ++++++ .../ui/ContactDetailsActivity.java | 7 ++++++ .../ui/ConversationFragment.java | 9 ++++---- .../res/layout/activity_contact_details.xml | 23 +++++++++++++++++++ src/main/res/layout/activity_muc_details.xml | 23 +++++++++++++++++++ 7 files changed, 77 insertions(+), 6 deletions(-) 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"> + + + + + + + + + + + + + + + +