From 86fa1b84b4c4d226804c8e75978132aee7971be3 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Mon, 15 Aug 2022 14:06:24 +0100
Subject: [PATCH] Use MakeAppScreenshot in SingleChatController

---
 Package.swift                                 |  1 +
 .../Controllers/SingleChatController.swift    | 49 +++++--------------
 2 files changed, 13 insertions(+), 37 deletions(-)

diff --git a/Package.swift b/Package.swift
index a373ced4..539ef5e1 100644
--- a/Package.swift
+++ b/Package.swift
@@ -464,6 +464,7 @@ let package = Package(
                 .target(name: "Presentation"),
                 .target(name: "DrawerFeature"),
                 .target(name: "ChatInputFeature"),
+                .target(name: "ReportingFeature"),
                 .target(name: "DependencyInjection"),
                 .product(name: "ChatLayout", package: "ChatLayout"),
                 .product(name: "DifferenceKit", package: "DifferenceKit"),
diff --git a/Sources/ChatFeature/Controllers/SingleChatController.swift b/Sources/ChatFeature/Controllers/SingleChatController.swift
index d2f7f95a..1a066b20 100644
--- a/Sources/ChatFeature/Controllers/SingleChatController.swift
+++ b/Sources/ChatFeature/Controllers/SingleChatController.swift
@@ -12,6 +12,7 @@ import ChatLayout
 import DrawerFeature
 import DifferenceKit
 import ChatInputFeature
+import ReportingFeature
 import DependencyInjection
 import ScrollViewController
 
@@ -28,6 +29,7 @@ public final class SingleChatController: UIViewController {
     @Dependency private var logger: XXLogger
     @Dependency private var voxophone: Voxophone
     @Dependency private var coordinator: ChatCoordinating
+    @Dependency private var makeAppScreenshot: MakeAppScreenshot
     @Dependency private var statusBarController: StatusBarStyleControlling
 
     lazy private var infoView = UIControl()
@@ -430,7 +432,7 @@ public final class SingleChatController: UIViewController {
                 drawer.dismiss(animated: true) { [weak self] in
                     guard let self = self else { return }
                     self.drawerCancellables.removeAll()
-                    self.viewModel.proceeedWithReport(screenshot: self.takeAppScreenshot()) {
+                    self.viewModel.proceeedWithReport(screenshot: try! self.makeAppScreenshot()) {
                         self.navigationController?.popViewController(animated: true)
                     }
                 }
@@ -447,26 +449,6 @@ public final class SingleChatController: UIViewController {
         coordinator.toDrawer(drawer, from: self)
     }
 
-    func takeAppScreenshot() -> UIImage {
-        guard let foregroundWindowScene = foregroundWindowScene else {
-            fatalError("[takeAppScreenshot]: Unable to get foreground window scene")
-        }
-
-        let keyWindow = getKeyWindow(foregroundWindowScene)
-
-        let rendererFormat = UIGraphicsImageRendererFormat()
-        rendererFormat.scale = foregroundWindowScene.screen.scale
-
-        let renderer = UIGraphicsImageRenderer(
-            bounds: keyWindow.bounds,
-            format: rendererFormat
-        )
-
-        return renderer.image { ctx in
-            keyWindow.layer.render(in: ctx.cgContext)
-        }
-    }
-
     private func presentDeleteAllDrawer() {
         let clearButton = CapsuleButton()
         clearButton.setStyle(.red)
@@ -596,11 +578,17 @@ extension SingleChatController: KeyboardListenerDelegate {
     }
 
     func keyboardWillChangeFrame(info: KeyboardInfo) {
-        guard let scene = foregroundWindowScene else {
-            fatalError("[keyboardWillChangeFrame]: Couldn't get foregroundWindowScene")
+        let keyWindow: UIWindow? = UIApplication.shared.connectedScenes
+            .filter { $0.activationState == .foregroundActive }
+            .compactMap { $0 as? UIWindowScene }
+            .first?
+            .windows
+            .first(where: \.isKeyWindow)
+
+        guard let keyWindow = keyWindow else {
+            fatalError("[keyboardWillChangeFrame]: Couldn't get key window")
         }
 
-        let keyWindow = getKeyWindow(scene)
         let keyboardFrame = keyWindow.convert(info.frameEnd, to: view)
 
         guard !currentInterfaceActions.options.contains(.changingFrameSize),
@@ -764,16 +752,3 @@ extension SingleChatController: QLPreviewControllerDelegate {
         fileURL = nil
     }
 }
-
-let foregroundWindowScene: UIWindowScene? = UIApplication.shared.connectedScenes
-    .filter { $0.activationState == .foregroundActive }
-    .compactMap { $0 as? UIWindowScene }
-    .first
-
-func getKeyWindow(_ scene: UIWindowScene) -> UIWindow {
-    guard let keyWindow = scene.windows.first(where: \.isKeyWindow) else {
-        fatalError("Unable to get key window")
-    }
-
-    return keyWindow
-}
-- 
GitLab