Control boundary
The app does not automate PowerPoint through a network API. It presents itself as a Bluetooth keyboard, so the host needs no companion software and receives the same standard keys as a physical presenter.
| UI and lifecycle | Kotlin, Jetpack Compose, Android foreground service |
|---|---|
| Transport | Shared Classic HID / BLE HOGP selection |
| Command state | Connected or disconnected, with one in-flight command and a bounded queue |
| Host dependency | The active presentation application must interpret the standard keys |
Five semantic commands
| Action | HID key sequence |
|---|---|
| Next | Page Down |
| Previous | Page Up |
| Start from beginning | F5, then Home |
| Start from current slide | Shift + F5 |
| Stop | Escape |
These mappings are kept as semantic commands until dispatch. That separation lets the UI describe presentation intent while the protocol layer owns key usage codes and neutral reports.
Scheduler rules
The scheduler permits input immediately after a usable connection; there is no hidden “armed” state. It serializes one command at a time and caps pending work at 16 entries.
- Adjacent opposite navigation commands cancel before transmission.
- Start commands are accepted only when no command is in flight or waiting.
- Stop clears pending navigation and becomes the next barrier command.
- Disconnect discards waiting commands so old taps cannot replay after reconnect.
- The F5-to-Home sequence has a 500 ms gap so the slideshow window exists before Home arrives.
Pressed and neutral reports
Each key command is sent as one burst containing the pressed report and its neutral release. The presenter therefore disables the generic release watchdog: adding another neutral report would increase traffic without closing a real hold window.
Stale commands are more dangerous than dropped commands. During a presentation, replaying an old Next after reconnection changes visible content, so the queue favors bounded rejection and generation-scoped dispatch.
The foreground service owns the HID session and participates in the same signed-sibling handoff as the Keyboard and Mouse apps. Shutdown returns neutral state before disconnecting and unregistering.
Verification and known limits
Tests cover key mappings, queue capacity, opposite-command cancellation, start and stop barriers, battery policy, session routing, lifecycle recovery, and accessibility hit regions.
- The app cannot know the current PowerPoint slide or whether a slideshow window has focus.
- Key behavior may differ in presentation software that does not follow PowerPoint shortcuts.
- Bluetooth delivery confirms transport activity, not that the application acted on the key.