Merge commit 'dc13584ef5aa4455340c27a2d937edaab86ef431'

This commit is contained in:
Peter 2019-04-29 18:04:25 +04:00
commit 2f3ec197f1
8 changed files with 57 additions and 37 deletions

View File

@ -47,6 +47,21 @@ private let gradientColors: [NSArray] = [
[UIColor(rgb: 0xd669ed).cgColor, UIColor(rgb: 0xe0a2f3).cgColor], [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 = [ private let grayscaleColors: NSArray = [
UIColor(rgb: 0xb1b1b1).cgColor, UIColor(rgb: 0xcdcdcd).cgColor UIColor(rgb: 0xb1b1b1).cgColor, UIColor(rgb: 0xcdcdcd).cgColor
] ]
@ -210,34 +225,21 @@ public final class AvatarNode: ASDisplayNode {
return return
} }
var backgroundColor = theme.chatList.neutralAvatarColor
let animationBackgroundNode = ASImageNode() let animationBackgroundNode = ASImageNode()
animationBackgroundNode.frame = self.imageNode.frame animationBackgroundNode.frame = self.imageNode.frame
var animationColor = theme.chatList.neutralAvatarColor if let overrideImage = self.overrideImage, case let .archivedChatsIcon(hiddenByDefault) = overrideImage {
if let overrideImage = self.overrideImage { if hiddenByDefault {
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:
animationBackgroundNode.image = generateFilledCircleImage(diameter: self.imageNode.frame.width, color: theme.chatList.neutralAvatarColor) 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) 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 animationNode.completion = { [weak animationBackgroundNode, weak self] in
self?.imageNode.isHidden = false self?.imageNode.isHidden = false
animationBackgroundNode?.removeFromSupernode() animationBackgroundNode?.removeFromSupernode()

View File

@ -230,7 +230,7 @@ private func groupReferenceRevealOptions(strings: PresentationStrings, theme: Pr
var options: [ItemListRevealOption] = [] var options: [ItemListRevealOption] = []
if !isEditing { if !isEditing {
if hiddenByDefault { 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 { } 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)) 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))
} }

View File

@ -3,7 +3,7 @@ import UIKit
private func makeDefaultPresentationTheme(accentColor: UIColor, serviceBackgroundColor: UIColor, day: Bool) -> PresentationTheme { private func makeDefaultPresentationTheme(accentColor: UIColor, serviceBackgroundColor: UIColor, day: Bool) -> PresentationTheme {
let destructiveColor: UIColor = UIColor(rgb: 0xff3b30) 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 secretColor: UIColor = UIColor(rgb: 0x00B12C)
let rootStatusBar = PresentationThemeRootNavigationStatusBar( let rootStatusBar = PresentationThemeRootNavigationStatusBar(

View File

@ -163,6 +163,8 @@ final public class PasscodeEntryController: ViewController {
override public func viewDidAppear(_ animated: Bool) { override public func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated) super.viewDidAppear(animated)
self.view.disablesInteractiveTransitionGestureRecognizer = true
self.controllerNode.activateInput() self.controllerNode.activateInput()
if self.arguments.animated { if self.arguments.animated {
let iconFrame = self.arguments.lockIconInitialFrame() let iconFrame = self.arguments.lockIconInitialFrame()

View File

@ -302,12 +302,14 @@ final class PasscodeEntryControllerNode: ASDisplayNode {
switch self.passcodeType { switch self.passcodeType {
case .digits6, .digits4: case .digits6, .digits4:
self.keyboardNode.alpha = 1.0 self.keyboardNode.alpha = 1.0
self.deleteButtonNode.alpha = 1.0
case .alphanumeric: case .alphanumeric:
self.keyboardNode.alpha = 0.0 self.keyboardNode.alpha = 0.0
self.deleteButtonNode.alpha = 0.0
} }
let deleteSize = self.deleteButtonNode.measure(layout.size) 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) { if let biometricIcon = self.biometricButtonNode.image(for: .normal) {
var biometricY: CGFloat = 0.0 var biometricY: CGFloat = 0.0

View File

@ -11,8 +11,9 @@ struct PasscodeKeyboardLayout {
let size: CGSize let size: CGSize
let topOffset: CGFloat let topOffset: CGFloat
let biometricsOffset: CGFloat let biometricsOffset: CGFloat
let deleteOffset: CGFloat
fileprivate init(metrics: DeviceMetrics?) { fileprivate init(layout: ContainerViewLayout, metrics: DeviceMetrics?) {
if let metrics = metrics { if let metrics = metrics {
switch metrics { switch metrics {
case .iPhone4: case .iPhone4:
@ -23,8 +24,9 @@ struct PasscodeKeyboardLayout {
self.verticalThird = 176.0 self.verticalThird = 176.0
self.verticalFourth = 264.0 self.verticalFourth = 264.0
self.size = CGSize(width: 265.0, height: 339.0) self.size = CGSize(width: 265.0, height: 339.0)
self.topOffset = 0.0 self.topOffset = 122.0
self.biometricsOffset = 0.0 self.biometricsOffset = 0.0
self.deleteOffset = 45.0
case .iPhone5: case .iPhone5:
self.buttonSize = 75.0 self.buttonSize = 75.0
self.horizontalSecond = 95.0 self.horizontalSecond = 95.0
@ -35,6 +37,7 @@ struct PasscodeKeyboardLayout {
self.size = CGSize(width: 265.0, height: 339.0) self.size = CGSize(width: 265.0, height: 339.0)
self.topOffset = 155.0 self.topOffset = 155.0
self.biometricsOffset = 23.0 self.biometricsOffset = 23.0
self.deleteOffset = 20.0
case .iPhone6: case .iPhone6:
self.buttonSize = 75.0 self.buttonSize = 75.0
self.horizontalSecond = 103.0 self.horizontalSecond = 103.0
@ -45,6 +48,7 @@ struct PasscodeKeyboardLayout {
self.size = CGSize(width: 281.0, height: 348.0) self.size = CGSize(width: 281.0, height: 348.0)
self.topOffset = 221.0 self.topOffset = 221.0
self.biometricsOffset = 30.0 self.biometricsOffset = 30.0
self.deleteOffset = 20.0
case .iPhone6Plus: case .iPhone6Plus:
self.buttonSize = 85.0 self.buttonSize = 85.0
self.horizontalSecond = 115.0 self.horizontalSecond = 115.0
@ -55,6 +59,7 @@ struct PasscodeKeyboardLayout {
self.size = CGSize(width: 315.0, height: 385.0) self.size = CGSize(width: 315.0, height: 385.0)
self.topOffset = 226.0 self.topOffset = 226.0
self.biometricsOffset = 30.0 self.biometricsOffset = 30.0
self.deleteOffset = 20.0
case .iPhoneX: case .iPhoneX:
self.buttonSize = 75.0 self.buttonSize = 75.0
self.horizontalSecond = 103.0 self.horizontalSecond = 103.0
@ -65,6 +70,7 @@ struct PasscodeKeyboardLayout {
self.size = CGSize(width: 281.0, height: 348.0) self.size = CGSize(width: 281.0, height: 348.0)
self.topOffset = 294.0 self.topOffset = 294.0
self.biometricsOffset = 30.0 self.biometricsOffset = 30.0
self.deleteOffset = 20.0
case .iPhoneXSMax: case .iPhoneXSMax:
self.buttonSize = 85.0 self.buttonSize = 85.0
self.horizontalSecond = 115.0 self.horizontalSecond = 115.0
@ -75,6 +81,7 @@ struct PasscodeKeyboardLayout {
self.size = CGSize(width: 315.0, height: 385.0) self.size = CGSize(width: 315.0, height: 385.0)
self.topOffset = 329.0 self.topOffset = 329.0
self.biometricsOffset = 30.0 self.biometricsOffset = 30.0
self.deleteOffset = 20.0
case .iPad, .iPadPro10Inch, .iPadPro11Inch, .iPadPro, .iPadPro3rdGen: case .iPad, .iPadPro10Inch, .iPadPro11Inch, .iPadPro, .iPadPro3rdGen:
self.buttonSize = 81.0 self.buttonSize = 81.0
self.horizontalSecond = 106.0 self.horizontalSecond = 106.0
@ -83,8 +90,9 @@ struct PasscodeKeyboardLayout {
self.verticalThird = 202.0 self.verticalThird = 202.0
self.verticalFourth = 303.0 self.verticalFourth = 303.0
self.size = CGSize(width: 293.0, height: 384.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.biometricsOffset = 30.0
self.deleteOffset = 80.0
} }
} else { } else {
self.buttonSize = 75.0 self.buttonSize = 75.0
@ -96,6 +104,7 @@ struct PasscodeKeyboardLayout {
self.size = CGSize(width: 265.0, height: 339.0) self.size = CGSize(width: 265.0, height: 339.0)
self.topOffset = 0.0 self.topOffset = 0.0
self.biometricsOffset = 30.0 self.biometricsOffset = 30.0
self.deleteOffset = 20.0
} }
} }
} }
@ -111,12 +120,12 @@ struct PasscodeLayout {
self.layout = layout self.layout = layout
let metrics = DeviceMetrics.forScreenSize(layout.size) let metrics = DeviceMetrics.forScreenSize(layout.size)
self.keyboard = PasscodeKeyboardLayout(metrics: metrics) self.keyboard = PasscodeKeyboardLayout(layout: layout, metrics: metrics)
if let metrics = metrics { if let metrics = metrics {
switch metrics { switch metrics {
case .iPhone4: case .iPhone4:
self.titleOffset = 30.0 self.titleOffset = 30.0
self.subtitleOffset = 0.0 self.subtitleOffset = -13.0
self.inputFieldOffset = 70.0 self.inputFieldOffset = 70.0
case .iPhone5: case .iPhone5:
self.titleOffset = 50.0 self.titleOffset = 50.0
@ -139,9 +148,9 @@ struct PasscodeLayout {
self.subtitleOffset = 0.0 self.subtitleOffset = 0.0
self.inputFieldOffset = 226.0 self.inputFieldOffset = 226.0
case .iPad, .iPadPro10Inch, .iPadPro11Inch, .iPadPro, .iPadPro3rdGen: case .iPad, .iPadPro10Inch, .iPadPro11Inch, .iPadPro, .iPadPro3rdGen:
self.titleOffset = 0.0 self.titleOffset = self.keyboard.topOffset - 120.0
self.subtitleOffset = 0.0 self.subtitleOffset = -2.0
self.inputFieldOffset = 0.0 self.inputFieldOffset = self.keyboard.topOffset - 76.0
} }
} else { } else {
self.titleOffset = 100.0 self.titleOffset = 100.0
@ -154,7 +163,7 @@ struct PasscodeLayout {
self.layout = layout self.layout = layout
let metrics = DeviceMetrics.forScreenSize(layout.size) let metrics = DeviceMetrics.forScreenSize(layout.size)
self.keyboard = PasscodeKeyboardLayout(metrics: metrics) self.keyboard = PasscodeKeyboardLayout(layout: layout, metrics: metrics)
self.titleOffset = titleOffset self.titleOffset = titleOffset
self.subtitleOffset = subtitleOffset self.subtitleOffset = subtitleOffset
self.inputFieldOffset = inputFieldOffset self.inputFieldOffset = inputFieldOffset

View File

@ -33,6 +33,7 @@ final class PasscodeSetupControllerNode: ASDisplayNode {
private let wrapperNode: ASDisplayNode private let wrapperNode: ASDisplayNode
private let titleNode: ASTextNode private let titleNode: ASTextNode
private let subtitleNode: ASTextNode
private let inputFieldNode: PasscodeEntryInputFieldNode private let inputFieldNode: PasscodeEntryInputFieldNode
private let inputFieldBackgroundNode: ASImageNode private let inputFieldBackgroundNode: ASImageNode
private let modeButtonNode: HighlightableButtonNode private let modeButtonNode: HighlightableButtonNode
@ -62,6 +63,10 @@ final class PasscodeSetupControllerNode: ASDisplayNode {
self.titleNode.isUserInteractionEnabled = false self.titleNode.isUserInteractionEnabled = false
self.titleNode.displaysAsynchronously = false self.titleNode.displaysAsynchronously = false
self.subtitleNode = ASTextNode()
self.subtitleNode.isUserInteractionEnabled = false
self.subtitleNode.displaysAsynchronously = false
let passcodeType: PasscodeEntryFieldType let passcodeType: PasscodeEntryFieldType
switch self.mode { switch self.mode {
case let .entry(challenge): case let .entry(challenge):
@ -95,6 +100,7 @@ final class PasscodeSetupControllerNode: ASDisplayNode {
self.addSubnode(self.wrapperNode) self.addSubnode(self.wrapperNode)
self.wrapperNode.addSubnode(self.titleNode) self.wrapperNode.addSubnode(self.titleNode)
self.wrapperNode.addSubnode(self.subtitleNode)
self.wrapperNode.addSubnode(self.inputFieldBackgroundNode) self.wrapperNode.addSubnode(self.inputFieldBackgroundNode)
self.wrapperNode.addSubnode(self.inputFieldNode) self.wrapperNode.addSubnode(self.inputFieldNode)
self.wrapperNode.addSubnode(self.modeButtonNode) self.wrapperNode.addSubnode(self.modeButtonNode)

View File

@ -352,8 +352,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The
let previousTheme = Atomic<PresentationTheme?>(value: nil) let previousTheme = Atomic<PresentationTheme?>(value: nil)
let signal = combineLatest(context.sharedContext.presentationData, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings])) let signal = combineLatest(context.sharedContext.presentationData |> deliverOnMainQueue, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings]) |> deliverOnMainQueue)
|> deliverOnMainQueue
|> map { presentationData, sharedData -> (ItemListControllerState, (ItemListNodeState<ThemeSettingsControllerEntry>, ThemeSettingsControllerEntry.ItemGenerationArguments)) in |> map { presentationData, sharedData -> (ItemListControllerState, (ItemListNodeState<ThemeSettingsControllerEntry>, ThemeSettingsControllerEntry.ItemGenerationArguments)) in
let theme: PresentationTheme let theme: PresentationTheme
let fontSize: PresentationFontSize 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) 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 { if previousTheme.swap(theme)?.name != theme.name {
presentControllerImpl?(ThemeSettingsCrossfadeController()) //presentControllerImpl?(ThemeSettingsCrossfadeController())
} }
return (controllerState, (listState, arguments)) return (controllerState, (listState, arguments))