Don't donate send message intents when passcode is enabled

Delete all already donated intents after passcode has been set up
This commit is contained in:
Ilya Laktyushin 2019-11-27 22:42:57 +04:00
parent ef78eb2879
commit e602216c7f
2 changed files with 85 additions and 70 deletions

View File

@ -15,6 +15,7 @@ import AccountContext
import LocalAuth
import PasscodeUI
import TelegramStringFormatting
import TelegramIntents
private final class PasscodeOptionsControllerArguments {
let turnPasscodeOff: () -> Void
@ -414,6 +415,7 @@ public func passcodeOptionsAccessController(context: AccountContext, animateIn:
}, error: { _ in
}, completed: {
completion(true)
deleteAllSendMessageIntents()
})
}
pushController?(setupController)

View File

@ -58,81 +58,94 @@ public enum SendMessageIntentSubject: CaseIterable {
public func donateSendMessageIntent(account: Account, sharedContext: SharedAccountContext, intentContext: SendMessageIntentContext, peerIds: [PeerId]) {
if #available(iOSApplicationExtension 13.2, iOS 13.2, *) {
let _ = (sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.intentsSettings])
|> mapToSignal { sharedData -> Signal<[(Peer, SendMessageIntentSubject)], NoError> in
let settings = (sharedData.entries[ApplicationSpecificSharedDataKeys.intentsSettings] as? IntentsSettings) ?? IntentsSettings.defaultSettings
if let accountId = settings.account, accountId != account.peerId {
return .single([])
}
if case .chat = intentContext, settings.onlyShared {
return .single([])
}
return account.postbox.transaction { transaction -> [(Peer, SendMessageIntentSubject)] in
var peers: [(Peer, SendMessageIntentSubject)] = []
for peerId in peerIds {
if peerId.namespace != Namespaces.Peer.SecretChat, let peer = transaction.getPeer(peerId) {
var subject: SendMessageIntentSubject?
let chatListIndex = transaction.getPeerChatListIndex(peerId)
if chatListIndex?.0 == Namespaces.PeerGroup.archive {
continue
}
if peerId.namespace == Namespaces.Peer.CloudUser {
if peerId == account.peerId {
if !settings.savedMessages {
continue
}
subject = .savedMessages
} else if transaction.isPeerContact(peerId: peerId) {
if !settings.contacts {
continue
}
subject = .contact
} else {
if !settings.privateChats {
continue
}
subject = .privateChat
}
} else if peerId.namespace == Namespaces.Peer.CloudGroup {
if !settings.groups {
continue
}
subject = .group
} else if let peer = peer as? TelegramChannel {
if case .group = peer.info {
if !settings.groups {
continue
}
subject = .group
} else {
continue
}
} else {
continue
}
if let subject = subject {
peers.append((peer, subject))
}
}
}
return peers
let _ = (sharedContext.accountManager.transaction { transaction -> Bool in
if case .none = transaction.getAccessChallengeData() {
return true
} else {
return false
}
}
|> mapToSignal { peers -> Signal<[(Peer, SendMessageIntentSubject, UIImage?)], NoError> in
var signals: [Signal<(Peer, SendMessageIntentSubject, UIImage?), NoError>] = []
for (peer, subject) in peers {
if peer.id == account.peerId {
signals.append(.single((peer, subject, savedMessagesAvatar)))
} else {
let peerAndAvatar = (peerAvatarImage(account: account, peer: peer, authorOfMessage: nil, representation: peer.smallProfileImage, round: false) ?? .single(nil))
|> map { avatarImage in
return (peer, subject, avatarImage)
|> mapToSignal { unlocked -> Signal<[(Peer, SendMessageIntentSubject, UIImage?)], NoError> in
if unlocked {
return sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.intentsSettings])
|> mapToSignal { sharedData -> Signal<[(Peer, SendMessageIntentSubject)], NoError> in
let settings = (sharedData.entries[ApplicationSpecificSharedDataKeys.intentsSettings] as? IntentsSettings) ?? IntentsSettings.defaultSettings
if let accountId = settings.account, accountId != account.peerId {
return .single([])
}
if case .chat = intentContext, settings.onlyShared {
return .single([])
}
return account.postbox.transaction { transaction -> [(Peer, SendMessageIntentSubject)] in
var peers: [(Peer, SendMessageIntentSubject)] = []
for peerId in peerIds {
if peerId.namespace != Namespaces.Peer.SecretChat, let peer = transaction.getPeer(peerId) {
var subject: SendMessageIntentSubject?
let chatListIndex = transaction.getPeerChatListIndex(peerId)
if chatListIndex?.0 == Namespaces.PeerGroup.archive {
continue
}
if peerId.namespace == Namespaces.Peer.CloudUser {
if peerId == account.peerId {
if !settings.savedMessages {
continue
}
subject = .savedMessages
} else if transaction.isPeerContact(peerId: peerId) {
if !settings.contacts {
continue
}
subject = .contact
} else {
if !settings.privateChats {
continue
}
subject = .privateChat
}
} else if peerId.namespace == Namespaces.Peer.CloudGroup {
if !settings.groups {
continue
}
subject = .group
} else if let peer = peer as? TelegramChannel {
if case .group = peer.info {
if !settings.groups {
continue
}
subject = .group
} else {
continue
}
} else {
continue
}
if let subject = subject {
peers.append((peer, subject))
}
}
}
return peers
}
signals.append(peerAndAvatar)
}
|> mapToSignal { peers -> Signal<[(Peer, SendMessageIntentSubject, UIImage?)], NoError> in
var signals: [Signal<(Peer, SendMessageIntentSubject, UIImage?), NoError>] = []
for (peer, subject) in peers {
if peer.id == account.peerId {
signals.append(.single((peer, subject, savedMessagesAvatar)))
} else {
let peerAndAvatar = (peerAvatarImage(account: account, peer: peer, authorOfMessage: nil, representation: peer.smallProfileImage, round: false) ?? .single(nil))
|> map { avatarImage in
return (peer, subject, avatarImage)
}
signals.append(peerAndAvatar)
}
}
return combineLatest(signals)
}
} else {
return .single([])
}
return combineLatest(signals)
}
|> deliverOnMainQueue).start(next: { peers in
let presentationData = sharedContext.currentPresentationData.with { $0 }