Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 0 additions & 51 deletions OneSignalSDK/onesignal/core/api/core.api
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
}
Expand All @@ -91,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;
Expand Down Expand Up @@ -133,10 +122,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;
Expand Down Expand Up @@ -174,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 <init> (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 <init> (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 <init> ()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 <init> ()V
public fun onStartJob (Landroid/app/job/JobParameters;)Z
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<LoginData>

/**
* Logout the current user (suspend version).
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<LoginData> = 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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,35 +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
* 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)
* ```
*
* 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<T : OneSignalResultData> private constructor(
internal class OneSignalResult<T : OneSignalResultData> private constructor(
/** The payload on success, `null` on failure. */
val data: T?,
/** The failure detail on failure, `null` on success. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() }

Expand Down Expand Up @@ -72,7 +72,7 @@ class OneSignalUserProfile private constructor(builder: Builder) {
internal var aliases: Map<String, String> = 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. */
Expand All @@ -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<String, String>) = 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<String, String>) = apply { this.aliases = aliases.toMap() }

/** Builds the profile. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<LoginData> =
withContext(ioDispatcher) {
Logging.log(LogLevel.DEBUG, "login(externalId: $externalId, profile: $profile, jwtBearerToken: ...${jwtBearerToken?.takeLast(8)})")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 ->
Expand All @@ -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") {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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)
Expand Down
Loading
Loading