diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt index 2f42a69ef6..8cc26d7fb7 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt @@ -159,7 +159,8 @@ class WebsitePermissionsView( adapter.setDropDownViewResource(R.layout.quicksetting_permission_spinner_dropdown) viewHolder.status.adapter = adapter - viewHolder.status.setSelection(selectedIndex, false) + viewHolder.status.tag = permissionState.autoplayValue + viewHolder.status.setSelection(selectedIndex) viewHolder.status.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( @@ -168,6 +169,14 @@ class WebsitePermissionsView( position: Int, id: Long ) { + // Unfortunately the spinner component triggers an selection event when initialized, + // to avoid that, we are using the tag property to store the selected value and + // be able to differentiate from an initialization event from a normal selection event + // see https://stackoverflow.com/questions/21747917/undesired-onitemselected-calls/21751327#21751327 + if (viewHolder.status.selectedItem == viewHolder.status.tag) { + return + } + viewHolder.status.tag = viewHolder.status.selectedItem val type = viewHolder.status.selectedItem as AutoplayValue interactor.onAutoplayChanged(type) } diff --git a/app/src/test/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionViewTest.kt b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionViewTest.kt index 09a0c81a9c..96783eff8e 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionViewTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionViewTest.kt @@ -195,6 +195,18 @@ class WebsitePermissionViewTest { 0L ) - verify { interactor.onAutoplayChanged(permissionView.status.selectedItem as AutoplayValue) } + // Selecting the same item should not trigger a selection event. + verify(exactly = 0) { interactor.onAutoplayChanged(permissionView.status.selectedItem as AutoplayValue) } + + permissionView.status.setSelection(2) + permissionView.status.onItemSelectedListener!!.onItemSelected( + mock(), + permissionView.status, + 2, + 0L + ) + + // Selecting a different item from the selected one should trigger an selection event. + verify(exactly = 1) { interactor.onAutoplayChanged(permissionView.status.selectedItem as AutoplayValue) } } }