From 41fda8280d0b231a30b326274778736c6153dc41 Mon Sep 17 00:00:00 2001 From: lodar Date: Tue, 18 Aug 2026 21:25:26 +0000 Subject: [PATCH 1/2] DIVE-3597: kill the remaining bee/Buzz visuals (refresh indicator, theme label, iOS icons, dead asset) - pull-to-refresh now renders the 5dive mark: BeeRefreshIndicator -> BrandRefreshIndicator across all 5 call sites, with flapping_bee.dart and tappable_flapping_bee.dart (now unreferenced) deleted, so no bee geometry ships in the APK at all. - theme picker reads '5dive' / '5dive Dark' everywhere, via one override map consumed by both ThemeColors.displayName and pairedThemeLabel. The persisted 'buzz' key is unchanged deliberately: it is a wire value published to the community relay and read back by Buzz Desktop, whose catalog rejects a theme name it does not know. - iOS AppIcon regenerated from app/public/icon-512.png (15 files, all opaque RGB, glyph 9% of pixels). - mobile/assets/images/buzz-icon.png removed from the tree and pubspec. Co-Authored-By: Claude Opus 5 --- mobile/assets/images/buzz-icon.png | Bin 13842 -> 0 bytes .../Icon-App-1024x1024@1x.png | Bin 33575 -> 40588 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 601 -> 519 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1250 -> 1011 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1926 -> 1589 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 918 -> 758 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1899 -> 1521 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 2791 -> 2310 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1250 -> 1011 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 2671 -> 2074 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 3799 -> 3089 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 3799 -> 3089 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 5512 -> 4624 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 2454 -> 2012 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 4753 -> 3887 bytes .../Icon-App-83.5x83.5@2x.png | Bin 5103 -> 4185 bytes .../lib/features/activity/activity_page.dart | 4 +- .../activity/activity_page/lists.dart | 2 +- .../lib/features/channels/channels_page.dart | 2 +- .../features/channels/channels_page/body.dart | 2 +- .../lib/features/forum/forum_posts_view.dart | 4 +- mobile/lib/features/pulse/pulse_page.dart | 4 +- mobile/lib/shared/theme/theme_catalog.dart | 30 +- mobile/lib/shared/theme/theme_pairs.dart | 3 + mobile/lib/shared/theme/theme_provider.dart | 2 +- .../shared/widgets/bee_refresh_indicator.dart | 440 ------------------ .../widgets/brand_refresh_indicator.dart | 269 +++++++++++ mobile/lib/shared/widgets/fivedive_mark.dart | 4 +- mobile/lib/shared/widgets/flapping_bee.dart | 155 ------ .../shared/widgets/tappable_flapping_bee.dart | 63 --- mobile/pubspec.yaml | 1 - mobile/test/shared/theme/buzz_theme_test.dart | 11 +- .../widgets/bee_refresh_indicator_test.dart | 379 --------------- .../widgets/brand_refresh_indicator_test.dart | 280 +++++++++++ 34 files changed, 596 insertions(+), 1059 deletions(-) delete mode 100644 mobile/assets/images/buzz-icon.png delete mode 100644 mobile/lib/shared/widgets/bee_refresh_indicator.dart create mode 100644 mobile/lib/shared/widgets/brand_refresh_indicator.dart delete mode 100644 mobile/lib/shared/widgets/flapping_bee.dart delete mode 100644 mobile/lib/shared/widgets/tappable_flapping_bee.dart delete mode 100644 mobile/test/shared/widgets/bee_refresh_indicator_test.dart create mode 100644 mobile/test/shared/widgets/brand_refresh_indicator_test.dart diff --git a/mobile/assets/images/buzz-icon.png b/mobile/assets/images/buzz-icon.png deleted file mode 100644 index d5ca6fe7fb4db735dfe649f361dfeb9f55b9ee66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13842 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 SI8^b5NvbC`PoyfF-T6OQbLmh3 literal 33575 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%0DqadS=+(xPvmqW{;S1BR_tA*Y>z53U}> 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 delta 577 zcmV-H0>1r+1la_TBYy%QNkl<$tp>#s~l?<%L2rn}5|P8Zf^23Go3#=OHOJ+WI&;nlub@ za^lXv((n`P7t2sYrZzdAq*;q1o)oX0?rtN+zRCPj^mE zrc@Qq&iv)&cYm%M2?&IUCX2RiOMiDhF>c$bt}exKLIAY4S35p- zWBuKu4k1)5J}s4AT9%f}B?bp|%hC=HU#zY5J>>a&kVM58@9)=kb}|D4LSa(pl}fm@ z^!DoNGdjk?Ki2urA0x(NnqP^)7#a;R_Ipr&Dff0it^MU6ruco$e`;RA>P)$JWp)}BAy$BV0iW=}%X;CN^JO#H2NevddSQHwm4b-kQ)=Q;-gl0>v zyX66sZck;o8V^>%-fv+ z0P9#0@xKBGL9m`XuIsQpFaUIRCjTvHrBtjHN6piRRe%hs=xmgL|nVg;o>`vqYu`N z7!eJF_xEQ2fPXQzyj;rXr#a_@Ao(ZaYPBY%TwnHWgM|=|iYc6s5FSEE1w3k%;dHQVQF)qtU1kLQ1I_ zi53_DeBV!})23+%ApjteNSr+R+0LEY8;$0T8%wjZbAL-qzsBQnO)4P-bZ#J=^M?=r zJbwIx6DK|tLNLZwZKUgZ6B8ewKK(^Uhoh9z0c)um5hdtRTJ$zQne&BDSDV`J}>%jHPK;+*@w-`(BK7z=^`5%1o;(`+^}o8icjBZsG^zAlv>aL$#IGI<@qHf=W3iZF z82Z$(>@9ne+e)hqC0|+y;)}BN-i~s-t M07*qoM6N<$f+sEJAOHXW delta 1231 zcmV;=1Tg#a2jU5kBYy;`Nkl1o;+z2WdaAyn}T?h&i5d^oQpn(wl@O&>Zz6qK9CiCmAt}8V) znM`JSUgCS!Q=-CeipRMoxr+>1~J6;$y5gHlXL*-?z8!GF%P;+(I%63?D3jgBrT<1N9qw4f9_4xBnwd;4~CDkU5zx0MarEDa&(=utBi zVz+MnO$ZhO{^f}&#rf4W4ZnQ3x2Z{6TN9MZANH@_#A&&2fP9+>cURRmCg|{C?v1lT1dKCZ$xKI~b&#!}tuD+xpL*Nsj1ZI)3ui_HBgEtCRPRq ze*^;L=FMMH~)m%082UREp<`o13)< z4_eQi`+wv0>y<)oT%-Ww<86_Mv9!cJp5nLzKwd8%8;ea&CQqEGi9`&}VSe5o8JRZ> za^XUQ*NYveIO92&k+Hn&^z}{0Vsb+&)^K6Y962JdYiWtAOD+X~3?D+UWrK0cic{{mjsw-z^#1+D;o+aI28Ry^A3ki2$6bj5W3;v=H7}o6n{xZzyM&S(SE#^t zAAdvgGRqAKA+_(rheVb*x3BfT?7z=Po^>+Ut#vOrBK z6laxzrpYc}{`2wUn0p@Q9njNb+_phghUT6;Su9en;z&^3x=#B0t0NJ;riR60{M)zm`SbOSjh?4Z7Y7IDiiDRC zGrPR{NfhT^wi{r(oVgYE1gSAZdH(`St1lJRhg9dUXYQ(SL-WH-H=Ep>w4?bgq<# z&Xw}exl$fFSIR@@N_0iu1po*k&$w7h$vM~AZUvwLfOBr!wv@}RL{cI`a3~bg*-;l7 z0364OL?W%NpI{72FP2gQ!1VOY>C+uT2=|+64grLa>FJq(2gNb8qzxnV=iB8fl`>0075f z#l^*ym4B58p-iPP%}__j58JlA8HreiLFeY?Mn>+QKYyXK^US?__lk>)H5(74QxP%7 z^Yh8t+E@DedY_i#vNbt5+1B<&XXlx4xQKK2H5}>K0{|Q+T~$?uG0qO25aQ9JM~>q# z#u#Hl2q6Sx%(ARgr@n1%{Wu<<*7S)MH0PqG=6~hvv!x2P*XuP5gHlQWX(@$a7`3&psw2obmr_znlgZ?{b3He1{DlzOwCT0R#s;+jV=RP_ zQXW74<-ovii9~`@n(Ky%a}f*{nr4v@!Y~Z=KOw}99osuPzBf%1 zA%BT6W{j1VTKo6Ed*Z}bkw}Cw=3;Bz)-)IlT2`dIynNldO26OV-u_)G^)M6)s#h__ z_wSFjw0zj!{*7`D=Nw~v_3E{{y0`p(pAc>$tqaXLcO1uY80Q=SnWm|1u<-5xQc6O| zl`FrNmzN760T2Kr5{a!_-JjTStWK+{F%ZhN$ zGspDOr2*TvGub^y(46x?z~9$*aesb(9smHqDO$Abz`*66p59dI;g&70 z@7eQ?8WvS6YZ$bv>!+5MkHTU1J*s9!|?C<}D5JCvS7!yM1qSQk|NKa31ef`_R!^430xwrR%VNjpX_dLg~Y^emC zNF;=iB_-j~(o)k5Aq0s;A{vdxVleQ#26cfq4KeQfHPW| zUjmdA79oUEg3v;Z)W7%tzg7}jX>nrIy^&c$FXRtJdFWgz51lLJp&oOkJan$~LPGxs XIqc&s@$~ z&YX0tZFVxPuCkDiKxQWA{O6nh|Ih!Q{|^8K6i`3`1r$)g|9=$lJBWY)GT0hS2&EMK zWMB+`z?3ogruhf~LVzT}*|X*1Vr;EK2thJQ-o8ymBKl7wjSwV+u31yk)HJ24N)m+p zQwRYA1M0<#pITb_Aq14N&yOR`8E@HAcJgE}9@o=p3V@yUp&)>=GDk~G|G|U3+)zJ= zG+(T$N^EbhL4OEn8ny4HlmcC+rKQ4#4S)XeM+{@A>l4;Cn$Tz-A`oI<_4U4z60E9O z#+;3==Lin`Iaex|Kq*+gx@3%4`^fK!5N27L(F#Hq0fIr1knDPd08xZ)HwFMC5=2ob zGPJ?R`+Ne%Kv8HSK@einG>uN3Dq;*Fq~P7Umm8E*4O){P8E|$#t&omdbe(U?&(n$ERYv3_9PNnFCHz{;ee`23CZ5(^%*PD zd@{yx#R_j-opIEPXod*>hBTR^rVDaIhr^m6K+3>eC>&OGof;QxB0|g)FouZ)iAHsw z59>M@E!H5%!8X9rqgC_g%gxQ*+)2js&JjHjVvN_V^B+B0nMja$T*nx4ZSfDk9lhln z8h?D6#(Z5>six6}1|P=E6pI(Ti;7r;A%+KsLY`ny%48^?Yl=1YI=dAFwnzK>)r}iV zj~%NrHhK~Ce&s*ZG;jB%2$)CgfVU9DW{jm5}> zj$@IC#_h{JH7gxu!?x22<8gLjGmjtyQYkWXrgPb{B1*G~A~$LN+uXTwS(%`!#D9LG z;%eY-ZKlAH1j+nFQL-0yC5}*Ey3}JUdQ?}7_PxUNX;EbH%Nm3*Kd~=a*VzfjSc3j5 zX|7sHV&T^2p^;LSz&kq9U0vzCvpgQWWQk`Y2BeadWAs;~`I6Bn%UJfyC#MsiJlS{e z-msnV4<6J8gQ6Mrtbq`W#h7J`z<)=rNOyLo4WV`wLI^u!h$6H&GeE-#7_%^JQ>-x_ zbatl39|OmbW)fe&PJQ^0sjL)jZg#%Y6~#^+K<)bmLNJx04eZn` zhbsE}Rfi+bA_zf6Av<>b5(>F_Ig@i3ge=MXe8Q9|4pq%hUDv74haWwPy?=U@9ADs! zoz2C`GP-f&_gS-?(Wss`k{CxeBuOyuP9OxtVr;`$gAistQG}~kcNwI|>LSM?{LN}> zU9GJ%yk5+Ck7qNQqNcHsY)G?a1V!UN7FWr~As4!JO91trFSyqS2U_C3NhE*4KMt__}E?0g{Q_3{WXYnHqKarcWFlKaPG5x@S-nO=tSK?7qc3$)B%&pgM3#}Rv&{1HW%9|BxOJSSMh;rL*6(&BO4;6p5C#H* zImI}v>W>~pPo3)P>`Yt5A`8Wsy7c>nP{>_d>nbS`RF(Giu@YnB#(&c7+sngYEf5fz znz~zC2Z0T=w$50zh-K!dPh3@gnizLnd#Y<4MsvP6K0$6Y|9r5W?PG<=VBO@tWe%WAcS9Zwzqiru78@sw&Y( znp^z2y*Ldp&bmIYxPSO9e_~u@I}O&b(aaj5KKcnE;LV$q(Jy6(&u!bvLm_uwA(8}Z zYMjZW?)M9wooQ~#Ni=IF(_!M9-Q&TxZ_f$_#o=LHmXXVaY{Y3Ajp_~uL$v9fd*23K>d4b8~lF+mJ;D&2b|KOctE?^y$uBy8;Ur zx@Fl))71D$QD{d;>g?I@^XKtNcOSn`e;NSRVd5&ZS_y(ohVt_9TNr-_@CY!W@n~XA y&;RB>mkG5!=}-T|rGNqoD4>7>3Mc?f4F3R04)dbY_@0Ak6rD_udvS zM9}$g!bQ+o-h1xv{_mf2?m?xc9yo`<=K=lCJqnsL10i(kx_=Pjuegjc#@NZrD9v^@ z2UiFoNs`;`1`q(2Z~=f!^DvRnGd(2-mr@#w#d~`ncXr-CJTwr(2m$9DW4yY$*4ld4 zZntN0BO8}Ca7RfodKA+ESw{y-VN$Tl&Qe1p- zW##+A!WWD&La0ElX|n3-tEOq1CL0*&KiZm``xFQ~NTt%0(oE=#{U(GU1UEL`q?9@w z_N}c*DD-h>X9ocM{^pU97wL4mkUHa>JDtv8@Iy2jjeo`B!^6*`(P(*jSups%s;aW3 z<#t0u{qpiRS(Z8HXVYu5*~Z6TcXV|2_4TJxDNWNhH-F8{yu%m^A?oU`9~>AMpDsB^ zomu@xDJ6uMrs;4QUF&IShupYHDNB82w$_bV#ARzf%& z#+aPB-+w5jx~?}h-BMMhwzg(z>1!wy^81_H+U^J;;_>+6;*u;oPc;_+P^S4t2uUOo z?d|tQM_*bi8ylNmug7Y$K;Yrz zR#(@fsi|p2Q8GcZ>HTvp#=4%=v`aNL*AzufCRmeeYd`k(_7p|Q!Inj-6?x4IN@-D%8vp?a&P7gWUR(eWLNJ!?w>=sE+MGWx?r+N%G=6$d Rc)$Pv002ovPDHLkV1m~3b>kJ$}r zlTTZJ;6di{A;@VjBphU&&Dl5r6tj_5 zyK$w+%1XUj4WgXy<)u{jj!1@w&0=wEY|IJ*q!bv_j8Y=!@cw-;H&=T7y2Y4|DD^** zK8+B{X}3{IJbik{zJ22J=QgF_dFtcGw(Cktp;nW*oO$kCMkx$}4k@MI;DxX$M6!3U zn4aE#;6N;$=6_0&N+noWs62btux%c#pFC**kYth-3SxRXIX)f>Z?cCPHj)kvnOCn4 zPfZO70nH}5uFPhQGiOQZ z+Mb7p4=0Mnv5^rAv7=h=F$PlN`SUyH=Z7j4-?Dl}72Q%Mqi4c7RI5Qc%_${Pu3OFb zRW@rBi=QrC`Zr?Zk;w@mQ&WjXLm5U7DIzfpC=^5x=o~~+C7ppH{HW>q@bb(SNli`;y4>8tb-bexGnpbz(okOYA zI&^4Tt){KoP30W!-*=uqbvK?DkJF16|KS{z>Wo4uG)?;Ut?#-jvVaa#s(xcO2Qt4*!+~`MkcOXn=@X*?-_5pPMV)ySEmp>`0@bKTe*s7Z!FU zlT1n-X*87YV?0j#JWmL5UBwtA5;U@{=i#+$m8GQ*U7xKFpN65`yRF$-JD<18W&hy8 z*ohOV3m4uzdQ^*giu9&Z{N~L)tE)pHH&YdqWUaXt9AGBB3l`A>NnVgx~ zE_nov$C(f`7NbJYY}Qy^omg7RZ&Iu8t&6BBN+Gi6%1XV}Qj3du-`7ebgwBU_nlCTc z7=y?s;rAo&eOJL765Yl_LmzsK5g<&{`||mIkqTe3{a#03;=DWEx7;U&%=N8 Wt)l6ub(etv0000oFt~^rK_f3+qHpNS?kNZ zk~v|By%dJ9t4SF{!TPd!xD{#Yuol4LLh_*!LAo70j>}tnM^2(A_OQBW%+6@ zXJ#@Pgj^<}CtL_2rPMHt?(UzftD{1QB3VHxBLrW&)^*^(p=dNhDRZ%+S6th+Q>pc} zweP(4V$KCZ(0}Liy|vth5ZboW*w`S1V2oj0EGZdd5Ms``mleI@3c=Iqw9J9x{Q+YP zA#|O!Ql4-*=Zd1F(@mg&l`%#seHmTmuH!gfR&G=DVo`0=dY?-xS6TvZ4mLfkLv z6}P^A10h5f5QK1cc6NC=YZwM&ObCGxlJ&$(tPVIh;rWQ5={TfDFWFVPi3V2so0G$^REY&Lh|#EJIyJvB8+MNu-D#e4TA zuV3%(>3_LFDb;nIF_&2@1-Tha#mvdgcLk$kzIdbHyyLaz~LLo22E|UR5 z=r~S19$UYD9Vm#d5W=!7+qNCYp_FpY8DosGZQHi?^!&7a`v*%)OU0*2S#S}O<2R*g z8s}W%$^*aO@ALT-MInSBgk-f*N<*R0l`G$;QhzDa%&)Y?fe<;4)6%k0Qp!g{NG_M_ z?!GZTJ^>+UYin(9ZGzTUU*(?CF7QCuMeLO2`_KYO+m3|l(wx9_=l@mo#P006Sz?cV)yYisM+*to81F8qV1Qo|Sv|*-uC9(E zgbIIOnX+?p^A8?8kf*XDlgWgts_vYmr+*`)6NYKOsc+2ZT^< zZEaWA)z;Sc^Z9%(XGWvZ3m3lGwSVg)*}o{I2%+BI{?XCVsw&+buFJlQ5X|STy1LZu z+rO%+3IIR|$y;+F#Q69`KA&%HZZ?ddG;7jM?%me~~m5VL_fODZ~f$8b{ z$BrFG2uZ7s5R_OgEgQFP-C`I)#u$W1#uY+%@L=ck^t5zE?$&ibCMac*NPpzgr7NAC zM;*tJJ6}QwN~vwz(nA6OAOzC-baZ^t)%D|=H4!g<*V7ON0AP$47BXA5v>iR#xpU`- ze!u@e7g(0n*LU;Wx$|RV+ delta 1885 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 M07*qoM6N<$f+sEJAOHXW delta 1231 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 delta 2663 zcmV-t3Yhhp5bqR_BYz4uNklgX8Tx9n3iLfB3kHjKx~u3c4L zFCv6FGnU&$SOk(l0JpaK(`kzF)X~km2&Xqd2xKy>p?^VLyVhGmr;Qd6W^efc04gh` zP)IV(TeKnk7RLPljAm&yVEG1x%o$^f0v9h;QWzaQy3H}Y^;n$Fhig~1@sWH{AuSQ4EVLY5)MkkY(R?jS@A6N9k@sraVC za|kW@e1E8>MlLJkdPyY6jT=THLC43ed)28xGn?h^W_$n(URpo=qW`9{MX8!U^x~E4Ygh>*#RKfgyeD-W= z$Bv7JksHgABihJ_@%rnF<8cBZ^myRq%bB*efoL>0Qv(C~rAwK2-(99@JbXjQJ8y3G zwY2yjd@xv3BYV9FA!wQ`ksyPEneV=vICX0L%9Tt$;hCQcD1xn+yeFP0f8~`$t5DH?-+!M_6lfU2Z*x_A_0^rrm#e81t*n$@ zef8?elVgg441))4L8hZ)#fA;RM1mm1=g#9nstPk1n$6ynh%rOi zOp;=v7b=FWEW@Km>)YEKmoHaiF*6=FvwvA`LPGOG$>Zbvd12-dk8>qJ2n>TaCM36! z=Mg8%ICd-_v7=WhHSj^Nk&NeU6G+8P|M@LObg1dKD zpE|YjuDiU1u;~H924T^=qQLg{#+^H>#>Ti*jJXS$;+({k=Y?5O3V6LJ6vFv!lYiI= zF~*&_@WzS)D=N4b$U7eKVO5n(NWl#yUpIWRcmm!kEyZ579kH3-K5oPrQ; z+ls4Z^a6AwuwX29|>0(iAbwgdv%>n^~m-yZw}}z zNt_Xcu(C4T+8Pi+0Th#IiP&3TuY|)q#a#$rE413)$0D@QNnW{9o$Zx0{gEY&g~L2+ zwW<~lg);^M0c6*`0|1gqp2j)mEGlZVy_IHrVFmhJy5j&MuQ+pNqJO_%xB4lvBPdB= z!&@`QwuY{n%LB4;QaoA`!{R|HqgM%4W z<$EA!D9oa5VS$lJ*MI5HKd17Vn*uaP7X8gP6CRKA5-EgyT?mbd%E7$9Y?kl!9j{(W z`ChWGPw(l`L~t#34GSOh>8H^bU#ya4+g2@vc|2(E-kR?2bn#9LLWnVV_~DS1UD_s1 zDf9W@$&+J-!R)1$U~)O_-@oYK!8!+<2Z2BUJFrhp<9mI(N`EGV*I4@d^(UX~({--g z87CRexf$kFh0e~V_3QnynCXDCv+B8n#6u*K9uL~Owg2qdlsFZbvE^JHi~M`Z5~Z`V zsi8rM#fSsW4t$;i-AWQKeeTQZ|a~FEx+I| z*M9pgT}%-V7Bi0g-g3)4V1GkH+24QH?!P}US*GQQ^c!zn z>*^XWvVbZCF$P|Kxq8>Gs(74Nc~ljC`|U(|xpdDxKA#VX$`)f>qNojj@=3I-Ydr5| zOH-GoxpE=w>Cs+$ZOHFOt5$iJEmOl`UZWcyCs(g#dU~`#0G~Otnz7uvr4*bymvoR? z{`#vXN`DTNGOrhZ{(0>5>G4&oyp4@Yb+xQ0Fqx!({gv(O(}#z1or{85DNi04r@@N> z5OTXce?E2oJkMqdQCllddE)c&ur!CyoC2XGpYLXRXKlH-8|dxTdV94g?ZtQqv2h_p z0(M~a%Oj*vxNt3EQOzh-*Lle%uk#{Bh$vd{gnxf5@}I(kfys+6_QHS!>|>I^O-W)9 z6B9(!sNau7RT*Q@(4cmAYnI-M>KS7|DQsxqrB(q#m^g?Lsh@UNtjM!Vl5Q4fo#bVAaR@dpHk6yTO!z|V9773IH2=TSl(J}VG17((j73nl= zYJZxw+AqFWa^)GCXXEb#A{KPK*#AjWjyz*WZBGtWd!lZo3c#k02jA5UOB9(3+pYWMET(WqH`82>Na z(}I&LZS&^xty?2^+~M(h?QNF~gZ=quwqUDk{KF5&G8u6MRnifHQX?O$#9@ukXNxe* zW@)}6Rq|_iw-E~|tc$vQsqQKLL$_&jy*s^$=fZ^x7cN}5aN)v*3l}b2xNrfS<3Gli VjxM#gA5#DT002ovPDHLkV1jYYFUbG^ diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index ee56285220274d990f172b62a79a89b0896e4a70..2925cfb1da55bf80adebc8898180d5e057a17eb8 100644 GIT binary patch literal 3089 zcmb`J`#%% z0yx=k19x#U2M6D<1;W@NDt|dYHrQc6s+$@ZS>Jk|;jYclLdb$@K*F$$8yB7L+Cfy_ zm>`y}jjX9x9(O7bkS{$o>~x>3^x~HI$Fuz~iZeJI=3{nRo|%(4cnp?h^hD??R%H94yr@o?#_&dd(da0AJ z3;T82oZt&3I7F!(_WQhq4CyPh5+SFKZX{>b@%h8eRbI3l?lOsMq}zC0sW}2*4A76+ zoS*Kp(wELu-ytA7;7WpMD7=i*bIb zb?bP>HS{qsW;Le0b{L9P2l)!S^Q_SQ`E@iHav3DCSLNaYspMXT(pu~)v{#j#V!lp@ zx00~LST4(_5Q*wr{CF%O zDJ2&ok?s+VRPOcu4k&)EXoIH*z&k#Rm);pN2B@DZZHv>;nMf#_dePFdi&Yl<0JKnE zMlIwSUj_2N<^7dddpKbCxW~HSZg8tR#ui?NbSV!A39?9onBwe7f01Y9Fj$?pcCvj% zc$}D!c}KkoyDU&Gtq_W}{(zCidsK0Z#P z1+Pw;$vkYDq1zn!h~4q>I#%cMfHyEMN~BC>raN1Gz9on@`v9Rhv^_Kt2Dw5EtC@` zv&4A`{mDS8ArU?G#r4OCP|SnJ*6hmTURpm!JUI<-rU!z!zF}&_K=snc;vzFLAH`q3 z7gb9Lhoex{q-O*VnrJWWY9A&M$hkG#A6iva)zNY2dqvs|kievbz;>3Vr%Ngd4;^i6 zsIyI50zQ|xsy|>8E{pv$I2mENwlQO8-`15m7X5aJhwSH_dEqi7LLL%oF{;fNN z{O5;J80Fw05vTFOQk|r90jmy3{e0qvrA_`Db|(m4on*{pu+Hy|KN><3KHr$zW^!GA z6sVfZdg<~=ji3@>aDlCplXmoanZMjAT#R=*Okbi&c*;m3dg8n&8lZcUo#4JN7!~oC@;- zxxur^brnb#crdnhWSRTM_48-a5dFV4_+6faHM^}v?SD6muSGAT>MIe+Lxwv==!O1R zK0dyIoNZ{5sc7XEhGjWfaGmapRVSrrh9KeV2YZpJ@Xy9%1-LmpIBbK_9QKQ~xoK-D zvdz1>eG0TVncwLPSWD`j>5LhtM24}=+tTyMXf?7<{uM40LrH5 zH~IWA!UQwNUgxZSsPP&X|3@#Qo8r{+A~V9$PdHb>Nb}O&poI_pcisi&9&ucFyz03k zamW^fLTYMVQi_cQ-abny$i_1`0yoH!NS)YPOTk!~v2m2F=3M(LbD>H`C2iOEyq&h*o%dy!pY zR%zweaue&Ep}y)1;VsS0x#~H)oUgfQwEfqbep}_&<5iWE9_>A_?eeBeNJy~RnkBCJ zYjmlvb@3gl)PTHP@hx<7ZmvG4(W-rkrYUZ3Ni9TWBIFDTnbY5DsJVbn2p+fbYr@mz zs-mdpyV=><`a69Hml6R`8E(CvYG9@C{1&Gme^D|}I{GWFG3m`!J>4>b3;PPkHF0B6H7 ztc>B|TKCQKXDmq0+Jo3y2Ng$0N7iJLpzr%^OXZWFD=RBoBbjS^2RU}BCYFDTjkQEb zLS1?Exf=*qRzE!u)ZeVH_akz>XEuhDW?Gz0F>U zrI=?JX&OA3I6;hLcBG^n&CXYyNlXSV4IO#S_KNiQnrY;6Q8~b3osj9ZsPktSZGV_U zZW~hbQv&C>=GlvY`r)9Nzqlo4@yevt?NYXR(5Ulq zg3bPsfdQn8Q@{d7#V|N!G{C({L~teEqs#|3bJdP)SWKi3aIzUL9PZ7gAp}euA80u@14}XlEsS zk8kMb#6PYLZAh2=ez(kpNjJ|?L(>%N=!{S)9emf*oE1iWV^NXO3}-}v$puQZm)F!D z6BRp^Y^Y%xR$Yz98KrY3201^=@>%nlv(UEDXKijR>k&3js=Wlqq!bjmSGRAivxNld zGPo+5F$dh2#`W_{dOVy?8z`m$wns8b?%64@{WlTY**~)4ZT6?FjdTPoOJ$$Z02D-Sk zBO?5>+I?^TOLAn~{+gF_H3panyPM$w-tlfaIr%|K5AAeQZItkq`=#`7f<|3ZW`{Gj zHX}nIha9oD+&C70WaCHe*qVlv-i~a$-S$~`q7ijOO4nkxZyUh>E3p08WaR_AQWmOdwws~UDcUHXO^PZ^v_iDs@0fB*56?AEv*AvX7ySNpy3_|+^ ze`41G96+wSMkie2YjBi3uc=q-rkZoGtth{&=NERdQ{dfzzmc7cTSMRJq$mIUtH7^_~hHS)~6~3Iqw)z|vCf0~5xM$-30A@V=e*gdg literal 3799 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 literal 3799 zcmV;|4k+=7P)h=Le{5!4XTASNpOA^7;? z!-yet_qO=WFE`p=w!1TD z&di*1=A7j?27|$1Fc=I5gTY`h7z_r3!C){L3P=g)_K z{WU^|6Jvv?%UvUAUX}9b(bktLl^eWR6ki~?{ESVNGQhPXWo;x1ToGw#%9)v=ux;kszI9q1c zt7J0zG@$PIZnrRQoGli^W^I2xgAmTnhEt|wsf_{uW)qwuoEmXKxEBRlBEj+>4+d-I^ zlB%tm=n4RdF9GNy#6vAymy72(&hICeI-Mlct$f~K)Igs2=-TZi#KzU-<0)Gf@;hIMtmefvDuu0=8C z%FC^b7Uj*Gmm7&7gi>XV5K&J_!aH^}*VXwN8zq|!R98EeE-kqK{w$wQ>2}AXB9`Uu zrISk@e!mc`3J2 z6zp~jAAQugb?Y5LAbLdSEg&T9-?!c>^?Ex6hcRcffoGoi7Q)x#aBw7q1CrS9u9qHuBU~R3ZzCJ*;JDtU3 z;DV;kl^}rS%L`YmD7fbyYdnr45u|lkv!8HB>v$g6?U3g|FsLNo3S&+XKzqA9bLJKL zPs!>-6-pGr;lmS3OD*v@*(VhRyIjJdL+z_q|0xKm>i})r0}o{F+c!28`iEOY=Yh=z z!(kMUV}ugBZigsHW2u!biqPSJvW)BN1KYPZ{`6BQo%r7Xtq$6gsw&6+{bM(8E-fe! z+uGz%h=_;h0sW{E{e+J2>W3<|&qwBCG6-S29iBTE_WM(%+_83pSPY*z6SCW(wqo); zcl@}&+n&>FE?tT=G{me{GCxw54zE|1B;qj%0&S|+TJozPkZ)uex3`l{O`q=EySL)a zH;0QN7_g@U2Q1}<3*EJ~71h;_)>hJJwQ)M02fN=4A>`WH$lBeL9|1t(0u6-7H{I$N z{W2OwJ|D3?Qm)bLjozV`LCE?2N;HaJez|1No{FL(QL`ia1ss@^mn|#!^wUus#{~k! zqDtTRM~EvZ5R#3;6fjO)paCJ5pD%Q4_R(+bcIa{m>3c?WRGOQmnwsprdn-yyEd!7> z9DtM;Ey{cU{W8B_Q50j2;~)f)2%0j*k&{C<&6GZ9>(=5+09SQDNP+YmD1XhP+?5?T4TtBwNtr$&RgC%K`zim>LzA z0f39g(eUAxHEW7hW$9ev>EezMw{m4+dAThbB}XK5$O8do)~uYGnrvCdqS(343PQpH zdF7R1)Oj+dm8z`0UZt|q{^5rswc*r>UQub2aqHHR)Y>;TR>1SX=Tla%E?U04P?m|E ztDcOIp_OI))Khuu)|L4Esm`9FaG!iKYUud`Jd&c!o!g_-kvaXNb$oZBIVw zo-?O6&rp`}-o2i>y7oJFB%2LRp6pn%q+s%7htDUQk;p&|4@tt0KYsPrt+-BKMprwi z2~}Jy*40h0+kv8(82Ume5#I;~$thQMwys!*)5*u7aV?^wasp#Ux&1YJd@{<`lKHAtY9fs+c_vE%i>lUO5~_JfHltiLK;$ zGWPT5yN3-Eby_vL1g$7!)uWLev$Kl04wt86k|uuEWAIW7g#K(Q0Fb4luuzygH&J1B>$Z@Ez4#bgj4z<3joCPoG`&g z-KaiSkG=&>=VN81!_+AWZ{6;<1rNxBn^$<{?rAkz)} zQ^U?;0fqz(ddH}sr) zg8n=~&NMJ4QjSLPwr#g=-H;G2~DV)AFnr?$<&IFs9B&U-%JQAG@4IUYFf0K<- zY_ow=r-HIfqSAfNLS3FAgrKcWK5-(DmDPC&Z7e{|S*Brodf=b_$J8lE59SXZBsEBS zR#ZX1YV6+Kx?q9Z3^joegv02ehn$lpIa*qz^fM4?B(Jj4K6Y&9>6d{h3U)gAQ>TLG z&V^KCq3`DEZ30cL+qrYh?Aflac~I9|*3G8UZ3A2aNRis}^_-cDKz^Yz!>HEaITUw71xR?wk);f11i z-yPA^WXiE2XK328IldJ+rEG7P=gz&>+)SKUojXB4^oJh$e)d`OzI~peA~7Ym(|;1IZ-(c=+O-W$O%ebk4?-vXo2Uqp6PESs8;&0J6%`34$$Ds_>KQpKe)ZKG_4Q&J@_DrRu>nG+1XGK$OW>DLm|}EBwfB7 zsjm#42vP{q&96|`a@uUGbXI`iArJoZE>R5}=QMn~I0S7(IC zVjT{rhQk3!B-Hk@3mF&&>LsW|cSuo$w3w`|O>S#Tt@fZZ03icJOfm8>R4X#<>Mvk* zhv}uJHN()xP$71^85;hQ34<$VDZRhq1>@e*VU0>1(X#it(zO^V1Lex52)cKCJ~s_ofl^SdSncCGbH6Z)!xq&PCa zbElWq!escJN`sKJ2-RTu=FKBkttx74l&BA8Hi|-ub6Z;EIdiVkQu+)p9fOcojxmXc zeDJ~T)2D-lg(TK$cAsgT7KC8^`Ua0j2Eg<@!XYAP4r7v+v~uP3)2D+p?m=TCMxB3a zr{L6BcDZ(agB=a_ho{?wT5BX{p6-2ZpptmWglu%P-+?zG?sd zdw=qqeFud>&fo_fFR-D%I-R`30S&S6Bnh{-D@kulF*l#)?f|L*YcpImt&(og84``q z$o!k|7z_r3!C){L3)6yETu?mHKJ5)HEORSw%A0pYL(!v_O4wsM$FhFs6Au6 zQPLQ-s#fi9K9BD|@%iCC_Ye0u=W(5LU)SsPJm<5HmMR?$2Mrk+8Qp6&s2=H!`R@a` zMQUr&3Gd0snDDQmFW>rS?PiB~zn#hM+;7_-85_1k68r6LkwesOc~e2~`l6wZeU{h? z$4c({MM8XwK||0lJ-oiQw&?`{Gvn&>E^k16q=s{sv#244_brnrd9qFjB^4hx(J1Xw zi$8sEIOufwijXlc1@~O$^MrG)jB#c0waR!Up0x(;Uo7vRDu7}%Uy^x9tK~f)(=bz_ zSE3mpS0e|L33A`&rus=%_yP2R^&g6VZo$d){x?2uhP!n(eURWU{JrcodfztOP33w{ zhaOd94WytLgvd~WL4mruOdGA^bb~C|!Iyy7MbysDB`b(Sno%&WiF?Ef1Djf~6< z`~{2eFL1oEmH~_7K7A?;zk9FB#K$OaG1PZ|xz3ZoVu5b_|4BYFu7PIo_;miF>1j;& zWoVL~<`na1XkJT|M3);}9M@{0ZEjv!KBji6t;cjt%=G5uK7&j0n zJL%zW;hNRSpe!$Qyu&CZ7)O0E@KHiqlY^GJ&xMsARM2k^2TnM8PZp|E!ckNWUmj(T z4yQ>ht$K*#l;S3A1;C6&n5rszp5C-FXLA;si-9iiq|~40v5{ARmuLz8IRS*0;PDwk z(q2OqtSt+)C15Pn1&LYZoX$0$LA=r&F@0ra#b2|C++nDxKao}2fIOwI#!Ghec9P&? zt?aea3;1h-6^aRRvghjLf|%SsjtjWqS@8HZ4f9C^|Ks|TI}8}1YiSwDn4c7V_Y?#G zTLi+k3*xUMSGYJ!u2)t){vs57UNB^m;u3&nK6B>(?yAAm4|?G%2Nby*ek&<%sIT%I z)5A~NV>7Xh;q>EX&@dP;6)Q12ISBzs(CRPcgqYRzR92`F{v#@y{j`XNCy4;6tE}8T z+A@q(Hfmhta(CfXlAiE6pQ|g6RJK4$r4ggTH>k*w}QF>Oc;o zSzs@I1smyT3HB0(5T?;)*>$;TwE%E$u#3;JRLPX!TF!=o1p=oUhe%T6gYuLY!+?*} z?-xyr(@sgjF4J3Gx18jU9$_-jmo7A;|+UmHO4bDN{t zi+$%C%>spMAKp4umzHkj$Fy^^yVsdk02p4iLVTr#+Q+3dFIyWM_tPDajc!Y}qN1W* zR^xh?nrzc4pBN|csZE!E`ZA@j{5Y|mI_h_L49A$2KUWuGu@`xf$m2QNn?A6R(4Vy8 zZs+P;=&tN-T$-M~hOCHr(>#N0Jf9CFsu*SiR$!&M`YFI5cd;XBV2~IT7^wIx9x9rY zO2H%LJS$Qzus&gp_){6qTMQF3!FX)Xju@GF1~@pBR5=#}%-;!Lfa|EoL`OS0JAA!m zAYqO2F)v9XVTt`it}_X0VQe^-nuno8^HhNur2>WShbcQ6kkn^^2omG2IJ zKTZ|d+}$+@M(7%o^u^YUa#R4&&Cs~mhP+y+t*!NbUf}&Sp<8n!3u~t3$(1RCl29*& zWhCk8lBHfrcQiF^;z*)(vvyDMAxI;(*p*7v0Nm>$1*DywHvSee%$v`e<;8>nns`6% z>0o;~CbyQ8QLL+u#_n-dbs*CxKgEpg)X&f7eu&&J5S z{^uU{rnI=2A4{KVd)WKqX>j22_hjMOiU27PCpy2yQ)R}Qil-M?URn7bMKng^fcL0( z{yjT?h8JlgrkFOmUFkp1rlW{k>%7??h(gm@FwzWFca zTf|T$>7nt96BC~2-p)_cS%n`eGbYewJbQ&YH#ax8Jo_FU$$6fP-#)$wUh5b=u#WLz z(VS9$^9EmO8nP06$^sD?(GJ&;S@!>A9DYA$fhF3wM(*^iG>!lC zltIMAd;T+vK=K=3Bh&w;-LRBqk2q9}3OBHQ%zp1)WY6kgqJU@uy0r!^|6<5 zU>DL2e8a~qFE1ZS|BzYoC8}nKND~e@OXsne+V$m9L|)2tz*b##D#A^!ZtS(EbJ#y!U0o!-e&O4?cF^R7s)$Lv^VotDNI^y55l*=A{# z`0XQmCIv|a;`0neJ7Db~6)Pnp^GJ9?Z=(OLAr1=i1wD|N{QzSBk@X^bl+dpYjIj1; zF3isl_3CrFr$m1@O4S$B=toOSYYe{26V|=zLC*C)gNr-zS?>v5aPS>F>(cN?VF-oe z90gjqF@>#$;6o4y6PQ1>#Yb6AyggujAD3ngG#u^RB+x>VajcZ^pX9hX8zQ+XAiemG z7ky?Ai3>(nJ&@;lA(~Iq-#V$i9H4d!giG<|AIL`>`zIP!U~_0rPP z_Yp8_%A<=?hmHY$!llnFy)6npO7XFCGss6B#;vn+$o5XYrv6#gY+C4avaRv2dn|Y4 zdBJZ*CIj1+J!E%IFCck3@7}#rQNc9Lb&y!=GxWw0-qlxk-=-#QF?+lF0f&%1*mI4N zC%P!FT9y0x_xgTYi(U|L&6IAT*$Q>j1YS&1{!Qa_|uJxOw1v02*W}r=GhY|l^#Q*vf7&(g z(vdE?osp3d9W4?Mc;x8lSUqimIv7kW(aL`QO#O*s&@|R`Lh6eKf6uCph#}7~qcRGd z^jJhFA&lKd{|Q7&bBbN0$zN(;xZ5&M=XZXL7!*AAO2z1454(SSd@N{WQkeq+CVD?# zn#MeNfMTBS%hwP!ZA!`h#v9fvJ)3IYAj=^tgOW=W633A+HX{1&(4|sCRBO z364;b2Qxx|g!T2SeC2@yf1I%tN88DQGl@cxUV4xyScb4sl@i$D++*}vY@uGMIrik+ z-)foTpH`@5vns`#vt94!uBE^*uXd*y8Ra}3&g{tI1ZaN9^<}`D)a&fO170pd8uc5%n*^k;zJ6Wcu{`Pjr>w02ZAY0lc1UjB zzPM|T+Gte|mB5WDUYdJKdNP%t2F&NgyQF^<;!iCdeS zJG;9Nfj~9>#H%X`(m>MMieICf*ULmrrO_tGniF)!>Owf6;-7(#9Jx{pHaqt4m<#|9 zsWXX1+z!^>RPLd9A$Iu!bJ#{$e;j@}V57}n&J9>RwH5WMfR4`V-V+Nszdfpf^L5eu zc$k};MeR=$wwUd@Z=(I3ot>9wbWhs<_PhKTniNLVDgsx#JR;%Hq*>3=RIxVXSdI*9 zb~Fv^NruGw;n~SffbG>eoy`NWax^!BIkWe3yiQsdP*PK9x+ZYzZX5D!NY!@_v9y0$ z?o6%MvZ17$ryVw)A{vq<>7d1#=@)C2l#a+Jf6~!W|9XARgM9IR z9=wt5=jY=S<65kG7+N4h_`RBf-8*+MAKM6^WudDlDk%pMLVkCBB$>W`m^{s7;$6wn ztj{a(A^eNy&&|YACn=(p0!Yce)-15t(1uua^^1n|jmcJV4@dPAWR@_0esn1#J1i$U zaey7}+mHdN5jDQcixtHVI8pKB=*TJKWM0lsH1oCh(dNYaAvXjm9Ey)0TshC|S-|7{ zNN9u0e2e$i@off9=8MEQ=M^nMwuzbDMN3jSZPRngvC=N|)7p_vPLN_)L{Hw;#i?cR z@rsPJf?z0@ZLQZ3Aj~&EMHBdSY&owe19#bV|-lP{d-cGqttmR(@aA{1IdS^p6xES1&uAYU66E8 z1#obNVEK8VLx{d2G6L>AP1g`g&QEGFt5W0Bv#>C?S_QER{XhGW^B({J literal 5512 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 bf5a)E?57-@f?{J7RxGHZ8swL}dFcNDSa#4n diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index 895ec807875cd4c866f9eaf32cbf6a3975dc92f8..b864180084457b2499d9d29d1fba442e0cbf4a1b 100644 GIT binary patch delta 1999 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 LMFvhpu0mjf@lL!| diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 4ee6677d5d243188f669c0cfc5aee91c9c13b14a..81ae68e842a122c3f94473d17ce479952eb690a8 100644 GIT binary patch literal 3887 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 diff --git a/mobile/lib/features/activity/activity_page.dart b/mobile/lib/features/activity/activity_page.dart index dcae998ed0f..ebfd5f453be 100644 --- a/mobile/lib/features/activity/activity_page.dart +++ b/mobile/lib/features/activity/activity_page.dart @@ -14,7 +14,7 @@ import '../../shared/theme/theme.dart'; import '../../shared/utils/string_utils.dart'; import '../../shared/widgets/avatar_image.dart'; import '../../shared/widgets/anchored_popover_menu.dart'; -import '../../shared/widgets/bee_refresh_indicator.dart'; +import '../../shared/widgets/brand_refresh_indicator.dart'; import '../../shared/widgets/buzz_loading_indicator.dart'; import '../../shared/widgets/frosted_app_bar.dart'; import '../../shared/widgets/frosted_scaffold.dart'; @@ -318,7 +318,7 @@ class ActivityPage extends HookConsumerWidget { : -1; bodyRidesOverTopSection = true; - body = BeeRefreshIndicator( + body = BrandRefreshIndicator( edgeOffset: topSectionHeight, onRefresh: refresh, child: CustomScrollView( diff --git a/mobile/lib/features/activity/activity_page/lists.dart b/mobile/lib/features/activity/activity_page/lists.dart index ad970492723..7ca360440cd 100644 --- a/mobile/lib/features/activity/activity_page/lists.dart +++ b/mobile/lib/features/activity/activity_page/lists.dart @@ -38,7 +38,7 @@ class _RemindersList extends ConsumerWidget { } final now = DateTime.now().millisecondsSinceEpoch ~/ 1000; - return BeeRefreshIndicator( + return BrandRefreshIndicator( onRefresh: onRefresh, child: ListView.builder( controller: scrollController, diff --git a/mobile/lib/features/channels/channels_page.dart b/mobile/lib/features/channels/channels_page.dart index c77ef278ec6..ef2e4e0b02f 100644 --- a/mobile/lib/features/channels/channels_page.dart +++ b/mobile/lib/features/channels/channels_page.dart @@ -17,7 +17,7 @@ import '../../shared/relay/relay.dart'; import '../../shared/theme/theme.dart'; import '../../shared/widgets/avatar_image.dart'; import '../../shared/widgets/anchored_popover_menu.dart'; -import '../../shared/widgets/bee_refresh_indicator.dart'; +import '../../shared/widgets/brand_refresh_indicator.dart'; import '../../shared/widgets/buzz_loading_indicator.dart'; import '../../shared/widgets/buzz_titled_sheet_layout.dart'; import '../../shared/widgets/frosted_app_bar.dart'; diff --git a/mobile/lib/features/channels/channels_page/body.dart b/mobile/lib/features/channels/channels_page/body.dart index 34faa068eba..3a5550e69f6 100644 --- a/mobile/lib/features/channels/channels_page/body.dart +++ b/mobile/lib/features/channels/channels_page/body.dart @@ -40,7 +40,7 @@ class _ChannelsBody extends StatelessWidget { ) : loadedChannels == null ? const SizedBox.shrink() - : BeeRefreshIndicator( + : BrandRefreshIndicator( edgeOffset: barHeight, onRefresh: onRefresh, child: CustomScrollView( diff --git a/mobile/lib/features/forum/forum_posts_view.dart b/mobile/lib/features/forum/forum_posts_view.dart index 13880427cfc..4623142528b 100644 --- a/mobile/lib/features/forum/forum_posts_view.dart +++ b/mobile/lib/features/forum/forum_posts_view.dart @@ -8,7 +8,7 @@ import 'package:lucide_icons_flutter/lucide_icons.dart'; import '../../shared/theme/theme.dart'; import '../../shared/widgets/buzz_loading_indicator.dart'; import '../../shared/widgets/frosted_app_bar.dart'; -import '../../shared/widgets/bee_refresh_indicator.dart'; +import '../../shared/widgets/brand_refresh_indicator.dart'; import '../channels/channel.dart'; import '../channels/compose_bar.dart'; import 'forum_models.dart'; @@ -93,7 +93,7 @@ class ForumPostsView extends HookConsumerWidget { isArchived: channel.isArchived, ); } - return BeeRefreshIndicator( + return BrandRefreshIndicator( onRefresh: () async { ref.invalidate(forumPostsProvider(channel.id)); await ref.read(forumPostsProvider(channel.id).future); diff --git a/mobile/lib/features/pulse/pulse_page.dart b/mobile/lib/features/pulse/pulse_page.dart index 08568fc8dc6..22291892c84 100644 --- a/mobile/lib/features/pulse/pulse_page.dart +++ b/mobile/lib/features/pulse/pulse_page.dart @@ -6,7 +6,7 @@ import 'package:lucide_icons_flutter/lucide_icons.dart'; import '../../shared/relay/relay.dart'; import '../../shared/theme/theme.dart'; import '../../shared/widgets/filter_chip_bar.dart'; -import '../../shared/widgets/bee_refresh_indicator.dart'; +import '../../shared/widgets/brand_refresh_indicator.dart'; import '../../shared/widgets/frosted_app_bar.dart'; import '../../shared/widgets/frosted_scaffold.dart'; import 'agent_activity_card.dart'; @@ -100,7 +100,7 @@ class PulsePage extends HookConsumerWidget { ], ), Expanded( - child: BeeRefreshIndicator( + child: BrandRefreshIndicator( onRefresh: () async => _refresh(ref, active.value, currentPubkey), child: _PulseBody( tab: active.value, diff --git a/mobile/lib/shared/theme/theme_catalog.dart b/mobile/lib/shared/theme/theme_catalog.dart index 9e00cfc8119..b7d15d8dfd7 100644 --- a/mobile/lib/shared/theme/theme_catalog.dart +++ b/mobile/lib/shared/theme/theme_catalog.dart @@ -24,13 +24,33 @@ class ThemeColors { bool get isDark => bg.computeLuminance() < 0.5; - /// Human-readable display name: 'catppuccin-mocha' → 'Catppuccin Mocha'. - String get displayName => name - .split('-') - .map((w) => w.isNotEmpty ? '${w[0].toUpperCase()}${w.substring(1)}' : w) - .join(' '); + /// Human-readable display name: 'catppuccin-mocha' → 'Catppuccin Mocha', + /// unless [themeDisplayNameOverrides] renames it. + String get displayName => + themeDisplayNameOverrides[name] ?? + name + .split('-') + .map( + (w) => w.isNotEmpty ? '${w[0].toUpperCase()}${w.substring(1)}' : w, + ) + .join(' '); } +/// Labels for themes whose display name does not follow from their key. +/// +/// The first-party pair is persisted AND published to the community relay, +/// where Buzz Desktop reads it back (`community_theme_preference.dart`; the +/// desktop catalog in `desktop/src/shared/theme/theme-loader.ts` holds the same +/// 'buzz' key and rejects a preference naming a theme it does not know). The +/// wire key therefore cannot be renamed from the mobile client alone. The +/// label is overridden here instead — the one place both +/// [ThemeColors.displayName] and `pairedThemeLabel` read, so the picker never +/// shows two names for one palette. +const themeDisplayNameOverrides = { + 'buzz': '5dive', + 'buzz-dark': '5dive Dark', +}; + /// Known light theme names — used to show sun/moon icons before loading. const lightThemeNames = { 'buzz', diff --git a/mobile/lib/shared/theme/theme_pairs.dart b/mobile/lib/shared/theme/theme_pairs.dart index cfbf6a53a89..8eed1e3be81 100644 --- a/mobile/lib/shared/theme/theme_pairs.dart +++ b/mobile/lib/shared/theme/theme_pairs.dart @@ -102,6 +102,9 @@ const _modeTokens = { /// mode-specific tokens so `github-light` reads as "Github" and stands for both /// halves. Mirrors desktop's `pairedThemeLabel`. String pairedThemeLabel(String lightName) { + final override = themeDisplayNameOverrides[lightName]; + if (override != null) return override; + final stripped = lightName .split('-') .where((token) => !_modeTokens.contains(token)) diff --git a/mobile/lib/shared/theme/theme_provider.dart b/mobile/lib/shared/theme/theme_provider.dart index 908134ebf7b..57ccf2d7cbc 100644 --- a/mobile/lib/shared/theme/theme_provider.dart +++ b/mobile/lib/shared/theme/theme_provider.dart @@ -16,7 +16,7 @@ const _schemeKey = 'buzz_color_scheme'; /// Buzz ships as the default: the first-party pair, so a fresh install gets the /// branded top-section gradient without picking a theme first. const defaultSchemeName = buzzThemeName; -const defaultSchemeDisplayName = 'Buzz'; +const defaultSchemeDisplayName = '5dive'; /// Pre-loaded SharedPreferences instance, overridden in main(). final savedPrefsProvider = Provider( diff --git a/mobile/lib/shared/widgets/bee_refresh_indicator.dart b/mobile/lib/shared/widgets/bee_refresh_indicator.dart deleted file mode 100644 index 4a9802f0dae..00000000000 --- a/mobile/lib/shared/widgets/bee_refresh_indicator.dart +++ /dev/null @@ -1,440 +0,0 @@ -import 'dart:async' show Timer, unawaited; -import 'dart:math' show cos, min, pi, sin; - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; - -import '../theme/theme.dart'; -import 'flapping_bee.dart'; - -/// Replaces the standard pull-to-refresh spinner with Buzz's loading bee. -/// -/// Flutter continues to own the gesture, refresh lifecycle, and accessibility -/// semantics. This widget maps those states into the elastic pull, retained -/// loading gap, and bee animation. -class BeeRefreshIndicator extends HookConsumerWidget { - /// Called when the user completes a pull, to load fresh data. - /// - /// The bee keeps flapping until this future settles, so it should complete - /// only once the refresh is done. - final Future Function() onRefresh; - - /// The scrollable this indicator wraps. - /// - /// It must scroll vertically; the indicator reads its scroll notifications - /// to couple the bee to the user's finger. - final Widget child; - - /// The vertical offset of the scrollable's top edge, such as a pinned header. - final double edgeOffset; - - const BeeRefreshIndicator({ - required this.onRefresh, - required this.child, - this.edgeOffset = 0, - super.key, - }); - - static const _beeWidth = 60.0; - static const _beeHeight = _beeWidth * 309 / 466; - static const _triggerDistance = 100.0; - static const _loadingGap = 72.0; - static const _beeVerticalAlignment = 0.75; - static const _beeInitialScale = 0.6; - static const _beeRevealStartProgress = 0.18; - static const _pupilStartBeyondArmDistance = 96.0; - static const _pupilFullBeforeEmojiDistance = 8.0; - static const _eyeEmojiSwapViewportFraction = 0.26; - static const _eyeEmojiMinSwapBeyondArmDistance = 220.0; - static const _eyeEmojiMaxSwapBeyondArmDistance = 280.0; - static const _pupilMinBeyondArmDuration = Duration(milliseconds: 300); - static const _eyeEmojiMinBeyondArmDuration = Duration(milliseconds: 700); - static const _eyeShakePeriod = Duration(milliseconds: 140); - static const _settleDuration = Duration(milliseconds: 180); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final status = useState(null); - final pullProgress = useState(0.0); - final pullDistance = useState(0.0); - final pullBeyondArmDistance = useState(0.0); - final pullBeyondArmDuration = useState(Duration.zero); - final activePointers = useRef({}); - final lastPointerTime = useRef(Duration.zero); - final armedAt = useRef(null); - final didTriggerArmHaptic = useRef(false); - final didTriggerEmojiHaptic = useRef(false); - final eyeShakeHapticTimer = useRef(null); - final completionController = useAnimationController( - duration: _settleDuration, - ); - final gapController = useAnimationController( - duration: _settleDuration, - reverseDuration: _settleDuration, - ); - final flapController = useAnimationController( - duration: const Duration(milliseconds: 480), - ); - final eyeShakeController = useAnimationController( - duration: _eyeShakePeriod, - ); - final completionProgress = useAnimation(completionController); - final gapProgress = useAnimation(gapController); - final flapProgress = useAnimation(flapController); - final eyeShakeProgress = useAnimation(eyeShakeController); - final reducedMotion = MediaQuery.disableAnimationsOf(context); - useEffect( - () => - () => eyeShakeHapticTimer.value?.cancel(), - const [], - ); - final eyeEmojiSwapDistance = - (MediaQuery.sizeOf(context).height * _eyeEmojiSwapViewportFraction) - .clamp( - _eyeEmojiMinSwapBeyondArmDistance, - _eyeEmojiMaxSwapBeyondArmDistance, - ) - .toDouble(); - - void stopEyeShake() { - eyeShakeController - ..stop() - ..reset(); - eyeShakeHapticTimer.value?.cancel(); - eyeShakeHapticTimer.value = null; - } - - void startEyeShake() { - stopEyeShake(); - if (reducedMotion) return; - - eyeShakeController.repeat(); - eyeShakeHapticTimer.value = Timer.periodic( - _eyeShakePeriod, - (_) => unawaited(HapticFeedback.selectionClick()), - ); - } - - void beginExpressionTracking() { - if (activePointers.value.isEmpty || armedAt.value != null) return; - pullBeyondArmDistance.value = 0; - pullBeyondArmDuration.value = Duration.zero; - armedAt.value = lastPointerTime.value; - if (!didTriggerArmHaptic.value) { - didTriggerArmHaptic.value = true; - unawaited(HapticFeedback.mediumImpact()); - } - } - - void updateStatus(RefreshIndicatorStatus? nextStatus) { - status.value = nextStatus; - - if (nextStatus == RefreshIndicatorStatus.drag) { - completionController.reset(); - gapController.reset(); - flapController.stop(); - if (!didTriggerArmHaptic.value) { - pullBeyondArmDistance.value = 0; - pullBeyondArmDuration.value = Duration.zero; - armedAt.value = null; - } - } else if (nextStatus == RefreshIndicatorStatus.armed) { - pullProgress.value = 1; - beginExpressionTracking(); - } else if (nextStatus == RefreshIndicatorStatus.snap || - nextStatus == RefreshIndicatorStatus.refresh) { - stopEyeShake(); - pullProgress.value = 1; - pullBeyondArmDistance.value = 0; - pullBeyondArmDuration.value = Duration.zero; - armedAt.value = null; - if (reducedMotion) { - gapController.value = 1; - } else { - gapController.animateTo(1, curve: Curves.easeOutCubic); - } - if (!reducedMotion) flapController.repeat(); - } else if (nextStatus == RefreshIndicatorStatus.done) { - stopEyeShake(); - if (reducedMotion) { - gapController.value = 0; - pullProgress.value = 0; - pullDistance.value = 0; - pullBeyondArmDistance.value = 0; - pullBeyondArmDuration.value = Duration.zero; - status.value = null; - } else { - flapController.repeat(); - gapController - .animateTo(1, curve: Curves.easeOutCubic) - .whenCompleteOrCancel(() { - if (!gapController.isCompleted || status.value == null) return; - gapController.animateBack(0, curve: Curves.easeInOutCubic); - completionController.forward(from: 0).whenCompleteOrCancel(() { - if (!completionController.isCompleted) return; - flapController.stop(); - pullProgress.value = 0; - pullDistance.value = 0; - pullBeyondArmDistance.value = 0; - pullBeyondArmDuration.value = Duration.zero; - status.value = null; - }); - }); - } - } else if (nextStatus == RefreshIndicatorStatus.canceled || - nextStatus == null) { - stopEyeShake(); - pullProgress.value = 0; - pullDistance.value = 0; - pullBeyondArmDistance.value = 0; - pullBeyondArmDuration.value = Duration.zero; - armedAt.value = null; - if (!gapController.isAnimating) gapController.reset(); - flapController.stop(); - } - } - - bool trackPull(ScrollNotification notification) { - if (notification.metrics.axis != Axis.vertical) return false; - - if (notification is! ScrollStartNotification && - notification.metrics.extentBefore == 0) { - // BouncingScrollPhysics reports a live negative scroll position while - // the user is pulling. Reading it keeps the bee coupled to the finger. - final elasticPull = - (notification.metrics.minScrollExtent - notification.metrics.pixels) - .clamp(0.0, double.infinity) - .toDouble(); - if (elasticPull > 0 || pullDistance.value > 0) { - pullDistance.value = elasticPull; - final nextProgress = (elasticPull / _triggerDistance).clamp(0.0, 1.0); - pullProgress.value = nextProgress; - if (nextProgress >= 1) beginExpressionTracking(); - } else if (notification case OverscrollNotification()) { - // Clamping physics does not expose a negative position, so build the - // same progress from its overscroll deltas. - final nextDistance = - pullDistance.value + notification.overscroll.abs(); - pullDistance.value = nextDistance; - pullProgress.value = (nextDistance / _triggerDistance).clamp( - 0.0, - 1.0, - ); - if (pullProgress.value >= 1) beginExpressionTracking(); - } - } - return false; - } - - void startPointer(PointerDownEvent event) { - final isNewGesture = activePointers.value.isEmpty; - activePointers.value.add(event.pointer); - if (!isNewGesture) return; - - lastPointerTime.value = event.timeStamp; - armedAt.value = null; - didTriggerArmHaptic.value = false; - didTriggerEmojiHaptic.value = false; - stopEyeShake(); - pullProgress.value = 0; - pullDistance.value = 0; - pullBeyondArmDistance.value = 0; - pullBeyondArmDuration.value = Duration.zero; - } - - void trackPointer(PointerMoveEvent event) { - if (!activePointers.value.contains(event.pointer)) return; - lastPointerTime.value = event.timeStamp; - if (armedAt.value == null) return; - - pullBeyondArmDistance.value = - (pullBeyondArmDistance.value + event.delta.dy) - .clamp(0.0, double.infinity) - .toDouble(); - if (armedAt.value case final armedTime?) { - pullBeyondArmDuration.value = event.timeStamp - armedTime; - } - if (!didTriggerEmojiHaptic.value && - pullBeyondArmDuration.value >= _eyeEmojiMinBeyondArmDuration && - pullBeyondArmDistance.value >= eyeEmojiSwapDistance) { - didTriggerEmojiHaptic.value = true; - unawaited(HapticFeedback.heavyImpact()); - startEyeShake(); - } - } - - void finishPointer(PointerEvent event) { - if (!activePointers.value.remove(event.pointer)) return; - if (activePointers.value.isNotEmpty) return; - - stopEyeShake(); - armedAt.value = null; - pullBeyondArmDistance.value = 0; - pullBeyondArmDuration.value = Duration.zero; - } - - final isLoading = switch (status.value) { - RefreshIndicatorStatus.snap || - RefreshIndicatorStatus.refresh || - RefreshIndicatorStatus.done => true, - _ => false, - }; - final dragRevealProgress = - ((pullProgress.value - _beeRevealStartProgress) / - (1 - _beeRevealStartProgress)) - .clamp(0.0, 1.0); - final isVisible = - status.value != null && - (isLoading || dragRevealProgress > 0 || completionProgress > 0); - final retainedGap = _loadingGap * gapProgress; - final visibleGap = pullDistance.value + retainedGap; - final top = edgeOffset + (visibleGap - _beeHeight) * _beeVerticalAlignment; - final opacity = isLoading ? 1 - completionProgress : dragRevealProgress; - final beeScale = isLoading - ? 1.0 - : _beeInitialScale + (1 - _beeInitialScale) * dragRevealProgress; - final flapAmount = reducedMotion - ? 0.0 - : isLoading - ? 0.5 - (0.5 * cos(flapProgress * 4 * pi)) - : pullProgress.value * 0.18; - final pupilFullDistance = - eyeEmojiSwapDistance - _pupilFullBeforeEmojiDistance; - final pupilDistanceProgress = - ((pullBeyondArmDistance.value - _pupilStartBeyondArmDistance) / - (pupilFullDistance - _pupilStartBeyondArmDistance)) - .clamp(0.0, 1.0); - final pupilGrowthDuration = - _eyeEmojiMinBeyondArmDuration - _pupilMinBeyondArmDuration; - final pupilProgress = - pullBeyondArmDuration.value >= _pupilMinBeyondArmDuration - ? min( - pupilDistanceProgress, - ((pullBeyondArmDuration.value - _pupilMinBeyondArmDuration) - .inMicroseconds / - pupilGrowthDuration.inMicroseconds) - .clamp(0.0, 1.0), - ).toDouble() - : 0.0; - final showEyeEmoji = !isLoading && didTriggerEmojiHaptic.value; - final eyeShakeOffset = showEyeEmoji && !reducedMotion - ? sin(eyeShakeProgress * 2 * pi) * 0.75 - : 0.0; - final scrollBehavior = ScrollConfiguration.of(context).copyWith( - overscroll: false, - physics: const BouncingScrollPhysics( - parent: AlwaysScrollableScrollPhysics(), - ), - ); - - return Stack( - clipBehavior: Clip.none, - children: [ - RefreshIndicator.noSpinner( - onRefresh: onRefresh, - onStatusChange: updateStatus, - semanticsLabel: 'Pull to refresh', - child: NotificationListener( - onNotification: trackPull, - child: Listener( - behavior: HitTestBehavior.translucent, - onPointerDown: startPointer, - onPointerMove: trackPointer, - onPointerUp: finishPointer, - onPointerCancel: finishPointer, - child: ScrollConfiguration( - behavior: scrollBehavior, - child: Transform.translate( - key: const ValueKey('bee-refresh-retained-gap'), - offset: Offset(0, retainedGap), - child: child, - ), - ), - ), - ), - ), - if (isVisible) - Positioned( - top: edgeOffset, - left: 0, - right: 0, - bottom: 0, - child: ClipRect( - child: Align( - alignment: Alignment.topCenter, - child: Transform.translate( - offset: Offset(0, top - edgeOffset), - child: IgnorePointer( - child: Opacity( - key: const ValueKey('bee-refresh-opacity'), - opacity: opacity.clamp(0.0, 1.0), - child: Transform.scale( - key: const ValueKey('bee-refresh-scale'), - scale: beeScale, - child: SizedBox( - width: _beeWidth, - height: _beeHeight, - child: Stack( - clipBehavior: Clip.none, - alignment: Alignment.topCenter, - children: [ - Positioned.fill( - child: FlappingBee( - width: _beeWidth, - color: context.colors.primary, - flapAmount: flapAmount, - eyeProgress: - !isLoading && - !showEyeEmoji && - pupilProgress > 0 - ? pupilProgress - : null, - ), - ), - if (showEyeEmoji) - Positioned( - top: 2, - left: 0, - right: 0, - child: ExcludeSemantics( - child: Transform.translate( - key: const ValueKey( - 'bee-refresh-eyes-emoji-offset', - ), - offset: const Offset(2, 0), - child: Transform.translate( - key: const ValueKey( - 'bee-refresh-eyes-emoji-shake', - ), - offset: Offset(eyeShakeOffset, 0), - child: const Text( - '👀', - key: ValueKey( - 'bee-refresh-eyes-emoji', - ), - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18, - height: 1, - ), - ), - ), - ), - ), - ), - ], - ), - ), - ), - ), - ), - ), - ), - ), - ), - ], - ); - } -} diff --git a/mobile/lib/shared/widgets/brand_refresh_indicator.dart b/mobile/lib/shared/widgets/brand_refresh_indicator.dart new file mode 100644 index 00000000000..c6ab5e64038 --- /dev/null +++ b/mobile/lib/shared/widgets/brand_refresh_indicator.dart @@ -0,0 +1,269 @@ +import 'dart:async' show unawaited; +import 'dart:math' show cos, pi; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; + +import '../theme/theme.dart'; +import 'fivedive_mark.dart'; + +/// Replaces the standard pull-to-refresh spinner with the 5dive mark. +/// +/// Flutter continues to own the gesture, refresh lifecycle, and accessibility +/// semantics. This widget maps those states into the elastic pull, the retained +/// loading gap, and the mark's reveal and loading pulse. +class BrandRefreshIndicator extends HookConsumerWidget { + /// Called when the user completes a pull, to load fresh data. + /// + /// The mark keeps pulsing until this future settles, so it should complete + /// only once the refresh is done. + final Future Function() onRefresh; + + /// The scrollable this indicator wraps. + /// + /// It must scroll vertically; the indicator reads its scroll notifications + /// to couple the mark to the user's finger. + final Widget child; + + /// The vertical offset of the scrollable's top edge, such as a pinned header. + final double edgeOffset; + + const BrandRefreshIndicator({ + required this.onRefresh, + required this.child, + this.edgeOffset = 0, + super.key, + }); + + static const _markHeight = 44.0; + static const _markWidth = _markHeight * 342 / 512; + static const _triggerDistance = 100.0; + static const _loadingGap = 72.0; + static const _markVerticalAlignment = 0.75; + static const _markInitialScale = 0.6; + static const _markRevealStartProgress = 0.18; + static const _settleDuration = Duration(milliseconds: 180); + static const _pulseDuration = Duration(milliseconds: 900); + + /// Peak shrink of the loading pulse, as a fraction of the resting size. + static const _pulseDepth = 0.12; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final status = useState(null); + final pullProgress = useState(0.0); + final pullDistance = useState(0.0); + final activePointers = useRef({}); + final didTriggerArmHaptic = useRef(false); + final completionController = useAnimationController( + duration: _settleDuration, + ); + final gapController = useAnimationController( + duration: _settleDuration, + reverseDuration: _settleDuration, + ); + final pulseController = useAnimationController(duration: _pulseDuration); + final completionProgress = useAnimation(completionController); + final gapProgress = useAnimation(gapController); + final pulseProgress = useAnimation(pulseController); + final reducedMotion = MediaQuery.disableAnimationsOf(context); + + void arm() { + if (activePointers.value.isEmpty) return; + if (didTriggerArmHaptic.value) return; + didTriggerArmHaptic.value = true; + unawaited(HapticFeedback.mediumImpact()); + } + + void updateStatus(RefreshIndicatorStatus? nextStatus) { + status.value = nextStatus; + + if (nextStatus == RefreshIndicatorStatus.drag) { + completionController.reset(); + gapController.reset(); + pulseController.stop(); + } else if (nextStatus == RefreshIndicatorStatus.armed) { + pullProgress.value = 1; + arm(); + } else if (nextStatus == RefreshIndicatorStatus.snap || + nextStatus == RefreshIndicatorStatus.refresh) { + pullProgress.value = 1; + if (reducedMotion) { + gapController.value = 1; + } else { + gapController.animateTo(1, curve: Curves.easeOutCubic); + pulseController.repeat(); + } + } else if (nextStatus == RefreshIndicatorStatus.done) { + if (reducedMotion) { + gapController.value = 0; + pullProgress.value = 0; + pullDistance.value = 0; + status.value = null; + } else { + pulseController.repeat(); + gapController + .animateTo(1, curve: Curves.easeOutCubic) + .whenCompleteOrCancel(() { + if (!gapController.isCompleted || status.value == null) return; + gapController.animateBack(0, curve: Curves.easeInOutCubic); + completionController.forward(from: 0).whenCompleteOrCancel(() { + if (!completionController.isCompleted) return; + pulseController.stop(); + pullProgress.value = 0; + pullDistance.value = 0; + status.value = null; + }); + }); + } + } else if (nextStatus == RefreshIndicatorStatus.canceled || + nextStatus == null) { + pullProgress.value = 0; + pullDistance.value = 0; + if (!gapController.isAnimating) gapController.reset(); + pulseController.stop(); + } + } + + bool trackPull(ScrollNotification notification) { + if (notification.metrics.axis != Axis.vertical) return false; + + if (notification is! ScrollStartNotification && + notification.metrics.extentBefore == 0) { + // BouncingScrollPhysics reports a live negative scroll position while + // the user is pulling. Reading it keeps the mark coupled to the finger. + final elasticPull = + (notification.metrics.minScrollExtent - notification.metrics.pixels) + .clamp(0.0, double.infinity) + .toDouble(); + if (elasticPull > 0 || pullDistance.value > 0) { + pullDistance.value = elasticPull; + final nextProgress = (elasticPull / _triggerDistance).clamp(0.0, 1.0); + pullProgress.value = nextProgress; + if (nextProgress >= 1) arm(); + } else if (notification case OverscrollNotification()) { + // Clamping physics does not expose a negative position, so build the + // same progress from its overscroll deltas. + final nextDistance = + pullDistance.value + notification.overscroll.abs(); + pullDistance.value = nextDistance; + pullProgress.value = (nextDistance / _triggerDistance).clamp( + 0.0, + 1.0, + ); + if (pullProgress.value >= 1) arm(); + } + } + return false; + } + + void startPointer(PointerDownEvent event) { + final isNewGesture = activePointers.value.isEmpty; + activePointers.value.add(event.pointer); + if (!isNewGesture) return; + + didTriggerArmHaptic.value = false; + pullProgress.value = 0; + pullDistance.value = 0; + } + + void finishPointer(PointerEvent event) { + activePointers.value.remove(event.pointer); + } + + final isLoading = switch (status.value) { + RefreshIndicatorStatus.snap || + RefreshIndicatorStatus.refresh || + RefreshIndicatorStatus.done => true, + _ => false, + }; + final dragRevealProgress = + ((pullProgress.value - _markRevealStartProgress) / + (1 - _markRevealStartProgress)) + .clamp(0.0, 1.0); + final isVisible = + status.value != null && + (isLoading || dragRevealProgress > 0 || completionProgress > 0); + final retainedGap = _loadingGap * gapProgress; + final visibleGap = pullDistance.value + retainedGap; + final top = + edgeOffset + (visibleGap - _markHeight) * _markVerticalAlignment; + final opacity = isLoading ? 1 - completionProgress : dragRevealProgress; + // While loading the mark breathes; while dragging it grows into place. + final pulseAmount = isLoading && !reducedMotion + ? _pulseDepth * 0.5 * (1 - cos(pulseProgress * 2 * pi)) + : 0.0; + final markScale = isLoading + ? 1.0 - pulseAmount + : _markInitialScale + (1 - _markInitialScale) * dragRevealProgress; + final scrollBehavior = ScrollConfiguration.of(context).copyWith( + overscroll: false, + physics: const BouncingScrollPhysics( + parent: AlwaysScrollableScrollPhysics(), + ), + ); + + return Stack( + clipBehavior: Clip.none, + children: [ + RefreshIndicator.noSpinner( + onRefresh: onRefresh, + onStatusChange: updateStatus, + semanticsLabel: 'Pull to refresh', + child: NotificationListener( + onNotification: trackPull, + child: Listener( + behavior: HitTestBehavior.translucent, + onPointerDown: startPointer, + onPointerUp: finishPointer, + onPointerCancel: finishPointer, + child: ScrollConfiguration( + behavior: scrollBehavior, + child: Transform.translate( + key: const ValueKey('brand-refresh-retained-gap'), + offset: Offset(0, retainedGap), + child: child, + ), + ), + ), + ), + ), + if (isVisible) + Positioned( + top: edgeOffset, + left: 0, + right: 0, + bottom: 0, + child: ClipRect( + child: Align( + alignment: Alignment.topCenter, + child: Transform.translate( + offset: Offset(0, top - edgeOffset), + child: IgnorePointer( + child: Opacity( + key: const ValueKey('brand-refresh-opacity'), + opacity: opacity.clamp(0.0, 1.0), + child: Transform.scale( + key: const ValueKey('brand-refresh-scale'), + scale: markScale, + child: SizedBox( + width: _markWidth, + height: _markHeight, + child: FiveDiveMark( + height: _markHeight, + color: context.colors.primary, + ), + ), + ), + ), + ), + ), + ), + ), + ), + ], + ); + } +} diff --git a/mobile/lib/shared/widgets/fivedive_mark.dart b/mobile/lib/shared/widgets/fivedive_mark.dart index d4ec6324dc9..9b943996c3d 100644 --- a/mobile/lib/shared/widgets/fivedive_mark.dart +++ b/mobile/lib/shared/widgets/fivedive_mark.dart @@ -4,8 +4,8 @@ import 'package:flutter/material.dart'; /// /// The asset is an alpha mask cut from the same source art the launcher icons /// are generated from, so the home screen and the onboarding hero show one -/// mark. It replaces upstream's tap-to-flutter bee on the welcome screen; the -/// bee itself still drives the pull-to-refresh indicator. +/// mark. It is the app's one brand mark: the onboarding hero and the +/// pull-to-refresh indicator both render it. class FiveDiveMark extends StatelessWidget { /// The rendered height of the mark. /// diff --git a/mobile/lib/shared/widgets/flapping_bee.dart b/mobile/lib/shared/widgets/flapping_bee.dart deleted file mode 100644 index 9a99bd87966..00000000000 --- a/mobile/lib/shared/widgets/flapping_bee.dart +++ /dev/null @@ -1,155 +0,0 @@ -import 'dart:math' show min; - -import 'package:flutter/material.dart'; - -/// The Buzz mark at a caller-controlled wing position. -/// -/// The geometry matches the desktop loading bee. Callers drive the wings -/// themselves, which lets one painter serve both the tap-to-flutter mark -/// ([TappableFlappingBee]) and the pull-to-refresh indicator -/// ([BeeRefreshIndicator]). -class FlappingBee extends StatelessWidget { - /// The rendered width of the complete bee mark. - /// - /// Height follows from the mark's 466:309 aspect ratio. - final double width; - - /// The color used for the bee silhouette, wings, and pupils. - final Color color; - - /// How far the wings are tucked toward the body, from 0 to 1. - /// - /// 0 renders the wings fully spread; 1 renders them at their innermost - /// tuck. Callers animate this to flap the wings. - final double flapAmount; - - /// How far the pupils have grown, from 0 to 1, or null for cutout eyes. - /// - /// Only the pull-to-refresh treatment sets this. Leaving it null preserves - /// the mark's ordinary cutout eyes; a non-null value fills them in, with 1 - /// drawing the pupils at full size. - final double? eyeProgress; - - const FlappingBee({ - required this.width, - required this.color, - required this.flapAmount, - this.eyeProgress, - super.key, - }); - - @override - Widget build(BuildContext context) { - return RepaintBoundary( - child: CustomPaint( - size: Size(width, width * 309 / 466), - painter: _FlappingBeePainter( - color: color, - flapAmount: flapAmount, - eyeProgress: eyeProgress, - ), - ), - ); - } -} - -class _FlappingBeePainter extends CustomPainter { - final Color color; - final double flapAmount; - final double? eyeProgress; - - const _FlappingBeePainter({ - required this.color, - required this.flapAmount, - this.eyeProgress, - }); - - @override - void paint(Canvas canvas, Size size) { - final scale = min(size.width / 466, size.height / 309); - final renderedWidth = 466 * scale; - final renderedHeight = 309 * scale; - - canvas - ..save() - ..translate( - (size.width - renderedWidth) / 2, - (size.height - renderedHeight) / 2, - ) - ..scale(scale); - - final wingRadiusX = 91.7 * (1 - (0.38 * flapAmount)); - final wingTranslation = 30 * flapAmount; - final leftWing = Path() - ..addOval( - Rect.fromCenter( - center: Offset(91.7 + wingTranslation, 154.5), - width: wingRadiusX * 2, - height: 183.4, - ), - ); - final rightWing = Path() - ..addOval( - Rect.fromCenter( - center: Offset(374.3 - wingTranslation, 154.5), - width: wingRadiusX * 2, - height: 183.4, - ), - ); - final body = Path() - ..addRRect( - RRect.fromRectAndRadius( - const Rect.fromLTWH(128, 0, 210, 309), - const Radius.circular(34), - ), - ); - final cutouts = Path() - ..addOval( - Rect.fromCenter( - center: const Offset(193.3, 84.4), - width: 54, - height: 54, - ), - ) - ..addOval( - Rect.fromCenter(center: const Offset(276, 84.4), width: 54, height: 54), - ) - ..addRRect( - RRect.fromRectAndRadius( - const Rect.fromLTWH(166.3, 157.2, 136.9, 38.3), - const Radius.circular(5), - ), - ) - ..addRRect( - RRect.fromRectAndRadius( - const Rect.fromLTWH(166.9, 235.1, 136.2, 37.6), - const Radius.circular(5), - ), - ); - final wings = Path.combine(PathOperation.union, leftWing, rightWing); - final silhouette = Path.combine(PathOperation.union, wings, body); - final finishedMark = Path.combine( - PathOperation.difference, - silhouette, - cutouts, - ); - - canvas.drawPath(finishedMark, Paint()..color = color); - - if (eyeProgress case final progress?) { - final pupilRadius = 20 * progress.clamp(0.0, 1.0); - final pupilPaint = Paint()..color = color; - canvas - ..drawCircle(const Offset(193.3, 84.4), pupilRadius, pupilPaint) - ..drawCircle(const Offset(276, 84.4), pupilRadius, pupilPaint); - } - - canvas.restore(); - } - - @override - bool shouldRepaint(_FlappingBeePainter oldDelegate) => - color != oldDelegate.color || - flapAmount != oldDelegate.flapAmount || - eyeProgress != oldDelegate.eyeProgress; -} diff --git a/mobile/lib/shared/widgets/tappable_flapping_bee.dart b/mobile/lib/shared/widgets/tappable_flapping_bee.dart deleted file mode 100644 index 2313de50f97..00000000000 --- a/mobile/lib/shared/widgets/tappable_flapping_bee.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'dart:math' show cos, pi; - -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; - -import 'flapping_bee.dart'; - -/// The Buzz mark with wings that flutter twice when the user taps it. -/// -/// The geometry and wing tuck match the desktop loading bee. When reduced -/// motion is enabled, the mark stays static. -class TappableFlappingBee extends HookConsumerWidget { - /// The rendered width of the complete bee mark. - final double width; - - /// The color used for the bee silhouette. - final Color color; - - const TappableFlappingBee({ - required this.width, - required this.color, - super.key, - }); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final animation = useAnimationController( - duration: const Duration(milliseconds: 480), - ); - final reducedMotion = MediaQuery.disableAnimationsOf(context); - - void flutterWings() { - if (reducedMotion) return; - animation.forward(from: 0); - } - - return Semantics( - button: true, - label: 'Buzz bee', - hint: 'Tap to make its wings flutter', - onTap: flutterWings, - child: GestureDetector( - behavior: HitTestBehavior.opaque, - excludeFromSemantics: true, - onTap: flutterWings, - child: RepaintBoundary( - child: AnimatedBuilder( - animation: animation, - builder: (context, _) { - final flapAmount = 0.5 - (0.5 * cos(animation.value * 4 * pi)); - return FlappingBee( - width: width, - color: color, - flapAmount: flapAmount, - ); - }, - ), - ), - ), - ); - } -} diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 2429575c67e..6d7d7bab802 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -56,7 +56,6 @@ dev_dependencies: flutter: uses-material-design: true assets: - - assets/images/buzz-icon.png - assets/images/5dive-mark.png # Generated by `just mobile-emoji-data` from the same emoji-mart dataset # desktop uses. Do not hand-edit. diff --git a/mobile/test/shared/theme/buzz_theme_test.dart b/mobile/test/shared/theme/buzz_theme_test.dart index 51b5ad1f3bf..fba4c735d62 100644 --- a/mobile/test/shared/theme/buzz_theme_test.dart +++ b/mobile/test/shared/theme/buzz_theme_test.dart @@ -31,13 +31,16 @@ void main() { expect(themePairFor(buzzDarkThemeName), buzzThemeName); }); - test('appear as a single System-mode option labelled "Buzz"', () { + test('appear as a single System-mode option labelled "5dive"', () { final paired = themeGroups().paired.map((t) => t.name); expect(paired, contains(buzzThemeName)); expect(paired, isNot(contains(buzzDarkThemeName))); - expect(pairedThemeLabel(buzzThemeName), 'Buzz'); - expect(themeSelectionLabel(buzzThemeName, ThemeMode.system), 'Buzz'); - expect(themeSelectionLabel(buzzDarkThemeName, ThemeMode.system), 'Buzz'); + expect(pairedThemeLabel(buzzThemeName), '5dive'); + expect(themeSelectionLabel(buzzThemeName, ThemeMode.system), '5dive'); + expect( + themeSelectionLabel(buzzDarkThemeName, ThemeMode.system), + '5dive', + ); }); test('forces neutral rendering without changing the stored accent', () { diff --git a/mobile/test/shared/widgets/bee_refresh_indicator_test.dart b/mobile/test/shared/widgets/bee_refresh_indicator_test.dart deleted file mode 100644 index de440ebb624..00000000000 --- a/mobile/test/shared/widgets/bee_refresh_indicator_test.dart +++ /dev/null @@ -1,379 +0,0 @@ -import 'dart:async'; - -import 'package:buzz/shared/widgets/bee_refresh_indicator.dart'; -import 'package:buzz/shared/widgets/flapping_bee.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../../helpers/widget_helpers.dart'; - -void main() { - testWidgets('shows the bee while pulling to refresh', (tester) async { - const contentKey = ValueKey('loading-content'); - var refreshes = 0; - final refreshCompleter = Completer(); - - await tester.pumpWidget( - WidgetHelpers.testable( - child: BeeRefreshIndicator( - onRefresh: () { - refreshes++; - return refreshCompleter.future; - }, - child: ListView( - children: const [SizedBox(key: contentKey, height: 800)], - ), - ), - ), - ); - - final listFinder = find.byType(ListView); - final restingTop = tester.getTopLeft(listFinder).dy; - final restingContentTop = tester.getTopLeft(find.byKey(contentKey)).dy; - await tester.timedDrag( - listFinder, - const Offset(0, 320), - const Duration(milliseconds: 500), - ); - await tester.pump(const Duration(milliseconds: 16)); - await tester.pump(const Duration(milliseconds: 300)); - - final beeFinder = find.byType(FlappingBee); - final loadingTop = tester.getTopLeft(listFinder).dy; - final loadingContentTop = tester.getTopLeft(find.byKey(contentKey)).dy; - final gapTransform = tester.widget( - find.byKey(const ValueKey('bee-refresh-retained-gap')), - ); - expect(beeFinder, findsOneWidget); - expect(refreshes, 1); - expect(gapTransform.transform.getTranslation().y, closeTo(72, 1)); - expect(loadingTop - restingTop, closeTo(72, 1)); - final loadingBeeRect = tester.getRect(beeFinder); - final loadingGap = loadingContentTop - restingContentTop; - expect( - loadingBeeRect.center.dy, - closeTo( - restingContentTop + - (loadingGap - loadingBeeRect.height) * 0.75 + - loadingBeeRect.height / 2, - 1, - ), - ); - - refreshCompleter.complete(); - await tester.pump(); - await tester.pump(const Duration(milliseconds: 90)); - - final closingTop = tester.getTopLeft(listFinder).dy; - expect(closingTop, greaterThan(restingTop)); - expect(closingTop, lessThan(loadingTop)); - - await tester.pumpAndSettle(); - expect(tester.getTopLeft(listFinder).dy, closeTo(restingTop, 1)); - expect(beeFinder, findsNothing); - }); - - testWidgets('tracks each stage of an active pull', (tester) async { - tester.view.physicalSize = const Size(420, 912); - tester.view.devicePixelRatio = 1; - addTearDown(tester.view.resetPhysicalSize); - addTearDown(tester.view.resetDevicePixelRatio); - final hapticCalls = []; - TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger - .setMockMethodCallHandler(SystemChannels.platform, (call) async { - if (call.method == 'HapticFeedback.vibrate') hapticCalls.add(call); - return null; - }); - addTearDown( - () => TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger - .setMockMethodCallHandler(SystemChannels.platform, null), - ); - - const contentKey = ValueKey('pull-content'); - final refreshCompleter = Completer(); - await tester.pumpWidget( - WidgetHelpers.testable( - child: BeeRefreshIndicator( - onRefresh: () => refreshCompleter.future, - child: ListView( - children: const [SizedBox(key: contentKey, height: 800)], - ), - ), - ), - ); - - final restingContentTop = tester.getTopLeft(find.byKey(contentKey)).dy; - final gesture = await tester.startGesture( - tester.getCenter(find.byType(ListView)), - pointer: 1, - ); - await gesture.moveBy(const Offset(0, 12)); - await tester.pump(); - - final beeFinder = find.byType(FlappingBee); - expect(beeFinder, findsNothing); - expect( - tester.getTopLeft(find.byKey(contentKey)).dy, - greaterThan(restingContentTop), - ); - - await gesture.moveBy(const Offset(0, 44)); - await tester.pump(); - - final earlyTop = tester.getTopLeft(beeFinder).dy; - final partialOpacity = tester.widget( - find.byKey(const ValueKey('bee-refresh-opacity')), - ); - expect(partialOpacity.opacity, greaterThan(0)); - expect(partialOpacity.opacity, lessThan(1)); - final partialScale = tester - .widget(find.byKey(const ValueKey('bee-refresh-scale'))) - .transform - .storage[0]; - expect(partialScale, greaterThan(0.6)); - expect(partialScale, lessThan(1)); - expect(tester.widget(beeFinder).eyeProgress, isNull); - expect(hapticCalls, isEmpty); - - await gesture.moveBy(const Offset(0, 120)); - await tester.pump(); - - final pulledContentTop = tester.getTopLeft(find.byKey(contentKey)).dy; - expect(tester.getTopLeft(beeFinder).dy, greaterThan(earlyTop)); - expect(tester.widget(beeFinder).eyeProgress, isNull); - expect(find.byKey(const ValueKey('bee-refresh-eyes-emoji')), findsNothing); - final pulledBeeRect = tester.getRect(beeFinder); - final pulledGap = pulledContentTop - restingContentTop; - expect( - pulledBeeRect.center.dy, - closeTo( - restingContentTop + - (pulledGap - pulledBeeRect.height) * 0.75 + - pulledBeeRect.height / 2, - 1, - ), - ); - - await gesture.moveBy(const Offset(0, 120)); - await tester.pump(); - - expect( - tester - .widget(find.byKey(const ValueKey('bee-refresh-scale'))) - .transform - .storage[0], - closeTo(1, 0.001), - ); - expect(hapticCalls, hasLength(1)); - expect(hapticCalls.single.arguments, 'HapticFeedbackType.mediumImpact'); - expect(tester.widget(beeFinder).eyeProgress, isNull); - expect(find.byKey(const ValueKey('bee-refresh-eyes-emoji')), findsNothing); - - await tester.pump(const Duration(milliseconds: 350)); - await gesture.moveBy( - const Offset(0, 120), - timeStamp: const Duration(milliseconds: 350), - ); - await tester.pump(); - - final pupilProgress = tester.widget(beeFinder).eyeProgress; - expect(pupilProgress, greaterThan(0)); - expect(pupilProgress, lessThan(0.5)); - expect(find.byKey(const ValueKey('bee-refresh-eyes-emoji')), findsNothing); - expect(hapticCalls, hasLength(1)); - - await tester.pump(const Duration(milliseconds: 400)); - await gesture.moveBy( - const Offset(0, 240), - timeStamp: const Duration(milliseconds: 750), - ); - await tester.pump(); - - expect(tester.widget(beeFinder).eyeProgress, isNull); - expect( - find.byKey(const ValueKey('bee-refresh-eyes-emoji')), - findsOneWidget, - ); - expect(hapticCalls, hasLength(2)); - expect(hapticCalls.last.arguments, 'HapticFeedbackType.heavyImpact'); - expect( - tester - .widget( - find.byKey(const ValueKey('bee-refresh-eyes-emoji-offset')), - ) - .transform - .storage[12], - 2, - ); - final initialShake = tester - .widget( - find.byKey(const ValueKey('bee-refresh-eyes-emoji-shake')), - ) - .transform - .storage[12]; - await tester.pump(const Duration(milliseconds: 35)); - final movedShake = tester - .widget( - find.byKey(const ValueKey('bee-refresh-eyes-emoji-shake')), - ) - .transform - .storage[12]; - expect(movedShake, isNot(closeTo(initialShake, 0.01))); - expect(movedShake.abs(), lessThanOrEqualTo(0.75)); - await tester.pump(const Duration(milliseconds: 105)); - expect(hapticCalls, hasLength(3)); - expect(hapticCalls.last.arguments, 'HapticFeedbackType.selectionClick'); - - final secondGesture = await tester.startGesture( - tester.getCenter(find.byType(ListView)), - pointer: 2, - ); - await secondGesture.moveBy( - const Offset(0, 40), - timeStamp: const Duration(milliseconds: 800), - ); - await gesture.up(); - await tester.pump(); - expect( - find.byKey(const ValueKey('bee-refresh-eyes-emoji')), - findsOneWidget, - ); - expect(hapticCalls, hasLength(3)); - - await secondGesture.moveBy( - const Offset(0, 80), - timeStamp: const Duration(milliseconds: 900), - ); - await tester.pump(); - expect( - find.byKey(const ValueKey('bee-refresh-eyes-emoji')), - findsOneWidget, - ); - expect(hapticCalls, hasLength(3)); - - await secondGesture.up(); - await tester.pump(); - final hapticsAfterRelease = hapticCalls.length; - await tester.pump(const Duration(milliseconds: 300)); - - expect(tester.widget(beeFinder).eyeProgress, isNull); - expect(find.byKey(const ValueKey('bee-refresh-eyes-emoji')), findsNothing); - expect(hapticCalls, hasLength(hapticsAfterRelease)); - - refreshCompleter.complete(); - await tester.pumpAndSettle(); - }); - - testWidgets('keeps expressive eyes hidden for a quick refresh flick', ( - tester, - ) async { - final hapticCalls = []; - TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger - .setMockMethodCallHandler(SystemChannels.platform, (call) async { - if (call.method == 'HapticFeedback.vibrate') hapticCalls.add(call); - return null; - }); - addTearDown( - () => TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger - .setMockMethodCallHandler(SystemChannels.platform, null), - ); - final refreshCompleter = Completer(); - var refreshes = 0; - await tester.pumpWidget( - WidgetHelpers.testable( - child: BeeRefreshIndicator( - onRefresh: () { - refreshes++; - return refreshCompleter.future; - }, - child: ListView(children: const [SizedBox(height: 800)]), - ), - ), - ); - - final gesture = await tester.startGesture( - tester.getCenter(find.byType(ListView)), - ); - final beeFinder = find.byType(FlappingBee); - for (var step = 0; step < 10; step++) { - await gesture.moveBy( - const Offset(0, 50), - timeStamp: Duration(milliseconds: (step + 1) * 10), - ); - await tester.pump(const Duration(milliseconds: 10)); - if (beeFinder.evaluate().isNotEmpty) { - expect(tester.widget(beeFinder).eyeProgress, isNull); - expect( - find.byKey(const ValueKey('bee-refresh-eyes-emoji')), - findsNothing, - ); - } - } - - await gesture.up(); - await tester.pump(); - await tester.pump(const Duration(milliseconds: 300)); - - expect(refreshes, 1); - expect(hapticCalls, hasLength(1)); - expect(hapticCalls.single.arguments, 'HapticFeedbackType.mediumImpact'); - expect(tester.widget(beeFinder).eyeProgress, isNull); - expect(find.byKey(const ValueKey('bee-refresh-eyes-emoji')), findsNothing); - - refreshCompleter.complete(); - await tester.pumpAndSettle(); - }); - - testWidgets('keeps the bee static when motion is disabled', (tester) async { - await tester.pumpWidget( - MediaQuery( - data: const MediaQueryData(disableAnimations: true), - child: WidgetHelpers.testable( - child: Builder( - builder: (context) => MediaQuery( - data: MediaQuery.of(context).copyWith(disableAnimations: true), - child: BeeRefreshIndicator( - onRefresh: () async {}, - child: ListView(children: const [SizedBox(height: 800)]), - ), - ), - ), - ), - ), - ); - - await tester.timedDrag( - find.byType(ListView), - const Offset(0, 160), - const Duration(milliseconds: 400), - ); - await tester.pump(); - - final bee = tester.widget(find.byType(FlappingBee)); - expect(bee.flapAmount, 0); - }); - - testWidgets('provides elastic always-scrollable physics', (tester) async { - late ScrollPhysics physics; - - await tester.pumpWidget( - WidgetHelpers.testable( - child: BeeRefreshIndicator( - onRefresh: () async {}, - child: Builder( - builder: (context) { - physics = ScrollConfiguration.of( - context, - ).getScrollPhysics(context); - return ListView(children: const [SizedBox(height: 20)]); - }, - ), - ), - ), - ); - - expect(physics, isA()); - expect(physics.parent, isA()); - }); -} diff --git a/mobile/test/shared/widgets/brand_refresh_indicator_test.dart b/mobile/test/shared/widgets/brand_refresh_indicator_test.dart new file mode 100644 index 00000000000..088ea2ff0dc --- /dev/null +++ b/mobile/test/shared/widgets/brand_refresh_indicator_test.dart @@ -0,0 +1,280 @@ +import 'dart:async'; + +import 'package:buzz/shared/widgets/brand_refresh_indicator.dart'; +import 'package:buzz/shared/widgets/fivedive_mark.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../helpers/widget_helpers.dart'; + +void main() { + testWidgets('shows the 5dive mark while pulling to refresh', (tester) async { + const contentKey = ValueKey('loading-content'); + var refreshes = 0; + final refreshCompleter = Completer(); + + await tester.pumpWidget( + WidgetHelpers.testable( + child: BrandRefreshIndicator( + onRefresh: () { + refreshes++; + return refreshCompleter.future; + }, + child: ListView( + children: const [SizedBox(key: contentKey, height: 800)], + ), + ), + ), + ); + + final listFinder = find.byType(ListView); + final restingTop = tester.getTopLeft(listFinder).dy; + final restingContentTop = tester.getTopLeft(find.byKey(contentKey)).dy; + await tester.timedDrag( + listFinder, + const Offset(0, 320), + const Duration(milliseconds: 500), + ); + await tester.pump(const Duration(milliseconds: 16)); + await tester.pump(const Duration(milliseconds: 300)); + + final markFinder = find.byType(FiveDiveMark); + final loadingTop = tester.getTopLeft(listFinder).dy; + final loadingContentTop = tester.getTopLeft(find.byKey(contentKey)).dy; + final gapTransform = tester.widget( + find.byKey(const ValueKey('brand-refresh-retained-gap')), + ); + expect(markFinder, findsOneWidget); + expect(refreshes, 1); + expect(gapTransform.transform.getTranslation().y, closeTo(72, 1)); + expect(loadingTop - restingTop, closeTo(72, 1)); + final loadingMarkRect = tester.getRect(markFinder); + final loadingGap = loadingContentTop - restingContentTop; + expect( + loadingMarkRect.center.dy, + closeTo( + restingContentTop + + (loadingGap - loadingMarkRect.height) * 0.75 + + loadingMarkRect.height / 2, + 1, + ), + ); + + refreshCompleter.complete(); + await tester.pump(); + await tester.pump(const Duration(milliseconds: 90)); + + final closingTop = tester.getTopLeft(listFinder).dy; + expect(closingTop, greaterThan(restingTop)); + expect(closingTop, lessThan(loadingTop)); + + await tester.pumpAndSettle(); + expect(tester.getTopLeft(listFinder).dy, closeTo(restingTop, 1)); + expect(markFinder, findsNothing); + }); + + testWidgets('reveals and arms the mark across an active pull', ( + tester, + ) async { + tester.view.physicalSize = const Size(420, 912); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + final hapticCalls = []; + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(SystemChannels.platform, (call) async { + if (call.method == 'HapticFeedback.vibrate') hapticCalls.add(call); + return null; + }); + addTearDown( + () => TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(SystemChannels.platform, null), + ); + + const contentKey = ValueKey('pull-content'); + final refreshCompleter = Completer(); + await tester.pumpWidget( + WidgetHelpers.testable( + child: BrandRefreshIndicator( + onRefresh: () => refreshCompleter.future, + child: ListView( + children: const [SizedBox(key: contentKey, height: 800)], + ), + ), + ), + ); + + final restingContentTop = tester.getTopLeft(find.byKey(contentKey)).dy; + final gesture = await tester.startGesture( + tester.getCenter(find.byType(ListView)), + pointer: 1, + ); + await gesture.moveBy(const Offset(0, 12)); + await tester.pump(); + + final markFinder = find.byType(FiveDiveMark); + expect(markFinder, findsNothing); + expect( + tester.getTopLeft(find.byKey(contentKey)).dy, + greaterThan(restingContentTop), + ); + + await gesture.moveBy(const Offset(0, 44)); + await tester.pump(); + + final earlyTop = tester.getTopLeft(markFinder).dy; + final partialOpacity = tester.widget( + find.byKey(const ValueKey('brand-refresh-opacity')), + ); + expect(partialOpacity.opacity, greaterThan(0)); + expect(partialOpacity.opacity, lessThan(1)); + final partialScale = tester + .widget(find.byKey(const ValueKey('brand-refresh-scale'))) + .transform + .storage[0]; + expect(partialScale, greaterThan(0.6)); + expect(partialScale, lessThan(1)); + expect(hapticCalls, isEmpty); + + await gesture.moveBy(const Offset(0, 120)); + await tester.pump(); + + final pulledContentTop = tester.getTopLeft(find.byKey(contentKey)).dy; + expect(tester.getTopLeft(markFinder).dy, greaterThan(earlyTop)); + final pulledMarkRect = tester.getRect(markFinder); + final pulledGap = pulledContentTop - restingContentTop; + expect( + pulledMarkRect.center.dy, + closeTo( + restingContentTop + + (pulledGap - pulledMarkRect.height) * 0.75 + + pulledMarkRect.height / 2, + 1, + ), + ); + + await gesture.moveBy(const Offset(0, 120)); + await tester.pump(); + + expect( + tester + .widget(find.byKey(const ValueKey('brand-refresh-scale'))) + .transform + .storage[0], + closeTo(1, 0.001), + ); + expect(hapticCalls, hasLength(1)); + expect(hapticCalls.single.arguments, 'HapticFeedbackType.mediumImpact'); + + // Pulling further does not add a second arm haptic. + await gesture.moveBy(const Offset(0, 240)); + await tester.pump(); + expect(hapticCalls, hasLength(1)); + + await gesture.up(); + await tester.pump(); + refreshCompleter.complete(); + await tester.pumpAndSettle(); + }); + + testWidgets('pulses the mark while the refresh is in flight', (tester) async { + final refreshCompleter = Completer(); + await tester.pumpWidget( + WidgetHelpers.testable( + child: BrandRefreshIndicator( + onRefresh: () => refreshCompleter.future, + child: ListView(children: const [SizedBox(height: 800)]), + ), + ), + ); + + await tester.timedDrag( + find.byType(ListView), + const Offset(0, 320), + const Duration(milliseconds: 500), + ); + await tester.pump(const Duration(milliseconds: 16)); + await tester.pump(const Duration(milliseconds: 300)); + + double scale() => tester + .widget(find.byKey(const ValueKey('brand-refresh-scale'))) + .transform + .storage[0]; + + final first = scale(); + await tester.pump(const Duration(milliseconds: 220)); + final second = scale(); + expect(second, isNot(closeTo(first, 0.005))); + expect(second, lessThanOrEqualTo(1.0)); + expect(second, greaterThanOrEqualTo(0.88 - 0.001)); + + refreshCompleter.complete(); + await tester.pumpAndSettle(); + }); + + testWidgets('keeps the mark static when motion is disabled', (tester) async { + final refreshCompleter = Completer(); + await tester.pumpWidget( + MediaQuery( + data: const MediaQueryData(disableAnimations: true), + child: WidgetHelpers.testable( + child: Builder( + builder: (context) => MediaQuery( + data: MediaQuery.of(context).copyWith(disableAnimations: true), + child: BrandRefreshIndicator( + onRefresh: () => refreshCompleter.future, + child: ListView(children: const [SizedBox(height: 800)]), + ), + ), + ), + ), + ), + ); + + await tester.timedDrag( + find.byType(ListView), + const Offset(0, 320), + const Duration(milliseconds: 400), + ); + await tester.pump(const Duration(milliseconds: 16)); + await tester.pump(const Duration(milliseconds: 300)); + + double scale() => tester + .widget(find.byKey(const ValueKey('brand-refresh-scale'))) + .transform + .storage[0]; + + expect(find.byType(FiveDiveMark), findsOneWidget); + final resting = scale(); + expect(resting, closeTo(1, 0.001)); + await tester.pump(const Duration(milliseconds: 220)); + expect(scale(), closeTo(resting, 0.001)); + + refreshCompleter.complete(); + await tester.pumpAndSettle(); + }); + + testWidgets('provides elastic always-scrollable physics', (tester) async { + late ScrollPhysics physics; + + await tester.pumpWidget( + WidgetHelpers.testable( + child: BrandRefreshIndicator( + onRefresh: () async {}, + child: Builder( + builder: (context) { + physics = ScrollConfiguration.of( + context, + ).getScrollPhysics(context); + return ListView(children: const [SizedBox(height: 20)]); + }, + ), + ), + ), + ); + + expect(physics, isA()); + expect(physics.parent, isA()); + }); +} From 67e02230f60d82fc5c70201739f7e19cc78e5916 Mon Sep 17 00:00:00 2001 From: lodar Date: Tue, 18 Aug 2026 22:04:27 +0000 Subject: [PATCH 2/2] DIVE-3597: join the 80-char expect back to one line (dart format tall style drops the trailing comma when it fits) --- mobile/test/shared/theme/buzz_theme_test.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/mobile/test/shared/theme/buzz_theme_test.dart b/mobile/test/shared/theme/buzz_theme_test.dart index fba4c735d62..ad23a44f4f9 100644 --- a/mobile/test/shared/theme/buzz_theme_test.dart +++ b/mobile/test/shared/theme/buzz_theme_test.dart @@ -37,10 +37,7 @@ void main() { expect(paired, isNot(contains(buzzDarkThemeName))); expect(pairedThemeLabel(buzzThemeName), '5dive'); expect(themeSelectionLabel(buzzThemeName, ThemeMode.system), '5dive'); - expect( - themeSelectionLabel(buzzDarkThemeName, ThemeMode.system), - '5dive', - ); + expect(themeSelectionLabel(buzzDarkThemeName, ThemeMode.system), '5dive'); }); test('forces neutral rendering without changing the stored accent', () {