From e216f0bfa7fd7ce55bc2f0911a39889168943095 Mon Sep 17 00:00:00 2001 From: grechka62 Date: Thu, 23 Apr 2026 22:30:56 +0300 Subject: [PATCH] Fix snapping after scroll actions in paging gallery commit_hash:0bc9521306e4f743628b8bd796b4f15670d0e1b8 --- .../div/core/view2/items/DivViewWithItems.kt | 64 ++++++++++++++---- .../core/view2/items/GalleryItemsViewTest.kt | 4 +- .../div-gallery/paging-paddings/step1.png | Bin 770 -> 777 bytes .../vertical-paging-paddings/step1.png | Bin 2085 -> 2085 bytes .../div-gallery/paging-paddings/step1.png | Bin 2377 -> 2844 bytes .../vertical-paging-paddings/step1.png | Bin 4810 -> 4810 bytes .../div-gallery/paging-paddings/step1.png | Bin 1108 -> 1116 bytes .../vertical-paging-paddings/step1.png | Bin 3096 -> 3096 bytes .../div-gallery/paging-paddings/step1.png | Bin 2377 -> 2842 bytes .../vertical-paging-paddings/step1.png | Bin 4810 -> 4810 bytes .../div-gallery/paging-paddings/step1.png | Bin 1108 -> 1116 bytes .../vertical-paging-paddings/step1.png | Bin 3096 -> 3096 bytes .../div-gallery/paging-paddings/step1.png | Bin 1582 -> 1766 bytes .../vertical-paging-paddings/step1.png | Bin 8452 -> 8450 bytes .../div-gallery/paging-paddings/step1.png | Bin 704 -> 714 bytes .../vertical-paging-paddings/step1.png | Bin 1780 -> 1782 bytes .../div-gallery/paging-paddings/step1.png | Bin 1582 -> 1766 bytes .../vertical-paging-paddings/step1.png | Bin 8452 -> 8450 bytes .../div-gallery/paging-paddings/step1.png | Bin 704 -> 714 bytes .../vertical-paging-paddings/step1.png | Bin 1780 -> 1782 bytes .../div-gallery/paging-paddings.json | 4 +- .../div-gallery/vertical-paging-paddings.json | 4 +- 22 files changed, 59 insertions(+), 17 deletions(-) diff --git a/client/android/div/src/main/java/com/yandex/div/core/view2/items/DivViewWithItems.kt b/client/android/div/src/main/java/com/yandex/div/core/view2/items/DivViewWithItems.kt index 44f0396d6..225ab0d85 100644 --- a/client/android/div/src/main/java/com/yandex/div/core/view2/items/DivViewWithItems.kt +++ b/client/android/div/src/main/java/com/yandex/div/core/view2/items/DivViewWithItems.kt @@ -3,6 +3,7 @@ package com.yandex.div.core.view2.items import android.util.DisplayMetrics import android.view.View import androidx.annotation.VisibleForTesting +import androidx.core.view.doOnNextLayout import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSmoothScroller import androidx.recyclerview.widget.RecyclerView @@ -10,6 +11,7 @@ import com.yandex.div.core.view2.divs.availableHeight import com.yandex.div.core.view2.divs.availableWidth import com.yandex.div.core.view2.divs.dpToPx import com.yandex.div.core.view2.divs.gallery.DivGalleryAdapter +import com.yandex.div.core.view2.divs.gallery.PagerSnapStartHelper import com.yandex.div.core.view2.divs.pager.DivPagerAdapter import com.yandex.div.core.view2.divs.spToPx import com.yandex.div.core.view2.divs.widgets.DivPagerView @@ -73,9 +75,20 @@ internal sealed class DivViewWithItems { */ internal class PagingGallery(view: DivRecyclerView, direction: Direction) : Gallery(view, direction) { - override var currentItem: Int - get() = view.currentItem(direction) - set(value) = checkItem(value, itemCount) { view.smoothScrollToPosition(value) } + override fun createSmoothScroller(): RecyclerView.SmoothScroller { + return object : DivSmoothScroller(view) { + override fun calculateDtToFit( + viewStart: Int, viewEnd: Int, + boxStart: Int, boxEnd: Int, + snapPreference: Int + ): Int { + val itemSpacing = view.pagerSnapStartHelper?.itemSpacing ?: return 0 + val isHorizontal = (view.adapter as? DivGalleryAdapter)?.orientation == RecyclerView.HORIZONTAL + val size = if (isHorizontal) view.width else view.height + return (size - viewStart - viewEnd + itemSpacing) / 2 + } + } + } } /** @@ -91,19 +104,19 @@ internal sealed class DivViewWithItems { get() = view.currentItem(direction) set(value) { checkItem(value, itemCount) { - val smoothScroller = object : LinearSmoothScroller(view.context) { - private val MILLISECONDS_PER_INCH = 50f // default is 25f, bigger - slower - override fun getHorizontalSnapPreference() = SNAP_TO_START - override fun getVerticalSnapPreference() = SNAP_TO_START - override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float { - return MILLISECONDS_PER_INCH / displayMetrics.densityDpi - } - } + val smoothScroller = createSmoothScroller() smoothScroller.targetPosition = value view.layoutManager?.startSmoothScroll(smoothScroller) } } + protected open fun createSmoothScroller(): RecyclerView.SmoothScroller { + return object : DivSmoothScroller(view) { + override fun getHorizontalSnapPreference() = SNAP_TO_START + override fun getVerticalSnapPreference() = SNAP_TO_START + } + } + override val itemCount: Int get() = view.itemCount @@ -117,10 +130,27 @@ internal sealed class DivViewWithItems { override fun setCurrentItemNoAnimation(index: Int) { checkItem(index, itemCount) { - view.scrollToPosition(index) + view.pagerSnapStartHelper?.snapToPosition(index, waitForLayout = true) + ?: view.scrollToPosition(index) } } + private fun PagerSnapStartHelper.snapToPosition(position: Int, waitForLayout: Boolean) { + val layoutManager = view.layoutManager ?: return + layoutManager.findViewByPosition(position)?.let { target -> + val offset = calculateDistanceToFinalSnap(layoutManager, target) + view.scrollBy(offset[0], offset[1]) + return + } + + if (!waitForLayout) return + + view.doOnNextLayout { + snapToPosition(position, waitForLayout = false) + } + view.scrollToPosition(position) + } + override fun getIndicesOfItemWithId(id: String): List { val adapter = view.adapter as? DivGalleryAdapter ?: return emptyList() return adapter.visibleItems.getIndicesWithId(id) { div } @@ -205,6 +235,16 @@ internal sealed class DivViewWithItems { } } } + + private open class DivSmoothScroller(view: RecyclerView): LinearSmoothScroller(view.context) { + + override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics) = + MILLISECONDS_PER_INCH / displayMetrics.densityDpi + + companion object { + private const val MILLISECONDS_PER_INCH = 50f // default is 25f, bigger - slower + } + } } /** diff --git a/client/android/div/src/test/java/com/yandex/div/core/view2/items/GalleryItemsViewTest.kt b/client/android/div/src/test/java/com/yandex/div/core/view2/items/GalleryItemsViewTest.kt index 5fbb49890..2202c0f68 100644 --- a/client/android/div/src/test/java/com/yandex/div/core/view2/items/GalleryItemsViewTest.kt +++ b/client/android/div/src/test/java/com/yandex/div/core/view2/items/GalleryItemsViewTest.kt @@ -160,11 +160,13 @@ class GalleryItemsViewTest { on { resources } doReturn mock() } whenever(view.layoutManager).thenReturn(layoutManager) + val scrollCaptor = argumentCaptor() val underTest = createUnderTest(drv = view) underTest.currentItem = 5 - verify(view).smoothScrollToPosition(5) + verify(layoutManager).startSmoothScroll(scrollCaptor.capture()) + Assert.assertEquals(5, scrollCaptor.firstValue.targetPosition) } @Test diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2InteractiveScreenshotTest/div-gallery/paging-paddings/step1.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2InteractiveScreenshotTest/div-gallery/paging-paddings/step1.png index a2332a46d5b85995f4327852ec21b1875c0aadd2..3ebc21c8de244c5d897a8ac07887f77fbfaec163 100644 GIT binary patch literal 777 zcmeAS@N?(olHy`uVBq!ia0y~yV3Gl{r*W_W$*Ep}uYnXxv6E*A2N2Y7q;vok9Po5; z45^s&_S#0?<^UdtgA>kb%xqK&HV|Mn4ls(^#C+*;|B=}In{)4Pkvaa|^uW$_m+#(8 zo!@?khvEN&KQZ6yUzk06zu#Slm0_N10Rw~OK}LorEbI&ugk=~U{6+;v!-K}j;T?NY XGIyVG0cRdCZ8Lbf`njxgN@xNAm|(mF literal 770 zcmeAS@N?(olHy`uVBq!ia0y~yV3Gl{r*W_W$*Ep}uYnXxv6E*A2N2Y7q;vok?DTYT z45^s&_S#0?<^Ta!#|6gi`?*#vP+(toaG|%cZ9|w?g34prFgOaI1Dkox|s zvHab>w_n5UOMZT3WH|7blaE0`-GZTE&I1O9q9$gB6Qcs7;X&)<@K)55z3-=GMkX*( OGkCiCxvXn5Ty{X4FQq@vkR6n=6v)K0Kj|m;gc~2EfROSXT1LY9CZf(@Z`4d>+Y=& zvvC1j1e3r48Vg&-nDfy`008gJhm!#ZEfU=6p7FX}j=BQ?cyil%-o5qVvoQun0TnlA Wp%=QcNWq!_0000F5{q3hKtQi{Ax37JEHyUJu{U&w+#!2j}M9s^y W#CLsKv$2o?2s~Z=T-G@yGywqN8ZN>B diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2InteractiveScreenshotTest/div-gallery/paging-paddings/step1.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2InteractiveScreenshotTest/div-gallery/paging-paddings/step1.png index 9b006842741e21582d162aad258de8c2b4b0a9b5..5280f5ba0c000161b2100b07eaefb97ca2956a4f 100644 GIT binary patch delta 2017 zcmb7FeKgx?7XGEWoUXPxYAbrOshM`m?6f1LEh-gu7*X|E;v+snG-#SoWuz+cGo5kD z)W=#BrD7RtNFz-%qNSoOp*};~2r;UniXy29LL%9i+0Os_{&mm2=Y8(;-uvF?_8zD- z`{ya}&#%tA{Uh*tOYo$%SBn{1mqc#davCix+*(=WO>-y z2EjhBtMh)5Bcsc`-^^_q44w6;fJzlu%xa!J53F%PAP^&CoTE43d1Inirt0+c7+Tb4 z-COG0;jgZ}G7hj=>%C>er8&KqPyRT&Ru=+3G7AgK(y9Q!b0dxYEhe!Rnd-zrt#9Oa zs{(v`#-3gm)l>SFgMzZVVcF%Ivt{`3yjk@kNBcH_1)dcWC zef`1XEz3jO6G_pjw$@H#3Iv2B&(ur_cZDdk<39>EC49ukcAUg7XKp}ksp0beCeYz%p_Iq$DoSYK8tpMCFe z+95=+NB3?(B$iS^ErpD3d|wIy{H!Vp>}Gsdb*2n-NRF$kDVAXhnwZ38=pr>Ts18;E zwZNvj5+U1J&Sb|cXfH}i_FaYY=`t^+;*(3c7CXhzic+1&lWn*KH|3GBpTF4qB_L@h=N%rEXPDyFl?Au& zt8hYvO2|NFs()-iglbBGyV^#A50^Sy%kw(=Eh4_8*a0qWUvL{hYdlliK8FmL$c)6{ z3l;=|=W{+tFTqRPN-_kH48D{QypUc8(bTQ?gcFltNLqrw9>>Haz}Q$I)V%9_9=8kl zg=s4xk(yM7CoZxKZp5ZN{-IoK%-91AH}%Cc%QvO)2OiD)=Qj^TO3ON^%#Y;&u-ur- zyNf>|Kf}9l%_!PtO@l$ffQPSbzMX1G{lgX?<0-ztwz^q{u(%#&> z#wy#%A>oKgh+zQmv*&*Pr)UVb+TaBQ{F-IZT3b64W@8FeM>NN3;79Wq-?6HlE$Gqf83CW@c+x*(bDomd2N<( zHxM68{6(aV5ZFf*>PgHP7zl*44-3!1PgS8M?tn=QQ}DGWG27c&LIm8rfG?BI>8n=3 zmub!6=17`s463e`=WJydMNDL(ZO?_jS#lDV+QIeIi^l^o`-{alC$RbmFA<-{#oVnM zGz8*dL^~0O@mr)nGa)~>D{2q&DlPis%D?0D4LNLF6oi$(`ZG|%`|@jki5 zb|8ub8=ky(FNr|DuXM8N_I0Pu#nj0mfU0RhMmyn?%Q!(7=FIifv@y9mztea=z-WKh zP*c;(jisdgu}Emn_8cbS0e~W+MQAk0xwzSNf*$!FpGbP-I!t;k+fi z-O-@PeE-5jLn44ReWpi_NIzCFy6d4qgxF0amaz-)JFX|Q!UT2fMqzfRFSMtg;iOmS zwvspgp)OQvYBzHK;ao<`TR|Rsad_BGNriU3wgU49F%?*b0pQml8|sn5ZfQ?tptTlQ zhQj_<#%c3y-6$f!9!6N5uJufqkLRy+2Qf?Sz~2@5Lga+XGRRKWz1fg#leRtB=nDaU zcGGvI(%gCcUt&9c&W;j*mmMwH13VhFe^)DeB>QM*XA*gee^GbdvrzVH2LcvrHKV|k z5-w9XACmP;M(Up$8V|kh0#Z{_++uq2 z=P9QN!M?sr^5wjh@4ho%lq0Ws_j~Kd`?Zxt_kdzeKaa=nh)W6E(>OAvSp(HCwF$-l dz0}r&8%DnJ+B*g*2K49rH$HB=o4$^^`Cm|8Flhh) literal 2377 zcmeHJ`#aQG7(YXc(ioTRMlKIxLy44fn^7`UJ9;vbrKUzj<&xXD&rG$uVO&;HTg(i( zlzU=`GP;d%jnc3gW@H`)vuC-E2t4PU3Z z4gdgmb#XclfLs?eZdOu&?2Dg!4np0Uumi4GC8)(Iol5{-sGsdHA(L$_^)11uM8jPmnc8kJ^-1uJ0FLpGnCZiuie_N z%m ziIjF??ba0bks1H9+cw_r^*vvl=sHiZ0Vw0b`!jjV*8h5K~~ncZ6n}-T(f!9 zcC#N3sU^JOENEuV+r(1?y#mVF)Vsj~o+r|2HoBy{_k)^^dRIwSC;oAWLE%UcW62+o zwaIjy!L3YFIBqtOWf_sUAk9SeuBvI$`-KTeOPk)$AzNCSguFrW?{ zjwO*!)KIPMXaC9)=Hp=v^`Fg*bWWS^L4Ym>G)Uug_^~>@PVtiyiz+De?!crUB__RSd7rAo13ykw4i5&`mlIE zV)1J;fGWEcP;9%KzmYphI3%~on~yxwE(hKpZYivv=O9=$PfrcQ?4Q0*7-pp884mq8U`$}i1mm5(Xll*XuooSMVcoYs5uox%6T zHG|=?x}|Burwd8TnbrV=8^GWYQsguNP+wyOfT5B<04}N!wEob`fdM^7lsrIPBP#&% zn(u+%ujl_<6uDyZH0}k+eOn;vXCqRu%vfofqVJi;$gYZ#<|!0CdLuT<>PzJ|Lw`Gk>TaX*RvK6El`0%LG*H!?vBUvSll^#E}fs3@9 z#w61;O=|cZ5I@ZSmQHyKF@I4sAeVE#NWkX0lhSNuzce(THo)o}+sl$$d`^oLyi05= z7=eNMo&t?K0?0w3hYeEgLoQ0pzXsXp5A}DkX`v8+zND(lP2&=Hbs4%*t?5{+90UFG zY^fmzPTLv39z6G+dOtY!BvhPHLysNSB~jc-JLh@z+#eC62?-^-@h10SfXFI((H%0E z=VnWgaVVrsZ@KShhgg&{g7#jAupM7yPP7k@YhOZAgl5{U+?>fm;KyZg4=O727<-^} zg~DL=>sO-68Sw*xjxu;8kWBEj?qGa^L|MX#KWWihHQaIRrja%b?mYTZEDG&Z8stD} zX@cYOVB|hcZ5@iT!6vTwvQ~v}MEq`}sW*$7%gT_;tDqnU)IdmSxQ3OG_((Ga zobF{i&D(aq2DUHDbmhJI_ZfOG0Kn7i-{aa|TgUFx_uUTw0Kk*6(QN~hfB{$*@CP2F V3-T4oGLrxR002ovPDHLkV1fwFG)@2j delta 114 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 V3-T4oGLrxR002ovPDHLkV1fwFG)@2j delta 114 zcmV-&0FD3L2-FCWG)4!<+jm+;I)R?4l z^kB@f!~Z$0)P)!nc%Pr+KVfp(qq;jr-Ht1J0(UC9B>fjsQtr61s>!L?;QTTtCT)Y;>l|#N4G!;fieWdnnz&e}-reBn zGMA5-<(i_hv_fRLg#;dVKNSkC-<$EYGe= z^OqkBZ}aC@TC_T^{XL)D-`5|7Uw@c;aIyaJ@~fpEz9c*-op*po+UBNweZ}14g0-c6 zr{&#MA0Jjti;VeYu*zu9eu=wZ<@QKS?s;x-p6&eckhXNeyI=c%r!)V1Qr*8(?7JWP zpOfG7cnlQs@gtf>z_zqyjwb~JDKR)aHpZoJ$grnZm2R{Z+clgE~+ zmIUV%#?C)gkiDRBw%_fO+h1<}Tlb}g&!a!5q~hH1FI7O+sSgQD8VfHx)H<{8#`}V) zKNRct-k#UH{qyK&y8^O%~uH?%T>m7$LI`{T$KFj@bMt$L~O2yb7(@#(I(*5^O zHlP1@an)W^>Gf#~!lShhpMH4kY~g#e?X|DY7T&kn{&%;*vz?C7n?Ksm6E=A|PkPH% zqnQ7JvA1XSt~S1Kb?wxLrz#GMeat_5Y`@;!`4!ziwuiOVci&%sR=x~qq_h2|Dy7;R zU$31i$Xl~;qp9?n12>{17ySwUr~QBG|5No(_kW82xt`kGdaOpr?{T`b>*N1P`}4k} zH-S>BfRD?h}DZX6wlOjZeM%!d#!* zy?%D2#jlrVcU|0HF4kAaxTWBW`l8mw@=Cfgf2U_YeDOU1sAOf7<*&$VhvY8W?+)v$ eligPIg?;nV#qulH%Ktr|8~Sp4(P_8(?c4wo>s|N& delta 929 zcmaFHyN-u7$kWYDZ6m8KQ~e8O1_pieBVG*R4=tD&Hg)FS_Pcg^Ma|M}A77X9xlL5j zu> zlKGAOjVDg5`sGyoI*WTvPWQphTUTpcKbX2&$9;bI0;`?j^B%q0UAbuXedolx6JzAr zK7UxRafLm=af5vcql4ol71v2mtj?T1^YOp`yTa7?tB%V&T)xN)-8P$~vWTm;{QQ}B z=OV9ujW>eA6haq48y7ryWo{_G+-Y+;_ zt=j0F@_qMbQI&rRoBC_yi(K~IHM)K3?e>dbU;CD&UHPG3dT6SA^YQv?&YyNKy`1|n z!hZU@b07BlZkyYC_x8UYORdf8Y9uPIytyzTEvc_Z%_WR&)R@nGHr#uT+33(^ zzuf!Wo7dM!ZkR4Jx%~6_-EZ%`yEO$AT(pV~FiT%X&0-&vrFs?B*%zMnfZQQQHjLQq$xvSUku-V^=HhbDdx04fPt pD^odbYr&KB>!&7OPtEodPvj2&Pb5F@`j$_#> zFxg&IhVl614GNNzA1Daa%lupYgo( z-){##yVb{k*mKce!6yHUK9|4rU!lW5p=UrLekYsUFY|?fs`QRtcB{|*xaZ>eWS|hg zG*HOvI8f-z$1NB8TY*CL%0QvClR%;BPg^efFSp75@?K6GXjs!}pcvEVH5d6$0>$D@ z&P)BBch)$#zLR-#BI^nc;b;Hr_g?w)fBp1dKUaU(e}8XR-O|Yi<(^KyAjehz>eSch za{C`|e%t?@Kj-JS$?Ty(@cg^>`ud-jzlO)#u3q)|&WCs3#pC}z{lRSe=QsE9%E;19 z-10G|XP#ewUDAHPuK487Wv^<)?e;xTzJI***x~5#YKcFG?^->5IQ4#f_TOlm7Y~C@ z+kch&d@kF~`bl@}^L3@S4x5L28vkbh?OMd1J4`% zeZliaKY{SP(Z47>ZS+eF&l~-j!}CTz2=TPhe@Z-W^t%*K8~wG#^F}|9@wCxDY&>uD zD;-Z8{n5wMMn4wvw9)^KJa6=yB~Kgu?a9+dKb`U+tkJ)(JZ9c%3Cy!bKP2<4 z(SOlAYxH|I&rJO#4zrO3s0b67|Nr$;^Z&nI>ZdQ?zr1_v`jwO69_y3v9tD3Z*KghZ z;Ir@l^nY^Zn~xtTJUqz9=iZl>*nQ{+Ke~{v&VBgP1+Ko3G5P(;_t`~q+b>+~ zasM0l1ReEzgC6VF$@k)8{pr#D1AmDBvHsI1s}JyF*N;^vKOFzffAf=N6(Eyv6$Jrz clhGg_lW-La5b@vqH~-Cl^WXgU|AP4s06T&&Pyhe` diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2InteractiveScreenshotTest/div-gallery/paging-paddings/step1.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2InteractiveScreenshotTest/div-gallery/paging-paddings/step1.png index 4f0aff5cbefd4d70d53e2e744a7171e9ce739456..a1133e38965489aaa5935b256c81320829075801 100644 GIT binary patch delta 104 zcmV-u0GI#31vMy}^ delta 96 zcmX@bdVrNR$kWYj$3|9LCX*@#1_pieBVGdH3IZO54zF!JlMbf*rM{r{)i>su?uWbn`yEg_>(qb$VCIR9@*-ArHX delta 218 zcmeyy`-PV^$kWa3%|=#RCdRdsotZ3T9`3GJk8fVz@z1}_aofbK5C5j+e-PW>@voob zLFwd;OsKpIpVJ zDGg#g-~VU&|4;G%PS^i@A3E{B+$#UzpZ_znCN|2;Hk_^hssH~eLIIRx!<+jm+;I)R?4l z^kB@f!~Z$0)P)!nc%Pr+KVfp(qq;jr-Ht1J0(UC9B>fjsQtr61s>!L?;QTTtCT)Y;>l|#N4G!;fieWdnnz&e}-reBn zGMA5-<(i_hv_fRLg#;dVKNSkC-<$EYGe= z^OqkBZ}aC@TC_T^{XL)D-`5|7Uw@c;aIyaJ@~fpEz9c*-op*po+UBNweZ}14g0-c6 zr{&#MA0Jjti;VeYu*zu9eu=wZ<@QKS?s;x-p6&eckhXNeyI=c%r!)V1Qr*8(?7JWP zpOfG7cnlQs@gtf>z_zqyjwb~JDKR)aHpZoJ$grnZm2R{Z+clgE~+ zmIUV%#?C)gkiDRBw%_fO+h1<}Tlb}g&!a!5q~hH1FI7O+sSgQD8VfHx)H<{8#`}V) zKNRct-k#UH{qyK&y8^O%~uH?%T>m7$LI`{T$KFj@bMt$L~O2yb7(@#(I(*5^O zHlP1@an)W^>Gf#~!lShhpMH4kY~g#e?X|DY7T&kn{&%;*vz?C7n?Ksm6E=A|PkPH% zqnQ7JvA1XSt~S1Kb?wxLrz#GMeat_5Y`@;!`4!ziwuiOVci&%sR=x~qq_h2|Dy7;R zU$31i$Xl~;qp9?n12>{17ySwUr~QBG|5No(_kW82xt`kGdaOpr?{T`b>*N1P`}4k} zH-S>BfRD?h}DZX6wlOjZeM%!d#!* zy?%D2#jlrVcU|0HF4kAaxTWBW`l8mw@=Cfgf2U_YeDOU1sAOf7<*&$VhvY8W?+)v$ eligPIg?;nV#qulH%Ktr|8~Sp4(P_8(?c4wo>s|N& delta 929 zcmaFHyN-u7$kWYDZ6m8KQ~e8O1_pieBVG*R4=tD&Hg)FS_Pcg^Ma|M}A77X9xlL5j zu> zlKGAOjVDg5`sGyoI*WTvPWQphTUTpcKbX2&$9;bI0;`?j^B%q0UAbuXedolx6JzAr zK7UxRafLm=af5vcql4ol71v2mtj?T1^YOp`yTa7?tB%V&T)xN)-8P$~vWTm;{QQ}B z=OV9ujW>eA6haq48y7ryWo{_G+-Y+;_ zt=j0F@_qMbQI&rRoBC_yi(K~IHM)K3?e>dbU;CD&UHPG3dT6SA^YQv?&YyNKy`1|n z!hZU@b07BlZkyYC_x8UYORdf8Y9uPIytyzTEvc_Z%_WR&)R@nGHr#uT+33(^ zzuf!Wo7dM!ZkR4Jx%~6_-EZ%`yEO$AT(pV~FiT%X&0-&vrFs?B*%zMnfZQQQHjLQq$xvSUku-V^=HhbDdx04fPt pD^odbYr&KB>!&7OPtEodPvj2&Pb5F@`j$_#> zFxg&IhVl614GNNzA1Daa%lupYgo( z-){##yVb{k*mKce!6yHUK9|4rU!lW5p=UrLekYsUFY|?fs`QRtcB{|*xaZ>eWS|hg zG*HOvI8f-z$1NB8TY*CL%0QvClR%;BPg^efFSp75@?K6GXjs!}pcvEVH5d6$0>$D@ z&P)BBch)$#zLR-#BI^nc;b;Hr_g?w)fBp1dKUaU(e}8XR-O|Yi<(^KyAjehz>eSch za{C`|e%t?@Kj-JS$?Ty(@cg^>`ud-jzlO)#u3q)|&WCs3#pC}z{lRSe=QsE9%E;19 z-10G|XP#ewUDAHPuK487Wv^<)?e;xTzJI***x~5#YKcFG?^->5IQ4#f_TOlm7Y~C@ z+kch&d@kF~`bl@}^L3@S4x5L28vkbh?OMd1J4`% zeZliaKY{SP(Z47>ZS+eF&l~-j!}CTz2=TPhe@Z-W^t%*K8~wG#^F}|9@wCxDY&>uD zD;-Z8{n5wMMn4wvw9)^KJa6=yB~Kgu?a9+dKb`U+tkJ)(JZ9c%3Cy!bKP2<4 z(SOlAYxH|I&rJO#4zrO3s0b67|Nr$;^Z&nI>ZdQ?zr1_v`jwO69_y3v9tD3Z*KghZ z;Ir@l^nY^Zn~xtTJUqz9=iZl>*nQ{+Ke~{v&VBgP1+Ko3G5P(;_t`~q+b>+~ zasM0l1ReEzgC6VF$@k)8{pr#D1AmDBvHsI1s}JyF*N;^vKOFzffAf=N6(Eyv6$Jrz clhGg_lW-La5b@vqH~-Cl^WXgU|AP4s06T&&Pyhe` diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2InteractiveScreenshotTest/div-gallery/paging-paddings/step1.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2InteractiveScreenshotTest/div-gallery/paging-paddings/step1.png index 4f0aff5cbefd4d70d53e2e744a7171e9ce739456..a1133e38965489aaa5935b256c81320829075801 100644 GIT binary patch delta 104 zcmV-u0GI#31vMy}^ delta 96 zcmX@bdVrNR$kWYj$3|9LCX*@#1_pieBVGdH3IZO54zF!JlMbf*rM{r{)i>su?uWbn`yEg_>(qb$VCIR9@*-ArHX delta 218 zcmeyy`-PV^$kWa3%|=#RCdRdsotZ3T9`3GJk8fVz@z1}_aofbK5C5j+e-PW>@voob zLFwd;OsKpIpVJ zDGg#g-~VU&|4;G%PS^i@A3E{B+$#UzpZ_znCN|2;Hk_^hssH~eLIIRx