diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
index 0e1e20afda..214fddc6fe 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
@@ -90,8 +90,6 @@ import org.thoughtcrime.securesms.util.AppForegroundObserver;
import org.thoughtcrime.securesms.util.AppStartup;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.FeatureFlags;
-import org.thoughtcrime.securesms.util.PowerManagerCompat;
-import org.thoughtcrime.securesms.util.ServiceUtil;
import org.thoughtcrime.securesms.util.SignalLocalMetrics;
import org.thoughtcrime.securesms.util.SignalUncaughtExceptionHandler;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
@@ -288,7 +286,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr
@VisibleForTesting
protected void initializeLogging() {
- org.signal.core.util.logging.Log.initialize(FeatureFlags::internalUser, new AndroidLogger(), new PersistentLogger(this));
+ Log.initialize(FeatureFlags::internalUser, new AndroidLogger(), new PersistentLogger(this));
SignalProtocolLoggerProvider.setProvider(new CustomSignalProtocolLogger());
diff --git a/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java
index 3d98d8fb07..afa78fd214 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java
@@ -6,7 +6,6 @@ import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
-import android.os.Build;
import android.os.Bundle;
import android.transition.TransitionInflater;
import android.view.View;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/BaseActivity.java b/app/src/main/java/org/thoughtcrime/securesms/BaseActivity.java
index 0efd4db83b..9598fb1dbc 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/BaseActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/BaseActivity.java
@@ -5,7 +5,6 @@ import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
-import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
@@ -18,7 +17,6 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.util.AppStartup;
import org.thoughtcrime.securesms.util.ConfigurationUtil;
-import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.WindowUtil;
import org.thoughtcrime.securesms.util.dynamiclanguage.DynamicLanguageContextWrapper;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/DeviceActivity.java b/app/src/main/java/org/thoughtcrime/securesms/DeviceActivity.java
index ca0ed109bf..1f9408bd2c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/DeviceActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/DeviceActivity.java
@@ -5,13 +5,11 @@ import android.annotation.SuppressLint;
import android.content.Context;
import android.net.Uri;
import android.os.AsyncTask;
-import android.os.Build;
import android.os.Bundle;
import android.os.Vibrator;
import android.text.TextUtils;
import android.transition.TransitionInflater;
import android.view.Menu;
-import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java
index 5b09bc613c..ef74eb153d 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java
@@ -21,7 +21,6 @@ import android.app.KeyguardManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.PorterDuff;
-import android.os.Build;
import android.os.Bundle;
import android.text.Editable;
import android.text.InputType;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java
index 7fcf3b65bf..77670ca61a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java
@@ -53,8 +53,8 @@ import org.greenrobot.eventbus.ThreadMode;
import org.signal.core.util.ThreadUtil;
import org.signal.core.util.concurrent.LifecycleDisposable;
import org.signal.core.util.concurrent.SignalExecutors;
-import org.signal.core.util.logging.Log;
import org.signal.libsignal.protocol.IdentityKey;
+import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.components.TooltipPopup;
import org.thoughtcrime.securesms.components.sensors.DeviceOrientationMonitor;
import org.thoughtcrime.securesms.components.webrtc.CallLinkInfoSheet;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java b/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java
index 2901fe7dc2..92b26ce15a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java
@@ -5,13 +5,11 @@ import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.text.SpannableStringBuilder;
-import android.text.style.CharacterStyle;
import android.util.AttributeSet;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
-import org.signal.core.util.BreakIteratorCompat;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.emoji.SimpleEmojiTextView;
@@ -20,7 +18,6 @@ import org.thoughtcrime.securesms.util.ContextUtil;
import org.thoughtcrime.securesms.util.SpanUtil;
import org.thoughtcrime.securesms.util.ViewUtil;
-import java.util.Iterator;
import java.util.Objects;
public class FromTextView extends SimpleEmojiTextView {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java
index eec0615cbb..60210d8c44 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java
@@ -37,7 +37,6 @@ import org.thoughtcrime.securesms.util.ViewUtil;
import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;
-import java.util.concurrent.TimeUnit;
/**
* LinearLayout that, when a view container, will report back when it thinks a soft keyboard
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java b/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java
index ff7d20f174..d336d57529 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java
@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.components;
-import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java b/app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java
index 54661ddef8..40e12f056d 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java
@@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.components;
import android.content.Context;
import android.graphics.PorterDuff;
-import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java
index cec05d19c5..4025a8c872 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java
@@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.components;
import android.annotation.SuppressLint;
import android.content.Context;
-import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.AttributeSet;
import android.view.MotionEvent;
@@ -10,13 +9,9 @@ import android.view.View;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.exifinterface.media.ExifInterface;
-import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
-import com.bumptech.glide.load.engine.GlideException;
-import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java
index 701fa76b4c..dd1060be18 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java
@@ -6,7 +6,6 @@ import android.graphics.ColorMatrixColorFilter;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Build;
-import android.os.Looper;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
@@ -26,7 +25,6 @@ import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;
import androidx.constraintlayout.widget.Guideline;
import androidx.core.util.Consumer;
-import androidx.core.util.Preconditions;
import androidx.core.view.ViewKt;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.DefaultItemAnimator;
@@ -74,8 +72,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import kotlin.concurrent.ThreadsKt;
-
public class WebRtcCallView extends ConstraintLayout {
private static final String TAG = Log.tag(WebRtcCallView.class);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactUtil.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactUtil.java
index 39e3f6fb31..0fc5751441 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactUtil.java
@@ -11,7 +11,6 @@ import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
-import androidx.appcompat.app.AlertDialog;
import com.annimon.stream.Stream;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java
index 76c320895e..b048453ea7 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java
@@ -58,8 +58,6 @@ import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.LifecycleOwner;
import androidx.media3.common.MediaItem;
-import androidx.recyclerview.widget.ConcatAdapter;
-import androidx.recyclerview.widget.ConversationLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItemBodyBubble.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItemBodyBubble.java
index 416a3f1b4c..4443f823c7 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItemBodyBubble.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItemBodyBubble.java
@@ -12,7 +12,6 @@ import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
-import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.components.Outliner;
import org.thoughtcrime.securesms.util.Projection;
import org.thoughtcrime.securesms.util.Util;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationRepository.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationRepository.java
index 0a22c67510..fcbef81bb2 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationRepository.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationRepository.java
@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.conversation;
import android.content.Context;
-import android.os.Build;
import androidx.annotation.NonNull;
import androidx.annotation.WorkerThread;
@@ -9,10 +8,7 @@ import androidx.annotation.WorkerThread;
import org.signal.core.util.StreamUtil;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
-import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery;
-import org.thoughtcrime.securesms.database.DatabaseObserver;
import org.thoughtcrime.securesms.database.MessageTable;
-import org.thoughtcrime.securesms.database.RecipientTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.ThreadTable;
import org.thoughtcrime.securesms.database.model.GroupRecord;
@@ -23,13 +19,8 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.mms.TextSlide;
import org.thoughtcrime.securesms.recipients.Recipient;
-import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.recipients.RecipientUtil;
-import org.thoughtcrime.securesms.util.BubbleUtil;
-import org.thoughtcrime.securesms.util.ConversationUtil;
import org.thoughtcrime.securesms.util.MessageRecordUtil;
-import org.thoughtcrime.securesms.util.TextSecurePreferences;
-import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.signalservice.api.push.ServiceId;
import java.io.IOException;
@@ -40,7 +31,6 @@ import java.util.Optional;
import java.util.stream.Collectors;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
-import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.schedulers.Schedulers;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java
index b33a6744f0..135768e9fb 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java
@@ -137,7 +137,6 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.events.ReminderUpdateEvent;
import org.thoughtcrime.securesms.exporter.flow.SmsExportDialogs;
import org.thoughtcrime.securesms.groups.SelectionLimits;
-import org.thoughtcrime.securesms.jobs.MessageFetchJob;
import org.thoughtcrime.securesms.jobs.ServiceOutageDetectionJob;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.lock.v2.CreateSvrPinActivity;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java
index e258ac2e63..cf5c7e11fe 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java
@@ -61,7 +61,6 @@ import org.thoughtcrime.securesms.components.FromTextView;
import org.thoughtcrime.securesms.components.TypingIndicatorView;
import org.thoughtcrime.securesms.components.emoji.EmojiStrings;
import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
-import org.thoughtcrime.securesms.components.emoji.SimpleEmojiTextView;
import org.thoughtcrime.securesms.contacts.paged.ContactSearchData;
import org.thoughtcrime.securesms.conversation.MessageStyler;
import org.thoughtcrime.securesms.conversationlist.model.ConversationSet;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecurePreKeyStore.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecurePreKeyStore.java
index 05c1f54f3a..a32579b403 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecurePreKeyStore.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecurePreKeyStore.java
@@ -5,7 +5,6 @@ import androidx.annotation.NonNull;
import org.signal.core.util.logging.Log;
import org.signal.libsignal.protocol.InvalidKeyIdException;
import org.signal.libsignal.protocol.state.PreKeyRecord;
-import org.signal.libsignal.protocol.state.PreKeyStore;
import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
import org.signal.libsignal.protocol.state.SignedPreKeyStore;
import org.thoughtcrime.securesms.crypto.ReentrantSessionLock;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2ProcessingLock.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2ProcessingLock.java
index b7dc727e22..47a1138a32 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2ProcessingLock.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2ProcessingLock.java
@@ -10,7 +10,6 @@ import org.thoughtcrime.securesms.util.FeatureFlags;
import java.io.Closeable;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public final class GroupsV2ProcessingLock {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver.java
index 6ec6e20695..ffa6655228 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver.java
@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.jobmanager.impl;
import android.app.Application;
-import android.content.Context;
import android.os.Build;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJob.java
index 61c6c1be93..88175b2079 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJob.java
@@ -8,7 +8,6 @@ import org.signal.libsignal.protocol.state.SignalProtocolStore;
import org.thoughtcrime.securesms.crypto.PreKeyUtil;
import org.thoughtcrime.securesms.crypto.storage.PreKeyMetadataStore;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob.java
index afd1391f97..831bb45188 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob.java
@@ -8,7 +8,6 @@ import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.ThreadTable;
import org.thoughtcrime.securesms.database.model.ThreadRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.transport.RetryLaterException;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/EmojiSearchIndexDownloadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/EmojiSearchIndexDownloadJob.java
index 2c8b2d7981..43b139a00a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/EmojiSearchIndexDownloadJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/EmojiSearchIndexDownloadJob.java
@@ -9,7 +9,6 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.EmojiSearchData;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.EmojiValues;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java
index 65204bb2ec..42ab61358f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java
@@ -35,7 +35,6 @@ import org.thoughtcrime.securesms.PlayServicesProblemActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.gcm.FcmUtil;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MarkerJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MarkerJob.java
index 5199174bf1..dbe4313356 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MarkerJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MarkerJob.java
@@ -4,7 +4,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
/**
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob.java
index 9b46aba06e..217117f881 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob.java
@@ -9,7 +9,6 @@ import org.thoughtcrime.securesms.database.RecipientTable;
import org.thoughtcrime.securesms.database.RecipientTable.RecipientReader;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceKeysUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceKeysUpdateJob.java
index b6cb4832f1..0d05c4def8 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceKeysUpdateJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceKeysUpdateJob.java
@@ -7,7 +7,6 @@ import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileContentUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileContentUpdateJob.java
index 8d73a55b72..174420b76f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileContentUpdateJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileContentUpdateJob.java
@@ -6,7 +6,6 @@ import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob.java
index d799dd75ec..20fee51b76 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob.java
@@ -9,7 +9,6 @@ import org.signal.libsignal.zkgroup.profiles.ProfileKey;
import org.thoughtcrime.securesms.crypto.ProfileKeyUtil;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStickerPackSyncJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStickerPackSyncJob.java
index f8ae8395a6..4779d431af 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStickerPackSyncJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStickerPackSyncJob.java
@@ -9,7 +9,6 @@ import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.StickerTable.StickerPackRecordReader;
import org.thoughtcrime.securesms.database.model.StickerPackRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStorageSyncRequestJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStorageSyncRequestJob.java
index 8689dc9e96..cce2ad1267 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStorageSyncRequestJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStorageSyncRequestJob.java
@@ -6,7 +6,6 @@ import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.net.NotPushRegisteredException;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileUploadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileUploadJob.java
index e45e67469c..c6e6e0994f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileUploadJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileUploadJob.java
@@ -5,7 +5,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java
index 37fd266425..3110804339 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java
@@ -37,7 +37,6 @@ import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedExcept
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
public class RemoteDeleteSendJob extends BaseJob {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java
index 2e55e3c54e..057fffe3fd 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java
@@ -41,7 +41,6 @@ import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.recipients.RecipientUtil;
import org.thoughtcrime.securesms.transport.RetryLaterException;
import org.thoughtcrime.securesms.util.Base64;
-import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.IdentityUtil;
import org.thoughtcrime.securesms.util.ProfileUtil;
import org.thoughtcrime.securesms.util.Util;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateCertificateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateCertificateJob.java
index b135e8395c..1c26fdd064 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateCertificateJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateCertificateJob.java
@@ -5,7 +5,6 @@ import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.CertificateType;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob.java
index 81405cf6c6..be8fa35e0c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob.java
@@ -7,7 +7,6 @@ import org.greenrobot.eventbus.EventBus;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.events.ReminderUpdateEvent;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.transport.RetryLaterException;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageAccountRestoreJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageAccountRestoreJob.java
index 1905bc2c46..3efb1dc0bd 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageAccountRestoreJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageAccountRestoreJob.java
@@ -6,7 +6,6 @@ import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobmanager.JobTracker;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageForcePushJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageForcePushJob.java
index c22c0cedd2..7f757694e3 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageForcePushJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageForcePushJob.java
@@ -11,7 +11,6 @@ import org.thoughtcrime.securesms.database.RecipientTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.UnknownStorageIdTable;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/SubscriptionKeepAliveJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SubscriptionKeepAliveJob.java
index 2a92798523..5c807f8982 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/SubscriptionKeepAliveJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/SubscriptionKeepAliveJob.java
@@ -6,7 +6,6 @@ import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/UpdateApkJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/UpdateApkJob.java
index d9b52a7657..1f2c25da78 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/UpdateApkJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/UpdateApkJob.java
@@ -16,7 +16,6 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.BuildConfig;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.service.UpdateApkReadyListener;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/logging/PersistentLogger.kt b/app/src/main/java/org/thoughtcrime/securesms/logging/PersistentLogger.kt
index 69eaa94ab9..af8265f23a 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/logging/PersistentLogger.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/logging/PersistentLogger.kt
@@ -47,23 +47,23 @@ class PersistentLogger(
}.start()
}
- override fun v(tag: String?, message: String?, t: Throwable?, keepLonger: Boolean) {
+ override fun v(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) {
write(LOG_V, tag, message, t, keepLonger)
}
- override fun d(tag: String?, message: String?, t: Throwable?, keepLonger: Boolean) {
+ override fun d(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) {
write(LOG_D, tag, message, t, keepLonger)
}
- override fun i(tag: String?, message: String?, t: Throwable?, keepLonger: Boolean) {
+ override fun i(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) {
write(LOG_I, tag, message, t, keepLonger)
}
- override fun w(tag: String?, message: String?, t: Throwable?, keepLonger: Boolean) {
+ override fun w(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) {
write(LOG_W, tag, message, t, keepLonger)
}
- override fun e(tag: String?, message: String?, t: Throwable?, keepLonger: Boolean) {
+ override fun e(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) {
write(LOG_E, tag, message, t, keepLonger)
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java
index d2809085b6..7c3ef97284 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java
@@ -1,6 +1,5 @@
package org.thoughtcrime.securesms.mediasend;
-import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXUtil.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXUtil.java
index c0657b6c9c..d8066859b7 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXUtil.java
@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.mediasend.camerax;
import android.annotation.SuppressLint;
-import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java
index 8143d6f3a0..df5e011a43 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java
@@ -4,7 +4,6 @@ import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
-import android.provider.Settings;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/PinsForAllSchedule.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/PinsForAllSchedule.java
index b8b75e480a..d342034742 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/PinsForAllSchedule.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/PinsForAllSchedule.java
@@ -3,9 +3,7 @@ package org.thoughtcrime.securesms.megaphone;
import androidx.annotation.VisibleForTesting;
import org.signal.core.util.logging.Log;
-import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
-import org.thoughtcrime.securesms.util.TextSecurePreferences;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/MigrationJob.java b/app/src/main/java/org/thoughtcrime/securesms/migrations/MigrationJob.java
index 941f164e84..1331b24194 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/migrations/MigrationJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/MigrationJob.java
@@ -4,7 +4,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobLogger;
import org.thoughtcrime.securesms.jobmanager.impl.BackoffUtil;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/PniAccountInitializationMigrationJob.java b/app/src/main/java/org/thoughtcrime/securesms/migrations/PniAccountInitializationMigrationJob.java
index fa933b61c0..309047050c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/migrations/PniAccountInitializationMigrationJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/PniAccountInitializationMigrationJob.java
@@ -5,7 +5,6 @@ import androidx.annotation.Nullable;
import org.signal.core.util.logging.Log;
import org.signal.libsignal.protocol.state.PreKeyRecord;
-import org.signal.libsignal.protocol.state.SignalProtocolStore;
import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
import org.thoughtcrime.securesms.crypto.PreKeyUtil;
import org.thoughtcrime.securesms.crypto.storage.PreKeyMetadataStore;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingLollipopMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingLollipopMmsConnection.java
index 645cac286b..e3fed1b4ca 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingLollipopMmsConnection.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingLollipopMmsConnection.java
@@ -16,11 +16,9 @@
*/
package org.thoughtcrime.securesms.mms;
-import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.text.TextUtils;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/MediaConstraints.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MediaConstraints.java
index 7748a39aa7..a39e0df4e0 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mms/MediaConstraints.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/mms/MediaConstraints.java
@@ -17,8 +17,6 @@ import org.thoughtcrime.securesms.util.BitmapUtil;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.MemoryFileDescriptor;
-import org.whispersystems.signalservice.api.crypto.AttachmentCipherOutputStream;
-import org.whispersystems.signalservice.internal.crypto.PaddingInputStream;
import java.io.IOException;
import java.io.InputStream;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLollipopMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLollipopMmsConnection.java
index 8ba7ce58e5..dfe17e0d12 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLollipopMmsConnection.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLollipopMmsConnection.java
@@ -20,7 +20,6 @@ import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.telephony.SmsManager;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java
index 288fecddb5..2c13a4c7ce 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java
@@ -10,7 +10,6 @@ import androidx.annotation.NonNull;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
-import org.signal.core.util.Stopwatch;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.MessageTable.ExpirationInfo;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentFragment.java
index 8271867dbc..ded35a5b1b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentFragment.java
@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.payments.confirm;
import android.app.Activity;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/create/CreatePaymentViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/payments/create/CreatePaymentViewModel.java
index c127ce5b34..21d919baee 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/payments/create/CreatePaymentViewModel.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/payments/create/CreatePaymentViewModel.java
@@ -26,7 +26,6 @@ import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
import org.thoughtcrime.securesms.util.livedata.Store;
import org.whispersystems.signalservice.api.payments.FormatterOptions;
import org.whispersystems.signalservice.api.payments.Money;
-import org.whispersystems.signalservice.api.util.OptionalUtil;
import java.io.IOException;
import java.math.BigDecimal;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/BackupsPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/BackupsPreferenceFragment.java
index 590193f078..42e24eadf5 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/preferences/BackupsPreferenceFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/BackupsPreferenceFragment.java
@@ -2,14 +2,12 @@ package org.thoughtcrime.securesms.preferences;
import android.Manifest;
import android.app.Activity;
-import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.text.method.LinkMovementMethod;
-import android.util.TimeUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/ManageProfileFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/ManageProfileFragment.java
index d940c91a11..3b9e2cde9b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/ManageProfileFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/ManageProfileFragment.java
@@ -41,7 +41,6 @@ import org.thoughtcrime.securesms.profiles.manage.ManageProfileViewModel.AvatarS
import org.thoughtcrime.securesms.recipients.Recipient;
import org.signal.core.util.concurrent.LifecycleDisposable;
import org.thoughtcrime.securesms.util.NameUtil;
-import org.thoughtcrime.securesms.util.UsernameUtil;
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
import org.thoughtcrime.securesms.util.navigation.SafeNavigation;
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RateLimitUtil.java b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RateLimitUtil.java
index 56699fd56c..a0d9a0963b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RateLimitUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RateLimitUtil.java
@@ -8,7 +8,6 @@ import androidx.annotation.WorkerThread;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobs.PushGroupSendJob;
import org.thoughtcrime.securesms.jobs.IndividualSendJob;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsConversationView.java b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsConversationView.java
index 1ff0195582..a19c8d056f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsConversationView.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsConversationView.java
@@ -15,7 +15,6 @@ import androidx.core.content.ContextCompat;
import com.annimon.stream.Stream;
-import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.emoji.EmojiImageView;
import org.thoughtcrime.securesms.components.emoji.EmojiUtil;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientId.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientId.java
index f36e200a46..4cd64d391b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientId.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientId.java
@@ -19,7 +19,6 @@ import org.thoughtcrime.securesms.util.DelimiterUtil;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
-import org.whispersystems.signalservice.api.util.UuidUtil;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java
index 19418a198d..4d79f034d5 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java
@@ -21,7 +21,6 @@ import org.thoughtcrime.securesms.groups.GroupChangeException;
import org.thoughtcrime.securesms.groups.GroupChangeFailedException;
import org.thoughtcrime.securesms.groups.GroupManager;
import org.thoughtcrime.securesms.jobs.MultiDeviceBlockedUpdateJob;
-import org.thoughtcrime.securesms.jobs.MultiDeviceMessageRequestResponseJob;
import org.thoughtcrime.securesms.jobs.RefreshOwnProfileJob;
import org.thoughtcrime.securesms.jobs.RotateProfileKeyJob;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/PushChallengeRequest.java b/app/src/main/java/org/thoughtcrime/securesms/registration/PushChallengeRequest.java
index 25a90f35f9..13dc4ad293 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/registration/PushChallengeRequest.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/registration/PushChallengeRequest.java
@@ -7,7 +7,6 @@ import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.signal.core.util.logging.Log;
-import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.whispersystems.signalservice.api.SignalServiceAccountManager;
import java.io.IOException;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationNavigationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationNavigationActivity.java
index 8794ab4d7a..abce53ae7f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationNavigationActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationNavigationActivity.java
@@ -7,7 +7,6 @@ import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.app.AppCompatDelegate;
import androidx.lifecycle.ViewModelProvider;
import org.signal.core.util.logging.Log;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/BaseRegistrationLockFragment.java b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/BaseRegistrationLockFragment.java
index ffc5ef0a2c..027a4d3420 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/BaseRegistrationLockFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/BaseRegistrationLockFragment.java
@@ -10,7 +10,6 @@ import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.CallSuper;
-import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RestoreBackupFragment.java b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RestoreBackupFragment.java
index 7ee3ac6de9..ab2cef3a39 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RestoreBackupFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RestoreBackupFragment.java
@@ -50,7 +50,6 @@ import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider;
import org.thoughtcrime.securesms.database.NoExternalStorageException;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.jobmanager.impl.DataRestoreConstraint;
-import org.thoughtcrime.securesms.jobmanager.impl.DataRestoreConstraintObserver;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.notifications.NotificationChannels;
import org.thoughtcrime.securesms.registration.viewmodel.RegistrationViewModel;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/WelcomeFragment.java b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/WelcomeFragment.java
index 7c7bf4c63a..2659e40c8b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/WelcomeFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/WelcomeFragment.java
@@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.registration.fragments;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
-import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java b/app/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java
index b98ae716b7..425e147058 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java
@@ -12,7 +12,6 @@ import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
-import androidx.core.content.ContextCompat;
import org.signal.core.util.PendingIntentFlags;
import org.signal.core.util.logging.Log;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/PendingRetryReceiptManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/PendingRetryReceiptManager.java
index 003fbdaabc..2a664e6bcb 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/service/PendingRetryReceiptManager.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/service/PendingRetryReceiptManager.java
@@ -16,7 +16,6 @@ import org.thoughtcrime.securesms.database.PendingRetryReceiptCache;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.PendingRetryReceiptModel;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
-import org.thoughtcrime.securesms.util.FeatureFlags;
import java.util.concurrent.TimeUnit;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/UpdateApkRefreshListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/UpdateApkRefreshListener.java
index c456de19a9..ac7f9291f9 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/service/UpdateApkRefreshListener.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/service/UpdateApkRefreshListener.java
@@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.service;
import android.content.Context;
-import android.content.Intent;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.BuildConfig;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/DeviceAwareActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/DeviceAwareActionProcessor.java
index d17c5b4328..e419d2f0fb 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/DeviceAwareActionProcessor.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/DeviceAwareActionProcessor.java
@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.service.webrtc;
import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java
index f8a2732a55..08f92877b5 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java
@@ -24,7 +24,6 @@ import org.webrtc.PeerConnection;
import org.webrtc.VideoTrack;
import org.whispersystems.signalservice.api.messages.calls.OfferMessage;
import org.whispersystems.signalservice.api.push.ServiceId.ACI;
-import org.whispersystems.signalservice.api.push.ServiceId;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupPreJoinActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupPreJoinActionProcessor.java
index d68cc77ed2..3e60ebebc9 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupPreJoinActionProcessor.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupPreJoinActionProcessor.java
@@ -21,7 +21,6 @@ import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceStateBuilder
import org.thoughtcrime.securesms.util.NetworkUtil;
import org.whispersystems.signalservice.api.messages.calls.OfferMessage;
import org.whispersystems.signalservice.api.push.ServiceId.ACI;
-import org.whispersystems.signalservice.api.push.ServiceId;
import java.util.List;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingGroupCallActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingGroupCallActionProcessor.java
index 46eced2865..4befdbdc40 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingGroupCallActionProcessor.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingGroupCallActionProcessor.java
@@ -25,10 +25,8 @@ import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceState;
import org.thoughtcrime.securesms.util.NetworkUtil;
import org.thoughtcrime.securesms.webrtc.locks.LockManager;
import org.whispersystems.signalservice.api.push.ServiceId.ACI;
-import org.whispersystems.signalservice.api.push.ServiceId;
import java.util.Optional;
-import java.util.UUID;
import static org.thoughtcrime.securesms.webrtc.CallNotificationBuilder.TYPE_INCOMING_CONNECTING;
import static org.thoughtcrime.securesms.webrtc.CallNotificationBuilder.TYPE_INCOMING_RINGING;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java
index 4769241434..ad5a9c585d 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java
@@ -61,7 +61,6 @@ import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
-import java.util.UUID;
import static org.thoughtcrime.securesms.service.webrtc.WebRtcData.AnswerMetadata;
import static org.thoughtcrime.securesms.service.webrtc.WebRtcData.HangupMetadata;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/AccountRecordProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/storage/AccountRecordProcessor.java
index 601320ca12..815e5ef319 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/storage/AccountRecordProcessor.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/storage/AccountRecordProcessor.java
@@ -9,7 +9,6 @@ import org.signal.core.util.StringUtil;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.recipients.Recipient;
-import org.thoughtcrime.securesms.util.FeatureFlags;
import org.whispersystems.signalservice.api.storage.SignalAccountRecord;
import org.whispersystems.signalservice.api.storage.SignalAccountRecord.PinnedConversation;
import org.whispersystems.signalservice.api.util.OptionalUtil;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java
index 82d9d35eb5..26959339b4 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java
@@ -11,10 +11,8 @@ import org.thoughtcrime.securesms.jobs.RetrieveProfileJob;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
-import org.thoughtcrime.securesms.util.FeatureFlags;
import org.whispersystems.signalservice.api.push.ServiceId.ACI;
import org.whispersystems.signalservice.api.push.ServiceId.PNI;
-import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.api.storage.SignalContactRecord;
import org.whispersystems.signalservice.api.util.OptionalUtil;
import org.whispersystems.signalservice.internal.storage.protos.ContactRecord.IdentityState;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java
index d6a0f1b33b..d408c5c478 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java
@@ -23,7 +23,6 @@ import org.thoughtcrime.securesms.payments.Entropy;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.subscription.Subscriber;
import org.thoughtcrime.securesms.util.Base64;
-import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.signalservice.api.push.UsernameLinkComponents;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/AlarmSleepTimer.java b/app/src/main/java/org/thoughtcrime/securesms/util/AlarmSleepTimer.java
index a50140358d..733a10674e 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/AlarmSleepTimer.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/AlarmSleepTimer.java
@@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.util;
import android.app.AlarmManager;
import android.app.PendingIntent;
-import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -11,7 +10,6 @@ import android.os.Build;
import android.os.SystemClock;
import androidx.core.app.AlarmManagerCompat;
-import androidx.core.content.ContextCompat;
import org.signal.core.util.PendingIntentFlags;
import org.signal.core.util.logging.Log;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java
index 0daf7c0341..c88e9450d6 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java
@@ -11,7 +11,6 @@ import androidx.appcompat.app.AppCompatDelegate;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.R;
-import org.thoughtcrime.securesms.keyvalue.SettingsValues;
import org.thoughtcrime.securesms.keyvalue.SettingsValues.Theme;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java b/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java
index 33454e2e8f..6110d6af07 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java
@@ -12,9 +12,6 @@ import androidx.core.graphics.Insets;
import androidx.core.view.DisplayCutoutCompat;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
-import androidx.core.view.WindowInsetsControllerCompat;
-
-import org.signal.core.util.logging.Log;
/**
* Encapsulates logic to properly show/hide system UI/chrome in a full screen setting. Also
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java b/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java
index 873ac7ecb9..57a34d813d 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java
@@ -10,7 +10,6 @@ import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
-import android.text.TextUtils;
import android.webkit.MimeTypeMap;
import android.widget.Toast;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Util.java b/app/src/main/java/org/thoughtcrime/securesms/util/Util.java
index 2e15b73aa4..acc8ede8f1 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/Util.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/Util.java
@@ -17,7 +17,6 @@
package org.thoughtcrime.securesms.util;
import android.annotation.SuppressLint;
-import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.content.ClipData;
import android.content.ClipboardManager;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/adapter/mapping/LayoutFactory.java b/app/src/main/java/org/thoughtcrime/securesms/util/adapter/mapping/LayoutFactory.java
index 731c32fb38..438bb89e1c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/adapter/mapping/LayoutFactory.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/adapter/mapping/LayoutFactory.java
@@ -7,8 +7,6 @@ import android.view.ViewGroup;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
-import org.signal.core.util.logging.Log;
-
import java.util.function.Function;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java b/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java
index a0c4fcd05b..a422531476 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java
@@ -39,7 +39,6 @@ import androidx.media3.exoplayer.source.DefaultMediaSourceFactory;
import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.ui.AspectRatioFrameLayout;
import androidx.media3.ui.LegacyPlayerControlView;
-import androidx.media3.ui.PlayerControlView;
import androidx.media3.ui.PlayerView;
import org.signal.core.util.logging.Log;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/video/videoconverter/VideoThumbnailsExtractor.java b/app/src/main/java/org/thoughtcrime/securesms/video/videoconverter/VideoThumbnailsExtractor.java
index 8f7309d69e..a5187cea80 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/video/videoconverter/VideoThumbnailsExtractor.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/video/videoconverter/VideoThumbnailsExtractor.java
@@ -12,7 +12,6 @@ import androidx.annotation.RequiresApi;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.media.MediaInput;
-import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/IncomingRinger.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/IncomingRinger.java
index bf2bb59154..03ca589696 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/IncomingRinger.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/IncomingRinger.java
@@ -8,7 +8,6 @@ import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import android.os.Vibrator;
-import android.provider.Settings;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
diff --git a/app/src/test/java/org/thoughtcrime/securesms/groups/v2/ProfileKeySetTest.java b/app/src/test/java/org/thoughtcrime/securesms/groups/v2/ProfileKeySetTest.java
index 1367d4abde..9d21f52597 100644
--- a/app/src/test/java/org/thoughtcrime/securesms/groups/v2/ProfileKeySetTest.java
+++ b/app/src/test/java/org/thoughtcrime/securesms/groups/v2/ProfileKeySetTest.java
@@ -6,7 +6,6 @@ import org.signal.libsignal.zkgroup.profiles.ProfileKey;
import org.thoughtcrime.securesms.crypto.ProfileKeyUtil;
import org.thoughtcrime.securesms.testutil.LogRecorder;
import org.whispersystems.signalservice.api.push.ServiceId.ACI;
-import org.whispersystems.signalservice.api.push.ServiceId;
import java.util.Collections;
import java.util.UUID;
diff --git a/app/src/test/java/org/thoughtcrime/securesms/storage/StorageSyncHelperTest.java b/app/src/test/java/org/thoughtcrime/securesms/storage/StorageSyncHelperTest.java
index 3b4fb873af..d2aa7a6af5 100644
--- a/app/src/test/java/org/thoughtcrime/securesms/storage/StorageSyncHelperTest.java
+++ b/app/src/test/java/org/thoughtcrime/securesms/storage/StorageSyncHelperTest.java
@@ -13,7 +13,6 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.storage.StorageSyncHelper.IdDifferenceResult;
import org.thoughtcrime.securesms.util.FeatureFlags;
-import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.api.push.ServiceId.ACI;
import org.whispersystems.signalservice.api.storage.SignalAccountRecord;
import org.whispersystems.signalservice.api.storage.SignalContactRecord;
diff --git a/build.gradle b/build.gradle
index 497cd3b363..b2e5b9fc88 100644
--- a/build.gradle
+++ b/build.gradle
@@ -65,7 +65,9 @@ subprojects {
}
}
- if (project.name != "Signal-Android" && project.name != "libsignal-service" && project.name != "lintchecks" && !project.name.endsWith("-app") && project.name != "benchmark") {
+ def skipQa = [ 'Signal-Android', 'libsignal-service', 'lintchecks', 'benchmark', 'core-util-jvm', 'logging' ] as Set
+
+ if (!skipQa.contains(project.name) && !project.name.endsWith("-app")) {
task qa {
group 'Verification'
description 'Quality Assurance. Run before pushing'
@@ -93,7 +95,9 @@ task qa {
':libsignal-service:test',
':libsignal-service:ktlintCheck',
':Signal-Android:assemblePlayProdRelease',
- ':Signal-Android:compilePlayProdInstrumentationAndroidTestSources'
+ ':Signal-Android:compilePlayProdInstrumentationAndroidTestSources',
+ ':core-util-jvm:test',
+ ':core-util-jvm:ktlintCheck'
}
task clean(type: Delete) {
diff --git a/core-util-jvm/.gitignore b/core-util-jvm/.gitignore
new file mode 100644
index 0000000000..42afabfd2a
--- /dev/null
+++ b/core-util-jvm/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/core-util-jvm/build.gradle.kts b/core-util-jvm/build.gradle.kts
new file mode 100644
index 0000000000..566f1e1e0a
--- /dev/null
+++ b/core-util-jvm/build.gradle.kts
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2023 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+val signalJavaVersion: JavaVersion by rootProject.extra
+
+plugins {
+ id("java-library")
+ id("org.jetbrains.kotlin.jvm")
+ id("ktlint")
+}
+
+java {
+ sourceCompatibility = signalJavaVersion
+ targetCompatibility = signalJavaVersion
+}
+
+dependencies {
+ testImplementation(testLibs.junit.junit)
+}
diff --git a/core-util/src/main/java/org/signal/core/util/Bitmask.java b/core-util-jvm/src/main/java/org/signal/core/util/Bitmask.java
similarity index 97%
rename from core-util/src/main/java/org/signal/core/util/Bitmask.java
rename to core-util-jvm/src/main/java/org/signal/core/util/Bitmask.java
index 8e82e74b69..9a1e391c0c 100644
--- a/core-util/src/main/java/org/signal/core/util/Bitmask.java
+++ b/core-util-jvm/src/main/java/org/signal/core/util/Bitmask.java
@@ -1,3 +1,8 @@
+/*
+ * Copyright 2023 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
package org.signal.core.util;
import java.util.Locale;
diff --git a/core-util/src/main/java/org/signal/core/util/ByteExtensions.kt b/core-util-jvm/src/main/java/org/signal/core/util/ByteExtensions.kt
similarity index 100%
rename from core-util/src/main/java/org/signal/core/util/ByteExtensions.kt
rename to core-util-jvm/src/main/java/org/signal/core/util/ByteExtensions.kt
diff --git a/core-util/src/main/java/org/signal/core/util/DoubleExtensions.kt b/core-util-jvm/src/main/java/org/signal/core/util/DoubleExtensions.kt
similarity index 100%
rename from core-util/src/main/java/org/signal/core/util/DoubleExtensions.kt
rename to core-util-jvm/src/main/java/org/signal/core/util/DoubleExtensions.kt
diff --git a/core-util/src/main/java/org/signal/core/util/FloatExtensions.kt b/core-util-jvm/src/main/java/org/signal/core/util/FloatExtensions.kt
similarity index 100%
rename from core-util/src/main/java/org/signal/core/util/FloatExtensions.kt
rename to core-util-jvm/src/main/java/org/signal/core/util/FloatExtensions.kt
diff --git a/core-util/src/main/java/org/signal/core/util/Hex.java b/core-util-jvm/src/main/java/org/signal/core/util/Hex.java
similarity index 83%
rename from core-util/src/main/java/org/signal/core/util/Hex.java
rename to core-util-jvm/src/main/java/org/signal/core/util/Hex.java
index bf2265bd56..b26029116f 100644
--- a/core-util/src/main/java/org/signal/core/util/Hex.java
+++ b/core-util-jvm/src/main/java/org/signal/core/util/Hex.java
@@ -1,18 +1,6 @@
-/**
- * Copyright (C) 2011 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 .
+/*
+ * Copyright 2023 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.core.util;
diff --git a/core-util/src/main/java/org/signal/core/util/OptionalExtensions.kt b/core-util-jvm/src/main/java/org/signal/core/util/OptionalExtensions.kt
similarity index 81%
rename from core-util/src/main/java/org/signal/core/util/OptionalExtensions.kt
rename to core-util-jvm/src/main/java/org/signal/core/util/OptionalExtensions.kt
index 997eb08f76..9f4cf286ff 100644
--- a/core-util/src/main/java/org/signal/core/util/OptionalExtensions.kt
+++ b/core-util-jvm/src/main/java/org/signal/core/util/OptionalExtensions.kt
@@ -1,3 +1,8 @@
+/*
+ * Copyright 2023 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
package org.signal.core.util
import java.util.Optional
diff --git a/core-util/src/main/java/org/signal/core/util/SetUtil.java b/core-util-jvm/src/main/java/org/signal/core/util/SetUtil.java
similarity index 90%
rename from core-util/src/main/java/org/signal/core/util/SetUtil.java
rename to core-util-jvm/src/main/java/org/signal/core/util/SetUtil.java
index 6ec1ef04e2..404a65f09a 100644
--- a/core-util/src/main/java/org/signal/core/util/SetUtil.java
+++ b/core-util-jvm/src/main/java/org/signal/core/util/SetUtil.java
@@ -1,3 +1,8 @@
+/*
+ * Copyright 2023 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
package org.signal.core.util;
import java.util.Arrays;
diff --git a/core-util/src/main/java/org/signal/core/util/Stopwatch.kt b/core-util-jvm/src/main/java/org/signal/core/util/Stopwatch.kt
similarity index 95%
rename from core-util/src/main/java/org/signal/core/util/Stopwatch.kt
rename to core-util-jvm/src/main/java/org/signal/core/util/Stopwatch.kt
index 0f4d2b3f8c..670fe90e43 100644
--- a/core-util/src/main/java/org/signal/core/util/Stopwatch.kt
+++ b/core-util-jvm/src/main/java/org/signal/core/util/Stopwatch.kt
@@ -1,3 +1,8 @@
+/*
+ * Copyright 2023 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
package org.signal.core.util
import org.signal.core.util.logging.Log
diff --git a/core-util-jvm/src/main/java/org/signal/core/util/logging/CompoundLogger.kt b/core-util-jvm/src/main/java/org/signal/core/util/logging/CompoundLogger.kt
new file mode 100644
index 0000000000..1d61bbe557
--- /dev/null
+++ b/core-util-jvm/src/main/java/org/signal/core/util/logging/CompoundLogger.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2023 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+package org.signal.core.util.logging
+
+/**
+ * A way to treat N loggers as one. Wraps a bunch of other loggers and forwards the method calls to
+ * all of them.
+ */
+internal class CompoundLogger(private val loggers: List) : Log.Logger() {
+ override fun v(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) {
+ for (logger in loggers) {
+ logger.v(tag, message, t, keepLonger)
+ }
+ }
+
+ override fun d(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) {
+ for (logger in loggers) {
+ logger.d(tag, message, t, keepLonger)
+ }
+ }
+
+ override fun i(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) {
+ for (logger in loggers) {
+ logger.i(tag, message, t, keepLonger)
+ }
+ }
+
+ override fun w(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) {
+ for (logger in loggers) {
+ logger.w(tag, message, t, keepLonger)
+ }
+ }
+
+ override fun e(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) {
+ for (logger in loggers) {
+ logger.e(tag, message, t, keepLonger)
+ }
+ }
+
+ override fun flush() {
+ for (logger in loggers) {
+ logger.flush()
+ }
+ }
+}
diff --git a/core-util-jvm/src/main/java/org/signal/core/util/logging/Log.kt b/core-util-jvm/src/main/java/org/signal/core/util/logging/Log.kt
new file mode 100644
index 0000000000..dd957ac75b
--- /dev/null
+++ b/core-util-jvm/src/main/java/org/signal/core/util/logging/Log.kt
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2023 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+package org.signal.core.util.logging
+
+object Log {
+ private val NOOP_LOGGER: Logger = NoopLogger()
+ private var internalCheck: InternalCheck? = null
+ private var logger: Logger = NoopLogger()
+
+ /**
+ * @param internalCheck A checker that will indicate if this is an internal user
+ * @param loggers A list of loggers that will be given every log statement.
+ */
+ @JvmStatic
+ fun initialize(internalCheck: InternalCheck?, vararg loggers: Logger) {
+ Log.internalCheck = internalCheck
+ logger = CompoundLogger(loggers.toList())
+ }
+
+ @JvmStatic
+ fun initialize(vararg loggers: Logger) {
+ initialize({ false }, *loggers)
+ }
+
+ @JvmStatic
+ fun v(tag: String, message: String) = v(tag, message, null)
+
+ @JvmStatic
+ fun v(tag: String, t: Throwable?) = v(tag, null, t)
+
+ @JvmStatic
+ fun v(tag: String, message: String?, t: Throwable?) = v(tag, message, t, false)
+
+ @JvmStatic
+ fun v(tag: String, message: String?, keepLonger: Boolean) = v(tag, message, null, keepLonger)
+
+ @JvmStatic
+ fun v(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = logger.v(tag, message, t, keepLonger)
+
+ @JvmStatic
+ fun d(tag: String, message: String) = d(tag, message, null)
+
+ @JvmStatic
+ fun d(tag: String, t: Throwable?) = d(tag, null, t)
+
+ @JvmStatic
+ fun d(tag: String, message: String?, t: Throwable? = null) = d(tag, message, t, false)
+
+ @JvmStatic
+ fun d(tag: String, message: String?, keepLonger: Boolean) = d(tag, message, null, keepLonger)
+
+ @JvmStatic
+ fun d(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = logger.d(tag, message, t, keepLonger)
+
+ @JvmStatic
+ fun i(tag: String, message: String) = i(tag, message, null)
+
+ @JvmStatic
+ fun i(tag: String, t: Throwable?) = i(tag, null, t)
+
+ @JvmStatic
+ fun i(tag: String, message: String?, t: Throwable? = null) = i(tag, message, t, false)
+
+ @JvmStatic
+ fun i(tag: String, message: String?, keepLonger: Boolean) = i(tag, message, null, keepLonger)
+
+ @JvmStatic
+ fun i(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = logger.i(tag, message, t, keepLonger)
+
+ @JvmStatic
+ fun w(tag: String, message: String) = w(tag, message, null)
+
+ @JvmStatic
+ fun w(tag: String, t: Throwable?) = w(tag, null, t)
+
+ @JvmStatic
+ fun w(tag: String, message: String?, t: Throwable? = null) = w(tag, message, t, false)
+
+ @JvmStatic
+ fun w(tag: String, message: String?, keepLonger: Boolean) = logger.w(tag, message, keepLonger)
+
+ @JvmStatic
+ fun w(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) {
+ logger.w(tag, message, t, keepLonger)
+ }
+
+ @JvmStatic
+ fun e(tag: String, message: String) = e(tag, message, null)
+
+ @JvmStatic
+ fun e(tag: String, t: Throwable?) = e(tag, null, t)
+
+ @JvmStatic
+ fun e(tag: String, message: String?, t: Throwable? = null) = e(tag, message, t, false)
+
+ @JvmStatic
+ fun e(tag: String, message: String?, keepLonger: Boolean) = e(tag, message, null, keepLonger)
+
+ @JvmStatic
+ fun e(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = logger.e(tag, message, t, keepLonger)
+
+ @JvmStatic
+ fun tag(clazz: Class<*>): String {
+ val simpleName = clazz.simpleName
+
+ return if (simpleName.length > 23) {
+ simpleName.substring(0, 23)
+ } else {
+ simpleName
+ }
+ }
+
+ /**
+ * Important: This is not something that can be used to log PII. Instead, it's intended use is for
+ * logs that might be too verbose or otherwise unnecessary for public users.
+ *
+ * @return The normal logger if this is an internal user, or a no-op logger if it isn't.
+ */
+ @JvmStatic
+ fun internal(): Logger {
+ return if (internalCheck!!.isInternal()) {
+ logger
+ } else {
+ NOOP_LOGGER
+ }
+ }
+
+ @JvmStatic
+ fun blockUntilAllWritesFinished() {
+ logger.flush()
+ }
+
+ abstract class Logger {
+ abstract fun v(tag: String, message: String?, t: Throwable?, keepLonger: Boolean)
+ abstract fun d(tag: String, message: String?, t: Throwable?, keepLonger: Boolean)
+ abstract fun i(tag: String, message: String?, t: Throwable?, keepLonger: Boolean)
+ abstract fun w(tag: String, message: String?, t: Throwable?, keepLonger: Boolean)
+ abstract fun e(tag: String, message: String?, t: Throwable?, keepLonger: Boolean)
+ abstract fun flush()
+
+ fun v(tag: String, message: String?) = v(tag, message, null)
+ fun v(tag: String, message: String?, t: Throwable?) = v(tag, message, t, false)
+ fun v(tag: String, message: String?, keepLonger: Boolean) = v(tag, message, null, keepLonger)
+
+ fun d(tag: String, message: String?) = d(tag, message, null)
+ fun d(tag: String, message: String?, t: Throwable?) = d(tag, message, t, false)
+ fun d(tag: String, message: String?, keepLonger: Boolean) = d(tag, message, null, keepLonger)
+
+ fun i(tag: String, message: String?) = i(tag, message, null)
+ fun i(tag: String, message: String?, t: Throwable?) = i(tag, message, t, false)
+ fun i(tag: String, message: String?, keepLonger: Boolean) = i(tag, message, null, keepLonger)
+
+ fun w(tag: String, message: String?) = w(tag, message, null)
+ fun w(tag: String, message: String?, t: Throwable?) = w(tag, message, t, false)
+ fun w(tag: String, message: String?, keepLonger: Boolean) = w(tag, message, null, keepLonger)
+
+ fun e(tag: String, message: String?) = e(tag, message, null)
+ fun e(tag: String, message: String?, t: Throwable?) = e(tag, message, t, false)
+ fun e(tag: String, message: String?, keepLonger: Boolean) = e(tag, message, null, keepLonger)
+ }
+
+ fun interface InternalCheck {
+ fun isInternal(): Boolean
+ }
+}
diff --git a/core-util-jvm/src/main/java/org/signal/core/util/logging/NoopLogger.kt b/core-util-jvm/src/main/java/org/signal/core/util/logging/NoopLogger.kt
new file mode 100644
index 0000000000..bd7abd950b
--- /dev/null
+++ b/core-util-jvm/src/main/java/org/signal/core/util/logging/NoopLogger.kt
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2023 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+package org.signal.core.util.logging
+
+/**
+ * A logger that does nothing.
+ */
+internal class NoopLogger : Log.Logger() {
+ override fun v(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = Unit
+ override fun d(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = Unit
+ override fun i(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = Unit
+ override fun w(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = Unit
+ override fun e(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = Unit
+ override fun flush() = Unit
+}
diff --git a/core-util/src/main/java/org/signal/core/util/logging/Scrubber.kt b/core-util-jvm/src/main/java/org/signal/core/util/logging/Scrubber.kt
similarity index 90%
rename from core-util/src/main/java/org/signal/core/util/logging/Scrubber.kt
rename to core-util-jvm/src/main/java/org/signal/core/util/logging/Scrubber.kt
index c408135e56..5179280733 100644
--- a/core-util/src/main/java/org/signal/core/util/logging/Scrubber.kt
+++ b/core-util-jvm/src/main/java/org/signal/core/util/logging/Scrubber.kt
@@ -1,19 +1,8 @@
/*
- * 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 .
+ * Copyright 2023 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
+
package org.signal.core.util.logging
import java.util.regex.Matcher
diff --git a/core-util/src/test/java/org/signal/core/util/logging/LogTest.java b/core-util-jvm/src/test/java/org/signal/core/util/logging/LogTest.java
similarity index 65%
rename from core-util/src/test/java/org/signal/core/util/logging/LogTest.java
rename to core-util-jvm/src/test/java/org/signal/core/util/logging/LogTest.java
index 7e70a9ef7a..0bb4880a43 100644
--- a/core-util/src/test/java/org/signal/core/util/logging/LogTest.java
+++ b/core-util-jvm/src/test/java/org/signal/core/util/logging/LogTest.java
@@ -1,5 +1,11 @@
+/*
+ * Copyright 2023 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
package org.signal.core.util.logging;
+import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
@@ -14,15 +20,15 @@ public final class LogTest {
@Test
public void tag_23_character_class_name() {
String tag = Log.tag(TwentyThreeCharacters23.class);
- assertEquals("TwentyThreeCharacters23", tag);
- assertEquals(23, tag.length());
+ Assert.assertEquals("TwentyThreeCharacters23", tag);
+ Assert.assertEquals(23, tag.length());
}
@Test
public void tag_24_character_class_name() {
- assertEquals(24, TwentyFour24Characters24.class.getSimpleName().length());
+ Assert.assertEquals(24, TwentyFour24Characters24.class.getSimpleName().length());
String tag = Log.tag(TwentyFour24Characters24.class);
- assertEquals("TwentyFour24Characters2", tag);
+ Assert.assertEquals("TwentyFour24Characters2", tag);
assertEquals(23, Log.tag(TwentyThreeCharacters23.class).length());
}
diff --git a/core-util/src/test/java/org/signal/core/util/logging/ScrubberTest.kt b/core-util-jvm/src/test/java/org/signal/core/util/logging/ScrubberTest.kt
similarity index 98%
rename from core-util/src/test/java/org/signal/core/util/logging/ScrubberTest.kt
rename to core-util-jvm/src/test/java/org/signal/core/util/logging/ScrubberTest.kt
index 8d91f3af20..fa550aad9f 100644
--- a/core-util/src/test/java/org/signal/core/util/logging/ScrubberTest.kt
+++ b/core-util-jvm/src/test/java/org/signal/core/util/logging/ScrubberTest.kt
@@ -1,3 +1,8 @@
+/*
+ * Copyright 2023 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
package org.signal.core.util.logging
import org.junit.Assert
diff --git a/core-util/build.gradle b/core-util/build.gradle
index 16faf75e25..286409c2a4 100644
--- a/core-util/build.gradle
+++ b/core-util/build.gradle
@@ -9,6 +9,8 @@ android {
}
dependencies {
+ api(project(':core-util-jvm'))
+
implementation libs.androidx.sqlite
testImplementation testLibs.junit.junit
diff --git a/core-util/src/main/java/org/signal/core/util/ColorUtil.java b/core-util/src/main/java/org/signal/core/util/ColorUtil.java
deleted file mode 100644
index bd063cd186..0000000000
--- a/core-util/src/main/java/org/signal/core/util/ColorUtil.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.signal.core.util;
-
-import androidx.annotation.ColorInt;
-import androidx.annotation.FloatRange;
-
-public final class ColorUtil {
-
- private ColorUtil() {}
-
- public static int blendARGB(@ColorInt int color1,
- @ColorInt int color2,
- @FloatRange(from = 0.0, to = 1.0) float ratio)
- {
- final float inverseRatio = 1 - ratio;
-
- float a = alpha(color1) * inverseRatio + alpha(color2) * ratio;
- float r = red(color1) * inverseRatio + red(color2) * ratio;
- float g = green(color1) * inverseRatio + green(color2) * ratio;
- float b = blue(color1) * inverseRatio + blue(color2) * ratio;
-
- return argb((int) a, (int) r, (int) g, (int) b);
- }
-
- private static int alpha(int color) {
- return color >>> 24;
- }
-
- private static int red(int color) {
- return (color >> 16) & 0xFF;
- }
-
- private static int green(int color) {
- return (color >> 8) & 0xFF;
- }
-
- private static int blue(int color) {
- return color & 0xFF;
- }
-
- private static int argb(int alpha, int red, int green, int blue) {
- return (alpha << 24) | (red << 16) | (green << 8) | blue;
- }
-}
diff --git a/core-util/src/main/java/org/signal/core/util/GraphemeClusterLimitFilter.java b/core-util/src/main/java/org/signal/core/util/GraphemeClusterLimitFilter.java
index 37dafeec35..e460fbeff3 100644
--- a/core-util/src/main/java/org/signal/core/util/GraphemeClusterLimitFilter.java
+++ b/core-util/src/main/java/org/signal/core/util/GraphemeClusterLimitFilter.java
@@ -5,6 +5,7 @@ import android.text.Spanned;
import org.signal.core.util.logging.Log;
+
/**
* This filter will constrain edits not to make the number of character breaks of the text
* greater than the specified maximum.
diff --git a/core-util/src/main/java/org/signal/core/util/logging/AndroidLogger.java b/core-util/src/main/java/org/signal/core/util/logging/AndroidLogger.java
index 0f729c9283..c83c41af48 100644
--- a/core-util/src/main/java/org/signal/core/util/logging/AndroidLogger.java
+++ b/core-util/src/main/java/org/signal/core/util/logging/AndroidLogger.java
@@ -2,6 +2,8 @@ package org.signal.core.util.logging;
import android.annotation.SuppressLint;
+import org.signal.core.util.logging.Log;
+
@SuppressLint("LogNotSignal")
public final class AndroidLogger extends Log.Logger {
diff --git a/core-util/src/main/java/org/signal/core/util/logging/CompoundLogger.java b/core-util/src/main/java/org/signal/core/util/logging/CompoundLogger.java
deleted file mode 100644
index cb13255e94..0000000000
--- a/core-util/src/main/java/org/signal/core/util/logging/CompoundLogger.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package org.signal.core.util.logging;
-
-import androidx.annotation.NonNull;
-
-/**
- * A way to treat N loggers as one. Wraps a bunch of other loggers and forwards the method calls to
- * all of them.
- */
-class CompoundLogger extends Log.Logger {
-
- private final Log.Logger[] loggers;
-
- CompoundLogger(@NonNull Log.Logger... loggers) {
- this.loggers = loggers;
- }
-
- @Override
- public void v(String tag, String message, Throwable t, boolean keepLonger) {
- for (Log.Logger logger : loggers) {
- logger.v(tag, message, t, keepLonger);
- }
- }
-
- @Override
- public void d(String tag, String message, Throwable t, boolean keepLonger) {
- for (Log.Logger logger : loggers) {
- logger.d(tag, message, t, keepLonger);
- }
- }
-
- @Override
- public void i(String tag, String message, Throwable t, boolean keepLonger) {
- for (Log.Logger logger : loggers) {
- logger.i(tag, message, t, keepLonger);
- }
- }
-
- @Override
- public void w(String tag, String message, Throwable t, boolean keepLonger) {
- for (Log.Logger logger : loggers) {
- logger.w(tag, message, t, keepLonger);
- }
- }
-
- @Override
- public void e(String tag, String message, Throwable t, boolean keepLonger) {
- for (Log.Logger logger : loggers) {
- logger.e(tag, message, t, keepLonger);
- }
- }
-
- @Override
- public void v(String tag, String message, Throwable t) {
- for (Log.Logger logger :loggers) {
- logger.v(tag, message, t);
- }
- }
-
- @Override
- public void d(String tag, String message, Throwable t) {
- for (Log.Logger logger :loggers) {
- logger.d(tag, message, t);
- }
- }
-
- @Override
- public void i(String tag, String message, Throwable t) {
- for (Log.Logger logger :loggers) {
- logger.i(tag, message, t);
- }
- }
-
- @Override
- public void w(String tag, String message, Throwable t) {
- for (Log.Logger logger :loggers) {
- logger.w(tag, message, t);
- }
- }
-
- @Override
- public void e(String tag, String message, Throwable t) {
- for (Log.Logger logger :loggers) {
- logger.e(tag, message, t);
- }
- }
-
- @Override
- public void v(String tag, String message) {
- for (Log.Logger logger :loggers) {
- logger.v(tag, message);
- }
- }
-
- @Override
- public void d(String tag, String message) {
- for (Log.Logger logger :loggers) {
- logger.d(tag, message);
- }
- }
-
- @Override
- public void i(String tag, String message) {
- for (Log.Logger logger :loggers) {
- logger.i(tag, message);
- }
- }
-
- @Override
- public void w(String tag, String message) {
- for (Log.Logger logger :loggers) {
- logger.w(tag, message);
- }
- }
-
- @Override
- public void e(String tag, String message) {
- for (Log.Logger logger :loggers) {
- logger.e(tag, message);
- }
- }
-
- @Override
- public void flush() {
- for (Log.Logger logger : loggers) {
- logger.flush();
- }
- }
-}
diff --git a/core-util/src/main/java/org/signal/core/util/logging/Log.java b/core-util/src/main/java/org/signal/core/util/logging/Log.java
deleted file mode 100644
index 9d306dc57a..0000000000
--- a/core-util/src/main/java/org/signal/core/util/logging/Log.java
+++ /dev/null
@@ -1,229 +0,0 @@
-package org.signal.core.util.logging;
-
-import android.annotation.SuppressLint;
-
-import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-
-@SuppressLint("LogNotSignal")
-public final class Log {
-
- private static final Logger NOOP_LOGGER = new NoopLogger();
-
- private static InternalCheck internalCheck;
- private static Logger logger = new AndroidLogger();
-
- /**
- * @param internalCheck A checker that will indicate if this is an internal user
- * @param loggers A list of loggers that will be given every log statement.
- */
- @MainThread
- public static void initialize(@NonNull InternalCheck internalCheck, Logger... loggers) {
- Log.internalCheck = internalCheck;
- Log.logger = new CompoundLogger(loggers);
- }
-
- public static void initialize(Logger... loggers) {
- initialize(() -> false, loggers);
- }
-
- public static void v(String tag, String message) {
- v(tag, message, null);
- }
-
- public static void d(String tag, String message) {
- d(tag, message, null);
- }
-
- public static void i(String tag, String message) {
- i(tag, message, null);
- }
-
- public static void w(String tag, String message) {
- w(tag, message, null);
- }
-
- public static void e(String tag, String message) {
- e(tag, message, null);
- }
-
- public static void v(String tag, Throwable t) {
- v(tag, null, t);
- }
-
- public static void d(String tag, Throwable t) {
- d(tag, null, t);
- }
-
- public static void i(String tag, Throwable t) {
- i(tag, null, t);
- }
-
- public static void w(String tag, Throwable t) {
- w(tag, null, t);
- }
-
- public static void e(String tag, Throwable t) {
- e(tag, null, t);
- }
-
- public static void v(String tag, String message, Throwable t) {
- logger.v(tag, message, t);
- }
-
- public static void d(String tag, String message, Throwable t) {
- logger.d(tag, message, t);
- }
-
- public static void i(String tag, String message, Throwable t) {
- logger.i(tag, message, t);
- }
-
- public static void w(String tag, String message, Throwable t) {
- logger.w(tag, message, t);
- }
-
- public static void e(String tag, String message, Throwable t) {
- logger.e(tag, message, t);
- }
-
- public static void v(String tag, String message, boolean keepLonger) {
- logger.v(tag, message, keepLonger);
- }
-
- public static void d(String tag, String message, boolean keepLonger) {
- logger.d(tag, message, keepLonger);
- }
-
- public static void i(String tag, String message, boolean keepLonger) {
- logger.i(tag, message, keepLonger);
- }
-
- public static void w(String tag, String message, boolean keepLonger) {
- logger.w(tag, message, keepLonger);
- }
-
- public static void e(String tag, String message, boolean keepLonger) {
- logger.e(tag, message, keepLonger);
- }
-
- public static void v(String tag, String message, Throwable t, boolean keepLonger) {
- logger.v(tag, message, t, keepLonger);
- }
-
- public static void d(String tag, String message, Throwable t, boolean keepLonger) {
- logger.d(tag, message, t, keepLonger);
- }
-
- public static void i(String tag, String message, Throwable t, boolean keepLonger) {
- logger.i(tag, message, t, keepLonger);
- }
-
- public static void w(String tag, String message, Throwable t, boolean keepLonger) {
- logger.w(tag, message, t, keepLonger);
- }
-
- public static void e(String tag, String message, Throwable t, boolean keepLonger) {
- logger.e(tag, message, t, keepLonger);
- }
-
- public static @NonNull String tag(Class> clazz) {
- String simpleName = clazz.getSimpleName();
- if (simpleName.length() > 23) {
- return simpleName.substring(0, 23);
- }
- return simpleName;
- }
-
- /**
- * Important: This is not something that can be used to log PII. Instead, it's intended use is for
- * logs that might be too verbose or otherwise unnecessary for public users.
- *
- * @return The normal logger if this is an internal user, or a no-op logger if it isn't.
- */
- public static Logger internal() {
- if (internalCheck.isInternal()) {
- return logger;
- } else {
- return NOOP_LOGGER;
- }
- }
-
- public static void blockUntilAllWritesFinished() {
- logger.flush();
- }
-
- public static abstract class Logger {
-
- public abstract void v(String tag, String message, Throwable t, boolean keepLonger);
- public abstract void d(String tag, String message, Throwable t, boolean keepLonger);
- public abstract void i(String tag, String message, Throwable t, boolean keepLonger);
- public abstract void w(String tag, String message, Throwable t, boolean keepLonger);
- public abstract void e(String tag, String message, Throwable t, boolean keepLonger);
- public abstract void flush();
-
- public void v(String tag, String message, boolean keepLonger) {
- v(tag, message, null, keepLonger);
- }
-
- public void d(String tag, String message, boolean keepLonger) {
- d(tag, message, null, keepLonger);
- }
-
- public void i(String tag, String message, boolean keepLonger) {
- i(tag, message, null, keepLonger);
- }
-
- public void w(String tag, String message, boolean keepLonger) {
- w(tag, message, null, keepLonger);
- }
-
- public void e(String tag, String message, boolean keepLonger) {
- e(tag, message, null, keepLonger);
- }
-
- public void v(String tag, String message, Throwable t) {
- v(tag, message, t, false);
- }
-
- public void d(String tag, String message, Throwable t) {
- d(tag, message, t, false);
- }
-
- public void i(String tag, String message, Throwable t) {
- i(tag, message, t, false);
- }
-
- public void w(String tag, String message, Throwable t) {
- w(tag, message, t, false);
- }
-
- public void e(String tag, String message, Throwable t) {
- e(tag, message, t, false);
- }
-
- public void v(String tag, String message) {
- v(tag, message, null);
- }
-
- public void d(String tag, String message) {
- d(tag, message, null);
- }
-
- public void i(String tag, String message) {
- i(tag, message, null);
- }
-
- public void w(String tag, String message) {
- w(tag, message, null);
- }
-
- public void e(String tag, String message) {
- e(tag, message, null);
- }
- }
-
- public interface InternalCheck {
- boolean isInternal();
- }
-}
diff --git a/core-util/src/main/java/org/signal/core/util/logging/NoopLogger.java b/core-util/src/main/java/org/signal/core/util/logging/NoopLogger.java
deleted file mode 100644
index 827b401ae5..0000000000
--- a/core-util/src/main/java/org/signal/core/util/logging/NoopLogger.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.signal.core.util.logging;
-
-/**
- * A logger that does nothing.
- */
-class NoopLogger extends Log.Logger {
- @Override
- public void v(String tag, String message, Throwable t, boolean keepLonger) { }
-
- @Override
- public void d(String tag, String message, Throwable t, boolean keepLonger) { }
-
- @Override
- public void i(String tag, String message, Throwable t, boolean keepLonger) { }
-
- @Override
- public void w(String tag, String message, Throwable t, boolean keepLonger) { }
-
- @Override
- public void e(String tag, String message, Throwable t, boolean keepLonger) { }
-
- @Override
- public void flush() { }
-}
diff --git a/device-transfer/lib/src/main/java/org/signal/devicetransfer/DeviceToDeviceTransferService.java b/device-transfer/lib/src/main/java/org/signal/devicetransfer/DeviceToDeviceTransferService.java
index cbe2a76bbc..447f808b2a 100644
--- a/device-transfer/lib/src/main/java/org/signal/devicetransfer/DeviceToDeviceTransferService.java
+++ b/device-transfer/lib/src/main/java/org/signal/devicetransfer/DeviceToDeviceTransferService.java
@@ -21,7 +21,6 @@ import org.greenrobot.eventbus.ThreadMode;
import org.signal.core.util.ThreadUtil;
import org.signal.core.util.logging.Log;
-import java.io.Serializable;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
diff --git a/donations/lib/src/test/java/org/signal/donations/ResponseFieldLoggerTest.kt b/donations/lib/src/test/java/org/signal/donations/ResponseFieldLoggerTest.kt
index 718dec68d3..b5a8dd4838 100644
--- a/donations/lib/src/test/java/org/signal/donations/ResponseFieldLoggerTest.kt
+++ b/donations/lib/src/test/java/org/signal/donations/ResponseFieldLoggerTest.kt
@@ -11,11 +11,11 @@ class ResponseFieldLoggerTest {
@Before
fun setUp() {
Log.initialize(object : Logger() {
- override fun v(tag: String?, message: String?, t: Throwable?, keepLonger: Boolean) = Unit
- override fun d(tag: String?, message: String?, t: Throwable?, keepLonger: Boolean) = Unit
- override fun i(tag: String?, message: String?, t: Throwable?, keepLonger: Boolean) = Unit
- override fun w(tag: String?, message: String?, t: Throwable?, keepLonger: Boolean) = println(message)
- override fun e(tag: String?, message: String?, t: Throwable?, keepLonger: Boolean) = Unit
+ override fun v(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = Unit
+ override fun d(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = Unit
+ override fun i(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = Unit
+ override fun w(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = println(message)
+ override fun e(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) = Unit
override fun flush() = Unit
})
}
diff --git a/lintchecks/src/test/java/org/signal/lint/LogDetectorTest.java b/lintchecks/src/test/java/org/signal/lint/LogDetectorTest.java
index 63a977a88e..a1911ab70b 100644
--- a/lintchecks/src/test/java/org/signal/lint/LogDetectorTest.java
+++ b/lintchecks/src/test/java/org/signal/lint/LogDetectorTest.java
@@ -121,7 +121,7 @@ public final class LogDetectorTest {
lint()
.files(appLogStub,
java("package foo;\n" +
- "import org.signal.core.util.logging.Log;\n" +
+ "import org.signal.log.Log;\n" +
"public class Example {\n" +
" private static final String TAG = Log.tag(Example.class);\n" +
" public void log() {\n" +
@@ -178,7 +178,7 @@ public final class LogDetectorTest {
lint()
.files(appLogStub,
java("package foo;\n" +
- "import org.signal.core.util.logging.Log;\n" +
+ "import org.signal.log.Log;\n" +
"public class Example {\n" +
" public void log() {\n" +
" Log.d(\"TAG\", \"msg\");\n" +
diff --git a/settings.gradle b/settings.gradle
index f38742db02..5d7b3896fe 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -59,6 +59,7 @@ include ':microbenchmark'
include ':video-app'
include ':glide-webp'
include ':glide-webp-app'
+include ':core-util-jvm'
project(':app').name = 'Signal-Android'
project(':paging').projectDir = file('paging/lib')