From e9399ee70eb971dc7734559a1b1e958c1c09f5a2 Mon Sep 17 00:00:00 2001 From: AR Abdul Azeez Date: Fri, 16 Oct 2026 11:54:05 -0500 Subject: [PATCH] refactor: [SDK-5538] add SdkOperation names for init-gated entry points SdkOperation names each public entry point that waits for or requires init, so logs name the call the app made. Adds an isMissing overload that takes an operation and parameter name. Nothing uses it yet; the never-crash init path in this stack does. Co-authored-by: Cursor --- .../java/com/onesignal/common/InputGuard.kt | 7 ++++++ .../com/onesignal/internal/SdkOperation.kt | 24 +++++++++++++++++++ .../com/onesignal/common/InputGuardTests.kt | 8 +++++++ 3 files changed, 39 insertions(+) create mode 100644 OneSignalSDK/onesignal/core/src/main/java/com/onesignal/internal/SdkOperation.kt diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/common/InputGuard.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/common/InputGuard.kt index 527a9facd..593a1eca8 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/common/InputGuard.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/common/InputGuard.kt @@ -1,6 +1,7 @@ package com.onesignal.common import com.onesignal.debug.internal.logging.Logging +import com.onesignal.internal.SdkOperation internal fun hasNullByte(value: String?): Boolean = value != null && '\u0000' in value @@ -22,6 +23,12 @@ fun isMissing( return error != null } +internal fun isMissing( + value: String?, + operation: SdkOperation, + parameter: String, +): Boolean = isMissing(value, "$operation: $parameter") + /** * Returns true when any of [values] is missing, per [isMissing]. */ diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/internal/SdkOperation.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/internal/SdkOperation.kt new file mode 100644 index 000000000..4e3280fa4 --- /dev/null +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/internal/SdkOperation.kt @@ -0,0 +1,24 @@ +package com.onesignal.internal + +// Public entry points that wait for or require init. [label] is the API name the app called. +internal enum class SdkOperation(val label: String) { + INIT_WITH_CONTEXT("initWithContext"), + SESSION("Session"), + NOTIFICATIONS("Notifications"), + LOCATION("Location"), + IN_APP_MESSAGES("InAppMessages"), + USER("User"), + LOGIN("login"), + LOGOUT("logout"), + UPDATE_USER_JWT("updateUserJwt"), + JWT_LISTENERS("OneSignal"), + GET_CONSENT_REQUIRED("getConsentRequired"), + SET_CONSENT_REQUIRED("setConsentRequired"), + GET_CONSENT_GIVEN("getConsentGiven"), + SET_CONSENT_GIVEN("setConsentGiven"), + GET_DISABLE_GMS_MISSING_PROMPT("getDisableGMSMissingPrompt"), + SET_DISABLE_GMS_MISSING_PROMPT("setDisableGMSMissingPrompt"), + ; + + override fun toString() = label +} diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/common/InputGuardTests.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/common/InputGuardTests.kt index ae2957658..40f8630d3 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/common/InputGuardTests.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/common/InputGuardTests.kt @@ -2,6 +2,7 @@ package com.onesignal.common import com.onesignal.debug.LogLevel import com.onesignal.debug.internal.logging.Logging +import com.onesignal.internal.SdkOperation import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe @@ -24,4 +25,11 @@ class InputGuardTests : FunSpec({ isMissing("abc\u0000", "addAlias: id") shouldBe true hasMissingEntries(mapOf("external_id" to "\u0000: 1"), "addAliases", allowEmptyValue = false) shouldBe true } + + test("the operation overload applies the same checks and logs the public API name") { + isMissing(null, SdkOperation.LOGIN, "externalId") shouldBe true + isMissing("\u0000", SdkOperation.LOGIN, "externalId") shouldBe true + isMissing("user-1", SdkOperation.LOGIN, "externalId") shouldBe false + "${SdkOperation.LOGIN}: externalId" shouldBe "login: externalId" + } })