Skip to content

feat: logging_config-based remote logging control, SDK version gating, and misc Otel fixes#2552

Open
abdulraqeeb33 wants to merge 8 commits intoar-otel-crash-reportingfrom
ar-otel-logging-config
Open

feat: logging_config-based remote logging control, SDK version gating, and misc Otel fixes#2552
abdulraqeeb33 wants to merge 8 commits intoar-otel-crash-reportingfrom
ar-otel-logging-config

Conversation

@abdulraqeeb33
Copy link
Contributor

@abdulraqeeb33 abdulraqeeb33 commented Feb 24, 2026

Summary

  • Remote logging control: Derives isRemoteLoggingEnabled from the presence of a valid log_level in logging_config ({} = disabled, {"log_level": "ERROR"} = enabled). Retains isEnabled as a convenience field in ConfigModel and RemoteLoggingParamsObject.
  • SDK version gating: Introduces OtelSdkSupport utility to gate all Otel features (crash reporting, ANR detection, remote logging) on Android API 26+. OneSignalCrashHandlerFactory now uses require() assertion instead of no-op fallback.
  • Rename OneSignalCrashLogInitOneSignalOtelInit: Reflects broader scope (crash handler + ANR + logging).
  • Includes all 13 commits from PR fix: Otel logging misc fixes #2539 (otel-logging-misc-fixes by @jkasten2):
    • Fix inverse LogLevel logic for omitting
    • Clean up initializeOtelLogging and parseLogLevel
    • Fix processUptime (Double→Long milliseconds)
    • Account for missing Otel classes on Android 7 and older
    • Catch Throwable on otel access to prevent app crashes
    • Lower severity of non-critical log messages (main thread, IAM paused)
    • Address Build.VERSION usage with AndroidUtils wrapper for testability
    • Default logging to NONE on parse error
    • Fix log entries and return NONE on parsing error

Files changed

Key files:

  • OneSignalOtelInit.kt (renamed from OneSignalCrashLogInit.kt) — SDK gate + isEnabled gate + init logic
  • OtelSdkSupport.kt — centralized SDK version check (testable)
  • OtelIdResolver.kt — derives isRemoteLoggingEnabled from logLevel
  • OtelPlatformProvider.ktremoteLogLevel returns null when disabled
  • ConfigModel.kt / ConfigModelStoreListener.kt — persists isEnabled
  • IParamsBackendService.kt — derived isEnabled on RemoteLoggingParamsObject
  • OneSignalCrashHandlerFactory.ktrequire() instead of no-op
  • ParamsBackendService.kt — simplified log level parsing
  • OtelCrashHandler.kt — improved error handling for missing classes
  • Logging.kt / OneSignalCrashUploaderWrapper.kt — Android version checks
  • Demo app changes for testing (crash button, Compose plugin fix)

Test plan

  • Unit tests for OtelSdkSupport (API 26+ gate, reset, override)
  • Unit tests for OtelIdResolver.resolveRemoteLoggingEnabled() (all config permutations)
  • Unit tests for OtelPlatformProvider (isRemoteLoggingEnabled, remoteLogLevel)
  • Existing OneSignalOtelInitTest covers crash handler + logging init paths
  • CrashReportUploadTest for processUptime fix
  • LoggingOtelTest for Build.VERSION usage
  • Manual test on Android 14+ with crash button
  • Manual test on Android 7 emulator (should skip gracefully)

Made with Cursor


This change is Reviewable

… gating

- Derive isRemoteLoggingEnabled from log_level presence in logging_config
  (empty object = disabled, has log_level = enabled)
- Add OtelSdkSupport utility for testable SDK version checks (API 26+)
- Gate all Otel initialization (crash, ANR, remote logging) on both
  SDK support and backend config
- Rename OneSignalCrashLogInit to OneSignalOtelInit to reflect full scope
- Simplify OneSignalCrashHandlerFactory with require() instead of no-op
- Add crash test button in demo app SecondaryActivity
- Fix Compose compiler plugin compatibility with AGP 8.8.2
- Add flow chart documentation for init sequence

Co-authored-by: Cursor <cursoragent@cursor.com>
@@ -0,0 +1,52 @@
sequenceDiagram
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe put these elsewhere?

@github-actions
Copy link
Contributor

github-actions bot commented Feb 24, 2026

📊 Diff Coverage Report

Diff Coverage Report (Changed Lines Only)

Threshold: 80%

Changed Files Coverage

  • JSONUtils.kt: 1/1 changed lines (100.0%) (1 changed lines)
  • ⚠️ CoreModule.kt: Not in coverage report (may not be compiled/tested)
  • IParamsBackendService.kt: 0/8 changed lines (0.0%) (11 changed lines)
    • ⚠️ Below threshold: 8 uncovered changed lines
  • ParamsBackendService.kt: 0/8 changed lines (0.0%) (12 changed lines)
    • ⚠️ Below threshold: 8 uncovered changed lines
  • BackgroundManager.kt: 0/1 changed lines (0.0%) (1 changed lines)
    • ⚠️ Below threshold: 1 uncovered changed lines
  • ConfigModel.kt: 0/14 changed lines (0.0%) (42 changed lines)
    • ⚠️ Below threshold: 14 uncovered changed lines
  • ConfigModelStore.kt: 0/1 changed lines (0.0%) (2 changed lines)
    • ⚠️ Below threshold: 1 uncovered changed lines
  • ConfigModelStoreListener.kt: 0/2 changed lines (0.0%) (3 changed lines)
    • ⚠️ Below threshold: 2 uncovered changed lines
  • HttpClient.kt: 3/3 changed lines (100.0%) (5 changed lines)
  • OperationRepo.kt: 3/3 changed lines (100.0%) (3 changed lines)
  • Time.kt: 0/1 changed lines (0.0%) (6 changed lines)
    • ⚠️ Below threshold: 1 uncovered changed lines
  • LogLevel.kt: 0/1 changed lines (0.0%) (14 changed lines)
    • ⚠️ Below threshold: 1 uncovered changed lines
  • OneSignalCrashHandlerFactory.kt: 0/5 changed lines (0.0%) (38 changed lines)
    • ⚠️ Below threshold: 5 uncovered changed lines
  • OneSignalCrashUploaderWrapper.kt: 0/17 changed lines (0.0%) (60 changed lines)
    • ⚠️ Below threshold: 17 uncovered changed lines
  • OtelAnrDetector.kt: 0/100 changed lines (0.0%) (221 changed lines)
    • ⚠️ Below threshold: 100 uncovered changed lines
  • OtelSdkSupport.kt: 0/4 changed lines (0.0%) (27 changed lines)
    • ⚠️ Below threshold: 4 uncovered changed lines
  • Logging.kt: 4/24 changed lines (16.7%) (75 changed lines)
    • ⚠️ Below threshold: 20 uncovered changed lines
  • AndroidOtelLogger.kt: 9/9 changed lines (100.0%) (26 changed lines)
  • OtelIdResolver.kt: 0/96 changed lines (0.0%) (247 changed lines)
    • ⚠️ Below threshold: 96 uncovered changed lines
  • OtelPlatformProvider.kt: 0/76 changed lines (0.0%) (164 changed lines)
    • ⚠️ Below threshold: 76 uncovered changed lines
  • OneSignalImp.kt: 0/3 changed lines (0.0%) (10 changed lines)
    • ⚠️ Below threshold: 3 uncovered changed lines
  • OtelConfigEvaluator.kt: 20/20 changed lines (100.0%) (68 changed lines)
  • OtelLifecycleManager.kt: 0/117 changed lines (0.0%) (240 changed lines)
    • ⚠️ Below threshold: 117 uncovered changed lines
  • OutcomeEventsController.kt: 4/4 changed lines (100.0%) (4 changed lines)
  • SessionListener.kt: 0/1 changed lines (0.0%) (1 changed lines)
    • ⚠️ Below threshold: 1 uncovered changed lines
  • LoginHelper.kt: 1/1 changed lines (100.0%) (1 changed lines)
  • IdentityModelStore.kt: 0/1 changed lines (0.0%) (3 changed lines)
    • ⚠️ Below threshold: 1 uncovered changed lines
  • InAppMessagesManager.kt: 1/1 changed lines (100.0%) (1 changed lines)
  • InAppBackendService.kt: 1/1 changed lines (100.0%) (1 changed lines)
  • InAppDisplayer.kt: 0/1 changed lines (0.0%) (1 changed lines)
    • ⚠️ Below threshold: 1 uncovered changed lines
  • InAppMessageView.kt: 0/1 changed lines (0.0%) (1 changed lines)
    • ⚠️ Below threshold: 1 uncovered changed lines
  • InAppHydrator.kt: 1/1 changed lines (100.0%) (1 changed lines)
  • LocationManager.kt: 1/1 changed lines (100.0%) (1 changed lines)
  • HmsLocationController.kt: 0/3 changed lines (0.0%) (3 changed lines)
    • ⚠️ Below threshold: 3 uncovered changed lines
  • OneSignalHmsEventBridge.kt: 0/1 changed lines (0.0%) (1 changed lines)
    • ⚠️ Below threshold: 1 uncovered changed lines
  • NotificationChannelManager.kt: 0/2 changed lines (0.0%) (2 changed lines)
    • ⚠️ Below threshold: 2 uncovered changed lines
  • OSWorkManagerHelper.kt: 0/2 changed lines (0.0%) (2 changed lines)
    • ⚠️ Below threshold: 2 uncovered changed lines
  • NotificationRepository.kt: 0/1 changed lines (0.0%) (1 changed lines)
    • ⚠️ Below threshold: 1 uncovered changed lines
  • NotificationGenerationProcessor.kt: 1/3 changed lines (33.3%) (3 changed lines)
    • ⚠️ Below threshold: 2 uncovered changed lines
  • NotificationLifecycleService.kt: 0/7 changed lines (0.0%) (7 changed lines)
    • ⚠️ Below threshold: 7 uncovered changed lines
  • PushTokenManager.kt: 2/2 changed lines (100.0%) (2 changed lines)
  • ReceiveReceiptProcessor.kt: 0/1 changed lines (0.0%) (1 changed lines)
    • ⚠️ Below threshold: 1 uncovered changed lines
  • PushRegistratorADM.kt: 0/2 changed lines (0.0%) (2 changed lines)
    • ⚠️ Below threshold: 2 uncovered changed lines
  • PushRegistratorAbstractGoogle.kt: 0/7 changed lines (0.0%) (7 changed lines)
    • ⚠️ Below threshold: 7 uncovered changed lines
  • PushRegistratorHMS.kt: 0/2 changed lines (0.0%) (2 changed lines)
    • ⚠️ Below threshold: 2 uncovered changed lines
  • NotificationRestoreProcessor.kt: 0/1 changed lines (0.0%) (1 changed lines)
    • ⚠️ Below threshold: 1 uncovered changed lines
  • NotificationRestoreWorkManager.kt: 0/2 changed lines (0.0%) (2 changed lines)
    • ⚠️ Below threshold: 2 uncovered changed lines
  • ADMMessageHandler.kt: 0/2 changed lines (0.0%) (2 changed lines)
    • ⚠️ Below threshold: 2 uncovered changed lines
  • ADMMessageHandlerJob.kt: 0/2 changed lines (0.0%) (2 changed lines)
    • ⚠️ Below threshold: 2 uncovered changed lines
  • OneSignalOpenTelemetry.kt: 0/75 changed lines (0.0%) (148 changed lines)
    • ⚠️ Below threshold: 75 uncovered changed lines
  • OtelFactory.kt: 0/23 changed lines (0.0%) (112 changed lines)
    • ⚠️ Below threshold: 23 uncovered changed lines
  • OtelLoggingHelper.kt: 0/31 changed lines (0.0%) (65 changed lines)
    • ⚠️ Below threshold: 31 uncovered changed lines
  • OtelFieldsPerEvent.kt: 0/13 changed lines (0.0%) (35 changed lines)
    • ⚠️ Below threshold: 13 uncovered changed lines
  • OtelFieldsTopLevel.kt: 0/21 changed lines (0.0%) (42 changed lines)
    • ⚠️ Below threshold: 21 uncovered changed lines
  • OtelConfigCrashFile.kt: 0/19 changed lines (0.0%) (50 changed lines)
    • ⚠️ Below threshold: 19 uncovered changed lines
  • OtelConfigRemoteOneSignal.kt: 0/18 changed lines (0.0%) (57 changed lines)
    • ⚠️ Below threshold: 18 uncovered changed lines
  • OtelConfigShared.kt: 0/18 changed lines (0.0%) (58 changed lines)
    • ⚠️ Below threshold: 18 uncovered changed lines
  • OtelCrashHandler.kt: 0/46 changed lines (0.0%) (127 changed lines)
    • ⚠️ Below threshold: 46 uncovered changed lines
  • OtelCrashReporter.kt: 0/33 changed lines (0.0%) (63 changed lines)
    • ⚠️ Below threshold: 33 uncovered changed lines
  • OtelCrashUploader.kt: 0/29 changed lines (0.0%) (91 changed lines)
    • ⚠️ Below threshold: 29 uncovered changed lines

Overall Coverage (Changed Lines Only)

52/893 changed lines covered (5.8%)

❌ Coverage Check Failed

Files below 80% threshold:

  • IParamsBackendService.kt: 0.0% (8 uncovered changed lines)

  • ParamsBackendService.kt: 0.0% (8 uncovered changed lines)

  • BackgroundManager.kt: 0.0% (1 uncovered changed lines)

  • ConfigModel.kt: 0.0% (14 uncovered changed lines)

  • ConfigModelStore.kt: 0.0% (1 uncovered changed lines)

  • ConfigModelStoreListener.kt: 0.0% (2 uncovered changed lines)

  • Time.kt: 0.0% (1 uncovered changed lines)

  • LogLevel.kt: 0.0% (1 uncovered changed lines)

  • OneSignalCrashHandlerFactory.kt: 0.0% (5 uncovered changed lines)

  • OneSignalCrashUploaderWrapper.kt: 0.0% (17 uncovered changed lines)

  • OtelAnrDetector.kt: 0.0% (100 uncovered changed lines)

  • OtelSdkSupport.kt: 0.0% (4 uncovered changed lines)

  • Logging.kt: 16.7% (20 uncovered changed lines)

  • OtelIdResolver.kt: 0.0% (96 uncovered changed lines)

  • OtelPlatformProvider.kt: 0.0% (76 uncovered changed lines)

  • OneSignalImp.kt: 0.0% (3 uncovered changed lines)

  • OtelLifecycleManager.kt: 0.0% (117 uncovered changed lines)

  • SessionListener.kt: 0.0% (1 uncovered changed lines)

  • IdentityModelStore.kt: 0.0% (1 uncovered changed lines)

  • InAppDisplayer.kt: 0.0% (1 uncovered changed lines)

  • InAppMessageView.kt: 0.0% (1 uncovered changed lines)

  • HmsLocationController.kt: 0.0% (3 uncovered changed lines)

  • OneSignalHmsEventBridge.kt: 0.0% (1 uncovered changed lines)

  • NotificationChannelManager.kt: 0.0% (2 uncovered changed lines)

  • OSWorkManagerHelper.kt: 0.0% (2 uncovered changed lines)

  • NotificationRepository.kt: 0.0% (1 uncovered changed lines)

  • NotificationGenerationProcessor.kt: 33.3% (2 uncovered changed lines)

  • NotificationLifecycleService.kt: 0.0% (7 uncovered changed lines)

  • ReceiveReceiptProcessor.kt: 0.0% (1 uncovered changed lines)

  • PushRegistratorADM.kt: 0.0% (2 uncovered changed lines)

  • PushRegistratorAbstractGoogle.kt: 0.0% (7 uncovered changed lines)

  • PushRegistratorHMS.kt: 0.0% (2 uncovered changed lines)

  • NotificationRestoreProcessor.kt: 0.0% (1 uncovered changed lines)

  • NotificationRestoreWorkManager.kt: 0.0% (2 uncovered changed lines)

  • ADMMessageHandler.kt: 0.0% (2 uncovered changed lines)

  • ADMMessageHandlerJob.kt: 0.0% (2 uncovered changed lines)

  • OneSignalOpenTelemetry.kt: 0.0% (75 uncovered changed lines)

  • OtelFactory.kt: 0.0% (23 uncovered changed lines)

  • OtelLoggingHelper.kt: 0.0% (31 uncovered changed lines)

  • OtelFieldsPerEvent.kt: 0.0% (13 uncovered changed lines)

  • OtelFieldsTopLevel.kt: 0.0% (21 uncovered changed lines)

  • OtelConfigCrashFile.kt: 0.0% (19 uncovered changed lines)

  • OtelConfigRemoteOneSignal.kt: 0.0% (18 uncovered changed lines)

  • OtelConfigShared.kt: 0.0% (18 uncovered changed lines)

  • OtelCrashHandler.kt: 0.0% (46 uncovered changed lines)

  • OtelCrashReporter.kt: 0.0% (33 uncovered changed lines)

  • OtelCrashUploader.kt: 0.0% (29 uncovered changed lines)

📥 View workflow run

@abdulraqeeb33 abdulraqeeb33 mentioned this pull request Feb 24, 2026
18 tasks
resolver.resolveRemoteLoggingEnabled() shouldBe true
}

test("resolveRemoteLoggingEnabled returns false when logLevel is NONE") {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

where is this logic that prevents none loglevel?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants