diff --git a/MIGRATION_GUIDE.md b/MIGRATION_GUIDE.md index 5498f33ed3..6414f29a10 100644 --- a/MIGRATION_GUIDE.md +++ b/MIGRATION_GUIDE.md @@ -271,7 +271,7 @@ The user name space is accessible via `OneSignal.User` (in Kotlin) or `OneSignal | `fun addTags(tags: Map)` | `void addTags(Map tags)` | *Add multiple tags for the current user. Tags are key:value pairs used as building blocks for targeting specific users and/or personalizing messages. If the tag key already exists, it will be replaced with the value provided here.* | | `fun removeTag(key: String)` | `void removeTag(String key)` | *Remove the data tag with the provided key from the current user.* | | `fun removeTags(keys: Collection)` | `void removeTags(Collection keys)` | *Remove multiple tags from the current user.* | - +| `fun getTags()` | `Map getTags()` | *Return a copy of all local tags from the current user.* **Session Namespace** The session namespace is accessible via `OneSignal.Session` (in Kotlin) or `OneSignal.getSession()` (in Java) and provides access to session-scoped functionality. diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/IUserManager.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/IUserManager.kt index e9de656d0d..b3e2bc3864 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/IUserManager.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/IUserManager.kt @@ -133,4 +133,9 @@ interface IUserManager { * @param keys The collection of keys, all of which will be removed from the current user. */ fun removeTags(keys: Collection) + + /** + * Return a copy of all local tags from the current user. + */ + fun getTags(): Map } diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/UserManager.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/UserManager.kt index dbb8add277..0effb3c9ed 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/UserManager.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/UserManager.kt @@ -23,9 +23,6 @@ internal open class UserManager( val externalId: String? get() = _identityModel.externalId - val tags: Map - get() = _propertiesModel.tags - val aliases: Map get() = _identityModel.filter { it.key != IdentityModel::id.name }.toMap() @@ -218,4 +215,8 @@ internal open class UserManager( _propertiesModel.tags.remove(it) } } + + override fun getTags(): Map { + return _propertiesModel.tags.toMap() + } } diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/UserManagerTests.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/UserManagerTests.kt index b0e0953805..504d397dea 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/UserManagerTests.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/UserManagerTests.kt @@ -6,6 +6,7 @@ import com.onesignal.user.internal.subscriptions.ISubscriptionManager import com.onesignal.user.internal.subscriptions.SubscriptionList import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe +import io.kotest.matchers.shouldNotBe import io.kotest.runner.junit4.KotestTestRunner import io.mockk.every import io.mockk.just @@ -107,8 +108,8 @@ class UserManagerTests : FunSpec({ UserManager(mockSubscriptionManager, MockHelper.identityModelStore(), propertiesModelStore, MockHelper.languageContext()) // When - val tag1 = userManager.tags["my-tag-key1"] - val tag2 = userManager.tags["my-tag-key2"] + val tag1 = propertiesModelStore.model.tags["my-tag-key1"] + val tag2 = propertiesModelStore.model.tags["my-tag-key2"] // add userManager.addTag("my-tag-key5", "my-tag-value5") @@ -135,6 +136,31 @@ class UserManagerTests : FunSpec({ propertiesModelStore.model.tags["my-tag-key3"] shouldBe null } + test("getTags returns a copy of tags") { + // Given + val mockSubscriptionManager = mockk() + val propertiesModelStore = + MockHelper.propertiesModelStore { + it.tags["my-tag-key1"] = "my-tag-value1" + } + + val userManager = UserManager(mockSubscriptionManager, MockHelper.identityModelStore(), propertiesModelStore, MockHelper.languageContext()) + + // When + val tagSnapshot1 = userManager.getTags() + + // Then + tagSnapshot1.size shouldBe propertiesModelStore.model.tags.size + tagSnapshot1["my-tag-key1"] shouldBe propertiesModelStore.model.tags["my-tag-key1"] + + // Modify + userManager.addTag("my-tag-key2", "my-tag-value2") + userManager.getTags().size shouldBe 2 + + // Then + tagSnapshot1.size shouldNotBe userManager.getTags().size + } + test("subscriptions are backed by the subscriptions manager") { // Given val subscriptionList = SubscriptionList(listOf(), UninitializedPushSubscription())