Initial commit
Whisper model weights excluded from git — auto-downloaded at first Xcode build via Scripts/download_whisper_model.sh (~600 MB, one-time).
This commit is contained in:
88
LockInBroShield/ShieldConfigurationExtension.swift
Normal file
88
LockInBroShield/ShieldConfigurationExtension.swift
Normal file
@@ -0,0 +1,88 @@
|
||||
//
|
||||
// ShieldConfigurationExtension.swift
|
||||
// LockInBroShield
|
||||
//
|
||||
// Customizes the shield overlay that appears on distraction apps
|
||||
// during a focus session. Shows the user's current task, step progress,
|
||||
// and two action buttons: "Back to Focus" and "Allow X more min".
|
||||
//
|
||||
|
||||
import ManagedSettings
|
||||
import ManagedSettingsUI
|
||||
import UIKit
|
||||
|
||||
class ShieldConfigurationExtension: ShieldConfigurationDataSource {
|
||||
|
||||
private let defaults = UserDefaults(suiteName: "group.com.adipu.LockInBroMobile")
|
||||
|
||||
override func configuration(shielding application: Application) -> ShieldConfiguration {
|
||||
return buildShieldConfig(appName: application.localizedDisplayName)
|
||||
}
|
||||
|
||||
override func configuration(shielding application: Application, in category: ActivityCategory) -> ShieldConfiguration {
|
||||
return buildShieldConfig(appName: application.localizedDisplayName)
|
||||
}
|
||||
|
||||
override func configuration(shielding webDomain: WebDomain) -> ShieldConfiguration {
|
||||
return buildShieldConfig(appName: webDomain.domain)
|
||||
}
|
||||
|
||||
override func configuration(shielding webDomain: WebDomain, in category: ActivityCategory) -> ShieldConfiguration {
|
||||
return buildShieldConfig(appName: webDomain.domain)
|
||||
}
|
||||
|
||||
// MARK: - Build Shield
|
||||
|
||||
private func buildShieldConfig(appName: String?) -> ShieldConfiguration {
|
||||
let taskTitle = defaults?.string(forKey: "currentTaskTitle") ?? "your task"
|
||||
let completed = defaults?.integer(forKey: "currentStepsCompleted") ?? 0
|
||||
let total = defaults?.integer(forKey: "currentStepsTotal") ?? 0
|
||||
let currentStep = defaults?.string(forKey: "currentStepTitle")
|
||||
let lastCompletedStep = defaults?.string(forKey: "lastCompletedStepTitle")
|
||||
let threshold = defaults?.object(forKey: "distractionThresholdMinutes") as? Int ?? 2
|
||||
|
||||
// Build subtitle with task context
|
||||
var subtitle: String
|
||||
if total > 0 {
|
||||
var secondLine = ""
|
||||
if let last = lastCompletedStep, let next = currentStep {
|
||||
secondLine = "You've just finished: \(last), next up is \(next)"
|
||||
} else if let next = currentStep {
|
||||
secondLine = "Next up is \(next)"
|
||||
} else if let last = lastCompletedStep {
|
||||
secondLine = "You've just finished: \(last)"
|
||||
}
|
||||
|
||||
if secondLine.isEmpty {
|
||||
subtitle = "You're working on \"\(taskTitle)\" — \(completed)/\(total) steps done."
|
||||
} else {
|
||||
subtitle = "You're working on \"\(taskTitle)\" — \(completed)/\(total) steps done.\n\(secondLine)"
|
||||
}
|
||||
} else {
|
||||
subtitle = "You're supposed to be working on \"\(taskTitle)\"."
|
||||
}
|
||||
|
||||
return ShieldConfiguration(
|
||||
backgroundBlurStyle: .systemThickMaterial,
|
||||
backgroundColor: UIColor.black.withAlphaComponent(0.85),
|
||||
icon: UIImage(systemName: "brain.head.profile"),
|
||||
title: ShieldConfiguration.Label(
|
||||
text: "Time to lock back in!",
|
||||
color: .white
|
||||
),
|
||||
subtitle: ShieldConfiguration.Label(
|
||||
text: subtitle,
|
||||
color: UIColor.white.withAlphaComponent(0.8)
|
||||
),
|
||||
primaryButtonLabel: ShieldConfiguration.Label(
|
||||
text: "Back to Focus",
|
||||
color: .white
|
||||
),
|
||||
primaryButtonBackgroundColor: UIColor.systemBlue,
|
||||
secondaryButtonLabel: ShieldConfiguration.Label(
|
||||
text: "\(threshold) more min",
|
||||
color: UIColor.systemBlue
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user