Skip to content

Commit a38e0e5

Browse files
committed
add multipair dialog logic
1 parent e99ceaa commit a38e0e5

7 files changed

Lines changed: 319 additions & 8 deletions

File tree

Examples/OneSignalDemoV2/app/src/main/java/com/onesignal/sdktest/data/repository/OneSignalRepository.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ class OneSignalRepository {
3636
OneSignal.User.addAlias(label, id)
3737
}
3838

39+
fun addAliases(aliases: Map<String, String>) {
40+
Log.d(TAG, "Adding aliases: $aliases")
41+
OneSignal.User.addAliases(aliases)
42+
}
43+
3944
fun removeAlias(label: String) {
4045
Log.d(TAG, "Removing alias: $label")
4146
OneSignal.User.removeAlias(label)
@@ -76,6 +81,11 @@ class OneSignalRepository {
7681
OneSignal.User.addTag(key, value)
7782
}
7883

84+
fun addTags(tags: Map<String, String>) {
85+
Log.d(TAG, "Adding tags: $tags")
86+
OneSignal.User.addTags(tags)
87+
}
88+
7989
fun removeTag(key: String) {
8090
Log.d(TAG, "Removing tag: $key")
8191
OneSignal.User.removeTag(key)
@@ -91,6 +101,11 @@ class OneSignalRepository {
91101
OneSignal.InAppMessages.addTrigger(key, value)
92102
}
93103

104+
fun addTriggers(triggers: Map<String, String>) {
105+
Log.d(TAG, "Adding triggers: $triggers")
106+
OneSignal.InAppMessages.addTriggers(triggers)
107+
}
108+
94109
fun removeTrigger(key: String) {
95110
Log.d(TAG, "Removing trigger: $key")
96111
OneSignal.InAppMessages.removeTrigger(key)

Examples/OneSignalDemoV2/app/src/main/java/com/onesignal/sdktest/ui/main/MainActivity.kt

Lines changed: 138 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,16 @@ package com.onesignal.sdktest.ui.main
33
import android.content.Intent
44
import android.net.Uri
55
import android.os.Bundle
6+
import android.text.Editable
7+
import android.text.TextWatcher
8+
import android.view.LayoutInflater
69
import android.view.View
710
import android.widget.AdapterView
811
import android.widget.ArrayAdapter
12+
import android.widget.Button
913
import android.widget.EditText
14+
import android.widget.ImageButton
15+
import android.widget.LinearLayout
1016
import android.widget.Spinner
1117
import android.widget.TextView
1218
import android.widget.Toast
@@ -177,13 +183,20 @@ class MainActivity : AppCompatActivity() {
177183
viewModel.logoutUser()
178184
}
179185

180-
// Add buttons
186+
// Add buttons (single)
181187
binding.btnAddAlias.setOnClickListener {
182188
showAddPairDialog(getString(R.string.add_alias_title)) { key, value ->
183189
viewModel.addAlias(key, value)
184190
}
185191
}
186192

193+
// Add buttons (multi)
194+
binding.btnAddAliases.setOnClickListener {
195+
showAddMultiPairDialog(getString(R.string.add_aliases_title)) { pairs ->
196+
viewModel.addAliases(pairs)
197+
}
198+
}
199+
187200
binding.btnRemoveAllAliases.setOnClickListener {
188201
viewModel.removeAliases()
189202
}
@@ -206,12 +219,24 @@ class MainActivity : AppCompatActivity() {
206219
}
207220
}
208221

222+
binding.btnAddTags.setOnClickListener {
223+
showAddMultiPairDialog(getString(R.string.add_tags_title)) { pairs ->
224+
viewModel.addTags(pairs)
225+
}
226+
}
227+
209228
binding.btnAddTrigger.setOnClickListener {
210229
showAddPairDialog(getString(R.string.add_trigger_title)) { key, value ->
211230
viewModel.addTrigger(key, value)
212231
}
213232
}
214233

234+
binding.btnAddTriggers.setOnClickListener {
235+
showAddMultiPairDialog(getString(R.string.add_triggers_title)) { pairs ->
236+
viewModel.addTriggers(pairs)
237+
}
238+
}
239+
215240
binding.btnClearTriggers.setOnClickListener {
216241
viewModel.clearTriggers()
217242
}
@@ -391,18 +416,123 @@ class MainActivity : AppCompatActivity() {
391416
val etKey = dialogView.findViewById<EditText>(R.id.et_key)
392417
val etValue = dialogView.findViewById<EditText>(R.id.et_value)
393418

394-
AlertDialog.Builder(this, R.style.AlertDialogTheme)
419+
val dialog = AlertDialog.Builder(this, R.style.AlertDialogTheme)
395420
.setTitle(title)
396421
.setView(dialogView)
397-
.setPositiveButton(R.string.add) { _, _ ->
398-
val key = etKey.text.toString().trim()
399-
val value = etValue.text.toString().trim()
400-
if (key.isNotEmpty()) {
401-
onAdd(key, value)
422+
.setPositiveButton(R.string.add, null)
423+
.setNegativeButton(R.string.cancel, null)
424+
.create()
425+
426+
val watcher = object : TextWatcher {
427+
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
428+
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
429+
override fun afterTextChanged(s: Editable?) {
430+
val addButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE) ?: return
431+
addButton.isEnabled = etKey.text.toString().trim().isNotEmpty()
432+
&& etValue.text.toString().trim().isNotEmpty()
433+
}
434+
}
435+
436+
etKey.addTextChangedListener(watcher)
437+
etValue.addTextChangedListener(watcher)
438+
439+
dialog.setOnShowListener {
440+
dialog.getButton(AlertDialog.BUTTON_POSITIVE).apply {
441+
isEnabled = false
442+
setOnClickListener {
443+
onAdd(etKey.text.toString().trim(), etValue.text.toString().trim())
444+
dialog.dismiss()
402445
}
403446
}
447+
}
448+
449+
dialog.show()
450+
}
451+
452+
private fun showAddMultiPairDialog(title: String, onAdd: (List<Pair<String, String>>) -> Unit) {
453+
val dialogView = layoutInflater.inflate(R.layout.dialog_add_multi_pair, null)
454+
val rowsContainer = dialogView.findViewById<LinearLayout>(R.id.rows_container)
455+
val btnAddRow = dialogView.findViewById<View>(R.id.btn_add_row)
456+
457+
val dialog = AlertDialog.Builder(this, R.style.AlertDialogTheme)
458+
.setTitle(title)
459+
.setView(dialogView)
460+
.setPositiveButton(R.string.add, null)
404461
.setNegativeButton(R.string.cancel, null)
405-
.show()
462+
.create()
463+
464+
fun validateFields() {
465+
val addButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE) ?: return
466+
var allFilled = true
467+
for (i in 0 until rowsContainer.childCount) {
468+
val row = rowsContainer.getChildAt(i)
469+
val key = row.findViewById<EditText>(R.id.et_row_key).text.toString().trim()
470+
val value = row.findViewById<EditText>(R.id.et_row_value).text.toString().trim()
471+
if (key.isEmpty() || value.isEmpty()) {
472+
allFilled = false
473+
break
474+
}
475+
}
476+
addButton.isEnabled = allFilled
477+
}
478+
479+
val fieldWatcher = object : TextWatcher {
480+
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
481+
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
482+
override fun afterTextChanged(s: Editable?) { validateFields() }
483+
}
484+
485+
fun addRow() {
486+
val rowView = LayoutInflater.from(this).inflate(R.layout.item_dialog_pair_row, rowsContainer, false)
487+
val btnRemove = rowView.findViewById<ImageButton>(R.id.btn_remove_row)
488+
val etKey = rowView.findViewById<EditText>(R.id.et_row_key)
489+
val etValue = rowView.findViewById<EditText>(R.id.et_row_value)
490+
491+
etKey.addTextChangedListener(fieldWatcher)
492+
etValue.addTextChangedListener(fieldWatcher)
493+
494+
rowsContainer.addView(rowView)
495+
496+
if (rowsContainer.childCount > 1) {
497+
for (i in 0 until rowsContainer.childCount) {
498+
rowsContainer.getChildAt(i)
499+
.findViewById<ImageButton>(R.id.btn_remove_row).visibility = View.VISIBLE
500+
}
501+
}
502+
503+
btnRemove.setOnClickListener {
504+
rowsContainer.removeView(rowView)
505+
if (rowsContainer.childCount == 1) {
506+
rowsContainer.getChildAt(0)
507+
.findViewById<ImageButton>(R.id.btn_remove_row).visibility = View.GONE
508+
}
509+
validateFields()
510+
}
511+
512+
validateFields()
513+
}
514+
515+
addRow()
516+
517+
btnAddRow.setOnClickListener { addRow() }
518+
519+
dialog.setOnShowListener {
520+
val addButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE)
521+
addButton.isEnabled = false
522+
addButton.setOnClickListener {
523+
val pairs = mutableListOf<Pair<String, String>>()
524+
for (i in 0 until rowsContainer.childCount) {
525+
val row = rowsContainer.getChildAt(i)
526+
val key = row.findViewById<EditText>(R.id.et_row_key).text.toString().trim()
527+
val value = row.findViewById<EditText>(R.id.et_row_value).text.toString().trim()
528+
pairs.add(Pair(key, value))
529+
}
530+
onAdd(pairs)
531+
dialog.dismiss()
532+
}
533+
}
534+
535+
dialog.show()
406536
}
407537

408538
private fun showSingleInputDialog(label: String, onAdd: (String) -> Unit) {

Examples/OneSignalDemoV2/app/src/main/java/com/onesignal/sdktest/ui/main/MainViewModel.kt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,21 @@ class MainViewModel(application: Application) : AndroidViewModel(application), I
336336
}
337337
}
338338

339+
fun addAliases(pairs: List<Pair<String, String>>) {
340+
viewModelScope.launch(Dispatchers.IO) {
341+
val map = pairs.associate { it.first to it.second }
342+
repository.addAliases(map)
343+
withContext(Dispatchers.Main) {
344+
for ((label, id) in pairs) {
345+
aliasesList.removeAll { it.first == label }
346+
aliasesList.add(Pair(label, id))
347+
}
348+
refreshAliases()
349+
showToast("${pairs.size} alias(es) added")
350+
}
351+
}
352+
}
353+
339354
fun removeAlias(label: String) {
340355
viewModelScope.launch(Dispatchers.IO) {
341356
repository.removeAlias(label)
@@ -420,6 +435,17 @@ class MainViewModel(application: Application) : AndroidViewModel(application), I
420435
}
421436
}
422437

438+
fun addTags(pairs: List<Pair<String, String>>) {
439+
viewModelScope.launch(Dispatchers.IO) {
440+
val map = pairs.associate { it.first to it.second }
441+
repository.addTags(map)
442+
withContext(Dispatchers.Main) {
443+
loadExistingTags()
444+
showToast("${pairs.size} tag(s) added")
445+
}
446+
}
447+
}
448+
423449
fun removeTag(key: String) {
424450
viewModelScope.launch(Dispatchers.IO) {
425451
repository.removeTag(key)
@@ -443,6 +469,21 @@ class MainViewModel(application: Application) : AndroidViewModel(application), I
443469
}
444470
}
445471

472+
fun addTriggers(pairs: List<Pair<String, String>>) {
473+
viewModelScope.launch(Dispatchers.IO) {
474+
val map = pairs.associate { it.first to it.second }
475+
repository.addTriggers(map)
476+
withContext(Dispatchers.Main) {
477+
for ((key, value) in pairs) {
478+
triggersList.removeAll { it.first == key }
479+
triggersList.add(Pair(key, value))
480+
}
481+
refreshTriggers()
482+
showToast("${pairs.size} trigger(s) added")
483+
}
484+
}
485+
}
486+
446487
fun removeTrigger(key: String) {
447488
viewModelScope.launch(Dispatchers.IO) {
448489
repository.removeTrigger(key)

Examples/OneSignalDemoV2/app/src/main/res/layout/activity_main.xml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,20 @@
706706
android:textColor="@android:color/white"
707707
android:background="@color/colorPrimary"/>
708708

709+
<View
710+
android:layout_width="match_parent"
711+
android:layout_height="1dp"
712+
android:background="@color/colorDivider"/>
713+
714+
<Button
715+
android:id="@+id/btn_add_aliases"
716+
android:layout_width="match_parent"
717+
android:layout_height="56dp"
718+
android:text="@string/add_aliases"
719+
android:textSize="19sp"
720+
android:textColor="@android:color/white"
721+
android:background="@color/colorPrimary"/>
722+
709723
<LinearLayout
710724
android:id="@+id/layout_remove_all_aliases"
711725
android:layout_width="match_parent"
@@ -993,6 +1007,20 @@
9931007
android:textColor="@android:color/white"
9941008
android:background="@color/colorPrimary"/>
9951009

1010+
<View
1011+
android:layout_width="match_parent"
1012+
android:layout_height="1dp"
1013+
android:background="@color/colorDivider"/>
1014+
1015+
<Button
1016+
android:id="@+id/btn_add_tags"
1017+
android:layout_width="match_parent"
1018+
android:layout_height="56dp"
1019+
android:text="@string/add_tags"
1020+
android:textSize="19sp"
1021+
android:textColor="@android:color/white"
1022+
android:background="@color/colorPrimary"/>
1023+
9961024
</LinearLayout>
9971025

9981026
</androidx.cardview.widget.CardView>
@@ -1128,6 +1156,20 @@
11281156
android:textColor="@android:color/white"
11291157
android:background="@color/colorPrimary"/>
11301158

1159+
<View
1160+
android:layout_width="match_parent"
1161+
android:layout_height="1dp"
1162+
android:background="@color/colorDivider"/>
1163+
1164+
<Button
1165+
android:id="@+id/btn_add_triggers"
1166+
android:layout_width="match_parent"
1167+
android:layout_height="56dp"
1168+
android:text="@string/add_triggers"
1169+
android:textSize="19sp"
1170+
android:textColor="@android:color/white"
1171+
android:background="@color/colorPrimary"/>
1172+
11311173
<LinearLayout
11321174
android:id="@+id/layout_clear_triggers"
11331175
android:layout_width="match_parent"
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="wrap_content"
5+
android:orientation="vertical"
6+
android:padding="16dp">
7+
8+
<ScrollView
9+
android:layout_width="match_parent"
10+
android:layout_height="wrap_content"
11+
android:maxHeight="400dp">
12+
13+
<LinearLayout
14+
android:id="@+id/rows_container"
15+
android:layout_width="match_parent"
16+
android:layout_height="wrap_content"
17+
android:orientation="vertical" />
18+
19+
</ScrollView>
20+
21+
<Button
22+
android:id="@+id/btn_add_row"
23+
android:layout_width="match_parent"
24+
android:layout_height="44dp"
25+
android:layout_marginTop="8dp"
26+
android:text="@string/add_row"
27+
android:textSize="14sp"
28+
android:textColor="@color/colorPrimary"
29+
android:backgroundTint="@android:color/transparent"
30+
style="?android:attr/borderlessButtonStyle" />
31+
32+
</LinearLayout>

0 commit comments

Comments
 (0)