Experimental widget settings

This commit is contained in:
Ali
2020-10-30 20:58:02 +04:00
parent 70f5732f5f
commit 08040c1598
13 changed files with 1691 additions and 1056 deletions

View File

@@ -7,6 +7,7 @@ import WidgetItems
import TelegramPresentationData
import NotificationsPresentationData
import WidgetKit
import TelegramUIPreferences
final class WidgetDataContext {
private var currentAccount: Account?
@@ -24,7 +25,7 @@ final class WidgetDataContext {
return .single(.notAuthorized)
}
enum RecentPeers {
enum CombinedRecentPeers {
struct Unread {
var count: Int32
var isMuted: Bool
@@ -34,19 +35,47 @@ final class WidgetDataContext {
case peers(peers: [Peer], unread: [PeerId: Unread])
}
let recent: Signal<RecentPeers, NoError> = recentPeers(account: account)
|> mapToSignal { recent -> Signal<RecentPeers, NoError> in
let preferencesKey: PostboxViewKey = .preferences(keys: Set([
ApplicationSpecificPreferencesKeys.widgetSettings
]))
let sourcePeers: Signal<RecentPeers, NoError> = account.postbox.combinedView(keys: [
preferencesKey
])
|> mapToSignal { views -> Signal<RecentPeers, NoError> in
let widgetSettings: WidgetSettings
if let view = views.views[preferencesKey] as? PreferencesView, let value = view.values[ApplicationSpecificPreferencesKeys.widgetSettings] as? WidgetSettings {
widgetSettings = value
} else {
widgetSettings = .default
}
if widgetSettings.useHints {
return recentPeers(account: account)
} else {
return account.postbox.transaction { transaction -> RecentPeers in
return .peers(widgetSettings.peers.compactMap { peerId -> Peer? in
guard let peer = transaction.getPeer(peerId) else {
return nil
}
return peer
})
}
}
}
let recent: Signal<CombinedRecentPeers, NoError> = sourcePeers
|> mapToSignal { recent -> Signal<CombinedRecentPeers, NoError> in
switch recent {
case .disabled:
return .single(.disabled)
case let .peers(peers):
return combineLatest(queue: .mainQueue(), peers.filter { !$0.isDeleted }.map { account.postbox.peerView(id: $0.id)}) |> mapToSignal { peerViews -> Signal<RecentPeers, NoError> in
return combineLatest(queue: .mainQueue(), peers.filter { !$0.isDeleted }.map { account.postbox.peerView(id: $0.id)}) |> mapToSignal { peerViews -> Signal<CombinedRecentPeers, NoError> in
return account.postbox.unreadMessageCountsView(items: peerViews.map {
.peer($0.peerId)
})
|> map { values -> RecentPeers in
|> map { values -> CombinedRecentPeers in
var peers: [Peer] = []
var unread: [PeerId: RecentPeers.Unread] = [:]
var unread: [PeerId: CombinedRecentPeers.Unread] = [:]
for peerView in peerViews {
if let peer = peerViewMainPeer(peerView) {
var isMuted: Bool = false
@@ -61,7 +90,7 @@ final class WidgetDataContext {
let unreadCount = values.count(for: .peer(peerView.peerId))
if let unreadCount = unreadCount, unreadCount > 0 {
unread[peerView.peerId] = RecentPeers.Unread(count: Int32(unreadCount), isMuted: isMuted)
unread[peerView.peerId] = CombinedRecentPeers.Unread(count: Int32(unreadCount), isMuted: isMuted)
}
peers.append(peer)
@@ -80,20 +109,20 @@ final class WidgetDataContext {
return .disabled
case let .peers(peers, unread):
return .peers(WidgetDataPeers(accountPeerId: account.peerId.toInt64(), peers: peers.compactMap { peer -> WidgetDataPeer? in
guard let user = peer as? TelegramUser else {
return nil
}
var name: String = ""
var lastName: String?
if let firstName = user.firstName {
name = firstName
lastName = user.lastName
} else if let lastName = user.lastName {
name = lastName
} else if let phone = user.phone, !phone.isEmpty {
name = phone
if let user = peer as? TelegramUser {
if let firstName = user.firstName {
name = firstName
lastName = user.lastName
} else if let lastName = user.lastName {
name = lastName
} else if let phone = user.phone, !phone.isEmpty {
name = phone
}
} else {
name = peer.debugDisplayTitle
}
var badge: WidgetDataPeer.Badge?
@@ -104,7 +133,7 @@ final class WidgetDataContext {
)
}
return WidgetDataPeer(id: user.id.toInt64(), name: name, lastName: lastName, letters: user.displayLetters, avatarPath: smallestImageRepresentation(user.photo).flatMap { representation in
return WidgetDataPeer(id: peer.id.toInt64(), name: name, lastName: lastName, letters: peer.displayLetters, avatarPath: smallestImageRepresentation(peer.profileImageRepresentations).flatMap { representation in
return account.postbox.mediaBox.resourcePath(representation.resource)
}, badge: badge)
}))