mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-10 16:29:55 +00:00
Merge commit 'dc13584ef5aa4455340c27a2d937edaab86ef431'
This commit is contained in:
commit
2f3ec197f1
@ -47,6 +47,21 @@ private let gradientColors: [NSArray] = [
|
||||
[UIColor(rgb: 0xd669ed).cgColor, UIColor(rgb: 0xe0a2f3).cgColor],
|
||||
]
|
||||
|
||||
private func generateGradientFilledCircleImage(diameter: CGFloat, colors: NSArray) -> UIImage? {
|
||||
return generateImage(CGSize(width: diameter, height: diameter), contextGenerator: { size, context in
|
||||
let bounds = CGRect(origin: CGPoint(), size: size)
|
||||
context.clear(bounds)
|
||||
context.addEllipse(in: bounds)
|
||||
context.clip()
|
||||
|
||||
var locations: [CGFloat] = [0.0, 1.0]
|
||||
let colorSpace = CGColorSpaceCreateDeviceRGB()
|
||||
let gradient = CGGradient(colorsSpace: colorSpace, colors: colors, locations: &locations)!
|
||||
|
||||
context.drawLinearGradient(gradient, start: CGPoint(), end: CGPoint(x: 0.0, y: bounds.size.height), options: CGGradientDrawingOptions())
|
||||
})
|
||||
}
|
||||
|
||||
private let grayscaleColors: NSArray = [
|
||||
UIColor(rgb: 0xb1b1b1).cgColor, UIColor(rgb: 0xcdcdcd).cgColor
|
||||
]
|
||||
@ -210,34 +225,21 @@ public final class AvatarNode: ASDisplayNode {
|
||||
return
|
||||
}
|
||||
|
||||
var backgroundColor = theme.chatList.neutralAvatarColor
|
||||
let animationBackgroundNode = ASImageNode()
|
||||
animationBackgroundNode.frame = self.imageNode.frame
|
||||
var animationColor = theme.chatList.neutralAvatarColor
|
||||
if let overrideImage = self.overrideImage {
|
||||
switch overrideImage {
|
||||
case let .archivedChatsIcon(hiddenByDefault) where !hiddenByDefault:
|
||||
animationColor = UIColor(rgb: 0x2a9ef1).mixedWith(UIColor(rgb: 0x72d5fd), alpha: 0.5)
|
||||
animationBackgroundNode.image = generateImage(CGSize(width: self.imageNode.frame.width, height: self.imageNode.frame.width), rotatedContext: { size, context in
|
||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||
context.beginPath()
|
||||
context.addEllipse(in: CGRect(x: 0.0, y: 0.0, width: size.width, height:
|
||||
size.height))
|
||||
context.clip()
|
||||
let colorsArray = gradientColors[5]
|
||||
var locations: [CGFloat] = [1.0, 0.0]
|
||||
|
||||
let colorSpace = CGColorSpaceCreateDeviceRGB()
|
||||
let gradient = CGGradient(colorsSpace: colorSpace, colors: colorsArray, locations: &locations)!
|
||||
|
||||
context.drawLinearGradient(gradient, start: CGPoint(), end: CGPoint(x: 0.0, y: size.height), options: CGGradientDrawingOptions())
|
||||
})
|
||||
default:
|
||||
if let overrideImage = self.overrideImage, case let .archivedChatsIcon(hiddenByDefault) = overrideImage {
|
||||
if hiddenByDefault {
|
||||
animationBackgroundNode.image = generateFilledCircleImage(diameter: self.imageNode.frame.width, color: theme.chatList.neutralAvatarColor)
|
||||
} else {
|
||||
backgroundColor = UIColor(rgb: 0x4fbaf7)
|
||||
animationBackgroundNode.image = generateGradientFilledCircleImage(diameter: self.imageNode.frame.width, colors: gradientColors[5])
|
||||
}
|
||||
}
|
||||
|
||||
self.addSubnode(animationBackgroundNode)
|
||||
|
||||
let animationNode = AnimationNode(animation: name, keysToColor: keysToColor, color: animationColor, scale: scale)
|
||||
let animationNode = AnimationNode(animation: name, keysToColor: keysToColor, color: backgroundColor, scale: scale)
|
||||
animationNode.completion = { [weak animationBackgroundNode, weak self] in
|
||||
self?.imageNode.isHidden = false
|
||||
animationBackgroundNode?.removeFromSupernode()
|
||||
|
||||
@ -230,7 +230,7 @@ private func groupReferenceRevealOptions(strings: PresentationStrings, theme: Pr
|
||||
var options: [ItemListRevealOption] = []
|
||||
if !isEditing {
|
||||
if hiddenByDefault {
|
||||
options.append(ItemListRevealOption(key: RevealOptionKey.unhide.rawValue, title: strings.ChatList_UnhideAction, icon: unhideIcon, color: theme.list.itemDisclosureActions.inactive.fillColor, textColor: theme.list.itemDisclosureActions.neutral1.foregroundColor))
|
||||
options.append(ItemListRevealOption(key: RevealOptionKey.unhide.rawValue, title: strings.ChatList_UnhideAction, icon: unhideIcon, color: theme.list.itemDisclosureActions.constructive.fillColor, textColor: theme.list.itemDisclosureActions.constructive.foregroundColor))
|
||||
} else {
|
||||
options.append(ItemListRevealOption(key: RevealOptionKey.hide.rawValue, title: strings.ChatList_HideAction, icon: hideIcon, color: theme.list.itemDisclosureActions.inactive.fillColor, textColor: theme.list.itemDisclosureActions.neutral1.foregroundColor))
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@ import UIKit
|
||||
|
||||
private func makeDefaultPresentationTheme(accentColor: UIColor, serviceBackgroundColor: UIColor, day: Bool) -> PresentationTheme {
|
||||
let destructiveColor: UIColor = UIColor(rgb: 0xff3b30)
|
||||
let constructiveColor: UIColor = UIColor(rgb: 0x2bb443)
|
||||
let constructiveColor: UIColor = UIColor(rgb: 0x00c900)
|
||||
let secretColor: UIColor = UIColor(rgb: 0x00B12C)
|
||||
|
||||
let rootStatusBar = PresentationThemeRootNavigationStatusBar(
|
||||
|
||||
@ -163,6 +163,8 @@ final public class PasscodeEntryController: ViewController {
|
||||
override public func viewDidAppear(_ animated: Bool) {
|
||||
super.viewDidAppear(animated)
|
||||
|
||||
self.view.disablesInteractiveTransitionGestureRecognizer = true
|
||||
|
||||
self.controllerNode.activateInput()
|
||||
if self.arguments.animated {
|
||||
let iconFrame = self.arguments.lockIconInitialFrame()
|
||||
|
||||
@ -302,12 +302,14 @@ final class PasscodeEntryControllerNode: ASDisplayNode {
|
||||
switch self.passcodeType {
|
||||
case .digits6, .digits4:
|
||||
self.keyboardNode.alpha = 1.0
|
||||
self.deleteButtonNode.alpha = 1.0
|
||||
case .alphanumeric:
|
||||
self.keyboardNode.alpha = 0.0
|
||||
self.deleteButtonNode.alpha = 0.0
|
||||
}
|
||||
|
||||
let deleteSize = self.deleteButtonNode.measure(layout.size)
|
||||
transition.updateFrame(node: self.deleteButtonNode, frame: CGRect(origin: CGPoint(x: floor(keyboardFrame.maxX - keyboardButtonSize.width / 2.0 - deleteSize.width / 2.0), y: layout.size.height - layout.intrinsicInsets.bottom - deleteSize.height - 20.0), size: deleteSize))
|
||||
transition.updateFrame(node: self.deleteButtonNode, frame: CGRect(origin: CGPoint(x: floor(keyboardFrame.maxX - keyboardButtonSize.width / 2.0 - deleteSize.width / 2.0), y: layout.size.height - layout.intrinsicInsets.bottom - deleteSize.height - passcodeLayout.keyboard.deleteOffset), size: deleteSize))
|
||||
|
||||
if let biometricIcon = self.biometricButtonNode.image(for: .normal) {
|
||||
var biometricY: CGFloat = 0.0
|
||||
|
||||
@ -11,8 +11,9 @@ struct PasscodeKeyboardLayout {
|
||||
let size: CGSize
|
||||
let topOffset: CGFloat
|
||||
let biometricsOffset: CGFloat
|
||||
let deleteOffset: CGFloat
|
||||
|
||||
fileprivate init(metrics: DeviceMetrics?) {
|
||||
fileprivate init(layout: ContainerViewLayout, metrics: DeviceMetrics?) {
|
||||
if let metrics = metrics {
|
||||
switch metrics {
|
||||
case .iPhone4:
|
||||
@ -23,8 +24,9 @@ struct PasscodeKeyboardLayout {
|
||||
self.verticalThird = 176.0
|
||||
self.verticalFourth = 264.0
|
||||
self.size = CGSize(width: 265.0, height: 339.0)
|
||||
self.topOffset = 0.0
|
||||
self.topOffset = 122.0
|
||||
self.biometricsOffset = 0.0
|
||||
self.deleteOffset = 45.0
|
||||
case .iPhone5:
|
||||
self.buttonSize = 75.0
|
||||
self.horizontalSecond = 95.0
|
||||
@ -35,6 +37,7 @@ struct PasscodeKeyboardLayout {
|
||||
self.size = CGSize(width: 265.0, height: 339.0)
|
||||
self.topOffset = 155.0
|
||||
self.biometricsOffset = 23.0
|
||||
self.deleteOffset = 20.0
|
||||
case .iPhone6:
|
||||
self.buttonSize = 75.0
|
||||
self.horizontalSecond = 103.0
|
||||
@ -45,6 +48,7 @@ struct PasscodeKeyboardLayout {
|
||||
self.size = CGSize(width: 281.0, height: 348.0)
|
||||
self.topOffset = 221.0
|
||||
self.biometricsOffset = 30.0
|
||||
self.deleteOffset = 20.0
|
||||
case .iPhone6Plus:
|
||||
self.buttonSize = 85.0
|
||||
self.horizontalSecond = 115.0
|
||||
@ -55,6 +59,7 @@ struct PasscodeKeyboardLayout {
|
||||
self.size = CGSize(width: 315.0, height: 385.0)
|
||||
self.topOffset = 226.0
|
||||
self.biometricsOffset = 30.0
|
||||
self.deleteOffset = 20.0
|
||||
case .iPhoneX:
|
||||
self.buttonSize = 75.0
|
||||
self.horizontalSecond = 103.0
|
||||
@ -65,6 +70,7 @@ struct PasscodeKeyboardLayout {
|
||||
self.size = CGSize(width: 281.0, height: 348.0)
|
||||
self.topOffset = 294.0
|
||||
self.biometricsOffset = 30.0
|
||||
self.deleteOffset = 20.0
|
||||
case .iPhoneXSMax:
|
||||
self.buttonSize = 85.0
|
||||
self.horizontalSecond = 115.0
|
||||
@ -75,6 +81,7 @@ struct PasscodeKeyboardLayout {
|
||||
self.size = CGSize(width: 315.0, height: 385.0)
|
||||
self.topOffset = 329.0
|
||||
self.biometricsOffset = 30.0
|
||||
self.deleteOffset = 20.0
|
||||
case .iPad, .iPadPro10Inch, .iPadPro11Inch, .iPadPro, .iPadPro3rdGen:
|
||||
self.buttonSize = 81.0
|
||||
self.horizontalSecond = 106.0
|
||||
@ -83,8 +90,9 @@ struct PasscodeKeyboardLayout {
|
||||
self.verticalThird = 202.0
|
||||
self.verticalFourth = 303.0
|
||||
self.size = CGSize(width: 293.0, height: 384.0)
|
||||
self.topOffset = 0.0
|
||||
self.topOffset = 120.0 + (layout.size.height - self.size.height - 120.0) / 2.0
|
||||
self.biometricsOffset = 30.0
|
||||
self.deleteOffset = 80.0
|
||||
}
|
||||
} else {
|
||||
self.buttonSize = 75.0
|
||||
@ -96,6 +104,7 @@ struct PasscodeKeyboardLayout {
|
||||
self.size = CGSize(width: 265.0, height: 339.0)
|
||||
self.topOffset = 0.0
|
||||
self.biometricsOffset = 30.0
|
||||
self.deleteOffset = 20.0
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -111,12 +120,12 @@ struct PasscodeLayout {
|
||||
self.layout = layout
|
||||
|
||||
let metrics = DeviceMetrics.forScreenSize(layout.size)
|
||||
self.keyboard = PasscodeKeyboardLayout(metrics: metrics)
|
||||
self.keyboard = PasscodeKeyboardLayout(layout: layout, metrics: metrics)
|
||||
if let metrics = metrics {
|
||||
switch metrics {
|
||||
case .iPhone4:
|
||||
self.titleOffset = 30.0
|
||||
self.subtitleOffset = 0.0
|
||||
self.subtitleOffset = -13.0
|
||||
self.inputFieldOffset = 70.0
|
||||
case .iPhone5:
|
||||
self.titleOffset = 50.0
|
||||
@ -139,9 +148,9 @@ struct PasscodeLayout {
|
||||
self.subtitleOffset = 0.0
|
||||
self.inputFieldOffset = 226.0
|
||||
case .iPad, .iPadPro10Inch, .iPadPro11Inch, .iPadPro, .iPadPro3rdGen:
|
||||
self.titleOffset = 0.0
|
||||
self.subtitleOffset = 0.0
|
||||
self.inputFieldOffset = 0.0
|
||||
self.titleOffset = self.keyboard.topOffset - 120.0
|
||||
self.subtitleOffset = -2.0
|
||||
self.inputFieldOffset = self.keyboard.topOffset - 76.0
|
||||
}
|
||||
} else {
|
||||
self.titleOffset = 100.0
|
||||
@ -154,7 +163,7 @@ struct PasscodeLayout {
|
||||
self.layout = layout
|
||||
|
||||
let metrics = DeviceMetrics.forScreenSize(layout.size)
|
||||
self.keyboard = PasscodeKeyboardLayout(metrics: metrics)
|
||||
self.keyboard = PasscodeKeyboardLayout(layout: layout, metrics: metrics)
|
||||
self.titleOffset = titleOffset
|
||||
self.subtitleOffset = subtitleOffset
|
||||
self.inputFieldOffset = inputFieldOffset
|
||||
|
||||
@ -33,6 +33,7 @@ final class PasscodeSetupControllerNode: ASDisplayNode {
|
||||
private let wrapperNode: ASDisplayNode
|
||||
|
||||
private let titleNode: ASTextNode
|
||||
private let subtitleNode: ASTextNode
|
||||
private let inputFieldNode: PasscodeEntryInputFieldNode
|
||||
private let inputFieldBackgroundNode: ASImageNode
|
||||
private let modeButtonNode: HighlightableButtonNode
|
||||
@ -62,6 +63,10 @@ final class PasscodeSetupControllerNode: ASDisplayNode {
|
||||
self.titleNode.isUserInteractionEnabled = false
|
||||
self.titleNode.displaysAsynchronously = false
|
||||
|
||||
self.subtitleNode = ASTextNode()
|
||||
self.subtitleNode.isUserInteractionEnabled = false
|
||||
self.subtitleNode.displaysAsynchronously = false
|
||||
|
||||
let passcodeType: PasscodeEntryFieldType
|
||||
switch self.mode {
|
||||
case let .entry(challenge):
|
||||
@ -95,6 +100,7 @@ final class PasscodeSetupControllerNode: ASDisplayNode {
|
||||
self.addSubnode(self.wrapperNode)
|
||||
|
||||
self.wrapperNode.addSubnode(self.titleNode)
|
||||
self.wrapperNode.addSubnode(self.subtitleNode)
|
||||
self.wrapperNode.addSubnode(self.inputFieldBackgroundNode)
|
||||
self.wrapperNode.addSubnode(self.inputFieldNode)
|
||||
self.wrapperNode.addSubnode(self.modeButtonNode)
|
||||
|
||||
@ -352,8 +352,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The
|
||||
|
||||
let previousTheme = Atomic<PresentationTheme?>(value: nil)
|
||||
|
||||
let signal = combineLatest(context.sharedContext.presentationData, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings]))
|
||||
|> deliverOnMainQueue
|
||||
let signal = combineLatest(context.sharedContext.presentationData |> deliverOnMainQueue, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings]) |> deliverOnMainQueue)
|
||||
|> map { presentationData, sharedData -> (ItemListControllerState, (ItemListNodeState<ThemeSettingsControllerEntry>, ThemeSettingsControllerEntry.ItemGenerationArguments)) in
|
||||
let theme: PresentationTheme
|
||||
let fontSize: PresentationFontSize
|
||||
@ -387,7 +386,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The
|
||||
let listState = ItemListNodeState(entries: themeSettingsControllerEntries(presentationData: presentationData, theme: theme, themeAccentColor: settings.themeAccentColor, autoNightSettings: settings.automaticThemeSwitchSetting, strings: presentationData.strings, wallpaper: wallpaper, fontSize: fontSize, dateTimeFormat: dateTimeFormat, largeEmoji: largeEmoji, disableAnimations: disableAnimations), style: .blocks, ensureVisibleItemTag: focusOnItemTag, animateChanges: false)
|
||||
|
||||
if previousTheme.swap(theme)?.name != theme.name {
|
||||
presentControllerImpl?(ThemeSettingsCrossfadeController())
|
||||
//presentControllerImpl?(ThemeSettingsCrossfadeController())
|
||||
}
|
||||
|
||||
return (controllerState, (listState, arguments))
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user