// // ShieldConfigurationExtension.swift // OpenAppLockShieldConfig // import ManagedSettings import ManagedSettingsUI import UIKit /// Customizes the system shield. Apps under an open-limit rule show how many /// opens were used and offer an "Open" secondary button while opens remain; /// everything else gets a plain blocked shield named after its rule. final class ShieldConfigurationExtension: ShieldConfigurationDataSource { override func configuration(shielding application: Application) -> ShieldConfiguration { guard let token = application.token else { return blockedConfiguration(ruleName: nil) } return configuration(forApplicationToken: token) } override func configuration( shielding application: Application, in category: ActivityCategory ) -> ShieldConfiguration { guard let token = application.token else { return blockedConfiguration(ruleName: nil) } return configuration(forApplicationToken: token) } override func configuration(shielding webDomain: WebDomain) -> ShieldConfiguration { blockedConfiguration(ruleName: nil) } override func configuration( shielding webDomain: WebDomain, in category: ActivityCategory ) -> ShieldConfiguration { blockedConfiguration(ruleName: nil) } private func configuration( forApplicationToken token: ApplicationToken ) -> ShieldConfiguration { let snapshots = RuleSnapshotStore().load() guard let snapshot = ShieldLookup.openLimitSnapshot( containingApplication: token, in: snapshots) else { let name = ShieldLookup.snapshot(containingApplication: token, in: snapshots)?.name return blockedConfiguration(ruleName: name) } let usage = UsageLedger().usage(for: snapshot.id, onDayContaining: .now) let remaining = max(0, snapshot.maxOpens - usage.opensUsed) guard remaining > 0 else { return ShieldConfiguration( backgroundBlurStyle: .systemMaterial, title: .init(text: snapshot.name, color: .label), subtitle: .init( text: "No opens left today — the block lifts tomorrow.", color: .secondaryLabel), primaryButtonLabel: .init(text: "OK", color: .white), primaryButtonBackgroundColor: .systemBlue ) } return ShieldConfiguration( backgroundBlurStyle: .systemMaterial, title: .init(text: snapshot.name, color: .label), subtitle: .init( text: "Opened \(usage.opensUsed) of \(snapshot.maxOpens) times today. " + "Each open lasts \(MonitoringPlan.openSessionMinutes) minutes.", color: .secondaryLabel), primaryButtonLabel: .init(text: "OK", color: .white), primaryButtonBackgroundColor: .systemBlue, secondaryButtonLabel: .init( text: remaining == 1 ? "Open (1 left)" : "Open (\(remaining) left)", color: .systemBlue) ) } private func blockedConfiguration(ruleName: String?) -> ShieldConfiguration { ShieldConfiguration( backgroundBlurStyle: .systemMaterial, title: .init(text: ruleName ?? "Blocked", color: .label), subtitle: .init(text: "This app is blocked by OpenAppLock.", color: .secondaryLabel), primaryButtonLabel: .init(text: "OK", color: .white), primaryButtonBackgroundColor: .systemBlue ) } }