Camera and media editor improvements

This commit is contained in:
Ilya Laktyushin
2023-05-10 17:10:27 +04:00
parent c114f218b9
commit d15c48ff07
104 changed files with 9805 additions and 676 deletions

View File

@@ -18,6 +18,7 @@ import TabBarUI
import WallpaperBackgroundNode
import ChatPresentationInterfaceState
import CameraScreen
import MediaEditorScreen
import LegacyComponents
import LegacyMediaPickerUI
import LegacyCamera
@@ -255,51 +256,61 @@ public final class TelegramRootController: NavigationController {
}
controller.view.endEditing(true)
let context = self.context
var presentImpl: ((ViewController) -> Void)?
var returnToCameraImpl: (() -> Void)?
var dismissCameraImpl: (() -> Void)?
let cameraController = CameraScreen(context: self.context, mode: .story, completion: { [weak self] result in
if let self {
let item: TGMediaEditableItem & TGMediaSelectableItem
let _ = presentImpl
let _ = returnToCameraImpl
let _ = dismissCameraImpl
let cameraController = CameraScreen(context: context, mode: .story, completion: { result in
let subject: Signal<MediaEditorScreen.Subject?, NoError> = result
|> map { value -> MediaEditorScreen.Subject? in
switch value {
case .pendingImage:
return nil
case let .image(image):
return .image(image, PixelDimensions(image.size))
case let .video(path, dimensions):
return .video(path, dimensions)
case let .asset(asset):
return .asset(asset)
}
}
let controller = MediaEditorScreen(context: context, subject: subject, completion: { result in
switch result {
case let .image(image):
item = TGCameraCapturedPhoto(existing: image)
case let .video(path):
item = TGCameraCapturedVideo(url: URL(fileURLWithPath: path))
case let .asset(asset):
item = TGMediaAsset(phAsset: asset)
}
let context = self.context
legacyStoryMediaEditor(context: self.context, item: item, getCaptionPanelView: { return nil }, completion: { result in
dismissCameraImpl?()
switch result {
case let .image(image):
_ = image
case let .video(path):
_ = path
case let .asset(asset):
let options = PHImageRequestOptions()
options.deliveryMode = .highQualityFormat
options.isNetworkAccessAllowed = true
PHImageManager.default().requestImageData(for: asset, options:options, resultHandler: { data, _, _, _ in
if let data, let image = UIImage(data: data) {
Queue.mainQueue().async {
let _ = context.engine.messages.uploadStory(media: .image(dimensions: PixelDimensions(image.size), data: data)).start()
}
}
})
if let data = image.jpegData(compressionQuality: 0.8) {
let _ = context.engine.messages.uploadStory(media: .image(dimensions: PixelDimensions(image.size), data: data)).start()
}
}, present: { c, a in
presentImpl?(c)
})
case .video:
break
}
dismissCameraImpl?()
})
controller.sourceHint = .camera
controller.cancelled = {
returnToCameraImpl?()
}
presentImpl?(controller)
})
controller.push(cameraController)
presentImpl = { [weak cameraController] c in
cameraController?.present(c, in: .window(.root))
if let navigationController = cameraController?.navigationController as? NavigationController {
var controllers = navigationController.viewControllers
controllers.append(c)
navigationController.setViewControllers(controllers, animated: false)
}
}
dismissCameraImpl = { [weak cameraController] in
cameraController?.dismiss(animated: false)
}
returnToCameraImpl = { [weak cameraController] in
if let cameraController {
cameraController.returnFromEditor()
}
}
}
public func openSettings() {