From 105f403d1f13ec307b88c6b6211113a1df599cae Mon Sep 17 00:00:00 2001 From: Michael Bui Date: Mon, 23 Jun 2025 10:46:16 +0800 Subject: [PATCH] (feat) Also detect apps inside user application folder - fix #136 --- VoiceInk/PowerMode/PowerModeConfigView.swift | 22 +++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/VoiceInk/PowerMode/PowerModeConfigView.swift b/VoiceInk/PowerMode/PowerModeConfigView.swift index 8dfdb6a..65570bc 100644 --- a/VoiceInk/PowerMode/PowerModeConfigView.swift +++ b/VoiceInk/PowerMode/PowerModeConfigView.swift @@ -706,21 +706,29 @@ struct ConfigurationView: View { private func loadInstalledApps() { // Get both user-installed and system applications - let userAppURLs = FileManager.default.urls(for: .applicationDirectory, in: .localDomainMask) + let userAppURLs = FileManager.default.urls(for: .applicationDirectory, in: .userDomainMask) + let localAppURLs = FileManager.default.urls(for: .applicationDirectory, in: .localDomainMask) let systemAppURLs = FileManager.default.urls(for: .applicationDirectory, in: .systemDomainMask) - let allAppURLs = userAppURLs + systemAppURLs + let allAppURLs = userAppURLs + localAppURLs + systemAppURLs let apps = allAppURLs.flatMap { baseURL -> [URL] in let enumerator = FileManager.default.enumerator( at: baseURL, - includingPropertiesForKeys: [.isApplicationKey], - options: [.skipsHiddenFiles, .skipsPackageDescendants] + includingPropertiesForKeys: [.isApplicationKey, .isDirectoryKey], + options: [.skipsHiddenFiles] ) return enumerator?.compactMap { item -> URL? in - guard let url = item as? URL, - url.pathExtension == "app" else { return nil } - return url + guard let url = item as? URL else { return nil } + + // If it's an app, return it and skip descending into it + if url.pathExtension == "app" { + enumerator?.skipDescendants() + return url + } + + // Continue searching in directories + return nil } ?? [] }