diff --git a/Signal/src/util/OWSOrphanDataCleaner.m b/Signal/src/util/OWSOrphanDataCleaner.m index 9f02179fb5..d18a5d7bda 100644 --- a/Signal/src/util/OWSOrphanDataCleaner.m +++ b/Signal/src/util/OWSOrphanDataCleaner.m @@ -12,6 +12,7 @@ #import #import #import +#import #import #import #import @@ -268,11 +269,18 @@ typedef void (^OrphanDataBlock)(OWSOrphanData *); return nil; } + NSString *stickersDirPath = StickerManager.cacheDirUrl.path; + NSSet *_Nullable allStickerFilePaths = [self filePathsInDirectorySafe:stickersDirPath]; + if (!allStickerFilePaths || !self.isMainAppAndActive) { + return nil; + } + NSMutableSet *allOnDiskFilePaths = [NSMutableSet new]; [allOnDiskFilePaths unionSet:legacyAttachmentFilePaths]; [allOnDiskFilePaths unionSet:sharedDataAttachmentFilePaths]; [allOnDiskFilePaths unionSet:legacyProfileAvatarsFilePaths]; [allOnDiskFilePaths unionSet:sharedDataProfileAvatarFilePaths]; + [allOnDiskFilePaths unionSet:allStickerFilePaths]; [allOnDiskFilePaths addObjectsFromArray:tempFilePaths]; NSSet *profileAvatarFilePaths = [OWSUserProfile allProfileAvatarFilePaths]; @@ -298,6 +306,8 @@ typedef void (^OrphanDataBlock)(OWSOrphanData *); // Messages NSMutableSet *orphanInteractionIds = [NSMutableSet new]; NSMutableSet *allMessageAttachmentIds = [NSMutableSet new]; + // Stickers + NSMutableSet *activeStickerFilePaths = [NSMutableSet new]; [databaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { [transaction enumerateKeysAndObjectsInCollection:TSAttachmentStream.collection @@ -351,6 +361,13 @@ typedef void (^OrphanDataBlock)(OWSOrphanData *); TSMessage *message = (TSMessage *)interaction; [allMessageAttachmentIds addObjectsFromArray:message.allAttachmentIds]; }]; + + if (shouldAbort) { + return; + } + + [activeStickerFilePaths + addObjectsFromArray:[StickerManager filepathsForAllInstalledStickersWithTransaction:transaction.asAnyRead]]; }]; if (shouldAbort) { return nil; @@ -364,6 +381,7 @@ typedef void (^OrphanDataBlock)(OWSOrphanData *); NSMutableSet *orphanFilePaths = [allOnDiskFilePaths mutableCopy]; [orphanFilePaths minusSet:allAttachmentFilePaths]; [orphanFilePaths minusSet:profileAvatarFilePaths]; + [orphanFilePaths minusSet:activeStickerFilePaths]; NSMutableSet *missingAttachmentFilePaths = [allAttachmentFilePaths mutableCopy]; [missingAttachmentFilePaths minusSet:allOnDiskFilePaths]; diff --git a/SignalServiceKit/src/Messages/Stickers/StickerManager.swift b/SignalServiceKit/src/Messages/Stickers/StickerManager.swift index c3ed263f76..ff0ef04d47 100644 --- a/SignalServiceKit/src/Messages/Stickers/StickerManager.swift +++ b/SignalServiceKit/src/Messages/Stickers/StickerManager.swift @@ -457,6 +457,18 @@ public class StickerManager: NSObject { } } + @objc + public class func filepathsForAllInstalledStickers(transaction: SDSAnyReadTransaction) -> [String] { + + var filePaths = [String]() + let installedStickers = InstalledSticker.anyFetchAll(transaction: transaction) + for installedSticker in installedStickers { + let filePath = stickerUrl(stickerInfo: installedSticker.info).path + filePaths.append(filePath) + } + return filePaths + } + @objc public class func isStickerInstalled(stickerInfo: StickerInfo) -> Bool { var result = false @@ -700,7 +712,6 @@ public class StickerManager: NSObject { // MARK: - Known Sticker Packs - // TODO: We may want to cull these in the orphan data cleaner. @objc public class func addKnownStickerInfo(_ stickerInfo: StickerInfo, transaction: SDSAnyWriteTransaction) {