mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 14:45:21 +00:00
Peer sound and message removal update
This commit is contained in:
@@ -273,6 +273,10 @@ class ChatTimerScreenNode: ViewControllerTracingNode, UIScrollViewDelegate, UIPi
|
||||
private let cancelButton: HighlightableButtonNode
|
||||
private let doneButton: SolidRoundedButtonNode
|
||||
|
||||
private let disableButton: HighlightableButtonNode
|
||||
private let disableButtonTitle: ImmediateTextNode
|
||||
|
||||
private var initialTime: Int32?
|
||||
private var pickerView: TimerPickerView?
|
||||
|
||||
private var containerLayout: (ContainerViewLayout, CGFloat)?
|
||||
@@ -287,6 +291,7 @@ class ChatTimerScreenNode: ViewControllerTracingNode, UIScrollViewDelegate, UIPi
|
||||
self.presentationData = presentationData
|
||||
self.dismissByTapOutside = dismissByTapOutside
|
||||
self.mode = mode
|
||||
self.initialTime = currentTime
|
||||
|
||||
self.wrappingScrollNode = ASScrollNode()
|
||||
self.wrappingScrollNode.view.alwaysBounceVertical = true
|
||||
@@ -349,6 +354,22 @@ class ChatTimerScreenNode: ViewControllerTracingNode, UIScrollViewDelegate, UIPi
|
||||
self.doneButton = SolidRoundedButtonNode(theme: SolidRoundedButtonTheme(theme: self.presentationData.theme), height: 52.0, cornerRadius: 11.0, gloss: false)
|
||||
self.doneButton.title = self.presentationData.strings.Conversation_Timer_Send
|
||||
|
||||
self.disableButton = HighlightableButtonNode()
|
||||
self.disableButtonTitle = ImmediateTextNode()
|
||||
self.disableButton.addSubnode(self.disableButtonTitle)
|
||||
//TODO:localize
|
||||
self.disableButtonTitle.attributedText = NSAttributedString(string: "Disable Auto-Delete", font: Font.regular(17.0), textColor: self.presentationData.theme.list.itemAccentColor)
|
||||
self.disableButton.isHidden = true
|
||||
|
||||
switch self.mode {
|
||||
case .autoremove:
|
||||
if self.initialTime != nil {
|
||||
self.disableButton.isHidden = false
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
super.init()
|
||||
|
||||
self.backgroundColor = nil
|
||||
@@ -369,17 +390,24 @@ class ChatTimerScreenNode: ViewControllerTracingNode, UIScrollViewDelegate, UIPi
|
||||
self.contentContainerNode.addSubnode(self.textNode)
|
||||
self.contentContainerNode.addSubnode(self.cancelButton)
|
||||
self.contentContainerNode.addSubnode(self.doneButton)
|
||||
self.contentContainerNode.addSubnode(self.disableButton)
|
||||
|
||||
self.cancelButton.addTarget(self, action: #selector(self.cancelButtonPressed), forControlEvents: .touchUpInside)
|
||||
self.doneButton.pressed = { [weak self] in
|
||||
if let strongSelf = self, let pickerView = strongSelf.pickerView {
|
||||
strongSelf.doneButton.isUserInteractionEnabled = false
|
||||
if let pickerView = pickerView as? TimerCustomPickerView {
|
||||
strongSelf.completion?(timerValues[pickerView.selectedRow(inComponent: 0)])
|
||||
switch strongSelf.mode {
|
||||
case .sendTimer:
|
||||
strongSelf.completion?(timerValues[pickerView.selectedRow(inComponent: 0)])
|
||||
case .autoremove:
|
||||
let timeInterval = pickerView.selectedRow(inComponent: 0) * 24 * 60 * 60 + pickerView.selectedRow(inComponent: 1) * 60 * 60 + pickerView.selectedRow(inComponent: 2) * 60
|
||||
strongSelf.completion?(Int32(timeInterval))
|
||||
case .mute:
|
||||
break
|
||||
}
|
||||
} else if let pickerView = pickerView as? TimerDatePickerView {
|
||||
switch strongSelf.mode {
|
||||
case .autoremove:
|
||||
strongSelf.completion?(Int32(pickerView.countDownDuration))
|
||||
case .mute:
|
||||
let timeInterval = max(0, Int32(pickerView.date.timeIntervalSince1970) - Int32(Date().timeIntervalSince1970))
|
||||
strongSelf.completion?(timeInterval)
|
||||
@@ -390,9 +418,15 @@ class ChatTimerScreenNode: ViewControllerTracingNode, UIScrollViewDelegate, UIPi
|
||||
}
|
||||
}
|
||||
|
||||
self.disableButton.addTarget(self, action: #selector(self.disableButtonPressed), forControlEvents: .touchUpInside)
|
||||
|
||||
self.setupPickerView(currentTime: currentTime)
|
||||
}
|
||||
|
||||
@objc private func disableButtonPressed() {
|
||||
self.completion?(0)
|
||||
}
|
||||
|
||||
func setupPickerView(currentTime: Int32? = nil) {
|
||||
if let pickerView = self.pickerView {
|
||||
pickerView.removeFromSuperview()
|
||||
@@ -408,17 +442,24 @@ class ChatTimerScreenNode: ViewControllerTracingNode, UIScrollViewDelegate, UIPi
|
||||
self.contentContainerNode.view.addSubview(pickerView)
|
||||
self.pickerView = pickerView
|
||||
case .autoremove:
|
||||
let pickerView = TimerDatePickerView()
|
||||
pickerView.locale = localeWithStrings(self.presentationData.strings)
|
||||
pickerView.datePickerMode = .countDownTimer
|
||||
if #available(iOS 13.4, *) {
|
||||
pickerView.preferredDatePickerStyle = .wheels
|
||||
}
|
||||
pickerView.selectorColor = UIColor(rgb: 0xffffff, alpha: 0.18)
|
||||
pickerView.addTarget(self, action: #selector(self.dataPickerChanged), for: .valueChanged)
|
||||
let pickerView = TimerCustomPickerView()
|
||||
pickerView.dataSource = self
|
||||
pickerView.delegate = self
|
||||
|
||||
pickerView.selectorColor = self.presentationData.theme.list.itemPrimaryTextColor.withMultipliedAlpha(0.18)
|
||||
|
||||
self.contentContainerNode.view.addSubview(pickerView)
|
||||
self.pickerView = pickerView
|
||||
|
||||
if let value = self.initialTime {
|
||||
let days = value / (24 * 60 * 60)
|
||||
let hours = (value % (24 * 60 * 60)) / (60 * 60)
|
||||
let minutes = (value % (60 * 60)) / 60
|
||||
|
||||
pickerView.selectRow(Int(days), inComponent: 0, animated: false)
|
||||
pickerView.selectRow(Int(hours), inComponent: 1, animated: false)
|
||||
pickerView.selectRow(Int(minutes), inComponent: 2, animated: false)
|
||||
}
|
||||
case .mute:
|
||||
let pickerView = TimerDatePickerView()
|
||||
pickerView.locale = localeWithStrings(self.presentationData.strings)
|
||||
@@ -436,35 +477,87 @@ class ChatTimerScreenNode: ViewControllerTracingNode, UIScrollViewDelegate, UIPi
|
||||
}
|
||||
|
||||
@objc private func dataPickerChanged() {
|
||||
guard let _ = self.pickerView as? TimerDatePickerView else {
|
||||
return
|
||||
}
|
||||
|
||||
if let (layout, navigationBarHeight) = self.containerLayout {
|
||||
self.containerLayoutUpdated(layout, navigationBarHeight: navigationBarHeight, transition: .immediate)
|
||||
}
|
||||
}
|
||||
|
||||
func numberOfComponents(in pickerView: UIPickerView) -> Int {
|
||||
return 1
|
||||
switch self.mode {
|
||||
case .sendTimer:
|
||||
return 1
|
||||
case .autoremove:
|
||||
return 3
|
||||
case .mute:
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
|
||||
return timerValues.count
|
||||
switch self.mode {
|
||||
case .sendTimer:
|
||||
return timerValues.count
|
||||
case .autoremove:
|
||||
switch component {
|
||||
case 0:
|
||||
return 365
|
||||
case 1:
|
||||
return 24
|
||||
case 2:
|
||||
return 60
|
||||
default:
|
||||
return 0
|
||||
}
|
||||
case .mute:
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
|
||||
let value = timerValues[row]
|
||||
let string = timeIntervalString(strings: self.presentationData.strings, value: value)
|
||||
if let view = view as? TimerPickerItemView {
|
||||
switch self.mode {
|
||||
case .sendTimer:
|
||||
let value = timerValues[row]
|
||||
let string = timeIntervalString(strings: self.presentationData.strings, value: value)
|
||||
if let view = view as? TimerPickerItemView {
|
||||
view.value = (value, string)
|
||||
return view
|
||||
}
|
||||
|
||||
let view = TimerPickerItemView()
|
||||
view.value = (value, string)
|
||||
view.textColor = .white
|
||||
return view
|
||||
case .autoremove:
|
||||
let itemView: TimerPickerItemView
|
||||
if let current = view as? TimerPickerItemView {
|
||||
itemView = current
|
||||
} else {
|
||||
itemView = TimerPickerItemView()
|
||||
itemView.textColor = self.presentationData.theme.list.itemPrimaryTextColor
|
||||
}
|
||||
|
||||
let string: String
|
||||
switch component {
|
||||
case 0:
|
||||
string = dayIntervalString(strings: self.presentationData.strings, days: Int32(row))
|
||||
case 1:
|
||||
string = hoursIntervalString(strings: self.presentationData.strings, hours: Int32(row))
|
||||
case 2:
|
||||
string = minutesIntervalString(strings: self.presentationData.strings, minutes: Int32(row))
|
||||
default:
|
||||
preconditionFailure()
|
||||
}
|
||||
|
||||
itemView.value = (Int32(row), string)
|
||||
|
||||
return itemView
|
||||
case .mute:
|
||||
preconditionFailure()
|
||||
}
|
||||
|
||||
let view = TimerPickerItemView()
|
||||
view.value = (value, string)
|
||||
view.textColor = .white
|
||||
return view
|
||||
}
|
||||
|
||||
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
|
||||
self.dataPickerChanged()
|
||||
}
|
||||
|
||||
func updatePresentationData(_ presentationData: PresentationData) {
|
||||
@@ -575,11 +668,16 @@ class ChatTimerScreenNode: ViewControllerTracingNode, UIScrollViewDelegate, UIPi
|
||||
let cleanInsets = layout.insets(options: [.statusBar])
|
||||
insets.top = max(10.0, insets.top)
|
||||
|
||||
let buttonOffset: CGFloat = 0.0
|
||||
var buttonOffset: CGFloat = 0.0
|
||||
let bottomInset: CGFloat = 10.0 + cleanInsets.bottom
|
||||
let titleHeight: CGFloat = 54.0
|
||||
var contentHeight = titleHeight + bottomInset + 52.0 + 17.0
|
||||
let pickerHeight: CGFloat = min(216.0, layout.size.height - contentHeight)
|
||||
|
||||
if !self.disableButton.isHidden {
|
||||
buttonOffset += 52.0
|
||||
}
|
||||
|
||||
contentHeight = titleHeight + bottomInset + 52.0 + 17.0 + pickerHeight + buttonOffset
|
||||
|
||||
let width = horizontalContainerFillingSizeForLayout(layout: layout, sideInset: 0.0)
|
||||
@@ -612,11 +710,8 @@ class ChatTimerScreenNode: ViewControllerTracingNode, UIScrollViewDelegate, UIPi
|
||||
case .sendTimer:
|
||||
break
|
||||
case .autoremove:
|
||||
if let pickerView = self.pickerView as? TimerDatePickerView, pickerView.countDownDuration > 0.0 {
|
||||
self.doneButton.title = "Auto-Delete after \(timeIntervalString(strings: self.presentationData.strings, value: Int32(pickerView.countDownDuration)))"
|
||||
} else {
|
||||
self.doneButton.title = self.presentationData.strings.Common_Close
|
||||
}
|
||||
//TODO:localize
|
||||
self.doneButton.title = "Set Auto-Delete"
|
||||
case .mute:
|
||||
if let pickerView = self.pickerView as? TimerDatePickerView {
|
||||
let timeInterval = max(0, Int32(pickerView.date.timeIntervalSince1970) - Int32(Date().timeIntervalSince1970))
|
||||
@@ -635,7 +730,13 @@ class ChatTimerScreenNode: ViewControllerTracingNode, UIScrollViewDelegate, UIPi
|
||||
}
|
||||
|
||||
let doneButtonHeight = self.doneButton.updateLayout(width: contentFrame.width - buttonInset * 2.0, transition: transition)
|
||||
transition.updateFrame(node: self.doneButton, frame: CGRect(x: buttonInset, y: contentHeight - doneButtonHeight - insets.bottom - 16.0 - buttonOffset, width: contentFrame.width, height: doneButtonHeight))
|
||||
let doneButtonFrame = CGRect(x: buttonInset, y: contentHeight - doneButtonHeight - insets.bottom - 16.0 - buttonOffset, width: contentFrame.width, height: doneButtonHeight)
|
||||
transition.updateFrame(node: self.doneButton, frame: doneButtonFrame)
|
||||
|
||||
let disableButtonTitleSize = self.disableButtonTitle.updateLayout(CGSize(width: contentFrame.width, height: doneButtonHeight))
|
||||
let disableButtonFrame = CGRect(origin: CGPoint(x: doneButtonFrame.minX, y: doneButtonFrame.maxY), size: CGSize(width: contentFrame.width - buttonInset * 2.0, height: doneButtonHeight))
|
||||
transition.updateFrame(node: self.disableButton, frame: disableButtonFrame)
|
||||
transition.updateFrame(node: self.disableButtonTitle, frame: CGRect(origin: CGPoint(x: floor((disableButtonFrame.width - disableButtonTitleSize.width) / 2.0), y: floor((disableButtonFrame.height - disableButtonTitleSize.height) / 2.0)), size: disableButtonTitleSize))
|
||||
|
||||
self.pickerView?.frame = CGRect(origin: CGPoint(x: 0.0, y: 54.0), size: CGSize(width: contentFrame.width, height: pickerHeight))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user