Whisper model weights excluded from git — auto-downloaded at first Xcode build via Scripts/download_whisper_model.sh (~600 MB, one-time).
62 lines
2.4 KiB
Swift
62 lines
2.4 KiB
Swift
//
|
|
// DeviceActivityMonitorExtension.swift
|
|
// LockInBroMonitor
|
|
//
|
|
// When a distraction-app usage event exceeds the user's threshold,
|
|
// this extension applies a ManagedSettings shield so the app shows
|
|
// a "get back to work" overlay. Shields are cleared when the focus
|
|
// session schedule ends or the main app calls stopMonitoring().
|
|
//
|
|
|
|
import DeviceActivity
|
|
import FamilyControls
|
|
import Foundation
|
|
import ManagedSettings
|
|
|
|
class DeviceActivityMonitorExtension: DeviceActivityMonitor {
|
|
|
|
private let store = ManagedSettingsStore(named: .lockinbro)
|
|
private let defaults = UserDefaults(suiteName: "group.com.adipu.LockInBroMobile")
|
|
|
|
// MARK: - Threshold Reached
|
|
|
|
override func eventDidReachThreshold(_ event: DeviceActivityEvent.Name, activity: DeviceActivityName) {
|
|
super.eventDidReachThreshold(event, activity: activity)
|
|
|
|
// Load the user's selected distraction apps from the shared App Group
|
|
guard let data = defaults?.data(forKey: "screenTimeSelection"),
|
|
let selection = try? JSONDecoder().decode(FamilyActivitySelection.self, from: data) else {
|
|
return
|
|
}
|
|
|
|
// Apply shield to all selected apps — once ANY threshold fires, shield them all.
|
|
// This is simpler and gives the user a single nudge rather than per-app shields
|
|
// trickling in one-by-one.
|
|
store.shield.applications = selection.applicationTokens.isEmpty ? nil : selection.applicationTokens
|
|
store.shield.applicationCategories = selection.categoryTokens.isEmpty
|
|
? nil
|
|
: ShieldSettings.ActivityCategoryPolicy.specific(selection.categoryTokens)
|
|
}
|
|
|
|
// MARK: - Schedule Lifecycle
|
|
|
|
override func intervalDidStart(for activity: DeviceActivityName) {
|
|
super.intervalDidStart(for: activity)
|
|
// Ensure shields are clear at the start of each monitoring interval
|
|
store.shield.applications = nil
|
|
store.shield.applicationCategories = nil
|
|
}
|
|
|
|
override func intervalDidEnd(for activity: DeviceActivityName) {
|
|
super.intervalDidEnd(for: activity)
|
|
// Clean up shields when the schedule interval ends
|
|
store.shield.applications = nil
|
|
store.shield.applicationCategories = nil
|
|
}
|
|
}
|
|
|
|
// Mirror the named store constant from the main app
|
|
extension ManagedSettingsStore.Name {
|
|
static let lockinbro = ManagedSettingsStore.Name("lockinbro")
|
|
}
|