mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-13 12:13:48 +00:00
Use global theme in auth controllers
Multiaccount updates
This commit is contained in:
parent
9a35187cec
commit
c453f00524
@ -400,7 +400,6 @@
|
||||
D099D74D1EEFEE1500A3128C /* GameController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D099D74C1EEFEE1500A3128C /* GameController.swift */; };
|
||||
D099D74F1EEFEE6A00A3128C /* GameControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D099D74E1EEFEE6A00A3128C /* GameControllerNode.swift */; };
|
||||
D099D7511EEFF91E00A3128C /* GameControllerTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D099D7501EEFF91E00A3128C /* GameControllerTitleView.swift */; };
|
||||
D09D886F1F86C11F00BEB4C9 /* AuthorizationTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09D886E1F86C11F00BEB4C9 /* AuthorizationTheme.swift */; };
|
||||
D09D88711F86D36700BEB4C9 /* CountryList.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09D88701F86D36700BEB4C9 /* CountryList.swift */; };
|
||||
D09D88731F86D56B00BEB4C9 /* AuthorizationLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09D88721F86D56B00BEB4C9 /* AuthorizationLayout.swift */; };
|
||||
D09E637C1F0E7C28003444CD /* SharedMediaPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09E637B1F0E7C28003444CD /* SharedMediaPlayer.swift */; };
|
||||
@ -1821,7 +1820,6 @@
|
||||
D099EA2C1DE76782001AF5A8 /* PeerMessageManagedMediaId.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerMessageManagedMediaId.swift; sourceTree = "<group>"; };
|
||||
D099EA2E1DE775BB001AF5A8 /* ChatContextResultManagedMediaId.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatContextResultManagedMediaId.swift; sourceTree = "<group>"; };
|
||||
D09AEFD31E5BAF67005C1A8B /* ItemListTextEmptyStateItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemListTextEmptyStateItem.swift; sourceTree = "<group>"; };
|
||||
D09D886E1F86C11F00BEB4C9 /* AuthorizationTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthorizationTheme.swift; sourceTree = "<group>"; };
|
||||
D09D88701F86D36700BEB4C9 /* CountryList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountryList.swift; sourceTree = "<group>"; };
|
||||
D09D88721F86D56B00BEB4C9 /* AuthorizationLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthorizationLayout.swift; sourceTree = "<group>"; };
|
||||
D09E637B1F0E7C28003444CD /* SharedMediaPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedMediaPlayer.swift; sourceTree = "<group>"; };
|
||||
@ -4387,7 +4385,6 @@
|
||||
D0F69DE71D6B8A590046BCD6 /* Authorization */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D09D886E1F86C11F00BEB4C9 /* AuthorizationTheme.swift */,
|
||||
D09D88721F86D56B00BEB4C9 /* AuthorizationLayout.swift */,
|
||||
D049EAF21E44DE2500A2CD3A /* AuthorizationSequenceController.swift */,
|
||||
D04BB2B61E44E5BB00650E93 /* Splash */,
|
||||
@ -5515,7 +5512,6 @@
|
||||
D099D7511EEFF91E00A3128C /* GameControllerTitleView.swift in Sources */,
|
||||
D0EC6D711EB9F58800EBF1C3 /* AuthorizationSequencePasswordEntryController.swift in Sources */,
|
||||
D0EC6D721EB9F58800EBF1C3 /* AuthorizationSequencePasswordEntryControllerNode.swift in Sources */,
|
||||
D09D886F1F86C11F00BEB4C9 /* AuthorizationTheme.swift in Sources */,
|
||||
D0EC6D731EB9F58800EBF1C3 /* AuthorizationSequenceSignUpController.swift in Sources */,
|
||||
0979787C210642CB0077D77F /* WebEmbedPlayerNode.swift in Sources */,
|
||||
D0C12EB01F9A8D1300600BB2 /* ListMessageDateHeader.swift in Sources */,
|
||||
|
||||
@ -116,10 +116,6 @@ public final class AccountContext {
|
||||
deinit {
|
||||
}
|
||||
|
||||
public func attachOverlayMediaController(_ controller: OverlayMediaController) {
|
||||
self.sharedContext.mediaManager.overlayMediaManager.attachOverlayMediaController(controller)
|
||||
}
|
||||
|
||||
public func storeSecureIdPassword(password: String) {
|
||||
self.storedPassword?.2.invalidate()
|
||||
let timer = SwiftSignalKit.Timer(timeout: 1.0 * 60.0 * 60.0, repeat: false, completion: { [weak self] in
|
||||
|
||||
@ -9,13 +9,15 @@ public class ActionSheetPeerItem: ActionSheetItem {
|
||||
public let peer: Peer
|
||||
public let theme: PresentationTheme
|
||||
public let title: String
|
||||
public let isSelected: Bool
|
||||
public let strings: PresentationStrings
|
||||
public let action: () -> Void
|
||||
|
||||
public init(account: Account, peer: Peer, title: String, strings: PresentationStrings, theme: PresentationTheme, action: @escaping () -> Void) {
|
||||
public init(account: Account, peer: Peer, title: String, isSelected: Bool, strings: PresentationStrings, theme: PresentationTheme, action: @escaping () -> Void) {
|
||||
self.account = account
|
||||
self.peer = peer
|
||||
self.title = title
|
||||
self.isSelected = isSelected
|
||||
self.strings = strings
|
||||
self.theme = theme
|
||||
self.action = action
|
||||
@ -49,6 +51,7 @@ public class ActionSheetPeerItemNode: ActionSheetItemNode {
|
||||
private let button: HighlightTrackingButton
|
||||
private let avatarNode: AvatarNode
|
||||
private let label: ImmediateTextNode
|
||||
private let checkNode: ASImageNode
|
||||
|
||||
override public init(theme: ActionSheetControllerTheme) {
|
||||
self.theme = theme
|
||||
@ -63,11 +66,17 @@ public class ActionSheetPeerItemNode: ActionSheetItemNode {
|
||||
self.label.displaysAsynchronously = false
|
||||
self.label.maximumNumberOfLines = 1
|
||||
|
||||
self.checkNode = ASImageNode()
|
||||
self.checkNode.displaysAsynchronously = false
|
||||
self.checkNode.displayWithoutProcessing = true
|
||||
self.checkNode.image = generateItemListCheckIcon(color: theme.primaryTextColor)
|
||||
|
||||
super.init(theme: theme)
|
||||
|
||||
self.view.addSubview(self.button)
|
||||
self.addSubnode(self.avatarNode)
|
||||
self.addSubnode(self.label)
|
||||
self.addSubnode(self.checkNode)
|
||||
|
||||
self.button.highligthedChanged = { [weak self] highlighted in
|
||||
if let strongSelf = self {
|
||||
@ -92,6 +101,8 @@ public class ActionSheetPeerItemNode: ActionSheetItemNode {
|
||||
|
||||
self.avatarNode.setPeer(account: item.account, theme: item.theme, peer: item.peer)
|
||||
|
||||
self.checkNode.isHidden = !item.isSelected
|
||||
|
||||
self.setNeedsLayout()
|
||||
}
|
||||
|
||||
@ -113,6 +124,10 @@ public class ActionSheetPeerItemNode: ActionSheetItemNode {
|
||||
|
||||
let labelSize = self.label.updateLayout(CGSize(width: max(1.0, size.width - avatarInset - 16.0 - 16.0 - 30.0), height: size.height))
|
||||
self.label.frame = CGRect(origin: CGPoint(x: 16.0 + avatarInset, y: floorToScreenPixels((size.height - labelSize.height) / 2.0)), size: labelSize)
|
||||
|
||||
if let image = self.checkNode.image {
|
||||
self.checkNode.frame = CGRect(origin: CGPoint(x: size.width - image.size.width - 16.0, y: floor((size.height - image.size.height) / 2.0)), size: image.size)
|
||||
}
|
||||
}
|
||||
|
||||
@objc func buttonPressed() {
|
||||
|
||||
@ -8,7 +8,7 @@ final class AuthorizationSequenceAwaitingAccountResetController: ViewController
|
||||
}
|
||||
|
||||
private let strings: PresentationStrings
|
||||
private let theme: AuthorizationTheme
|
||||
private let theme: PresentationTheme
|
||||
|
||||
var logout: (() -> Void)?
|
||||
var reset: (() -> Void)?
|
||||
@ -19,7 +19,7 @@ final class AuthorizationSequenceAwaitingAccountResetController: ViewController
|
||||
var inProgress: Bool = false {
|
||||
didSet {
|
||||
if self.inProgress {
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.theme.accentColor))
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.theme.rootController.navigationBar.accentTextColor))
|
||||
self.navigationItem.rightBarButtonItem = item
|
||||
} else {
|
||||
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.strings.Common_Next, style: .done, target: self, action: #selector(self.logoutPressed))
|
||||
@ -27,7 +27,7 @@ final class AuthorizationSequenceAwaitingAccountResetController: ViewController
|
||||
}
|
||||
}
|
||||
|
||||
init(strings: PresentationStrings, theme: AuthorizationTheme, back: @escaping () -> Void) {
|
||||
init(strings: PresentationStrings, theme: PresentationTheme, back: @escaping () -> Void) {
|
||||
self.strings = strings
|
||||
self.theme = theme
|
||||
|
||||
@ -35,7 +35,7 @@ final class AuthorizationSequenceAwaitingAccountResetController: ViewController
|
||||
|
||||
self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait)
|
||||
|
||||
self.statusBar.statusBarStyle = theme.statusBarStyle
|
||||
self.statusBar.statusBarStyle = theme.rootController.statusBar.style.style
|
||||
|
||||
self.attemptNavigation = { _ in
|
||||
return false
|
||||
|
||||
@ -23,7 +23,7 @@ private func timerValueString(days: Int32, hours: Int32, minutes: Int32, color:
|
||||
|
||||
final class AuthorizationSequenceAwaitingAccountResetControllerNode: ASDisplayNode, UITextFieldDelegate {
|
||||
private let strings: PresentationStrings
|
||||
private let theme: AuthorizationTheme
|
||||
private let theme: PresentationTheme
|
||||
|
||||
private let titleNode: ASTextNode
|
||||
private let noticeNode: ASTextNode
|
||||
@ -40,14 +40,14 @@ final class AuthorizationSequenceAwaitingAccountResetControllerNode: ASDisplayNo
|
||||
|
||||
private var timer: SwiftSignalKit.Timer?
|
||||
|
||||
init(strings: PresentationStrings, theme: AuthorizationTheme) {
|
||||
init(strings: PresentationStrings, theme: PresentationTheme) {
|
||||
self.strings = strings
|
||||
self.theme = theme
|
||||
|
||||
self.titleNode = ASTextNode()
|
||||
self.titleNode.isUserInteractionEnabled = false
|
||||
self.titleNode.displaysAsynchronously = false
|
||||
self.titleNode.attributedText = NSAttributedString(string: strings.Login_ResetAccountProtected_Title, font: Font.light(30.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: strings.Login_ResetAccountProtected_Title, font: Font.light(30.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
|
||||
self.noticeNode = ASTextNode()
|
||||
self.noticeNode.isUserInteractionEnabled = false
|
||||
@ -56,15 +56,15 @@ final class AuthorizationSequenceAwaitingAccountResetControllerNode: ASDisplayNo
|
||||
self.timerTitleNode = ASTextNode()
|
||||
self.timerTitleNode.isLayerBacked = true
|
||||
self.timerTitleNode.displaysAsynchronously = false
|
||||
self.timerTitleNode.attributedText = NSAttributedString(string: strings.Login_ResetAccountProtected_TimerTitle, font: Font.regular(16.0), textColor: self.theme.primaryColor)
|
||||
self.timerTitleNode.attributedText = NSAttributedString(string: strings.Login_ResetAccountProtected_TimerTitle, font: Font.regular(16.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
|
||||
self.timerValueNode = ASTextNode()
|
||||
self.timerValueNode.isLayerBacked = true
|
||||
self.timerValueNode.displaysAsynchronously = false
|
||||
|
||||
self.resetNode = HighlightableButtonNode()
|
||||
self.resetNode.setAttributedTitle(NSAttributedString(string: strings.Login_ResetAccountProtected_Reset, font: Font.regular(21.0), textColor: self.theme.accentColor), for: [])
|
||||
self.resetNode.setAttributedTitle(NSAttributedString(string: strings.Login_ResetAccountProtected_Reset, font: Font.regular(21.0), textColor: self.theme.textPlaceholderColor), for: [.disabled])
|
||||
self.resetNode.setAttributedTitle(NSAttributedString(string: strings.Login_ResetAccountProtected_Reset, font: Font.regular(21.0), textColor: self.theme.list.itemAccentColor), for: [])
|
||||
self.resetNode.setAttributedTitle(NSAttributedString(string: strings.Login_ResetAccountProtected_Reset, font: Font.regular(21.0), textColor: self.theme.list.itemPlaceholderTextColor), for: [.disabled])
|
||||
self.resetNode.displaysAsynchronously = false
|
||||
self.resetNode.isEnabled = false
|
||||
|
||||
@ -74,7 +74,7 @@ final class AuthorizationSequenceAwaitingAccountResetControllerNode: ASDisplayNo
|
||||
return UITracingLayerView()
|
||||
})
|
||||
|
||||
self.backgroundColor = self.theme.backgroundColor
|
||||
self.backgroundColor = self.theme.list.plainBackgroundColor
|
||||
|
||||
self.addSubnode(self.titleNode)
|
||||
self.addSubnode(self.noticeNode)
|
||||
@ -93,7 +93,7 @@ final class AuthorizationSequenceAwaitingAccountResetControllerNode: ASDisplayNo
|
||||
self.protectedUntil = protectedUntil
|
||||
self.updateTimerValue()
|
||||
|
||||
self.noticeNode.attributedText = NSAttributedString(string: strings.Login_ResetAccountProtected_Text(number).0, font: Font.regular(16.0), textColor: self.theme.primaryColor, paragraphAlignment: .center)
|
||||
self.noticeNode.attributedText = NSAttributedString(string: strings.Login_ResetAccountProtected_Text(number).0, font: Font.regular(16.0), textColor: self.theme.list.itemPrimaryTextColor, paragraphAlignment: .center)
|
||||
|
||||
if let (layout, navigationHeight) = self.layoutArguments {
|
||||
self.containerLayoutUpdated(layout, navigationBarHeight: navigationHeight, transition: .immediate)
|
||||
@ -127,7 +127,7 @@ final class AuthorizationSequenceAwaitingAccountResetControllerNode: ASDisplayNo
|
||||
minutes = 1
|
||||
}
|
||||
|
||||
self.timerValueNode.attributedText = timerValueString(days: days, hours: hours, minutes: minutes, color: self.theme.primaryColor, strings: self.strings)
|
||||
self.timerValueNode.attributedText = timerValueString(days: days, hours: hours, minutes: minutes, color: self.theme.list.itemPrimaryTextColor, strings: self.strings)
|
||||
|
||||
self.resetNode.isEnabled = timerSeconds <= 0
|
||||
|
||||
@ -143,9 +143,9 @@ final class AuthorizationSequenceAwaitingAccountResetControllerNode: ASDisplayNo
|
||||
insets.top = navigationBarHeight
|
||||
|
||||
if max(layout.size.width, layout.size.height) > 1023.0 {
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_ResetAccountProtected_Title, font: Font.light(40.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_ResetAccountProtected_Title, font: Font.light(40.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
} else {
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_ResetAccountProtected_Title, font: Font.light(30.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_ResetAccountProtected_Title, font: Font.light(30.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
}
|
||||
|
||||
let titleSize = self.titleNode.measure(CGSize(width: layout.size.width, height: CGFloat.greatestFiniteMagnitude))
|
||||
|
||||
@ -9,7 +9,7 @@ final class AuthorizationSequenceCodeEntryController: ViewController {
|
||||
}
|
||||
|
||||
private let strings: PresentationStrings
|
||||
private let theme: AuthorizationTheme
|
||||
private let theme: PresentationTheme
|
||||
private let openUrl: (String) -> Void
|
||||
|
||||
var loginWithCode: ((String) -> Void)?
|
||||
@ -24,7 +24,7 @@ final class AuthorizationSequenceCodeEntryController: ViewController {
|
||||
var inProgress: Bool = false {
|
||||
didSet {
|
||||
if self.inProgress {
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.theme.accentColor))
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.theme.rootController.navigationBar.accentTextColor))
|
||||
self.navigationItem.rightBarButtonItem = item
|
||||
} else {
|
||||
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.strings.Common_Next, style: .done, target: self, action: #selector(self.nextPressed))
|
||||
@ -33,7 +33,7 @@ final class AuthorizationSequenceCodeEntryController: ViewController {
|
||||
}
|
||||
}
|
||||
|
||||
init(strings: PresentationStrings, theme: AuthorizationTheme, openUrl: @escaping (String) -> Void, back: @escaping () -> Void) {
|
||||
init(strings: PresentationStrings, theme: PresentationTheme, openUrl: @escaping (String) -> Void, back: @escaping () -> Void) {
|
||||
self.strings = strings
|
||||
self.theme = theme
|
||||
self.openUrl = openUrl
|
||||
@ -44,7 +44,7 @@ final class AuthorizationSequenceCodeEntryController: ViewController {
|
||||
|
||||
self.hasActiveInput = true
|
||||
|
||||
self.statusBar.statusBarStyle = theme.statusBarStyle
|
||||
self.statusBar.statusBarStyle = theme.rootController.statusBar.style.style
|
||||
|
||||
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.strings.Common_Next, style: .done, target: self, action: #selector(self.nextPressed))
|
||||
|
||||
@ -52,7 +52,7 @@ final class AuthorizationSequenceCodeEntryController: ViewController {
|
||||
return false
|
||||
}
|
||||
self.navigationBar?.backPressed = { [weak self] in
|
||||
self?.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: theme), title: nil, text: strings.Login_CancelPhoneVerification, actions: [TextAlertAction(type: .genericAction, title: strings.Login_CancelPhoneVerificationContinue, action: {
|
||||
self?.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: theme), title: nil, text: strings.Login_CancelPhoneVerification, actions: [TextAlertAction(type: .genericAction, title: strings.Login_CancelPhoneVerificationContinue, action: {
|
||||
}), TextAlertAction(type: .defaultAction, title: strings.Login_CancelPhoneVerificationStop, action: {
|
||||
back()
|
||||
})]), in: .window(.root))
|
||||
|
||||
@ -50,7 +50,7 @@ func authorizationNextOptionText(currentType: SentAuthorizationCodeType, nextTyp
|
||||
|
||||
final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextFieldDelegate {
|
||||
private let strings: PresentationStrings
|
||||
private let theme: AuthorizationTheme
|
||||
private let theme: PresentationTheme
|
||||
|
||||
private let titleNode: ImmediateTextNode
|
||||
private let titleIconNode: ASImageNode
|
||||
@ -92,7 +92,7 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF
|
||||
}
|
||||
}
|
||||
|
||||
init(strings: PresentationStrings, theme: AuthorizationTheme) {
|
||||
init(strings: PresentationStrings, theme: PresentationTheme) {
|
||||
self.strings = strings
|
||||
self.theme = theme
|
||||
|
||||
@ -109,8 +109,8 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF
|
||||
self.titleIconNode.image = generateImage(CGSize(width: 81.0, height: 52.0), rotatedContext: { size, context in
|
||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||
|
||||
context.setFillColor(theme.primaryColor.cgColor)
|
||||
context.setStrokeColor(theme.primaryColor.cgColor)
|
||||
context.setFillColor(theme.list.itemPrimaryTextColor.cgColor)
|
||||
context.setStrokeColor(theme.list.itemPrimaryTextColor.cgColor)
|
||||
context.setLineWidth(2.97)
|
||||
let _ = try? drawSvgPath(context, path: "M9.87179487,9.04664384 C9.05602951,9.04664384 8.39525641,9.70682916 8.39525641,10.5205479 L8.39525641,44.0547945 C8.39525641,44.8685133 9.05602951,45.5286986 9.87179487,45.5286986 L65.1538462,45.5286986 C65.9696115,45.5286986 66.6303846,44.8685133 66.6303846,44.0547945 L66.6303846,10.5205479 C66.6303846,9.70682916 65.9696115,9.04664384 65.1538462,9.04664384 L9.87179487,9.04664384 S ")
|
||||
|
||||
@ -118,14 +118,14 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF
|
||||
|
||||
let _ = try? drawSvgPath(context, path: "M2.96153846,16.4383562 L14.1495726,16.4383562 C15.7851852,16.4383562 17.1111111,17.7631027 17.1111111,19.3972603 L17.1111111,45.0410959 C17.1111111,46.6752535 15.7851852,48 14.1495726,48 L2.96153846,48 C1.32592593,48 0,46.6752535 0,45.0410959 L0,19.3972603 C0,17.7631027 1.32592593,16.4383562 2.96153846,16.4383562 Z ")
|
||||
|
||||
context.setStrokeColor(theme.backgroundColor.cgColor)
|
||||
context.setStrokeColor(theme.list.plainBackgroundColor.cgColor)
|
||||
context.setLineWidth(1.65)
|
||||
let _ = try? drawSvgPath(context, path: "M2.96153846,15.6133562 L14.1495726,15.6133562 C16.2406558,15.6133562 17.9361111,17.3073033 17.9361111,19.3972603 L17.9361111,45.0410959 C17.9361111,47.1310529 16.2406558,48.825 14.1495726,48.825 L2.96153846,48.825 C0.870455286,48.825 -0.825,47.1310529 -0.825,45.0410959 L-0.825,19.3972603 C-0.825,17.3073033 0.870455286,15.6133562 2.96153846,15.6133562 S ")
|
||||
|
||||
context.setFillColor(theme.backgroundColor.cgColor)
|
||||
context.setFillColor(theme.list.plainBackgroundColor.cgColor)
|
||||
let _ = try? drawSvgPath(context, path: "M1.64529915,20.3835616 L15.465812,20.3835616 L15.465812,44.0547945 L1.64529915,44.0547945 Z ")
|
||||
|
||||
context.setFillColor(theme.accentColor.cgColor)
|
||||
context.setFillColor(theme.list.itemAccentColor.cgColor)
|
||||
let _ = try? drawSvgPath(context, path: "M66.4700855,0.0285884455 C60.7084674,0.0285884455 55.9687848,4.08259697 55.9687848,9.14830256 C55.9687848,12.0875991 57.5993165,14.6795278 60.0605723,16.3382966 C60.0568181,16.4358994 60.0611217,16.5884309 59.9318097,17.067302 C59.7721478,17.6586615 59.4575977,18.4958519 58.8015608,19.4258487 L58.3294314,20.083383 L59.1449275,20.0976772 C61.9723538,20.1099725 63.6110772,18.2528913 63.8662207,17.9535438 C64.7014993,18.1388449 65.5698144,18.2680167 66.4700855,18.2680167 C72.2312622,18.2680167 76.9713861,14.2140351 76.9713861,9.14830256 C76.9713861,4.08256999 72.2312622,0.0285884455 66.4700855,0.0285884455 Z ")
|
||||
|
||||
let _ = try? drawSvgPath(context, path: "M64.1551769,18.856071 C63.8258967,19.1859287 63.4214479,19.5187 62.9094963,19.840779 C61.8188563,20.5269227 60.5584776,20.9288319 59.1304689,20.9225505 L56.7413094,20.8806727 L57.6592902,19.6022014 L58.127415,18.9502938 C58.6361919,18.2290526 58.9525079,17.5293964 59.1353377,16.8522267 C59.1487516,16.8025521 59.1603548,16.7584153 59.1703974,16.7187893 C56.653362,14.849536 55.1437848,12.1128655 55.1437848,9.14830256 C55.1437848,3.61947515 60.2526259,-0.796411554 66.4700855,-0.796411554 C72.6872626,-0.796411554 77.7963861,3.61958236 77.7963861,9.14830256 C77.7963861,14.6770228 72.6872626,19.0930167 66.4700855,19.0930167 C65.7185957,19.0930167 64.9627196,19.0118067 64.1551769,18.856071 S ")
|
||||
@ -137,13 +137,13 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF
|
||||
|
||||
self.nextOptionNode = HighlightableButtonNode()
|
||||
self.nextOptionNode.displaysAsynchronously = false
|
||||
let (nextOptionText, nextOptionActive) = authorizationNextOptionText(currentType: .sms(length: 5), nextType: .call, timeout: 60, strings: self.strings, primaryColor: self.theme.primaryColor, accentColor: self.theme.accentColor)
|
||||
let (nextOptionText, nextOptionActive) = authorizationNextOptionText(currentType: .sms(length: 5), nextType: .call, timeout: 60, strings: self.strings, primaryColor: self.theme.list.itemPrimaryTextColor, accentColor: self.theme.list.itemAccentColor)
|
||||
self.nextOptionNode.setAttributedTitle(nextOptionText, for: [])
|
||||
self.nextOptionNode.isUserInteractionEnabled = nextOptionActive
|
||||
|
||||
self.codeSeparatorNode = ASDisplayNode()
|
||||
self.codeSeparatorNode.isLayerBacked = true
|
||||
self.codeSeparatorNode.backgroundColor = self.theme.separatorColor
|
||||
self.codeSeparatorNode.backgroundColor = self.theme.list.itemPlainSeparatorColor
|
||||
|
||||
self.codeField = TextFieldNode()
|
||||
self.codeField.textField.font = Font.regular(24.0)
|
||||
@ -155,10 +155,10 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF
|
||||
}
|
||||
#endif
|
||||
self.codeField.textField.returnKeyType = .done
|
||||
self.codeField.textField.textColor = self.theme.primaryColor
|
||||
self.codeField.textField.keyboardAppearance = self.theme.keyboard.keyboardAppearance
|
||||
self.codeField.textField.textColor = self.theme.list.itemPrimaryTextColor
|
||||
self.codeField.textField.keyboardAppearance = self.theme.chatList.searchBarKeyboardColor.keyboardAppearance
|
||||
self.codeField.textField.disableAutomaticKeyboardHandling = [.forward, .backward]
|
||||
self.codeField.textField.tintColor = self.theme.accentColor
|
||||
self.codeField.textField.tintColor = self.theme.list.itemAccentColor
|
||||
|
||||
super.init()
|
||||
|
||||
@ -166,7 +166,7 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF
|
||||
return UITracingLayerView()
|
||||
})
|
||||
|
||||
self.backgroundColor = self.theme.backgroundColor
|
||||
self.backgroundColor = self.theme.list.plainBackgroundColor
|
||||
|
||||
self.addSubnode(self.codeSeparatorNode)
|
||||
self.addSubnode(self.codeField)
|
||||
@ -178,7 +178,8 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF
|
||||
self.codeField.textField.delegate = self
|
||||
self.codeField.textField.addTarget(self, action: #selector(self.codeFieldTextChanged(_:)), for: .editingChanged)
|
||||
|
||||
self.codeField.textField.attributedPlaceholder = NSAttributedString(string: strings.Login_Code, font: Font.regular(24.0), textColor: self.theme.textPlaceholderColor)
|
||||
self.codeField.textField.attributedPlaceholder = NSAttributedString(string: strings.Login_Code, font: Font.regular(24.0), textColor: self.theme.list.itemPlaceholderTextColor
|
||||
)
|
||||
|
||||
self.nextOptionNode.addTarget(self, action: #selector(self.nextOptionNodePressed), forControlEvents: .touchUpInside)
|
||||
}
|
||||
@ -212,14 +213,14 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF
|
||||
self.codeType = codeType
|
||||
self.phoneNumber = number
|
||||
|
||||
self.currentOptionNode.attributedText = authorizationCurrentOptionText(codeType, strings: self.strings, primaryColor: self.theme.primaryColor, accentColor: self.theme.accentColor)
|
||||
self.currentOptionNode.attributedText = authorizationCurrentOptionText(codeType, strings: self.strings, primaryColor: self.theme.list.itemPrimaryTextColor, accentColor: self.theme.list.itemAccentColor)
|
||||
if let timeout = timeout {
|
||||
self.currentTimeoutTime = timeout
|
||||
let disposable = ((Signal<Int, NoError>.single(1) |> delay(1.0, queue: Queue.mainQueue())) |> restart).start(next: { [weak self] _ in
|
||||
if let strongSelf = self {
|
||||
if let currentTimeoutTime = strongSelf.currentTimeoutTime, currentTimeoutTime > 0 {
|
||||
strongSelf.currentTimeoutTime = currentTimeoutTime - 1
|
||||
let (nextOptionText, nextOptionActive) = authorizationNextOptionText(currentType: codeType, nextType: nextType, timeout:strongSelf.currentTimeoutTime, strings: strongSelf.strings, primaryColor: strongSelf.theme.primaryColor, accentColor: strongSelf.theme.accentColor)
|
||||
let (nextOptionText, nextOptionActive) = authorizationNextOptionText(currentType: codeType, nextType: nextType, timeout:strongSelf.currentTimeoutTime, strings: strongSelf.strings, primaryColor: strongSelf.theme.list.itemPrimaryTextColor, accentColor: strongSelf.theme.list.itemAccentColor)
|
||||
strongSelf.nextOptionNode.setAttributedTitle(nextOptionText, for: [])
|
||||
strongSelf.nextOptionNode.isUserInteractionEnabled = nextOptionActive
|
||||
|
||||
@ -237,7 +238,7 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF
|
||||
self.currentTimeoutTime = nil
|
||||
self.countdownDisposable.set(nil)
|
||||
}
|
||||
let (nextOptionText, nextOptionActive) = authorizationNextOptionText(currentType: codeType, nextType: nextType, timeout: self.currentTimeoutTime, strings: self.strings, primaryColor: self.theme.primaryColor, accentColor: self.theme.accentColor)
|
||||
let (nextOptionText, nextOptionActive) = authorizationNextOptionText(currentType: codeType, nextType: nextType, timeout: self.currentTimeoutTime, strings: self.strings, primaryColor: self.theme.list.itemPrimaryTextColor, accentColor: self.theme.list.itemAccentColor)
|
||||
self.nextOptionNode.setAttributedTitle(nextOptionText, for: [])
|
||||
self.nextOptionNode.isUserInteractionEnabled = nextOptionActive
|
||||
}
|
||||
@ -258,9 +259,9 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF
|
||||
|
||||
if max(layout.size.width, layout.size.height) > 1023.0 {
|
||||
if let codeType = self.codeType, case .otherSession = codeType {
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_CheckOtherSessionMessages, font: Font.medium(32.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_CheckOtherSessionMessages, font: Font.medium(32.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
} else {
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.phoneNumber, font: Font.light(40.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.phoneNumber, font: Font.light(40.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
}
|
||||
} else {
|
||||
if let codeType = self.codeType, case .otherSession = codeType {
|
||||
@ -270,9 +271,9 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF
|
||||
} else {
|
||||
fontSize = 18.0
|
||||
}
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_CheckOtherSessionMessages, font: Font.semibold(fontSize), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_CheckOtherSessionMessages, font: Font.semibold(fontSize), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
} else {
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.phoneNumber, font: Font.light(30.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.phoneNumber, font: Font.light(30.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -14,8 +14,8 @@ private enum InnerState: Equatable {
|
||||
}
|
||||
|
||||
public final class AuthorizationSequenceController: NavigationController {
|
||||
static func navigationBarTheme(_ theme: AuthorizationTheme) -> NavigationBarTheme {
|
||||
return NavigationBarTheme(buttonColor: theme.accentColor, disabledButtonColor: UIColor(rgb: 0xd0d0d0), primaryTextColor: .black, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: .clear, badgeStrokeColor: .clear, badgeTextColor: .clear)
|
||||
static func navigationBarTheme(_ theme: PresentationTheme) -> NavigationBarTheme {
|
||||
return NavigationBarTheme(buttonColor: theme.rootController.navigationBar.buttonColor, disabledButtonColor: theme.rootController.navigationBar.disabledButtonColor, primaryTextColor: theme.rootController.navigationBar.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: theme.rootController.navigationBar.badgeBackgroundColor, badgeStrokeColor: theme.rootController.navigationBar.badgeStrokeColor, badgeTextColor: theme.rootController.navigationBar.badgeTextColor)
|
||||
}
|
||||
|
||||
private let sharedContext: SharedAccountContext
|
||||
@ -24,7 +24,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
private let apiId: Int32
|
||||
private let apiHash: String
|
||||
private var strings: PresentationStrings
|
||||
public let theme: AuthorizationTheme
|
||||
public let theme: PresentationTheme
|
||||
private let openUrl: (String) -> Void
|
||||
|
||||
private var stateDisposable: Disposable?
|
||||
@ -32,15 +32,15 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
|
||||
private var didPlayPresentationAnimation = false
|
||||
|
||||
public init(sharedContext: SharedAccountContext, account: UnauthorizedAccount, otherAccountPhoneNumbers: ((String, AccountRecordId)?, [(String, AccountRecordId)]), strings: PresentationStrings, openUrl: @escaping (String) -> Void, apiId: Int32, apiHash: String) {
|
||||
public init(sharedContext: SharedAccountContext, account: UnauthorizedAccount, otherAccountPhoneNumbers: ((String, AccountRecordId)?, [(String, AccountRecordId)]), strings: PresentationStrings, theme: PresentationTheme, openUrl: @escaping (String) -> Void, apiId: Int32, apiHash: String) {
|
||||
self.sharedContext = sharedContext
|
||||
self.account = account
|
||||
self.otherAccountPhoneNumbers = otherAccountPhoneNumbers
|
||||
self.apiId = apiId
|
||||
self.apiHash = apiHash
|
||||
self.strings = strings
|
||||
self.theme = theme
|
||||
self.openUrl = openUrl
|
||||
self.theme = defaultLightAuthorizationTheme
|
||||
|
||||
super.init(mode: .single, theme: NavigationControllerTheme(navigationBar: AuthorizationSequenceController.navigationBarTheme(theme), emptyAreaColor: .black, emptyDetailIcon: nil))
|
||||
|
||||
@ -71,7 +71,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
|
||||
override public func loadView() {
|
||||
super.loadView()
|
||||
self.view.backgroundColor = self.theme.backgroundColor
|
||||
self.view.backgroundColor = self.theme.list.plainBackgroundColor
|
||||
}
|
||||
|
||||
private func splashController() -> AuthorizationSequenceSplashController {
|
||||
@ -215,7 +215,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
controller.present(proxySettingsController(accountManager: strongSelf.sharedContext.accountManager, postbox: strongSelf.account.postbox, network: strongSelf.account.network, mode: .modal, theme: defaultPresentationTheme, strings: strongSelf.strings, updatedPresentationData: .single((defaultPresentationTheme, strongSelf.strings))), in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
|
||||
}))
|
||||
}
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: strongSelf.theme), title: nil, text: text, actions: actions), in: .window(.root))
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: text, actions: actions), in: .window(.root))
|
||||
}
|
||||
}))
|
||||
}
|
||||
@ -270,7 +270,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
return
|
||||
}
|
||||
var dismissImpl: (() -> Void)?
|
||||
let alertTheme = AlertControllerTheme(authTheme: strongSelf.theme)
|
||||
let alertTheme = AlertControllerTheme(presentationTheme: strongSelf.theme)
|
||||
let attributedText = stringWithAppliedEntities(termsOfService.text, entities: termsOfService.entities, baseColor: alertTheme.primaryColor, linkColor: alertTheme.accentColor, baseFont: Font.regular(13.0), linkFont: Font.regular(13.0), boldFont: Font.semibold(13.0), italicFont: Font.italic(13.0), fixedFont: Font.regular(13.0))
|
||||
let contentNode = TextAlertContentNode(theme: alertTheme, title: NSAttributedString(string: strongSelf.strings.Login_TermsOfServiceHeader, font: Font.medium(17.0), textColor: alertTheme.primaryColor, paragraphAlignment: .center), text: attributedText, actions: [
|
||||
TextAlertAction(type: .defaultAction, title: strongSelf.strings.Login_TermsOfServiceAgree, action: {
|
||||
@ -340,7 +340,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
}).start()
|
||||
}
|
||||
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
}
|
||||
}
|
||||
}))
|
||||
@ -361,7 +361,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
|
||||
controller?.view.window?.rootViewController?.present(composeController, animated: true, completion: nil)
|
||||
} else {
|
||||
controller?.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: strongSelf.theme), title: nil, text: strongSelf.strings.Login_EmailNotConfiguredError, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
controller?.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: strongSelf.strings.Login_EmailNotConfiguredError, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
}
|
||||
} else {
|
||||
controller?.inProgress = true
|
||||
@ -388,7 +388,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
text = strongSelf.strings.Login_NetworkError
|
||||
}
|
||||
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
}
|
||||
}))
|
||||
}
|
||||
@ -447,7 +447,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
text = strongSelf.strings.Login_UnknownError
|
||||
}
|
||||
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
controller.passwordIsInvalid()
|
||||
}
|
||||
}
|
||||
@ -470,7 +470,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
}
|
||||
}).start()
|
||||
case .none:
|
||||
strongController.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: strongSelf.theme), title: nil, text: strongSelf.strings.TwoStepAuth_RecoveryUnavailable, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
strongController.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: strongSelf.strings.TwoStepAuth_RecoveryUnavailable, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
strongController.didForgotWithNoRecovery = true
|
||||
}
|
||||
}
|
||||
@ -483,7 +483,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
}
|
||||
controller.reset = { [weak self, weak controller] in
|
||||
if let strongSelf = self, let strongController = controller {
|
||||
strongController.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: strongSelf.theme), title: nil, text: suggestReset ? strongSelf.strings.TwoStepAuth_RecoveryFailed : strongSelf.strings.TwoStepAuth_RecoveryUnavailable, actions: [
|
||||
strongController.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: suggestReset ? strongSelf.strings.TwoStepAuth_RecoveryFailed : strongSelf.strings.TwoStepAuth_RecoveryUnavailable, actions: [
|
||||
TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_Cancel, action: {}),
|
||||
TextAlertAction(type: .destructiveAction, title: strongSelf.strings.Login_ResetAccountProtected_Reset, action: {
|
||||
if let strongSelf = self, let strongController = controller {
|
||||
@ -503,7 +503,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
case .limitExceeded:
|
||||
text = strongSelf.strings.Login_ResetAccountProtected_LimitExceeded
|
||||
}
|
||||
strongController.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
strongController.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
}
|
||||
}))
|
||||
}
|
||||
@ -555,7 +555,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
text = strongSelf.strings.Login_CodeExpiredError
|
||||
}
|
||||
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
}
|
||||
}
|
||||
}))
|
||||
@ -563,7 +563,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
}
|
||||
controller.noAccess = { [weak self, weak controller] in
|
||||
if let strongSelf = self, let controller = controller {
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: strongSelf.theme), title: nil, text: strongSelf.strings.TwoStepAuth_RecoveryFailed, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: strongSelf.strings.TwoStepAuth_RecoveryFailed, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
let account = strongSelf.account
|
||||
let _ = (strongSelf.account.postbox.transaction { transaction -> Void in
|
||||
if let state = transaction.getState() as? UnauthorizedAccountState, case let .passwordRecovery(hint, number, code, _) = state.contents {
|
||||
@ -601,7 +601,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
})
|
||||
controller.reset = { [weak self, weak controller] in
|
||||
if let strongSelf = self, let strongController = controller {
|
||||
strongController.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: strongSelf.theme), title: nil, text: strongSelf.strings.TwoStepAuth_ResetAccountConfirmation, actions: [
|
||||
strongController.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: strongSelf.strings.TwoStepAuth_ResetAccountConfirmation, actions: [
|
||||
TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_Cancel, action: {}),
|
||||
TextAlertAction(type: .destructiveAction, title: strongSelf.strings.Login_ResetAccountProtected_Reset, action: {
|
||||
if let strongSelf = self, let strongController = controller {
|
||||
@ -621,7 +621,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
case .limitExceeded:
|
||||
text = strongSelf.strings.Login_ResetAccountProtected_LimitExceeded
|
||||
}
|
||||
strongController.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
strongController.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
}
|
||||
}))
|
||||
}
|
||||
@ -687,7 +687,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
text = strongSelf.strings.Login_UnknownError
|
||||
}
|
||||
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.theme), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
}
|
||||
}
|
||||
}))
|
||||
@ -785,7 +785,7 @@ public final class AuthorizationSequenceController: NavigationController {
|
||||
|
||||
controller.view.window?.rootViewController?.present(composeController, animated: true, completion: nil)
|
||||
} else {
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: self.theme), title: nil, text: self.strings.Login_EmailNotConfiguredError, actions: [TextAlertAction(type: .defaultAction, title: self.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
controller.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: self.theme), title: nil, text: self.strings.Login_EmailNotConfiguredError, actions: [TextAlertAction(type: .defaultAction, title: self.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -51,36 +51,8 @@ private func loadCountryCodes() -> [(String, Int)] {
|
||||
|
||||
private let countryCodes: [(String, Int)] = loadCountryCodes()
|
||||
|
||||
final class AuthorizationSequenceCountrySelectionTheme {
|
||||
let statusBar: PresentationThemeStatusBarStyle
|
||||
let searchBar: SearchBarNodeTheme
|
||||
let listBackground: UIColor
|
||||
let listSeparator: UIColor
|
||||
let listAccent: UIColor
|
||||
let listPrimary: UIColor
|
||||
let listItemHighlight: UIColor
|
||||
|
||||
init(statusBar: PresentationThemeStatusBarStyle, searchBar: SearchBarNodeTheme, listBackground: UIColor, listSeparator: UIColor, listAccent: UIColor, listPrimary: UIColor, listItemHighlight: UIColor) {
|
||||
self.statusBar = statusBar
|
||||
self.searchBar = searchBar
|
||||
self.listBackground = listBackground
|
||||
self.listSeparator = listSeparator
|
||||
self.listAccent = listAccent
|
||||
self.listPrimary = listPrimary
|
||||
self.listItemHighlight = listItemHighlight
|
||||
}
|
||||
|
||||
convenience init(presentationTheme: PresentationTheme) {
|
||||
self.init(statusBar: presentationTheme.rootController.statusBar.style, searchBar: SearchBarNodeTheme(theme: presentationTheme), listBackground: presentationTheme.list.plainBackgroundColor, listSeparator: presentationTheme.list.itemPlainSeparatorColor, listAccent: presentationTheme.list.itemAccentColor, listPrimary: presentationTheme.list.itemPrimaryTextColor, listItemHighlight: presentationTheme.list.itemHighlightedBackgroundColor)
|
||||
}
|
||||
|
||||
convenience init(authorizationTheme: AuthorizationTheme) {
|
||||
self.init(statusBar: PresentationThemeStatusBarStyle(authorizationTheme.statusBarStyle), searchBar: SearchBarNodeTheme(background: authorizationTheme.navigationBarBackgroundColor, separator: authorizationTheme.navigationBarSeparatorColor, inputFill: authorizationTheme.searchBarFillColor, primaryText: authorizationTheme.searchBarTextColor, placeholder: authorizationTheme.searchBarPlaceholderColor, inputIcon: authorizationTheme.searchBarPlaceholderColor, inputClear: authorizationTheme.searchBarPlaceholderColor, accent: authorizationTheme.accentColor, keyboard: authorizationTheme.keyboard), listBackground: authorizationTheme.backgroundColor, listSeparator: authorizationTheme.separatorColor, listAccent: authorizationTheme.accentColor, listPrimary: authorizationTheme.primaryColor, listItemHighlight: authorizationTheme.itemHighlightedBackgroundColor)
|
||||
}
|
||||
}
|
||||
|
||||
private final class AuthorizationSequenceCountrySelectionNavigationContentNode: NavigationBarContentNode {
|
||||
private let theme: AuthorizationSequenceCountrySelectionTheme
|
||||
private let theme: PresentationTheme
|
||||
private let strings: PresentationStrings
|
||||
|
||||
private let cancel: () -> Void
|
||||
@ -89,17 +61,17 @@ private final class AuthorizationSequenceCountrySelectionNavigationContentNode:
|
||||
|
||||
private var queryUpdated: ((String) -> Void)?
|
||||
|
||||
init(theme: AuthorizationSequenceCountrySelectionTheme, strings: PresentationStrings, cancel: @escaping () -> Void) {
|
||||
init(theme: PresentationTheme, strings: PresentationStrings, cancel: @escaping () -> Void) {
|
||||
self.theme = theme
|
||||
self.strings = strings
|
||||
|
||||
self.cancel = cancel
|
||||
|
||||
self.searchBar = SearchBarNode(theme: theme.searchBar, strings: strings, fieldStyle: .modern)
|
||||
self.searchBar = SearchBarNode(theme: SearchBarNodeTheme(theme: theme), strings: strings, fieldStyle: .modern)
|
||||
let placeholderText = strings.Common_Search
|
||||
let searchBarFont = Font.regular(17.0)
|
||||
|
||||
self.searchBar.placeholderString = NSAttributedString(string: placeholderText, font: searchBarFont, textColor: theme.searchBar.placeholder)
|
||||
self.searchBar.placeholderString = NSAttributedString(string: placeholderText, font: searchBarFont, textColor: theme.rootController.activeNavigationSearchBar.inputPlaceholderTextColor)
|
||||
|
||||
super.init()
|
||||
|
||||
@ -161,7 +133,7 @@ final class AuthorizationSequenceCountrySelectionController: ViewController {
|
||||
return nil
|
||||
}
|
||||
|
||||
private let theme: AuthorizationSequenceCountrySelectionTheme
|
||||
private let theme: PresentationTheme
|
||||
private let strings: PresentationStrings
|
||||
private let displayCodes: Bool
|
||||
|
||||
@ -174,14 +146,14 @@ final class AuthorizationSequenceCountrySelectionController: ViewController {
|
||||
var completeWithCountryCode: ((Int, String) -> Void)?
|
||||
var dismissed: (() -> Void)?
|
||||
|
||||
init(strings: PresentationStrings, theme: AuthorizationSequenceCountrySelectionTheme, displayCodes: Bool = true) {
|
||||
init(strings: PresentationStrings, theme: PresentationTheme, displayCodes: Bool = true) {
|
||||
self.theme = theme
|
||||
self.strings = strings
|
||||
self.displayCodes = displayCodes
|
||||
|
||||
super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: NavigationBarTheme(buttonColor: theme.searchBar.accent, disabledButtonColor: UIColor(rgb: 0xd0d0d0), primaryTextColor: theme.searchBar.primaryText, backgroundColor: theme.searchBar.background, separatorColor: theme.searchBar.separator, badgeBackgroundColor: theme.searchBar.accent, badgeStrokeColor: .clear, badgeTextColor: theme.searchBar.background), strings: NavigationBarStrings(presentationStrings: strings)))
|
||||
super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: NavigationBarTheme(rootControllerTheme: theme), strings: NavigationBarStrings(presentationStrings: strings)))
|
||||
|
||||
self.statusBar.statusBarStyle = theme.statusBar.style
|
||||
self.statusBar.statusBarStyle = theme.rootController.statusBar.style.style
|
||||
|
||||
let navigationContentNode = AuthorizationSequenceCountrySelectionNavigationContentNode(theme: theme, strings: strings, cancel: { [weak self] in
|
||||
self?.dismissed?()
|
||||
|
||||
@ -68,7 +68,7 @@ func localizedContryNamesAndCodes(strings: PresentationStrings) -> [((String, St
|
||||
final class AuthorizationSequenceCountrySelectionControllerNode: ASDisplayNode, UITableViewDelegate, UITableViewDataSource {
|
||||
let itemSelected: (((String, String), String, Int)) -> Void
|
||||
|
||||
private let theme: AuthorizationSequenceCountrySelectionTheme
|
||||
private let theme: PresentationTheme
|
||||
private let strings: PresentationStrings
|
||||
private let displayCodes: Bool
|
||||
private let needsSubtitle: Bool
|
||||
@ -81,7 +81,7 @@ final class AuthorizationSequenceCountrySelectionControllerNode: ASDisplayNode,
|
||||
|
||||
private var searchResults: [((String, String), String, Int)] = []
|
||||
|
||||
init(theme: AuthorizationSequenceCountrySelectionTheme, strings: PresentationStrings, displayCodes: Bool, itemSelected: @escaping (((String, String), String, Int)) -> Void) {
|
||||
init(theme: PresentationTheme, strings: PresentationStrings, displayCodes: Bool, itemSelected: @escaping (((String, String), String, Int)) -> Void) {
|
||||
self.theme = theme
|
||||
self.strings = strings
|
||||
self.displayCodes = displayCodes
|
||||
@ -116,21 +116,21 @@ final class AuthorizationSequenceCountrySelectionControllerNode: ASDisplayNode,
|
||||
return UITracingLayerView()
|
||||
})
|
||||
|
||||
self.backgroundColor = theme.listBackground
|
||||
self.backgroundColor = theme.list.plainBackgroundColor
|
||||
|
||||
self.tableView.backgroundColor = theme.listBackground
|
||||
self.tableView.backgroundColor = theme.list.plainBackgroundColor
|
||||
|
||||
self.tableView.backgroundColor = self.theme.listBackground
|
||||
self.tableView.separatorColor = self.theme.listSeparator
|
||||
self.tableView.backgroundColor = self.theme.list.plainBackgroundColor
|
||||
self.tableView.separatorColor = self.theme.list.itemPlainSeparatorColor
|
||||
self.tableView.backgroundView = UIView()
|
||||
self.tableView.sectionIndexColor = self.theme.searchBar.accent
|
||||
self.tableView.sectionIndexColor = self.theme.list.itemAccentColor
|
||||
|
||||
self.searchTableView.backgroundColor = theme.listBackground
|
||||
self.searchTableView.backgroundColor = self.theme.list.plainBackgroundColor
|
||||
|
||||
self.searchTableView.backgroundColor = self.theme.listBackground
|
||||
self.searchTableView.separatorColor = self.theme.listSeparator
|
||||
self.searchTableView.backgroundColor = self.theme.list.plainBackgroundColor
|
||||
self.searchTableView.separatorColor = self.theme.list.itemPlainSeparatorColor
|
||||
self.searchTableView.backgroundView = UIView()
|
||||
self.searchTableView.sectionIndexColor = self.theme.searchBar.accent
|
||||
self.searchTableView.sectionIndexColor = self.theme.list.itemAccentColor
|
||||
|
||||
self.tableView.delegate = self
|
||||
self.tableView.dataSource = self
|
||||
@ -205,8 +205,8 @@ final class AuthorizationSequenceCountrySelectionControllerNode: ASDisplayNode,
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
|
||||
(view as? UITableViewHeaderFooterView)?.backgroundView?.backgroundColor = self.theme.listBackground
|
||||
(view as? UITableViewHeaderFooterView)?.textLabel?.textColor = self.theme.listPrimary
|
||||
(view as? UITableViewHeaderFooterView)?.backgroundView?.backgroundColor = self.theme.list.plainBackgroundColor
|
||||
(view as? UITableViewHeaderFooterView)?.textLabel?.textColor = self.theme.list.itemPrimaryTextColor
|
||||
}
|
||||
|
||||
func sectionIndexTitles(for tableView: UITableView) -> [String]? {
|
||||
@ -259,12 +259,12 @@ final class AuthorizationSequenceCountrySelectionControllerNode: ASDisplayNode,
|
||||
if self.displayCodes, let label = cell.accessoryView as? UILabel {
|
||||
label.text = code
|
||||
label.sizeToFit()
|
||||
label.textColor = self.theme.listPrimary
|
||||
label.textColor = self.theme.list.itemPrimaryTextColor
|
||||
}
|
||||
cell.textLabel?.textColor = self.theme.listPrimary
|
||||
cell.detailTextLabel?.textColor = self.theme.listPrimary
|
||||
cell.backgroundColor = self.theme.listBackground
|
||||
cell.selectedBackgroundView?.backgroundColor = self.theme.listItemHighlight
|
||||
cell.textLabel?.textColor = self.theme.list.itemPrimaryTextColor
|
||||
cell.detailTextLabel?.textColor = self.theme.list.itemPrimaryTextColor
|
||||
cell.backgroundColor = self.theme.list.plainBackgroundColor
|
||||
cell.selectedBackgroundView?.backgroundColor = self.theme.list.itemHighlightedBackgroundColor
|
||||
return cell
|
||||
}
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@ final class AuthorizationSequencePasswordEntryController: ViewController {
|
||||
}
|
||||
|
||||
private let strings: PresentationStrings
|
||||
private let theme: AuthorizationTheme
|
||||
private let theme: PresentationTheme
|
||||
|
||||
var loginWithPassword: ((String) -> Void)?
|
||||
var forgot: (() -> Void)?
|
||||
@ -32,7 +32,7 @@ final class AuthorizationSequencePasswordEntryController: ViewController {
|
||||
var inProgress: Bool = false {
|
||||
didSet {
|
||||
if self.inProgress {
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.theme.accentColor))
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.theme.rootController.navigationBar.accentTextColor))
|
||||
self.navigationItem.rightBarButtonItem = item
|
||||
} else {
|
||||
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.strings.Common_Next, style: .done, target: self, action: #selector(self.nextPressed))
|
||||
@ -41,7 +41,7 @@ final class AuthorizationSequencePasswordEntryController: ViewController {
|
||||
}
|
||||
}
|
||||
|
||||
init(strings: PresentationStrings, theme: AuthorizationTheme, back: @escaping () -> Void) {
|
||||
init(strings: PresentationStrings, theme: PresentationTheme, back: @escaping () -> Void) {
|
||||
self.strings = strings
|
||||
self.theme = theme
|
||||
|
||||
@ -51,7 +51,7 @@ final class AuthorizationSequencePasswordEntryController: ViewController {
|
||||
|
||||
self.hasActiveInput = true
|
||||
|
||||
self.statusBar.statusBarStyle = theme.statusBarStyle
|
||||
self.statusBar.statusBarStyle = theme.rootController.statusBar.style.style
|
||||
|
||||
self.attemptNavigation = { _ in
|
||||
return false
|
||||
@ -127,9 +127,9 @@ final class AuthorizationSequencePasswordEntryController: ViewController {
|
||||
|
||||
func forgotPressed() {
|
||||
if self.suggestReset {
|
||||
self.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: self.theme), title: nil, text: self.strings.TwoStepAuth_RecoveryFailed, actions: [TextAlertAction(type: .defaultAction, title: self.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: self.theme), title: nil, text: self.strings.TwoStepAuth_RecoveryFailed, actions: [TextAlertAction(type: .defaultAction, title: self.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
} else if self.didForgotWithNoRecovery {
|
||||
self.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: self.theme), title: nil, text: self.strings.TwoStepAuth_RecoveryUnavailable, actions: [TextAlertAction(type: .defaultAction, title: self.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: self.theme), title: nil, text: self.strings.TwoStepAuth_RecoveryUnavailable, actions: [TextAlertAction(type: .defaultAction, title: self.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
} else {
|
||||
self.forgot?()
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@ import Display
|
||||
|
||||
final class AuthorizationSequencePasswordEntryControllerNode: ASDisplayNode, UITextFieldDelegate {
|
||||
private let strings: PresentationStrings
|
||||
private let theme: AuthorizationTheme
|
||||
private let theme: PresentationTheme
|
||||
|
||||
private let titleNode: ASTextNode
|
||||
private let noticeNode: ASTextNode
|
||||
@ -35,41 +35,41 @@ final class AuthorizationSequencePasswordEntryControllerNode: ASDisplayNode, UIT
|
||||
}
|
||||
}
|
||||
|
||||
init(strings: PresentationStrings, theme: AuthorizationTheme) {
|
||||
init(strings: PresentationStrings, theme: PresentationTheme) {
|
||||
self.strings = strings
|
||||
self.theme = theme
|
||||
|
||||
self.titleNode = ASTextNode()
|
||||
self.titleNode.isUserInteractionEnabled = false
|
||||
self.titleNode.displaysAsynchronously = false
|
||||
self.titleNode.attributedText = NSAttributedString(string: strings.LoginPassword_Title, font: Font.light(30.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: strings.LoginPassword_Title, font: Font.light(30.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
|
||||
self.noticeNode = ASTextNode()
|
||||
self.noticeNode.isUserInteractionEnabled = false
|
||||
self.noticeNode.displaysAsynchronously = false
|
||||
self.noticeNode.attributedText = NSAttributedString(string: strings.TwoStepAuth_EnterPasswordHelp, font: Font.regular(16.0), textColor: self.theme.primaryColor, paragraphAlignment: .center)
|
||||
self.noticeNode.attributedText = NSAttributedString(string: strings.TwoStepAuth_EnterPasswordHelp, font: Font.regular(16.0), textColor: self.theme.list.itemPrimaryTextColor, paragraphAlignment: .center)
|
||||
|
||||
self.forgotNode = HighlightableButtonNode()
|
||||
self.forgotNode.displaysAsynchronously = false
|
||||
self.forgotNode.setAttributedTitle(NSAttributedString(string: self.strings.TwoStepAuth_EnterPasswordForgot, font: Font.regular(16.0), textColor: self.theme.accentColor, paragraphAlignment: .center), for: [])
|
||||
self.forgotNode.setAttributedTitle(NSAttributedString(string: self.strings.TwoStepAuth_EnterPasswordForgot, font: Font.regular(16.0), textColor: self.theme.list.itemAccentColor, paragraphAlignment: .center), for: [])
|
||||
|
||||
self.resetNode = HighlightableButtonNode()
|
||||
self.resetNode.displaysAsynchronously = false
|
||||
self.resetNode.setAttributedTitle(NSAttributedString(string: self.strings.LoginPassword_ResetAccount, font: Font.regular(16.0), textColor: self.theme.destructiveColor, paragraphAlignment: .center), for: [])
|
||||
self.resetNode.setAttributedTitle(NSAttributedString(string: self.strings.LoginPassword_ResetAccount, font: Font.regular(16.0), textColor: self.theme.list.itemDestructiveColor, paragraphAlignment: .center), for: [])
|
||||
|
||||
self.codeSeparatorNode = ASDisplayNode()
|
||||
self.codeSeparatorNode.isLayerBacked = true
|
||||
self.codeSeparatorNode.backgroundColor = self.theme.separatorColor
|
||||
self.codeSeparatorNode.backgroundColor = self.theme.list.itemPlainSeparatorColor
|
||||
|
||||
self.codeField = TextFieldNode()
|
||||
self.codeField.textField.font = Font.regular(20.0)
|
||||
self.codeField.textField.textColor = self.theme.primaryColor
|
||||
self.codeField.textField.textColor = self.theme.list.itemPrimaryTextColor
|
||||
self.codeField.textField.textAlignment = .natural
|
||||
self.codeField.textField.isSecureTextEntry = true
|
||||
self.codeField.textField.returnKeyType = .done
|
||||
self.codeField.textField.keyboardAppearance = self.theme.keyboard.keyboardAppearance
|
||||
self.codeField.textField.keyboardAppearance = self.theme.chatList.searchBarKeyboardColor.keyboardAppearance
|
||||
self.codeField.textField.disableAutomaticKeyboardHandling = [.forward, .backward]
|
||||
self.codeField.textField.tintColor = self.theme.accentColor
|
||||
self.codeField.textField.tintColor = self.theme.list.itemAccentColor
|
||||
|
||||
super.init()
|
||||
|
||||
@ -77,7 +77,7 @@ final class AuthorizationSequencePasswordEntryControllerNode: ASDisplayNode, UIT
|
||||
return UITracingLayerView()
|
||||
})
|
||||
|
||||
self.backgroundColor = self.theme.backgroundColor
|
||||
self.backgroundColor = self.theme.list.plainBackgroundColor
|
||||
|
||||
self.codeField.textField.delegate = self
|
||||
|
||||
@ -95,7 +95,7 @@ final class AuthorizationSequencePasswordEntryControllerNode: ASDisplayNode, UIT
|
||||
func updateData(hint: String, didForgotWithNoRecovery: Bool, suggestReset: Bool) {
|
||||
self.didForgotWithNoRecovery = didForgotWithNoRecovery
|
||||
self.suggestReset = suggestReset
|
||||
self.codeField.textField.attributedPlaceholder = NSAttributedString(string: hint, font: Font.regular(20.0), textColor: self.theme.textPlaceholderColor)
|
||||
self.codeField.textField.attributedPlaceholder = NSAttributedString(string: hint, font: Font.regular(20.0), textColor: self.theme.list.itemPlaceholderTextColor)
|
||||
if let (layout, navigationHeight) = self.layoutArguments {
|
||||
self.containerLayoutUpdated(layout, navigationBarHeight: navigationHeight, transition: .immediate)
|
||||
}
|
||||
@ -116,9 +116,9 @@ final class AuthorizationSequencePasswordEntryControllerNode: ASDisplayNode, UIT
|
||||
}
|
||||
|
||||
if max(layout.size.width, layout.size.height) > 1023.0 {
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.LoginPassword_Title, font: Font.light(40.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.LoginPassword_Title, font: Font.light(40.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
} else {
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.LoginPassword_Title, font: Font.light(30.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.LoginPassword_Title, font: Font.light(30.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
}
|
||||
|
||||
let titleSize = self.titleNode.measure(CGSize(width: layout.size.width, height: CGFloat.greatestFiniteMagnitude))
|
||||
|
||||
@ -8,7 +8,7 @@ final class AuthorizationSequencePasswordRecoveryController: ViewController {
|
||||
}
|
||||
|
||||
private let strings: PresentationStrings
|
||||
private let theme: AuthorizationTheme
|
||||
private let theme: PresentationTheme
|
||||
|
||||
var recoverWithCode: ((String) -> Void)?
|
||||
var noAccess: (() -> Void)?
|
||||
@ -20,7 +20,7 @@ final class AuthorizationSequencePasswordRecoveryController: ViewController {
|
||||
var inProgress: Bool = false {
|
||||
didSet {
|
||||
if self.inProgress {
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.theme.accentColor))
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.theme.rootController.navigationBar.accentTextColor))
|
||||
self.navigationItem.rightBarButtonItem = item
|
||||
} else {
|
||||
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.strings.Common_Next, style: .done, target: self, action: #selector(self.nextPressed))
|
||||
@ -29,7 +29,7 @@ final class AuthorizationSequencePasswordRecoveryController: ViewController {
|
||||
}
|
||||
}
|
||||
|
||||
init(strings: PresentationStrings, theme: AuthorizationTheme, back: @escaping () -> Void) {
|
||||
init(strings: PresentationStrings, theme: PresentationTheme, back: @escaping () -> Void) {
|
||||
self.strings = strings
|
||||
self.theme = theme
|
||||
|
||||
@ -39,7 +39,7 @@ final class AuthorizationSequencePasswordRecoveryController: ViewController {
|
||||
|
||||
self.hasActiveInput = true
|
||||
|
||||
self.statusBar.statusBarStyle = theme.statusBarStyle
|
||||
self.statusBar.statusBarStyle = theme.rootController.statusBar.style.style
|
||||
|
||||
self.attemptNavigation = { _ in
|
||||
return false
|
||||
|
||||
@ -4,7 +4,7 @@ import Display
|
||||
|
||||
final class AuthorizationSequencePasswordRecoveryControllerNode: ASDisplayNode, UITextFieldDelegate {
|
||||
private let strings: PresentationStrings
|
||||
private let theme: AuthorizationTheme
|
||||
private let theme: PresentationTheme
|
||||
|
||||
private let titleNode: ASTextNode
|
||||
private let noticeNode: ASTextNode
|
||||
@ -28,36 +28,36 @@ final class AuthorizationSequencePasswordRecoveryControllerNode: ASDisplayNode,
|
||||
}
|
||||
}
|
||||
|
||||
init(strings: PresentationStrings, theme: AuthorizationTheme) {
|
||||
init(strings: PresentationStrings, theme: PresentationTheme) {
|
||||
self.strings = strings
|
||||
self.theme = theme
|
||||
|
||||
self.titleNode = ASTextNode()
|
||||
self.titleNode.isUserInteractionEnabled = false
|
||||
self.titleNode.displaysAsynchronously = false
|
||||
self.titleNode.attributedText = NSAttributedString(string: strings.TwoStepAuth_RecoveryTitle, font: Font.light(30.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: strings.TwoStepAuth_RecoveryTitle, font: Font.light(30.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
|
||||
self.noticeNode = ASTextNode()
|
||||
self.noticeNode.isUserInteractionEnabled = false
|
||||
self.noticeNode.displaysAsynchronously = false
|
||||
self.noticeNode.attributedText = NSAttributedString(string: strings.TwoStepAuth_RecoveryCodeHelp, font: Font.regular(16.0), textColor: self.theme.primaryColor, paragraphAlignment: .center)
|
||||
self.noticeNode.attributedText = NSAttributedString(string: strings.TwoStepAuth_RecoveryCodeHelp, font: Font.regular(16.0), textColor: self.theme.list.itemPrimaryTextColor, paragraphAlignment: .center)
|
||||
|
||||
self.noAccessNode = HighlightableButtonNode()
|
||||
self.noAccessNode.displaysAsynchronously = false
|
||||
|
||||
self.codeSeparatorNode = ASDisplayNode()
|
||||
self.codeSeparatorNode.isLayerBacked = true
|
||||
self.codeSeparatorNode.backgroundColor = self.theme.separatorColor
|
||||
self.codeSeparatorNode.backgroundColor = self.theme.list.itemPlainSeparatorColor
|
||||
|
||||
self.codeField = TextFieldNode()
|
||||
self.codeField.textField.font = Font.regular(20.0)
|
||||
self.codeField.textField.textColor = self.theme.primaryColor
|
||||
self.codeField.textField.textColor = self.theme.list.itemPrimaryTextColor
|
||||
self.codeField.textField.textAlignment = .center
|
||||
self.codeField.textField.attributedPlaceholder = NSAttributedString(string: self.strings.TwoStepAuth_RecoveryCode, font: Font.regular(20.0), textColor: self.theme.textPlaceholderColor)
|
||||
self.codeField.textField.attributedPlaceholder = NSAttributedString(string: self.strings.TwoStepAuth_RecoveryCode, font: Font.regular(20.0), textColor: self.theme.list.itemPlaceholderTextColor)
|
||||
self.codeField.textField.returnKeyType = .done
|
||||
self.codeField.textField.keyboardAppearance = self.theme.keyboard.keyboardAppearance
|
||||
self.codeField.textField.keyboardAppearance = self.theme.chatList.searchBarKeyboardColor.keyboardAppearance
|
||||
self.codeField.textField.disableAutomaticKeyboardHandling = [.forward, .backward]
|
||||
self.codeField.textField.tintColor = self.theme.accentColor
|
||||
self.codeField.textField.tintColor = self.theme.list.itemAccentColor
|
||||
|
||||
super.init()
|
||||
|
||||
@ -65,7 +65,7 @@ final class AuthorizationSequencePasswordRecoveryControllerNode: ASDisplayNode,
|
||||
return UITracingLayerView()
|
||||
})
|
||||
|
||||
self.backgroundColor = self.theme.backgroundColor
|
||||
self.backgroundColor = self.theme.list.plainBackgroundColor
|
||||
|
||||
self.codeField.textField.delegate = self
|
||||
|
||||
@ -79,7 +79,7 @@ final class AuthorizationSequencePasswordRecoveryControllerNode: ASDisplayNode,
|
||||
}
|
||||
|
||||
func updateData(emailPattern: String) {
|
||||
self.noAccessNode.setAttributedTitle(NSAttributedString(string: self.strings.TwoStepAuth_RecoveryEmailUnavailable(emailPattern).0, font: Font.regular(16.0), textColor: self.theme.accentColor, paragraphAlignment: .center), for: [])
|
||||
self.noAccessNode.setAttributedTitle(NSAttributedString(string: self.strings.TwoStepAuth_RecoveryEmailUnavailable(emailPattern).0, font: Font.regular(16.0), textColor: self.theme.list.itemAccentColor, paragraphAlignment: .center), for: [])
|
||||
}
|
||||
|
||||
func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) {
|
||||
@ -89,9 +89,9 @@ final class AuthorizationSequencePasswordRecoveryControllerNode: ASDisplayNode,
|
||||
insets.top = navigationBarHeight
|
||||
|
||||
if max(layout.size.width, layout.size.height) > 1023.0 {
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.TwoStepAuth_RecoveryTitle, font: Font.light(40.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.TwoStepAuth_RecoveryTitle, font: Font.light(40.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
} else {
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.TwoStepAuth_RecoveryTitle, font: Font.light(30.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.TwoStepAuth_RecoveryTitle, font: Font.light(30.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
}
|
||||
|
||||
let titleSize = self.titleNode.measure(CGSize(width: layout.size.width, height: CGFloat.greatestFiniteMagnitude))
|
||||
|
||||
@ -14,7 +14,7 @@ final class AuthorizationSequencePhoneEntryController: ViewController {
|
||||
private let otherAccountPhoneNumbers: ((String, AccountRecordId)?, [(String, AccountRecordId)])
|
||||
private let network: Network
|
||||
private let strings: PresentationStrings
|
||||
private let theme: AuthorizationTheme
|
||||
private let theme: PresentationTheme
|
||||
private let openUrl: (String) -> Void
|
||||
|
||||
private let back: () -> Void
|
||||
@ -24,7 +24,7 @@ final class AuthorizationSequencePhoneEntryController: ViewController {
|
||||
var inProgress: Bool = false {
|
||||
didSet {
|
||||
if self.inProgress {
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.theme.accentColor))
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.theme.rootController.navigationBar.accentTextColor))
|
||||
self.navigationItem.rightBarButtonItem = item
|
||||
} else {
|
||||
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.strings.Common_Next, style: .done, target: self, action: #selector(self.nextPressed))
|
||||
@ -38,7 +38,7 @@ final class AuthorizationSequencePhoneEntryController: ViewController {
|
||||
|
||||
private let hapticFeedback = HapticFeedback()
|
||||
|
||||
init(sharedContext: SharedAccountContext, otherAccountPhoneNumbers: ((String, AccountRecordId)?, [(String, AccountRecordId)]), network: Network, strings: PresentationStrings, theme: AuthorizationTheme, openUrl: @escaping (String) -> Void, back: @escaping () -> Void) {
|
||||
init(sharedContext: SharedAccountContext, otherAccountPhoneNumbers: ((String, AccountRecordId)?, [(String, AccountRecordId)]), network: Network, strings: PresentationStrings, theme: PresentationTheme, openUrl: @escaping (String) -> Void, back: @escaping () -> Void) {
|
||||
self.sharedContext = sharedContext
|
||||
self.otherAccountPhoneNumbers = otherAccountPhoneNumbers
|
||||
self.network = network
|
||||
@ -53,7 +53,7 @@ final class AuthorizationSequencePhoneEntryController: ViewController {
|
||||
|
||||
self.hasActiveInput = true
|
||||
|
||||
self.statusBar.statusBarStyle = theme.statusBarStyle
|
||||
self.statusBar.statusBarStyle = theme.rootController.statusBar.style.style
|
||||
self.attemptNavigation = { _ in
|
||||
return false
|
||||
}
|
||||
@ -94,7 +94,7 @@ final class AuthorizationSequencePhoneEntryController: ViewController {
|
||||
self.displayNodeDidLoad()
|
||||
self.controllerNode.selectCountryCode = { [weak self] in
|
||||
if let strongSelf = self {
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.strings, theme: AuthorizationSequenceCountrySelectionTheme(authorizationTheme: strongSelf.theme))
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.strings, theme: strongSelf.theme)
|
||||
controller.completeWithCountryCode = { code, name in
|
||||
if let strongSelf = self, let currentData = strongSelf.currentData {
|
||||
strongSelf.updateData(countryCode: Int32(code), countryName: name, number: currentData.2)
|
||||
@ -151,7 +151,7 @@ final class AuthorizationSequencePhoneEntryController: ViewController {
|
||||
}))
|
||||
}
|
||||
actions.append(TextAlertAction(type: .defaultAction, title: self.strings.Common_OK, action: {}))
|
||||
self.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: self.theme), title: nil, text: self.strings.Login_PhoneNumberAlreadyAuthorized, actions: actions), in: .window(.root))
|
||||
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: self.theme), title: nil, text: self.strings.Login_PhoneNumberAlreadyAuthorized, actions: actions), in: .window(.root))
|
||||
} else {
|
||||
self.loginWithNumber?(self.controllerNode.currentNumber)
|
||||
}
|
||||
|
||||
@ -30,14 +30,14 @@ private final class PhoneAndCountryNode: ASDisplayNode {
|
||||
var selectCountryCode: (() -> Void)?
|
||||
var checkPhone: (() -> Void)?
|
||||
|
||||
init(strings: PresentationStrings, theme: AuthorizationTheme) {
|
||||
init(strings: PresentationStrings, theme: PresentationTheme) {
|
||||
self.strings = strings
|
||||
|
||||
let countryButtonBackground = generateImage(CGSize(width: 61.0, height: 67.0), rotatedContext: { size, context in
|
||||
let arrowSize: CGFloat = 10.0
|
||||
let lineWidth = UIScreenPixel
|
||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||
context.setStrokeColor(theme.separatorColor.cgColor)
|
||||
context.setStrokeColor(theme.list.itemPlainSeparatorColor.cgColor)
|
||||
context.setLineWidth(lineWidth)
|
||||
context.move(to: CGPoint(x: 15.0, y: lineWidth / 2.0))
|
||||
context.addLine(to: CGPoint(x: size.width, y: lineWidth / 2.0))
|
||||
@ -54,7 +54,7 @@ private final class PhoneAndCountryNode: ASDisplayNode {
|
||||
let countryButtonHighlightedBackground = generateImage(CGSize(width: 60.0, height: 67.0), rotatedContext: { size, context in
|
||||
let arrowSize: CGFloat = 10.0
|
||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||
context.setFillColor(theme.itemHighlightedBackgroundColor.cgColor)
|
||||
context.setFillColor(theme.list.itemHighlightedBackgroundColor.cgColor)
|
||||
context.fill(CGRect(origin: CGPoint(), size: CGSize(width: size.width, height: size.height - arrowSize)))
|
||||
context.move(to: CGPoint(x: size.width, y: size.height - arrowSize))
|
||||
context.addLine(to: CGPoint(x: size.width - 1.0, y: size.height - arrowSize))
|
||||
@ -67,7 +67,7 @@ private final class PhoneAndCountryNode: ASDisplayNode {
|
||||
let phoneInputBackground = generateImage(CGSize(width: 85.0, height: 57.0), rotatedContext: { size, context in
|
||||
let lineWidth = UIScreenPixel
|
||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||
context.setStrokeColor(theme.separatorColor.cgColor)
|
||||
context.setStrokeColor(theme.list.itemPlainSeparatorColor.cgColor)
|
||||
context.setLineWidth(lineWidth)
|
||||
context.move(to: CGPoint(x: 15.0, y: size.height - lineWidth / 2.0))
|
||||
context.addLine(to: CGPoint(x: size.width, y: size.height - lineWidth / 2.0))
|
||||
@ -98,13 +98,13 @@ private final class PhoneAndCountryNode: ASDisplayNode {
|
||||
self.addSubnode(self.countryButton)
|
||||
self.addSubnode(self.phoneInputNode)
|
||||
|
||||
self.phoneInputNode.countryCodeField.textField.keyboardAppearance = theme.keyboard.keyboardAppearance
|
||||
self.phoneInputNode.numberField.textField.keyboardAppearance = theme.keyboard.keyboardAppearance
|
||||
self.phoneInputNode.countryCodeField.textField.textColor = theme.primaryColor
|
||||
self.phoneInputNode.numberField.textField.textColor = theme.primaryColor
|
||||
self.phoneInputNode.countryCodeField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance
|
||||
self.phoneInputNode.numberField.textField.keyboardAppearance = theme.chatList.searchBarKeyboardColor.keyboardAppearance
|
||||
self.phoneInputNode.countryCodeField.textField.textColor = theme.list.itemPrimaryTextColor
|
||||
self.phoneInputNode.numberField.textField.textColor = theme.list.itemPrimaryTextColor
|
||||
|
||||
self.phoneInputNode.countryCodeField.textField.tintColor = theme.accentColor
|
||||
self.phoneInputNode.numberField.textField.tintColor = theme.accentColor
|
||||
self.phoneInputNode.countryCodeField.textField.tintColor = theme.list.itemAccentColor
|
||||
self.phoneInputNode.numberField.textField.tintColor = theme.list.itemAccentColor
|
||||
|
||||
self.phoneInputNode.countryCodeField.textField.disableAutomaticKeyboardHandling = [.forward]
|
||||
self.phoneInputNode.numberField.textField.disableAutomaticKeyboardHandling = [.forward]
|
||||
@ -113,7 +113,7 @@ private final class PhoneAndCountryNode: ASDisplayNode {
|
||||
self.countryButton.contentEdgeInsets = UIEdgeInsets(top: 0.0, left: 15.0, bottom: 10.0, right: 0.0)
|
||||
self.countryButton.contentHorizontalAlignment = .left
|
||||
|
||||
self.phoneInputNode.numberField.textField.attributedPlaceholder = NSAttributedString(string: strings.Login_PhonePlaceholder, font: Font.regular(20.0), textColor: theme.textPlaceholderColor)
|
||||
self.phoneInputNode.numberField.textField.attributedPlaceholder = NSAttributedString(string: strings.Login_PhonePlaceholder, font: Font.regular(20.0), textColor: theme.list.itemPlaceholderTextColor)
|
||||
|
||||
self.countryButton.addTarget(self, action: #selector(self.countryPressed), forControlEvents: .touchUpInside)
|
||||
|
||||
@ -122,13 +122,13 @@ private final class PhoneAndCountryNode: ASDisplayNode {
|
||||
if let code = Int(code), let name = name, let countryName = countryCodeAndIdToName[CountryCodeAndId(code: code, id: name)] {
|
||||
let flagString = emojiFlagForISOCountryCode(name as NSString)
|
||||
let localizedName: String = AuthorizationSequenceCountrySelectionController.lookupCountryNameById(name, strings: strongSelf.strings) ?? countryName
|
||||
strongSelf.countryButton.setTitle("\(flagString) \(localizedName)", with: Font.regular(20.0), with: theme.primaryColor, for: [])
|
||||
strongSelf.countryButton.setTitle("\(flagString) \(localizedName)", with: Font.regular(20.0), with: theme.list.itemPrimaryTextColor, for: [])
|
||||
} else if let code = Int(code), let (countryId, countryName) = countryCodeToIdAndName[code] {
|
||||
let flagString = emojiFlagForISOCountryCode(countryId as NSString)
|
||||
let localizedName: String = AuthorizationSequenceCountrySelectionController.lookupCountryNameById(countryId, strings: strongSelf.strings) ?? countryName
|
||||
strongSelf.countryButton.setTitle("\(flagString) \(localizedName)", with: Font.regular(20.0), with: theme.primaryColor, for: [])
|
||||
strongSelf.countryButton.setTitle("\(flagString) \(localizedName)", with: Font.regular(20.0), with: theme.list.itemPrimaryTextColor, for: [])
|
||||
} else {
|
||||
strongSelf.countryButton.setTitle(strings.Login_SelectCountry_Title, with: Font.regular(20.0), with: theme.textPlaceholderColor, for: [])
|
||||
strongSelf.countryButton.setTitle(strings.Login_SelectCountry_Title, with: Font.regular(20.0), with: theme.list.itemPlaceholderTextColor, for: [])
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -164,7 +164,7 @@ private final class PhoneAndCountryNode: ASDisplayNode {
|
||||
|
||||
final class AuthorizationSequencePhoneEntryControllerNode: ASDisplayNode {
|
||||
private let strings: PresentationStrings
|
||||
private let theme: AuthorizationTheme
|
||||
private let theme: PresentationTheme
|
||||
|
||||
private let titleNode: ASTextNode
|
||||
private let noticeNode: ASTextNode
|
||||
@ -194,27 +194,27 @@ final class AuthorizationSequencePhoneEntryControllerNode: ASDisplayNode {
|
||||
}
|
||||
}
|
||||
|
||||
init(strings: PresentationStrings, theme: AuthorizationTheme) {
|
||||
init(strings: PresentationStrings, theme: PresentationTheme) {
|
||||
self.strings = strings
|
||||
self.theme = theme
|
||||
|
||||
self.titleNode = ASTextNode()
|
||||
self.titleNode.isUserInteractionEnabled = false
|
||||
self.titleNode.displaysAsynchronously = false
|
||||
self.titleNode.attributedText = NSAttributedString(string: strings.Login_PhoneTitle, font: Font.light(30.0), textColor: theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: strings.Login_PhoneTitle, font: Font.light(30.0), textColor: theme.list.itemPrimaryTextColor)
|
||||
|
||||
self.noticeNode = ASTextNode()
|
||||
self.noticeNode.isUserInteractionEnabled = false
|
||||
self.noticeNode.displaysAsynchronously = false
|
||||
self.noticeNode.attributedText = NSAttributedString(string: strings.Login_PhoneAndCountryHelp, font: Font.regular(16.0), textColor: theme.primaryColor, paragraphAlignment: .center)
|
||||
self.noticeNode.attributedText = NSAttributedString(string: strings.Login_PhoneAndCountryHelp, font: Font.regular(16.0), textColor: theme.list.itemPrimaryTextColor, paragraphAlignment: .center)
|
||||
|
||||
self.termsOfServiceNode = ImmediateTextNode()
|
||||
self.termsOfServiceNode.maximumNumberOfLines = 0
|
||||
self.termsOfServiceNode.textAlignment = .center
|
||||
self.termsOfServiceNode.displaysAsynchronously = false
|
||||
|
||||
let termsOfServiceAttributes = MarkdownAttributeSet(font: Font.regular(16.0), textColor: self.theme.primaryColor)
|
||||
let termsOfServiceLinkAttributes = MarkdownAttributeSet(font: Font.regular(16.0), textColor: self.theme.accentColor, additionalAttributes: [NSAttributedStringKey.underlineStyle.rawValue: NSUnderlineStyle.styleSingle.rawValue as NSNumber, TelegramTextAttributes.URL: ""])
|
||||
let termsOfServiceAttributes = MarkdownAttributeSet(font: Font.regular(16.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
let termsOfServiceLinkAttributes = MarkdownAttributeSet(font: Font.regular(16.0), textColor: self.theme.list.itemAccentColor, additionalAttributes: [NSAttributedStringKey.underlineStyle.rawValue: NSUnderlineStyle.styleSingle.rawValue as NSNumber, TelegramTextAttributes.URL: ""])
|
||||
|
||||
let termsString = parseMarkdownIntoAttributedString(self.strings.Login_TermsOfServiceLabel.replacingOccurrences(of: "]", with: "]()"), attributes: MarkdownAttributes(body: termsOfServiceAttributes, bold: termsOfServiceAttributes, link: termsOfServiceLinkAttributes, linkAttribute: { _ in
|
||||
return nil
|
||||
@ -229,7 +229,7 @@ final class AuthorizationSequencePhoneEntryControllerNode: ASDisplayNode {
|
||||
return UITracingLayerView()
|
||||
})
|
||||
|
||||
self.backgroundColor = theme.backgroundColor
|
||||
self.backgroundColor = theme.list.plainBackgroundColor
|
||||
|
||||
self.addSubnode(self.titleNode)
|
||||
//self.addSubnode(self.termsOfServiceNode)
|
||||
@ -254,7 +254,7 @@ final class AuthorizationSequencePhoneEntryControllerNode: ASDisplayNode {
|
||||
if let _ = attributes[NSAttributedStringKey(rawValue: TelegramTextAttributes.URL)] as? String {
|
||||
}
|
||||
}
|
||||
self.termsOfServiceNode.linkHighlightColor = theme.accentColor.withAlphaComponent(0.5)
|
||||
self.termsOfServiceNode.linkHighlightColor = theme.list.itemAccentColor.withAlphaComponent(0.5)
|
||||
}
|
||||
|
||||
func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) {
|
||||
@ -270,9 +270,9 @@ final class AuthorizationSequencePhoneEntryControllerNode: ASDisplayNode {
|
||||
}
|
||||
|
||||
if max(layout.size.width, layout.size.height) > 1023.0 {
|
||||
self.titleNode.attributedText = NSAttributedString(string: strings.Login_PhoneTitle, font: Font.light(40.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: strings.Login_PhoneTitle, font: Font.light(40.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
} else {
|
||||
self.titleNode.attributedText = NSAttributedString(string: strings.Login_PhoneTitle, font: Font.light(30.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: strings.Login_PhoneTitle, font: Font.light(30.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
}
|
||||
|
||||
let titleSize = self.titleNode.measure(CGSize(width: layout.size.width, height: CGFloat.greatestFiniteMagnitude))
|
||||
|
||||
@ -12,7 +12,7 @@ final class AuthorizationSequenceSignUpController: ViewController {
|
||||
}
|
||||
|
||||
private let strings: PresentationStrings
|
||||
private let theme: AuthorizationTheme
|
||||
private let theme: PresentationTheme
|
||||
|
||||
var initialName: (String, String) = ("", "")
|
||||
private var termsOfService: UnauthorizedAccountTermsOfService?
|
||||
@ -24,7 +24,7 @@ final class AuthorizationSequenceSignUpController: ViewController {
|
||||
var inProgress: Bool = false {
|
||||
didSet {
|
||||
if self.inProgress {
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.theme.accentColor))
|
||||
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.theme.rootController.navigationBar.accentTextColor))
|
||||
self.navigationItem.rightBarButtonItem = item
|
||||
} else {
|
||||
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.strings.Common_Next, style: .done, target: self, action: #selector(self.nextPressed))
|
||||
@ -33,7 +33,7 @@ final class AuthorizationSequenceSignUpController: ViewController {
|
||||
}
|
||||
}
|
||||
|
||||
init(strings: PresentationStrings, theme: AuthorizationTheme, back: @escaping () -> Void) {
|
||||
init(strings: PresentationStrings, theme: PresentationTheme, back: @escaping () -> Void) {
|
||||
self.strings = strings
|
||||
self.theme = theme
|
||||
|
||||
@ -41,7 +41,7 @@ final class AuthorizationSequenceSignUpController: ViewController {
|
||||
|
||||
self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait)
|
||||
|
||||
self.statusBar.statusBarStyle = self.theme.statusBarStyle
|
||||
self.statusBar.statusBarStyle = self.theme.rootController.statusBar.style.style
|
||||
|
||||
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.strings.Common_Next, style: .done, target: self, action: #selector(self.nextPressed))
|
||||
|
||||
@ -52,7 +52,7 @@ final class AuthorizationSequenceSignUpController: ViewController {
|
||||
guard let strongSelf = self else {
|
||||
return
|
||||
}
|
||||
strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(authTheme: theme), title: nil, text: strings.Login_CancelSignUpConfirmation, actions: [TextAlertAction(type: .genericAction, title: strings.Login_CancelPhoneVerificationContinue, action: {
|
||||
strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: theme), title: nil, text: strings.Login_CancelSignUpConfirmation, actions: [TextAlertAction(type: .genericAction, title: strings.Login_CancelPhoneVerificationContinue, action: {
|
||||
}), TextAlertAction(type: .defaultAction, title: strings.Login_CancelPhoneVerificationStop, action: {
|
||||
back()
|
||||
})]), in: .window(.root))
|
||||
|
||||
@ -16,7 +16,7 @@ private func roundCorners(diameter: CGFloat) -> UIImage {
|
||||
}
|
||||
|
||||
final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFieldDelegate {
|
||||
private let theme: AuthorizationTheme
|
||||
private let theme: PresentationTheme
|
||||
private let strings: PresentationStrings
|
||||
private let addPhoto: () -> Void
|
||||
|
||||
@ -63,7 +63,7 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
|
||||
}
|
||||
}
|
||||
|
||||
init(theme: AuthorizationTheme, strings: PresentationStrings, addPhoto: @escaping () -> Void) {
|
||||
init(theme: PresentationTheme, strings: PresentationStrings, addPhoto: @escaping () -> Void) {
|
||||
self.theme = theme
|
||||
self.strings = strings
|
||||
self.addPhoto = addPhoto
|
||||
@ -71,35 +71,35 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
|
||||
self.titleNode = ASTextNode()
|
||||
self.titleNode.isUserInteractionEnabled = false
|
||||
self.titleNode.displaysAsynchronously = false
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_InfoTitle, font: Font.light(30.0), textColor: theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_InfoTitle, font: Font.light(30.0), textColor: theme.list.itemPrimaryTextColor)
|
||||
|
||||
self.currentOptionNode = ASTextNode()
|
||||
self.currentOptionNode.isUserInteractionEnabled = false
|
||||
self.currentOptionNode.displaysAsynchronously = false
|
||||
self.currentOptionNode.attributedText = NSAttributedString(string: self.strings.Login_InfoHelp, font: Font.regular(16.0), textColor: theme.textPlaceholderColor, paragraphAlignment: .center)
|
||||
self.currentOptionNode.attributedText = NSAttributedString(string: self.strings.Login_InfoHelp, font: Font.regular(16.0), textColor: theme.list.itemPlaceholderTextColor, paragraphAlignment: .center)
|
||||
|
||||
self.termsNode = ImmediateTextNode()
|
||||
self.termsNode.textAlignment = .center
|
||||
self.termsNode.maximumNumberOfLines = 0
|
||||
self.termsNode.displaysAsynchronously = false
|
||||
let body = MarkdownAttributeSet(font: Font.regular(16.0), textColor: theme.primaryColor)
|
||||
let link = MarkdownAttributeSet(font: Font.regular(16.0), textColor: theme.accentColor, additionalAttributes: [TelegramTextAttributes.URL: ""])
|
||||
let body = MarkdownAttributeSet(font: Font.regular(16.0), textColor: theme.list.itemPrimaryTextColor)
|
||||
let link = MarkdownAttributeSet(font: Font.regular(16.0), textColor: theme.list.itemAccentColor, additionalAttributes: [TelegramTextAttributes.URL: ""])
|
||||
self.termsNode.attributedText = parseMarkdownIntoAttributedString(strings.Login_TermsOfServiceLabel.replacingOccurrences(of: "]", with: "]()"), attributes: MarkdownAttributes(body: body, bold: body, link: link, linkAttribute: { _ in nil }), textAlignment: .center)
|
||||
|
||||
self.firstSeparatorNode = ASDisplayNode()
|
||||
self.firstSeparatorNode.isLayerBacked = true
|
||||
self.firstSeparatorNode.backgroundColor = self.theme.separatorColor
|
||||
self.firstSeparatorNode.backgroundColor = self.theme.list.itemPlainSeparatorColor
|
||||
|
||||
self.lastSeparatorNode = ASDisplayNode()
|
||||
self.lastSeparatorNode.isLayerBacked = true
|
||||
self.lastSeparatorNode.backgroundColor = self.theme.separatorColor
|
||||
self.lastSeparatorNode.backgroundColor = self.theme.list.itemPlainSeparatorColor
|
||||
|
||||
self.firstNameField = TextFieldNode()
|
||||
self.firstNameField.textField.font = Font.regular(20.0)
|
||||
self.firstNameField.textField.textColor = self.theme.primaryColor
|
||||
self.firstNameField.textField.textColor = self.theme.list.itemPrimaryTextColor
|
||||
self.firstNameField.textField.textAlignment = .natural
|
||||
self.firstNameField.textField.returnKeyType = .next
|
||||
self.firstNameField.textField.attributedPlaceholder = NSAttributedString(string: self.strings.UserInfo_FirstNamePlaceholder, font: self.firstNameField.textField.font, textColor: self.theme.textPlaceholderColor)
|
||||
self.firstNameField.textField.attributedPlaceholder = NSAttributedString(string: self.strings.UserInfo_FirstNamePlaceholder, font: self.firstNameField.textField.font, textColor: self.theme.list.itemPlaceholderTextColor)
|
||||
self.firstNameField.textField.autocapitalizationType = .words
|
||||
self.firstNameField.textField.autocorrectionType = .no
|
||||
if #available(iOSApplicationExtension 10.0, *) {
|
||||
@ -108,10 +108,10 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
|
||||
|
||||
self.lastNameField = TextFieldNode()
|
||||
self.lastNameField.textField.font = Font.regular(20.0)
|
||||
self.lastNameField.textField.textColor = self.theme.primaryColor
|
||||
self.lastNameField.textField.textColor = self.theme.list.itemPrimaryTextColor
|
||||
self.lastNameField.textField.textAlignment = .natural
|
||||
self.lastNameField.textField.returnKeyType = .done
|
||||
self.lastNameField.textField.attributedPlaceholder = NSAttributedString(string: strings.UserInfo_LastNamePlaceholder, font: self.lastNameField.textField.font, textColor: self.theme.textPlaceholderColor)
|
||||
self.lastNameField.textField.attributedPlaceholder = NSAttributedString(string: strings.UserInfo_LastNamePlaceholder, font: self.lastNameField.textField.font, textColor: self.theme.list.itemPlaceholderTextColor)
|
||||
self.lastNameField.textField.autocapitalizationType = .words
|
||||
self.lastNameField.textField.autocorrectionType = .no
|
||||
if #available(iOSApplicationExtension 10.0, *) {
|
||||
@ -124,8 +124,8 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
|
||||
self.currentPhotoNode.displayWithoutProcessing = true
|
||||
|
||||
self.addPhotoButton = HighlightableButtonNode()
|
||||
self.addPhotoButton.setAttributedTitle(NSAttributedString(string: "\(self.strings.Login_InfoAvatarAdd)\n\(self.strings.Login_InfoAvatarPhoto)", font: Font.regular(16.0), textColor: self.theme.textPlaceholderColor, paragraphAlignment: .center), for: .normal)
|
||||
self.addPhotoButton.setBackgroundImage(generateCircleImage(diameter: 110.0, lineWidth: 1.0, color: self.theme.textPlaceholderColor), for: .normal)
|
||||
self.addPhotoButton.setAttributedTitle(NSAttributedString(string: "\(self.strings.Login_InfoAvatarAdd)\n\(self.strings.Login_InfoAvatarPhoto)", font: Font.regular(16.0), textColor: self.theme.list.itemPlaceholderTextColor, paragraphAlignment: .center), for: .normal)
|
||||
self.addPhotoButton.setBackgroundImage(generateCircleImage(diameter: 110.0, lineWidth: 1.0, color: self.theme.list.itemPlaceholderTextColor), for: .normal)
|
||||
|
||||
self.addPhotoButton.addSubnode(self.currentPhotoNode)
|
||||
self.addPhotoButton.allowsGroupOpacity = true
|
||||
@ -136,7 +136,7 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
|
||||
return UITracingLayerView()
|
||||
})
|
||||
|
||||
self.backgroundColor = self.theme.backgroundColor
|
||||
self.backgroundColor = self.theme.list.plainBackgroundColor
|
||||
|
||||
self.firstNameField.textField.delegate = self
|
||||
self.lastNameField.textField.delegate = self
|
||||
@ -151,25 +151,9 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
|
||||
self.termsNode.isHidden = true
|
||||
self.addSubnode(self.addPhotoButton)
|
||||
|
||||
/*self.addPhotoButton.highligthedChanged = { [weak self] highlighted in
|
||||
if let strongSelf = self {
|
||||
if highlighted {
|
||||
strongSelf.addPhotoButton.layer.removeAnimation(forKey: "opacity")
|
||||
strongSelf.addPhotoButton.alpha = 0.4
|
||||
strongSelf.currentPhotoNode.layer.removeAnimation(forKey: "opacity")
|
||||
strongSelf.currentPhotoNode.alpha = 0.4
|
||||
} else {
|
||||
strongSelf.addPhotoButton.alpha = 1.0
|
||||
strongSelf.addPhotoButton.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2)
|
||||
strongSelf.currentPhotoNode.alpha = 1.0
|
||||
strongSelf.currentPhotoNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2)
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
self.addPhotoButton.addTarget(self, action: #selector(self.addPhotoPressed), forControlEvents: .touchUpInside)
|
||||
|
||||
self.termsNode.linkHighlightColor = self.theme.accentColor.withAlphaComponent(0.5)
|
||||
self.termsNode.linkHighlightColor = self.theme.list.itemAccentColor.withAlphaComponent(0.5)
|
||||
self.termsNode.highlightAttributeAction = { attributes in
|
||||
if let _ = attributes[NSAttributedStringKey(rawValue: TelegramTextAttributes.URL)] {
|
||||
return NSAttributedStringKey(rawValue: TelegramTextAttributes.URL)
|
||||
@ -186,8 +170,8 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
|
||||
|
||||
func updateData(firstName: String, lastName: String, hasTermsOfService: Bool) {
|
||||
self.termsNode.isHidden = !hasTermsOfService
|
||||
self.firstNameField.textField.attributedPlaceholder = NSAttributedString(string: firstName, font: Font.regular(20.0), textColor: self.theme.textPlaceholderColor)
|
||||
self.lastNameField.textField.attributedPlaceholder = NSAttributedString(string: lastName, font: Font.regular(20.0), textColor: self.theme.textPlaceholderColor)
|
||||
self.firstNameField.textField.attributedPlaceholder = NSAttributedString(string: firstName, font: Font.regular(20.0), textColor: self.theme.list.itemPlaceholderTextColor)
|
||||
self.lastNameField.textField.attributedPlaceholder = NSAttributedString(string: lastName, font: Font.regular(20.0), textColor: self.theme.list.itemPlaceholderTextColor)
|
||||
|
||||
if let (layout, navigationHeight) = self.layoutArguments {
|
||||
self.containerLayoutUpdated(layout, navigationBarHeight: navigationHeight, transition: .immediate)
|
||||
@ -209,9 +193,9 @@ final class AuthorizationSequenceSignUpControllerNode: ASDisplayNode, UITextFiel
|
||||
let availableHeight = max(1.0, layout.size.height - insets.top - insets.bottom)
|
||||
|
||||
if max(layout.size.width, layout.size.height) > 1023.0 {
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_InfoTitle, font: Font.light(40.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_InfoTitle, font: Font.light(40.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
} else {
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_InfoTitle, font: Font.light(30.0), textColor: self.theme.primaryColor)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_InfoTitle, font: Font.light(30.0), textColor: self.theme.list.itemPrimaryTextColor)
|
||||
}
|
||||
|
||||
let titleSize = self.titleNode.measure(CGSize(width: layout.size.width, height: CGFloat.greatestFiniteMagnitude))
|
||||
|
||||
@ -16,7 +16,7 @@ final class AuthorizationSequenceSplashController: ViewController {
|
||||
private let accountManager: AccountManager
|
||||
private let postbox: Postbox
|
||||
private let network: Network
|
||||
private let theme: AuthorizationTheme
|
||||
private let theme: PresentationTheme
|
||||
|
||||
private let controller: RMIntroViewController
|
||||
|
||||
@ -25,7 +25,7 @@ final class AuthorizationSequenceSplashController: ViewController {
|
||||
private let suggestedLocalization = Promise<SuggestedLocalizationInfo?>()
|
||||
private let activateLocalizationDisposable = MetaDisposable()
|
||||
|
||||
init(accountManager: AccountManager, postbox: Postbox, network: Network, theme: AuthorizationTheme) {
|
||||
init(accountManager: AccountManager, postbox: Postbox, network: Network, theme: PresentationTheme) {
|
||||
self.accountManager = accountManager
|
||||
self.postbox = postbox
|
||||
self.network = network
|
||||
@ -66,13 +66,13 @@ final class AuthorizationSequenceSplashController: ViewController {
|
||||
})
|
||||
})
|
||||
|
||||
self.controller = RMIntroViewController(backroundColor: theme.backgroundColor, primaryColor: theme.primaryColor, buttonColor: theme.startButtonColor, accentColor: theme.accentColor, regularDotColor: theme.dotColor, highlightedDotColor: theme.primaryColor, suggestedLocalizationSignal: localizationSignal)
|
||||
self.controller = RMIntroViewController(backroundColor: theme.list.plainBackgroundColor, primaryColor: theme.list.itemPrimaryTextColor, buttonColor: theme.auth.introStartButton, accentColor: theme.list.itemAccentColor, regularDotColor: theme.auth.introDotColor, highlightedDotColor: theme.list.itemPrimaryTextColor, suggestedLocalizationSignal: localizationSignal)
|
||||
|
||||
super.init(navigationBarPresentationData: nil)
|
||||
|
||||
self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait)
|
||||
|
||||
self.statusBar.statusBarStyle = theme.statusBarStyle
|
||||
self.statusBar.statusBarStyle = theme.rootController.statusBar.style.style
|
||||
|
||||
self.controller.startMessaging = { [weak self] in
|
||||
self?.activateLocalization("en")
|
||||
|
||||
@ -3,14 +3,14 @@ import AsyncDisplayKit
|
||||
import Display
|
||||
|
||||
final class AuthorizationSequenceSplashControllerNode: ASDisplayNode {
|
||||
init(theme: AuthorizationTheme) {
|
||||
init(theme: PresentationTheme) {
|
||||
super.init()
|
||||
|
||||
self.setViewBlock({
|
||||
return UITracingLayerView()
|
||||
})
|
||||
|
||||
self.backgroundColor = theme.backgroundColor
|
||||
self.backgroundColor = theme.list.plainBackgroundColor
|
||||
self.view.disablesInteractiveTransitionGestureRecognizer = true
|
||||
}
|
||||
|
||||
|
||||
@ -1,100 +0,0 @@
|
||||
import Foundation
|
||||
import UIKit
|
||||
import Display
|
||||
|
||||
public final class AuthorizationTheme {
|
||||
let statusBarStyle: StatusBarStyle
|
||||
let navigationBarBackgroundColor: UIColor
|
||||
let navigationBarTextColor: UIColor
|
||||
let navigationBarSeparatorColor: UIColor
|
||||
let searchBarBackgroundColor: UIColor
|
||||
let searchBarFillColor: UIColor
|
||||
let searchBarPlaceholderColor: UIColor
|
||||
let searchBarTextColor: UIColor
|
||||
let keyboard: PresentationThemeKeyboardColor
|
||||
let backgroundColor: UIColor
|
||||
let primaryColor: UIColor
|
||||
let separatorColor: UIColor
|
||||
let itemHighlightedBackgroundColor: UIColor
|
||||
let dotColor: UIColor
|
||||
let startButtonColor: UIColor
|
||||
let accentColor: UIColor
|
||||
let destructiveColor: UIColor
|
||||
let disclosureControlColor: UIColor
|
||||
let textPlaceholderColor: UIColor
|
||||
let alertBackgroundColor: UIColor
|
||||
let listBackgroundColor: UIColor
|
||||
|
||||
init(statusBarStyle: StatusBarStyle, navigationBarBackgroundColor: UIColor, navigationBarTextColor: UIColor, navigationBarSeparatorColor: UIColor, searchBarBackgroundColor: UIColor, searchBarFillColor: UIColor, searchBarPlaceholderColor: UIColor, searchBarTextColor: UIColor, keyboard: PresentationThemeKeyboardColor, backgroundColor: UIColor, primaryColor: UIColor, separatorColor: UIColor, itemHighlightedBackgroundColor: UIColor, dotColor: UIColor, startButtonColor: UIColor, accentColor: UIColor, destructiveColor: UIColor, disclosureControlColor: UIColor, textPlaceholderColor: UIColor, alertBackgroundColor: UIColor, listBackgroundColor: UIColor) {
|
||||
self.statusBarStyle = statusBarStyle
|
||||
self.navigationBarBackgroundColor = navigationBarBackgroundColor
|
||||
self.navigationBarTextColor = navigationBarTextColor
|
||||
self.navigationBarSeparatorColor = navigationBarSeparatorColor
|
||||
self.searchBarBackgroundColor = searchBarBackgroundColor
|
||||
self.searchBarFillColor = searchBarFillColor
|
||||
self.searchBarPlaceholderColor = searchBarPlaceholderColor
|
||||
self.searchBarTextColor = searchBarTextColor
|
||||
self.keyboard = keyboard
|
||||
self.backgroundColor = backgroundColor
|
||||
self.primaryColor = primaryColor
|
||||
self.separatorColor = separatorColor
|
||||
self.itemHighlightedBackgroundColor = itemHighlightedBackgroundColor
|
||||
self.dotColor = dotColor
|
||||
self.startButtonColor = startButtonColor
|
||||
self.accentColor = accentColor
|
||||
self.destructiveColor = destructiveColor
|
||||
self.disclosureControlColor = disclosureControlColor
|
||||
self.textPlaceholderColor = textPlaceholderColor
|
||||
self.alertBackgroundColor = alertBackgroundColor
|
||||
self.listBackgroundColor = listBackgroundColor
|
||||
}
|
||||
}
|
||||
|
||||
let defaultLightAuthorizationTheme = AuthorizationTheme(
|
||||
statusBarStyle: .Black,
|
||||
navigationBarBackgroundColor: UIColor(red: 0.968626451, green: 0.968626451, blue: 0.968626451, alpha: 1.0),
|
||||
navigationBarTextColor: .black,
|
||||
navigationBarSeparatorColor: UIColor(red: 0.6953125, green: 0.6953125, blue: 0.6953125, alpha: 1.0),
|
||||
searchBarBackgroundColor: .white,
|
||||
searchBarFillColor: UIColor(rgb: 0xe9e9e9),
|
||||
searchBarPlaceholderColor: UIColor(rgb: 0x8e8e93),
|
||||
searchBarTextColor: .black,
|
||||
keyboard: .light,
|
||||
backgroundColor: .white,
|
||||
primaryColor: .black,
|
||||
separatorColor: UIColor(red: 0.6953125, green: 0.6953125, blue: 0.6953125, alpha: 1.0),
|
||||
itemHighlightedBackgroundColor: UIColor(rgb: 0xd9d9d9),
|
||||
dotColor: UIColor(rgb: 0xd9d9d9),
|
||||
startButtonColor: UIColor(rgb: 0x2ca5e0),
|
||||
accentColor: UIColor(rgb: 0x007ee5),
|
||||
destructiveColor: UIColor(rgb: 0xff3b30),
|
||||
disclosureControlColor: UIColor(rgb: 0xbab9be),
|
||||
textPlaceholderColor: UIColor(rgb: 0x8e8e93),
|
||||
alertBackgroundColor: .white,
|
||||
listBackgroundColor: UIColor(rgb: 0xefeff4)
|
||||
)
|
||||
|
||||
let defaultAuthorizationTheme = AuthorizationTheme(
|
||||
statusBarStyle: .White,
|
||||
navigationBarBackgroundColor: .black,
|
||||
navigationBarTextColor: .white,
|
||||
navigationBarSeparatorColor: UIColor(rgb: 0x252525),
|
||||
searchBarBackgroundColor: .black,
|
||||
searchBarFillColor: UIColor(rgb: 0x272728),
|
||||
searchBarPlaceholderColor: UIColor(rgb: 0x5e5e5e),
|
||||
searchBarTextColor: .white,
|
||||
keyboard: .dark,
|
||||
backgroundColor: .black,
|
||||
primaryColor: .white,
|
||||
separatorColor: UIColor(rgb: 0x252525),
|
||||
itemHighlightedBackgroundColor: UIColor(rgb: 0x1b1b1b),
|
||||
dotColor: UIColor(rgb: 0x717171),
|
||||
startButtonColor: .white,
|
||||
accentColor: .white,
|
||||
destructiveColor: UIColor(rgb: 0xFF736B),
|
||||
disclosureControlColor: UIColor(rgb: 0x717171),
|
||||
textPlaceholderColor: UIColor(rgb: 0x4d4d4d),
|
||||
alertBackgroundColor: UIColor(rgb: 0x1c1c1c),
|
||||
listBackgroundColor: UIColor(rgb: 0xefeff4)
|
||||
)
|
||||
|
||||
@ -872,7 +872,7 @@ final class BotCheckoutControllerNode: ItemListControllerNode<BotCheckoutEntry>,
|
||||
}
|
||||
return nil
|
||||
}
|
||||
let _ = (combineLatest(ApplicationSpecificNotice.getBotPaymentLiability(postbox: self.context.account.postbox, peerId: self.messageId.peerId), botPeer, self.context.account.postbox.loadedPeerWithId(paymentForm.providerId))
|
||||
let _ = (combineLatest(ApplicationSpecificNotice.getBotPaymentLiability(accountManager: self.context.sharedContext.accountManager, peerId: self.messageId.peerId), botPeer, self.context.account.postbox.loadedPeerWithId(paymentForm.providerId))
|
||||
|> deliverOnMainQueue).start(next: { [weak self] value, botPeer, providerPeer in
|
||||
if let strongSelf = self, let botPeer = botPeer {
|
||||
if value {
|
||||
@ -880,7 +880,7 @@ final class BotCheckoutControllerNode: ItemListControllerNode<BotCheckoutEntry>,
|
||||
} else {
|
||||
strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: strongSelf.presentationData.strings.Checkout_LiabilityAlertTitle, text: strongSelf.presentationData.strings.Checkout_LiabilityAlert(botPeer.displayTitle, providerPeer.displayTitle).0, actions: [TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_Cancel, action: { }), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {
|
||||
if let strongSelf = self {
|
||||
let _ = ApplicationSpecificNotice.setBotPaymentLiability(postbox: strongSelf.context.account.postbox, peerId: strongSelf.messageId.peerId).start()
|
||||
let _ = ApplicationSpecificNotice.setBotPaymentLiability(accountManager: strongSelf.context.sharedContext.accountManager, peerId: strongSelf.messageId.peerId).start()
|
||||
strongSelf.pay(savedCredentialsToken: savedCredentialsToken, liabilityNoticeAccepted: true)
|
||||
}
|
||||
})]), nil)
|
||||
|
||||
@ -73,7 +73,7 @@ final class BotCheckoutInfoController: ViewController {
|
||||
self?.presentingViewController?.dismiss(animated: false, completion: nil)
|
||||
}, openCountrySelection: { [weak self] in
|
||||
if let strongSelf = self {
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.presentationData.strings, theme: AuthorizationSequenceCountrySelectionTheme(presentationTheme: strongSelf.presentationData.theme), displayCodes: false)
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.presentationData.strings, theme: strongSelf.presentationData.theme, displayCodes: false)
|
||||
controller.completeWithCountryCode = { _, id in
|
||||
if let strongSelf = self {
|
||||
strongSelf.controllerNode.updateCountry(id)
|
||||
|
||||
@ -70,7 +70,7 @@ final class BotCheckoutNativeCardEntryController: ViewController {
|
||||
self?.presentingViewController?.dismiss(animated: false, completion: nil)
|
||||
}, openCountrySelection: { [weak self] in
|
||||
if let strongSelf = self {
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.presentationData.strings, theme: AuthorizationSequenceCountrySelectionTheme(presentationTheme: strongSelf.presentationData.theme), displayCodes: false)
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.presentationData.strings, theme: strongSelf.presentationData.theme, displayCodes: false)
|
||||
controller.completeWithCountryCode = { _, id in
|
||||
if let strongSelf = self {
|
||||
strongSelf.controllerNode.updateCountry(id)
|
||||
|
||||
@ -126,7 +126,7 @@ private struct ChangePhoneNumberCodeControllerState: Equatable {
|
||||
}
|
||||
}
|
||||
|
||||
private func changePhoneNumberCodeControllerEntries(presentationData: PresentationData, state: ChangePhoneNumberCodeControllerState, codeData: ChangeAccountPhoneNumberData, timeout: Int32?, strings: PresentationStrings, theme: AuthorizationTheme) -> [ChangePhoneNumberCodeEntry] {
|
||||
private func changePhoneNumberCodeControllerEntries(presentationData: PresentationData, state: ChangePhoneNumberCodeControllerState, codeData: ChangeAccountPhoneNumberData, timeout: Int32?, strings: PresentationStrings) -> [ChangePhoneNumberCodeEntry] {
|
||||
var entries: [ChangePhoneNumberCodeEntry] = []
|
||||
|
||||
entries.append(.codeEntry(presentationData.theme, presentationData.strings.ChangePhoneNumberCode_CodePlaceholder, state.codeText))
|
||||
@ -302,7 +302,7 @@ func changePhoneNumberCodeController(context: AccountContext, phoneNumber: Strin
|
||||
}
|
||||
|
||||
let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(formatPhoneNumber(phoneNumber)), leftNavigationButton: nil, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false)
|
||||
let listState = ItemListNodeState(entries: changePhoneNumberCodeControllerEntries(presentationData: presentationData, state: state, codeData: data, timeout: timeout, strings: presentationData.strings, theme: defaultLightAuthorizationTheme), style: .blocks, focusItemTag: ChangePhoneNumberCodeTag.input, emptyStateItem: nil, animateChanges: false)
|
||||
let listState = ItemListNodeState(entries: changePhoneNumberCodeControllerEntries(presentationData: presentationData, state: state, codeData: data, timeout: timeout, strings: presentationData.strings), style: .blocks, focusItemTag: ChangePhoneNumberCodeTag.input, emptyStateItem: nil, animateChanges: false)
|
||||
|
||||
return (controllerState, (listState, arguments))
|
||||
} |> afterDisposed {
|
||||
|
||||
@ -66,7 +66,7 @@ final class ChangePhoneNumberController: ViewController {
|
||||
self.displayNodeDidLoad()
|
||||
self.controllerNode.selectCountryCode = { [weak self] in
|
||||
if let strongSelf = self {
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.presentationData.strings, theme: AuthorizationSequenceCountrySelectionTheme(presentationTheme: strongSelf.presentationData.theme))
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.presentationData.strings, theme: strongSelf.presentationData.theme)
|
||||
controller.completeWithCountryCode = { code, name in
|
||||
if let strongSelf = self {
|
||||
strongSelf.updateData(countryCode: Int32(code), countryName: name, number: strongSelf.controllerNode.codeAndNumber.2)
|
||||
|
||||
@ -969,7 +969,7 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId,
|
||||
updateState { state in
|
||||
return state.withUpdatedUpdatingAddressName(true)
|
||||
}
|
||||
_ = ApplicationSpecificNotice.markAsSeenSetPublicChannelLink(postbox: context.account.postbox).start()
|
||||
_ = ApplicationSpecificNotice.markAsSeenSetPublicChannelLink(accountManager: context.sharedContext.accountManager).start()
|
||||
|
||||
updateAddressNameDisposable.set((updateAddressName(account: context.account, domain: .peer(peerId), name: updatedAddressNameValue.isEmpty ? nil : updatedAddressNameValue) |> timeout(10, queue: Queue.mainQueue(), alternate: .fail(.generic))
|
||||
|> deliverOnMainQueue).start(error: { _ in
|
||||
@ -993,7 +993,7 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId,
|
||||
|
||||
}
|
||||
|
||||
_ = (ApplicationSpecificNotice.getSetPublicChannelLink(postbox: context.account.postbox) |> deliverOnMainQueue).start(next: { showAlert in
|
||||
_ = (ApplicationSpecificNotice.getSetPublicChannelLink(accountManager: context.sharedContext.accountManager) |> deliverOnMainQueue).start(next: { showAlert in
|
||||
if showAlert {
|
||||
let confirm = standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: nil, text: presentationData.strings.Channel_Edit_PrivatePublicLinkAlert, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: invokeAction)])
|
||||
|
||||
@ -1043,7 +1043,7 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId,
|
||||
updateState { state in
|
||||
return state.withUpdatedUpdatingAddressName(true)
|
||||
}
|
||||
_ = ApplicationSpecificNotice.markAsSeenSetPublicChannelLink(postbox: context.account.postbox).start()
|
||||
_ = ApplicationSpecificNotice.markAsSeenSetPublicChannelLink(accountManager: context.sharedContext.accountManager).start()
|
||||
|
||||
let signal = convertGroupToSupergroup(account: context.account, peerId: peerId)
|
||||
|> map(Optional.init)
|
||||
@ -1083,7 +1083,7 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId,
|
||||
}))
|
||||
}
|
||||
|
||||
_ = (ApplicationSpecificNotice.getSetPublicChannelLink(postbox: context.account.postbox) |> deliverOnMainQueue).start(next: { showAlert in
|
||||
_ = (ApplicationSpecificNotice.getSetPublicChannelLink(accountManager: context.sharedContext.accountManager) |> deliverOnMainQueue).start(next: { showAlert in
|
||||
if showAlert {
|
||||
let confirm = standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: nil, text: presentationData.strings.Channel_Edit_PrivatePublicLinkAlert, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: invokeAction)])
|
||||
|
||||
|
||||
@ -2672,7 +2672,7 @@ public final class ChatController: TelegramController, KeyShortcutResponder, Gal
|
||||
})
|
||||
|
||||
if let updatedMode = updatedMode, updatedMode == .video {
|
||||
let _ = ApplicationSpecificNotice.incrementChatMediaMediaRecordingTips(postbox: strongSelf.context.account.postbox, count: 3).start()
|
||||
let _ = ApplicationSpecificNotice.incrementChatMediaMediaRecordingTips(accountManager: strongSelf.context.sharedContext.accountManager, count: 3).start()
|
||||
}
|
||||
|
||||
strongSelf.displayMediaRecordingTip()
|
||||
@ -3292,7 +3292,7 @@ public final class ChatController: TelegramController, KeyShortcutResponder, Gal
|
||||
canSendMedia = true
|
||||
}
|
||||
if canSendMedia {
|
||||
let _ = (ApplicationSpecificNotice.getChatMediaMediaRecordingTips(postbox: self.context.account.postbox)
|
||||
let _ = (ApplicationSpecificNotice.getChatMediaMediaRecordingTips(accountManager: self.context.sharedContext.accountManager)
|
||||
|> deliverOnMainQueue).start(next: { [weak self] counter in
|
||||
guard let strongSelf = self else {
|
||||
return
|
||||
@ -3304,7 +3304,7 @@ public final class ChatController: TelegramController, KeyShortcutResponder, Gal
|
||||
displayTip = true
|
||||
}
|
||||
if displayTip {
|
||||
let _ = ApplicationSpecificNotice.incrementChatMediaMediaRecordingTips(postbox: strongSelf.context.account.postbox).start()
|
||||
let _ = ApplicationSpecificNotice.incrementChatMediaMediaRecordingTips(accountManager: strongSelf.context.sharedContext.accountManager).start()
|
||||
strongSelf.displayMediaRecordingTip()
|
||||
}
|
||||
})
|
||||
@ -3458,10 +3458,10 @@ public final class ChatController: TelegramController, KeyShortcutResponder, Gal
|
||||
|
||||
if case let .peer(peerId) = self.chatLocation, peerId.namespace == Namespaces.Peer.SecretChat {
|
||||
if case .contextRequest = query {
|
||||
let _ = (ApplicationSpecificNotice.getSecretChatInlineBotUsage(postbox: self.context.account.postbox)
|
||||
let _ = (ApplicationSpecificNotice.getSecretChatInlineBotUsage(accountManager: self.context.sharedContext.accountManager)
|
||||
|> deliverOnMainQueue).start(next: { [weak self] value in
|
||||
if let strongSelf = self, !value {
|
||||
let _ = ApplicationSpecificNotice.setSecretChatInlineBotUsage(postbox: strongSelf.context.account.postbox).start()
|
||||
let _ = ApplicationSpecificNotice.setSecretChatInlineBotUsage(accountManager: strongSelf.context.sharedContext.accountManager).start()
|
||||
strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.Conversation_SecretChatContextBotAlert, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
}
|
||||
})
|
||||
@ -3502,7 +3502,7 @@ public final class ChatController: TelegramController, KeyShortcutResponder, Gal
|
||||
var inScopeResult: ((TelegramMediaWebpage?) -> TelegramMediaWebpage?)?
|
||||
let linkPreviews: Signal<Bool, NoError>
|
||||
if case let .peer(peerId) = self.chatLocation, peerId.namespace == Namespaces.Peer.SecretChat {
|
||||
linkPreviews = interactiveChatLinkPreviewsEnabled(postbox: self.context.account.postbox, displayAlert: { [weak self] f in
|
||||
linkPreviews = interactiveChatLinkPreviewsEnabled(accountManager: self.context.sharedContext.accountManager, displayAlert: { [weak self] f in
|
||||
if let strongSelf = self {
|
||||
strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.Conversation_SecretLinkPreviewAlert, actions: [
|
||||
TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_Yes, action: {
|
||||
|
||||
@ -10,8 +10,8 @@ final class InteractiveChatLinkPreviewsResult {
|
||||
}
|
||||
}
|
||||
|
||||
func interactiveChatLinkPreviewsEnabled(postbox: Postbox, displayAlert: @escaping (InteractiveChatLinkPreviewsResult) -> Void) -> Signal<Bool, NoError> {
|
||||
return ApplicationSpecificNotice.getSecretChatLinkPreviews(postbox: postbox)
|
||||
func interactiveChatLinkPreviewsEnabled(accountManager: AccountManager, displayAlert: @escaping (InteractiveChatLinkPreviewsResult) -> Void) -> Signal<Bool, NoError> {
|
||||
return ApplicationSpecificNotice.getSecretChatLinkPreviews(accountManager: accountManager)
|
||||
|> mapToSignal { value -> Signal<Bool, NoError> in
|
||||
if let value = value {
|
||||
return .single(value)
|
||||
@ -19,7 +19,7 @@ func interactiveChatLinkPreviewsEnabled(postbox: Postbox, displayAlert: @escapin
|
||||
return Signal { subscriber in
|
||||
Queue.mainQueue().async {
|
||||
displayAlert(InteractiveChatLinkPreviewsResult({ result in
|
||||
let _ = ApplicationSpecificNotice.setSecretChatLinkPreviews(postbox: postbox, value: result).start()
|
||||
let _ = ApplicationSpecificNotice.setSecretChatLinkPreviews(accountManager: accountManager, value: result).start()
|
||||
subscriber.putNext(result)
|
||||
subscriber.putCompletion()
|
||||
}))
|
||||
|
||||
@ -468,7 +468,7 @@ public class ChatListController: TelegramController, KeyShortcutResponder, UIVie
|
||||
if let strongSelf = self {
|
||||
if let navigationController = strongSelf.navigationController as? NavigationController {
|
||||
if isAd {
|
||||
let _ = (ApplicationSpecificNotice.getProxyAdsAcknowledgment(postbox: strongSelf.context.account.postbox)
|
||||
let _ = (ApplicationSpecificNotice.getProxyAdsAcknowledgment(accountManager: strongSelf.context.sharedContext.accountManager)
|
||||
|> deliverOnMainQueue).start(next: { value in
|
||||
guard let strongSelf = self else {
|
||||
return
|
||||
@ -476,7 +476,7 @@ public class ChatListController: TelegramController, KeyShortcutResponder, UIVie
|
||||
if !value {
|
||||
strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: nil, text: strongSelf.presentationData.strings.DialogList_AdNoticeAlert, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {
|
||||
if let strongSelf = self {
|
||||
let _ = ApplicationSpecificNotice.setProxyAdsAcknowledgment(postbox: strongSelf.context.account.postbox).start()
|
||||
let _ = ApplicationSpecificNotice.setProxyAdsAcknowledgment(accountManager: strongSelf.context.sharedContext.accountManager).start()
|
||||
}
|
||||
})]), in: .window(.root))
|
||||
}
|
||||
@ -685,12 +685,12 @@ public class ChatListController: TelegramController, KeyShortcutResponder, UIVie
|
||||
}
|
||||
|
||||
if let lockViewFrame = self.titleView.lockViewFrame, !self.didShowPasscodeLockTooltipController {
|
||||
self.passcodeLockTooltipDisposable.set(combineLatest(queue: .mainQueue(), ApplicationSpecificNotice.getPasscodeLockTips(postbox: self.context.account.postbox), self.context.sharedContext.accountManager.accessChallengeData() |> take(1)).start(next: { [weak self] tooltipValue, passcodeView in
|
||||
self.passcodeLockTooltipDisposable.set(combineLatest(queue: .mainQueue(), ApplicationSpecificNotice.getPasscodeLockTips(accountManager: self.context.sharedContext.accountManager), self.context.sharedContext.accountManager.accessChallengeData() |> take(1)).start(next: { [weak self] tooltipValue, passcodeView in
|
||||
if let strongSelf = self {
|
||||
if !tooltipValue {
|
||||
let hasPasscode = passcodeView.data.isLockable
|
||||
if hasPasscode {
|
||||
let _ = ApplicationSpecificNotice.setPasscodeLockTips(postbox: strongSelf.context.account.postbox).start()
|
||||
let _ = ApplicationSpecificNotice.setPasscodeLockTips(accountManager: strongSelf.context.sharedContext.accountManager).start()
|
||||
|
||||
let tooltipController = TooltipController(text: strongSelf.presentationData.strings.DialogList_PasscodeLockHelp, dismissByTapOutside: true)
|
||||
strongSelf.present(tooltipController, in: .window(.root), with: TooltipControllerPresentationArguments(sourceViewAndRect: { [weak self] in
|
||||
|
||||
@ -45,10 +45,6 @@ public extension AlertControllerTheme {
|
||||
let actionSheet = presentationTheme.actionSheet
|
||||
self.init(backgroundColor: actionSheet.opaqueItemBackgroundColor, separatorColor: actionSheet.opaqueItemSeparatorColor, highlightedItemColor: actionSheet.opaqueItemHighlightedBackgroundColor, primaryColor: actionSheet.primaryTextColor, secondaryColor: actionSheet.secondaryTextColor, accentColor: actionSheet.controlAccentColor, destructiveColor: actionSheet.destructiveActionTextColor)
|
||||
}
|
||||
|
||||
convenience init(authTheme: AuthorizationTheme) {
|
||||
self.init(backgroundColor: authTheme.alertBackgroundColor, separatorColor: authTheme.separatorColor, highlightedItemColor: authTheme.itemHighlightedBackgroundColor, primaryColor: authTheme.primaryColor, secondaryColor: authTheme.textPlaceholderColor, accentColor: authTheme.accentColor, destructiveColor: authTheme.destructiveColor)
|
||||
}
|
||||
}
|
||||
|
||||
extension PeekControllerTheme {
|
||||
|
||||
@ -112,7 +112,7 @@ private struct ConfirmPhoneNumberCodeControllerState: Equatable {
|
||||
}
|
||||
}
|
||||
|
||||
private func confirmPhoneNumberCodeControllerEntries(presentationData: PresentationData, state: ConfirmPhoneNumberCodeControllerState, phoneNumber: String, codeData: CancelAccountResetData, timeout: Int32?, strings: PresentationStrings, theme: AuthorizationTheme) -> [ConfirmPhoneNumberCodeEntry] {
|
||||
private func confirmPhoneNumberCodeControllerEntries(presentationData: PresentationData, state: ConfirmPhoneNumberCodeControllerState, phoneNumber: String, codeData: CancelAccountResetData, timeout: Int32?, strings: PresentationStrings, theme: PresentationTheme) -> [ConfirmPhoneNumberCodeEntry] {
|
||||
var entries: [ConfirmPhoneNumberCodeEntry] = []
|
||||
|
||||
entries.append(.codeEntry(presentationData.theme, presentationData.strings.ChangePhoneNumberCode_CodePlaceholder, state.codeText))
|
||||
@ -301,7 +301,7 @@ func confirmPhoneNumberCodeController(context: AccountContext, phoneNumber: Stri
|
||||
}
|
||||
|
||||
let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.CancelResetAccount_Title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false)
|
||||
let listState = ItemListNodeState(entries: confirmPhoneNumberCodeControllerEntries(presentationData: presentationData, state: state, phoneNumber: phoneNumber, codeData: data, timeout: timeout, strings: presentationData.strings, theme: defaultLightAuthorizationTheme), style: .blocks, focusItemTag: ConfirmPhoneNumberCodeTag.input, emptyStateItem: nil, animateChanges: false)
|
||||
let listState = ItemListNodeState(entries: confirmPhoneNumberCodeControllerEntries(presentationData: presentationData, state: state, phoneNumber: phoneNumber, codeData: data, timeout: timeout, strings: presentationData.strings, theme: presentationData.theme), style: .blocks, focusItemTag: ConfirmPhoneNumberCodeTag.input, emptyStateItem: nil, animateChanges: false)
|
||||
|
||||
return (controllerState, (listState, arguments))
|
||||
}
|
||||
|
||||
@ -816,15 +816,14 @@ final class ContactListNode: ASDisplayNode {
|
||||
contactsAuthorization.set(.single(.allowed)
|
||||
|> then(DeviceAccess.authorizationStatus(context: context, subject: .contacts)))
|
||||
|
||||
let warningKey = PostboxViewKey.noticeEntry(ApplicationSpecificNotice.contactsPermissionWarningKey())
|
||||
let contactsWarningSuppressed = Promise<(Bool, Bool)>()
|
||||
contactsWarningSuppressed.set(.single((false, false))
|
||||
|> then(
|
||||
combineLatest(context.account.postbox.combinedView(keys: [warningKey]), context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.contactSynchronizationSettings]))
|
||||
|> map { combined, sharedData -> (Bool, Bool) in
|
||||
combineLatest(context.sharedContext.accountManager.noticeEntry(key: ApplicationSpecificNotice.contactsPermissionWarningKey()), context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.contactSynchronizationSettings]))
|
||||
|> map { noticeView, sharedData -> (Bool, Bool) in
|
||||
let synchronizeDeviceContacts: Bool = (sharedData.entries[ApplicationSpecificSharedDataKeys.contactSynchronizationSettings] as? ContactSynchronizationSettings)?.synchronizeDeviceContacts ?? true
|
||||
let suppressed: Bool
|
||||
let timestamp = (combined.views[warningKey] as? NoticeEntryView)?.value.flatMap({ ApplicationSpecificNotice.getTimestampValue($0) })
|
||||
let timestamp = noticeView.value.flatMap({ ApplicationSpecificNotice.getTimestampValue($0) })
|
||||
if let timestamp = timestamp, timestamp > 0 {
|
||||
suppressed = true
|
||||
} else {
|
||||
|
||||
@ -119,16 +119,15 @@ public class ContactsController: ViewController {
|
||||
})
|
||||
|
||||
if #available(iOSApplicationExtension 10.0, *) {
|
||||
let warningKey = PostboxViewKey.noticeEntry(ApplicationSpecificNotice.contactsPermissionWarningKey())
|
||||
self.authorizationDisposable = (combineLatest(DeviceAccess.authorizationStatus(context: context, subject: .contacts), combineLatest(context.account.postbox.combinedView(keys: [warningKey]), context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.contactSynchronizationSettings]))
|
||||
|> map { combined, sharedData -> (Bool, ContactsSortOrder) in
|
||||
self.authorizationDisposable = (combineLatest(DeviceAccess.authorizationStatus(context: context, subject: .contacts), combineLatest(context.sharedContext.accountManager.noticeEntry(key: ApplicationSpecificNotice.contactsPermissionWarningKey()), context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.contactSynchronizationSettings]))
|
||||
|> map { noticeView, sharedData -> (Bool, ContactsSortOrder) in
|
||||
let settings = sharedData.entries[ApplicationSpecificSharedDataKeys.contactSynchronizationSettings] as? ContactSynchronizationSettings
|
||||
let synchronizeDeviceContacts: Bool = settings?.synchronizeDeviceContacts ?? true
|
||||
let sortOrder: ContactsSortOrder = settings?.sortOrder ?? .presence
|
||||
if !synchronizeDeviceContacts {
|
||||
return (true, sortOrder)
|
||||
}
|
||||
let timestamp = (combined.views[warningKey] as? NoticeEntryView)?.value.flatMap({ ApplicationSpecificNotice.getTimestampValue($0) })
|
||||
let timestamp = noticeView.value.flatMap({ ApplicationSpecificNotice.getTimestampValue($0) })
|
||||
if let timestamp = timestamp, timestamp > 0 {
|
||||
return (true, sortOrder)
|
||||
} else {
|
||||
|
||||
@ -368,7 +368,7 @@ public func dataPrivacyController(context: AccountContext) -> ViewController {
|
||||
])
|
||||
presentControllerImpl?(controller)
|
||||
}, updateSecretChatLinkPreviews: { value in
|
||||
let _ = ApplicationSpecificNotice.setSecretChatLinkPreviews(postbox: context.account.postbox, value: value).start()
|
||||
let _ = ApplicationSpecificNotice.setSecretChatLinkPreviews(accountManager: context.sharedContext.accountManager, value: value).start()
|
||||
}, deleteContacts: {
|
||||
var canBegin = false
|
||||
updateState { state in
|
||||
@ -477,9 +477,9 @@ public func dataPrivacyController(context: AccountContext) -> ViewController {
|
||||
|
||||
actionsDisposable.add(managedUpdatedRecentPeers(accountPeerId: context.account.peerId, postbox: context.account.postbox, network: context.account.network).start())
|
||||
|
||||
let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get(), context.account.postbox.combinedView(keys: [.noticeEntry(ApplicationSpecificNotice.secretChatLinkPreviewsKey())]), context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.contactSynchronizationSettings]), recentPeers(account: context.account))
|
||||
|> map { presentationData, state, combined, sharedData, recentPeers -> (ItemListControllerState, (ItemListNodeState<PrivacyAndSecurityEntry>, PrivacyAndSecurityEntry.ItemGenerationArguments)) in
|
||||
let secretChatLinkPreviews = (combined.views[.noticeEntry(ApplicationSpecificNotice.secretChatLinkPreviewsKey())] as? NoticeEntryView)?.value.flatMap({ ApplicationSpecificNotice.getSecretChatLinkPreviews($0) })
|
||||
let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get(), context.sharedContext.accountManager.noticeEntry(key: ApplicationSpecificNotice.secretChatLinkPreviewsKey()), context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.contactSynchronizationSettings]), recentPeers(account: context.account))
|
||||
|> map { presentationData, state, noticeView, sharedData, recentPeers -> (ItemListControllerState, (ItemListNodeState<PrivacyAndSecurityEntry>, PrivacyAndSecurityEntry.ItemGenerationArguments)) in
|
||||
let secretChatLinkPreviews = noticeView.value.flatMap({ ApplicationSpecificNotice.getSecretChatLinkPreviews($0) })
|
||||
|
||||
let synchronizeDeviceContacts: Bool = (sharedData.entries[ApplicationSpecificSharedDataKeys.contactSynchronizationSettings] as? ContactSynchronizationSettings)?.synchronizeDeviceContacts ?? true
|
||||
|
||||
|
||||
@ -47,6 +47,11 @@ private let activeNavigationSearchBar = PresentationThemeActiveNavigationSearchB
|
||||
separatorColor: UIColor(rgb: 0x18222C)
|
||||
)
|
||||
|
||||
private let auth = PresentationThemeAuth(
|
||||
introStartButton: accentColor,
|
||||
introDotColor: UIColor(rgb: 0x8B9197)
|
||||
)
|
||||
|
||||
private let rootController = PresentationThemeRootController(
|
||||
statusBar: rootStatusBar,
|
||||
tabBar: rootTabBar,
|
||||
@ -314,6 +319,7 @@ let defaultDarkAccentPresentationTheme = PresentationTheme(
|
||||
name: .builtin(.nightAccent),
|
||||
overallDarkAppearance: true,
|
||||
allowsCustomWallpapers: false,
|
||||
auth: auth,
|
||||
rootController: rootController,
|
||||
list: list,
|
||||
chatList: chatList,
|
||||
|
||||
@ -47,6 +47,11 @@ private let activeNavigationSearchBar = PresentationThemeActiveNavigationSearchB
|
||||
separatorColor: UIColor(rgb: 0x000000)
|
||||
)
|
||||
|
||||
private let auth = PresentationThemeAuth(
|
||||
introStartButton: accentColor,
|
||||
introDotColor: UIColor(rgb: 0x5e5e5e)
|
||||
)
|
||||
|
||||
private let rootController = PresentationThemeRootController(
|
||||
statusBar: rootStatusBar,
|
||||
tabBar: rootTabBar,
|
||||
@ -314,6 +319,7 @@ let defaultDarkPresentationTheme = PresentationTheme(
|
||||
name: .builtin(.nightGrayscale),
|
||||
overallDarkAppearance: true,
|
||||
allowsCustomWallpapers: false,
|
||||
auth: auth,
|
||||
rootController: rootController,
|
||||
list: list,
|
||||
chatList: chatList,
|
||||
|
||||
@ -47,6 +47,11 @@ private func makeDefaultPresentationTheme(accentColor: UIColor, serviceBackgroun
|
||||
separatorColor: UIColor(red: 0.6953125, green: 0.6953125, blue: 0.6953125, alpha: 1.0)
|
||||
)
|
||||
|
||||
let auth = PresentationThemeAuth(
|
||||
introStartButton: UIColor(rgb: 0x2ca5e0),
|
||||
introDotColor: UIColor(rgb: 0xd9d9d9)
|
||||
)
|
||||
|
||||
let rootController = PresentationThemeRootController(
|
||||
statusBar: rootStatusBar,
|
||||
tabBar: rootTabBar,
|
||||
@ -418,6 +423,7 @@ private func makeDefaultPresentationTheme(accentColor: UIColor, serviceBackgroun
|
||||
name: .builtin(day ? .day : .dayClassic),
|
||||
overallDarkAppearance: false,
|
||||
allowsCustomWallpapers: true,
|
||||
auth: auth,
|
||||
rootController: rootController,
|
||||
list: list,
|
||||
chatList: day ? chatListDay : chatList,
|
||||
|
||||
@ -291,6 +291,7 @@ class GalleryController: ViewController {
|
||||
|
||||
var temporaryDoNotWaitForReady = false
|
||||
|
||||
private let accountInUseDisposable = MetaDisposable()
|
||||
private let disposable = MetaDisposable()
|
||||
|
||||
private var entries: [MessageHistoryEntry] = []
|
||||
@ -692,6 +693,7 @@ class GalleryController: ViewController {
|
||||
}
|
||||
|
||||
deinit {
|
||||
self.accountInUseDisposable.dispose()
|
||||
self.disposable.dispose()
|
||||
self.centralItemAttributesDisposable.dispose()
|
||||
if let hiddenMediaManagerIndex = self.hiddenMediaManagerIndex {
|
||||
@ -887,6 +889,14 @@ class GalleryController: ViewController {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.accountInUseDisposable.set(self.context.sharedContext.setAccountUserInterfaceInUse(self.context.account.id))
|
||||
}
|
||||
|
||||
override func viewDidDisappear(_ animated: Bool) {
|
||||
super.viewDidDisappear(animated)
|
||||
|
||||
self.accountInUseDisposable.set(nil)
|
||||
}
|
||||
|
||||
override func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
|
||||
|
||||
@ -66,7 +66,7 @@ public final class MediaManager: NSObject {
|
||||
private let inForeground: Signal<Bool, NoError>
|
||||
|
||||
public let audioSession: ManagedAudioSession
|
||||
let overlayMediaManager = OverlayMediaManager()
|
||||
public let overlayMediaManager = OverlayMediaManager()
|
||||
let sharedVideoContextManager = SharedVideoContextManager()
|
||||
|
||||
private var nextPlayerIndex: Int32 = 0
|
||||
|
||||
@ -90,7 +90,7 @@ public func isInlineControllerForChatNotificationOverlayPresentation(_ controlle
|
||||
}
|
||||
|
||||
public func isOverlayControllerForChatNotificationOverlayPresentation(_ controller: ContainableController) -> Bool {
|
||||
if controller is GalleryController || controller is AvatarGalleryController || controller is WallpaperGalleryController || controller is InstantPageGalleryController || controller is InstantVideoController {
|
||||
if controller is GalleryController || controller is AvatarGalleryController || controller is WallpaperGalleryController || controller is InstantPageGalleryController || controller is InstantVideoController || controller is NavigationController {
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
@ -179,9 +179,9 @@ private struct ApplicationSpecificNoticeKeys {
|
||||
}
|
||||
|
||||
public struct ApplicationSpecificNotice {
|
||||
static func getBotPaymentLiability(postbox: Postbox, peerId: PeerId) -> Signal<Bool, NoError> {
|
||||
return postbox.transaction { transaction -> Bool in
|
||||
if let _ = transaction.getNoticeEntry(key: ApplicationSpecificNoticeKeys.botPaymentLiabilityNotice(peerId: peerId)) as? ApplicationSpecificBoolNotice {
|
||||
static func getBotPaymentLiability(accountManager: AccountManager, peerId: PeerId) -> Signal<Bool, NoError> {
|
||||
return accountManager.transaction { transaction -> Bool in
|
||||
if let _ = transaction.getNotice(ApplicationSpecificNoticeKeys.botPaymentLiabilityNotice(peerId: peerId)) as? ApplicationSpecificBoolNotice {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
@ -189,15 +189,15 @@ public struct ApplicationSpecificNotice {
|
||||
}
|
||||
}
|
||||
|
||||
static func setBotPaymentLiability(postbox: Postbox, peerId: PeerId) -> Signal<Void, NoError> {
|
||||
return postbox.transaction { transaction -> Void in
|
||||
transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.botPaymentLiabilityNotice(peerId: peerId), value: ApplicationSpecificBoolNotice())
|
||||
static func setBotPaymentLiability(accountManager: AccountManager, peerId: PeerId) -> Signal<Void, NoError> {
|
||||
return accountManager.transaction { transaction -> Void in
|
||||
transaction.setNotice(ApplicationSpecificNoticeKeys.botPaymentLiabilityNotice(peerId: peerId), ApplicationSpecificBoolNotice())
|
||||
}
|
||||
}
|
||||
|
||||
static func getSecretChatInlineBotUsage(postbox: Postbox) -> Signal<Bool, NoError> {
|
||||
return postbox.transaction { transaction -> Bool in
|
||||
if let _ = transaction.getNoticeEntry(key: ApplicationSpecificNoticeKeys.secretChatInlineBotUsage()) as? ApplicationSpecificBoolNotice {
|
||||
static func getSecretChatInlineBotUsage(accountManager: AccountManager) -> Signal<Bool, NoError> {
|
||||
return accountManager.transaction { transaction -> Bool in
|
||||
if let _ = transaction.getNotice(ApplicationSpecificNoticeKeys.secretChatInlineBotUsage()) as? ApplicationSpecificBoolNotice {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
@ -205,19 +205,19 @@ public struct ApplicationSpecificNotice {
|
||||
}
|
||||
}
|
||||
|
||||
static func setSecretChatInlineBotUsage(postbox: Postbox) -> Signal<Void, NoError> {
|
||||
return postbox.transaction { transaction -> Void in
|
||||
transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.secretChatInlineBotUsage(), value: ApplicationSpecificBoolNotice())
|
||||
static func setSecretChatInlineBotUsage(accountManager: AccountManager) -> Signal<Void, NoError> {
|
||||
return accountManager.transaction { transaction -> Void in
|
||||
transaction.setNotice(ApplicationSpecificNoticeKeys.secretChatInlineBotUsage(), ApplicationSpecificBoolNotice())
|
||||
}
|
||||
}
|
||||
|
||||
public static func setSecretChatInlineBotUsage(transaction: Transaction) {
|
||||
transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.secretChatInlineBotUsage(), value: ApplicationSpecificBoolNotice())
|
||||
public static func setSecretChatInlineBotUsage(transaction: AccountManagerModifier) {
|
||||
transaction.setNotice(ApplicationSpecificNoticeKeys.secretChatInlineBotUsage(), ApplicationSpecificBoolNotice())
|
||||
}
|
||||
|
||||
static func getSecretChatLinkPreviews(postbox: Postbox) -> Signal<Bool?, NoError> {
|
||||
return postbox.transaction { transaction -> Bool? in
|
||||
if let value = transaction.getNoticeEntry(key: ApplicationSpecificNoticeKeys.secretChatLinkPreviews()) as? ApplicationSpecificVariantNotice {
|
||||
static func getSecretChatLinkPreviews(accountManager: AccountManager) -> Signal<Bool?, NoError> {
|
||||
return accountManager.transaction { transaction -> Bool? in
|
||||
if let value = transaction.getNotice(ApplicationSpecificNoticeKeys.secretChatLinkPreviews()) as? ApplicationSpecificVariantNotice {
|
||||
return value.value
|
||||
} else {
|
||||
return nil
|
||||
@ -233,23 +233,23 @@ public struct ApplicationSpecificNotice {
|
||||
}
|
||||
}
|
||||
|
||||
static func setSecretChatLinkPreviews(postbox: Postbox, value: Bool) -> Signal<Void, NoError> {
|
||||
return postbox.transaction { transaction -> Void in
|
||||
transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.secretChatLinkPreviews(), value: ApplicationSpecificVariantNotice(value: value))
|
||||
static func setSecretChatLinkPreviews(accountManager: AccountManager, value: Bool) -> Signal<Void, NoError> {
|
||||
return accountManager.transaction { transaction -> Void in
|
||||
transaction.setNotice(ApplicationSpecificNoticeKeys.secretChatLinkPreviews(), ApplicationSpecificVariantNotice(value: value))
|
||||
}
|
||||
}
|
||||
|
||||
public static func setSecretChatLinkPreviews(transaction: Transaction, value: Bool) {
|
||||
transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.secretChatLinkPreviews(), value: ApplicationSpecificVariantNotice(value: value))
|
||||
public static func setSecretChatLinkPreviews(transaction: AccountManagerModifier, value: Bool) {
|
||||
transaction.setNotice(ApplicationSpecificNoticeKeys.secretChatLinkPreviews(), ApplicationSpecificVariantNotice(value: value))
|
||||
}
|
||||
|
||||
static func secretChatLinkPreviewsKey() -> NoticeEntryKey {
|
||||
return ApplicationSpecificNoticeKeys.secretChatLinkPreviews()
|
||||
}
|
||||
|
||||
static func getChatMediaMediaRecordingTips(postbox: Postbox) -> Signal<Int32, NoError> {
|
||||
return postbox.transaction { transaction -> Int32 in
|
||||
if let value = transaction.getNoticeEntry(key: ApplicationSpecificNoticeKeys.chatMediaMediaRecordingTips()) as? ApplicationSpecificCounterNotice {
|
||||
static func getChatMediaMediaRecordingTips(accountManager: AccountManager) -> Signal<Int32, NoError> {
|
||||
return accountManager.transaction { transaction -> Int32 in
|
||||
if let value = transaction.getNotice(ApplicationSpecificNoticeKeys.chatMediaMediaRecordingTips()) as? ApplicationSpecificCounterNotice {
|
||||
return value.value
|
||||
} else {
|
||||
return 0
|
||||
@ -257,21 +257,21 @@ public struct ApplicationSpecificNotice {
|
||||
}
|
||||
}
|
||||
|
||||
static func incrementChatMediaMediaRecordingTips(postbox: Postbox, count: Int32 = 1) -> Signal<Void, NoError> {
|
||||
return postbox.transaction { transaction -> Void in
|
||||
static func incrementChatMediaMediaRecordingTips(accountManager: AccountManager, count: Int32 = 1) -> Signal<Void, NoError> {
|
||||
return accountManager.transaction { transaction -> Void in
|
||||
var currentValue: Int32 = 0
|
||||
if let value = transaction.getNoticeEntry(key: ApplicationSpecificNoticeKeys.chatMediaMediaRecordingTips()) as? ApplicationSpecificCounterNotice {
|
||||
if let value = transaction.getNotice(ApplicationSpecificNoticeKeys.chatMediaMediaRecordingTips()) as? ApplicationSpecificCounterNotice {
|
||||
currentValue = value.value
|
||||
}
|
||||
currentValue += count
|
||||
|
||||
transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.chatMediaMediaRecordingTips(), value: ApplicationSpecificCounterNotice(value: currentValue))
|
||||
transaction.setNotice(ApplicationSpecificNoticeKeys.chatMediaMediaRecordingTips(), ApplicationSpecificCounterNotice(value: currentValue))
|
||||
}
|
||||
}
|
||||
|
||||
static func getProfileCallTips(postbox: Postbox) -> Signal<Int32, NoError> {
|
||||
return postbox.transaction { transaction -> Int32 in
|
||||
if let value = transaction.getNoticeEntry(key: ApplicationSpecificNoticeKeys.profileCallTips()) as? ApplicationSpecificCounterNotice {
|
||||
static func getProfileCallTips(accountManager: AccountManager) -> Signal<Int32, NoError> {
|
||||
return accountManager.transaction { transaction -> Int32 in
|
||||
if let value = transaction.getNotice(ApplicationSpecificNoticeKeys.profileCallTips()) as? ApplicationSpecificCounterNotice {
|
||||
return value.value
|
||||
} else {
|
||||
return 0
|
||||
@ -279,21 +279,21 @@ public struct ApplicationSpecificNotice {
|
||||
}
|
||||
}
|
||||
|
||||
static func incrementProfileCallTips(postbox: Postbox, count: Int32 = 1) -> Signal<Void, NoError> {
|
||||
return postbox.transaction { transaction -> Void in
|
||||
static func incrementProfileCallTips(accountManager: AccountManager, count: Int32 = 1) -> Signal<Void, NoError> {
|
||||
return accountManager.transaction { transaction -> Void in
|
||||
var currentValue: Int32 = 0
|
||||
if let value = transaction.getNoticeEntry(key: ApplicationSpecificNoticeKeys.profileCallTips()) as? ApplicationSpecificCounterNotice {
|
||||
if let value = transaction.getNotice(ApplicationSpecificNoticeKeys.profileCallTips()) as? ApplicationSpecificCounterNotice {
|
||||
currentValue = value.value
|
||||
}
|
||||
currentValue += count
|
||||
|
||||
transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.profileCallTips(), value: ApplicationSpecificCounterNotice(value: currentValue))
|
||||
transaction.setNotice(ApplicationSpecificNoticeKeys.profileCallTips(), ApplicationSpecificCounterNotice(value: currentValue))
|
||||
}
|
||||
}
|
||||
|
||||
static func getSetPublicChannelLink(postbox: Postbox) -> Signal<Bool, NoError> {
|
||||
return postbox.transaction { transaction -> Bool in
|
||||
if let value = transaction.getNoticeEntry(key: ApplicationSpecificNoticeKeys.profileCallTips()) as? ApplicationSpecificCounterNotice {
|
||||
static func getSetPublicChannelLink(accountManager: AccountManager) -> Signal<Bool, NoError> {
|
||||
return accountManager.transaction { transaction -> Bool in
|
||||
if let value = transaction.getNotice(ApplicationSpecificNoticeKeys.profileCallTips()) as? ApplicationSpecificCounterNotice {
|
||||
return value.value < 1
|
||||
} else {
|
||||
return true
|
||||
@ -301,15 +301,15 @@ public struct ApplicationSpecificNotice {
|
||||
}
|
||||
}
|
||||
|
||||
static func markAsSeenSetPublicChannelLink(postbox: Postbox) -> Signal<Void, NoError> {
|
||||
return postbox.transaction { transaction -> Void in
|
||||
transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.profileCallTips(), value: ApplicationSpecificCounterNotice(value: 1))
|
||||
static func markAsSeenSetPublicChannelLink(accountManager: AccountManager) -> Signal<Void, NoError> {
|
||||
return accountManager.transaction { transaction -> Void in
|
||||
transaction.setNotice(ApplicationSpecificNoticeKeys.profileCallTips(), ApplicationSpecificCounterNotice(value: 1))
|
||||
}
|
||||
}
|
||||
|
||||
static func getProxyAdsAcknowledgment(postbox: Postbox) -> Signal<Bool, NoError> {
|
||||
return postbox.transaction { transaction -> Bool in
|
||||
if let _ = transaction.getNoticeEntry(key: ApplicationSpecificNoticeKeys.proxyAdsAcknowledgment()) as? ApplicationSpecificBoolNotice {
|
||||
static func getProxyAdsAcknowledgment(accountManager: AccountManager) -> Signal<Bool, NoError> {
|
||||
return accountManager.transaction { transaction -> Bool in
|
||||
if let _ = transaction.getNotice(ApplicationSpecificNoticeKeys.proxyAdsAcknowledgment()) as? ApplicationSpecificBoolNotice {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
@ -317,15 +317,15 @@ public struct ApplicationSpecificNotice {
|
||||
}
|
||||
}
|
||||
|
||||
static func setProxyAdsAcknowledgment(postbox: Postbox) -> Signal<Void, NoError> {
|
||||
return postbox.transaction { transaction -> Void in
|
||||
transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.proxyAdsAcknowledgment(), value: ApplicationSpecificBoolNotice())
|
||||
static func setProxyAdsAcknowledgment(accountManager: AccountManager) -> Signal<Void, NoError> {
|
||||
return accountManager.transaction { transaction -> Void in
|
||||
transaction.setNotice(ApplicationSpecificNoticeKeys.proxyAdsAcknowledgment(), ApplicationSpecificBoolNotice())
|
||||
}
|
||||
}
|
||||
|
||||
static func getPasscodeLockTips(postbox: Postbox) -> Signal<Bool, NoError> {
|
||||
return postbox.transaction { transaction -> Bool in
|
||||
if let _ = transaction.getNoticeEntry(key: ApplicationSpecificNoticeKeys.passcodeLockTips()) as? ApplicationSpecificBoolNotice {
|
||||
static func getPasscodeLockTips(accountManager: AccountManager) -> Signal<Bool, NoError> {
|
||||
return accountManager.transaction { transaction -> Bool in
|
||||
if let _ = transaction.getNotice(ApplicationSpecificNoticeKeys.passcodeLockTips()) as? ApplicationSpecificBoolNotice {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
@ -333,9 +333,9 @@ public struct ApplicationSpecificNotice {
|
||||
}
|
||||
}
|
||||
|
||||
static func setPasscodeLockTips(postbox: Postbox) -> Signal<Void, NoError> {
|
||||
return postbox.transaction { transaction -> Void in
|
||||
transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.passcodeLockTips(), value: ApplicationSpecificBoolNotice())
|
||||
static func setPasscodeLockTips(accountManager: AccountManager) -> Signal<Void, NoError> {
|
||||
return accountManager.transaction { transaction -> Void in
|
||||
transaction.setNotice(ApplicationSpecificNoticeKeys.passcodeLockTips(), ApplicationSpecificBoolNotice())
|
||||
}
|
||||
}
|
||||
|
||||
@ -343,9 +343,9 @@ public struct ApplicationSpecificNotice {
|
||||
return ApplicationSpecificNoticeKeys.contactsPermissionWarning()
|
||||
}
|
||||
|
||||
public static func setContactsPermissionWarning(postbox: Postbox, value: Int32) {
|
||||
let _ = postbox.transaction { transaction -> Void in
|
||||
transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.contactsPermissionWarning(), value: ApplicationSpecificTimestampNotice(value: value))
|
||||
public static func setContactsPermissionWarning(accountManager: AccountManager, value: Int32) {
|
||||
let _ = accountManager.transaction { transaction -> Void in
|
||||
transaction.setNotice(ApplicationSpecificNoticeKeys.contactsPermissionWarning(), ApplicationSpecificTimestampNotice(value: value))
|
||||
}.start()
|
||||
}
|
||||
|
||||
@ -361,15 +361,14 @@ public struct ApplicationSpecificNotice {
|
||||
}
|
||||
}
|
||||
|
||||
public static func setNotificationsPermissionWarning(postbox: Postbox, value: Int32) {
|
||||
let _ = postbox.transaction { transaction -> Void in
|
||||
transaction.setNoticeEntry(key: ApplicationSpecificNoticeKeys.notificationsPermissionWarning(), value: ApplicationSpecificTimestampNotice(value: value))
|
||||
public static func setNotificationsPermissionWarning(accountManager: AccountManager, value: Int32) {
|
||||
let _ = accountManager.transaction { transaction -> Void in
|
||||
transaction.setNotice(ApplicationSpecificNoticeKeys.notificationsPermissionWarning(), ApplicationSpecificTimestampNotice(value: value))
|
||||
}.start()
|
||||
}
|
||||
|
||||
static func reset(postbox: Postbox) -> Signal<Void, NoError> {
|
||||
return postbox.transaction { transaction -> Void in
|
||||
|
||||
static func reset(accountManager: AccountManager) -> Signal<Void, NoError> {
|
||||
return accountManager.transaction { transaction -> Void in
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -703,7 +703,7 @@ public func notificationsAndSoundsController(context: AccountContext, exceptions
|
||||
case .denied, .restricted:
|
||||
context.sharedContext.applicationBindings.openSettings()
|
||||
case .unreachable:
|
||||
ApplicationSpecificNotice.setNotificationsPermissionWarning(postbox: context.account.postbox, value: Int32(Date().timeIntervalSince1970))
|
||||
ApplicationSpecificNotice.setNotificationsPermissionWarning(accountManager: context.sharedContext.accountManager, value: Int32(Date().timeIntervalSince1970))
|
||||
context.sharedContext.applicationBindings.openSettings()
|
||||
default:
|
||||
break
|
||||
@ -712,7 +712,7 @@ public func notificationsAndSoundsController(context: AccountContext, exceptions
|
||||
}, suppressWarning: {
|
||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
presentControllerImpl?(textAlertController(context: context, title: presentationData.strings.Notifications_PermissionsSuppressWarningTitle, text: presentationData.strings.Notifications_PermissionsSuppressWarningText, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Notifications_PermissionsKeepDisabled, action: {
|
||||
ApplicationSpecificNotice.setNotificationsPermissionWarning(postbox: context.account.postbox, value: Int32(Date().timeIntervalSince1970))
|
||||
ApplicationSpecificNotice.setNotificationsPermissionWarning(accountManager: context.sharedContext.accountManager, value: Int32(Date().timeIntervalSince1970))
|
||||
}), TextAlertAction(type: .defaultAction, title: presentationData.strings.Notifications_PermissionsEnable, action: {
|
||||
context.sharedContext.applicationBindings.openSettings()
|
||||
})]), nil)
|
||||
@ -910,11 +910,11 @@ public func notificationsAndSoundsController(context: AccountContext, exceptions
|
||||
|
||||
let notificationsWarningSuppressed = Promise<Bool>(true)
|
||||
if #available(iOSApplicationExtension 10.0, *) {
|
||||
let warningKey = PostboxViewKey.noticeEntry(ApplicationSpecificNotice.notificationsPermissionWarningKey())
|
||||
notificationsWarningSuppressed.set(.single(true)
|
||||
|> then(context.account.postbox.combinedView(keys: [warningKey])
|
||||
|> map { combined -> Bool in
|
||||
let timestamp = (combined.views[warningKey] as? NoticeEntryView)?.value.flatMap({ ApplicationSpecificNotice.getTimestampValue($0) })
|
||||
|> then(
|
||||
context.sharedContext.accountManager.noticeEntry(key: ApplicationSpecificNotice.notificationsPermissionWarningKey())
|
||||
|> map { noticeView -> Bool in
|
||||
let timestamp = noticeView.value.flatMap({ ApplicationSpecificNotice.getTimestampValue($0) })
|
||||
if let timestamp = timestamp, timestamp > 0 {
|
||||
return true
|
||||
} else {
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import Foundation
|
||||
|
||||
final class OverlayMediaManager {
|
||||
var controller: OverlayMediaController?
|
||||
public final class OverlayMediaManager {
|
||||
public var controller: OverlayMediaController?
|
||||
|
||||
func attachOverlayMediaController(_ controller: OverlayMediaController) {
|
||||
public func attachOverlayMediaController(_ controller: OverlayMediaController) {
|
||||
self.controller = controller
|
||||
}
|
||||
}
|
||||
|
||||
@ -11,6 +11,16 @@ public final class PresentationThemeColorPlaceholder {
|
||||
|
||||
}
|
||||
|
||||
public final class PresentationThemeAuth {
|
||||
public let introStartButton: UIColor
|
||||
public let introDotColor: UIColor
|
||||
|
||||
public init(introStartButton: UIColor, introDotColor: UIColor) {
|
||||
self.introStartButton = introStartButton
|
||||
self.introDotColor = introDotColor
|
||||
}
|
||||
}
|
||||
|
||||
public final class PresentationThemeRootTabBar {
|
||||
public let backgroundColor: UIColor
|
||||
public let separatorColor: UIColor
|
||||
@ -880,6 +890,7 @@ public final class PresentationTheme: Equatable {
|
||||
public let name: PresentationThemeName
|
||||
public let overallDarkAppearance: Bool
|
||||
public let allowsCustomWallpapers: Bool
|
||||
public let auth: PresentationThemeAuth
|
||||
public let rootController: PresentationThemeRootController
|
||||
public let list: PresentationThemeList
|
||||
public let chatList: PresentationThemeChatList
|
||||
@ -889,10 +900,11 @@ public final class PresentationTheme: Equatable {
|
||||
|
||||
public let resourceCache: PresentationsResourceCache = PresentationsResourceCache()
|
||||
|
||||
public init(name: PresentationThemeName, overallDarkAppearance: Bool, allowsCustomWallpapers: Bool, rootController: PresentationThemeRootController, list: PresentationThemeList, chatList: PresentationThemeChatList, chat: PresentationThemeChat, actionSheet: PresentationThemeActionSheet, inAppNotification: PresentationThemeInAppNotification) {
|
||||
public init(name: PresentationThemeName, overallDarkAppearance: Bool, allowsCustomWallpapers: Bool, auth: PresentationThemeAuth, rootController: PresentationThemeRootController, list: PresentationThemeList, chatList: PresentationThemeChatList, chat: PresentationThemeChat, actionSheet: PresentationThemeActionSheet, inAppNotification: PresentationThemeInAppNotification) {
|
||||
self.name = name
|
||||
self.overallDarkAppearance = overallDarkAppearance
|
||||
self.allowsCustomWallpapers = allowsCustomWallpapers
|
||||
self.auth = auth
|
||||
self.rootController = rootController
|
||||
self.list = list
|
||||
self.chatList = chatList
|
||||
|
||||
@ -527,8 +527,8 @@ public func privacyAndSecurityController(context: AccountContext, initialSetting
|
||||
|
||||
actionsDisposable.add(managedUpdatedRecentPeers(accountPeerId: context.account.peerId, postbox: context.account.postbox, network: context.account.network).start())
|
||||
|
||||
let signal = combineLatest(context.sharedContext.presentationData, statePromise.get() |> deliverOnMainQueue, privacySettingsPromise.get(), context.account.postbox.combinedView(keys: [.noticeEntry(ApplicationSpecificNotice.secretChatLinkPreviewsKey())]), context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.contactSynchronizationSettings]), recentPeers(account: context.account))
|
||||
|> map { presentationData, state, privacySettings, combined, sharedData, recentPeers -> (ItemListControllerState, (ItemListNodeState<PrivacyAndSecurityEntry>, PrivacyAndSecurityEntry.ItemGenerationArguments)) in
|
||||
let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get(), privacySettingsPromise.get(), context.sharedContext.accountManager.noticeEntry(key: ApplicationSpecificNotice.secretChatLinkPreviewsKey()), context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.contactSynchronizationSettings]), recentPeers(account: context.account))
|
||||
|> map { presentationData, state, privacySettings, noticeView, sharedData, recentPeers -> (ItemListControllerState, (ItemListNodeState<PrivacyAndSecurityEntry>, PrivacyAndSecurityEntry.ItemGenerationArguments)) in
|
||||
var rightNavigationButton: ItemListNavigationButton?
|
||||
if privacySettings == nil || state.updatingAccountTimeoutValue != nil {
|
||||
rightNavigationButton = ItemListNavigationButton(content: .none, style: .activity, enabled: true, action: {})
|
||||
|
||||
@ -2285,7 +2285,7 @@ final class SecureIdDocumentFormControllerNode: FormControllerNode<SecureIdDocum
|
||||
if let strongSelf = self {
|
||||
switch field {
|
||||
case .country:
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.strings, theme: AuthorizationSequenceCountrySelectionTheme(presentationTheme: strongSelf.theme), displayCodes: false)
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.strings, theme: strongSelf.theme, displayCodes: false)
|
||||
controller.completeWithCountryCode = { _, id in
|
||||
if let strongSelf = self, var innerState = strongSelf.innerState {
|
||||
innerState.documentState.updateCountryCode(value: id)
|
||||
@ -2311,7 +2311,7 @@ final class SecureIdDocumentFormControllerNode: FormControllerNode<SecureIdDocum
|
||||
strongSelf.view.endEditing(true)
|
||||
strongSelf.present(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
|
||||
case .residenceCountry:
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.strings, theme: AuthorizationSequenceCountrySelectionTheme(presentationTheme: strongSelf.theme), displayCodes: false)
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.strings, theme: strongSelf.theme, displayCodes: false)
|
||||
controller.completeWithCountryCode = { _, id in
|
||||
if let strongSelf = self, var innerState = strongSelf.innerState {
|
||||
innerState.documentState.updateResidenceCountryCode(value: id)
|
||||
|
||||
@ -657,7 +657,7 @@ final class SecureIdPlaintextFormControllerNode: FormControllerNode<SecureIdPlai
|
||||
guard let strongSelf = self else {
|
||||
return
|
||||
}
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.strings, theme: AuthorizationSequenceCountrySelectionTheme(presentationTheme: strongSelf.theme), displayCodes: true)
|
||||
let controller = AuthorizationSequenceCountrySelectionController(strings: strongSelf.strings, theme: strongSelf.theme, displayCodes: true)
|
||||
controller.completeWithCountryCode = { code, _ in
|
||||
if let strongSelf = self, var innerState = strongSelf.innerState {
|
||||
innerState.data.updateTextField(type: .countryCode, value: "+\(code)")
|
||||
|
||||
@ -608,7 +608,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM
|
||||
}
|
||||
}
|
||||
}
|
||||
for (_, account) in activeAccounts {
|
||||
for (_, account, _) in activeAccounts {
|
||||
accounts.append(accountWithPeer(account))
|
||||
}
|
||||
|
||||
@ -1057,15 +1057,14 @@ public func settingsController(context: AccountContext, accountManager: AccountM
|
||||
|
||||
let notificationsWarningSuppressed = Promise<Bool>(true)
|
||||
if #available(iOSApplicationExtension 10.0, *) {
|
||||
let warningKey = PostboxViewKey.noticeEntry(ApplicationSpecificNotice.notificationsPermissionWarningKey())
|
||||
notificationsWarningSuppressed.set(
|
||||
.single(true)
|
||||
|> then(
|
||||
contextValue.get()
|
||||
|> mapToSignal { context -> Signal<Bool, NoError> in
|
||||
return context.account.postbox.combinedView(keys: [warningKey])
|
||||
|> map { combined -> Bool in
|
||||
let timestamp = (combined.views[warningKey] as? NoticeEntryView)?.value.flatMap({ ApplicationSpecificNotice.getTimestampValue($0) })
|
||||
return context.sharedContext.accountManager.noticeEntry(key: ApplicationSpecificNotice.notificationsPermissionWarningKey())
|
||||
|> map { noticeView -> Bool in
|
||||
let timestamp = noticeView.value.flatMap({ ApplicationSpecificNotice.getTimestampValue($0) })
|
||||
if let timestamp = timestamp, timestamp > 0 {
|
||||
return true
|
||||
} else {
|
||||
|
||||
@ -549,7 +549,7 @@ public final class ShareController: ViewController {
|
||||
}
|
||||
var items: [ActionSheetItem] = []
|
||||
for info in strongSelf.switchableAccounts {
|
||||
items.append(ActionSheetPeerItem(account: info.account, peer: info.peer, title: info.peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder), strings: presentationData.strings, theme: presentationData.theme, action: { [weak self] in
|
||||
items.append(ActionSheetPeerItem(account: info.account, peer: info.peer, title: info.peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder), isSelected: info.account.id == strongSelf.currentAccount.id, strings: presentationData.strings, theme: presentationData.theme, action: { [weak self] in
|
||||
dismissAction()
|
||||
self?.switchToAccount(account: info.account, animateIn: true)
|
||||
}))
|
||||
@ -557,6 +557,7 @@ public final class ShareController: ViewController {
|
||||
controller.setItemGroups([
|
||||
ActionSheetItemGroup(items: items)
|
||||
])
|
||||
strongSelf.view.endEditing(true)
|
||||
strongSelf.present(controller, in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
|
||||
}
|
||||
self.displayNodeDidLoad()
|
||||
|
||||
@ -38,6 +38,11 @@ public final class AccountWithInfo: Equatable {
|
||||
}
|
||||
}
|
||||
|
||||
private struct AccountAttributes: Equatable {
|
||||
let sortIndex: Int32
|
||||
let isTestingEnvironment: Bool
|
||||
}
|
||||
|
||||
public final class SharedAccountContext {
|
||||
let mainWindow: Window1?
|
||||
public let applicationBindings: TelegramApplicationBindings
|
||||
@ -48,13 +53,13 @@ public final class SharedAccountContext {
|
||||
private let apsNotificationToken: Signal<Data?, NoError>
|
||||
private let voipNotificationToken: Signal<Data?, NoError>
|
||||
|
||||
private var activeAccountsValue: (primary: Account?, accounts: [AccountRecordId: Account], currentAuth: UnauthorizedAccount?)?
|
||||
private let activeAccountsPromise = Promise<(primary: Account?, accounts: [AccountRecordId: Account], currentAuth: UnauthorizedAccount?)>()
|
||||
public var activeAccounts: Signal<(primary: Account?, accounts: [AccountRecordId: Account], currentAuth: UnauthorizedAccount?), NoError> {
|
||||
private var activeAccountsValue: (primary: Account?, accounts: [(AccountRecordId, Account, Int32)], currentAuth: UnauthorizedAccount?)?
|
||||
private let activeAccountsPromise = Promise<(primary: Account?, accounts: [(AccountRecordId, Account, Int32)], currentAuth: UnauthorizedAccount?)>()
|
||||
public var activeAccounts: Signal<(primary: Account?, accounts: [(AccountRecordId, Account, Int32)], currentAuth: UnauthorizedAccount?), NoError> {
|
||||
return self.activeAccountsPromise.get()
|
||||
}
|
||||
private let activeAccountsWithInfoPromise = Promise<(primary: AccountRecordId?, accounts: [AccountRecordId: AccountWithInfo])>()
|
||||
public var activeAccountsWithInfo: Signal<(primary: AccountRecordId?, accounts: [AccountRecordId: AccountWithInfo]), NoError> {
|
||||
private let activeAccountsWithInfoPromise = Promise<(primary: AccountRecordId?, accounts: [AccountWithInfo])>()
|
||||
public var activeAccountsWithInfo: Signal<(primary: AccountRecordId?, accounts: [AccountWithInfo]), NoError> {
|
||||
return self.activeAccountsWithInfoPromise.get()
|
||||
}
|
||||
|
||||
@ -231,8 +236,8 @@ public final class SharedAccountContext {
|
||||
|
||||
let differenceDisposable = MetaDisposable()
|
||||
let _ = (accountManager.accountRecords()
|
||||
|> map { view -> (AccountRecordId?, [AccountRecordId: Bool], (AccountRecordId, Bool)?) in
|
||||
var result: [AccountRecordId: Bool] = [:]
|
||||
|> map { view -> (AccountRecordId?, [AccountRecordId: AccountAttributes], (AccountRecordId, Bool)?) in
|
||||
var result: [AccountRecordId: AccountAttributes] = [:]
|
||||
for record in view.records {
|
||||
let isLoggedOut = record.attributes.contains(where: { attribute in
|
||||
return attribute is LoggedOutAccountAttribute
|
||||
@ -247,7 +252,13 @@ public final class SharedAccountContext {
|
||||
return false
|
||||
}
|
||||
})
|
||||
result[record.id] = isTestingEnvironment
|
||||
var sortIndex: Int32 = 0
|
||||
for attribute in record.attributes {
|
||||
if let attribute = attribute as? AccountSortOrderAttribute {
|
||||
sortIndex = attribute.order
|
||||
}
|
||||
}
|
||||
result[record.id] = AccountAttributes(sortIndex: sortIndex, isTestingEnvironment: isTestingEnvironment)
|
||||
}
|
||||
let authRecord: (AccountRecordId, Bool)? = view.currentAuthAccount.flatMap({ authAccount in
|
||||
let isTestingEnvironment = authAccount.attributes.contains(where: { attribute in
|
||||
@ -277,17 +288,17 @@ public final class SharedAccountContext {
|
||||
return true
|
||||
})
|
||||
|> deliverOnMainQueue).start(next: { primaryId, records, authRecord in
|
||||
var addedSignals: [Signal<(AccountRecordId, Account?), NoError>] = []
|
||||
var addedSignals: [Signal<(AccountRecordId, Account?, Int32), NoError>] = []
|
||||
var addedAuthSignal: Signal<UnauthorizedAccount?, NoError> = .single(nil)
|
||||
for (id, isTestingEnvironment) in records {
|
||||
if self.activeAccountsValue?.accounts[id] == nil {
|
||||
addedSignals.append(accountWithId(accountManager: accountManager, networkArguments: networkArguments, id: id, supplementary: false, rootPath: rootPath, beginWithTestingEnvironment: isTestingEnvironment, auxiliaryMethods: telegramAccountAuxiliaryMethods)
|
||||
|> map { result -> (AccountRecordId, Account?) in
|
||||
for (id, attributes) in records {
|
||||
if self.activeAccountsValue?.accounts.firstIndex(where: { $0.0 == id}) == nil {
|
||||
addedSignals.append(accountWithId(accountManager: accountManager, networkArguments: networkArguments, id: id, supplementary: false, rootPath: rootPath, beginWithTestingEnvironment: attributes.isTestingEnvironment, auxiliaryMethods: telegramAccountAuxiliaryMethods)
|
||||
|> map { result -> (AccountRecordId, Account?, Int32) in
|
||||
switch result {
|
||||
case let .authorized(account):
|
||||
return (id, account)
|
||||
return (id, account, attributes.sortIndex)
|
||||
default:
|
||||
return (id, nil)
|
||||
return (id, nil, attributes.sortIndex)
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -307,37 +318,45 @@ public final class SharedAccountContext {
|
||||
|> deliverOnMainQueue).start(next: { accounts, authAccount in
|
||||
var hadUpdates = false
|
||||
if self.activeAccountsValue == nil {
|
||||
self.activeAccountsValue = (nil, [:], nil)
|
||||
self.activeAccountsValue = (nil, [], nil)
|
||||
hadUpdates = true
|
||||
}
|
||||
for account in accounts {
|
||||
if let account = account.1 {
|
||||
self.activeAccountsValue!.accounts[account.id] = account
|
||||
for accountRecord in accounts {
|
||||
if let account = accountRecord.1 {
|
||||
if let index = self.activeAccountsValue?.accounts.firstIndex(where: { $0.0 == account.id }) {
|
||||
self.activeAccountsValue?.accounts.remove(at: index)
|
||||
assertionFailure()
|
||||
}
|
||||
self.activeAccountsValue!.accounts.append((account.id, account, accountRecord.2))
|
||||
hadUpdates = true
|
||||
} else {
|
||||
let _ = accountManager.transaction({ transaction in
|
||||
transaction.updateRecord(account.0, { _ in
|
||||
transaction.updateRecord(accountRecord.0, { _ in
|
||||
return nil
|
||||
})
|
||||
}).start()
|
||||
}
|
||||
}
|
||||
var removedIds: [AccountRecordId] = []
|
||||
for id in self.activeAccountsValue!.accounts.keys {
|
||||
for id in self.activeAccountsValue!.accounts.map({ $0.0 }) {
|
||||
if records[id] == nil {
|
||||
removedIds.append(id)
|
||||
}
|
||||
}
|
||||
for id in removedIds {
|
||||
hadUpdates = true
|
||||
self.activeAccountsValue!.accounts.removeValue(forKey: id)
|
||||
if let index = self.activeAccountsValue?.accounts.firstIndex(where: { $0.0 == id }) {
|
||||
self.activeAccountsValue?.accounts.remove(at: index)
|
||||
}
|
||||
}
|
||||
var primary: Account?
|
||||
if let primaryId = primaryId {
|
||||
primary = self.activeAccountsValue!.accounts[primaryId]
|
||||
if let index = self.activeAccountsValue?.accounts.firstIndex(where: { $0.0 == primaryId }) {
|
||||
primary = self.activeAccountsValue?.accounts[index].1
|
||||
}
|
||||
}
|
||||
if primary == nil && !self.activeAccountsValue!.accounts.isEmpty {
|
||||
primary = self.activeAccountsValue!.accounts.sorted(by: { lhs, rhs in lhs.key < rhs.key }).first?.1
|
||||
primary = self.activeAccountsValue!.accounts.first?.1
|
||||
}
|
||||
if primary !== self.activeAccountsValue!.primary {
|
||||
hadUpdates = true
|
||||
@ -354,6 +373,7 @@ public final class SharedAccountContext {
|
||||
self.activeAccountsValue!.currentAuth = authAccount
|
||||
}
|
||||
if hadUpdates {
|
||||
self.activeAccountsValue!.accounts.sort(by: { $0.2 < $1.2 })
|
||||
self.activeAccountsPromise.set(.single(self.activeAccountsValue!))
|
||||
}
|
||||
|
||||
@ -364,8 +384,8 @@ public final class SharedAccountContext {
|
||||
})
|
||||
|
||||
self.activeAccountsWithInfoPromise.set(self.activeAccounts
|
||||
|> mapToSignal { primary, accounts, _ -> Signal<(primary: AccountRecordId?, accounts: [AccountRecordId: AccountWithInfo]), NoError> in
|
||||
return combineLatest(accounts.values.map { account -> Signal<AccountWithInfo?, NoError> in
|
||||
|> mapToSignal { primary, accounts, _ -> Signal<(primary: AccountRecordId?, accounts: [AccountWithInfo]), NoError> in
|
||||
return combineLatest(accounts.map { _, account, _ -> Signal<AccountWithInfo?, NoError> in
|
||||
let peerViewKey: PostboxViewKey = .peer(peerId: account.peerId, components: [])
|
||||
return account.postbox.combinedView(keys: [peerViewKey])
|
||||
|> map { view -> AccountWithInfo? in
|
||||
@ -376,14 +396,14 @@ public final class SharedAccountContext {
|
||||
}
|
||||
|> distinctUntilChanged
|
||||
})
|
||||
|> map { accountsWithInfo -> (primary: AccountRecordId?, accounts: [AccountRecordId: AccountWithInfo]) in
|
||||
var accountsWithInfoDict: [AccountRecordId: AccountWithInfo] = [:]
|
||||
|> map { accountsWithInfo -> (primary: AccountRecordId?, accounts: [AccountWithInfo]) in
|
||||
var accountsWithInfoResult: [AccountWithInfo] = []
|
||||
for info in accountsWithInfo {
|
||||
if let info = info {
|
||||
accountsWithInfoDict[info.account.id] = info
|
||||
accountsWithInfoResult.append(info)
|
||||
}
|
||||
}
|
||||
return (primary?.id, accountsWithInfoDict)
|
||||
return (primary?.id, accountsWithInfoResult)
|
||||
}
|
||||
})
|
||||
|
||||
@ -395,7 +415,7 @@ public final class SharedAccountContext {
|
||||
applicationBindings.openSettings()
|
||||
})
|
||||
}, audioSession: self.mediaManager.audioSession, activeAccounts: self.activeAccounts |> map { _, accounts, _ in
|
||||
return Array(accounts.values)
|
||||
return Array(accounts.map({ $0.1 }))
|
||||
})
|
||||
self.callManager = callManager
|
||||
|
||||
@ -515,9 +535,9 @@ public final class SharedAccountContext {
|
||||
self.registeredNotificationTokensDisposable.set((self.activeAccounts
|
||||
|> mapToSignal { _, activeAccounts, _ -> Signal<Never, NoError> in
|
||||
var applied: [Signal<Never, NoError>] = []
|
||||
let activeProductionUserIds = activeAccounts.values.filter({ !$0.testingEnvironment }).map({ $0.peerId.id })
|
||||
let activeTestingUserIds = activeAccounts.values.filter({ $0.testingEnvironment }).map({ $0.peerId.id })
|
||||
for (_, account) in activeAccounts {
|
||||
let activeProductionUserIds = activeAccounts.map({ $0.1 }).filter({ !$0.testingEnvironment }).map({ $0.peerId.id })
|
||||
let activeTestingUserIds = activeAccounts.map({ $0.1 }).filter({ $0.testingEnvironment }).map({ $0.peerId.id })
|
||||
for (_, account, _) in activeAccounts {
|
||||
let appliedAps = self.apsNotificationToken
|
||||
|> distinctUntilChanged(isEqual: { $0 == $1 })
|
||||
|> mapToSignal { token -> Signal<Never, NoError> in
|
||||
|
||||
@ -7,7 +7,7 @@ import TelegramCore
|
||||
func presentContactsWarningSuppression(context: AccountContext, present: (ViewController, Any?) -> Void) {
|
||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
present(textAlertController(context: context, title: presentationData.strings.Contacts_PermissionsSuppressWarningTitle, text: presentationData.strings.Contacts_PermissionsSuppressWarningText, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Contacts_PermissionsKeepDisabled, action: {
|
||||
ApplicationSpecificNotice.setContactsPermissionWarning(postbox: context.account.postbox, value: Int32(Date().timeIntervalSince1970))
|
||||
ApplicationSpecificNotice.setContactsPermissionWarning(accountManager: context.sharedContext.accountManager, value: Int32(Date().timeIntervalSince1970))
|
||||
}), TextAlertAction(type: .defaultAction, title: presentationData.strings.Contacts_PermissionsEnable, action: {
|
||||
let _ = (DeviceAccess.authorizationStatus(context: context, subject: .contacts)
|
||||
|> take(1)
|
||||
|
||||
@ -283,9 +283,17 @@ final class TabBarAccountSwitchControllerNode: ViewControllerTracingNode {
|
||||
UIView.animate(withDuration: 0.3, animations: {
|
||||
if #available(iOS 9.0, *) {
|
||||
if self.presentationData.theme.chatList.searchBarKeyboardColor == .dark {
|
||||
self.effectView.effect = UIBlurEffect(style: .dark)
|
||||
if #available(iOSApplicationExtension 10.0, *) {
|
||||
self.effectView.effect = UIBlurEffect(style: .regular)
|
||||
} else {
|
||||
self.effectView.effect = UIBlurEffect(style: .dark)
|
||||
}
|
||||
} else {
|
||||
self.effectView.effect = UIBlurEffect(style: .light)
|
||||
if #available(iOSApplicationExtension 10.0, *) {
|
||||
self.effectView.effect = UIBlurEffect(style: .regular)
|
||||
} else {
|
||||
self.effectView.effect = UIBlurEffect(style: .light)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
self.effectView.alpha = 1.0
|
||||
@ -300,6 +308,7 @@ final class TabBarAccountSwitchControllerNode: ViewControllerTracingNode {
|
||||
for sourceNode in self.sourceNodes {
|
||||
if let snapshot = sourceNode.view.snapshotContentTree() {
|
||||
snapshot.frame = sourceNode.view.convert(sourceNode.bounds, to: self.view)
|
||||
snapshot.isUserInteractionEnabled = false
|
||||
self.view.addSubview(snapshot)
|
||||
self.snapshotViews.append(snapshot)
|
||||
}
|
||||
|
||||
@ -34,19 +34,15 @@ public extension TermsOfServiceControllerTheme {
|
||||
self.init(statusBarStyle: presentationTheme.rootController.statusBar.style.style, navigationBackground: presentationTheme.rootController.navigationBar.backgroundColor, navigationSeparator: presentationTheme.rootController.navigationBar.separatorColor, listBackground: presentationTheme.list.blocksBackgroundColor, itemBackground: presentationTheme.list.itemBlocksBackgroundColor, itemSeparator: presentationTheme.list.itemBlocksSeparatorColor, primary: presentationTheme.list.itemPrimaryTextColor, accent: presentationTheme.list.itemAccentColor, disabled: presentationTheme.rootController.navigationBar.disabledButtonColor)
|
||||
}
|
||||
|
||||
convenience init(authTheme: AuthorizationTheme) {
|
||||
self.init(statusBarStyle: authTheme.statusBarStyle, navigationBackground: authTheme.navigationBarBackgroundColor, navigationSeparator: authTheme.navigationBarSeparatorColor, listBackground: authTheme.listBackgroundColor, itemBackground: authTheme.backgroundColor, itemSeparator: authTheme.separatorColor, primary: authTheme.primaryColor, accent: authTheme.accentColor, disabled: authTheme.accentColor)
|
||||
}
|
||||
|
||||
var presentationTheme: PresentationTheme {
|
||||
let theme: PresentationTheme
|
||||
switch itemBackground.argb {
|
||||
case defaultPresentationTheme.list.itemBlocksBackgroundColor.argb:
|
||||
theme = defaultPresentationTheme
|
||||
case defaultDarkPresentationTheme.list.itemBlocksBackgroundColor.argb:
|
||||
theme = defaultDarkPresentationTheme
|
||||
case defaultDarkAccentPresentationTheme.list.itemBlocksBackgroundColor.argb:
|
||||
theme = defaultDarkAccentPresentationTheme
|
||||
case defaultPresentationTheme.list.itemBlocksBackgroundColor.argb:
|
||||
theme = defaultPresentationTheme
|
||||
case defaultDarkPresentationTheme.list.itemBlocksBackgroundColor.argb:
|
||||
theme = defaultDarkPresentationTheme
|
||||
case defaultDarkAccentPresentationTheme.list.itemBlocksBackgroundColor.argb:
|
||||
theme = defaultDarkAccentPresentationTheme
|
||||
default:
|
||||
theme = defaultPresentationTheme
|
||||
}
|
||||
|
||||
@ -99,14 +99,15 @@ private let applicationSpecificPreferencesKeyMapping: [LegacyApplicationSpecific
|
||||
.contactSynchronizationSettings: .contactSynchronizationSettings
|
||||
]
|
||||
|
||||
public func upgradedAccounts(accountManager: AccountManager, rootPath: String) -> Signal<Void, NoError> {
|
||||
public func upgradedAccounts(accountManager: AccountManager, rootPath: String) -> Signal<Never, NoError> {
|
||||
return accountManager.transaction { transaction -> (Int32, AccountRecordId?) in
|
||||
return (transaction.getVersion(), transaction.getCurrent()?.0)
|
||||
}
|
||||
|> mapToSignal { version, currentId -> Signal<Void, NoError> in
|
||||
if version == 0 {
|
||||
|> mapToSignal { version, currentId -> Signal<Never, NoError> in
|
||||
var signal: Signal<Never, NoError> = .complete()
|
||||
if version < 1 {
|
||||
if let currentId = currentId {
|
||||
return accountPreferenceEntries(rootPath: rootPath, id: currentId, keys: Set(preferencesKeyMapping.keys.map({ $0.key }) + applicationSpecificPreferencesKeyMapping.keys.map({ $0.key })))
|
||||
let upgradePreferences = accountPreferenceEntries(rootPath: rootPath, id: currentId, keys: Set(preferencesKeyMapping.keys.map({ $0.key }) + applicationSpecificPreferencesKeyMapping.keys.map({ $0.key })))
|
||||
|> mapToSignal { path, values -> Signal<Void, NoError> in
|
||||
return accountManager.transaction { transaction -> Void in
|
||||
for (key, value) in values {
|
||||
@ -166,13 +167,50 @@ public func upgradedAccounts(accountManager: AccountManager, rootPath: String) -
|
||||
transaction.setVersion(1)
|
||||
}
|
||||
}
|
||||
|> ignoreValues
|
||||
signal = signal |> then(upgradePreferences)
|
||||
} else {
|
||||
return accountManager.transaction { transaction -> Void in
|
||||
let upgradePreferences = accountManager.transaction { transaction -> Void in
|
||||
transaction.setVersion(1)
|
||||
}
|
||||
|> ignoreValues
|
||||
signal = signal |> then(upgradePreferences)
|
||||
}
|
||||
} else {
|
||||
return .complete()
|
||||
}
|
||||
if version < 2 {
|
||||
if let currentId = currentId {
|
||||
let upgradeNotices = accountNoticeEntries(rootPath: rootPath, id: currentId)
|
||||
|> mapToSignal { path, values -> Signal<Void, NoError> in
|
||||
return accountManager.transaction { transaction -> Void in
|
||||
for (key, value) in values {
|
||||
transaction.setNotice(NoticeEntryKey(namespace: ValueBoxKey(length: 0), key: key), value)
|
||||
}
|
||||
|
||||
transaction.setVersion(2)
|
||||
}
|
||||
}
|
||||
|> ignoreValues
|
||||
signal = signal |> then(upgradeNotices)
|
||||
} else {
|
||||
let upgradeNotices = accountManager.transaction { transaction -> Void in
|
||||
transaction.setVersion(2)
|
||||
}
|
||||
|> ignoreValues
|
||||
signal = signal |> then(upgradeNotices)
|
||||
}
|
||||
|
||||
let upgradeSortOrder = accountManager.transaction { transaction -> Void in
|
||||
var index: Int32 = 0
|
||||
for record in transaction.getRecords() {
|
||||
transaction.updateRecord(record.id, { _ in
|
||||
return AccountRecord(id: record.id, attributes: record.attributes + [AccountSortOrderAttribute(order: index)], temporarySessionId: record.temporarySessionId)
|
||||
})
|
||||
index += 1
|
||||
}
|
||||
}
|
||||
|> ignoreValues
|
||||
signal = signal |> then(upgradeSortOrder)
|
||||
}
|
||||
return signal
|
||||
}
|
||||
}
|
||||
|
||||
@ -1384,7 +1384,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us
|
||||
return false
|
||||
})
|
||||
if let resultItemNode = resultItemNode, let callButtonFrame = resultItemNode.callButtonFrame {
|
||||
let _ = (ApplicationSpecificNotice.getProfileCallTips(postbox: context.account.postbox)
|
||||
let _ = (ApplicationSpecificNotice.getProfileCallTips(accountManager: context.sharedContext.accountManager)
|
||||
|> deliverOnMainQueue).start(next: { [weak controller] counter in
|
||||
guard let controller = controller else {
|
||||
return
|
||||
@ -1399,7 +1399,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us
|
||||
if !displayTip {
|
||||
return
|
||||
}
|
||||
let _ = ApplicationSpecificNotice.incrementProfileCallTips(postbox: context.account.postbox).start()
|
||||
let _ = ApplicationSpecificNotice.incrementProfileCallTips(accountManager: context.sharedContext.accountManager).start()
|
||||
|
||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
let text: String = presentationData.strings.UserInfo_TapToCall
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user