Skip to content

Commit c63f4fc

Browse files
AR Abdul Azeezcursoragent
andcommitted
fix: [SDK-5606] send full email and SMS fields on composite login
Profile subscriptions were only type and token, so the backend stored notification_types -99. Match CreateSubscriptionOperation and drop the identity-verification warning. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 7418001 commit c63f4fc

3 files changed

Lines changed: 56 additions & 22 deletions

File tree

‎OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/operations/impl/executors/LoginProfileApplier.kt‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,16 @@ internal object LoginProfileApplier {
2424
fun addSubscriptions(
2525
op: LoginUserOperation,
2626
subscriptions: Map<String, SubscriptionObject>,
27+
subscription: (SubscriptionObjectType, String) -> SubscriptionObject,
2728
): Map<String, SubscriptionObject> {
2829
val mutable = subscriptions.toMutableMap()
2930
val email = op.email?.takeIf { it.isNotBlank() }
3031
if (email != null && mutable.values.none { it.type == SubscriptionObjectType.EMAIL && it.token == email }) {
31-
mutable[PROFILE_EMAIL_KEY] = SubscriptionObject(type = SubscriptionObjectType.EMAIL, token = email)
32+
mutable[PROFILE_EMAIL_KEY] = subscription(SubscriptionObjectType.EMAIL, email)
3233
}
3334
val sms = op.sms?.takeIf { it.isNotBlank() }
3435
if (sms != null && mutable.values.none { it.type == SubscriptionObjectType.SMS && it.token == sms }) {
35-
mutable[PROFILE_SMS_KEY] = SubscriptionObject(type = SubscriptionObjectType.SMS, token = sms)
36+
mutable[PROFILE_SMS_KEY] = subscription(SubscriptionObjectType.SMS, sms)
3637
}
3738
return mutable
3839
}

‎OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/operations/impl/executors/LoginUserOperationExecutor.kt‎

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import com.onesignal.user.internal.properties.PropertiesModel
4444
import com.onesignal.user.internal.properties.PropertiesModelStore
4545
import com.onesignal.user.internal.subscriptions.SubscriptionModel
4646
import com.onesignal.user.internal.subscriptions.SubscriptionModelStore
47+
import com.onesignal.user.internal.subscriptions.SubscriptionStatus
4748
import com.onesignal.user.internal.subscriptions.SubscriptionType
4849

4950
internal class LoginUserOperationExecutor(
@@ -208,7 +209,10 @@ internal class LoginUserOperationExecutor(
208209
else -> throw Exception("Unrecognized operation: $operation")
209210
}
210211
}
211-
subscriptions = LoginProfileApplier.addSubscriptions(createUserOperation, subscriptions)
212+
subscriptions =
213+
LoginProfileApplier.addSubscriptions(createUserOperation, subscriptions) { type, token ->
214+
subscriptionWithDevice(type, token, enabled = true, notificationTypes = SubscriptionStatus.SUBSCRIBED.value)
215+
}
212216

213217
try {
214218
val subscriptionList = subscriptions.toList()
@@ -293,14 +297,6 @@ internal class LoginUserOperationExecutor(
293297
Logging.warn("LoginUserOperationExecutor: skipped profile hydration because the current identity is not the created user")
294298
}
295299

296-
if (!_identityVerificationService.ivBehaviorActive &&
297-
(!createUserOperation.email.isNullOrBlank() || !createUserOperation.sms.isNullOrBlank())
298-
) {
299-
Logging.warn(
300-
"LoginUserOperationExecutor: email or SMS sent without identity verification. If that address belonged to another user it was transferred.",
301-
)
302-
}
303-
304300
val wasPossiblyAnUpsert = identities.isNotEmpty()
305301
val followUpOperations =
306302
if (wasPossiblyAnUpsert) {
@@ -377,24 +373,38 @@ internal class LoginUserOperationExecutor(
377373
}
378374
val subId = if (!IDManager.isLocalId(operation.subscriptionId)) operation.subscriptionId else null
379375
mutableSubscriptions[operation.subscriptionId] =
380-
SubscriptionObject(
381-
id = subId,
376+
subscriptionWithDevice(
382377
subscriptionType,
383378
operation.address,
384379
operation.enabled,
385380
operation.status.value,
386-
OneSignalUtils.sdkVersion,
387-
Build.MODEL,
388-
Build.VERSION.RELEASE,
389-
RootToolsInternalMethods.isRooted,
390-
DeviceUtils.getNetType(_application.appContext),
391-
DeviceUtils.getCarrierName(_application.appContext),
392-
AndroidUtils.getAppVersion(_application.appContext),
381+
subId,
393382
)
394383

395384
return mutableSubscriptions
396385
}
397386

387+
private fun subscriptionWithDevice(
388+
type: SubscriptionObjectType,
389+
token: String,
390+
enabled: Boolean,
391+
notificationTypes: Int,
392+
id: String? = null,
393+
) = SubscriptionObject(
394+
id = id,
395+
type = type,
396+
token = token,
397+
enabled = enabled,
398+
notificationTypes = notificationTypes,
399+
sdk = OneSignalUtils.sdkVersion,
400+
deviceModel = Build.MODEL,
401+
deviceOS = Build.VERSION.RELEASE,
402+
rooted = RootToolsInternalMethods.isRooted,
403+
netType = DeviceUtils.getNetType(_application.appContext),
404+
carrier = DeviceUtils.getCarrierName(_application.appContext),
405+
appVersion = AndroidUtils.getAppVersion(_application.appContext),
406+
)
407+
398408
private fun createSubscriptionsFromOperation(
399409
operation: UpdateSubscriptionOperation,
400410
subscriptions: Map<String, SubscriptionObject>,

‎OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/operations/LoginUserOperationExecutorTests.kt‎

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package com.onesignal.user.internal.operations
22

3+
import android.os.Build
4+
import androidx.test.core.app.ApplicationProvider
35
import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest
46
import com.onesignal.OneSignalUserProfile
7+
import com.onesignal.common.AndroidUtils
8+
import com.onesignal.common.DeviceUtils
9+
import com.onesignal.common.OneSignalUtils
510
import com.onesignal.common.PIIHasher
11+
import com.onesignal.common.RootToolsInternalMethods
612
import com.onesignal.common.exceptions.BackendException
713
import com.onesignal.core.internal.operations.ExecutionResponse
814
import com.onesignal.core.internal.operations.ExecutionResult
@@ -1076,6 +1082,23 @@ class LoginUserOperationExecutorTests : FunSpec({
10761082
mockk(relaxed = true),
10771083
)
10781084

1085+
fun assertProfileSubscription(
1086+
sub: SubscriptionObject,
1087+
token: String,
1088+
) {
1089+
val context = ApplicationProvider.getApplicationContext<android.content.Context>()
1090+
sub.token shouldBe token
1091+
sub.enabled shouldBe true
1092+
sub.notificationTypes shouldBe SubscriptionStatus.SUBSCRIBED.value
1093+
sub.sdk shouldBe OneSignalUtils.sdkVersion
1094+
sub.deviceModel shouldBe Build.MODEL
1095+
sub.deviceOS shouldBe Build.VERSION.RELEASE
1096+
sub.rooted shouldBe RootToolsInternalMethods.isRooted
1097+
sub.netType shouldBe DeviceUtils.getNetType(context)
1098+
sub.carrier shouldBe DeviceUtils.getCarrierName(context)
1099+
sub.appVersion shouldBe AndroidUtils.getAppVersion(context)
1100+
}
1101+
10791102
test("matchingBackendSubscription matches by id even when another sub has the token") {
10801103
val remaining =
10811104
setOf(
@@ -1209,7 +1232,7 @@ class LoginUserOperationExecutorTests : FunSpec({
12091232
appId,
12101233
mapOf(IdentityConstants.EXTERNAL_ID to "externalId"),
12111234
withArg { subs ->
1212-
subs.single { it.type == SubscriptionObjectType.EMAIL }.token shouldBe "a@b.com"
1235+
assertProfileSubscription(subs.single { it.type == SubscriptionObjectType.EMAIL }, "a@b.com")
12131236
subs.none { it.type == SubscriptionObjectType.SMS } shouldBe true
12141237
},
12151238
any(),
@@ -1237,7 +1260,7 @@ class LoginUserOperationExecutorTests : FunSpec({
12371260
appId,
12381261
mapOf(IdentityConstants.EXTERNAL_ID to "externalId"),
12391262
withArg { subs ->
1240-
subs.single { it.type == SubscriptionObjectType.SMS }.token shouldBe "+15555550100"
1263+
assertProfileSubscription(subs.single { it.type == SubscriptionObjectType.SMS }, "+15555550100")
12411264
subs.none { it.type == SubscriptionObjectType.EMAIL } shouldBe true
12421265
},
12431266
any(),

0 commit comments

Comments
 (0)