From 919bb01d583b0e7d388b449b183daf19cae3d1b9 Mon Sep 17 00:00:00 2001 From: Harris Date: Tue, 13 Sep 2022 15:01:15 +1000 Subject: [PATCH] Make the message trimming behaviour consistent across platform (#936) * refactor: remove old trim behaviour and create new defaults * refactor: add in trimming by before time * refactor: remove old trim thread job, remove message processor scheduling trim thread * refactor: remove spacing * refactor: enable trimming by default * refactor: remove trim now option in chat preference --- .../securesms/database/MmsSmsDatabase.java | 4 +- .../securesms/database/Storage.kt | 17 ++-- .../securesms/database/ThreadDatabase.java | 8 ++ .../securesms/jobs/JobManagerFactories.java | 1 - .../securesms/jobs/TrimThreadJob.java | 84 ------------------- .../preferences/ChatsPreferenceFragment.java | 66 --------------- app/src/main/res/xml/preferences_chats.xml | 17 +--- .../libsession/database/StorageProtocol.kt | 2 + .../libsession/messaging/jobs/JobQueue.kt | 14 ---- .../messaging/jobs/TrimThreadJob.kt | 11 ++- .../utilities/TextSecurePreferences.kt | 15 +--- 11 files changed, 35 insertions(+), 204 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index 59aee0719a..3fcb1e724c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -162,8 +162,8 @@ public class MmsSmsDatabase extends Database { } } - public int getConversationCount(long threadId) { - int count = DatabaseComponent.get(context).smsDatabase().getMessageCountForThread(threadId); + public long getConversationCount(long threadId) { + long count = DatabaseComponent.get(context).smsDatabase().getMessageCountForThread(threadId); count += DatabaseComponent.get(context).mmsDatabase().getMessageCountForThread(threadId); return count; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index ef14ed83e4..d34ed43449 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -201,11 +201,6 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, messageID = result.messageId } } - val threadID = message.threadID - // open group trim thread job is scheduled after processing in OpenGroupPollerV2 - if (openGroupID.isNullOrEmpty() && threadID != null && threadID >= 0 && TextSecurePreferences.isThreadLengthTrimmingEnabled(context)) { - JobQueue.shared.queueThreadForTrim(threadID) - } message.serverHash?.let { serverHash -> messageID?.let { id -> DatabaseComponent.get(context).lokiMessageDatabase().setMessageServerHash(id, serverHash) @@ -701,6 +696,18 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, threadDB.trimThread(threadID, threadLimit) } + override fun trimThreadBefore(threadID: Long, timestamp: Long) { + val threadDB = DatabaseComponent.get(context).threadDatabase() + threadDB.trimThreadBefore(threadID, timestamp) + } + + override fun getMessageCount(threadID: Long): Long { + val mmsSmsDb = DatabaseComponent.get(context).mmsSmsDatabase() + return mmsSmsDb.getConversationCount(threadID) + } + + + override fun getAttachmentDataUri(attachmentId: AttachmentId): Uri { return PartAuthority.getAttachmentDataUri(attachmentId) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index db477c2c0e..02a82de1d4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -281,6 +281,14 @@ public class ThreadDatabase extends Database { } } + public void trimThreadBefore(long threadId, long timestamp) { + Log.i("ThreadDatabase", "Trimming thread: " + threadId + " before :"+timestamp); + DatabaseComponent.get(context).smsDatabase().deleteMessagesInThreadBeforeDate(threadId, timestamp); + DatabaseComponent.get(context).mmsDatabase().deleteMessagesInThreadBeforeDate(threadId, timestamp); + update(threadId, false); + notifyConversationListeners(threadId); + } + public List setRead(long threadId, boolean lastSeen) { ContentValues contentValues = new ContentValues(1); contentValues.put(READ, 1); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java index 028eb0b421..ef73325f37 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java @@ -31,7 +31,6 @@ public final class JobManagerFactories { put(AvatarDownloadJob.KEY, new AvatarDownloadJob.Factory()); put(LocalBackupJob.KEY, new LocalBackupJob.Factory()); put(RetrieveProfileAvatarJob.KEY, new RetrieveProfileAvatarJob.Factory(application)); - put(TrimThreadJob.KEY, new TrimThreadJob.Factory()); put(UpdateApkJob.KEY, new UpdateApkJob.Factory()); put(PrepareAttachmentAudioExtrasJob.KEY, new PrepareAttachmentAudioExtrasJob.Factory()); }}; diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java deleted file mode 100644 index 9e946f7a79..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (C) 2014 Open Whisper Systems - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.thoughtcrime.securesms.jobs; - -import androidx.annotation.NonNull; - -import org.session.libsession.messaging.utilities.Data; -import org.session.libsession.utilities.TextSecurePreferences; -import org.session.libsignal.utilities.Log; -import org.thoughtcrime.securesms.dependencies.DatabaseComponent; -import org.thoughtcrime.securesms.jobmanager.Job; - -public class TrimThreadJob extends BaseJob { - - public static final String KEY = "TrimThreadJob"; - - private static final String TAG = TrimThreadJob.class.getSimpleName(); - - private static final String KEY_THREAD_ID = "thread_id"; - - private long threadId; - - public TrimThreadJob(long threadId) { - this(new Job.Parameters.Builder().setQueue("TrimThreadJob").build(), threadId); - } - - private TrimThreadJob(@NonNull Job.Parameters parameters, long threadId) { - super(parameters); - this.threadId = threadId; - } - - @Override - public @NonNull - Data serialize() { - return new Data.Builder().putLong(KEY_THREAD_ID, threadId).build(); - } - - @Override - public @NonNull String getFactoryKey() { - return KEY; - } - - @Override - public void onRun() { - boolean trimmingEnabled = TextSecurePreferences.isThreadLengthTrimmingEnabled(context); - int threadLengthLimit = TextSecurePreferences.getThreadTrimLength(context); - - if (!trimmingEnabled) - return; - - DatabaseComponent.get(context).threadDatabase().trimThread(threadId, threadLengthLimit); - } - - @Override - public boolean onShouldRetry(@NonNull Exception exception) { - return false; - } - - @Override - public void onCanceled() { - Log.w(TAG, "Canceling trim attempt: " + threadId); - } - - public static final class Factory implements Job.Factory { - @Override - public @NonNull TrimThreadJob create(@NonNull Parameters parameters, @NonNull Data data) { - return new TrimThreadJob(parameters, data.getLong(KEY_THREAD_ID)); - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java index b7d013d6e7..25d21bbf6d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java @@ -1,18 +1,11 @@ package org.thoughtcrime.securesms.preferences; -import android.content.DialogInterface; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.preference.EditTextPreference; -import androidx.preference.Preference; -import org.session.libsession.utilities.TextSecurePreferences; -import org.session.libsignal.utilities.Log; import org.thoughtcrime.securesms.permissions.Permissions; -import org.thoughtcrime.securesms.util.Trimmer; import network.loki.messenger.R; @@ -22,12 +15,6 @@ public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment { @Override public void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); - - findPreference(TextSecurePreferences.THREAD_TRIM_NOW) - .setOnPreferenceClickListener(new TrimNowClickListener()); - findPreference(TextSecurePreferences.THREAD_TRIM_LENGTH) - .setOnPreferenceChangeListener(new TrimLengthValidationListener()); - } @Override @@ -50,57 +37,4 @@ public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment { Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults); } - private class TrimNowClickListener implements Preference.OnPreferenceClickListener { - @Override - public boolean onPreferenceClick(Preference preference) { - final int threadLengthLimit = TextSecurePreferences.getThreadTrimLength(getActivity()); - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setTitle(R.string.ApplicationPreferencesActivity_delete_all_old_messages_now); - builder.setMessage(getResources().getQuantityString(R.plurals.ApplicationPreferencesActivity_this_will_immediately_trim_all_conversations_to_the_d_most_recent_messages, - threadLengthLimit, threadLengthLimit)); - builder.setPositiveButton(R.string.ApplicationPreferencesActivity_delete, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Trimmer.trimAllThreads(getActivity(), threadLengthLimit); - } - }); - - builder.setNegativeButton(android.R.string.cancel, null); - builder.show(); - - return true; - } - } - - private class TrimLengthValidationListener implements Preference.OnPreferenceChangeListener { - - public TrimLengthValidationListener() { - EditTextPreference preference = findPreference(TextSecurePreferences.THREAD_TRIM_LENGTH); - onPreferenceChange(preference, preference.getText()); - } - - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (newValue == null || ((String)newValue).trim().length() == 0) { - return false; - } - - int value; - try { - value = Integer.parseInt((String)newValue); - } catch (NumberFormatException nfe) { - Log.w(TAG, nfe); - return false; - } - - if (value < 1) { - return false; - } - - preference.setSummary(getResources().getQuantityString(R.plurals.ApplicationPreferencesActivity_messages_per_conversation, value, value)); - return true; - } - } - } diff --git a/app/src/main/res/xml/preferences_chats.xml b/app/src/main/res/xml/preferences_chats.xml index d87c07b10d..fae1a0d66a 100644 --- a/app/src/main/res/xml/preferences_chats.xml +++ b/app/src/main/res/xml/preferences_chats.xml @@ -1,8 +1,6 @@ - +