diff --git a/TelegramUI/AvatarNode.swift b/TelegramUI/AvatarNode.swift index 49f0e12da8..71a6e5f491 100644 --- a/TelegramUI/AvatarNode.swift +++ b/TelegramUI/AvatarNode.swift @@ -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: - animationBackgroundNode.image = generateFilledCircleImage(diameter: self.imageNode.frame.width, color: theme.chatList.neutralAvatarColor) + 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() diff --git a/TelegramUI/ChatListItem.swift b/TelegramUI/ChatListItem.swift index 1cf2041342..0f59c5968c 100644 --- a/TelegramUI/ChatListItem.swift +++ b/TelegramUI/ChatListItem.swift @@ -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)) } diff --git a/TelegramUI/DefaultPresentationTheme.swift b/TelegramUI/DefaultPresentationTheme.swift index d07aee83d8..530013c4d5 100644 --- a/TelegramUI/DefaultPresentationTheme.swift +++ b/TelegramUI/DefaultPresentationTheme.swift @@ -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( diff --git a/TelegramUI/PasscodeEntryController.swift b/TelegramUI/PasscodeEntryController.swift index a9f7fc02a1..863a9957f8 100644 --- a/TelegramUI/PasscodeEntryController.swift +++ b/TelegramUI/PasscodeEntryController.swift @@ -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() diff --git a/TelegramUI/PasscodeEntryControllerNode.swift b/TelegramUI/PasscodeEntryControllerNode.swift index 967586e0b3..80518323cd 100644 --- a/TelegramUI/PasscodeEntryControllerNode.swift +++ b/TelegramUI/PasscodeEntryControllerNode.swift @@ -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 diff --git a/TelegramUI/PasscodeLayout.swift b/TelegramUI/PasscodeLayout.swift index cfcdf5106b..45fdcae12c 100644 --- a/TelegramUI/PasscodeLayout.swift +++ b/TelegramUI/PasscodeLayout.swift @@ -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 diff --git a/TelegramUI/PasscodeSetupControllerNode.swift b/TelegramUI/PasscodeSetupControllerNode.swift index 9ccd620cf7..d6ae9f25e0 100644 --- a/TelegramUI/PasscodeSetupControllerNode.swift +++ b/TelegramUI/PasscodeSetupControllerNode.swift @@ -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) diff --git a/TelegramUI/ThemeSettingsController.swift b/TelegramUI/ThemeSettingsController.swift index ea749ec45a..e1b12e0df9 100644 --- a/TelegramUI/ThemeSettingsController.swift +++ b/TelegramUI/ThemeSettingsController.swift @@ -352,8 +352,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The let previousTheme = Atomic(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.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))