mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-10-09 11:23:48 +00:00
More QR auth improvements
This commit is contained in:
parent
965d2628aa
commit
4c2b175845
@ -5136,3 +5136,8 @@ Any member of this group will be able to see messages in the channel.";
|
|||||||
"Appearance.TextSize.Title" = "Text Size";
|
"Appearance.TextSize.Title" = "Text Size";
|
||||||
"Appearance.TextSize.UseSystem" = "User System Text Size";
|
"Appearance.TextSize.UseSystem" = "User System Text Size";
|
||||||
"Appearance.TextSize.Apply" = "Set";
|
"Appearance.TextSize.Apply" = "Set";
|
||||||
|
|
||||||
|
"Settings.Devices" = "Devices";
|
||||||
|
"Settings.AddDevice" = "Add";
|
||||||
|
"AuthSessions.DevicesTitle" = "Devices";
|
||||||
|
"AuthSessions.AddDevice" = "Add Device";
|
||||||
|
@ -72,14 +72,16 @@ private func generateFrameImage() -> UIImage? {
|
|||||||
|
|
||||||
public final class AuthTransferScanScreen: ViewController {
|
public final class AuthTransferScanScreen: ViewController {
|
||||||
private let context: AccountContext
|
private let context: AccountContext
|
||||||
|
private let activeSessionsContext: ActiveSessionsContext?
|
||||||
private var presentationData: PresentationData
|
private var presentationData: PresentationData
|
||||||
|
|
||||||
private var codeDisposable: Disposable?
|
private var codeDisposable: Disposable?
|
||||||
private var inForegroundDisposable: Disposable?
|
private var inForegroundDisposable: Disposable?
|
||||||
private let approveDisposable = MetaDisposable()
|
private let approveDisposable = MetaDisposable()
|
||||||
|
|
||||||
public init(context: AccountContext) {
|
public init(context: AccountContext, activeSessionsContext: ActiveSessionsContext?) {
|
||||||
self.context = context
|
self.context = context
|
||||||
|
self.activeSessionsContext = activeSessionsContext
|
||||||
|
|
||||||
self.presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
self.presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||||
|
|
||||||
@ -155,6 +157,10 @@ public final class AuthTransferScanScreen: ViewController {
|
|||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
let activeSessionsContext = strongSelf.activeSessionsContext
|
||||||
|
Queue.mainQueue().after(1.5, {
|
||||||
|
activeSessionsContext?.loadMore()
|
||||||
|
})
|
||||||
strongSelf.dismiss()
|
strongSelf.dismiss()
|
||||||
}))
|
}))
|
||||||
}, cancel: {
|
}, cancel: {
|
||||||
@ -189,6 +195,7 @@ private final class AuthTransferScanScreenNode: ViewControllerTracingNode, UIScr
|
|||||||
private let torchButtonNode: GlassButtonNode
|
private let torchButtonNode: GlassButtonNode
|
||||||
private let titleNode: ImmediateTextNode
|
private let titleNode: ImmediateTextNode
|
||||||
private let textNode: ImmediateTextNode
|
private let textNode: ImmediateTextNode
|
||||||
|
private let descriptionNode: ImmediateTextNode
|
||||||
|
|
||||||
private let camera: Camera
|
private let camera: Camera
|
||||||
private let codeDisposable = MetaDisposable()
|
private let codeDisposable = MetaDisposable()
|
||||||
@ -247,6 +254,12 @@ private final class AuthTransferScanScreenNode: ViewControllerTracingNode, UIScr
|
|||||||
self.textNode.maximumNumberOfLines = 0
|
self.textNode.maximumNumberOfLines = 0
|
||||||
self.textNode.textAlignment = .center
|
self.textNode.textAlignment = .center
|
||||||
|
|
||||||
|
self.descriptionNode = ImmediateTextNode()
|
||||||
|
self.descriptionNode.displaysAsynchronously = false
|
||||||
|
self.descriptionNode.attributedText = NSAttributedString(string: "Telegram is available for\niPhone, iPad, macOS, Windows and Linux", font: Font.regular(14.0), textColor: .white)
|
||||||
|
self.descriptionNode.maximumNumberOfLines = 0
|
||||||
|
self.descriptionNode.textAlignment = .center
|
||||||
|
|
||||||
self.camera = Camera(configuration: .init(preset: .hd1920x1080, position: .back, audio: false))
|
self.camera = Camera(configuration: .init(preset: .hd1920x1080, position: .back, audio: false))
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
@ -261,9 +274,10 @@ private final class AuthTransferScanScreenNode: ViewControllerTracingNode, UIScr
|
|||||||
self.addSubnode(self.rightDimNode)
|
self.addSubnode(self.rightDimNode)
|
||||||
self.addSubnode(self.centerDimNode)
|
self.addSubnode(self.centerDimNode)
|
||||||
self.addSubnode(self.frameNode)
|
self.addSubnode(self.frameNode)
|
||||||
self.addSubnode(self.torchButtonNode)
|
//self.addSubnode(self.torchButtonNode)
|
||||||
self.addSubnode(self.titleNode)
|
self.addSubnode(self.titleNode)
|
||||||
self.addSubnode(self.textNode)
|
self.addSubnode(self.textNode)
|
||||||
|
self.addSubnode(self.descriptionNode)
|
||||||
|
|
||||||
self.torchButtonNode.addTarget(self, action: #selector(self.torchPressed), forControlEvents: .touchUpInside)
|
self.torchButtonNode.addTarget(self, action: #selector(self.torchPressed), forControlEvents: .touchUpInside)
|
||||||
}
|
}
|
||||||
@ -408,14 +422,18 @@ private final class AuthTransferScanScreenNode: ViewControllerTracingNode, UIScr
|
|||||||
|
|
||||||
transition.updateAlpha(node: self.titleNode, alpha: controlsAlpha)
|
transition.updateAlpha(node: self.titleNode, alpha: controlsAlpha)
|
||||||
transition.updateAlpha(node: self.textNode, alpha: controlsAlpha)
|
transition.updateAlpha(node: self.textNode, alpha: controlsAlpha)
|
||||||
|
transition.updateAlpha(node: self.descriptionNode, alpha: controlsAlpha)
|
||||||
transition.updateAlpha(node: self.torchButtonNode, alpha: controlsAlpha)
|
transition.updateAlpha(node: self.torchButtonNode, alpha: controlsAlpha)
|
||||||
|
|
||||||
let titleSize = self.titleNode.updateLayout(CGSize(width: layout.size.width - sideInset * 2.0, height: layout.size.height))
|
let titleSize = self.titleNode.updateLayout(CGSize(width: layout.size.width - sideInset * 2.0, height: layout.size.height))
|
||||||
let textSize = self.textNode.updateLayout(CGSize(width: layout.size.width - sideInset * 2.0, height: layout.size.height))
|
let textSize = self.textNode.updateLayout(CGSize(width: layout.size.width - sideInset * 2.0, height: layout.size.height))
|
||||||
|
let descriptionSize = self.descriptionNode.updateLayout(CGSize(width: layout.size.width - sideInset * 2.0, height: layout.size.height))
|
||||||
let textFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - textSize.width) / 2.0), y: dimHeight - textSize.height - titleSpacing), size: textSize)
|
let textFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - textSize.width) / 2.0), y: dimHeight - textSize.height - titleSpacing), size: textSize)
|
||||||
let titleFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - titleSize.width) / 2.0), y: textFrame.minY - 18.0 - titleSize.height), size: titleSize)
|
let titleFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - titleSize.width) / 2.0), y: textFrame.minY - 18.0 - titleSize.height), size: titleSize)
|
||||||
|
let descriptionFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - descriptionSize.width) / 2.0), y: layout.size.height - dimHeight + titleSpacing), size: descriptionSize)
|
||||||
transition.updateFrameAdditive(node: self.titleNode, frame: titleFrame)
|
transition.updateFrameAdditive(node: self.titleNode, frame: titleFrame)
|
||||||
transition.updateFrameAdditive(node: self.textNode, frame: textFrame)
|
transition.updateFrameAdditive(node: self.textNode, frame: textFrame)
|
||||||
|
transition.updateFrameAdditive(node: self.descriptionNode, frame: descriptionFrame)
|
||||||
|
|
||||||
if let confirmationNode = self.confirmationNode {
|
if let confirmationNode = self.confirmationNode {
|
||||||
confirmationNode.updateLayout(layout: layout, transition: transition)
|
confirmationNode.updateLayout(layout: layout, transition: transition)
|
||||||
|
@ -427,7 +427,7 @@ private func privacyAndSecurityControllerEntries(presentationData: PresentationD
|
|||||||
return entries
|
return entries
|
||||||
}
|
}
|
||||||
|
|
||||||
public func privacyAndSecurityController(context: AccountContext, initialSettings: AccountPrivacySettings? = nil, updatedSettings: ((AccountPrivacySettings?) -> Void)? = nil, focusOnItemTag: PrivacyAndSecurityEntryTag? = nil) -> ViewController {
|
public func privacyAndSecurityController(context: AccountContext, initialSettings: AccountPrivacySettings? = nil, updatedSettings: ((AccountPrivacySettings?) -> Void)? = nil, focusOnItemTag: PrivacyAndSecurityEntryTag? = nil, activeSessionsContext: ActiveSessionsContext? = nil) -> ViewController {
|
||||||
let statePromise = ValuePromise(PrivacyAndSecurityControllerState(), ignoreRepeated: true)
|
let statePromise = ValuePromise(PrivacyAndSecurityControllerState(), ignoreRepeated: true)
|
||||||
let stateValue = Atomic(value: PrivacyAndSecurityControllerState())
|
let stateValue = Atomic(value: PrivacyAndSecurityControllerState())
|
||||||
let updateState: ((PrivacyAndSecurityControllerState) -> PrivacyAndSecurityControllerState) -> Void = { f in
|
let updateState: ((PrivacyAndSecurityControllerState) -> PrivacyAndSecurityControllerState) -> Void = { f in
|
||||||
@ -450,7 +450,7 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting
|
|||||||
privacySettingsPromise.set(.single(initialSettings) |> then(requestAccountPrivacySettings(account: context.account) |> map(Optional.init)))
|
privacySettingsPromise.set(.single(initialSettings) |> then(requestAccountPrivacySettings(account: context.account) |> map(Optional.init)))
|
||||||
|
|
||||||
let blockedPeersContext = BlockedPeersContext(account: context.account)
|
let blockedPeersContext = BlockedPeersContext(account: context.account)
|
||||||
let activeSessionsContext = ActiveSessionsContext(account: context.account)
|
let activeSessionsContext = activeSessionsContext ?? ActiveSessionsContext(account: context.account)
|
||||||
|
|
||||||
let updateTwoStepAuthDisposable = MetaDisposable()
|
let updateTwoStepAuthDisposable = MetaDisposable()
|
||||||
actionsDisposable.add(updateTwoStepAuthDisposable)
|
actionsDisposable.add(updateTwoStepAuthDisposable)
|
||||||
|
@ -10,6 +10,7 @@ import TelegramUIPreferences
|
|||||||
import ItemListUI
|
import ItemListUI
|
||||||
import PresentationDataUtils
|
import PresentationDataUtils
|
||||||
import AccountContext
|
import AccountContext
|
||||||
|
import AuthTransferUI
|
||||||
|
|
||||||
private final class RecentSessionsControllerArguments {
|
private final class RecentSessionsControllerArguments {
|
||||||
let account: Account
|
let account: Account
|
||||||
@ -21,7 +22,9 @@ private final class RecentSessionsControllerArguments {
|
|||||||
let removeWebSession: (Int64) -> Void
|
let removeWebSession: (Int64) -> Void
|
||||||
let terminateAllWebSessions: () -> Void
|
let terminateAllWebSessions: () -> Void
|
||||||
|
|
||||||
init(account: Account, setSessionIdWithRevealedOptions: @escaping (Int64?, Int64?) -> Void, removeSession: @escaping (Int64) -> Void, terminateOtherSessions: @escaping () -> Void, removeWebSession: @escaping (Int64) -> Void, terminateAllWebSessions: @escaping () -> Void) {
|
let addDevice: () -> Void
|
||||||
|
|
||||||
|
init(account: Account, setSessionIdWithRevealedOptions: @escaping (Int64?, Int64?) -> Void, removeSession: @escaping (Int64) -> Void, terminateOtherSessions: @escaping () -> Void, removeWebSession: @escaping (Int64) -> Void, terminateAllWebSessions: @escaping () -> Void, addDevice: @escaping () -> Void) {
|
||||||
self.account = account
|
self.account = account
|
||||||
self.setSessionIdWithRevealedOptions = setSessionIdWithRevealedOptions
|
self.setSessionIdWithRevealedOptions = setSessionIdWithRevealedOptions
|
||||||
self.removeSession = removeSession
|
self.removeSession = removeSession
|
||||||
@ -29,6 +32,8 @@ private final class RecentSessionsControllerArguments {
|
|||||||
|
|
||||||
self.removeWebSession = removeWebSession
|
self.removeWebSession = removeWebSession
|
||||||
self.terminateAllWebSessions = terminateAllWebSessions
|
self.terminateAllWebSessions = terminateAllWebSessions
|
||||||
|
|
||||||
|
self.addDevice = addDevice
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,6 +89,7 @@ private enum RecentSessionsEntry: ItemListNodeEntry {
|
|||||||
case pendingSession(index: Int32, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, session: RecentAccountSession, enabled: Bool, editing: Bool, revealed: Bool)
|
case pendingSession(index: Int32, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, session: RecentAccountSession, enabled: Bool, editing: Bool, revealed: Bool)
|
||||||
case pendingSessionsInfo(PresentationTheme, String)
|
case pendingSessionsInfo(PresentationTheme, String)
|
||||||
case otherSessionsHeader(PresentationTheme, String)
|
case otherSessionsHeader(PresentationTheme, String)
|
||||||
|
case addDevice(PresentationTheme, String)
|
||||||
case session(index: Int32, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, session: RecentAccountSession, enabled: Bool, editing: Bool, revealed: Bool)
|
case session(index: Int32, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, session: RecentAccountSession, enabled: Bool, editing: Bool, revealed: Bool)
|
||||||
case website(index: Int32, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, website: WebAuthorization, peer: Peer?, enabled: Bool, editing: Bool, revealed: Bool)
|
case website(index: Int32, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, website: WebAuthorization, peer: Peer?, enabled: Bool, editing: Bool, revealed: Bool)
|
||||||
|
|
||||||
@ -93,7 +99,7 @@ private enum RecentSessionsEntry: ItemListNodeEntry {
|
|||||||
return RecentSessionsSection.currentSession.rawValue
|
return RecentSessionsSection.currentSession.rawValue
|
||||||
case .pendingSessionsHeader, .pendingSession, .pendingSessionsInfo:
|
case .pendingSessionsHeader, .pendingSession, .pendingSessionsInfo:
|
||||||
return RecentSessionsSection.pendingSessions.rawValue
|
return RecentSessionsSection.pendingSessions.rawValue
|
||||||
case .otherSessionsHeader, .session, .website:
|
case .otherSessionsHeader, .addDevice, .session, .website:
|
||||||
return RecentSessionsSection.otherSessions.rawValue
|
return RecentSessionsSection.otherSessions.rawValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -118,6 +124,8 @@ private enum RecentSessionsEntry: ItemListNodeEntry {
|
|||||||
return .index(6)
|
return .index(6)
|
||||||
case .otherSessionsHeader:
|
case .otherSessionsHeader:
|
||||||
return .index(7)
|
return .index(7)
|
||||||
|
case .addDevice:
|
||||||
|
return .index(8)
|
||||||
case let .session(_, _, _, _, session, _, _, _):
|
case let .session(_, _, _, _, session, _, _, _):
|
||||||
return .session(session.hash)
|
return .session(session.hash)
|
||||||
case let .website(_, _, _, _, _, website, _, _, _, _):
|
case let .website(_, _, _, _, _, website, _, _, _, _):
|
||||||
@ -175,6 +183,12 @@ private enum RecentSessionsEntry: ItemListNodeEntry {
|
|||||||
} else {
|
} else {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
case let .addDevice(lhsTheme, lhsText):
|
||||||
|
if case let .addDevice(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
case let .currentSession(lhsTheme, lhsStrings, lhsDateTimeFormat, lhsSession):
|
case let .currentSession(lhsTheme, lhsStrings, lhsDateTimeFormat, lhsSession):
|
||||||
if case let .currentSession(rhsTheme, rhsStrings, rhsDateTimeFormat, rhsSession) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsSession == rhsSession {
|
if case let .currentSession(rhsTheme, rhsStrings, rhsDateTimeFormat, rhsSession) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsSession == rhsSession {
|
||||||
return true
|
return true
|
||||||
@ -271,6 +285,10 @@ private enum RecentSessionsEntry: ItemListNodeEntry {
|
|||||||
return ItemListTextItem(presentationData: presentationData, text: .plain(text), sectionId: self.section)
|
return ItemListTextItem(presentationData: presentationData, text: .plain(text), sectionId: self.section)
|
||||||
case let .otherSessionsHeader(theme, text):
|
case let .otherSessionsHeader(theme, text):
|
||||||
return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section)
|
return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section)
|
||||||
|
case let .addDevice(theme, text):
|
||||||
|
return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: {
|
||||||
|
arguments.addDevice()
|
||||||
|
})
|
||||||
case let .session(_, theme, strings, dateTimeFormat, session, enabled, editing, revealed):
|
case let .session(_, theme, strings, dateTimeFormat, session, enabled, editing, revealed):
|
||||||
return ItemListRecentSessionItem(presentationData: presentationData, dateTimeFormat: dateTimeFormat, session: session, enabled: enabled, editable: true, editing: editing, revealed: revealed, sectionId: self.section, setSessionIdWithRevealedOptions: { previousId, id in
|
return ItemListRecentSessionItem(presentationData: presentationData, dateTimeFormat: dateTimeFormat, session: session, enabled: enabled, editable: true, editing: editing, revealed: revealed, sectionId: self.section, setSessionIdWithRevealedOptions: { previousId, id in
|
||||||
arguments.setSessionIdWithRevealedOptions(previousId, id)
|
arguments.setSessionIdWithRevealedOptions(previousId, id)
|
||||||
@ -370,6 +388,8 @@ private func recentSessionsControllerEntries(presentationData: PresentationData,
|
|||||||
|
|
||||||
entries.append(.otherSessionsHeader(presentationData.theme, presentationData.strings.AuthSessions_OtherSessions))
|
entries.append(.otherSessionsHeader(presentationData.theme, presentationData.strings.AuthSessions_OtherSessions))
|
||||||
|
|
||||||
|
entries.append(.addDevice(presentationData.theme, presentationData.strings.AuthSessions_AddDevice))
|
||||||
|
|
||||||
let filteredSessions: [RecentAccountSession] = sessionsState.sessions.sorted(by: { lhs, rhs in
|
let filteredSessions: [RecentAccountSession] = sessionsState.sessions.sorted(by: { lhs, rhs in
|
||||||
return lhs.activityDate > rhs.activityDate
|
return lhs.activityDate > rhs.activityDate
|
||||||
})
|
})
|
||||||
@ -421,7 +441,10 @@ public func recentSessionsController(context: AccountContext, activeSessionsCont
|
|||||||
statePromise.set(stateValue.modify { f($0) })
|
statePromise.set(stateValue.modify { f($0) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
activeSessionsContext.loadMore()
|
||||||
|
|
||||||
var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)?
|
var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)?
|
||||||
|
var pushControllerImpl: ((ViewController) -> Void)?
|
||||||
|
|
||||||
let actionsDisposable = DisposableSet()
|
let actionsDisposable = DisposableSet()
|
||||||
|
|
||||||
@ -575,6 +598,8 @@ public func recentSessionsController(context: AccountContext, activeSessionsCont
|
|||||||
ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
|
ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
|
||||||
])
|
])
|
||||||
presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
|
presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
|
||||||
|
}, addDevice: {
|
||||||
|
pushControllerImpl?(AuthTransferScanScreen(context: context, activeSessionsContext: activeSessionsContext))
|
||||||
})
|
})
|
||||||
|
|
||||||
let websitesSignal: Signal<([WebAuthorization], [PeerId : Peer])?, NoError> = .single(nil) |> then(webSessions(network: context.account.network) |> map(Optional.init))
|
let websitesSignal: Signal<([WebAuthorization], [PeerId : Peer])?, NoError> = .single(nil) |> then(webSessions(network: context.account.network) |> map(Optional.init))
|
||||||
@ -619,7 +644,7 @@ public func recentSessionsController(context: AccountContext, activeSessionsCont
|
|||||||
if let websites = websites, !websites.isEmpty {
|
if let websites = websites, !websites.isEmpty {
|
||||||
title = .sectionControl([presentationData.strings.AuthSessions_Sessions, presentationData.strings.AuthSessions_LoggedIn], mode.rawValue)
|
title = .sectionControl([presentationData.strings.AuthSessions_Sessions, presentationData.strings.AuthSessions_LoggedIn], mode.rawValue)
|
||||||
} else {
|
} else {
|
||||||
title = .text(presentationData.strings.AuthSessions_Title)
|
title = .text(presentationData.strings.AuthSessions_DevicesTitle)
|
||||||
}
|
}
|
||||||
|
|
||||||
var animateChanges = true
|
var animateChanges = true
|
||||||
@ -655,6 +680,9 @@ public func recentSessionsController(context: AccountContext, activeSessionsCont
|
|||||||
controller.present(c, in: .window(.root), with: p)
|
controller.present(c, in: .window(.root), with: p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pushControllerImpl = { [weak controller] c in
|
||||||
|
controller?.push(c)
|
||||||
|
}
|
||||||
|
|
||||||
return controller
|
return controller
|
||||||
}
|
}
|
||||||
|
@ -610,7 +610,7 @@ private struct SettingsState: Equatable {
|
|||||||
var isSearching: Bool
|
var isSearching: Bool
|
||||||
}
|
}
|
||||||
|
|
||||||
private func settingsEntries(account: Account, presentationData: PresentationData, state: SettingsState, view: PeerView, proxySettings: ProxySettings, notifyExceptions: NotificationExceptionsList?, notificationsAuthorizationStatus: AccessType, notificationsWarningSuppressed: Bool, unreadTrendingStickerPacks: Int, archivedPacks: [ArchivedStickerPackItem]?, privacySettings: AccountPrivacySettings?, hasWallet: Bool, hasPassport: Bool, hasWatchApp: Bool, accountsAndPeers: [(Account, Peer, Int32)], inAppNotificationSettings: InAppNotificationSettings, experimentalUISettings: ExperimentalUISettings, displayPhoneNumberConfirmation: Bool) -> [SettingsEntry] {
|
private func settingsEntries(account: Account, presentationData: PresentationData, state: SettingsState, view: PeerView, proxySettings: ProxySettings, notifyExceptions: NotificationExceptionsList?, notificationsAuthorizationStatus: AccessType, notificationsWarningSuppressed: Bool, unreadTrendingStickerPacks: Int, archivedPacks: [ArchivedStickerPackItem]?, privacySettings: AccountPrivacySettings?, hasWallet: Bool, hasPassport: Bool, hasWatchApp: Bool, accountsAndPeers: [(Account, Peer, Int32)], inAppNotificationSettings: InAppNotificationSettings, experimentalUISettings: ExperimentalUISettings, displayPhoneNumberConfirmation: Bool, otherSessionCount: Int) -> [SettingsEntry] {
|
||||||
var entries: [SettingsEntry] = []
|
var entries: [SettingsEntry] = []
|
||||||
|
|
||||||
if let peer = peerViewMainPeer(view) as? TelegramUser {
|
if let peer = peerViewMainPeer(view) as? TelegramUser {
|
||||||
@ -659,7 +659,7 @@ private func settingsEntries(account: Account, presentationData: PresentationDat
|
|||||||
entries.append(.savedMessages(presentationData.theme, PresentationResourcesSettings.savedMessages, presentationData.strings.Settings_SavedMessages))
|
entries.append(.savedMessages(presentationData.theme, PresentationResourcesSettings.savedMessages, presentationData.strings.Settings_SavedMessages))
|
||||||
entries.append(.recentCalls(presentationData.theme, PresentationResourcesSettings.recentCalls, presentationData.strings.CallSettings_RecentCalls))
|
entries.append(.recentCalls(presentationData.theme, PresentationResourcesSettings.recentCalls, presentationData.strings.CallSettings_RecentCalls))
|
||||||
entries.append(.stickers(presentationData.theme, PresentationResourcesSettings.stickers, presentationData.strings.ChatSettings_Stickers, unreadTrendingStickerPacks == 0 ? "" : "\(unreadTrendingStickerPacks)", archivedPacks))
|
entries.append(.stickers(presentationData.theme, PresentationResourcesSettings.stickers, presentationData.strings.ChatSettings_Stickers, unreadTrendingStickerPacks == 0 ? "" : "\(unreadTrendingStickerPacks)", archivedPacks))
|
||||||
entries.append(.devices(presentationData.theme, PresentationResourcesSettings.stickers, "Devices", ""))
|
entries.append(.devices(presentationData.theme, UIImage(bundleImageName: "Settings/MenuIcons/Sessions")?.precomposed(), presentationData.strings.Settings_Devices, otherSessionCount == 0 ? presentationData.strings.Settings_AddDevice : "\(otherSessionCount)"))
|
||||||
|
|
||||||
let notificationsWarning = shouldDisplayNotificationsPermissionWarning(status: notificationsAuthorizationStatus, suppressed: notificationsWarningSuppressed)
|
let notificationsWarning = shouldDisplayNotificationsPermissionWarning(status: notificationsAuthorizationStatus, suppressed: notificationsWarningSuppressed)
|
||||||
entries.append(.notificationsAndSounds(presentationData.theme, PresentationResourcesSettings.notifications, presentationData.strings.Settings_NotificationsAndSounds, notifyExceptions, notificationsWarning))
|
entries.append(.notificationsAndSounds(presentationData.theme, PresentationResourcesSettings.notifications, presentationData.strings.Settings_NotificationsAndSounds, notifyExceptions, notificationsWarning))
|
||||||
@ -839,6 +839,23 @@ public func settingsController(context: AccountContext, accountManager: AccountM
|
|||||||
|
|
||||||
let displayPhoneNumberConfirmation = ValuePromise<Bool>(false)
|
let displayPhoneNumberConfirmation = ValuePromise<Bool>(false)
|
||||||
|
|
||||||
|
let activeSessionsContextAndCountSignal = contextValue.get()
|
||||||
|
|> deliverOnMainQueue
|
||||||
|
|> mapToSignal { context -> Signal<(ActiveSessionsContext, Int), NoError> in
|
||||||
|
let activeSessionsContext = ActiveSessionsContext(account: context.account)
|
||||||
|
let otherSessionCount = activeSessionsContext.state
|
||||||
|
|> map { state -> Int in
|
||||||
|
return state.sessions.filter({ !$0.isCurrent }).count
|
||||||
|
}
|
||||||
|
|> distinctUntilChanged
|
||||||
|
return otherSessionCount
|
||||||
|
|> map { value in
|
||||||
|
return (activeSessionsContext, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let activeSessionsContextAndCount = Promise<(ActiveSessionsContext, Int)>()
|
||||||
|
activeSessionsContextAndCount.set(activeSessionsContextAndCountSignal)
|
||||||
|
|
||||||
let arguments = SettingsItemArguments(accountManager: accountManager, avatarAndNameInfoContext: avatarAndNameInfoContext, avatarTapAction: {
|
let arguments = SettingsItemArguments(accountManager: accountManager, avatarAndNameInfoContext: avatarAndNameInfoContext, avatarTapAction: {
|
||||||
var updating = false
|
var updating = false
|
||||||
updateState {
|
updateState {
|
||||||
@ -896,9 +913,13 @@ public func settingsController(context: AccountContext, accountManager: AccountM
|
|||||||
let _ = (contextValue.get()
|
let _ = (contextValue.get()
|
||||||
|> deliverOnMainQueue
|
|> deliverOnMainQueue
|
||||||
|> take(1)).start(next: { context in
|
|> take(1)).start(next: { context in
|
||||||
|
let _ = (activeSessionsContextAndCount.get()
|
||||||
|
|> deliverOnMainQueue
|
||||||
|
|> take(1)).start(next: { activeSessionsContext, _ in
|
||||||
pushControllerImpl?(privacyAndSecurityController(context: context, initialSettings: privacySettingsValue, updatedSettings: { settings in
|
pushControllerImpl?(privacyAndSecurityController(context: context, initialSettings: privacySettingsValue, updatedSettings: { settings in
|
||||||
privacySettings.set(.single(settings))
|
privacySettings.set(.single(settings))
|
||||||
}))
|
}, activeSessionsContext: activeSessionsContext))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}, openDataAndStorage: {
|
}, openDataAndStorage: {
|
||||||
let _ = (contextValue.get()
|
let _ = (contextValue.get()
|
||||||
@ -1067,10 +1088,14 @@ public func settingsController(context: AccountContext, accountManager: AccountM
|
|||||||
gesture?.cancel()
|
gesture?.cancel()
|
||||||
}
|
}
|
||||||
}, openDevices: {
|
}, openDevices: {
|
||||||
let _ = (contextValue.get()
|
let _ = (activeSessionsContextAndCount.get()
|
||||||
|> deliverOnMainQueue
|
|> deliverOnMainQueue
|
||||||
|> take(1)).start(next: { context in
|
|> take(1)).start(next: { activeSessionsContext, count in
|
||||||
pushControllerImpl?(AuthTransferScanScreen(context: context))
|
if count == 0 {
|
||||||
|
pushControllerImpl?(AuthTransferScanScreen(context: context, activeSessionsContext: activeSessionsContext))
|
||||||
|
} else {
|
||||||
|
pushControllerImpl?(recentSessionsController(context: context, activeSessionsContext: activeSessionsContext))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -1308,8 +1333,10 @@ public func settingsController(context: AccountContext, accountManager: AccountM
|
|||||||
return context.account.viewTracker.featuredStickerPacks()
|
return context.account.viewTracker.featuredStickerPacks()
|
||||||
}
|
}
|
||||||
|
|
||||||
let signal = combineLatest(queue: Queue.mainQueue(), contextValue.get(), updatedPresentationData, statePromise.get(), peerView, combineLatest(queue: Queue.mainQueue(), preferences, notifyExceptions.get(), notificationsAuthorizationStatus.get(), notificationsWarningSuppressed.get(), privacySettings.get(), displayPhoneNumberConfirmation.get()), combineLatest(featuredStickerPacks, archivedPacks.get()), combineLatest(hasWallet, hasPassport.get(), hasWatchApp), accountsAndPeers.get())
|
let signal = combineLatest(queue: Queue.mainQueue(), contextValue.get(), updatedPresentationData, statePromise.get(), peerView, combineLatest(queue: Queue.mainQueue(), preferences, notifyExceptions.get(), notificationsAuthorizationStatus.get(), notificationsWarningSuppressed.get(), privacySettings.get(), displayPhoneNumberConfirmation.get()), combineLatest(featuredStickerPacks, archivedPacks.get()), combineLatest(hasWallet, hasPassport.get(), hasWatchApp), accountsAndPeers.get(), activeSessionsContextAndCount.get())
|
||||||
|> map { context, presentationData, state, view, preferencesAndExceptions, featuredAndArchived, hasWalletPassportAndWatch, accountsAndPeers -> (ItemListControllerState, (ItemListNodeState, Any)) in
|
|> map { context, presentationData, state, view, preferencesAndExceptions, featuredAndArchived, hasWalletPassportAndWatch, accountsAndPeers, activeSessionsContextAndCount -> (ItemListControllerState, (ItemListNodeState, Any)) in
|
||||||
|
let otherSessionCount = activeSessionsContextAndCount.1
|
||||||
|
|
||||||
let proxySettings: ProxySettings = preferencesAndExceptions.0.entries[SharedDataKeys.proxySettings] as? ProxySettings ?? ProxySettings.defaultSettings
|
let proxySettings: ProxySettings = preferencesAndExceptions.0.entries[SharedDataKeys.proxySettings] as? ProxySettings ?? ProxySettings.defaultSettings
|
||||||
let inAppNotificationSettings: InAppNotificationSettings = preferencesAndExceptions.0.entries[ApplicationSpecificSharedDataKeys.inAppNotificationSettings] as? InAppNotificationSettings ?? InAppNotificationSettings.defaultSettings
|
let inAppNotificationSettings: InAppNotificationSettings = preferencesAndExceptions.0.entries[ApplicationSpecificSharedDataKeys.inAppNotificationSettings] as? InAppNotificationSettings ?? InAppNotificationSettings.defaultSettings
|
||||||
let experimentalUISettings: ExperimentalUISettings = preferencesAndExceptions.0.entries[ApplicationSpecificSharedDataKeys.experimentalUISettings] as? ExperimentalUISettings ?? ExperimentalUISettings.defaultSettings
|
let experimentalUISettings: ExperimentalUISettings = preferencesAndExceptions.0.entries[ApplicationSpecificSharedDataKeys.experimentalUISettings] as? ExperimentalUISettings ?? ExperimentalUISettings.defaultSettings
|
||||||
@ -1347,7 +1374,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM
|
|||||||
}, getNavigationController: getNavigationControllerImpl, exceptionsList: notifyExceptions.get(), archivedStickerPacks: archivedPacks.get(), privacySettings: privacySettings.get(), hasWallet: hasWallet)
|
}, getNavigationController: getNavigationControllerImpl, exceptionsList: notifyExceptions.get(), archivedStickerPacks: archivedPacks.get(), privacySettings: privacySettings.get(), hasWallet: hasWallet)
|
||||||
|
|
||||||
let (hasWallet, hasPassport, hasWatchApp) = hasWalletPassportAndWatch
|
let (hasWallet, hasPassport, hasWatchApp) = hasWalletPassportAndWatch
|
||||||
let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: settingsEntries(account: context.account, presentationData: presentationData, state: state, view: view, proxySettings: proxySettings, notifyExceptions: preferencesAndExceptions.1, notificationsAuthorizationStatus: preferencesAndExceptions.2, notificationsWarningSuppressed: preferencesAndExceptions.3, unreadTrendingStickerPacks: unreadTrendingStickerPacks, archivedPacks: featuredAndArchived.1, privacySettings: preferencesAndExceptions.4, hasWallet: hasWallet, hasPassport: hasPassport, hasWatchApp: hasWatchApp, accountsAndPeers: accountsAndPeers.1, inAppNotificationSettings: inAppNotificationSettings, experimentalUISettings: experimentalUISettings, displayPhoneNumberConfirmation: preferencesAndExceptions.5), style: .blocks, searchItem: searchItem, initialScrollToItem: ListViewScrollToItem(index: 0, position: .top(-navigationBarSearchContentHeight), animated: false, curve: .Default(duration: 0.0), directionHint: .Up))
|
let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: settingsEntries(account: context.account, presentationData: presentationData, state: state, view: view, proxySettings: proxySettings, notifyExceptions: preferencesAndExceptions.1, notificationsAuthorizationStatus: preferencesAndExceptions.2, notificationsWarningSuppressed: preferencesAndExceptions.3, unreadTrendingStickerPacks: unreadTrendingStickerPacks, archivedPacks: featuredAndArchived.1, privacySettings: preferencesAndExceptions.4, hasWallet: hasWallet, hasPassport: hasPassport, hasWatchApp: hasWatchApp, accountsAndPeers: accountsAndPeers.1, inAppNotificationSettings: inAppNotificationSettings, experimentalUISettings: experimentalUISettings, displayPhoneNumberConfirmation: preferencesAndExceptions.5, otherSessionCount: otherSessionCount), style: .blocks, searchItem: searchItem, initialScrollToItem: ListViewScrollToItem(index: 0, position: .top(-navigationBarSearchContentHeight), animated: false, curve: .Default(duration: 0.0), directionHint: .Up))
|
||||||
|
|
||||||
return (controllerState, (listState, arguments))
|
return (controllerState, (listState, arguments))
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@ -448,12 +448,12 @@ public final class WalletStrings: Equatable {
|
|||||||
public var Wallet_SecureStorageReset_Title: String { return self._s[218]! }
|
public var Wallet_SecureStorageReset_Title: String { return self._s[218]! }
|
||||||
public var Wallet_Receive_CommentHeader: String { return self._s[219]! }
|
public var Wallet_Receive_CommentHeader: String { return self._s[219]! }
|
||||||
public var Wallet_Info_ReceiveGrams: String { return self._s[220]! }
|
public var Wallet_Info_ReceiveGrams: String { return self._s[220]! }
|
||||||
public func Wallet_Updated_HoursAgo(_ value: Int32) -> String {
|
public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String {
|
||||||
let form = getPluralizationForm(self.lc, value)
|
let form = getPluralizationForm(self.lc, value)
|
||||||
let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator)
|
let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator)
|
||||||
return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue)
|
return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue)
|
||||||
}
|
}
|
||||||
public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String {
|
public func Wallet_Updated_HoursAgo(_ value: Int32) -> String {
|
||||||
let form = getPluralizationForm(self.lc, value)
|
let form = getPluralizationForm(self.lc, value)
|
||||||
let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator)
|
let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator)
|
||||||
return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue)
|
return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user