diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/SignalInstrumentationApplicationContext.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/SignalInstrumentationApplicationContext.kt index 6451e65187..2cdf9e4944 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/SignalInstrumentationApplicationContext.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/SignalInstrumentationApplicationContext.kt @@ -26,7 +26,7 @@ class SignalInstrumentationApplicationContext : ApplicationContext() { } override fun initializeLogging() { - Log.initialize({ true }, AndroidLogger(), PersistentLogger(this), inMemoryLogger) + Log.initialize({ true }, AndroidLogger, PersistentLogger.getInstance(this), inMemoryLogger) SignalProtocolLoggerProvider.setProvider(CustomSignalProtocolLogger()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java index 6df676ba2c..7d2c270c8c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java @@ -334,7 +334,7 @@ public class ApplicationContext extends Application implements AppForegroundObse @VisibleForTesting protected void initializeLogging() { - Log.initialize(RemoteConfig::internalUser, new AndroidLogger(), new PersistentLogger(this)); + Log.initialize(RemoteConfig::internalUser, AndroidLogger.INSTANCE, PersistentLogger.getInstance(this)); SignalProtocolLoggerProvider.setProvider(new CustomSignalProtocolLogger()); SignalProtocolLoggerProvider.initializeLogging(BuildConfig.LIBSIGNAL_LOG_LEVEL); 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 af8265f23a..3d08bda83f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/logging/PersistentLogger.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/logging/PersistentLogger.kt @@ -25,9 +25,7 @@ import java.util.Locale * - Main thread creates a [LogRequest] object and puts it in a queue * - The [WriteThread] constantly pulls from that queue, formats the logs, and writes them to the database. */ -class PersistentLogger( - application: Application -) : Log.Logger() { +class PersistentLogger private constructor(application: Application) : Log.Logger() { companion object { private const val LOG_V = "V" @@ -35,6 +33,22 @@ class PersistentLogger( private const val LOG_I = "I" private const val LOG_W = "W" private const val LOG_E = "E" + + @Volatile + private var instance: PersistentLogger? = null + + @JvmStatic + fun getInstance(application: Application): PersistentLogger { + if (instance == null) { + synchronized(PersistentLogger::class.java) { + if (instance == null) { + instance = PersistentLogger(application) + } + } + } + + return requireNotNull(instance) + } } private val logEntries = LogRequests() diff --git a/app/src/main/java/org/thoughtcrime/securesms/providers/AvatarProvider.kt b/app/src/main/java/org/thoughtcrime/securesms/providers/AvatarProvider.kt index e95bf8e551..dd36c82a36 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/providers/AvatarProvider.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/providers/AvatarProvider.kt @@ -78,7 +78,7 @@ class AvatarProvider : BaseContentProvider() { SignalStore.init(application) - Log.initialize(RemoteConfig::internalUser, AndroidLogger(), PersistentLogger(application)) + Log.initialize(RemoteConfig::internalUser, AndroidLogger, PersistentLogger.getInstance(application)) if (!AppDependencies.isInitialized) { Log.i(TAG, "Initializing AppDependencies.") diff --git a/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt b/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt index 2285bb03d2..00096cc390 100644 --- a/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt +++ b/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt @@ -87,7 +87,7 @@ class SpinnerApplicationContext : ApplicationContext() { ) ) - Log.initialize({ RemoteConfig.internalUser }, AndroidLogger(), PersistentLogger(this), SpinnerLogger()) + Log.initialize({ RemoteConfig.internalUser }, AndroidLogger, PersistentLogger.getInstance(this), SpinnerLogger) DatabaseMonitor.initialize(object : QueryMonitor { override fun onSql(sql: String, args: Array?) { diff --git a/core-util/src/main/java/org/signal/core/util/logging/AndroidLogger.kt b/core-util/src/main/java/org/signal/core/util/logging/AndroidLogger.kt index 02b07fbc02..b0d37d7b95 100644 --- a/core-util/src/main/java/org/signal/core/util/logging/AndroidLogger.kt +++ b/core-util/src/main/java/org/signal/core/util/logging/AndroidLogger.kt @@ -6,7 +6,7 @@ import java.util.concurrent.Executor import java.util.concurrent.Executors @SuppressLint("LogNotSignal") -class AndroidLogger : Log.Logger() { +object AndroidLogger : Log.Logger() { private val serialExecutor: Executor = Executors.newSingleThreadExecutor { Thread(it, "signal-logcat") } diff --git a/qr/app/src/main/java/org/signal/qrtest/QrMainActivity.kt b/qr/app/src/main/java/org/signal/qrtest/QrMainActivity.kt index 52385a4a37..1033325ed4 100644 --- a/qr/app/src/main/java/org/signal/qrtest/QrMainActivity.kt +++ b/qr/app/src/main/java/org/signal/qrtest/QrMainActivity.kt @@ -27,7 +27,7 @@ class QrMainActivity : AppCompatActivity() { @SuppressLint("NewApi", "SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { Log.initialize( - AndroidLogger(), + AndroidLogger, object : Log.Logger() { override fun v(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) { printlnFormatted('v', tag, message, t) diff --git a/spinner/app/src/main/java/org/signal/spinnertest/MainActivity.kt b/spinner/app/src/main/java/org/signal/spinnertest/MainActivity.kt index 981f368009..fae095d729 100644 --- a/spinner/app/src/main/java/org/signal/spinnertest/MainActivity.kt +++ b/spinner/app/src/main/java/org/signal/spinnertest/MainActivity.kt @@ -33,7 +33,7 @@ class MainActivity : AppCompatActivity() { emptyMap() ) - Log.initialize(AndroidLogger(), SpinnerLogger()) + Log.initialize(AndroidLogger, SpinnerLogger) object : Thread() { override fun run() { diff --git a/spinner/lib/src/main/java/org/signal/spinner/SpinnerLogger.kt b/spinner/lib/src/main/java/org/signal/spinner/SpinnerLogger.kt index 46dec483b4..6007961f63 100644 --- a/spinner/lib/src/main/java/org/signal/spinner/SpinnerLogger.kt +++ b/spinner/lib/src/main/java/org/signal/spinner/SpinnerLogger.kt @@ -9,7 +9,7 @@ import android.os.Looper import android.util.Log import org.signal.core.util.logging.Log.Logger -class SpinnerLogger : Logger() { +object SpinnerLogger : Logger() { private val cachedThreadString: ThreadLocal = ThreadLocal() diff --git a/video/app/src/main/java/org/thoughtcrime/video/app/MainActivity.kt b/video/app/src/main/java/org/thoughtcrime/video/app/MainActivity.kt index 11441fdd35..0df2d27cb9 100644 --- a/video/app/src/main/java/org/thoughtcrime/video/app/MainActivity.kt +++ b/video/app/src/main/java/org/thoughtcrime/video/app/MainActivity.kt @@ -54,7 +54,7 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - Log.initialize(AndroidLogger()) + Log.initialize(AndroidLogger) val startPlaybackScreen = { saveChoice: Boolean -> proceed(Screen.TEST_PLAYBACK, saveChoice) } val startTranscodeScreen = { saveChoice: Boolean -> proceed(Screen.TEST_TRANSCODE, saveChoice) }