From 8724d904b77fbc59972ee3e95d506c30c80f670f Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Tue, 12 Jan 2021 16:01:31 -0400 Subject: [PATCH] Add NotInCallConstraint, restrict auto-download of media and documents when on an active voice or video call. --- .../jobmanager/impl/NotInCallConstraint.java | 43 +++++++++++++++++++ .../impl/NotInCallConstraintObserver.java | 37 ++++++++++++++++ .../securesms/jobs/AttachmentDownloadJob.java | 1 + .../securesms/jobs/JobManagerFactories.java | 6 ++- .../securesms/util/AttachmentUtil.java | 5 ++- 5 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NotInCallConstraint.java create mode 100644 app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NotInCallConstraintObserver.java diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NotInCallConstraint.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NotInCallConstraint.java new file mode 100644 index 000000000..8ca89923a --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NotInCallConstraint.java @@ -0,0 +1,43 @@ +package org.thoughtcrime.securesms.jobmanager.impl; + +import android.app.job.JobInfo; + +import androidx.annotation.NonNull; + +import org.greenrobot.eventbus.EventBus; +import org.thoughtcrime.securesms.events.WebRtcViewModel; +import org.thoughtcrime.securesms.jobmanager.Constraint; + +/** + * Constraint met when the user is not in an active, connected call. + */ +public final class NotInCallConstraint implements Constraint { + + public static final String KEY = "NotInCallConstraint"; + + @Override + public boolean isMet() { + return isNotInConnectedCall(); + } + + @Override + public @NonNull String getFactoryKey() { + return KEY; + } + + public static boolean isNotInConnectedCall() { + WebRtcViewModel viewModel = EventBus.getDefault().getStickyEvent(WebRtcViewModel.class); + return viewModel == null || viewModel.getState() != WebRtcViewModel.State.CALL_CONNECTED; + } + + @Override + public void applyToJobInfo(@NonNull JobInfo.Builder jobInfoBuilder) { + } + + public static class Factory implements Constraint.Factory { + @Override + public NotInCallConstraint create() { + return new NotInCallConstraint(); + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NotInCallConstraintObserver.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NotInCallConstraintObserver.java new file mode 100644 index 000000000..4a1e083ae --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NotInCallConstraintObserver.java @@ -0,0 +1,37 @@ +package org.thoughtcrime.securesms.jobmanager.impl; + +import androidx.annotation.NonNull; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; +import org.thoughtcrime.securesms.events.WebRtcViewModel; +import org.thoughtcrime.securesms.jobmanager.ConstraintObserver; + +public final class NotInCallConstraintObserver implements ConstraintObserver { + + private static final String REASON = NotInCallConstraintObserver.class.getSimpleName(); + + @Override + public void register(@NonNull Notifier notifier) { + EventBus.getDefault().register(new EventBusListener(notifier)); + } + + private static final class EventBusListener { + + private final Notifier notifier; + + private EventBusListener(@NonNull Notifier notifier) { + this.notifier = notifier; + } + + @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) + public void consume(@NonNull WebRtcViewModel viewModel) { + NotInCallConstraint constraint = new NotInCallConstraint.Factory().create(); + + if (constraint.isMet()) { + notifier.onConstraintMet(REASON); + } + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java index af9066eb3..f242f5563 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java @@ -19,6 +19,7 @@ import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.JobLogger; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; +import org.thoughtcrime.securesms.jobmanager.impl.NotInCallConstraint; import org.thoughtcrime.securesms.mms.MmsException; import org.thoughtcrime.securesms.util.AttachmentUtil; import org.thoughtcrime.securesms.util.Base64; 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 2585a02a3..0009dde3d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java @@ -15,6 +15,8 @@ import org.thoughtcrime.securesms.jobmanager.impl.ChargingConstraintObserver; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraintObserver; import org.thoughtcrime.securesms.jobmanager.impl.NetworkOrCellServiceConstraint; +import org.thoughtcrime.securesms.jobmanager.impl.NotInCallConstraint; +import org.thoughtcrime.securesms.jobmanager.impl.NotInCallConstraintObserver; import org.thoughtcrime.securesms.jobmanager.impl.SqlCipherMigrationConstraint; import org.thoughtcrime.securesms.jobmanager.impl.SqlCipherMigrationConstraintObserver; import org.thoughtcrime.securesms.jobmanager.impl.DecryptionsDrainedConstraint; @@ -186,6 +188,7 @@ public final class JobManagerFactories { put(NetworkOrCellServiceConstraint.LEGACY_KEY, new NetworkOrCellServiceConstraint.Factory(application)); put(SqlCipherMigrationConstraint.KEY, new SqlCipherMigrationConstraint.Factory(application)); put(DecryptionsDrainedConstraint.KEY, new DecryptionsDrainedConstraint.Factory()); + put(NotInCallConstraint.KEY, new NotInCallConstraint.Factory()); }}; } @@ -194,7 +197,8 @@ public final class JobManagerFactories { new ChargingConstraintObserver(application), new NetworkConstraintObserver(application), new SqlCipherMigrationConstraintObserver(), - new DecryptionsDrainedConstraintObserver()); + new DecryptionsDrainedConstraintObserver(), + new NotInCallConstraintObserver()); } public static List getJobMigrations(@NonNull Application application) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/AttachmentUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/AttachmentUtil.java index bf3936607..ec0d570fc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/AttachmentUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/AttachmentUtil.java @@ -16,6 +16,7 @@ import org.thoughtcrime.securesms.attachments.DatabaseAttachment; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.model.MessageRecord; +import org.thoughtcrime.securesms.jobmanager.impl.NotInCallConstraint; import org.thoughtcrime.securesms.recipients.Recipient; import java.util.Collections; @@ -46,9 +47,9 @@ public class AttachmentUtil { { return true; } else if (isNonDocumentType(contentType)) { - return allowedTypes.contains(MediaUtil.getDiscreteMimeType(contentType)); + return NotInCallConstraint.isNotInConnectedCall() && allowedTypes.contains(MediaUtil.getDiscreteMimeType(contentType)); } else { - return allowedTypes.contains("documents"); + return NotInCallConstraint.isNotInConnectedCall() && allowedTypes.contains("documents"); } }