Fix theme & wallpaper crashes

This commit is contained in:
Ilya Laktyushin 2021-10-28 14:25:39 +04:00
parent 98c6402b34
commit d4b1ee8efd
2 changed files with 40 additions and 14 deletions

View File

@ -519,23 +519,35 @@ func managedThemesUpdates(accountManager: AccountManager<TelegramAccountManagerT
}.start() }.start()
let _ = postbox.transaction { transaction in let _ = postbox.transaction { transaction in
let entries = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) let entries = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes)
let items = entries.map { entry -> TelegramTheme in
let theme = entry.contents.get(TelegramThemeNativeCodable.self)!.value var success = true
if theme.id == updatedTheme.id { var mappedItems: [TelegramTheme] = []
return updatedTheme for entry in entries {
if let theme = entry.contents.get(TelegramThemeNativeCodable.self)?.value {
if theme.id == updatedTheme.id {
mappedItems.append(updatedTheme)
} else {
mappedItems.append(theme)
}
} else { } else {
return theme success = false
break
} }
} }
var updatedEntries: [OrderedItemListEntry] = [] if success {
for item in items { var updatedEntries: [OrderedItemListEntry] = []
var intValue = Int32(updatedEntries.count) for item in mappedItems {
let id = MemoryBuffer(data: Data(bytes: &intValue, count: 4)) var intValue = Int32(updatedEntries.count)
if let entry = CodableEntry(TelegramThemeNativeCodable(item)) { let id = MemoryBuffer(data: Data(bytes: &intValue, count: 4))
updatedEntries.append(OrderedItemListEntry(id: id, contents: entry)) if let entry = CodableEntry(TelegramThemeNativeCodable(item)) {
updatedEntries.append(OrderedItemListEntry(id: id, contents: entry))
}
} }
transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: updatedEntries)
} else {
let _ = (telegramThemes(postbox: postbox, network: network, accountManager: accountManager, forceUpdate: true)
|> take(1)).start()
} }
transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: updatedEntries)
}.start() }.start()
} }
subscriber.putCompletion() subscriber.putCompletion()

View File

@ -6,7 +6,7 @@ import TelegramApi
public func telegramWallpapers(postbox: Postbox, network: Network, forceUpdate: Bool = false) -> Signal<[TelegramWallpaper], NoError> { public func telegramWallpapers(postbox: Postbox, network: Network, forceUpdate: Bool = false) -> Signal<[TelegramWallpaper], NoError> {
let fetch: ([TelegramWallpaper]?, Int64?) -> Signal<[TelegramWallpaper], NoError> = { current, hash in let fetch: ([TelegramWallpaper]?, Int64?) -> Signal<[TelegramWallpaper], NoError> = { current, hash in
network.request(Api.functions.account.getWallPapers(hash: 0)) network.request(Api.functions.account.getWallPapers(hash: hash))
|> retryRequest |> retryRequest
|> mapToSignal { result -> Signal<([TelegramWallpaper], Int64), NoError> in |> mapToSignal { result -> Signal<([TelegramWallpaper], Int64), NoError> in
switch result { switch result {
@ -65,7 +65,21 @@ public func telegramWallpapers(postbox: Postbox, network: Network, forceUpdate:
if items.count == 0 { if items.count == 0 {
return ([.builtin(WallpaperSettings())], 0) return ([.builtin(WallpaperSettings())], 0)
} else { } else {
return (items.map { $0.contents.get(TelegramWallpaperNativeCodable.self)!.value }, configuration?.hash) var success = true
var mappedItems: [TelegramWallpaper] = []
for item in items {
if let value = item.contents.get(TelegramWallpaperNativeCodable.self)?.value {
mappedItems.append(value)
} else {
success = false
break
}
}
if success {
return (mappedItems, configuration?.hash)
} else {
return ([.builtin(WallpaperSettings())], nil)
}
} }
} }
|> mapToSignal { current, hash -> Signal<[TelegramWallpaper], NoError> in |> mapToSignal { current, hash -> Signal<[TelegramWallpaper], NoError> in