From 5efa1be3a53e13c43da5bea83b14c701c2e53e70 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 3 Oct 2024 16:42:57 -0400 Subject: [PATCH] Add view-once support to backupsV2. --- .../chat_item_view_once_00.binproto | Bin 0 -> 438 bytes .../chat_item_view_once_01.binproto | Bin 0 -> 534 bytes .../chat_item_view_once_02.binproto | Bin 0 -> 610 bytes .../chat_item_view_once_03.binproto | Bin 0 -> 586 bytes .../chat_item_view_once_04.binproto | Bin 0 -> 608 bytes .../chat_item_view_once_05.binproto | Bin 0 -> 527 bytes .../chat_item_view_once_06.binproto | Bin 0 -> 589 bytes .../chat_item_view_once_07.binproto | Bin 0 -> 518 bytes .../chat_item_view_once_08.binproto | Bin 0 -> 497 bytes .../chat_item_view_once_09.binproto | Bin 0 -> 435 bytes .../chat_item_view_once_10.binproto | Bin 0 -> 532 bytes .../chat_item_view_once_11.binproto | Bin 0 -> 610 bytes .../chat_item_view_once_12.binproto | Bin 0 -> 584 bytes .../chat_item_view_once_13.binproto | Bin 0 -> 610 bytes .../chat_item_view_once_14.binproto | Bin 0 -> 527 bytes .../backup/v2/ArchiveImportExportTests.kt | 7 +++++- .../database/MessageTableArchiveExtensions.kt | 3 ++- .../v2/exporters/ChatItemArchiveExporter.kt | 20 ++++++++++++++++-- .../v2/importer/ChatItemArchiveImporter.kt | 16 ++++++++++++++ app/src/main/protowire/Backup.proto | 7 ++++++ 20 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_00.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_01.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_02.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_03.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_04.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_05.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_06.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_07.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_08.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_09.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_10.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_11.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_12.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_13.binproto create mode 100644 app/src/androidTest/assets/backupTests/chat_item_view_once_14.binproto diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_00.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_00.binproto new file mode 100644 index 0000000000000000000000000000000000000000..2c433064eb001d1dcf3ae0197674be60c8a0751c GIT binary patch literal 438 zcmd<&U=+CVYr*{QhVK};UNdqjBr;80{r0evr^npIvkXrzJv;O4rTnk$MvpQchreSe zy?H~3Cn-NEF+MG|q(slmOv;Q)AvHaw_yXSs0oKR6YrNb)O*@?$^1ZWBxkL1&=na*> zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez^J061Y$_6yEy0VX9Fi8j=N|6A3ka* Ru<%dI#n~nxuTNrR007o$hWr2k literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_01.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_01.binproto new file mode 100644 index 0000000000000000000000000000000000000000..1f5ed550c194cb94ba9f44a06e2b4eb0c3e7d992 GIT binary patch literal 534 zcmd<&U=+CVYr*{QhVK};UNdqjBr;80{r0evr^npIvkXrzJv;O4rTnk$MvpQchreSe zy?H~3Cn-NEF+MG|q(slmOv;Q)AvHaw_yXSs0oKR6YrNb)O*@?$^1ZWBxkL1&=na*> zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez}U>F)W8U0O02&)=j~?$Cq9mQXZ{~P zYACSiPs_#GCX*PGxDvQxl(;f;6Vp@mvkFqvx%{{kj7`iEP1DjW&6AA{EsQLUl2Xi4 z&5eNq21Z87W@(863{nD-$+nqSV`qN*QTU^I)|^K-lmtw&;(yi{Hci@_SNwm1(y?C} MFSadx%_PAH0K)UEp#T5? literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_02.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_02.binproto new file mode 100644 index 0000000000000000000000000000000000000000..680de438ca05f2a1ecbfc50caa5ace1234ac043c GIT binary patch literal 610 zcmd<&U=+CVYr*{QhVK};UNdqjBr;80{r0evr^npIvkXrzJv;O4rTnk$MvpQchreSe zy?H~3Cn-NEF+MG|q(slmOv;Q)AvHaw_yXSs0oKR6YrNb)O*@?$^1ZWBxkL1&=na*> zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez<8cf=?o)~$tbbm;+(gi4ZPU6SU6au z7$z}pW#rn#$TgQyi8C`dF+EkkATM1@AZ_83`+Hw8O8NNv+!fPQ%`|8baM&m2v6mxC z#wX1u!z?U6(bCT|+`in;O*cQ^N7p*sF~TChk}I4`!P3$s#mLgs(9AN;*xb~_)Fjc; z)Y9BCB{j_;In^@7NPtO7AeJRX_Ew2}qX^%>0-JR86-oj#eKi9!KbN|CO`SgXJ0~itElA1qin3r(66jw!Z`wf*56O=BimLvLmv{lcX1;3x literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_03.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_03.binproto new file mode 100644 index 0000000000000000000000000000000000000000..76e25352aee216d36cf584b31436f06d64f2a202 GIT binary patch literal 586 zcmd<&U=+CVYr*{QhVK};UNdqjBr;80{r0evr^npIvkXrzJv;O4rTnk$MvpQchreSe zy?H~3Cn-NEF+MG|q(slmOv;Q)AvHaw_yXSs0oKR6YrNb)O*@?$^1ZWBxkL1&=na*> zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez_^`JX$vEe$tbb$;+(gi4ZQfdcsW=E zZY+Mib)Bga69?lY#wm}F-=LdOiVPl z6kwJTIHllW_kBUsG|?+-_kNoZGet?DW{XQ=Aj literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_04.binproto new file mode 100644 index 0000000000000000000000000000000000000000..8c8e8850d7d8bd35d67966c3ec3df1a24ea5df69 GIT binary patch literal 608 zcmd<&U=+CVYr*{QhVK};UNdqjBr;80{r0evr^npIvkXrzJv;O4rTnk$MvpQchreSe zy?H~3Cn-NEF+MG|q(slmOv;Q)AvHaw_yXSs0oKR6YrNb)O*@?$^1ZWBxkL1&=na*> zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez<8EX=@cW7$tbbu;+(gi4ZL`{xH(t^ z*3Uh)bhV)p!z9Kvj9e=jxu!5Gah7GKq~`1A7MN%Wq%C}MfA1?sDIb5IyJDKEnFb94 z4p(J8y5*x}d{R99BkcWLEh9}r>I#Aag0frnkTDJlonh#gzoURj-1!q>f&P{ArXBR~knD)BsOrCXi5CDvpu~Ov literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_05.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_05.binproto new file mode 100644 index 0000000000000000000000000000000000000000..9c7f97d495c65cd8a6efdbae19fd92d14beeba08 GIT binary patch literal 527 zcmd<&U=+CVYr*{QhVK};UNdqjBr;80{r0evr^npIvkXrzJv;O4rTnk$MvpQchreSe zy?H~3Cn-NEF+MG|q(slmOv;Q)AvHaw_yXSs0oKR6YrNb)O*@?$^1ZWBxkL1&=na*> zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez*wtP4P-D%Y`!?>?Pmio4lXth7A+ zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez_^Q1X*(m3$tbbq;+(gi4ZL`{xH(t^ zZY+Mib)Bge!z9L;j9k+gxf&UjI5Tq-(^K^e^3t^g(iT3szxNfRl#jp9T`^77OoIji zhkarmdpV+Hd^~-vYJ;3C>~-UO^ioV>{q^#)z2l2YJ?-;Tgsi#PDjfYYGYbWnBtFmi zcKV=^l7KM3_i^uuH!}Hs1urPbmH*Td=s2JKtK;z}FU94pf`QEwe;eFd`u`l8l0g5; TdD9Mhcu01{S5)<1yu=Ft_xZnz literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_07.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_07.binproto new file mode 100644 index 0000000000000000000000000000000000000000..f5a7158e4fbb4fe3bb3d708ca6a85a7b159e3beb GIT binary patch literal 518 zcmd<&U=+CVYr*{QhVK};UNdqjBr;80{r0evr^npIvkXrzJv;O4rTnk$MvpQchreSe zy?H~3Cn-NEF+MG|q(slmOv;Q)AvHaw_yXSs0oKR6YrNb)O*@?$^1ZWBxkL1&=na*> zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez*wSG1Y|HuY`r+=?PmioelA`P7J>D1 zPc2<-XvD<9IEgWsE0D`qi8C`dF+Ej3Ju}VWHJitERv{}c){w}m0A~SaiT|IbuXtyu yB%mbM|Hf2l>65ei6M4U;HMwgEte5tj zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez! zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez^JGs4`eV(Y`-|??PmioelA`P7J(a! QUvFJ!YQ@CCIEj$~022a(0{{R3 literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_10.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_10.binproto new file mode 100644 index 0000000000000000000000000000000000000000..cf0fde5d1d9fa558cde6b048c95782c2ddbf787a GIT binary patch literal 532 zcmd<&U=+CVYr*{QhVK};UNdqjBr;80{r0evr^npIvkXrzJv;O4rTnk$MvpQchreSe zy?H~3Cn-NEF+MG|q(slmOv;Q)AvHaw_yXSs0oKR6YrNb)O*@?$^1ZWBxkL1&=na*> zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez}U#BR1ah^O6<5e=j~?$FJ3Ng4iFASJyk!eAT^!Kk4wSW#4OP?EzQzA+1Sv+$kHe&#Vpm_ z7${(1WRz@{mMFj=B@mfxn|U>M=C>b(KbmLFd2~Zbz$7dFXN_Ugq`i5?|0gIN`=#+> K+tSxe5{v-*P^fSK literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_11.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_11.binproto new file mode 100644 index 0000000000000000000000000000000000000000..7de0eed15d6206e1bd46387f373978b6835c4b5a GIT binary patch literal 610 zcmd<&U=+CVYr*{QhVK};UNdqjBr;80{r0evr^npIvkXrzJv;O4rTnk$MvpQchreSe zy?H~3Cn-NEF+MG|q(slmOv;Q)AvHaw_yXSs0oKR6YrNb)O*@?$^1ZWBxkL1&=na*> zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez<8cf=?o)~$tbb&;+(gi4ZPU6SU6am z7$z}pW#rn#$TgQyi8C`dF+EkkATM1@AZ_83`+Hw8O8NNv+!fPQ%`|8baM&m2v6mxC z#wX1u!z?U6(bCT|+`in;O*cQ^N7p*sF~TChk}I4`!P3$s#mLgs(9AN;*xb~_)Fjc; z)Y9BCB{j_;In^@7NPtO7AeJRX_Ew2}qX^%>0-JR86-oj#eKi9!KbN|CO`SgXJ0~itElA1qin3r(66jw!Z`wf*56O=BimLvLmv{l=oxYp^ literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_12.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_12.binproto new file mode 100644 index 0000000000000000000000000000000000000000..0ecb89526fdeced0bd865ec6e57af4684b17a0bd GIT binary patch literal 584 zcmd<&U=+CVYr*{QhVK};UNdqjBr;80{r0evr^npIvkXrzJv;O4rTnk$MvpQchreSe zy?H~3Cn-NEF+MG|q(slmOv;Q)AvHaw_yXSs0oKR6YrNb)O*@?$^1ZWBxkL1&=na*> zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez_^uBX%i!m$tbbw;+(gi4ZL`{xH(t^ zZY+Mib)Bgf!z9Kjj9e2Lxq29tI5Tq-(^K`+Gt(Sivw2)+jgs+kch^eO(aqG$(apDa zSE;j)Dlsqc@H4b6aW&?O=29?EPBJkuF*7u^OiMB|HB7WLH8wReO-V6LNwiE%G`AFB zmJ&Fn;9>WDLDV$SD{J?Dn-McbNuXwnOJd~jRH><^s&`{ouBy~n(|-8`vk_-xc$!N{ MdV!~x1(O6L0FFboA^-pY literal 0 HcmV?d00001 diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_13.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_13.binproto new file mode 100644 index 0000000000000000000000000000000000000000..e38ccec9e2c82f915fe6782522331f511142a4e6 GIT binary patch literal 610 zcmd<&U=+CVYr*{QhVK};UNdqjBr;80{r0evr^npIvkXrzJv;O4rTnk$MvpQchreSe zy?H~3Cn-NEF+MG|q(slmOv;Q)AvHaw_yXSs0oKR6YrNb)O*@?$^1ZWBxkL1&=na*> zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez<8cf=?o)~$tbb=;+(gi4ZQfdcsW=E z*3Uh)bhV)u69?lY#x;ywD;c?_Fe-7DWu~O&>*p4jXbGe(d~$#9D@G|Ff1kTznyQ%w z4FV2VWj(s(qhx$iJpCi={ah_0O+xAlf&zlFTn!^E(@e99O3b+YxD?XN%##umEe*`f zQW8y#lM~a-43bS!lPwJll8jPPQ%waJqy#h zdXt3&5)U#iVz}xg-g$^s;)Z9{2MHD>7AK%7S}blrW2`i}6yEI4IBsGrrMKAl>~i;$ zJ+8s2N{JEL{^z0|+*{#$E>%*9IW*Wsg3-$h=v+n#Mg>LQ6Kf`}EAr=lsEd~(9 zWW*pNB*nq3B*rBGRE`3qm?W5!gc3Mdgkpe_T!QBq7#tWHAW9g8&_$ROrarp!-`Y#z zdTc3P6vgV8lbM{F#2TENS(0JJz#+xP!6d*Ez*wtP4P-D%?72AS?Pmio4lXth7B40a zrb&#+T!~z { + builder.viewOnceMessage = record.toRemoteViewOnceMessage(mediaArchiveEnabled = mediaArchiveEnabled, reactionRecords = reactionsById[id], attachments = attachmentsById[id]) + } + else -> { if (record.body == null && !attachmentsById.containsKey(record.id)) { Log.w(TAG, "Record with ID ${record.id} missing a body and doesn't have attachments. Skipping.") @@ -556,6 +561,15 @@ private fun LinkPreview.toRemoteLinkPreview(mediaArchiveEnabled: Boolean): org.t ) } +private fun BackupMessageRecord.toRemoteViewOnceMessage(mediaArchiveEnabled: Boolean, reactionRecords: List?, attachments: List?): ViewOnceMessage { + val attachment: DatabaseAttachment? = attachments?.firstOrNull() + + return ViewOnceMessage( + attachment = attachment?.toRemoteMessageAttachment(mediaArchiveEnabled), + reactions = reactionRecords?.toRemote() ?: emptyList() + ) +} + private fun BackupMessageRecord.toRemoteContactMessage(mediaArchiveEnabled: Boolean, reactionRecords: List?, attachments: List?): ContactMessage { val sharedContacts = toRemoteSharedContacts(attachments) @@ -1082,7 +1096,8 @@ private fun Cursor.toBackupMessageRecord(): BackupMessageRecord { networkFailureRecipientIds = this.requireString(MessageTable.NETWORK_FAILURES).parseNetworkFailures(), identityMismatchRecipientIds = this.requireString(MessageTable.MISMATCHED_IDENTITIES).parseIdentityMismatches(), baseType = this.requireLong(COLUMN_BASE_TYPE), - messageExtras = this.requireBlob(MessageTable.MESSAGE_EXTRAS).parseMessageExtras() + messageExtras = this.requireBlob(MessageTable.MESSAGE_EXTRAS).parseMessageExtras(), + viewOnce = this.requireBoolean(MessageTable.VIEW_ONCE) ) } @@ -1119,5 +1134,6 @@ private class BackupMessageRecord( val networkFailureRecipientIds: Set, val identityMismatchRecipientIds: Set, val baseType: Long, - val messageExtras: MessageExtras? + val messageExtras: MessageExtras?, + val viewOnce: Boolean ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/ChatItemArchiveImporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/ChatItemArchiveImporter.kt index a308777d2f..1a4417899b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/ChatItemArchiveImporter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/importer/ChatItemArchiveImporter.kt @@ -34,6 +34,7 @@ import org.thoughtcrime.securesms.backup.v2.proto.SendStatus import org.thoughtcrime.securesms.backup.v2.proto.SimpleChatUpdate import org.thoughtcrime.securesms.backup.v2.proto.StandardMessage import org.thoughtcrime.securesms.backup.v2.proto.Sticker +import org.thoughtcrime.securesms.backup.v2.proto.ViewOnceMessage import org.thoughtcrime.securesms.backup.v2.util.toLocalAttachment import org.thoughtcrime.securesms.contactshare.Contact import org.thoughtcrime.securesms.database.CallTable @@ -429,6 +430,15 @@ class ChatItemArchiveImporter( } } + if (this.viewOnceMessage != null) { + val attachment = this.viewOnceMessage.attachment?.toLocalAttachment() + if (attachment != null) { + followUp = { messageRowId -> + SignalDatabase.attachments.insertAttachmentsForMessage(messageRowId, listOf(attachment), emptyList()) + } + } + } + return MessageInsert(contentValues, followUp) } @@ -484,6 +494,7 @@ class ChatItemArchiveImporter( this.updateMessage != null -> contentValues.addUpdateMessage(this.updateMessage) this.paymentNotification != null -> contentValues.addPaymentNotification(this, chatRecipientId) this.giftBadge != null -> contentValues.addGiftBadge(this.giftBadge) + this.viewOnceMessage != null -> contentValues.addViewOnce(this.viewOnceMessage) } return contentValues @@ -526,6 +537,7 @@ class ChatItemArchiveImporter( this.standardMessage != null -> this.standardMessage.reactions this.contactMessage != null -> this.contactMessage.reactions this.stickerMessage != null -> this.stickerMessage.reactions + this.viewOnceMessage != null -> this.viewOnceMessage.reactions else -> emptyList() } @@ -822,6 +834,10 @@ class ChatItemArchiveImporter( put(MessageTable.BODY, Base64.encodeWithPadding(GiftBadge.ADAPTER.encode(dbGiftBadge))) } + private fun ContentValues.addViewOnce(viewOnce: ViewOnceMessage) { + put(MessageTable.VIEW_ONCE, true.toInt()) + } + private fun String?.tryParseMoney(): Money? { if (this.isNullOrEmpty()) { return null diff --git a/app/src/main/protowire/Backup.proto b/app/src/main/protowire/Backup.proto index 624433d16a..7ee3246385 100644 --- a/app/src/main/protowire/Backup.proto +++ b/app/src/main/protowire/Backup.proto @@ -341,6 +341,7 @@ message ChatItem { ChatUpdateMessage updateMessage = 15; PaymentNotification paymentNotification = 16; GiftBadge giftBadge = 17; + ViewOnceMessage viewOnceMessage = 18; } } @@ -469,6 +470,12 @@ message GiftBadge { State state = 2; } +message ViewOnceMessage { + // Will be null for viewed messages + MessageAttachment attachment = 1; + repeated Reaction reactions = 2; +} + message ContactAttachment { message Name { optional string givenName = 1;