diff --git a/SelfieRingLight/Features/Camera/ContentView.swift b/SelfieRingLight/Features/Camera/ContentView.swift index a055a0b..edec368 100644 --- a/SelfieRingLight/Features/Camera/ContentView.swift +++ b/SelfieRingLight/Features/Camera/ContentView.swift @@ -2,6 +2,7 @@ import SwiftUI import MijickCamera import Bedrock import Photos +import AVFoundation struct ContentView: View { @State private var settings = SettingsViewModel() @@ -15,6 +16,10 @@ struct ContentView: View { @State private var capturedVideoURL: URL? @State private var showPostCapturePreview = false + // Center Stage support + @State private var isCenterStageAvailable = false + @State private var isCenterStageEnabled = false + var body: some View { GeometryReader { geometry in let maxRingSize = calculateMaxRingSize(for: geometry) @@ -65,6 +70,9 @@ struct ContentView: View { } } .ignoresSafeArea() + .onAppear { + checkCenterStageAvailability() + } .sheet(isPresented: $showPaywall) { ProPaywallView() } @@ -86,6 +94,22 @@ struct ContentView: View { private var topControlBar: some View { HStack { + // Center Stage button (only shown when available) + if isCenterStageAvailable { + Button { + toggleCenterStage() + } label: { + Image(systemName: isCenterStageEnabled ? "person.crop.rectangle.fill" : "person.crop.rectangle") + .font(.body) + .foregroundStyle(isCenterStageEnabled ? .yellow : .white) + .padding(Design.Spacing.small) + .background(.ultraThinMaterial, in: Circle()) + } + .accessibilityLabel(String(localized: "Center Stage")) + .accessibilityValue(isCenterStageEnabled ? "On" : "Off") + .accessibilityHint(String(localized: "Keeps you centered in frame")) + } + Spacer() // Grid toggle @@ -115,6 +139,28 @@ struct ContentView: View { } } + // MARK: - Center Stage + + /// Checks if Center Stage is available on this device + private func checkCenterStageAvailability() { + // Center Stage requires a compatible device (iPad with A12+ or some iPhones) + guard let device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front) else { + isCenterStageAvailable = false + return + } + + // Check if the device supports Center Stage + isCenterStageAvailable = device.activeFormat.isCenterStageSupported + isCenterStageEnabled = AVCaptureDevice.isCenterStageEnabled + } + + /// Toggles Center Stage on/off + private func toggleCenterStage() { + AVCaptureDevice.centerStageControlMode = .app + AVCaptureDevice.isCenterStageEnabled.toggle() + isCenterStageEnabled = AVCaptureDevice.isCenterStageEnabled + } + // MARK: - Post Capture View @ViewBuilder