@@ -3,10 +3,16 @@ package com.onesignal.sdktest.ui.main
33import android.content.Intent
44import android.net.Uri
55import android.os.Bundle
6+ import android.text.Editable
7+ import android.text.TextWatcher
8+ import android.view.LayoutInflater
69import android.view.View
710import android.widget.AdapterView
811import android.widget.ArrayAdapter
12+ import android.widget.Button
913import android.widget.EditText
14+ import android.widget.ImageButton
15+ import android.widget.LinearLayout
1016import android.widget.Spinner
1117import android.widget.TextView
1218import 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 ) {
0 commit comments