Files

320 lines
8.3 KiB
Markdown
Raw Permalink Normal View History

# Alarm System
**Critical alarms with repeating sound until dismissed**
## Overview
The Alfred mobile app now supports alarms - notifications that play a sound on repeat and require explicit dismissal. Unlike regular notifications that auto-dismiss, alarms are designed for time-critical events you cannot miss.
## Features
### 🔔 Repeating Sound
- Uses system alarm ringtone (same sound as your device's alarm clock)
- Loops continuously until dismissed
- Full volume (respects system alarm volume)
### 📳 Repeating Vibration
- Vibration pattern: 500ms on, 500ms off, repeating
- Loops continuously until dismissed
- Can be disabled with `--no-vibrate` flag
### 🔒 Persistent Notification
- System notification stays visible until dismissed
- Cannot auto-dismiss (requires user action)
- Marked with ⏰ icon and "ALARM" prefix
### ✅ Manual Dismissal
- Say "dismiss alarm" or "dismiss alert" in chat
- Alarm stops immediately
- Notification clears
## Usage
### Scheduled Alarms
```bash
# Morning medication at 8am
mobile-notify alarm "08:00" "Take morning medication" --title "Health"
# Doctor appointment tomorrow
mobile-notify alarm "tomorrow 14:30" "Doctor appointment in 10 minutes"
# Critical meeting
mobile-notify alarm "2026-02-10 09:00" "Team standup starts now!"
```
### Instant Alarms
For immediate alarms (rare), use the `--alarm` flag with `alert`:
```bash
mobile-notify alert "Emergency alert!" --alarm --title "URGENT"
```
### From Alfred
When you ask Alfred to set a reminder, I'll ask if you want a notification or alarm if it's not clear:
**User:** "Remind me to take my medication at 8am tomorrow"
**Alfred:** "Would you like a regular notification, or an alarm (repeating sound until dismissed)?"
**User:** "Alarm please, I can't miss this"
**Alfred:** ✅ *Sets alarm*
```bash
exec(['mobile-notify', 'alarm', 'tomorrow 08:00', 'Take morning medication', '--title', 'Health'])
```
## When to Use Alarms vs Notifications
### Use Alarms For:
- ✅ Medication reminders
- ✅ Critical appointments (doctor, dentist, etc.)
- ✅ Important meetings you can't miss
- ✅ Wake-up alarms
- ✅ Time-sensitive tasks
- ✅ Emergency alerts
### Use Notifications For:
- ✅ General reminders
- ✅ Informational alerts
- ✅ Task completion notices
- ✅ Non-urgent events
- ✅ Daily routines
## Dismissing Alarms
### In-App Dismissal
Type or say any of these:
- "dismiss alarm"
- "dismiss alert"
- "dismiss the alarm"
- "stop alarm"
- "stop the alarm"
The app automatically detects these phrases and dismisses all active alarms.
### Notification Dismissal
Currently, you can only dismiss alarms via the app (by saying "dismiss alarm"). Future updates will add a dismiss button in the notification itself.
## Technical Details
### AlarmManager Component
Located at `app/src/main/java/com/openclaw/alfred/alarm/AlarmManager.kt`
**Key methods:**
- `startAlarm()` - Begin alarm with repeating sound/vibration
- `dismissAlarm()` - Stop specific alarm
- `dismissAll()` - Stop all active alarms
- `destroy()` - Cleanup on app close
**Sound playback:**
- Uses `MediaPlayer` with alarm audio attributes
- Loops via `isLooping = true`
- Uses `RingtoneManager.TYPE_ALARM` sound
**Vibration:**
- Uses `VibrationEffect.createWaveform()` with repeating pattern
- Pattern: [0ms delay, 500ms vibrate, 500ms pause, repeat]
- Requires `android.permission.VIBRATE`
### CLI Tool Updates
**New command:**
```bash
mobile-notify alarm "TIME" "MESSAGE" [options]
```
**New flag:**
```bash
mobile-notify alert "MESSAGE" --alarm [options]
```
### Event Format
WebSocket events for alarms:
```json
{
"type": "event",
"event": "mobile.notification",
"payload": {
"notificationType": "alarm",
"title": "Health",
"message": "Take morning medication",
"priority": "default",
"sound": true,
"vibrate": true,
"timestamp": 1706918400000
}
}
```
### UI Behavior
**When alarm is received:**
1. **Foreground:**
- Alarm sound starts looping
- Vibration starts looping
- Message added to chat: "🔔 ALARM: [message] (Say 'dismiss alarm' to stop)"
- Persistent notification shown
2. **Background:**
- Alarm sound starts looping
- Vibration starts looping
- Persistent notification shown
- User must open app to dismiss
## Examples
### Medication Reminder
```bash
# Set alarm for 8am daily medication
mobile-notify alarm "08:00" "Take your morning medication" --title "Health"
```
**Result:**
- At 8:00 AM, alarm sound plays on repeat
- Persistent notification: "⏰ ALARM: Health - Take your morning medication"
- User must say "dismiss alarm" to stop
### Important Meeting
```bash
# Alarm 5 minutes before critical meeting
mobile-notify alarm "14:55" "Sprint planning starts in 5 minutes" --title "Calendar"
```
### Wake-Up Alarm
```bash
# Wake up alarm for tomorrow
mobile-notify alarm "tomorrow 07:00" "Good morning! Time to wake up" --title "Wake Up"
```
### Emergency Alert
```bash
# Immediate emergency alarm
mobile-notify alert "Server is down! Check immediately!" --alarm --title "EMERGENCY" --priority high
```
## Configuration
### Custom Alarm Sound
Currently uses the system's default alarm sound. To customize in the future, modify `AlarmManager.kt`:
```kotlin
val alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)
// Replace with: Uri.parse("android.resource://" + context.packageName + "/" + R.raw.custom_alarm)
```
### Volume
Alarms respect the system's alarm volume setting (not media volume). Users control volume via:
- Volume buttons (when on alarm screen)
- Settings → Sound → Alarm volume
### Vibration Pattern
Default pattern: 500ms on, 500ms off
To customize, edit `AlarmManager.kt`:
```kotlin
val pattern = longArrayOf(0, 500, 500) // [delay, vibrate, pause]
```
## Permissions
Required permissions (already declared in `AndroidManifest.xml`):
- `android.permission.VIBRATE` - For alarm vibration
- `android.permission.POST_NOTIFICATIONS` - For showing notifications (Android 13+)
## Troubleshooting
### Alarm sound not playing
**Possible causes:**
- Alarm volume is muted (check Settings → Sound)
- Do Not Disturb mode is enabled
- Device is in silent mode
**Solution:**
- Check system alarm volume
- Disable Do Not Disturb
- Ensure alarm volume is not muted
### Alarm not stopping
**Symptom:** Alarm keeps playing after saying "dismiss alarm"
**Solution:**
- Make sure text is sent (not just voice input canceled)
- Try typing "dismiss alarm" manually
- Force-close and reopen app if stuck
### Vibration not working
**Possible causes:**
- Device doesn't support vibration (emulators)
- Vibration disabled in settings
**Solution:**
- Test on physical device
- Check Settings → Accessibility → Vibration
### Notification not showing
**Possible causes:**
- Notification permissions denied (Android 13+)
- App notifications disabled in system settings
**Solution:**
- Settings → Apps → Alfred → Notifications → Allow
- Grant notification permission when prompted
## Future Enhancements
Planned improvements:
- [ ] **Dismiss button in notification** - Tap to dismiss without opening app
- [ ] **Snooze functionality** - Delay alarm by X minutes
- [ ] **Custom alarm sounds** - Choose from device sounds or upload custom
- [ ] **Escalating volume** - Start quiet, gradually increase
- [ ] **Smart silence** - Auto-stop after X minutes (safety)
- [ ] **Multiple alarms** - Track and dismiss individually
- [ ] **Alarm history** - See past alarms and when dismissed
- [ ] **Quick alarm presets** - Common alarms with one tap
## Best Practices
### For Users
1. **Use alarms sparingly** - Reserve for truly important events
2. **Dismiss promptly** - Don't let alarms loop unnecessarily
3. **Test first** - Try a test alarm to ensure sound/vibration work
4. **Check volume** - Verify alarm volume is audible before critical alarms
5. **Battery considerations** - Alarms drain battery if left running
### For Alfred
1. **Ask when uncertain** - If user doesn't specify, ask "notification or alarm?"
2. **Default to notifications** - Only use alarms when appropriate
3. **Be explicit** - Tell user it's an alarm ("I've set an alarm...")
4. **Mention dismissal** - Remind user how to dismiss ("Say 'dismiss alarm' to stop")
5. **Confirm critical alarms** - "I've set an alarm for your medication at 8am tomorrow. It will repeat until you dismiss it."
## Version
1.0.0 - Initial alarm system (February 2026)