Add view-once messages to backups

This commit is contained in:
Marissa Le Coz
2024-10-25 19:48:58 -04:00
committed by GitHub
parent 9aa0076adc
commit 3d8eb76994
9 changed files with 371 additions and 6 deletions

View File

@@ -2743,6 +2743,36 @@
E18C4A7729EF2ECC007534D4 /* SignalAccountTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E18C4A7629EF2ECC007534D4 /* SignalAccountTest.swift */; };
E1A090382A4B909B00F2BE8B /* RecipientHidingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1A090372A4B909B00F2BE8B /* RecipientHidingManager.swift */; };
E1B32F842CA6162A002141F4 /* LinkPreviewCallLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1CFAAA22C9DD2B1003145C3 /* LinkPreviewCallLink.swift */; };
E1B628DA2CCC59E600C4DC7F /* chat_item_view_once_11.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628D22CCC59E600C4DC7F /* chat_item_view_once_11.binproto */; };
E1B628DB2CCC59E600C4DC7F /* chat_item_view_once_01.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628BE2CCC59E600C4DC7F /* chat_item_view_once_01.binproto */; };
E1B628DC2CCC59E600C4DC7F /* chat_item_view_once_14.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628D82CCC59E600C4DC7F /* chat_item_view_once_14.binproto */; };
E1B628DD2CCC59E600C4DC7F /* chat_item_view_once_02.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628C12CCC59E600C4DC7F /* chat_item_view_once_02.txtproto */; };
E1B628DE2CCC59E600C4DC7F /* chat_item_view_once_07.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628CB2CCC59E600C4DC7F /* chat_item_view_once_07.txtproto */; };
E1B628DF2CCC59E600C4DC7F /* chat_item_view_once_07.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628CA2CCC59E600C4DC7F /* chat_item_view_once_07.binproto */; };
E1B628E02CCC59E600C4DC7F /* chat_item_view_once_06.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628C82CCC59E600C4DC7F /* chat_item_view_once_06.binproto */; };
E1B628E12CCC59E600C4DC7F /* chat_item_view_once_01.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628BF2CCC59E600C4DC7F /* chat_item_view_once_01.txtproto */; };
E1B628E22CCC59E600C4DC7F /* chat_item_view_once_10.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628D12CCC59E600C4DC7F /* chat_item_view_once_10.txtproto */; };
E1B628E32CCC59E600C4DC7F /* chat_item_view_once_00.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628BC2CCC59E600C4DC7F /* chat_item_view_once_00.binproto */; };
E1B628E42CCC59E600C4DC7F /* chat_item_view_once_00.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628BD2CCC59E600C4DC7F /* chat_item_view_once_00.txtproto */; };
E1B628E52CCC59E600C4DC7F /* chat_item_view_once_12.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628D52CCC59E600C4DC7F /* chat_item_view_once_12.txtproto */; };
E1B628E62CCC59E600C4DC7F /* chat_item_view_once_06.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628C92CCC59E600C4DC7F /* chat_item_view_once_06.txtproto */; };
E1B628E72CCC59E600C4DC7F /* chat_item_view_once_02.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628C02CCC59E600C4DC7F /* chat_item_view_once_02.binproto */; };
E1B628E82CCC59E600C4DC7F /* chat_item_view_once_05.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628C62CCC59E600C4DC7F /* chat_item_view_once_05.binproto */; };
E1B628E92CCC59E600C4DC7F /* chat_item_view_once_11.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628D32CCC59E600C4DC7F /* chat_item_view_once_11.txtproto */; };
E1B628EA2CCC59E600C4DC7F /* chat_item_view_once_12.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628D42CCC59E600C4DC7F /* chat_item_view_once_12.binproto */; };
E1B628EB2CCC59E600C4DC7F /* chat_item_view_once_04.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628C42CCC59E600C4DC7F /* chat_item_view_once_04.binproto */; };
E1B628EC2CCC59E600C4DC7F /* chat_item_view_once_05.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628C72CCC59E600C4DC7F /* chat_item_view_once_05.txtproto */; };
E1B628ED2CCC59E600C4DC7F /* chat_item_view_once_13.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628D62CCC59E600C4DC7F /* chat_item_view_once_13.binproto */; };
E1B628EE2CCC59E600C4DC7F /* chat_item_view_once_09.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628CF2CCC59E600C4DC7F /* chat_item_view_once_09.txtproto */; };
E1B628EF2CCC59E600C4DC7F /* chat_item_view_once_03.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628C22CCC59E600C4DC7F /* chat_item_view_once_03.binproto */; };
E1B628F02CCC59E600C4DC7F /* chat_item_view_once_08.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628CD2CCC59E600C4DC7F /* chat_item_view_once_08.txtproto */; };
E1B628F12CCC59E600C4DC7F /* chat_item_view_once_10.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628D02CCC59E600C4DC7F /* chat_item_view_once_10.binproto */; };
E1B628F22CCC59E600C4DC7F /* chat_item_view_once_04.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628C52CCC59E600C4DC7F /* chat_item_view_once_04.txtproto */; };
E1B628F32CCC59E600C4DC7F /* chat_item_view_once_03.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628C32CCC59E600C4DC7F /* chat_item_view_once_03.txtproto */; };
E1B628F42CCC59E600C4DC7F /* chat_item_view_once_08.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628CC2CCC59E600C4DC7F /* chat_item_view_once_08.binproto */; };
E1B628F52CCC59E600C4DC7F /* chat_item_view_once_13.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628D72CCC59E600C4DC7F /* chat_item_view_once_13.txtproto */; };
E1B628F62CCC59E600C4DC7F /* chat_item_view_once_09.binproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628CE2CCC59E600C4DC7F /* chat_item_view_once_09.binproto */; };
E1B628F72CCC59E600C4DC7F /* chat_item_view_once_14.txtproto in Resources */ = {isa = PBXBuildFile; fileRef = E1B628D92CCC59E600C4DC7F /* chat_item_view_once_14.txtproto */; };
E1C2A54B2A8FCB0D00AEC4DA /* DeleteSystemContactViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1C2A54A2A8FCB0D00AEC4DA /* DeleteSystemContactViewController.swift */; };
E1D827DA2BDC1F7B0022C1AF /* ReactionBurstManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1D827D82BDC1F6B0022C1AF /* ReactionBurstManagerTests.swift */; };
E44AD4E624E98F440035D7B8 /* PhotoCaptureDismiss.swift in Sources */ = {isa = PBXBuildFile; fileRef = E44AD4E524E98F430035D7B8 /* PhotoCaptureDismiss.swift */; };
@@ -6423,6 +6453,36 @@
E18C4A7629EF2ECC007534D4 /* SignalAccountTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignalAccountTest.swift; sourceTree = "<group>"; };
E1A090372A4B909B00F2BE8B /* RecipientHidingManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecipientHidingManager.swift; sourceTree = "<group>"; };
E1A0AD8B16E13FDD0071E604 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
E1B628BC2CCC59E600C4DC7F /* chat_item_view_once_00.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_00.binproto; sourceTree = "<group>"; };
E1B628BD2CCC59E600C4DC7F /* chat_item_view_once_00.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_00.txtproto; sourceTree = "<group>"; };
E1B628BE2CCC59E600C4DC7F /* chat_item_view_once_01.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_01.binproto; sourceTree = "<group>"; };
E1B628BF2CCC59E600C4DC7F /* chat_item_view_once_01.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_01.txtproto; sourceTree = "<group>"; };
E1B628C02CCC59E600C4DC7F /* chat_item_view_once_02.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_02.binproto; sourceTree = "<group>"; };
E1B628C12CCC59E600C4DC7F /* chat_item_view_once_02.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_02.txtproto; sourceTree = "<group>"; };
E1B628C22CCC59E600C4DC7F /* chat_item_view_once_03.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_03.binproto; sourceTree = "<group>"; };
E1B628C32CCC59E600C4DC7F /* chat_item_view_once_03.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_03.txtproto; sourceTree = "<group>"; };
E1B628C42CCC59E600C4DC7F /* chat_item_view_once_04.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_04.binproto; sourceTree = "<group>"; };
E1B628C52CCC59E600C4DC7F /* chat_item_view_once_04.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_04.txtproto; sourceTree = "<group>"; };
E1B628C62CCC59E600C4DC7F /* chat_item_view_once_05.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_05.binproto; sourceTree = "<group>"; };
E1B628C72CCC59E600C4DC7F /* chat_item_view_once_05.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_05.txtproto; sourceTree = "<group>"; };
E1B628C82CCC59E600C4DC7F /* chat_item_view_once_06.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_06.binproto; sourceTree = "<group>"; };
E1B628C92CCC59E600C4DC7F /* chat_item_view_once_06.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_06.txtproto; sourceTree = "<group>"; };
E1B628CA2CCC59E600C4DC7F /* chat_item_view_once_07.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_07.binproto; sourceTree = "<group>"; };
E1B628CB2CCC59E600C4DC7F /* chat_item_view_once_07.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_07.txtproto; sourceTree = "<group>"; };
E1B628CC2CCC59E600C4DC7F /* chat_item_view_once_08.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_08.binproto; sourceTree = "<group>"; };
E1B628CD2CCC59E600C4DC7F /* chat_item_view_once_08.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_08.txtproto; sourceTree = "<group>"; };
E1B628CE2CCC59E600C4DC7F /* chat_item_view_once_09.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_09.binproto; sourceTree = "<group>"; };
E1B628CF2CCC59E600C4DC7F /* chat_item_view_once_09.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_09.txtproto; sourceTree = "<group>"; };
E1B628D02CCC59E600C4DC7F /* chat_item_view_once_10.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_10.binproto; sourceTree = "<group>"; };
E1B628D12CCC59E600C4DC7F /* chat_item_view_once_10.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_10.txtproto; sourceTree = "<group>"; };
E1B628D22CCC59E600C4DC7F /* chat_item_view_once_11.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_11.binproto; sourceTree = "<group>"; };
E1B628D32CCC59E600C4DC7F /* chat_item_view_once_11.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_11.txtproto; sourceTree = "<group>"; };
E1B628D42CCC59E600C4DC7F /* chat_item_view_once_12.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_12.binproto; sourceTree = "<group>"; };
E1B628D52CCC59E600C4DC7F /* chat_item_view_once_12.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_12.txtproto; sourceTree = "<group>"; };
E1B628D62CCC59E600C4DC7F /* chat_item_view_once_13.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_13.binproto; sourceTree = "<group>"; };
E1B628D72CCC59E600C4DC7F /* chat_item_view_once_13.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_13.txtproto; sourceTree = "<group>"; };
E1B628D82CCC59E600C4DC7F /* chat_item_view_once_14.binproto */ = {isa = PBXFileReference; lastKnownFileType = file; path = chat_item_view_once_14.binproto; sourceTree = "<group>"; };
E1B628D92CCC59E600C4DC7F /* chat_item_view_once_14.txtproto */ = {isa = PBXFileReference; lastKnownFileType = text; path = chat_item_view_once_14.txtproto; sourceTree = "<group>"; };
E1C2A54A2A8FCB0D00AEC4DA /* DeleteSystemContactViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteSystemContactViewController.swift; sourceTree = "<group>"; };
E1CFAAA22C9DD2B1003145C3 /* LinkPreviewCallLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkPreviewCallLink.swift; sourceTree = "<group>"; };
E1D827D82BDC1F6B0022C1AF /* ReactionBurstManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionBurstManagerTests.swift; sourceTree = "<group>"; };
@@ -11612,6 +11672,36 @@
D90AA2C42CC9616A00021CB0 /* chat_item_thread_merge_update_00.txtproto */,
D90AA2C52CC9616A00021CB0 /* chat_item_thread_merge_update_01.binproto */,
D90AA2C62CC9616A00021CB0 /* chat_item_thread_merge_update_01.txtproto */,
E1B628BC2CCC59E600C4DC7F /* chat_item_view_once_00.binproto */,
E1B628BD2CCC59E600C4DC7F /* chat_item_view_once_00.txtproto */,
E1B628BE2CCC59E600C4DC7F /* chat_item_view_once_01.binproto */,
E1B628BF2CCC59E600C4DC7F /* chat_item_view_once_01.txtproto */,
E1B628C02CCC59E600C4DC7F /* chat_item_view_once_02.binproto */,
E1B628C12CCC59E600C4DC7F /* chat_item_view_once_02.txtproto */,
E1B628C22CCC59E600C4DC7F /* chat_item_view_once_03.binproto */,
E1B628C32CCC59E600C4DC7F /* chat_item_view_once_03.txtproto */,
E1B628C42CCC59E600C4DC7F /* chat_item_view_once_04.binproto */,
E1B628C52CCC59E600C4DC7F /* chat_item_view_once_04.txtproto */,
E1B628C62CCC59E600C4DC7F /* chat_item_view_once_05.binproto */,
E1B628C72CCC59E600C4DC7F /* chat_item_view_once_05.txtproto */,
E1B628C82CCC59E600C4DC7F /* chat_item_view_once_06.binproto */,
E1B628C92CCC59E600C4DC7F /* chat_item_view_once_06.txtproto */,
E1B628CA2CCC59E600C4DC7F /* chat_item_view_once_07.binproto */,
E1B628CB2CCC59E600C4DC7F /* chat_item_view_once_07.txtproto */,
E1B628CC2CCC59E600C4DC7F /* chat_item_view_once_08.binproto */,
E1B628CD2CCC59E600C4DC7F /* chat_item_view_once_08.txtproto */,
E1B628CE2CCC59E600C4DC7F /* chat_item_view_once_09.binproto */,
E1B628CF2CCC59E600C4DC7F /* chat_item_view_once_09.txtproto */,
E1B628D02CCC59E600C4DC7F /* chat_item_view_once_10.binproto */,
E1B628D12CCC59E600C4DC7F /* chat_item_view_once_10.txtproto */,
E1B628D22CCC59E600C4DC7F /* chat_item_view_once_11.binproto */,
E1B628D32CCC59E600C4DC7F /* chat_item_view_once_11.txtproto */,
E1B628D42CCC59E600C4DC7F /* chat_item_view_once_12.binproto */,
E1B628D52CCC59E600C4DC7F /* chat_item_view_once_12.txtproto */,
E1B628D62CCC59E600C4DC7F /* chat_item_view_once_13.binproto */,
E1B628D72CCC59E600C4DC7F /* chat_item_view_once_13.txtproto */,
E1B628D82CCC59E600C4DC7F /* chat_item_view_once_14.binproto */,
E1B628D92CCC59E600C4DC7F /* chat_item_view_once_14.txtproto */,
D90AA3052CC9616A00021CB0 /* recipient_contacts_00.binproto */,
D90AA3062CC9616A00021CB0 /* recipient_contacts_00.txtproto */,
D90AA3072CC9616A00021CB0 /* recipient_contacts_01.binproto */,
@@ -15058,6 +15148,36 @@
D90AA4A02CC9616B00021CB0 /* chat_item_thread_merge_update_00.txtproto in Resources */,
D90AA5CC2CC9616B00021CB0 /* chat_item_thread_merge_update_01.binproto in Resources */,
D90AA5902CC9616B00021CB0 /* chat_item_thread_merge_update_01.txtproto in Resources */,
E1B628E32CCC59E600C4DC7F /* chat_item_view_once_00.binproto in Resources */,
E1B628E42CCC59E600C4DC7F /* chat_item_view_once_00.txtproto in Resources */,
E1B628DB2CCC59E600C4DC7F /* chat_item_view_once_01.binproto in Resources */,
E1B628E12CCC59E600C4DC7F /* chat_item_view_once_01.txtproto in Resources */,
E1B628E72CCC59E600C4DC7F /* chat_item_view_once_02.binproto in Resources */,
E1B628DD2CCC59E600C4DC7F /* chat_item_view_once_02.txtproto in Resources */,
E1B628EF2CCC59E600C4DC7F /* chat_item_view_once_03.binproto in Resources */,
E1B628F32CCC59E600C4DC7F /* chat_item_view_once_03.txtproto in Resources */,
E1B628EB2CCC59E600C4DC7F /* chat_item_view_once_04.binproto in Resources */,
E1B628F22CCC59E600C4DC7F /* chat_item_view_once_04.txtproto in Resources */,
E1B628E82CCC59E600C4DC7F /* chat_item_view_once_05.binproto in Resources */,
E1B628EC2CCC59E600C4DC7F /* chat_item_view_once_05.txtproto in Resources */,
E1B628E02CCC59E600C4DC7F /* chat_item_view_once_06.binproto in Resources */,
E1B628E62CCC59E600C4DC7F /* chat_item_view_once_06.txtproto in Resources */,
E1B628DF2CCC59E600C4DC7F /* chat_item_view_once_07.binproto in Resources */,
E1B628DE2CCC59E600C4DC7F /* chat_item_view_once_07.txtproto in Resources */,
E1B628F42CCC59E600C4DC7F /* chat_item_view_once_08.binproto in Resources */,
E1B628F02CCC59E600C4DC7F /* chat_item_view_once_08.txtproto in Resources */,
E1B628F62CCC59E600C4DC7F /* chat_item_view_once_09.binproto in Resources */,
E1B628EE2CCC59E600C4DC7F /* chat_item_view_once_09.txtproto in Resources */,
E1B628F12CCC59E600C4DC7F /* chat_item_view_once_10.binproto in Resources */,
E1B628E22CCC59E600C4DC7F /* chat_item_view_once_10.txtproto in Resources */,
E1B628DA2CCC59E600C4DC7F /* chat_item_view_once_11.binproto in Resources */,
E1B628E92CCC59E600C4DC7F /* chat_item_view_once_11.txtproto in Resources */,
E1B628EA2CCC59E600C4DC7F /* chat_item_view_once_12.binproto in Resources */,
E1B628E52CCC59E600C4DC7F /* chat_item_view_once_12.txtproto in Resources */,
E1B628ED2CCC59E600C4DC7F /* chat_item_view_once_13.binproto in Resources */,
E1B628F52CCC59E600C4DC7F /* chat_item_view_once_13.txtproto in Resources */,
E1B628DC2CCC59E600C4DC7F /* chat_item_view_once_14.binproto in Resources */,
E1B628F72CCC59E600C4DC7F /* chat_item_view_once_14.txtproto in Resources */,
D90AA4742CC9616B00021CB0 /* recipient_contacts_00.binproto in Resources */,
D90AA3C42CC9616B00021CB0 /* recipient_contacts_00.txtproto in Resources */,
D90AA3AB2CC9616B00021CB0 /* recipient_contacts_01.binproto in Resources */,

View File

@@ -344,7 +344,7 @@ public class MessageBackupChatItemArchiverImpl: MessageBackupChatItemArchiver {
switch chatItem.item {
case nil:
return restoreFrameError(.invalidProtoData(.chatItemMissingItem))
case .standardMessage, .contactMessage, .giftBadge, .paymentNotification, .remoteDeletedMessage, .stickerMessage:
case .standardMessage, .contactMessage, .giftBadge, .viewOnceMessage, .paymentNotification, .remoteDeletedMessage, .stickerMessage:
return restoreFrameError(.invalidProtoData(.directionlessChatItemNotUpdateMessage))
case .updateMessage:
restoreInteractionResult = chatUpdateMessageArchiver.restoreChatItem(

View File

@@ -283,9 +283,7 @@ extension MessageBackupTSIncomingMessageArchiver: MessageBackupTSMessageEditHist
serverGuid: nil,
wasReceivedByUD: incomingDetails.sealedSender,
isSmsMessageRestoredFromBackup: chatItem.sms,
// TODO: [Backups] pass along if this is view once after proto field is added
isViewOnceMessage: false,
// TODO: [Backups] restore viewed view-once messages after proto field is added
isViewOnceComplete: false,
wasRemotelyDeleted: false,
storyAuthorAci: nil,
@@ -320,6 +318,14 @@ extension MessageBackupTSIncomingMessageArchiver: MessageBackupTSMessageEditHist
messageBuilder.messageSticker = stickerMessage.sticker
case .giftBadge(let giftBadge):
messageBuilder.giftBadge = giftBadge.giftBadge
case .viewOnceMessage(let viewOnceMessage):
messageBuilder.isViewOnceMessage = true
switch viewOnceMessage.state {
case .unviewed:
messageBuilder.isViewOnceComplete = false
case .complete:
messageBuilder.isViewOnceComplete = true
}
}
return messageBuilder.build()

View File

@@ -66,12 +66,23 @@ extension MessageBackup {
let giftBadge: OWSGiftBadge
}
struct ViewOnceMessage {
enum State {
case complete
case unviewed(BackupProto_MessageAttachment)
}
let state: State
fileprivate let reactions: [BackupProto_Reaction]
}
case archivedPayment(Payment)
case remoteDeleteTombstone
case text(Text)
case contactShare(ContactShare)
case stickerMessage(StickerMessage)
case giftBadge(GiftBadge)
case viewOnceMessage(ViewOnceMessage)
}
}
@@ -153,6 +164,12 @@ class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchiver {
giftBadge,
context: context
)
} else if message.isViewOnceMessage {
return archiveViewOnceMessage(
message,
messageRowId: messageRowId,
context: context
)
} else {
return archiveStandardMessageContents(
message,
@@ -690,6 +707,64 @@ class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchiver {
return .success(.giftBadge(giftBadgeProto))
}
// MARK: -
private func archiveViewOnceMessage(
_ message: TSMessage,
messageRowId: Int64,
context: MessageBackup.RecipientArchivingContext
) -> ArchiveInteractionResult<ChatItemType> {
var partialErrors = [ArchiveFrameError]()
var proto = BackupProto_ViewOnceMessage()
if !message.isViewOnceComplete {
let attachmentResult = attachmentsArchiver.archiveBodyAttachments(
messageId: message.uniqueInteractionId,
messageRowId: messageRowId,
context: context
)
switch attachmentResult.bubbleUp(ChatItemType.self, partialErrors: &partialErrors) {
case .continue(let value):
guard let first = value.first else {
return .messageFailure(partialErrors + [.archiveFrameError(
.unviewedViewOnceMessageMissingAttachment,
message.uniqueInteractionId
)])
}
if value.count > 1 {
partialErrors.append(.archiveFrameError(
.unviewedViewOnceMessageTooManyAttachments(value.count),
message.uniqueInteractionId
))
}
proto.attachment = first
case .bubbleUpError(let errorResult):
return errorResult
}
}
let reactions: [BackupProto_Reaction]
let reactionsResult = reactionArchiver.archiveReactions(
message,
context: context
)
switch reactionsResult.bubbleUp(ChatItemType.self, partialErrors: &partialErrors) {
case .continue(let values):
reactions = values
case .bubbleUpError(let errorResult):
return errorResult
}
proto.reactions = reactions
if partialErrors.isEmpty {
return .success(.viewOnceMessage(proto))
} else {
return .partialFailure(.viewOnceMessage(proto), partialErrors)
}
}
// MARK: - Restoring
/// Parses the proto structure of message contents into
@@ -749,6 +824,13 @@ class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchiver {
chatItemId: chatItemId,
context: context
)
case .viewOnceMessage(let viewOnceMessage):
return restoreViewOnceMessage(
viewOnceMessage,
chatItemId: chatItemId,
chatThread: chatThread,
context: context
)
case .updateMessage:
return .messageFailure([.restoreFrameError(
.developerError(OWSAssertionError("Chat update has no contents to restore!")),
@@ -866,6 +948,26 @@ class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchiver {
thread: thread,
context: context
))
case .viewOnceMessage(let viewOnceMessage):
downstreamObjectResults.append(reactionArchiver.restoreReactions(
viewOnceMessage.reactions,
chatItemId: chatItemId,
message: message,
context: context.recipientContext
))
switch viewOnceMessage.state {
case .unviewed(let attachment):
downstreamObjectResults.append(attachmentsArchiver.restoreBodyAttachments(
[attachment],
chatItemId: chatItemId,
messageRowId: messageRowId,
message: message,
thread: thread,
context: context
))
case .complete:
break
}
case .remoteDeleteTombstone, .giftBadge:
// Nothing downstream to restore.
break
@@ -1458,6 +1560,26 @@ class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchiver {
giftBadge: giftBadge
)))
}
// MARK: -
private func restoreViewOnceMessage(
_ viewOnceMessage: BackupProto_ViewOnceMessage,
chatItemId: MessageBackup.ChatItemId,
chatThread: MessageBackup.ChatThread,
context: MessageBackup.ChatItemRestoringContext
) -> RestoreInteractionResult<MessageBackup.RestoredMessageContents> {
let state: MessageBackup.RestoredMessageContents.ViewOnceMessage.State
if viewOnceMessage.hasAttachment {
state = .unviewed(viewOnceMessage.attachment)
} else {
state = .complete
}
return .success(.viewOnceMessage(.init(
state: state,
reactions: viewOnceMessage.reactions
)))
}
}
// MARK: -

View File

@@ -469,9 +469,7 @@ extension MessageBackupTSOutgoingMessageArchiver: MessageBackupTSMessageEditHist
isVoiceMessage: false,
groupMetaMessage: .unspecified,
isSmsMessageRestoredFromBackup: chatItem.sms,
// TODO: [Backups] pass along if this is view once after proto field is added
isViewOnceMessage: false,
// TODO: [Backups] restore viewed view-once messages after proto field is added
isViewOnceComplete: false,
wasRemotelyDeleted: false,
changeActionsProtoData: nil,
@@ -509,6 +507,14 @@ extension MessageBackupTSOutgoingMessageArchiver: MessageBackupTSMessageEditHist
outgoingMessageBuilder.messageSticker = stickerMessage.sticker
case .giftBadge(let giftBadge):
outgoingMessageBuilder.giftBadge = giftBadge.giftBadge
case .viewOnceMessage(let viewOnceMessage):
outgoingMessageBuilder.isViewOnceMessage = true
switch viewOnceMessage.state {
case .unviewed:
outgoingMessageBuilder.isViewOnceComplete = false
case .complete:
outgoingMessageBuilder.isViewOnceComplete = true
}
}
return TSOutgoingMessage(

View File

@@ -177,6 +177,12 @@ extension MessageBackup {
/// We failed to read the ``StoryContextAssociatedData``. Note that it can
/// be nil (missing); this is a SQL error when we tried to read.
case unableToReadStoryContextAssociatedData(Error)
/// An unviewed view-once message is missing its attachment.
case unviewedViewOnceMessageMissingAttachment
/// An unviewed view-once message has more than one attachment.
/// Associated value provides the number of attachments.
case unviewedViewOnceMessageTooManyAttachments(Int)
}
private let type: ErrorType
@@ -267,7 +273,9 @@ extension MessageBackup {
.learnedProfileUpdateInvalidE164,
.learnedProfileUpdateMissingAuthor,
.editHistoryFailedToFetch,
.unableToReadStoryContextAssociatedData:
.unableToReadStoryContextAssociatedData,
.unviewedViewOnceMessageMissingAttachment,
.unviewedViewOnceMessageTooManyAttachments:
// Log any others as we see them.
return nil
}

View File

@@ -1534,6 +1534,14 @@ public struct BackupProto_ChatItem: @unchecked Sendable {
set {_uniqueStorage()._item = .giftBadge(newValue)}
}
public var viewOnceMessage: BackupProto_ViewOnceMessage {
get {
if case .viewOnceMessage(let v)? = _storage._item {return v}
return BackupProto_ViewOnceMessage()
}
set {_uniqueStorage()._item = .viewOnceMessage(newValue)}
}
public var unknownFields = SwiftProtobuf.UnknownStorage()
public enum OneOf_DirectionalDetails: Equatable, Sendable {
@@ -1551,6 +1559,7 @@ public struct BackupProto_ChatItem: @unchecked Sendable {
case updateMessage(BackupProto_ChatUpdateMessage)
case paymentNotification(BackupProto_PaymentNotification)
case giftBadge(BackupProto_GiftBadge)
case viewOnceMessage(BackupProto_ViewOnceMessage)
}
@@ -2213,6 +2222,30 @@ public struct BackupProto_GiftBadge: @unchecked Sendable {
public init() {}
}
public struct BackupProto_ViewOnceMessage: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
/// Will be null for viewed messages
public var attachment: BackupProto_MessageAttachment {
get {return _attachment ?? BackupProto_MessageAttachment()}
set {_attachment = newValue}
}
/// Returns true if `attachment` has been explicitly set.
public var hasAttachment: Bool {return self._attachment != nil}
/// Clears the value of `attachment`. Subsequent reads from it will return its default value.
public mutating func clearAttachment() {self._attachment = nil}
public var reactions: [BackupProto_Reaction] = []
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
fileprivate var _attachment: BackupProto_MessageAttachment? = nil
}
public struct BackupProto_ContactAttachment: @unchecked Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
@@ -7312,6 +7345,7 @@ extension BackupProto_ChatItem: SwiftProtobuf.Message, SwiftProtobuf._MessageImp
15: .same(proto: "updateMessage"),
16: .same(proto: "paymentNotification"),
17: .same(proto: "giftBadge"),
18: .same(proto: "viewOnceMessage"),
]
fileprivate class _StorageClass {
@@ -7502,6 +7536,19 @@ extension BackupProto_ChatItem: SwiftProtobuf.Message, SwiftProtobuf._MessageImp
_storage._item = .giftBadge(v)
}
}()
case 18: try {
var v: BackupProto_ViewOnceMessage?
var hadOneofValue = false
if let current = _storage._item {
hadOneofValue = true
if case .viewOnceMessage(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
_storage._item = .viewOnceMessage(v)
}
}()
default: break
}
}
@@ -7579,6 +7626,10 @@ extension BackupProto_ChatItem: SwiftProtobuf.Message, SwiftProtobuf._MessageImp
guard case .giftBadge(let v)? = _storage._item else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 17)
}()
case .viewOnceMessage?: try {
guard case .viewOnceMessage(let v)? = _storage._item else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 18)
}()
case nil: break
}
}
@@ -8608,6 +8659,48 @@ extension BackupProto_GiftBadge.State: SwiftProtobuf._ProtoNameProviding {
]
}
extension BackupProto_ViewOnceMessage: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = _protobuf_package + ".ViewOnceMessage"
public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .same(proto: "attachment"),
2: .same(proto: "reactions"),
]
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularMessageField(value: &self._attachment) }()
case 2: try { try decoder.decodeRepeatedMessageField(value: &self.reactions) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every if/case branch local when no optimizations
// are enabled. https://github.com/apple/swift-protobuf/issues/1034 and
// https://github.com/apple/swift-protobuf/issues/1182
try { if let v = self._attachment {
try visitor.visitSingularMessageField(value: v, fieldNumber: 1)
} }()
if !self.reactions.isEmpty {
try visitor.visitRepeatedMessageField(value: self.reactions, fieldNumber: 2)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: BackupProto_ViewOnceMessage, rhs: BackupProto_ViewOnceMessage) -> Bool {
if lhs._attachment != rhs._attachment {return false}
if lhs.reactions != rhs.reactions {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension BackupProto_ContactAttachment: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = _protobuf_package + ".ContactAttachment"
public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [

View File

@@ -346,6 +346,7 @@ message ChatItem {
ChatUpdateMessage updateMessage = 15;
PaymentNotification paymentNotification = 16;
GiftBadge giftBadge = 17;
ViewOnceMessage viewOnceMessage = 18;
}
}
@@ -474,6 +475,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;

View File

@@ -80,6 +80,7 @@ class MessageBackupIntegrationTests: XCTestCase {
case chatItemStandardMessageWithQuote
case chatItemStickerMessage
case chatItemThreadMerge
case chatItemViewOnceMessage
case recipient
case recipientContact
@@ -176,6 +177,8 @@ class MessageBackupIntegrationTests: XCTestCase {
return binprotoName.contains("chat_item_sticker_message_")
case .chatItemThreadMerge:
return binprotoName.contains("chat_item_thread_merge_")
case .chatItemViewOnceMessage:
return binprotoName.contains("chat_item_view_once_")
case .recipient:
return binprotoName.contains("recipient_")
case .recipientContact: