* Add missing Android node command families (parity gap)
- Implement Notifications, System, Photos, Contacts, Calendar, and Motion command families.
- Add OpenClawNotificationListenerService and NotificationManager for notification support.
- Implement robust runtime permission checks and structured error handling in all handlers.
- Wire new handlers into NodeRuntime, InvokeDispatcher, and ConnectionManager.
- Conditionally advertise capabilities to the gateway based on granted permissions.
- Add unit tests for command routing and handler logic.
- Update AndroidManifest.xml with necessary permissions and service declarations.
Co-authored-by: yuga-hashimoto <74749461+yuga-hashimoto@users.noreply.github.com>
* Refine Android node command families based on PR feedback
- Implement actual Notification actions (dismiss, open) using NotificationListenerService.
- Correct permission gating for Notifications (use Listener Service check instead of POST_NOTIFICATIONS).
- Add runtime permission check for system.notify on Android 13+.
- Improve Calendar event insertion by querying for a writable calendar instead of hardcoding ID 1.
- Update capability advertisement in ConnectionManager to reflect true availability.
- Enhance PhotosHandler and MotionHandler with more complete implementations.
- Update unit tests to match refined permission and action logic.
Co-authored-by: yuga-hashimoto <74749461+yuga-hashimoto@users.noreply.github.com>
* Finalize Android node command families with refined notification support
- Implement dismiss/open notification actions using NotificationListenerService.
- Return NOT_IMPLEMENTED for reply notification action as requested.
- Fix permission gating for notifications (use listener service status).
- Add runtime permission check for system notifications on Android 13+.
- Improve calendar event creation with dynamic writable calendar selection.
- Refine capability advertising in ConnectionManager.
- Clean up unused imports and duplicated logic.
- Update unit tests to match refined behavior.
Co-authored-by: yuga-hashimoto <74749461+yuga-hashimoto@users.noreply.github.com>
* fix: address review issues in node command families PR
- MotionHandler: add close() to unregister SensorEventListener on disconnect
- NodeRuntime: call motionHandler.close() in disconnect() for proper cleanup
- OpenClawNotificationListenerService: add @Volatile to companion manager field
- SystemHandlerTest: replace unconditional SDK_INT branch with asserting tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: add on-demand permission requests to new node command handlers
Contacts, Calendar, Photos, and Motion handlers now use PermissionRequester
to show the system permission dialog when a command is first invoked,
matching the existing SMS/Camera handler pattern.
- ContactsHandler, CalendarHandler, PhotosHandler, MotionHandler:
add attachPermissionRequester() + ensureXPermission() suspend helpers,
convert handle methods to suspend fun
- PermissionRequester: add human-readable labels for new permissions
- NodeRuntime: expose attachPermissionRequester() delegating to all handlers
- MainActivity: wire permissionRequester to new handlers on startup
- InvokeDispatcherTest: update every -> coEvery for suspend handler mocks
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: guide user to notification listener settings via dialog
When notifications.list or notifications.actions is invoked without
notification access, show an AlertDialog explaining the requirement
and open ACTION_NOTIFICATION_LISTENER_SETTINGS on confirmation.
- PermissionRequester: add requestNotificationAccess() suspend fun
- NotificationsHandler: add PermissionRequester wiring, make handle
methods suspend, call requestNotificationAccess() before error return
- NodeRuntime.attachPermissionRequester: include notificationsHandler
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* add funding
---------
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>