Skip to content

Commit 766f522

Browse files
committed
feat(BeaconBuilder): Add assign/unassign methods for handling dynamic groups.
1 parent cd26efd commit 766f522

9 files changed

Lines changed: 182 additions & 3 deletions

File tree

README.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ dependencyResolutionManagement {
155155

156156
// /libs.versions.toml
157157
[versions]
158-
ppgSdk = "3.0.2"
158+
ppgSdk = "3.1.0"
159159

160160
[libraries]
161161
ppg-sdk = { module = "com.github.ppgco.android-sdk:sdk", version.ref = "ppgSdk" }
@@ -242,6 +242,20 @@ PushPushGo.getInstance().createBeacon()
242242
.send();
243243
```
244244

245+
- Assign subscriber to dynamic group:
246+
```java
247+
PushPushGo.getInstance().createBeacon()
248+
.assignToGroup("my-group-name")
249+
.send();
250+
```
251+
252+
- Unassign subscriber from dynamic group:
253+
```java
254+
PushPushGo.getInstance().createBeacon()
255+
.unassignFromGroup("my-group-name")
256+
.send();
257+
```
258+
245259
## Publishing
246260

247261
To maven local repository:

library/api/library.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ public final class com/pushpushgo/sdk/BeaconBuilder {
44
public final fun appendTag (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/pushpushgo/sdk/BeaconBuilder;
55
public final fun appendTag (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Lcom/pushpushgo/sdk/BeaconBuilder;
66
public static synthetic fun appendTag$default (Lcom/pushpushgo/sdk/BeaconBuilder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/lang/Object;)Lcom/pushpushgo/sdk/BeaconBuilder;
7+
public final fun assignToGroup (Ljava/lang/String;)Lcom/pushpushgo/sdk/BeaconBuilder;
78
public final fun getTags ()Ljava/util/List;
89
public final fun getTagsToDelete ()Ljava/util/List;
910
public final fun removeTag ([Ljava/lang/String;)Lcom/pushpushgo/sdk/BeaconBuilder;
@@ -13,6 +14,7 @@ public final class com/pushpushgo/sdk/BeaconBuilder {
1314
public final fun set (Ljava/lang/String;Ljava/lang/Object;)Lcom/pushpushgo/sdk/BeaconBuilder;
1415
public final fun setCustomId (Ljava/lang/Integer;)Lcom/pushpushgo/sdk/BeaconBuilder;
1516
public final fun setCustomId (Ljava/lang/String;)Lcom/pushpushgo/sdk/BeaconBuilder;
17+
public final fun unassignFromGroup (Ljava/lang/String;)Lcom/pushpushgo/sdk/BeaconBuilder;
1618
}
1719

1820
public final class com/pushpushgo/sdk/BuildConfig {

library/src/main/java/com/pushpushgo/sdk/BeaconBuilder.kt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ class BeaconBuilder internal constructor(
1717

1818
private var customId = ""
1919

20+
private var assignToGroup: String? = null
21+
22+
private var unassignFromGroup: String? = null
23+
2024
/**
2125
* Add beacon selector
2226
*
@@ -112,6 +116,32 @@ class BeaconBuilder internal constructor(
112116
return this
113117
}
114118

119+
/**
120+
* Assign subscriber to a dynamic group
121+
*
122+
* @param groupId ID of the dynamic group to assign to
123+
*
124+
* @return instance of builder
125+
*/
126+
fun assignToGroup(groupId: String): BeaconBuilder {
127+
assignToGroup = groupId
128+
129+
return this
130+
}
131+
132+
/**
133+
* Unassign subscriber from a dynamic group
134+
*
135+
* @param groupId ID of the dynamic group to unassign from
136+
*
137+
* @return instance of builder
138+
*/
139+
fun unassignFromGroup(groupId: String): BeaconBuilder {
140+
unassignFromGroup = groupId
141+
142+
return this
143+
}
144+
115145
/**
116146
* @throws PushPushException on unsupported selector value type
117147
*/
@@ -122,6 +152,8 @@ class BeaconBuilder internal constructor(
122152
addTags()
123153
addTagsToDelete()
124154
if (customId.isNotEmpty()) put("customId", customId)
155+
assignToGroup?.let { put("assignToGroup", it) }
156+
unassignFromGroup?.let { put("unassignFromGroup", it) }
125157
},
126158
)
127159
}

library/src/main/java/com/pushpushgo/sdk/PushPushGo.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class PushPushGo private constructor(
4141
private val customBaseUrl: String?,
4242
) {
4343
companion object {
44-
const val VERSION = "3.0.3"
44+
const val VERSION = "3.1.0"
4545

4646
internal const val TAG = "PPGo"
4747

library/src/test/java/com/pushpushgo/sdk/BeaconBuilderTest.kt

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,4 +274,88 @@ internal class BeaconBuilderTest {
274274
)
275275
}
276276
}
277+
278+
@Test
279+
fun `assign to group`() {
280+
every { uploadDelegate.sendBeacon(any()) } just Runs
281+
282+
beaconBuilder = BeaconBuilder(uploadDelegate)
283+
284+
beaconBuilder.assignToGroup("my-segment-123")
285+
286+
beaconBuilder.send()
287+
288+
verify {
289+
uploadDelegate.sendBeacon(
290+
match {
291+
it["assignToGroup"] == "my-segment-123"
292+
},
293+
)
294+
}
295+
}
296+
297+
@Test
298+
fun `unassign from group`() {
299+
every { uploadDelegate.sendBeacon(any()) } just Runs
300+
301+
beaconBuilder = BeaconBuilder(uploadDelegate)
302+
303+
beaconBuilder.unassignFromGroup("my-segment-333")
304+
305+
beaconBuilder.send()
306+
307+
verify {
308+
uploadDelegate.sendBeacon(
309+
match {
310+
it["unassignFromGroup"] == "my-segment-333"
311+
},
312+
)
313+
}
314+
}
315+
316+
@Test
317+
fun `assign and unassign from groups simultaneously`() {
318+
every { uploadDelegate.sendBeacon(any()) } just Runs
319+
320+
beaconBuilder = BeaconBuilder(uploadDelegate)
321+
322+
beaconBuilder
323+
.assignToGroup("my-segment-123")
324+
.unassignFromGroup("my-segment-333")
325+
326+
beaconBuilder.send()
327+
328+
verify {
329+
uploadDelegate.sendBeacon(
330+
match {
331+
it["assignToGroup"] == "my-segment-123" &&
332+
it["unassignFromGroup"] == "my-segment-333"
333+
},
334+
)
335+
}
336+
}
337+
338+
@Test
339+
fun `assign to group with other beacon data`() {
340+
every { uploadDelegate.sendBeacon(any()) } just Runs
341+
342+
beaconBuilder = BeaconBuilder(uploadDelegate)
343+
344+
beaconBuilder
345+
.setCustomId("xxsampleId")
346+
.assignToGroup("my-segment-123")
347+
.appendTag("tag1", "label1")
348+
349+
beaconBuilder.send()
350+
351+
verify {
352+
uploadDelegate.sendBeacon(
353+
match {
354+
it["customId"] == "xxsampleId" &&
355+
it["assignToGroup"] == "my-segment-123" &&
356+
it.has("tags")
357+
},
358+
)
359+
}
360+
}
277361
}

sample/src/main/java/com/pushpushgo/sample/activity/BeaconActivity.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,5 +71,25 @@ class BeaconActivity : AppCompatActivity(R.layout.activity_beacon) {
7171
.setCustomId("TEST1")
7272
.send()
7373
}
74+
75+
findViewById<Button>(R.id.beacon7).setOnClickListener {
76+
ppg.createBeacon()
77+
.assignToGroup("test-group-123")
78+
.send()
79+
}
80+
81+
findViewById<Button>(R.id.beacon8).setOnClickListener {
82+
ppg.createBeacon()
83+
.unassignFromGroup("test-group-123")
84+
.send()
85+
}
86+
87+
findViewById<Button>(R.id.beacon9).setOnClickListener {
88+
ppg.createBeacon()
89+
.assignToGroup("group-to-join")
90+
.unassignFromGroup("group-to-leave")
91+
.setCustomId("GROUPS_TEST")
92+
.send()
93+
}
7494
}
7595
}

sample/src/main/res/layout/activity_beacon.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,24 @@
5050
android:layout_height="wrap_content"
5151
android:text="custom_id=TEST1" />
5252

53+
<Button
54+
android:id="@+id/beacon7"
55+
android:layout_width="wrap_content"
56+
android:layout_height="wrap_content"
57+
android:text="assignToGroup(test-group-123)" />
58+
59+
<Button
60+
android:id="@+id/beacon8"
61+
android:layout_width="wrap_content"
62+
android:layout_height="wrap_content"
63+
android:text="unassignFromGroup(test-group-123)" />
64+
65+
<Button
66+
android:id="@+id/beacon9"
67+
android:layout_width="wrap_content"
68+
android:layout_height="wrap_content"
69+
android:text="assign + unassign (different groups)" />
70+
5371
</LinearLayout>
5472

5573
</ScrollView>

settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ if (!System.env.JITPACK) include ':sample', ':samplehms', ':samplejava', ':sampl
1111
dependencyResolutionManagement {
1212
versionCatalogs {
1313
libs {
14-
version('sdk', '3.0.3')
14+
version('sdk', '3.1.0')
1515
version('kotlin', '2.2.0')
1616
version('ksp', '2.2.0-2.0.2')
1717
version('coroutines', '1.10.1')

settings.gradle.kts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
pluginManagement {
2+
repositories {
3+
gradlePluginPortal()
4+
google()
5+
mavenCentral()
6+
}
7+
}
8+
include ':library', ":library-no-op", ":library-inappmessages"
9+
if (!System.env.JITPACK) include ':sample', ':samplehms', ':samplejava', ':sample-inapp'

0 commit comments

Comments
 (0)