diff --git a/BLEUnlock/AppDelegate.swift b/BLEUnlock/AppDelegate.swift index 4ee9c91..95d0522 100644 --- a/BLEUnlock/AppDelegate.swift +++ b/BLEUnlock/AppDelegate.swift @@ -16,6 +16,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate, NSMenuItemVa let unlockRSSIMenu = NSMenu() let timeoutMenu = NSMenu() let lockDelayMenu = NSMenu() + let sleepRSSIMenu = NSMenu() var deviceDict: [UUID: NSMenuItem] = [:] var monitorMenuItem : NSMenuItem? let prefs = UserDefaults.standard @@ -50,6 +51,14 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate, NSMenuItemVa item.state = .off } } + } else if menu == sleepRSSIMenu { + for item in menu.items { + if item.tag == ble.sleepRSSI { + item.state = .on + } else { + item.state = .off + } + } } else if menu == timeoutMenu { for item in menu.items { if item.tag == Int(ble.signalTimeout) { @@ -71,9 +80,11 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate, NSMenuItemVa func validateMenuItem(_ menuItem: NSMenuItem) -> Bool { if menuItem.menu == lockRSSIMenu { - return menuItem.tag <= ble.unlockRSSI + return menuItem.tag < ble.unlockRSSI } else if menuItem.menu == unlockRSSIMenu { - return menuItem.tag >= ble.lockRSSI + return menuItem.tag > ble.lockRSSI + } else if menuItem.menu == sleepRSSIMenu { + return menuItem.tag < ble.lockRSSI || menuItem.tag == ble.LOCK_DISABLED } return true } @@ -234,6 +245,13 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate, NSMenuItemVa tryUnlockScreen() } } else { + if (!displaySleep && ble.sleepRSSI != ble.LOCK_DISABLED && + (lastRSSI == nil || lastRSSI! <= ble.sleepRSSI)) { + print("sleep display due to RSSI threshold") + sleepDisplay() + displaySleep = true // Mark as sleeping to prevent lock + return // Skip lock logic + } if (!isScreenLocked() && ble.lockRSSI != ble.LOCK_DISABLED) { pauseNowPlaying() lockOrSaveScreen() @@ -501,6 +519,12 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate, NSMenuItemVa prefs.set(value, forKey: "unlockRSSI") ble.unlockRSSI = value } + + @objc func setSleepRSSI(_ menuItem: NSMenuItem) { + let value = menuItem.tag + prefs.set(value, forKey: "sleepRSSI") + ble.sleepRSSI = value + } @objc func setTimeout(_ menuItem: NSMenuItem) { let value = menuItem.tag @@ -597,6 +621,12 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate, NSMenuItemVa constructRSSIMenu(lockRSSIMenu, #selector(setLockRSSI)) item = lockRSSIMenu.addItem(withTitle: t("disabled"), action: #selector(setLockRSSI), keyEquivalent: "") item.tag = ble.LOCK_DISABLED + + let sleepRSSIItem = mainMenu.addItem(withTitle: t("sleep_rssi"), action: nil, keyEquivalent: "") + sleepRSSIItem.submenu = sleepRSSIMenu + constructRSSIMenu(sleepRSSIMenu, #selector(setSleepRSSI)) + item = sleepRSSIMenu.addItem(withTitle: t("disabled"), action: #selector(setSleepRSSI), keyEquivalent: "") + item.tag = ble.LOCK_DISABLED let lockDelayItem = mainMenu.addItem(withTitle: t("lock_delay"), action: nil, keyEquivalent: "") lockDelayItem.submenu = lockDelayMenu @@ -692,6 +722,10 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate, NSMenuItemVa if unlockRSSI != 0 { ble.unlockRSSI = unlockRSSI } + let sleepRSSI = prefs.integer(forKey: "sleepRSSI") + if sleepRSSI != 0 { + ble.sleepRSSI = sleepRSSI + } let timeout = prefs.integer(forKey: "timeout") if timeout != 0 { ble.signalTimeout = Double(timeout) diff --git a/BLEUnlock/BLE.swift b/BLEUnlock/BLE.swift index b37fc88..e2128c9 100644 --- a/BLEUnlock/BLE.swift +++ b/BLEUnlock/BLE.swift @@ -129,6 +129,7 @@ class BLE: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate { var presence = false var lockRSSI = -80 var unlockRSSI = -60 + var sleepRSSI: Int = -95 var proximityTimeout = 5.0 var signalTimeout = 60.0 var lastReadAt = 0.0 diff --git a/BLEUnlock/Base.lproj/Localizable.strings b/BLEUnlock/Base.lproj/Localizable.strings index 4e75488..5e13f89 100644 --- a/BLEUnlock/Base.lproj/Localizable.strings +++ b/BLEUnlock/Base.lproj/Localizable.strings @@ -36,3 +36,4 @@ "use_screensaver_to_lock" = "Use Screensaver to Lock"; "wake_on_proximity" = "Wake on Proximity"; "wake_without_unlocking" = "Wake without Unlocking"; +"sleep_rssi" = "Sleep RSSI"; diff --git a/BLEUnlock/da.lproj/Localizable.strings b/BLEUnlock/da.lproj/Localizable.strings index ccc259e..005e073 100644 --- a/BLEUnlock/da.lproj/Localizable.strings +++ b/BLEUnlock/da.lproj/Localizable.strings @@ -36,3 +36,4 @@ "use_screensaver_to_lock" = "Brug screensaver til at låse"; "wake_on_proximity" = "Vågn op på nærhed"; "wake_without_unlocking" = "Vågn op uden at låse op"; +"sleep_rssi" = "Sleep RSSI"; diff --git a/BLEUnlock/de.lproj/Localizable.strings b/BLEUnlock/de.lproj/Localizable.strings index c9d978e..51383d4 100644 --- a/BLEUnlock/de.lproj/Localizable.strings +++ b/BLEUnlock/de.lproj/Localizable.strings @@ -36,3 +36,4 @@ "use_screensaver_to_lock" = "Den Bildschirmschoner verwenden zum Sperren"; "wake_on_proximity" = "Aufwachen bei Annäherung"; "wake_without_unlocking" = "Aufwachen ohne Entsperren"; +"sleep_rssi" = "RSSI im Ruhezustand"; diff --git a/BLEUnlock/ja.lproj/Localizable.strings b/BLEUnlock/ja.lproj/Localizable.strings index 39910a7..51d618e 100644 --- a/BLEUnlock/ja.lproj/Localizable.strings +++ b/BLEUnlock/ja.lproj/Localizable.strings @@ -36,3 +36,4 @@ "use_screensaver_to_lock" = "スクリーンセーバーでロック"; "wake_on_proximity" = "画面スリープから復帰"; "wake_without_unlocking" = "アンロックせずに画面復帰"; +"sleep_rssi" = "スリープ信号強度"; diff --git a/BLEUnlock/nb.lproj/Localizable.strings b/BLEUnlock/nb.lproj/Localizable.strings index 37bc754..ced14b0 100644 --- a/BLEUnlock/nb.lproj/Localizable.strings +++ b/BLEUnlock/nb.lproj/Localizable.strings @@ -36,3 +36,4 @@ "use_screensaver_to_lock" = "Bruke skjermsparer til å låse"; "wake_on_proximity" = "Vekk ved nærhet"; "wake_without_unlocking" = "Våkne uten å låse opp"; +"sleep_rssi" = "Sove RSSI"; diff --git a/BLEUnlock/sv.lproj/Localizable.strings b/BLEUnlock/sv.lproj/Localizable.strings index 4ca0820..6987821 100644 --- a/BLEUnlock/sv.lproj/Localizable.strings +++ b/BLEUnlock/sv.lproj/Localizable.strings @@ -36,3 +36,4 @@ "use_screensaver_to_lock" = "Använd skärmsläckare för att låsa"; "wake_on_proximity" = "Väck om i närheten"; "wake_without_unlocking" = "Vakna utan att låsa upp"; +"sleep_rssi" = "Sömn RSSI"; diff --git a/BLEUnlock/tr.lproj/Localizable.strings b/BLEUnlock/tr.lproj/Localizable.strings index 1376de2..d1eb0c4 100644 --- a/BLEUnlock/tr.lproj/Localizable.strings +++ b/BLEUnlock/tr.lproj/Localizable.strings @@ -36,3 +36,4 @@ "use_screensaver_to_lock" = "Kilit ekranı için ekran kuruyucu kullan"; "wake_on_proximity" = "Uyandırma yakınlığı"; "wake_without_unlocking" = "Kilidi açmadan uyanın"; +"sleep_rssi" = "Uyku RSSI"; diff --git a/BLEUnlock/zh-Hans.lproj/Localizable.strings b/BLEUnlock/zh-Hans.lproj/Localizable.strings index c8a0303..32a8fca 100644 --- a/BLEUnlock/zh-Hans.lproj/Localizable.strings +++ b/BLEUnlock/zh-Hans.lproj/Localizable.strings @@ -36,3 +36,4 @@ "use_screensaver_to_lock" = "用屏保来锁定它"; "wake_on_proximity" = "靠近唤醒"; "wake_without_unlocking" = "唤醒时不需解锁"; +"sleep_rssi" = "睡眠信号强度";