From b4b94d54cbed9334a28cdcd70d3a8a0fd06e04ef Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Fri, 17 Jul 2026 08:36:05 -0500 Subject: Implement v4.6.0: sweep Live Activity, share extension, iPad split view, actionable notifications - Sweep Live Activity: SweepActivityAttributes (Shared/), lock-screen + Dynamic Island UI in the widget extension, driven by SweepActivityController wired into the batch pipeline (begin/update/end); NSSupportsLiveActivities in Info.plist. - Share extension (DomainDigShareExtension): accepts a web URL from the share sheet, extracts the host, and hands it to the app via the App Group inbox (DomainDigShareInbox); the app consumes it on activation and inspects it. - iPad layout: RootTabView uses NavigationSplitView in the regular size class and the tab bar in compact. - Actionable notifications: per-domain threadIdentifier grouping, a Re-inspect action, and tap routing into the domain detail via the intent router. - Bump version to 4.6.0 (build 38) across app, widget, and share targets. --- DomainDig/DomainViewModel.swift | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'DomainDig/DomainViewModel.swift') diff --git a/DomainDig/DomainViewModel.swift b/DomainDig/DomainViewModel.swift index 3f37cb9..dcae907 100644 --- a/DomainDig/DomainViewModel.swift +++ b/DomainDig/DomainViewModel.swift @@ -2834,6 +2834,11 @@ final class DomainViewModel { customPortScanTask?.cancel() batchTask?.cancel() + SweepActivityController.shared.begin( + title: source == .watchlistRefresh ? "Watchlist Sweep" : "Batch Lookup", + total: domains.count + ) + batchTask = Task { [weak self] in guard let self else { return } self.notificationsAuthorized = await LocalNotificationService.shared.requestAuthorizationIfNeeded() @@ -2928,6 +2933,11 @@ final class DomainViewModel { errorMessage: "Lookup cancelled" ) batchCompletedCount += 1 + SweepActivityController.shared.update( + completed: batchCompletedCount, + total: batchTotalCount, + currentDomain: batchCurrentDomain + ) return } @@ -2956,6 +2966,11 @@ final class DomainViewModel { errorMessage: payload.snapshot.statusMessage ) batchCompletedCount += 1 + SweepActivityController.shared.update( + completed: batchCompletedCount, + total: batchTotalCount, + currentDomain: batchCurrentDomain + ) } private func finishBatchLookup(source: BatchLookupSource) { @@ -2989,6 +3004,7 @@ final class DomainViewModel { generatedAt: Date() ) latestBatchSweepSummary = summary + SweepActivityController.shared.end(changed: changedCount, warnings: warningCount) if source == .workflow, let activeWorkflowRunID, let activeWorkflowRunName { let workflowReports: [DomainReport] = summary.results.compactMap { result in -- cgit v1.2.3