mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
522 lines
27 KiB
Swift
522 lines
27 KiB
Swift
import Foundation
|
|
import UIKit
|
|
import LegacyComponents
|
|
import Display
|
|
import SwiftSignalKit
|
|
import Postbox
|
|
import TelegramCore
|
|
import TelegramPresentationData
|
|
import DeviceAccess
|
|
import AccountContext
|
|
import LegacyUI
|
|
import SaveToCameraRoll
|
|
|
|
public func defaultVideoPresetForContext(_ context: AccountContext) -> TGMediaVideoConversionPreset {
|
|
var networkType: NetworkType = .wifi
|
|
let _ = (context.account.networkType
|
|
|> take(1)).start(next: { value in
|
|
networkType = value
|
|
})
|
|
|
|
let autodownloadSettings = context.sharedContext.currentAutodownloadSettings.with { $0 }
|
|
let presetSettings: AutodownloadPresetSettings
|
|
switch networkType {
|
|
case .wifi:
|
|
presetSettings = autodownloadSettings.highPreset
|
|
default:
|
|
presetSettings = autodownloadSettings.mediumPreset
|
|
}
|
|
|
|
let effectiveValue: Int
|
|
if presetSettings.videoUploadMaxbitrate == 0 {
|
|
effectiveValue = 0
|
|
} else {
|
|
effectiveValue = Int(presetSettings.videoUploadMaxbitrate) * 5 / 100
|
|
}
|
|
|
|
switch effectiveValue {
|
|
case 0:
|
|
return TGMediaVideoConversionPresetCompressedMedium
|
|
case 1:
|
|
return TGMediaVideoConversionPresetCompressedVeryLow
|
|
case 2:
|
|
return TGMediaVideoConversionPresetCompressedLow
|
|
case 3:
|
|
return TGMediaVideoConversionPresetCompressedMedium
|
|
case 4:
|
|
return TGMediaVideoConversionPresetCompressedHigh
|
|
case 5:
|
|
return TGMediaVideoConversionPresetCompressedVeryHigh
|
|
default:
|
|
return TGMediaVideoConversionPresetCompressedMedium
|
|
}
|
|
}
|
|
|
|
public enum LegacyAttachmentMenuMediaEditing {
|
|
case none
|
|
case imageOrVideo(AnyMediaReference?)
|
|
case file
|
|
}
|
|
|
|
public func legacyMediaEditor(context: AccountContext, peer: Peer, media: AnyMediaReference, initialCaption: NSAttributedString, snapshots: [UIView], transitionCompletion: (() -> Void)?, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?, getCaptionPanelView: @escaping () -> TGCaptionPanelView?, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, present: @escaping (ViewController, Any?) -> Void) {
|
|
let _ = (fetchMediaData(context: context, postbox: context.account.postbox, mediaReference: media)
|
|
|> deliverOnMainQueue).start(next: { (value, isImage) in
|
|
guard case let .data(data) = value, data.complete else {
|
|
return
|
|
}
|
|
|
|
let item: TGMediaEditableItem & TGMediaSelectableItem
|
|
if let image = UIImage(contentsOfFile: data.path) {
|
|
item = TGCameraCapturedPhoto(existing: image)
|
|
} else {
|
|
item = TGCameraCapturedVideo(url: URL(fileURLWithPath: data.path))
|
|
}
|
|
|
|
let paintStickersContext = LegacyPaintStickersContext(context: context)
|
|
paintStickersContext.captionPanelView = {
|
|
return getCaptionPanelView()
|
|
}
|
|
paintStickersContext.presentStickersController = { completion in
|
|
return presentStickers({ file, animated, view, rect in
|
|
let coder = PostboxEncoder()
|
|
coder.encodeRootObject(file)
|
|
completion?(coder.makeData(), animated, view, rect)
|
|
})
|
|
}
|
|
|
|
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
|
let recipientName = EnginePeer(peer).displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
|
|
|
let legacyController = LegacyController(presentation: .custom, theme: presentationData.theme, initialLayout: nil)
|
|
legacyController.blocksBackgroundWhenInOverlay = true
|
|
legacyController.acceptsFocusWhenInOverlay = true
|
|
legacyController.statusBar.statusBarStyle = .Ignore
|
|
legacyController.controllerLoaded = { [weak legacyController] in
|
|
legacyController?.view.disablesInteractiveTransitionGestureRecognizer = true
|
|
}
|
|
|
|
let emptyController = LegacyEmptyController(context: legacyController.context)!
|
|
emptyController.navigationBarShouldBeHidden = true
|
|
let navigationController = makeLegacyNavigationController(rootController: emptyController)
|
|
navigationController.setNavigationBarHidden(true, animated: false)
|
|
legacyController.bind(controller: navigationController)
|
|
|
|
legacyController.enableSizeClassSignal = true
|
|
|
|
present(legacyController, nil)
|
|
|
|
TGPhotoVideoEditor.present(with: legacyController.context, controller: emptyController, caption: initialCaption, withItem: item, paint: true, recipientName: recipientName, stickersContext: paintStickersContext, snapshots: snapshots as [Any], immediate: transitionCompletion != nil, appeared: {
|
|
transitionCompletion?()
|
|
}, completion: { result, editingContext in
|
|
let nativeGenerator = legacyAssetPickerItemGenerator()
|
|
var selectableResult: TGMediaSelectableItem?
|
|
if let result = result {
|
|
selectableResult = unsafeDowncast(result, to: TGMediaSelectableItem.self)
|
|
}
|
|
let signals = TGCameraController.resultSignals(for: nil, editingContext: editingContext, currentItem: selectableResult, storeAssets: false, saveEditedPhotos: false, descriptionGenerator: { _1, _2, _3 in
|
|
nativeGenerator(_1, _2, _3, nil)
|
|
})
|
|
sendMessagesWithSignals(signals, false, 0)
|
|
}, dismissed: { [weak legacyController] in
|
|
legacyController?.dismiss()
|
|
})
|
|
})
|
|
}
|
|
|
|
public func legacyAttachmentMenu(context: AccountContext, peer: Peer, chatLocation: ChatLocation, editMediaOptions: LegacyAttachmentMenuMediaEditing?, saveEditedPhotos: Bool, allowGrouping: Bool, hasSchedule: Bool, canSendPolls: Bool, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>), parentController: LegacyController, recentlyUsedInlineBots: [Peer], initialCaption: NSAttributedString, openGallery: @escaping () -> Void, openCamera: @escaping (TGAttachmentCameraView?, TGMenuSheetController?) -> Void, openFileGallery: @escaping () -> Void, openWebSearch: @escaping () -> Void, openMap: @escaping () -> Void, openContacts: @escaping () -> Void, openPoll: @escaping () -> Void, presentSelectionLimitExceeded: @escaping () -> Void, presentCantSendMultipleFiles: @escaping () -> Void, presentJpegConversionAlert: @escaping (@escaping (Bool) -> Void) -> Void, presentSchedulePicker: @escaping (@escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32, ((String) -> UIView?)?, @escaping () -> Void) -> Void, selectRecentlyUsedInlineBot: @escaping (Peer) -> Void, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?, getCaptionPanelView: @escaping () -> TGCaptionPanelView?, present: @escaping (ViewController, Any?) -> Void) -> TGMenuSheetController {
|
|
let defaultVideoPreset = defaultVideoPresetForContext(context)
|
|
UserDefaults.standard.set(defaultVideoPreset.rawValue as NSNumber, forKey: "TG_preferredVideoPreset_v0")
|
|
|
|
let presentationData = updatedPresentationData.initial
|
|
let actionSheetTheme = ActionSheetControllerTheme(presentationData: presentationData)
|
|
let fontSize = floor(actionSheetTheme.baseFontSize * 20.0 / 17.0)
|
|
|
|
let isSecretChat = peer.id.namespace == Namespaces.Peer.SecretChat
|
|
|
|
let controller = TGMenuSheetController(context: parentController.context, dark: false)!
|
|
controller.dismissesByOutsideTap = true
|
|
controller.hasSwipeGesture = true
|
|
controller.maxHeight = 445.0
|
|
controller.forceFullScreen = true
|
|
|
|
var itemViews: [Any] = []
|
|
|
|
var editing = false
|
|
var canSendImageOrVideo = false
|
|
var canEditFile = false
|
|
var editCurrentMedia: AnyMediaReference?
|
|
if let editMediaOptions = editMediaOptions {
|
|
switch editMediaOptions {
|
|
case .none:
|
|
break
|
|
case let .imageOrVideo(anyReference):
|
|
editCurrentMedia = anyReference
|
|
case .file:
|
|
canEditFile = true
|
|
}
|
|
canSendImageOrVideo = true
|
|
editing = true
|
|
} else {
|
|
canSendImageOrVideo = true
|
|
}
|
|
|
|
var carouselItemView: TGAttachmentCarouselItemView?
|
|
|
|
var underlyingViews: [UIView] = []
|
|
|
|
var selectionLimit: Int32 = 100
|
|
var slowModeEnabled = false
|
|
if let channel = peer as? TelegramChannel, channel.isRestrictedBySlowmode {
|
|
slowModeEnabled = true
|
|
selectionLimit = 10
|
|
}
|
|
|
|
let paintStickersContext = LegacyPaintStickersContext(context: context)
|
|
paintStickersContext.captionPanelView = {
|
|
return getCaptionPanelView()
|
|
}
|
|
paintStickersContext.presentStickersController = { completion in
|
|
return presentStickers({ file, animated, view, rect in
|
|
let coder = PostboxEncoder()
|
|
coder.encodeRootObject(file)
|
|
completion?(coder.makeData(), animated, view, rect)
|
|
})
|
|
}
|
|
|
|
if canSendImageOrVideo {
|
|
let carouselItem = TGAttachmentCarouselItemView(context: parentController.context, camera: PGCamera.cameraAvailable(), selfPortrait: false, forProfilePhoto: false, assetType: TGMediaAssetAnyType, saveEditedPhotos: !isSecretChat && saveEditedPhotos, allowGrouping: editMediaOptions == nil && allowGrouping, allowSelection: editMediaOptions == nil, allowEditing: true, document: false, selectionLimit: selectionLimit)!
|
|
carouselItemView = carouselItem
|
|
carouselItem.stickersContext = paintStickersContext
|
|
carouselItem.recipientName = EnginePeer(peer).displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
|
var openedCamera = false
|
|
controller.willDismiss = { [weak carouselItem] _ in
|
|
if let carouselItem = carouselItem, !openedCamera {
|
|
carouselItem.saveStartImage()
|
|
}
|
|
}
|
|
carouselItem.cameraPressed = { [weak controller, weak parentController] cameraView in
|
|
openedCamera = true
|
|
if let controller = controller {
|
|
if let parentController = parentController, parentController.context.currentlyInSplitView() {
|
|
return
|
|
}
|
|
|
|
DeviceAccess.authorizeAccess(to: .camera(.video), presentationData: updatedPresentationData.initial, present: context.sharedContext.presentGlobalController, openSettings: context.sharedContext.applicationBindings.openSettings, { value in
|
|
if value {
|
|
openCamera(cameraView, controller)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
carouselItem.selectionLimitExceeded = {
|
|
presentSelectionLimitExceeded()
|
|
}
|
|
if peer.id != context.account.peerId {
|
|
if peer is TelegramUser {
|
|
carouselItem.hasTimer = hasSchedule
|
|
}
|
|
carouselItem.hasSilentPosting = true
|
|
}
|
|
carouselItem.hasSchedule = hasSchedule
|
|
carouselItem.reminder = peer.id == context.account.peerId
|
|
carouselItem.presentScheduleController = { done in
|
|
presentSchedulePicker { time in
|
|
done?(time)
|
|
}
|
|
}
|
|
carouselItem.presentTimerController = { done in
|
|
presentTimerPicker { time in
|
|
done?(time)
|
|
}
|
|
}
|
|
carouselItem.sendPressed = { [weak controller, weak carouselItem] currentItem, asFiles, silentPosting, scheduleTime, isFromPicker in
|
|
if let controller = controller, let carouselItem = carouselItem {
|
|
let intent: TGMediaAssetsControllerIntent = asFiles ? TGMediaAssetsControllerSendFileIntent : TGMediaAssetsControllerSendMediaIntent
|
|
|
|
var hasHeic = false
|
|
var allItems = carouselItem.selectionContext?.selectedItems() ?? []
|
|
if let currentItem = currentItem {
|
|
allItems.append(currentItem)
|
|
}
|
|
for item in allItems {
|
|
if item is TGCameraCapturedVideo {
|
|
} else if let asset = item as? TGMediaAsset, asset.uniformTypeIdentifier.contains("heic") {
|
|
hasHeic = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if slowModeEnabled, allItems.count > 1 {
|
|
presentCantSendMultipleFiles()
|
|
} else {
|
|
let process: (Bool) -> Void = { convert in
|
|
let signals = TGMediaAssetsController.resultSignals(for: carouselItem.selectionContext, editingContext: carouselItem.editingContext, intent: intent, currentItem: currentItem, storeAssets: true, convertToJpeg: convert, descriptionGenerator: legacyAssetPickerItemGenerator(), saveEditedPhotos: saveEditedPhotos)
|
|
sendMessagesWithSignals(signals, silentPosting, scheduleTime, isFromPicker ? nil : { [weak carouselItem] uniqueId in
|
|
if let carouselItem = carouselItem {
|
|
return carouselItem.getItemSnapshot(uniqueId)
|
|
}
|
|
return nil
|
|
}, { [weak controller] in
|
|
controller?.dismiss(animated: true)
|
|
})
|
|
}
|
|
if hasHeic && asFiles {
|
|
presentJpegConversionAlert({ convert in
|
|
process(convert)
|
|
})
|
|
} else {
|
|
process(false)
|
|
}
|
|
|
|
}
|
|
}
|
|
};
|
|
carouselItem.allowCaptions = true
|
|
if !initialCaption.string.isEmpty {
|
|
carouselItem.editingContext.setForcedCaption(initialCaption)
|
|
}
|
|
itemViews.append(carouselItem)
|
|
|
|
let galleryItem = TGMenuSheetButtonItemView(title: editing ? presentationData.strings.Conversation_EditingMessageMediaChange : presentationData.strings.AttachmentMenu_PhotoOrVideo, type: TGMenuSheetButtonTypeDefault, fontSize: fontSize, action: { [weak controller] in
|
|
controller?.dismiss(animated: true)
|
|
openGallery()
|
|
})!
|
|
if !editing {
|
|
galleryItem.longPressAction = { [weak controller] in
|
|
if let controller = controller {
|
|
controller.dismiss(animated: true)
|
|
}
|
|
openWebSearch()
|
|
}
|
|
}
|
|
itemViews.append(galleryItem)
|
|
|
|
underlyingViews.append(galleryItem)
|
|
}
|
|
|
|
if !editing {
|
|
let fileItem = TGMenuSheetButtonItemView(title: presentationData.strings.AttachmentMenu_File, type: TGMenuSheetButtonTypeDefault, fontSize: fontSize, action: { [weak controller] in
|
|
controller?.dismiss(animated: true)
|
|
openFileGallery()
|
|
})!
|
|
itemViews.append(fileItem)
|
|
underlyingViews.append(fileItem)
|
|
}
|
|
|
|
if canEditFile {
|
|
let fileItem = TGMenuSheetButtonItemView(title: presentationData.strings.AttachmentMenu_File, type: TGMenuSheetButtonTypeDefault, fontSize: fontSize, action: { [weak controller] in
|
|
controller?.dismiss(animated: true)
|
|
openFileGallery()
|
|
})!
|
|
itemViews.append(fileItem)
|
|
}
|
|
|
|
if let editCurrentMedia = editCurrentMedia {
|
|
let title: String
|
|
if editCurrentMedia.media is TelegramMediaImage {
|
|
title = presentationData.strings.Conversation_EditingMessageMediaEditCurrentPhoto
|
|
} else {
|
|
title = presentationData.strings.Conversation_EditingMessageMediaEditCurrentVideo
|
|
}
|
|
let editCurrentItem = TGMenuSheetButtonItemView(title: title, type: TGMenuSheetButtonTypeDefault, fontSize: fontSize, action: { [weak controller] in
|
|
controller?.dismiss(animated: true)
|
|
|
|
let _ = (fetchMediaData(context: context, postbox: context.account.postbox, mediaReference: editCurrentMedia)
|
|
|> deliverOnMainQueue).start(next: { (value, isImage) in
|
|
guard case let .data(data) = value, data.complete else {
|
|
return
|
|
}
|
|
|
|
let item: TGMediaEditableItem & TGMediaSelectableItem
|
|
if let image = UIImage(contentsOfFile: data.path) {
|
|
item = TGCameraCapturedPhoto(existing: image)
|
|
} else {
|
|
item = TGCameraCapturedVideo(url: URL(fileURLWithPath: data.path))
|
|
}
|
|
|
|
let legacyController = LegacyController(presentation: .custom, theme: presentationData.theme, initialLayout: nil)
|
|
legacyController.statusBar.statusBarStyle = .Ignore
|
|
legacyController.controllerLoaded = { [weak legacyController] in
|
|
legacyController?.view.disablesInteractiveTransitionGestureRecognizer = true
|
|
}
|
|
|
|
let emptyController = LegacyEmptyController(context: legacyController.context)!
|
|
emptyController.navigationBarShouldBeHidden = true
|
|
let navigationController = makeLegacyNavigationController(rootController: emptyController)
|
|
navigationController.setNavigationBarHidden(true, animated: false)
|
|
legacyController.bind(controller: navigationController)
|
|
|
|
let recipientName = EnginePeer(peer).displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
|
|
|
legacyController.enableSizeClassSignal = true
|
|
|
|
let presentationDisposable = updatedPresentationData.signal.start(next: { [weak legacyController] presentationData in
|
|
if let legacyController = legacyController, let controller = legacyController.legacyController as? TGMenuSheetController {
|
|
controller.pallete = legacyMenuPaletteFromTheme(presentationData.theme, forceDark: false)
|
|
}
|
|
})
|
|
legacyController.disposables.add(presentationDisposable)
|
|
|
|
present(legacyController, nil)
|
|
|
|
TGPhotoVideoEditor.present(with: legacyController.context, controller: emptyController, caption: NSAttributedString(), withItem: item, paint: false, recipientName: recipientName, stickersContext: paintStickersContext, snapshots: [], immediate: false, appeared: {
|
|
}, completion: { result, editingContext in
|
|
let nativeGenerator = legacyAssetPickerItemGenerator()
|
|
var selectableResult: TGMediaSelectableItem?
|
|
if let result = result {
|
|
selectableResult = unsafeDowncast(result, to: TGMediaSelectableItem.self)
|
|
}
|
|
let signals = TGCameraController.resultSignals(for: nil, editingContext: editingContext, currentItem: selectableResult, storeAssets: false, saveEditedPhotos: false, descriptionGenerator: { _1, _2, _3 in
|
|
nativeGenerator(_1, _2, _3, nil)
|
|
})
|
|
sendMessagesWithSignals(signals, false, 0, { _ in nil}, {})
|
|
}, dismissed: { [weak legacyController] in
|
|
legacyController?.dismiss()
|
|
})
|
|
})
|
|
})!
|
|
itemViews.append(editCurrentItem)
|
|
}
|
|
|
|
if editMediaOptions == nil {
|
|
let locationItem = TGMenuSheetButtonItemView(title: presentationData.strings.Conversation_Location, type: TGMenuSheetButtonTypeDefault, fontSize: fontSize, action: { [weak controller] in
|
|
controller?.dismiss(animated: true)
|
|
openMap()
|
|
})!
|
|
itemViews.append(locationItem)
|
|
|
|
var peerSupportsPolls = false
|
|
if peer is TelegramGroup || peer is TelegramChannel {
|
|
peerSupportsPolls = true
|
|
} else if let user = peer as? TelegramUser, let _ = user.botInfo {
|
|
peerSupportsPolls = true
|
|
}
|
|
if peerSupportsPolls && canSendMessagesToPeer(peer) && canSendPolls {
|
|
let pollItem = TGMenuSheetButtonItemView(title: presentationData.strings.AttachmentMenu_Poll, type: TGMenuSheetButtonTypeDefault, fontSize: fontSize, action: { [weak controller] in
|
|
controller?.dismiss(animated: true)
|
|
openPoll()
|
|
})!
|
|
itemViews.append(pollItem)
|
|
}
|
|
|
|
let contactItem = TGMenuSheetButtonItemView(title: presentationData.strings.Conversation_Contact, type: TGMenuSheetButtonTypeDefault, fontSize: fontSize, action: { [weak controller] in
|
|
controller?.dismiss(animated: true)
|
|
openContacts()
|
|
})!
|
|
itemViews.append(contactItem)
|
|
}
|
|
|
|
carouselItemView?.underlyingViews = underlyingViews
|
|
|
|
if editMediaOptions == nil {
|
|
for i in 0 ..< min(20, recentlyUsedInlineBots.count) {
|
|
let peer = recentlyUsedInlineBots[i]
|
|
let addressName = peer.addressName
|
|
if let addressName = addressName {
|
|
let botItem = TGMenuSheetButtonItemView(title: "@" + addressName, type: TGMenuSheetButtonTypeDefault, fontSize: fontSize, action: { [weak controller] in
|
|
controller?.dismiss(animated: true)
|
|
|
|
selectRecentlyUsedInlineBot(peer)
|
|
})!
|
|
botItem.overflow = true
|
|
itemViews.append(botItem)
|
|
}
|
|
}
|
|
}
|
|
|
|
carouselItemView?.remainingHeight = TGMenuSheetButtonItemViewHeight * CGFloat(itemViews.count - 1)
|
|
|
|
let cancelItem = TGMenuSheetButtonItemView(title: presentationData.strings.Common_Cancel, type: TGMenuSheetButtonTypeCancel, fontSize: actionSheetTheme.baseFontSize, action: { [weak controller] in
|
|
controller?.dismiss(animated: true)
|
|
})!
|
|
itemViews.append(cancelItem)
|
|
|
|
controller.setItemViews(itemViews)
|
|
|
|
return controller
|
|
}
|
|
|
|
public func legacyMenuPaletteFromTheme(_ theme: PresentationTheme, forceDark: Bool) -> TGMenuSheetPallete {
|
|
let sheetTheme: PresentationThemeActionSheet
|
|
if forceDark && !theme.overallDarkAppearance {
|
|
sheetTheme = defaultDarkColorPresentationTheme.actionSheet
|
|
} else {
|
|
sheetTheme = theme.actionSheet
|
|
}
|
|
return TGMenuSheetPallete(dark: forceDark || theme.overallDarkAppearance, backgroundColor: sheetTheme.opaqueItemBackgroundColor, selectionColor: sheetTheme.opaqueItemHighlightedBackgroundColor, separatorColor: sheetTheme.opaqueItemSeparatorColor, accentColor: sheetTheme.controlAccentColor, destructiveColor: sheetTheme.destructiveActionTextColor, textColor: sheetTheme.primaryTextColor, secondaryTextColor: sheetTheme.secondaryTextColor, spinnerColor: sheetTheme.secondaryTextColor, badgeTextColor: sheetTheme.controlAccentColor, badgeImage: nil, cornersImage: generateStretchableFilledCircleImage(diameter: 11.0, color: nil, strokeColor: nil, strokeWidth: nil, backgroundColor: sheetTheme.opaqueItemBackgroundColor))
|
|
}
|
|
|
|
public func presentLegacyPasteMenu(context: AccountContext, peer: Peer, chatLocation: ChatLocation, saveEditedPhotos: Bool, allowGrouping: Bool, hasSchedule: Bool, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>), images: [UIImage], presentSchedulePicker: @escaping (@escaping (Int32) -> Void) -> Void, presentTimerPicker: @escaping (@escaping (Int32) -> Void) -> Void, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, presentStickers: @escaping (@escaping (TelegramMediaFile, Bool, UIView, CGRect) -> Void) -> TGPhotoPaintStickersScreen?, getCaptionPanelView: @escaping () -> TGCaptionPanelView?, present: (ViewController, Any?) -> Void, initialLayout: ContainerViewLayout? = nil) -> ViewController {
|
|
let defaultVideoPreset = defaultVideoPresetForContext(context)
|
|
UserDefaults.standard.set(defaultVideoPreset.rawValue as NSNumber, forKey: "TG_preferredVideoPreset_v0")
|
|
|
|
let presentationData = updatedPresentationData.initial
|
|
let legacyController = LegacyController(presentation: .custom, theme: presentationData.theme, initialLayout: initialLayout)
|
|
legacyController.statusBar.statusBarStyle = .Ignore
|
|
legacyController.controllerLoaded = { [weak legacyController] in
|
|
legacyController?.view.disablesInteractiveTransitionGestureRecognizer = true
|
|
}
|
|
|
|
let emptyController = LegacyEmptyController(context: legacyController.context)!
|
|
let navigationController = makeLegacyNavigationController(rootController: emptyController)
|
|
navigationController.setNavigationBarHidden(true, animated: false)
|
|
legacyController.bind(controller: navigationController)
|
|
|
|
var hasTimer = false
|
|
var hasSilentPosting = false
|
|
if peer.id != context.account.peerId {
|
|
if peer is TelegramUser {
|
|
hasTimer = true
|
|
}
|
|
hasSilentPosting = true
|
|
}
|
|
let recipientName = EnginePeer(peer).displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
|
|
|
|
legacyController.enableSizeClassSignal = true
|
|
|
|
let paintStickersContext = LegacyPaintStickersContext(context: context)
|
|
paintStickersContext.captionPanelView = {
|
|
return getCaptionPanelView()
|
|
}
|
|
paintStickersContext.presentStickersController = { completion in
|
|
return presentStickers({ file, animated, view, rect in
|
|
let coder = PostboxEncoder()
|
|
coder.encodeRootObject(file)
|
|
completion?(coder.makeData(), animated, view, rect)
|
|
})
|
|
}
|
|
|
|
let controller = TGClipboardMenu.present(inParentController: emptyController, context: legacyController.context, images: images, allowGrouping: allowGrouping, hasCaption: true, hasTimer: hasTimer, hasSilentPosting: hasSilentPosting, hasSchedule: hasSchedule, reminder: peer.id == context.account.peerId, recipientName: recipientName, stickersContext: paintStickersContext, presentScheduleController: { done in
|
|
presentSchedulePicker { time in
|
|
done?(time)
|
|
}
|
|
}, presentTimerController: { done in
|
|
presentTimerPicker { time in
|
|
done?(time)
|
|
}
|
|
}, completed: { selectionContext, editingContext, currentItem, silentPosting, scheduleTime in
|
|
let nativeGenerator = legacyAssetPickerItemGenerator()
|
|
let signals = TGClipboardMenu.resultSignals(for: selectionContext, editingContext: editingContext, currentItem: currentItem, descriptionGenerator: { _1, _2, _3 in
|
|
nativeGenerator(_1, _2, _3, nil)
|
|
})
|
|
sendMessagesWithSignals(signals, silentPosting, scheduleTime)
|
|
}, dismissed: { [weak legacyController] in
|
|
legacyController?.dismiss()
|
|
}, sourceView: emptyController.view, sourceRect: nil)!
|
|
controller.customRemoveFromParentViewController = { [weak legacyController] in
|
|
legacyController?.dismiss()
|
|
}
|
|
|
|
let presentationDisposable = updatedPresentationData.signal.start(next: { [weak legacyController] presentationData in
|
|
if let legacyController = legacyController, let controller = legacyController.legacyController as? TGMenuSheetController {
|
|
controller.pallete = legacyMenuPaletteFromTheme(presentationData.theme, forceDark: false)
|
|
}
|
|
})
|
|
legacyController.disposables.add(presentationDisposable)
|
|
|
|
present(legacyController, nil)
|
|
controller.present(in: emptyController, sourceView: nil, animated: true)
|
|
|
|
return legacyController
|
|
}
|