From a74ccdf25e35b960bc15854fabcefe5eeffb74c6 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 17 Jan 2025 15:07:43 -0500 Subject: [PATCH] Add backup support for direct story reply revisions. --- ..._direct_story_reply_with_edits_00.binproto | Bin 0 -> 689 bytes ..._direct_story_reply_with_edits_01.binproto | Bin 0 -> 1037 bytes ..._direct_story_reply_with_edits_02.binproto | Bin 0 -> 890 bytes ..._direct_story_reply_with_edits_03.binproto | Bin 0 -> 1040 bytes ..._direct_story_reply_with_edits_04.binproto | Bin 0 -> 861 bytes ..._direct_story_reply_with_edits_05.binproto | Bin 0 -> 1078 bytes ..._direct_story_reply_with_edits_06.binproto | Bin 0 -> 784 bytes ..._direct_story_reply_with_edits_07.binproto | Bin 0 -> 1025 bytes ..._direct_story_reply_with_edits_08.binproto | Bin 0 -> 797 bytes ..._direct_story_reply_with_edits_09.binproto | Bin 0 -> 866 bytes ..._direct_story_reply_with_edits_10.binproto | Bin 0 -> 685 bytes ..._direct_story_reply_with_edits_11.binproto | Bin 0 -> 904 bytes ..._direct_story_reply_with_edits_12.binproto | Bin 0 -> 670 bytes ..._direct_story_reply_with_edits_13.binproto | Bin 0 -> 892 bytes .../backup/v2/ArchiveImportExportTests.kt | 5 ++++ .../securesms/backup/v2/ArchiveErrorCases.kt | 8 +++-- .../v2/exporters/ChatItemArchiveExporter.kt | 28 +++++++++++++----- 17 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_00.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_01.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_02.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_03.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_04.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_05.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_06.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_07.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_08.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_09.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_10.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_11.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_12.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_13.binproto diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_00.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_00.binproto new file mode 100644 index 0000000000000000000000000000000000000000..754aa762db93f7feccf217c0be4951e128ab396c GIT binary patch literal 689 zcmea}U=+CVYr*{QhEfXsyKEj#$*x#(ig%Lc-3T4SDnN=53x$z@T~eE!J@?C1T;m9#SLhTl_rk?tZezH8@o%F+$t_T-1YmD}2wTN(wQD2D?ZwdU*l8%qYRAz^K7!z-Tc+#)&b} zi80BEG1-GLfH8tGfiZ)zfU$zHfswI;k!cnqI|rjE0|Uc<5Q_=O`VVF?i!%IY_|GQ9 z!ojG;0HTmKnoIB;1A_xY14I#{5V{DH z!qi81{#$z~T#qfqi=tQ^b25`tlURduGfOgx6j@)DwyyTieK^tT8|(bctz4IKLf5NT zK9;^0aqq+~u{be5D+UfJHV!5MmH@`Bj7pmrK}?As_YN;@Ff=LzbLLJu0OU9caZCm? z1m=J#P;kv+^yl*B^5*hP$xKcxQ7FqSDJ@7XN-RlKC{6@2QcDyv^D=WYlS_*giZWAD z^NJO65|i?aQi~Om^Ye;RlS@)dN{bYVGxO3*b25t+Qc5#{w!8z|E$|&oL2QxblID`+ b5-%-LNG?sv%*jkt$SN%^$p@K|UYZI3w8Z2O literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_01.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_01.binproto new file mode 100644 index 0000000000000000000000000000000000000000..ab070129e7d428593653435aefa2850245c6e468 GIT binary patch literal 1037 zcmaJ z^M2yyF2)|TDRDVUC)<*3t^XiWRpKImKLLnvWb)`QC-m<88;47&nYU;6&(5#pHyn3zb&6OUQJtf#~PsBcFA&$CHQKXW!j8^U^~D zB!LI->YLm8efdbw9Jx)a+dQx#1_}ic8N>hrt3eyc?Ove+tOG*_W*+o|LGU;j0Yxwd z#sSy~A|Rtfa zb3l=`9pX1!J|{^JNaJA>(EiIr(5vUZtK3&W-#i-p@7Wq%Z&Q;P(E*3@5$}%Zh2Z(4 zea_-!=hf&G{Q%C}o8N1BYU%d!VEN>+rpKCkJ0&GvuS8V2A56-Lm&Mqs9Gkte_oMyk z^l0sJ`N(c@(KY4A8c=_&mFl`mpbz%IO|aXdCg$i#%7Y^DFvrNp0uYX@<2$y}e9obbRyK6Qr!oBGHKXnI@C^0&~kK{+2Y8@oQ|1yu5abXSyOu{0=A%O0uBrbXs%y%HP(5@D0~KH%cEJry zq@WCO;uM*O988%PI8`++GCIg&b}fcQhD1Wq>55EDY@CZ3sB4lUXTIK`oT%+l{i0S% zU>d}iL;2Fwo^kQq_Fez$;ENdqUA5WrQ0)B_MYsJ xD#g{af4rV=)<0c8ak4jiXjQqKQ2o>M6XRDGXU=@JDc|e_J68X2>YWek{|1PTX6*m~ literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_02.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_02.binproto new file mode 100644 index 0000000000000000000000000000000000000000..ff5146e13e49aac56834879277c673c48804f193 GIT binary patch literal 890 zcmaJ;TWkzb7@mK2x5kOf7-_BL;aJyJtajVoUWl+Rt1Hz?D_xD-%W@R-* zMcjhWR!JLG*AO0v@IXDdJh-KeNU#kW)sVO~BB4T9vs({%aB`CG`@i$&`@eHe2?u=q z+tIfE91Greb!N|jwXu`;hBjnAzfg8;GCOGe;K!Aoo(W4P9a;7CqILKJMVT9-MAop~ zmTk+<`a{S`3Vndy0m33%f9}IASMkEu6D>J+PjxhRJXAjKu)hrUR`xN`uDCEnQY3Lz zfM}Y{>9jZzCe_Q;2g5G#rr!3A9`~n%_en+nt}WwtroTy#PxxVL6nOCl9A_T6M(w(3 zGRKQ+KbnnJqf2+mGA__>uj_(FKwVd<&rrys#RAPy;cj1K0^{3k>2Qone?nlCe5V zq?jR{Nic~t!N@@tlLXezj1?@L!J2`1z5TCcVaPKf%5WGW9+Ef^VRdK=w#t~A_JU-ZS)MlYj>p{3_1Z|EJ< z?d`sEHDhJQ;v$B#q;V{7EQ6n{^*fuS=C9qiPSxeu*QJWqhUQ4_H$>V#;R$}~)UQ58q1pU5f>iINf_D)uR|N_-m8q7kf8 zxjGu6D)vXIKBX@;o9|D-z?4^D8G(!++ZyWhZ#wYf=ds;R{9CHutH*5`kXUpL&NylWB~^qpj^T}%{f!1;lXavrK D)50rw literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_03.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_03.binproto new file mode 100644 index 0000000000000000000000000000000000000000..b6b81802564a9b7dc4410a262571e1d3dd37b085 GIT binary patch literal 1040 zcmaJtvY<@0U1rPZ6)yuS0R zvyt0-8GFQ{#Nj9rjYVS}|0u+3g=+wQ4UoPmk=2;%^93`AbySu~P5Ru{z@6(o9Ex3GscdqaHYafv5oNQo$hQ0Y*5g-oU$q94wWz2BJ(M^7Z@X8JC^^5`&$ z;F0?V=eK{mcxqst+@%M$4)=sWE+-;`5I|rZh=KHhl?K2D$Q!`Sf*~*ho&;l{1j=9! z0DFO40nI9Cl_aTJW3ph?It#Q)RjJyfD=O%aY9J@1m3mkWMB1Px+W+;17pg#{( zMSoWOhIh%U@R?$e}MD_y6~74?b*BljMWLHsxdPJ;AH~3#SL| zrK!yC!K3tTc*)v&X6@6yjIAl5xf=)HnNB1o z>zC`N4v34PtKZd$_DdaV>#Bf3H~=@o{sJ{IM^91imxzlwMjjS~a6}zyQ`7g5OAEyD zkcIQiB_1-F;}Me+?z_mNPSLlhhYCJT?5JD*+OTXlHwKDKMRrsaE-IYbl)vWbJ8f=dzRlS199tN+$e*VU^H^@dv`P!48cFYI9= z1!ag6yTn{%W6E6LuBma6(MAPk)ngRMs7NR}9g&HNjdL*rbxcy?%rjcl3-vu}AJ?G* z-U4tIz&Kptb7cB?YEg{FeUG!++(n=0P2wR2ks?smWE2$GBoOG&MDFCI%dVScO|>A76@zX?8zga zbhaPc-&LNT9%$bj(Po>|OZWcdm3G7MmYJ7_$Jd>i`LmpW6Ra;gVO!3wO=x1xgP;6pd&_8r?)d%j~t!?fPE(zCgI)}&#N*F^dzubgsv!?Ua2QA>1vVT@7D#6h3m z=g<4Y2&9bxK<@xy!XIh z=E&w!T*@U2BII#t;Dg)**&{lU&-CtKR#KW zyniESea?zPPV~4$UJ^>7kM}0|GkDfu{w-&HNrrt3otu<%X&M;V&Mq)E+VuWdE1;Qa! z2~fYH1`48nwK9LU8dOzM5G1oID=Enj1|`lTAxFLPu5I3j-FrWe+oaK$SBl?$+39Y3 VF}u6>a$d>L7Vp&89T%^=egWZ@8tec7 literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_05.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_05.binproto new file mode 100644 index 0000000000000000000000000000000000000000..e0a88e89a164621cefc1c211e9c0c6f11299eb01 GIT binary patch literal 1078 zcmaJ88pUEC3;_`mUo;QeYJwEh)SqA)6kD~l)utfS_3lg`)CY%w z^W8Ha=X~dz+o=L=@y}xu*P0{fwV7?phX;n<~GJ2Fe$M)ipQE_O^yE`nk&Rb0Dl1xVR`iAZ*$3x_SYv%&8Oa;KRSPgU41Ej zuCUT`QS#0%>T5DAgZJbJ=dqTSNDD+H-|v1=JEetIW}i>(ymI6-vg_Kxy&DeHov&Nm zcs(|zYxpDZru1d<)`K61!iycxUJ5HwB`H)Il{O)hXn^R~*}^CHZi&Pux6Hq@^VBO3 zrb!g{-rcp(_rubO&INLtUbQ>DBMee05gCL50(XHX&^od{32+i*lE7#O-Jlmd2@0SH zhQKfY2Y_4xH7cl+B&l4fWKoss}r{a;T+4p;35 z`inqS^cTcuxNbp`?w5vxCZPY9kfa7!=u_HRxfhqHCC*OPNgsL6AjkY-b&cFdr1^rmy}-psuSI0`>YTqv?Qb_TJt6crstZRC&~ zb1a(0VxPgBdbPN~A*2YDH5r8jRtp3-P!=d@;(zInMQ`C`h~G1`*`;|Ko129NwG(P? zfcI?gvrWAft|jEDf}PIo%D1tBhojn>#80tQ-?7=%=iVL3eUm=js7cdHKklvBmui@t PzC1p)y0vL;|5*RuCYEm) literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_06.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_06.binproto new file mode 100644 index 0000000000000000000000000000000000000000..2ec2a65ba34af8365ac670f21af395891a3d5eab GIT binary patch literal 784 zcmea}U=+CVYr*{QhEfXsyKEj#$*x#(ig%Lc-3T4SDnN=53x$z@T~eE!J@?C1T;m9#SLhTl_rk?tZezH8@o%F+$t_T-1YmD}2wTN(wQD2D?ZwdU*l8%qYRAz^K7!z-Tc+#)&b} zi80BEG1-GLfH8tGfiZ)zfU$zHfswI;k!cnqI|rjE0|Uc<5Q_=O`VVF?i!%IY_|GQ9 z!ojG;0HTmKnoIB;1A_xY14I#{5V{DH z!qi81{#$z~T#qfqi=tQ^b25`tlURduGfOgx6j@)DwyyTieK^tT8|(bctz4IKLf5NT zK9;^0aqq+~u{be5D+UfJHV!5MmH@^nOiB}(Kun1r_YN;@Ff=LzbLLJu0OU9caZCm? z1m=J#P;kv+^yl*B^5*hP$xKcxQ7FqSDJ@7XN-RlKC{6@2QcDyv^D=WYlS_*giZWAD z^NJO65|i?aQi~Om^Ye;RlS@)dN{bYVGxO3*b25t+Qc5#{w!8z|E$|&oL2Rkvs^XI5 z5-%-LNG?sv%*jkt$SN%^$p@K|UYaTtt0Y{KT2Z23pguL1>;UY^4EX>6 literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_07.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_07.binproto new file mode 100644 index 0000000000000000000000000000000000000000..2479b2e97f8839679433bd82757d4e690b8d4852 GIT binary patch literal 1025 zcmaJxfA52_ti=uZ_mADMxF90GekDd7KjM3Hk-jPz<)Q8gtr_Zu$ZzL`h z7PeoOydTQ?tr?cVyZQ;|@%Hv;J47VE)BUdQq!wP7d^xpw>D{l%*6Vv-T{YTpsiD03 zW_(=N@aN#Lbk4YA&*^Za-1X9xh!Rr_q0*uxg-pj9h<=?ce6fCAG=5~=^s&uTZ#|wS zG2C~5&&-aW=Z<&JkURCzw)Cb5NToz%5CI6>2U@{~y-fzd2FMs7+X;F>A9xNFKoJaq zVE{&fTmrQ!XpkhSQbn>r6(5Bfq>5Cj(G?Z6NYx@Iq$WM8hGLCS6Yc-{qH-kkI?#6m zRncD&zhV81Bt0Sx2Tef#FC(J^7iKFDrO^3jy#GBr!jGCXOETfKMR~zl8D8{8PV`vw zV;z5nC+Mf}thw#u<`)<4n(LeU@>JuqjZbw*YP3d`HKiAfD6!YX*qRcVzBc~Z!9-%v zzbqZ!D=vnvUi5+XyI-p7DuEu@4WEErIhw^By+FBFBo5{nxmW)7&+1}5{gb+WMX3DT+Bf2EGcs48g=R!e~;QXekp;Y zAX*QVD--*M#dF(#^RGj1wj%)F2Cxk_ld3**G86^N#KMXdh1{UWa)^3WHbc2yqe_~B zWc}&b?VJqp2Zq+VG;d>bZPCQk)(yCVkmn0_x_@gv$p)U(LXpYY^UGHsjA^6a4%`@B oSW2xtHd4Q3_t2m&=FmuDxgdxz>-SMiy)T2Dz>% literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_08.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_08.binproto new file mode 100644 index 0000000000000000000000000000000000000000..64a55aebbb0b530f7e59693c4d86c1350b1ce4e1 GIT binary patch literal 797 zcmaJ;Ur19?9KOH1JH1`{bG&-D*r4@!$grv@3x~mxZS&U?_x#J zA}Xb#{1+stnMr{UNzjYFR6dl25<<18B=xC(B0(8}t-IMn_0ZwK_x--}vj06)$RBGgYhF_<%e(vpODeKi z@-6wfe+bruFb~{E;E+hS4SgPSmX-DlbX&&jhnP z)ovrWT-uev2naSqK5W07;RMkMZYOw3p%QAL0eldI2t)x|fbND=77P?c#S@IySUkye z1}aX)Qv`;ETq*&yjmi*Atj?Uy@ml*|%S0P>XF)g(EF+xMj=8i+irPsiyuJ_p5`QdpX2Dxse?_tFV!{60N47`57tB#WN*`&!`?*p4LOuO%VzT-{K?m2-Q! zGB5FnDmqHka1e(?RYZ!Y5v(F2kpS_86%-;~EGft@y5$g7kVlpj>`}2A4k3j|O<_M# zkT*=UDf7wM{9+Q8r?h}6jbj%2+N0VxbuRtvKW|6BrM8P&+^%Jb<{G#{E+^<0RawFT zG@)8sb$wWdS+$e_v#4BnsWGy6-g%pLkC3`UTtR1|$Fg literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_09.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_09.binproto new file mode 100644 index 0000000000000000000000000000000000000000..3f49b0a2468c635f2abdb04d318b243d925897a9 GIT binary patch literal 866 zcmaJbi*`E6tQe}_Uc}mADy452r{Bl z2>P)C7s|?_pob*rMSCe9%1Vi#+NdNGBCVwVAc*bm>`V2~<-+;SxrgsN-{Dqs;7$BI z*Y~5?kB$zmnmD;**Ts8tP87Txs6C(0W-gxfq#-)s{9h+>JVeDrKVRl51NG+|{ zvVx_h{!$*{wr2BT)_~VDIkY#t;q&SHc*~FO{foP@r?L}yzk)r2SGolkn8)J$?%N(; zqH51apF7|dDNCWdg3^=~@aX+e?9TEMf3Uw~^zw$0BkSvMKx$l8GuHHK{7Us0ULd&Y z>&kr)4pYnE0|ZN<2v!`+6+sdqB7$5Awa^ILAqMTR3pxS1fQ>^Y2iXk6BvXi`DCrG5#7Khl6B3*vV|?%Kqk@JY=xL8 zYLig2Bl#sQnZ-?|CDS9sVKu*sFXLC3M70%U=~SrAkg!aUW~&{xq^5Xf#WsnqVOqdQ z#hRo=4T2=AgR(0Q``0wPz)h#w(`so$VZM^D;LCODg6PP?YP)VARU*1!t0^{%dQ?$V sR~#Er+)5qNPK|of>BcQO1JPvMZt13&#SJ@q^geJx9O$q3*mt7yH*9Dtj{pDw literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_10.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_10.binproto new file mode 100644 index 0000000000000000000000000000000000000000..45d13ef66cde75ea8e54f4029021fb7eaec2302a GIT binary patch literal 685 zcmea}U=+CVYr*{QhEfXsyKEj#$*x#(ig%Lc-3T4SDnN=53x$z@T~eE!J@?C1T;m9#SLhTl_rk?tZezH8@o%F+$t_T-1YmD}2wTN(wQD2D?ZwdU*l8%qYRAz^K7!z-Tc+#)&b} zi80BEG1-GLfH8tGfiZ)zfU$zHfswI;k!cnqI|rjE0|Uc<5Q_=O`VVF?i!%IY_|GQ9 z!ojG;0HTmKnoIB;1A_xY14I#{5V{DH z!qi81{#$z~T#qfqi=tQ^b25`tlURduGfOgx6j@)DwyyTieK^tT8|(bctz4IKLf5NT zK9;^0aqq+~u{be5D+UfJHV!5MmH@_$j7sYmK}?As_YN;@Ff=LzbLLJu0OU9caZCm? z1m=J#P;kv+^yl*B^5*hP$xKcxQ7FqSDJ@7XN-RlKC{6@2QcDyv^D=WYlS_*giZWAD z^NJO65|i?aQi~Om^Ye;RlS@)dN{bYVGxO3*b25t+Qc5#{w!8z|E$|&oL2Qwf669j} YFn>}5FqWqL{kO2&Oo34dC@`@X07Hi4ng9R* literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_11.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_11.binproto new file mode 100644 index 0000000000000000000000000000000000000000..e8e29ac2d79d04b4a2934f6dbe77f3bc6b6bf57a GIT binary patch literal 904 zcmaJj7=se3-VVv{-Zt35%%Bylj|;g%Wl-dv?;HbJ24Niy$K^ zCA*jwxKL&n3VJAlUaXhup{$e$Dx;Fjm+o{Ag4$-!d8r;62L5lp`T4&2ex_0Y|L~6! zz26Ii_+bB{(eBMHr*BU@ocHWvb>A$0-1PAeYh$A`R?R%V;mM`Yq*7g9rck0;I1(-h z7v%pz6sC#yfZhPY65o0L-Hm8P`LR>U!hth`J%ji4uX`ge8pmqibN1t5aY9^=OB*&3 z%L*421&a_S4fW=|%!_{C*p=!x0J~g=OO&|O5@G>^Mc`1^9IkB4RkE8At9-5PSw!b=OgDThsYGs zv!D+UEmCS$;2H(xKkjP5IIF3j3GHg%+K z4nH*dZzkFCF0j=#=!hl2C;z z(F#{@0DuUt#_2}xLt7NKIaz@)0JU`uC44TeNyiZxqpwk0*KD=W51b&W8B zV3lZ+mM|!mtY)UJIO<f2X@ T!KFI)v#B3(DPCkfodT4SDnN=53x$z@T~eE!J@?C1T;m9#SLhTl_rk?tZezH8@o%F+$t_T-1YmD}2wTN(wQD2D?ZwdU*l8%qYRAz^K7!z-Tc+#)&b} zi80BEG1-GLfH8tGfiZ)zfU$zHfswI;k!cnqI|rjE0|Uc<5Q_=O`VVF?i!%IY_|GQ9 z!ojG;0HTmKnoIB;1A_xY14I#{5V{DH z!qi81{#$z~T#qfqi=tQ^b25`tlURduGfOgx6j@)DwyyTieK^tT8|(bctz4IKLf5NT zK9;^0aqq+~u{be5D+UfJHV!5MmH@^@j7swvK}?As_YN;@Ff=LzbLLJu0OU9caZCm? z1m=J#P;kv+^yl*B^5*hP$xKcxQ7FqSDJ@7XN-RlKC{6@2QcDyv^D=WYlS_*giZWAD z^NJO65|i?aQi~Om^Ye;RlS@)dN{bYVGxO3*b25t+Qc5#{w!8z|E$|&oL2Tg?;`lIs KV(*9f{rdm}W#Bjf literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_13.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_13.binproto new file mode 100644 index 0000000000000000000000000000000000000000..189445621f32638d8822098565eb3f48150faec4 GIT binary patch literal 892 zcmaJ!?_QyB%4ML5R&5!!wFmTVDxtufSGSvcj`+lBI z|0wh0LtW(q$2M&_e{cMe;+LJZXNvgI)5bhm6&skoV#cZU&#wk1ROtF5g%ZuepEK7U@^bQb~__mG@x1v>*C(otI?q29=?|Gzu+Z!5e8d~*{v!C^eGqu2{@}UUJr|eWJ+P#X1f+&pHNC4}^oQtO!d6AcX!mN18tG-o;1CN9x3%#inb0->2K)2 z(^aspV0nZS{G$Zk>#l{QD=@-mp|9uL(d+G@P>XZ;eCaSdL`C7X1H7M{k{wqHYEU&= zhN==&mMpxPT6QxrBum1k!~n4{)u>8k+r$P<5Y5Dj6xR)6Vp-QrB3s0=4Qx`a(N?I5 z6E+R4aV)>&Ec1jnIm_G=QZOHtqX?R7Qq@+lr8A>OLn1Q8nyt3jlA6_(72Bk`Mi@b` zN;FAJ7!*rZ3sYAd^{+W~QFxnE&$;CS#ZV=xK#O&jg6h~JYO`)&Rie6Kt64RRWmIuO zSDY9LvXLcZof^xevx!^m4OEj!v!$ESJmHozNACltqyYOTBKL6mNRs`wVJ&F^ literal 0 HcmV?d00001 diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/ArchiveImportExportTests.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/ArchiveImportExportTests.kt index 2530d65631..0887335bc7 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/ArchiveImportExportTests.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/ArchiveImportExportTests.kt @@ -81,6 +81,11 @@ class ArchiveImportExportTests { runTests { it.startsWith("chat_item_direct_story_reply_") } } +// @Test + fun chatItemDirectStoryReplyMessageWithEdits() { + runTests { it.startsWith("chat_item_direct_story_reply_with_edits_") } + } + // @Test fun chatItemExpirationTimerUpdate() { runTests { it.startsWith("chat_item_expiration_timer_update_") } diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt index f2e62e926c..7a04bed8da 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt @@ -58,8 +58,12 @@ object ExportSkips { */ object ExportOddities { - fun revisionsOnNonStandardMessage(sentTimestamp: Long): String { - return log(sentTimestamp, "Attempted to set revisions on a non-standard message. Ignoring revisions.") + fun revisionsOnUnexpectedMessageType(sentTimestamp: Long): String { + return log(sentTimestamp, "Attempted to set revisions on message that doesn't support it. Ignoring revisions.") + } + + fun mismatchedRevisionHistory(sentTimestamp: Long): String { + return log(sentTimestamp, "Revisions for this message contained items of a different type than the parent item. Ignoring mismatched revisions.") } fun outgoingMessageWasSentButTimerNotStarted(sentTimestamp: Long): String { diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt index 33c781038c..3e6910bb38 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt @@ -325,14 +325,7 @@ class ChatItemArchiveExporter( } if (record.latestRevisionId == null) { - val previousEdits = revisionMap.remove(record.id) - if (previousEdits != null) { - if (builder.standardMessage != null) { - builder.revisions = previousEdits - } else { - Log.w(TAG, ExportOddities.revisionsOnNonStandardMessage(record.dateSent)) - } - } + builder.revisions = revisionMap.remove(record.id)?.repairRevisions(builder) ?: emptyList() buffer += builder.build() } else { var previousEdits = revisionMap[record.latestRevisionId] @@ -1331,6 +1324,25 @@ private fun ExecutorService.submitTyped(callable: Callable): Future { return this.submit(callable) } +fun List.repairRevisions(current: ChatItem.Builder): List { + return if (current.standardMessage != null) { + val filtered = this.filter { it.standardMessage != null } + if (this.size != filtered.size) { + Log.w(TAG, ExportOddities.mismatchedRevisionHistory(current.dateSent)) + } + filtered + } else if (current.directStoryReplyMessage != null) { + val filtered = this.filter { it.directStoryReplyMessage != null } + if (this.size != filtered.size) { + Log.w(TAG, ExportOddities.mismatchedRevisionHistory(current.dateSent)) + } + filtered + } else { + Log.w(TAG, ExportOddities.revisionsOnUnexpectedMessageType(current.dateSent)) + emptyList() + } +} + private fun Cursor.toBackupMessageRecord(pastIds: Set, backupStartTime: Long): BackupMessageRecord? { val id = this.requireLong(MessageTable.ID) if (pastIds.contains(id)) {