diff --git a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/pager/PagerIndicatorConnector.kt b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/pager/PagerIndicatorConnector.kt index b93b34278..ddc9950b6 100644 --- a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/pager/PagerIndicatorConnector.kt +++ b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/pager/PagerIndicatorConnector.kt @@ -3,13 +3,12 @@ package com.yandex.div.core.view2.divs.pager import com.yandex.div.core.dagger.DivScope import com.yandex.div.core.view2.divs.widgets.DivPagerIndicatorView import com.yandex.div.core.view2.divs.widgets.DivPagerView -import java.util.WeakHashMap import javax.inject.Inject @DivScope internal class PagerIndicatorConnector @Inject constructor() { - private val divPagers = WeakHashMap() - private val divIndicators = WeakHashMap>() + private val divPagers = mutableMapOf() + private val divIndicators = mutableMapOf>() internal fun submitPager(pagerId: String, divPagerView: DivPagerView) { divPagers[pagerId] = divPagerView @@ -21,6 +20,7 @@ internal class PagerIndicatorConnector @Inject constructor() { internal fun attach() { divPagers.forEach { (pagerId, pager) -> + pager.clearChangePageCallbackForIndicators() divIndicators[pagerId]?.forEach { it.attachPager(pager) } diff --git a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/widgets/DivPagerView.kt b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/widgets/DivPagerView.kt index 8fc325fae..7027d19a1 100644 --- a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/widgets/DivPagerView.kt +++ b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/widgets/DivPagerView.kt @@ -34,6 +34,9 @@ internal class DivPagerView @JvmOverloads constructor( field = value } + private val changePageCallbacksForIndicators: + MutableList = mutableListOf() + internal var changePageCallbackForLogger: ViewPager2.OnPageChangeCallback? = null set(value) { field?.let(viewPager::unregisterOnPageChangeCallback) @@ -93,6 +96,23 @@ internal class DivPagerView @JvmOverloads constructor( dispatchDrawBorderClipped(canvas) { super.dispatchDraw(it) } } + fun addChangePageCallbackForIndicators(callback: ViewPager2.OnPageChangeCallback) { + changePageCallbacksForIndicators.add(callback) + viewPager.registerOnPageChangeCallback(callback) + } + + fun removeChangePageCallbackForIndicators(callback: ViewPager2.OnPageChangeCallback) { + changePageCallbacksForIndicators.remove(callback) + viewPager.unregisterOnPageChangeCallback(callback) + } + + fun clearChangePageCallbackForIndicators() { + changePageCallbacksForIndicators.forEach { + viewPager.unregisterOnPageChangeCallback(it) + } + changePageCallbacksForIndicators.clear() + } + override fun onInterceptTouchEvent(event: MotionEvent): Boolean { val intercepted = onInterceptTouchEventListener?.onInterceptTouchEvent(target = this, event = event) diff --git a/client/android/div/src/main/java/com/yandex/div/internal/widget/indicator/PagerIndicatorView.kt b/client/android/div/src/main/java/com/yandex/div/internal/widget/indicator/PagerIndicatorView.kt index bacf7113a..9c592106b 100644 --- a/client/android/div/src/main/java/com/yandex/div/internal/widget/indicator/PagerIndicatorView.kt +++ b/client/android/div/src/main/java/com/yandex/div/internal/widget/indicator/PagerIndicatorView.kt @@ -17,7 +17,7 @@ internal open class PagerIndicatorView @JvmOverloads constructor( ) : View(context, attrs, defStyleAttr) { private var stripDrawer: IndicatorsStripDrawer? = null - private var pager: ViewPager2? = null + private var divPager: DivPagerView? = null private var style: IndicatorParams.Style? = null private val onPageChangeListener: ViewPager2.OnPageChangeCallback = object: ViewPager2.OnPageChangeCallback() { @@ -72,8 +72,9 @@ internal open class PagerIndicatorView @JvmOverloads constructor( val widthSize = MeasureSpec.getSize(widthMeasureSpec) val selectedWidth = style?.activeShape?.itemSize?.width ?: 0f val desiredWidth = when (val itemPlacement = style?.itemsPlacement) { - is IndicatorParams.ItemPlacement.Default -> - (itemPlacement.spaceBetweenCenters * (pager?.adapter?.itemCount ?: 0) + selectedWidth).toInt() + paddingLeft + paddingRight + is IndicatorParams.ItemPlacement.Default -> (itemPlacement.spaceBetweenCenters * + (divPager?.viewPager?.adapter?.itemCount ?: 0) + selectedWidth).toInt() + + paddingLeft + paddingRight is IndicatorParams.ItemPlacement.Stretch -> widthSize null -> selectedWidth.toInt() + paddingLeft + paddingRight } @@ -97,27 +98,25 @@ internal open class PagerIndicatorView @JvmOverloads constructor( stripDrawer?.onDraw(canvas) } - fun attachPager(divPager: DivPagerView) { - val newPager = divPager.viewPager - if (pager === newPager) { - return - } + fun attachPager(newDivPager: DivPagerView) { + divPager?.removeChangePageCallbackForIndicators(onPageChangeListener) + newDivPager.addChangePageCallbackForIndicators(onPageChangeListener) - pager?.unregisterOnPageChangeCallback(onPageChangeListener) + if (newDivPager === divPager) return - pager = newPager.apply { + divPager = newDivPager + newDivPager.viewPager.apply { requireNotNull(adapter) { "Attached pager adapter is null!" } - registerOnPageChangeCallback(onPageChangeListener) } stripDrawer?.update() - divPager.pagerOnItemsCountChange = DivPagerView.OnItemsUpdatedCallback { + newDivPager.pagerOnItemsCountChange = DivPagerView.OnItemsUpdatedCallback { stripDrawer?.update() } } private fun IndicatorsStripDrawer.update() { - pager?.let { + divPager?.viewPager?.let { it.adapter?.let { adapter -> setItemsCount(adapter.itemCount) } diff --git a/client/android/screenshot-test-plugin/src/main/java/com/yandex/test/screenshot/tasks/ImageComparator.kt b/client/android/screenshot-test-plugin/src/main/java/com/yandex/test/screenshot/tasks/ImageComparator.kt index a02db05e6..1ea949240 100644 --- a/client/android/screenshot-test-plugin/src/main/java/com/yandex/test/screenshot/tasks/ImageComparator.kt +++ b/client/android/screenshot-test-plugin/src/main/java/com/yandex/test/screenshot/tasks/ImageComparator.kt @@ -106,6 +106,6 @@ internal class ImageComparator(private val logger: Logger) { private fun BufferedImage.getRGBSafe(x: Int, y: Int) = if (y < height) getRGB(x, y) else 0 companion object { - private const val THRESHOLD = 5e-5 // Scaled from 0 to 1 + private const val THRESHOLD = 1e-4 // Scaled from 0 to 1 } }