@@ -16,7 +16,9 @@ import com.onesignal.debug.internal.logging.otel.android.AndroidOtelLogger
1616import com.onesignal.debug.internal.logging.otel.android.OtelPlatformProvider
1717import com.onesignal.debug.internal.logging.otel.android.createAndroidOtelPlatformProvider
1818import com.onesignal.otel.IOtelCrashHandler
19+ import com.onesignal.otel.IOtelLogger
1920import com.onesignal.otel.IOtelOpenTelemetryRemote
21+ import com.onesignal.otel.IOtelPlatformProvider
2022import com.onesignal.otel.OtelFactory
2123import com.onesignal.otel.crash.IOtelAnrDetector
2224
@@ -31,18 +33,31 @@ import com.onesignal.otel.crash.IOtelAnrDetector
3133 *
3234 * Thread safety: methods are synchronized on [lock] so that concurrent
3335 * calls from initEssentials (main) and the config store callback (IO) are safe.
36+ *
37+ * All factory parameters default to the real implementations, so production
38+ * callers can use `OtelLifecycleManager(context)`. Tests can override any
39+ * factory to inject mocks or throwing stubs.
3440 */
3541@Suppress(" TooManyFunctions" )
3642internal class OtelLifecycleManager (
3743 private val context : Context ,
44+ private val crashHandlerFactory : (Context , IOtelLogger ) -> IOtelCrashHandler =
45+ { ctx, log -> OneSignalCrashHandlerFactory .createCrashHandler(ctx, log) },
46+ private val anrDetectorFactory : (IOtelPlatformProvider , IOtelLogger , Long , Long ) -> IOtelAnrDetector =
47+ { pp, log, threshold, interval -> createAnrDetector(pp, log, threshold, interval) },
48+ private val remoteTelemetryFactory : (IOtelPlatformProvider ) -> IOtelOpenTelemetryRemote =
49+ { pp -> OtelFactory .createRemoteTelemetry(pp) },
50+ private val platformProviderFactory : (Context ) -> OtelPlatformProvider =
51+ { ctx -> createAndroidOtelPlatformProvider(ctx) },
52+ private val loggerFactory : () -> IOtelLogger = { AndroidOtelLogger () },
3853) : ISingletonModelStoreChangeHandler<ConfigModel> {
3954 private val lock = Any ()
4055
4156 private val platformProvider: OtelPlatformProvider by lazy {
42- createAndroidOtelPlatformProvider (context)
57+ platformProviderFactory (context)
4358 }
4459
45- private val logger = AndroidOtelLogger ()
60+ private val logger: IOtelLogger by lazy { loggerFactory() }
4661
4762 private var crashHandler: IOtelCrashHandler ? = null
4863 private var anrDetector: IOtelAnrDetector ? = null
@@ -192,19 +207,19 @@ internal class OtelLifecycleManager(
192207
193208 private fun startCrashHandler () {
194209 if (crashHandler != null ) return
195- val handler = OneSignalCrashHandlerFactory .createCrashHandler (context, logger)
210+ val handler = crashHandlerFactory (context, logger)
196211 handler.initialize()
197212 crashHandler = handler
198213 Logging .info(" OneSignal: Crash handler initialized — logs at: ${platformProvider.crashStoragePath} " )
199214 }
200215
201216 private fun startAnrDetector () {
202217 if (anrDetector != null ) return
203- val detector = createAnrDetector (
218+ val detector = anrDetectorFactory (
204219 platformProvider,
205220 logger,
206- anrThresholdMs = AnrConstants .DEFAULT_ANR_THRESHOLD_MS ,
207- checkIntervalMs = AnrConstants .DEFAULT_CHECK_INTERVAL_MS ,
221+ AnrConstants .DEFAULT_ANR_THRESHOLD_MS ,
222+ AnrConstants .DEFAULT_CHECK_INTERVAL_MS ,
208223 )
209224 detector.start()
210225 anrDetector = detector
@@ -214,7 +229,7 @@ internal class OtelLifecycleManager(
214229 @Suppress(" TooGenericExceptionCaught" )
215230 private fun startOtelLogging (logLevel : LogLevel ) {
216231 remoteTelemetry?.shutdown()
217- val telemetry = OtelFactory .createRemoteTelemetry (platformProvider)
232+ val telemetry = remoteTelemetryFactory (platformProvider)
218233 remoteTelemetry = telemetry
219234 val shouldSend: (LogLevel ) -> Boolean = { level ->
220235 logLevel != LogLevel .NONE && level <= logLevel
0 commit comments