From 4b39fd5d176481793c1dca0079aeefa7b4a3875d Mon Sep 17 00:00:00 2001 From: AR Abdul Azeez Date: Tue, 27 Oct 2026 12:05:42 -0500 Subject: [PATCH 1/2] fix: remove composite login from the public API The profile login still has open bugs, so apps should not be able to call it yet. login(externalId) is unchanged. Co-authored-by: Cursor --- OneSignalSDK/onesignal/core/api/core.api | 5 - .../src/main/java/com/onesignal/IOneSignal.kt | 10 -- .../src/main/java/com/onesignal/OneSignal.kt | 12 --- .../java/com/onesignal/OneSignalResult.kt | 3 +- .../com/onesignal/internal/OneSignalImp.kt | 4 +- .../OneSignalSuspendMethodsExistTest.kt | 7 +- .../data/model/CompositeLoginExample.java | 27 ------ .../data/repository/OneSignalRepository.kt | 14 --- .../example/ui/components/Dialogs.kt | 96 ------------------- .../onesignal/example/ui/main/MainScreen.kt | 3 - .../example/ui/main/MainViewModel.kt | 32 ------- .../com/onesignal/example/ui/main/Sections.kt | 20 ---- 12 files changed, 5 insertions(+), 228 deletions(-) delete mode 100644 examples/demo/app/src/main/java/com/onesignal/example/data/model/CompositeLoginExample.java diff --git a/OneSignalSDK/onesignal/core/api/core.api b/OneSignalSDK/onesignal/core/api/core.api index ed1e590f4e..0bb8c2dc14 100644 --- a/OneSignalSDK/onesignal/core/api/core.api +++ b/OneSignalSDK/onesignal/core/api/core.api @@ -58,7 +58,6 @@ public abstract interface class com/onesignal/IOneSignal { public abstract fun initWithContextSuspend (Landroid/content/Context;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public abstract fun isInitialized ()Z public abstract fun login (Ljava/lang/String;)V - public abstract fun login (Ljava/lang/String;Lcom/onesignal/OneSignalUserProfile;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public abstract fun login (Ljava/lang/String;Ljava/lang/String;)V public abstract fun loginSuspend (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public abstract fun logout ()V @@ -77,7 +76,6 @@ public abstract interface class com/onesignal/IOneSignal { public final class com/onesignal/IOneSignal$DefaultImpls { public static synthetic fun initWithContextSuspend$default (Lcom/onesignal/IOneSignal;Landroid/content/Context;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public static fun login (Lcom/onesignal/IOneSignal;Ljava/lang/String;)V - public static synthetic fun login$default (Lcom/onesignal/IOneSignal;Ljava/lang/String;Lcom/onesignal/OneSignalUserProfile;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public static synthetic fun login$default (Lcom/onesignal/IOneSignal;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)V public static synthetic fun loginSuspend$default (Lcom/onesignal/IOneSignal;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; } @@ -133,10 +131,7 @@ public final class com/onesignal/OneSignal { public static synthetic fun initWithContextSuspend$default (Landroid/content/Context;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public static final fun isInitialized ()Z public static final fun login (Ljava/lang/String;)V - public static final fun login (Ljava/lang/String;Lcom/onesignal/OneSignalUserProfile;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun login (Ljava/lang/String;Lcom/onesignal/OneSignalUserProfile;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun login (Ljava/lang/String;Ljava/lang/String;)V - public static synthetic fun login$default (Ljava/lang/String;Lcom/onesignal/OneSignalUserProfile;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public static synthetic fun login$default (Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)V public static final fun loginSuspend (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun loginSuspend$default (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/IOneSignal.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/IOneSignal.kt index 1fbcd7837e..6b38326c82 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/IOneSignal.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/IOneSignal.kt @@ -250,16 +250,6 @@ interface IOneSignal { jwtBearerToken: String? = null, ) - /** - * Login with [externalId] plus [profile] as one Create User upsert (anonymous is not merged). Email/SMS create or transfer; a foreign alias fails it. - * Same id is a no-op once a backend ID exists. Backend failure leaves this identity local; INVALID_ARGUMENT and NOT_INITIALIZED change nothing. - */ - suspend fun login( - externalId: String?, - profile: OneSignalUserProfile, - jwtBearerToken: String? = null, - ): OneSignalResult - /** * Logout the current user (suspend version). */ diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignal.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignal.kt index 928a52c0a2..ed049b5506 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignal.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignal.kt @@ -424,18 +424,6 @@ object OneSignal { oneSignal.loginSuspend(externalId, jwtBearerToken) } - /** - * Login with [externalId] plus [profile] as one Create User upsert (anonymous is not merged). Email/SMS create or transfer; a foreign alias fails it. - * Same id is a no-op once a backend ID exists. Backend failure leaves this identity local; INVALID_ARGUMENT and NOT_INITIALIZED change nothing. - */ - @JvmStatic - @JvmOverloads - suspend fun login( - externalId: String?, - profile: OneSignalUserProfile, - jwtBearerToken: String? = null, - ): OneSignalResult = oneSignal.login(externalId, profile, jwtBearerToken) - /** * Logout the current user without blocking the calling thread. * Suspends until the SDK is initialized if initialization is in progress. diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalResult.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalResult.kt index a9f1248203..69212dbcad 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalResult.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalResult.kt @@ -23,8 +23,7 @@ import org.json.JSONObject * * From Kotlin, inside a coroutine: * ```kotlin - * val result = OneSignal.login("user-123", OneSignalUserProfile.builder().setEmail("a@b.co").build()) - * if (result.isSuccess) println(result.data?.onesignalId) else println(result.error?.first?.code) + * if (result.isSuccess) println(result.data) else println(result.error?.first?.code) * ``` * * From Java the generated accessors read naturally: diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/internal/OneSignalImp.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/internal/OneSignalImp.kt index f0f59fea19..4cb7006500 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/internal/OneSignalImp.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/internal/OneSignalImp.kt @@ -851,10 +851,10 @@ internal class OneSignalImp : IOneSignal, loginHelper.enqueueLogin(context) } - override suspend fun login( + suspend fun login( externalId: String?, profile: OneSignalUserProfile, - jwtBearerToken: String?, + jwtBearerToken: String? = null, ): OneSignalResult = withContext(ioDispatcher) { Logging.log(LogLevel.DEBUG, "login(externalId: $externalId, profile: $profile, jwtBearerToken: ...${jwtBearerToken?.takeLast(8)})") diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/OneSignalSuspendMethodsExistTest.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/OneSignalSuspendMethodsExistTest.kt index 6860a45341..3e33ee8445 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/OneSignalSuspendMethodsExistTest.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/OneSignalSuspendMethodsExistTest.kt @@ -157,7 +157,7 @@ class OneSignalSuspendMethodsExistTest : FunSpec({ assert(blocking.any { it.parameters.size == 3 }) { "login(externalId, jwtBearerToken) is missing" } } - test("suspend login with profile exists and returns OneSignalResult") { + test("suspend login with a profile is not on the public object") { val kFunction = OneSignal::class.memberFunctions .firstOrNull { fn -> @@ -166,10 +166,7 @@ class OneSignalSuspendMethodsExistTest : FunSpec({ fn.parameters.any { it.type.classifier == OneSignalUserProfile::class } } - assert(kFunction != null) { "suspend login(externalId, profile) not found" } - assert(kFunction!!.returnType.classifier == OneSignalResult::class) { - "suspend login(externalId, profile) should return OneSignalResult" - } + assert(kFunction == null) { "suspend login(externalId, profile) is still public" } } test("logoutSuspend exists with no parameters") { diff --git a/examples/demo/app/src/main/java/com/onesignal/example/data/model/CompositeLoginExample.java b/examples/demo/app/src/main/java/com/onesignal/example/data/model/CompositeLoginExample.java deleted file mode 100644 index 56d719b9da..0000000000 --- a/examples/demo/app/src/main/java/com/onesignal/example/data/model/CompositeLoginExample.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.onesignal.example.data.model; - -import com.onesignal.OneSignalUserProfile; -import java.util.Collections; -import java.util.Map; - -/** Java example of building a composite-login profile with OneSignalUserProfile.Builder. */ -public final class CompositeLoginExample { - private CompositeLoginExample() {} - - public static OneSignalUserProfile profile(String email, String sms) { - return profile(email, sms, Collections.emptyMap(), Collections.emptyMap()); - } - - public static OneSignalUserProfile profile( - String email, - String sms, - Map tags, - Map aliases) { - return new OneSignalUserProfile.Builder() - .setEmail(email) - .setSms(sms) - .setTags(tags) - .setAliases(aliases) - .build(); - } -} diff --git a/examples/demo/app/src/main/java/com/onesignal/example/data/repository/OneSignalRepository.kt b/examples/demo/app/src/main/java/com/onesignal/example/data/repository/OneSignalRepository.kt index 0f607c7d23..25863631cd 100644 --- a/examples/demo/app/src/main/java/com/onesignal/example/data/repository/OneSignalRepository.kt +++ b/examples/demo/app/src/main/java/com/onesignal/example/data/repository/OneSignalRepository.kt @@ -1,7 +1,6 @@ package com.onesignal.example.data.repository import com.onesignal.OneSignal -import com.onesignal.example.data.model.CompositeLoginExample import com.onesignal.example.data.model.NotificationType import com.onesignal.example.data.network.OneSignalService import com.onesignal.example.data.network.UserData @@ -22,19 +21,6 @@ class OneSignalRepository { DemoLog.d("Logged in user with onesignalId: ${OneSignal.User.onesignalId}") } - suspend fun loginUserWithProfile( - externalUserId: String, - email: String?, - sms: String?, - jwtToken: String? = null, - ) = withContext(Dispatchers.IO) { - DemoLog.d("Composite login externalUserId: $externalUserId email=$email sms=$sms") - val profile = CompositeLoginExample.profile(email, sms) - val result = OneSignal.login(externalUserId, profile, jwtToken) - DemoLog.d("Composite login result: $result") - result - } - suspend fun updateUserJwt(externalUserId: String, jwtToken: String) = withContext(Dispatchers.IO) { DemoLog.d("Updating JWT for externalUserId: $externalUserId") OneSignal.updateUserJwt(externalUserId, jwtToken) diff --git a/examples/demo/app/src/main/java/com/onesignal/example/ui/components/Dialogs.kt b/examples/demo/app/src/main/java/com/onesignal/example/ui/components/Dialogs.kt index 3ae57714bb..9e0bc8f968 100644 --- a/examples/demo/app/src/main/java/com/onesignal/example/ui/components/Dialogs.kt +++ b/examples/demo/app/src/main/java/com/onesignal/example/ui/components/Dialogs.kt @@ -465,102 +465,6 @@ fun LoginDialog( ) } -@Composable -fun CompositeLoginDialog( - onDismiss: () -> Unit, - onConfirm: (externalId: String, email: String?, sms: String?, jwt: String?) -> Unit, -) { - var externalId by remember { mutableStateOf("") } - var email by remember { mutableStateOf("") } - var sms by remember { mutableStateOf("") } - var jwtToken by remember { mutableStateOf("") } - - AlertDialog( - onDismissRequest = onDismiss, - modifier = Modifier.fillMaxWidth().padding(horizontal = DemoLayout.pagePadding).exposeTestTagsAsResourceId(), - properties = DialogProperties(usePlatformDefaultWidth = false), - title = { - DialogTitle("Login With Profile") - }, - text = { - Column { - OutlinedTextField( - value = externalId, - onValueChange = { externalId = it }, - label = { Text("External User Id") }, - modifier = Modifier - .fillMaxWidth() - .testTag("composite_login_user_id_input"), - singleLine = true, - shape = TextFieldShape, - colors = dialogTextFieldColors() - ) - Spacer(modifier = Modifier.height(12.dp)) - OutlinedTextField( - value = email, - onValueChange = { email = it }, - label = { Text("Email (optional)") }, - modifier = Modifier - .fillMaxWidth() - .testTag("composite_login_email_input"), - singleLine = true, - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Email), - shape = TextFieldShape, - colors = dialogTextFieldColors() - ) - Spacer(modifier = Modifier.height(12.dp)) - OutlinedTextField( - value = sms, - onValueChange = { sms = it }, - label = { Text("SMS (optional)") }, - modifier = Modifier - .fillMaxWidth() - .testTag("composite_login_sms_input"), - singleLine = true, - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Phone), - shape = TextFieldShape, - colors = dialogTextFieldColors() - ) - Spacer(modifier = Modifier.height(12.dp)) - OutlinedTextField( - value = jwtToken, - onValueChange = { jwtToken = it }, - label = { Text("JWT Token (optional)") }, - modifier = Modifier - .fillMaxWidth() - .testTag("composite_login_jwt_input"), - singleLine = true, - shape = TextFieldShape, - colors = dialogTextFieldColors() - ) - } - }, - confirmButton = { - TextButton( - onClick = { - onConfirm( - externalId, - email.ifBlank { null }, - sms.ifBlank { null }, - jwtToken.ifBlank { null }, - ) - }, - enabled = externalId.isNotBlank(), - modifier = Modifier.testTag("composite_login_confirm_button"), - colors = dialogTextButtonColors(), - ) { - DialogActionLabel("Login") - } - }, - dismissButton = { - TextButton(onClick = onDismiss, colors = dialogTextButtonColors()) { - DialogActionLabel("Cancel") - } - }, - shape = DialogShape - ) -} - /** * Dialog for outcome selection and input. */ diff --git a/examples/demo/app/src/main/java/com/onesignal/example/ui/main/MainScreen.kt b/examples/demo/app/src/main/java/com/onesignal/example/ui/main/MainScreen.kt index 958af46496..9cd4df7751 100644 --- a/examples/demo/app/src/main/java/com/onesignal/example/ui/main/MainScreen.kt +++ b/examples/demo/app/src/main/java/com/onesignal/example/ui/main/MainScreen.kt @@ -151,9 +151,6 @@ fun MainScreen(viewModel: MainViewModel) { onUseIdentityVerificationChange = { viewModel.setUseIdentityVerification(it) }, onLanguageChange = { viewModel.setLanguage(it) }, onLogin = { userId, jwt -> viewModel.loginUser(userId, jwt) }, - onLoginWithProfile = { userId, email, sms, jwt -> - viewModel.loginUserWithProfile(userId, email, sms, jwt) - }, onLogout = { viewModel.logoutUser() }, onUpdateJwt = { externalId, token -> viewModel.updateUserJwt(externalId, token) }, isLoading = isLoading diff --git a/examples/demo/app/src/main/java/com/onesignal/example/ui/main/MainViewModel.kt b/examples/demo/app/src/main/java/com/onesignal/example/ui/main/MainViewModel.kt index 06676d39cc..079a774cb4 100644 --- a/examples/demo/app/src/main/java/com/onesignal/example/ui/main/MainViewModel.kt +++ b/examples/demo/app/src/main/java/com/onesignal/example/ui/main/MainViewModel.kt @@ -301,38 +301,6 @@ class MainViewModel(application: Application) : AndroidViewModel(application), I } } - fun loginUserWithProfile( - externalUserId: String, - email: String?, - sms: String?, - jwtToken: String? = null, - ) { - _isLoading.value = true - viewModelScope.launch(Dispatchers.IO) { - val result = repository.loginUserWithProfile(externalUserId, email, sms, jwtToken) - withContext(Dispatchers.Main) { - if (result.isSuccess) { - SharedPreferenceUtil.cacheUserExternalUserId(getApplication(), externalUserId) - SharedPreferenceUtil.cacheJwtToken(getApplication(), jwtToken) - _externalUserId.value = externalUserId - aliasesList.clear() - emailsList.clear() - smsNumbersList.clear() - triggersList.clear() - refreshAliases() - refreshEmails() - refreshSmsNumbers() - refreshTriggers() - loadExistingTags() - refreshPushSubscription() - } else { - DemoLog.e("Composite login failed: ${result.error}") - } - _isLoading.value = false - } - } - } - fun updateUserJwt(externalUserId: String, jwtToken: String) { viewModelScope.launch(Dispatchers.IO) { repository.updateUserJwt(externalUserId, jwtToken) diff --git a/examples/demo/app/src/main/java/com/onesignal/example/ui/main/Sections.kt b/examples/demo/app/src/main/java/com/onesignal/example/ui/main/Sections.kt index d428f9338c..d523d2a5d1 100644 --- a/examples/demo/app/src/main/java/com/onesignal/example/ui/main/Sections.kt +++ b/examples/demo/app/src/main/java/com/onesignal/example/ui/main/Sections.kt @@ -31,7 +31,6 @@ import com.onesignal.example.ui.components.DemoSection import com.onesignal.example.ui.components.DestructiveButton import com.onesignal.example.ui.components.DropdownRow import com.onesignal.example.ui.components.LocalSnackbarController -import com.onesignal.example.ui.components.CompositeLoginDialog import com.onesignal.example.ui.components.LoginDialog import com.onesignal.example.ui.components.MultiPairInputDialog import com.onesignal.example.ui.components.MultiSelectRemoveDialog @@ -185,14 +184,12 @@ fun UserSection( onUseIdentityVerificationChange: (Boolean) -> Unit, onLanguageChange: (String) -> Unit, onLogin: (String, String?) -> Unit, - onLoginWithProfile: (String, String?, String?, String?) -> Unit, onLogout: () -> Unit, onUpdateJwt: (String, String) -> Unit, isLoading: Boolean = false, ) { val isLoggedIn = !externalUserId.isNullOrEmpty() var loginOpen by remember { mutableStateOf(false) } - var compositeLoginOpen by remember { mutableStateOf(false) } var updateJwtOpen by remember { mutableStateOf(false) } DemoSection { @@ -238,13 +235,6 @@ fun UserSection( testTag = "login_user_button", ) - OutlineButton( - text = "LOGIN WITH PROFILE", - onClick = { compositeLoginOpen = true }, - enabled = !isLoading, - testTag = "composite_login_button", - ) - if (isLoggedIn) { OutlineButton( text = "LOGOUT USER", @@ -271,16 +261,6 @@ fun UserSection( ) } - if (compositeLoginOpen) { - CompositeLoginDialog( - onDismiss = { compositeLoginOpen = false }, - onConfirm = { userId, email, sms, jwt -> - onLoginWithProfile(userId, email, sms, jwt) - compositeLoginOpen = false - }, - ) - } - if (updateJwtOpen) { PairInputDialog( title = "Update User JWT", From a1e1976ca46a308636098dcbfdbeb49647610271 Mon Sep 17 00:00:00 2001 From: AR Abdul Azeez Date: Tue, 27 Oct 2026 12:27:51 -0500 Subject: [PATCH 2/2] fix: [SDK-5616] make the composite login types internal OneSignalUserProfile, LoginData, and OneSignalResult are only used by the profile login, which is no longer public. Co-authored-by: Cursor --- OneSignalSDK/onesignal/core/api/core.api | 46 ------------------- .../java/com/onesignal/OneSignalResult.kt | 30 ++---------- .../java/com/onesignal/OneSignalResultData.kt | 4 +- .../com/onesignal/OneSignalUserProfile.kt | 12 ++--- .../internal/operations/LoginUserOperation.kt | 2 +- 5 files changed, 12 insertions(+), 82 deletions(-) diff --git a/OneSignalSDK/onesignal/core/api/core.api b/OneSignalSDK/onesignal/core/api/core.api index 0bb8c2dc14..61cf747219 100644 --- a/OneSignalSDK/onesignal/core/api/core.api +++ b/OneSignalSDK/onesignal/core/api/core.api @@ -89,15 +89,6 @@ public final class com/onesignal/InitData : com/onesignal/OneSignalResultData { public fun toString ()Ljava/lang/String; } -public final class com/onesignal/LoginData : com/onesignal/OneSignalResultData { - public final fun getEmailSubscriptionId ()Ljava/lang/String; - public final fun getExternalId ()Ljava/lang/String; - public final fun getOnesignalId ()Ljava/lang/String; - public final fun getSmsSubscriptionId ()Ljava/lang/String; - public fun toMap ()Ljava/util/Map; - public fun toString ()Ljava/lang/String; -} - public final class com/onesignal/LogoutData : com/onesignal/OneSignalResultData { public fun toMap ()Ljava/util/Map; public fun toString ()Ljava/lang/String; @@ -169,47 +160,10 @@ public final class com/onesignal/OneSignalError$Detail { public fun toString ()Ljava/lang/String; } -public final class com/onesignal/OneSignalResult { - public synthetic fun (Lcom/onesignal/OneSignalResultData;Lcom/onesignal/OneSignalError;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getData ()Lcom/onesignal/OneSignalResultData; - public final fun getError ()Lcom/onesignal/OneSignalError; - public final fun isSuccess ()Z - public final fun toMap ()Ljava/util/Map; - public fun toString ()Ljava/lang/String; -} - public abstract interface class com/onesignal/OneSignalResultData { public abstract fun toMap ()Ljava/util/Map; } -public final class com/onesignal/OneSignalUserProfile { - public static final field Companion Lcom/onesignal/OneSignalUserProfile$Companion; - public synthetic fun (Lcom/onesignal/OneSignalUserProfile$Builder;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public static final fun builder ()Lcom/onesignal/OneSignalUserProfile$Builder; - public fun equals (Ljava/lang/Object;)Z - public final fun getAliases ()Ljava/util/Map; - public final fun getEmail ()Ljava/lang/String; - public final fun getEmailEnabled ()Ljava/lang/Boolean; - public final fun getSms ()Ljava/lang/String; - public final fun getTags ()Ljava/util/Map; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class com/onesignal/OneSignalUserProfile$Builder { - public fun ()V - public final fun build ()Lcom/onesignal/OneSignalUserProfile; - public final fun setAliases (Ljava/util/Map;)Lcom/onesignal/OneSignalUserProfile$Builder; - public final fun setEmail (Ljava/lang/String;)Lcom/onesignal/OneSignalUserProfile$Builder; - public final fun setEmailEnabled (Z)Lcom/onesignal/OneSignalUserProfile$Builder; - public final fun setSms (Ljava/lang/String;)Lcom/onesignal/OneSignalUserProfile$Builder; - public final fun setTags (Ljava/util/Map;)Lcom/onesignal/OneSignalUserProfile$Builder; -} - -public final class com/onesignal/OneSignalUserProfile$Companion { - public final fun builder ()Lcom/onesignal/OneSignalUserProfile$Builder; -} - public final class com/onesignal/SyncJobService : android/app/job/JobService { public fun ()V public fun onStartJob (Landroid/app/job/JobParameters;)Z diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalResult.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalResult.kt index 69212dbcad..daf62b7d5b 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalResult.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalResult.kt @@ -4,34 +4,10 @@ import com.onesignal.common.toMap import org.json.JSONObject /** - * The outcome of an asynchronous OneSignal call: either a [data] payload or an [error], never both - * and never neither. - * - * Every SDK returns the same envelope, so a wrapper can handle results uniformly regardless of the - * platform underneath it: - * - * ```json - * { "success": true, "data": { }, "error": null } - * { "success": false, "data": null, "error": [ { "code": "STORAGE_LOCKED", ... } ] } - * ``` - * - * The presence of [error] is what defines the outcome; [isSuccess] and the wire-level `success` - * flag are both derived from it, so the two can never disagree. - * - * Construct through [success], [failure], or [fromMap]. The internal companion is still reachable - * from Java, so the either/or invariant is enforced in `init`, not by visibility. - * - * From Kotlin, inside a coroutine: - * ```kotlin - * if (result.isSuccess) println(result.data) else println(result.error?.first?.code) - * ``` - * - * From Java the generated accessors read naturally: - * ```java - * if (result.isSuccess()) { result.getData(); } else { result.getError().getDetails(); } - * ``` + * Either [data] or [error], never both. [isSuccess] follows [error]. + * Build with [success], [failure], or [fromMap]. Java can reach the companion, so `init` enforces either/or. */ -class OneSignalResult private constructor( +internal class OneSignalResult private constructor( /** The payload on success, `null` on failure. */ val data: T?, /** The failure detail on failure, `null` on success. */ diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalResultData.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalResultData.kt index c6e99a16af..1e7e53af98 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalResultData.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalResultData.kt @@ -23,8 +23,8 @@ sealed interface OneSignalResultData { * Field names here are also the wire keys, so they are additive-only: never renamed, never removed. */ -/** The payload returned by a successful login. */ -class LoginData internal constructor( +/** Payload from the internal profile login. */ +internal class LoginData internal constructor( /** The OneSignal ID the external ID is now associated with. */ val onesignalId: String, /** The external ID that was logged in. */ diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalUserProfile.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalUserProfile.kt index f773f9892c..4867ecf79a 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalUserProfile.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/OneSignalUserProfile.kt @@ -5,11 +5,11 @@ import com.onesignal.common.hasNullByte import java.util.Collections /** - * Profile applied at login. Email/SMS create or transfer that address onto this user; they do not replace other subscriptions. - * Build one with [builder]. There is no public constructor, so adding a field never breaks compiled callers. + * Email, SMS, tags, and aliases for the internal profile login. + * Email and SMS create or transfer that address. They do not replace other subscriptions. */ // Takes the Builder so the synthetic accessor's JVM signature stays fixed as fields are added. -class OneSignalUserProfile private constructor(builder: Builder) { +internal class OneSignalUserProfile private constructor(builder: Builder) { val email: String? = builder.email?.takeIf { it.isNotBlank() } val sms: String? = builder.sms?.takeIf { it.isNotBlank() } @@ -72,7 +72,7 @@ class OneSignalUserProfile private constructor(builder: Builder) { internal var aliases: Map = emptyMap() private set - /** Email to create or transfer onto this user at login. */ + /** Email to create or transfer onto this user. */ fun setEmail(email: String?) = apply { this.email = email } /** Store the email unsubscribed when false. True is not sent on Create User. */ @@ -81,10 +81,10 @@ class OneSignalUserProfile private constructor(builder: Builder) { /** SMS to create or transfer onto this user at login. Must be E.164 (e.g. +14155552671). */ fun setSms(sms: String?) = apply { this.sms = sms } - /** Sets tags to apply at login. The map is copied. */ + /** Tags to include. The map is copied. */ fun setTags(tags: Map) = apply { this.tags = tags.toMap() } - /** Sets aliases to apply at login. The map is copied. */ + /** Aliases to include. The map is copied. */ fun setAliases(aliases: Map) = apply { this.aliases = aliases.toMap() } /** Builds the profile. */ diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/operations/LoginUserOperation.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/operations/LoginUserOperation.kt index a2086d0a2e..b2bdb6e378 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/operations/LoginUserOperation.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/operations/LoginUserOperation.kt @@ -85,7 +85,7 @@ class LoginUserOperation() : Operation(LoginUserOperationExecutor.LOGIN_USER) { override val canStartExecute: Boolean get() = existingOnesignalId == null || !IDManager.isLocalId(existingOnesignalId!!) override val applyToRecordId: String get() = existingOnesignalId ?: onesignalId - constructor( + internal constructor( appId: String, onesignalId: String, externalId: String?,