diff --git a/OneSignal-KMP-SDK b/OneSignal-KMP-SDK index 7051a2485..3f10b22fa 160000 --- a/OneSignal-KMP-SDK +++ b/OneSignal-KMP-SDK @@ -1 +1 @@ -Subproject commit 7051a248550c344345da7bdc820a471f0f6b1061 +Subproject commit 3f10b22fa218fe0468f4e7491ec0b7cdb652b786 diff --git a/OneSignalSDK/onesignal/core/src/main/AndroidManifest.xml b/OneSignalSDK/onesignal/core/src/main/AndroidManifest.xml index cd5f7c080..66bcfebf9 100644 --- a/OneSignalSDK/onesignal/core/src/main/AndroidManifest.xml +++ b/OneSignalSDK/onesignal/core/src/main/AndroidManifest.xml @@ -1,10 +1,6 @@ - - - - diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/debug/internal/crash/ObservabilitySdkSupport.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/debug/internal/crash/ObservabilitySdkSupport.kt index 4d17a35c0..5e77b1428 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/debug/internal/crash/ObservabilitySdkSupport.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/debug/internal/crash/ObservabilitySdkSupport.kt @@ -4,8 +4,8 @@ import android.os.Build /** The single SDK-version gate for observability: crash reporting, ANR detection, log shipping. */ internal object ObservabilitySdkSupport { - /** The shared logger module requires Android O (API 26) or above. */ - const val MIN_SDK_VERSION = Build.VERSION_CODES.O // 26 + /** Matches the host SDK minSdk. Tests flip [isSupported] without Robolectric. */ + const val MIN_SDK_VERSION = Build.VERSION_CODES.LOLLIPOP // 21 /** Read-only in production; writable only so tests can flip the gate without Robolectric. */ var isSupported: Boolean = Build.VERSION.SDK_INT >= MIN_SDK_VERSION diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/debug/internal/logging/logger/android/LoggerPlatformProvider.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/debug/internal/logging/logger/android/LoggerPlatformProvider.kt index a4e1daadb..ca2ed3268 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/debug/internal/logging/logger/android/LoggerPlatformProvider.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/debug/internal/logging/logger/android/LoggerPlatformProvider.kt @@ -3,6 +3,7 @@ package com.onesignal.debug.internal.logging.logger.android import android.app.ActivityManager import android.content.Context import android.os.Build +import android.os.SystemClock import com.onesignal.common.OneSignalUtils import com.onesignal.common.OneSignalWrapper import com.onesignal.core.internal.features.IFeatureManager @@ -31,6 +32,10 @@ internal class LoggerPlatformProvider( config: LoggerPlatformProviderConfig, private val featureManagerProvider: () -> IFeatureManager, ) : ILoggerPlatformProvider { + companion object { + // First class load. Same monotonic clock as Process.getStartUptimeMillis() (API 24). + private val processStartUptimeMs = SystemClock.uptimeMillis() + } override val appPackageId: String = config.appPackageId override val appVersion: String = config.appVersion private val context: Context? = config.context @@ -113,9 +118,8 @@ internal class LoggerPlatformProvider( "unknown" } - // https://opentelemetry.io/docs/specs/semconv/system/process-metrics/#metric-processuptime override val processUptime: Long - get() = android.os.SystemClock.uptimeMillis() - android.os.Process.getStartUptimeMillis() + get() = SystemClock.uptimeMillis() - processStartUptimeMs // https://opentelemetry.io/docs/specs/semconv/general/attributes/#general-thread-attributes override val currentThreadName: String diff --git a/OneSignalSDK/onesignal/core/src/test/AndroidManifest.xml b/OneSignalSDK/onesignal/core/src/test/AndroidManifest.xml deleted file mode 100644 index 8038730f2..000000000 --- a/OneSignalSDK/onesignal/core/src/test/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/debug/internal/crash/ObservabilitySdkSupportTest.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/debug/internal/crash/ObservabilitySdkSupportTest.kt index 9c273047c..018a17e31 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/debug/internal/crash/ObservabilitySdkSupportTest.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/debug/internal/crash/ObservabilitySdkSupportTest.kt @@ -14,7 +14,7 @@ class ObservabilitySdkSupportTest : FunSpec({ ObservabilitySdkSupport.reset() } - test("isSupported is true on SDK >= 26") { + test("isSupported is true on SDK >= 21") { ObservabilitySdkSupport.reset() ObservabilitySdkSupport.isSupported shouldBe true } @@ -32,7 +32,20 @@ class ObservabilitySdkSupportTest : FunSpec({ ObservabilitySdkSupport.isSupported shouldBe true } - test("MIN_SDK_VERSION is 26") { - ObservabilitySdkSupport.MIN_SDK_VERSION shouldBe 26 + test("MIN_SDK_VERSION is 21") { + ObservabilitySdkSupport.MIN_SDK_VERSION shouldBe 21 + } +}) + +@RobolectricTest +@Config(sdk = [21]) +class ObservabilitySdkSupportApi21Test : FunSpec({ + afterEach { + ObservabilitySdkSupport.reset() + } + + test("isSupported is true on API 21") { + ObservabilitySdkSupport.reset() + ObservabilitySdkSupport.isSupported shouldBe true } }) diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/debug/internal/logging/logger/android/LoggerPlatformProviderTest.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/debug/internal/logging/logger/android/LoggerPlatformProviderTest.kt index cc858db55..8f2e2d77c 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/debug/internal/logging/logger/android/LoggerPlatformProviderTest.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/debug/internal/logging/logger/android/LoggerPlatformProviderTest.kt @@ -437,11 +437,14 @@ class LoggerPlatformProviderTest : FunSpec({ val provider = createAndroidLoggerPlatformProvider(appContext!!) { emptyFeatureManager() } // When - val result = provider.processUptime + val first = provider.processUptime + Thread.sleep(10) + val second = provider.processUptime // Then - (result >= 0) shouldBe true - (result < 1000000.0) shouldBe true // Reasonable upper bound + (first >= 0) shouldBe true + (first < 1_000_000) shouldBe true + (second >= first) shouldBe true } // ===== currentThreadName Tests ===== @@ -954,6 +957,19 @@ class LoggerPlatformProviderTest : FunSpec({ } }) +@RobolectricTest +@Config(sdk = [21]) +class LoggerPlatformProviderApi21Test : FunSpec({ + test("processUptime is readable on API 21") { + val context = ApplicationProvider.getApplicationContext() + val provider = createAndroidLoggerPlatformProvider(context) { + mockk().also { every { it.enabledFeatureKeys() } returns emptyList() } + } + + (provider.processUptime >= 0) shouldBe true + } +}) + // Helper extension for shouldBeOneOf private infix fun T.shouldBeOneOf(expected: List) { val isInList = expected.contains(this)