Skip to content

Commit

Permalink
Add Stop Recording button.
Browse files Browse the repository at this point in the history
  • Loading branch information
pcraciunoiu committed May 28, 2024
1 parent 663e970 commit 7187a4c
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 8 deletions.
5 changes: 5 additions & 0 deletions TikTok Reporter/FYP ReporterScreenCapture/SampleHandler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ class SampleHandler: RPBroadcastSampleHandler {
// MARK: - Methods

override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {
let userDefaults = UserDefaults(suiteName: Strings.appGroupID)
userDefaults?.set(true, forKey: Strings.broadcastStateKey)

DispatchQueue.main.async { [weak self] in
guard let self else { return }
Expand Down Expand Up @@ -114,6 +116,8 @@ class SampleHandler: RPBroadcastSampleHandler {
}

override func broadcastFinished() {
let userDefaults = UserDefaults(suiteName: Strings.appGroupID)
userDefaults?.set(false, forKey: Strings.broadcastStateKey)

do {
try finish()
Expand Down Expand Up @@ -268,6 +272,7 @@ private enum Strings {
static let appGroupID = "group.org.mozilla.ios.TikTok-Reporter"
static let filePath = "Library/Documents/"
static let writerQueueLabel = "BroadcastExtension.assetWriterQueue"
static let broadcastStateKey = "broadcastStarted"
}

private extension SampleHandler {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ final class AppStateManager: ObservableObject {
@Published
var onboardingFlow: OnboardingFlow? = nil

private lazy var userDefaults = UserDefaults(suiteName: Strings.appGroupID)
lazy var userDefaults = UserDefaults(suiteName: Strings.appGroupID)

// MARK: - Lifecycle

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
// Created by Sergiu Ghiran on 07.12.2023.
//

import ReplayKit
import SwiftUI

struct RecordView: View {
Expand All @@ -17,6 +18,12 @@ struct RecordView: View {
@Environment(\.scenePhase)
var scenePhase

let broadcastPicker: BroadcastPicker

init(viewModel: ViewModel) {
_viewModel = StateObject(wrappedValue: viewModel)
self.broadcastPicker = BroadcastPicker(startRecordingStatusChecker: viewModel.startRecordingStatusChecker)
}
// MARK: - Body

var body: some View {
Expand Down Expand Up @@ -123,9 +130,16 @@ struct RecordView: View {
.fill(.divider)
.frame(width: 64, height: 64)

BroadcastPicker()
broadcastPicker
.frame(height: 64)
}

if viewModel.appState.userDefaults?.bool(forKey: Strings.broadcastStateKey) == true {
MainButton(text: Strings.stopRecording, type: .action) {
broadcastPicker.showPickerView()
viewModel.stopRecordingStatusChecker()
}
}
}
}

Expand Down Expand Up @@ -218,6 +232,8 @@ struct RecordView: View {
private enum Strings {
static let submitTitle = "Submit Report"
static let cancelTitle = "Cancel Report"
static let stopRecording = "Stop Recording"
static let broadcastStateKey = "broadcastStarted"
static let recordTitle = "Record my TikTok session"
static let trimTitle = "Trim Recording"
static let recordedVideo = "Recorded Video"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ extension RecordView {

// MARK: - Properties

private var appState: AppStateManager
var appState: AppStateManager

@Published
var state: PresentationState = .success
Expand All @@ -44,6 +44,8 @@ extension RecordView {
var didUpdateMainField: Bool = false
@Published
var trimmedVideoPath: String?
@Published
var recordingStatusChecker: Timer? = nil

@Published
var videoComments: String = ""
Expand All @@ -58,13 +60,34 @@ extension RecordView {
// MARK: - Lifecycle

init(appState: AppStateManager) {

self.appState = appState
appState.userDefaults?.set(false, forKey: "broadcastStarted")
load()
}

// MARK: - Methods

func startRecordingStatusChecker() {
// Don't start another timer if one exists
if (recordingStatusChecker != nil) {
return
}

recordingStatusChecker = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { timer in
print("Checking recording status")
let isRecording = self.appState.userDefaults?.bool(forKey: Strings.broadcastStateKey) == true
if isRecording {
timer.invalidate()
self.recordingStatusChecker = nil
}
}
}

func stopRecordingStatusChecker() {
recordingStatusChecker?.invalidate()
recordingStatusChecker = nil
}

func load() {

guard let asset = try? screenRecordingService.loadRecording() else {
Expand Down Expand Up @@ -174,7 +197,8 @@ extension RecordView {
// MARK: - Private Methods

private func setupScreenRecording(with asset: AVAsset) {

stopRecordingStatusChecker()

var screenRecording = ScreenRecording(asset: asset)

state = .loading
Expand Down Expand Up @@ -205,3 +229,8 @@ extension RecordView {
}
}
}


private enum Strings {
static let broadcastStateKey = "broadcastStarted"
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,45 @@ import ReplayKit
import SwiftUI

struct BroadcastPicker: UIViewRepresentable {
var startRecordingStatusChecker: () -> Void
@State private var pickerView = RPSystemBroadcastPickerView(frame: CGRect(origin: .zero, size: CGSize(width: 64, height: 64)))

func makeUIView(context: Context) -> UIView {
func makeCoordinator() -> Coordinator {
Coordinator(self, startRecordingStatusChecker: startRecordingStatusChecker)
}

class Coordinator: NSObject {
var parent: BroadcastPicker
var startRecordingStatusChecker: () -> Void

// Needed for the PickerView centering. Without it, the button is off-center, no matter the frame given.
init(_ parent: BroadcastPicker, startRecordingStatusChecker: @escaping () -> Void) {
self.parent = parent
self.startRecordingStatusChecker = startRecordingStatusChecker
}

@objc func pickerAction() {
startRecordingStatusChecker()
}
}

func showPickerView() {
print("Called to show")
for subview in pickerView.subviews {
if let button = subview as? UIButton {
print("calling button")
button.sendActions(for: .touchUpInside)
}
}
}

func makeUIView(context: Context) -> UIView {
let containerView = UIView()

let pickerView = RPSystemBroadcastPickerView(frame: CGRect(origin: .zero, size: CGSize(width: 64, height: 64)))
for subview in pickerView.subviews {
if let button = subview as? UIButton {
button.addTarget(context.coordinator, action: #selector(Coordinator.pickerAction), for: .touchUpInside)
}
}

pickerView.preferredExtension = "org.mozilla.ios.TikTok-Reporter.TikTok-ReporterScreenCapture"
pickerView.showsMicrophoneButton = false
Expand Down

0 comments on commit 7187a4c

Please sign in to comment.