From 149a022765479a0591b29b9bab1e90807c029adb Mon Sep 17 00:00:00 2001 From: Hariharan Mudaliar Date: Wed, 26 Nov 2025 23:48:32 +0530 Subject: [PATCH] Add Lock/Unlock sounds --- .../components/Settings/SettingsView.swift | 1 + DynamicIsland/lock.mp3 | Bin 0 -> 8403 bytes .../managers/LockScreenManager.swift | 66 ++++++++++++++++++ DynamicIsland/models/Constants.swift | 1 + DynamicIsland/unlock.mp3 | Bin 0 -> 8776 bytes 5 files changed, 68 insertions(+) create mode 100644 DynamicIsland/lock.mp3 create mode 100644 DynamicIsland/unlock.mp3 diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 4e55b25..c51894e 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -356,6 +356,7 @@ struct GeneralSettings: View { Section { Defaults.Toggle("Enable Lock Screen Live Activity", key: .enableLockScreenLiveActivity) + Defaults.Toggle("Play lock/unlock sounds", key: .enableLockSounds) if #available(macOS 26.0, *) { Picker("Lock screen material", selection: $lockScreenGlassStyle) { ForEach(LockScreenGlassStyle.allCases) { style in diff --git a/DynamicIsland/lock.mp3 b/DynamicIsland/lock.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5d873fe1f2cc4cfaa0b7ae9b4af8c81df2aba654 GIT binary patch literal 8403 zcmds-XEa=2_^6LTj6PxXHhS-(L>r76!RWnrLJ(z=VDv5wqJ-!nx)2g1L?>FbXwiF+ zXc2<>^ZS3fAMRTB`+Yv_v-jF(o%62soc->#-hDI?;&{L*+P9e9;(UwW ze}vwWcuV#zZ~mj~`C7fZ(^6+c~3^4)fJ##OsNG9!VP z5BuTEcl&v2k>Qb)G!Tbeo5CYkg;G!l8~}v-vaV=n0Mf!ac470=hU;$7AF$Kx*(w{! z=up?h0og0JNXUpisSVM|a`H;)7Km6?^Te5vE0Txe!XaE{5Sj;Y*f@dF}F6bP6>mWQ7*~ zU^w<4#!(eVBE_RYgiHH(ieR)qbRhA8Q{ovA=|A9C_j(zUbdJ{Rf%SYFNC4mfBwr1C z60boO@gZDb zTI`&7bZ`@bl`khJ`HnUY)3&(K!HEDYxlPu`9vS5J0^fjvtCG?CF*}+ir*rhYVef z-+|>X^N~RSfUf44$rIn5_u}cZ&a)>`;8a4tSaue_NS}kiSf#PFH-}b>6b3`TT1RdT zQAhd-c*5adX!RVbrNLl!1?@*PWWD(K1D3X7bjyx`MZ^*@Tvk_+J(@3b{Mozm4z#g6~iFo ze&0bj$EB&<+_mVSmzvDbB2nPHaHDnhce+^O#5rGViYma^sBPE zZ`T_9e#Hm&{D1QKv42s?0kwg@W=8(V_A-UROnxETIz&XoQUWvPT$zUk-v?@k=mZ6r zNTC#eFgLi6>956#dzIQ%a0c8jH<#)>3 zTVj=dQ-s%>qNuB7WyCb21D|sk$?O3i7U&b(^4Ur_J{0KXreX-o^XCa;7)sd^efH

Ci<_?b{&vdz`x9j_Orfr&@k&v+3Q5Fi_f~E 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 Bool { + guard let last = lastPlaybackDates[type] else { return true } + return Date().timeIntervalSince(last) >= throttleInterval + } + + private func resolvePlayer(for type: SoundType) -> AVAudioPlayer? { + if let cached = players[type] { + return cached + } + + guard let url = Bundle.main.url(forResource: type.resourceName, withExtension: "mp3") else { + Logger.log("Missing \(type.resourceName).mp3 in bundle", category: .warning) + return nil + } + + do { + let player = try AVAudioPlayer(contentsOf: url) + player.prepareToPlay() + players[type] = player + return player + } catch { + Logger.log("Failed to initialize lock sound player for \(type.resourceName): \(error.localizedDescription)", category: .error) + return nil + } + } + + private enum SoundType: String { + case lock + case unlock + + var resourceName: String { rawValue } + } +} diff --git a/DynamicIsland/models/Constants.swift b/DynamicIsland/models/Constants.swift index c2677ef..9d7dc3c 100644 --- a/DynamicIsland/models/Constants.swift +++ b/DynamicIsland/models/Constants.swift @@ -601,6 +601,7 @@ extension Defaults.Keys { // MARK: Lock Screen Features static let enableLockScreenLiveActivity = Key("enableLockScreenLiveActivity", default: true) + static let enableLockSounds = Key("enableLockSounds", default: true) // MARK: ImageService static let didClearLegacyURLCacheV1 = Key("didClearLegacyURLCacheV1", default: false) diff --git a/DynamicIsland/unlock.mp3 b/DynamicIsland/unlock.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..3b1b06d71d47a2102e08f2398c539a624bf84fe1 GIT binary patch literal 8776 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 X`)^(N|H?`KBMf1m|G%OCxdHWWdyEO} literal 0 HcmV?d00001