UpdateEventTool
Updates an existing CalendarContract.Events row identified by event_id, writing only the fields the caller supplies (title, description, location, start, end, all_day). Requires WRITE_CALENDAR (plus READ_CALENDAR for the lookup).
Errors when the event doesn't exist (or is already marked deleted), when its calendar is read-only (CALENDAR_ACCESS_LEVEL below CAL_ACCESS_CONTRIBUTOR), or when no updatable field is given. Times are parsed strictly like CreateEventTool (yyyy-MM-dd HH:mm, device timezone); all-day events take yyyy-MM-dd at UTC midnight with an exclusive end, matching what read_calendar returns. When only one of start/end is given, end > start is checked against the event's stored other side (see CalendarUtils.resolveTimeUpdate). Changing all_day needs both start and end. Text changes to a recurring event apply to the whole series; changing a recurring event's times is refused, since its length is stored as a DURATION rather than an end time.
Output: event_id, updated_fields (the parameter names that were written), and the event's resulting title, start, end (yyyy-MM-dd HH:mm, UTC for all-day events; end is null for recurring events) and all_day.