Files
LockInBroMobile/LockInBroShield/ShieldConfigurationExtension.swift

89 lines
3.5 KiB
Swift
Raw Permalink Normal View History

//
// 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
)
)
}
}