//
//  RecordingAwareWindow.swift
//  ylgamehall
//
//  UIWindow 子类：提供 touch 事件的旁路监听通道，供录音浮层用。
//
//  ## 为何需要
//
//  H5 麦克风按钮按下时触发 prepareaudio → 录音浮层在「按住状态下」中途
//  弹出。iOS 的 touch 事件流走 view hit-test 链，**in-flight touch 不会
//  传给中途加入的 view**，新弹浮层 view 收不到 touchesEnded，导致用户松
//  手时 Native 检测不到。
//
//  必须在 UIWindow 层旁路截获 touch，绕开 view hit-test 链的不确定性。
//  daoqi msext `CustomWindow.m` 同款思路（msext 用 NotificationCenter
//  post `nScreenTouch` 通知，新外壳改用 closure 注入）。
//

import UIKit

/// 录音感知 UIWindow。
///
/// **默认行为完全不变**：未设置 `touchObserver` 时，`sendEvent` 直接调
/// `super`，所有 touch 事件按正常 hit-test 链分发。设置 `touchObserver`
/// 后，window 在每次 `.touches` event 时把 event 转给 observer，**触发
/// 时机在 `super.sendEvent` 之后，不阻塞业务 view 的事件分发**。
public final class RecordingAwareWindow: UIWindow {

    /// 全局 touch event 观察 closure。
    ///
    /// - 不为 nil 时，每次 `.touches` event 触发该 closure
    /// - 录音组件在 start 时设置、stop / cancel 时清空
    /// - **必须主线程访问**：UIWindow.sendEvent 由 UIKit 主线程调，
    ///   读写 closure 在主线程串行，无需加锁
    public static var touchObserver: ((UIEvent) -> Void)?

    public override func sendEvent(_ event: UIEvent) {
        super.sendEvent(event)
        if event.type == .touches {
            Self.touchObserver?(event)
        }
    }
}
