- feat(notifications): add `progress` and `progress_weight` properties to `Notification` object and show the progress on the header of the app
- feat(core): show the progress of the update using the new `progress` property of the `Notification` object
- fix(camera): render the viewfinder on the display even if the display is paused - closes 78
- refactor(core): make the power-off menu, a sub-menu with power-off and reboot action items - closes 123
- fix(core): headed menus not showing the first item in the list - closes 144
- refactor(system): generate the hostname of the device based on a hash of its serial number
- feat(core): show hostname of device on the home page - closes 128
- feat(core): long-pressing the reset button for 3 seconds or more reboots the device - closes 116
- fix(keypad): keypad becoming unresponsive if a key was pressed while the app was loading - closes 118
- fix(camera): closing the camera viewfinder will close the picamera instance so that it can be used again
- refactor(core): use python-fake for faking
- refactor(tests): wait for wifi status icons in `test_wireless`
- refactor(core): move `ubo_app.utils.loop` to `ubo_app.service` and add service properties like `service_id`, `name`, `label`, etc as module level variables to it
- refactor(core): make `UboModuleLoader` to keep a weakref of the module in its cache instead of an actual reference
- refactor(core): use the new `key` property of ubo-gui `Item`s to keep opened menus open when something changes in the parent menus - closes 145, closes 146, closes 147
- fix(core): make sure logs are set up after reading environment variables and before starting the app
- feat(keypad): add epoch time to keypad actions and events in `time` field
- feat(voice): add piper engine to voice service as the default engine and a menu to select the engine - closes 120
- refactor(notification): add `NotificationExtraInformation` with `text`, `piper_text`, and `orca_text` to replace the simple strings passed to `extra_information` field of the `Notification` object
- refactor(audio): rename sound service to audio service
- refactor(audio): drop `pyaudio` and use `simpleaudio` for playback
- feat(core): setting `DEBUG_MODE_MENU` environment variable to truthy values will show a representation of the menu in the logs whenever the current menu is changed
- fix(ip): close sockets opened for testing the internet connection - closes 126