~aleteoryx/muditaos

90117445f1372a9d302c5cb226510cb39c6dba21 — Przemyslaw Brudny 4 years ago e993a0b + 6e9ddbe
Merge remote-tracking branch 'origin/stable'

# Conflicts:
#	tools/download_asset2.py
42 files changed, 379 insertions(+), 286 deletions(-)

M README.md
M doc/quickstart.md
M image/assets/lang/Deutsch.json
M image/assets/lang/English.json
M image/assets/lang/Espanol.json
M image/assets/lang/Francais.json
M image/assets/lang/Polski.json
M module-bsp/board/linux/usb_cdc/usb_cdc.cpp
M module-bsp/board/rt1051/bellpx/hal/battery_charger/BatteryCharger.cpp
M module-bsp/bsp/usb/usb.hpp
M module-services/service-desktop/WorkerDesktop.cpp
M module-vfs/README.md
M module-vfs/drivers/include/purefs/fs/drivers/file_handle_ext4.hpp
M module-vfs/drivers/include/purefs/fs/drivers/file_handle_littlefs.hpp
M module-vfs/drivers/include/purefs/fs/drivers/file_handle_vfat.hpp
M module-vfs/drivers/src/purefs/fs/filesystem_ext4.cpp
M module-vfs/include/user/purefs/fs/file_handle.hpp
M module-vfs/include/user/purefs/fs/filesystem.hpp
M module-vfs/include/user/purefs/fs/handle_mapper.hpp
M module-vfs/src/purefs/fs/filesystem.cpp
M products/BellHybrid/apps/application-bell-main/ApplicationBellMain.cpp
M products/BellHybrid/apps/application-bell-main/include/application-bell-main/ApplicationBellMain.hpp
M products/BellHybrid/apps/application-bell-main/widgets/BellBattery.cpp
M products/BellHybrid/apps/application-bell-main/windows/BellBatteryStatusWindow.cpp
M products/BellHybrid/apps/application-bell-meditation-timer/ApplicationBellMeditationTimer.cpp
M products/BellHybrid/apps/application-bell-meditation-timer/CMakeLists.txt
M products/BellHybrid/apps/application-bell-meditation-timer/presenter/IntervalChimePresenter.cpp
M products/BellHybrid/apps/application-bell-meditation-timer/presenter/MeditationProgressPresenter.cpp
D products/BellHybrid/apps/application-bell-meditation-timer/windows/SessionEndWindow.cpp
D products/BellHybrid/apps/application-bell-meditation-timer/windows/SessionEndWindow.hpp
M products/BellHybrid/apps/application-bell-meditation-timer/windows/SessionPausedWindow.cpp
M products/BellHybrid/apps/application-bell-onboarding/include/application-bell-onboarding/ApplicationBellOnBoarding.hpp
M products/BellHybrid/apps/application-bell-settings/windows/alarm_settings/BellSettingsAlarmSettingsMenuWindow.cpp
M products/BellHybrid/apps/common/include/common/data/StyleCommon.hpp
M products/BellHybrid/apps/common/src/popups/AlarmActivatedWindow.cpp
M products/BellHybrid/apps/common/src/popups/AlarmDeactivatedWindow.cpp
M products/BellHybrid/services/appmgr/ApplicationManager.cpp
M products/BellHybrid/services/appmgr/include/appmgr/ApplicationManager.hpp
M products/BellHybrid/sys/SystemManager.cpp
M products/BellHybrid/sys/include/sys/SystemManager.hpp
M third-party/usb_stack
M tools/download_asset2.py
M README.md => README.md +5 -5
@@ 28,7 28,7 @@ MuditaOS is a mobile operating system optimized for E Ink displays. Built on Fre
- system manager that restores the system after switching on the device or performs the initial start-up
- application manager for managing application lifecycle 
- SQLite database for storing contacts and notes
- VFS (Virtual File System) + file storage based on `littlefs` (little fail-safe file system)
- VFS (Virtual File System) + file storage based on `lwext4`
- MTP (Media Transfer Protocol) support

## Table of contents


@@ 85,18 85,18 @@ A fully detailed documentation can be build locally using [Doxygen](https://www.

### How to generate documentation using Doxygen

You can build code documentation with the following command:
You can build code documentation with the following command, regarding the product:

```bash
./configure linux Debug
cd build-linux-Debug
./configure (PurePhone|BellHybrid) linux Debug
cd build-(PurePhone|BellHybrid)-linux-Debug
make doc
```
If you prefer to build documentation always with `all` target instead, configure `cmake`
with `BUILD_DOC_WITH_ALL` option set to `ON`, e.g.:

```bash
./configure <target> <build_type> -DBUILD_DOC_WITH_ALL=ON
./configure <product> <target> <build_type> -DBUILD_DOC_WITH_ALL=ON
```

Documentation is generated in the `doc/html` subdirectory of the build directory. To view it open `index.html` using a web browser, e.g.:

M doc/quickstart.md => doc/quickstart.md +21 -21
@@ 37,11 37,11 @@ git submodule update --init --recursive
```bash
git pull --recurse-submodules
```
3. Build the project
3. Build the project for proper product:

```bash
./configure.sh [rt1051|linux] [release|debug|relwithdebinfo]
cd build-[rt1051|linux]-[release|debug|relwithdebinfo]
./configure.sh [PurePhone|BellHybrid] [rt1051|linux] [release|debug|relwithdebinfo]
cd build-[PurePhone|BellHybrid]-[rt1051|linux]-[release|debug|relwithdebinfo]
make
```
### CMake options


@@ 70,12 70,12 @@ By using `ENABLE_APP_X` (where `X` is the name of the application) you can enabl
Here's the bare minimum that will enable you to bootstrap the environment on Linux.

```bash
git submodule update --init --recursive                        # initialize submodules
cd ./config/ && ./bootstrap.sh 0- && cd ../                    # bootstrap requirements
./configure.sh rt1051|linux Debug|Release|RelWithDebInfo       # configure build
cd <build-dir>                                                 # build dir depends on configuration
make Pure                                               # build
./PurePhone.elf                                                # run PurePhone - simulator screen will pop up (on the Linux filesystem)
git submodule update --init --recursive                                             # initialize submodules
cd ./config/ && ./bootstrap.sh 0- && cd ../                                         # bootstrap requirements
./configure.sh PurePhone|BellHybrid rt1051|linux Debug|Release|RelWithDebInfo       # configure build
cd <build-dir>                                                                      # build dir depends on configuration
make Pure                                                                           # build
./PurePhone.elf                                                                     # run PurePhone - simulator screen will pop up (on the Linux filesystem)
```

If you want to run the simulator with image and our VFS implementation


@@ 89,7 89,7 @@ you need to run the image through the script:
After going through the Super dirty quickstart on Linux, run the following commands to build and run all unit tests:

```bash
./configure.sh linux debug
./configure.sh PurePhone|BellHybrid linux debug
cd <build-dir>
make check
```


@@ 103,8 103,8 @@ make check
cp ./env.cmake.sample ./env.cmake && sed -i "s:<HOME>:$HOME:" env.cmake
git submodule update --init --recursive
cd ./config/ && ./bootstrap.sh 0- && cd ../
./configure.sh rt1051 RelWithDebInfo
cd build-arm-RelWithDebInfo
./configure.sh PurePhone|BellHybrid rt1051 RelWithDebInfo
cd build-PurePhone|BellHybrid-rt1051-RelWithDebInfo
make Pure

```


@@ 112,7 112,7 @@ make Pure
3. Please take the following steps in three parallel consoles/sessions:

 - Start J-Link server: `./StartJLinkServer.sh`
 - Load app with GDB via J-Link connected to Mudita Pure: `./run.sh <build folder>`
 - Load app with GDB via J-Link connected to Mudita Pure: `./run.sh <build folder> --product PurePhone`
 - Catch logs from Mudita Pure from J-Link RTT and write them to `/tmp/log.txt`: `JLinkRTTClient | tee /tmp/log.txt`

#### Catching logs using UART


@@ 221,32 221,32 @@ you will see the list of groups your user is assigned to.

2. Configure for Linux Debug: 
```bash
./in_docker.sh config linux Debug
./in_docker.sh config PurePhone|BellHybrid linux Debug
```

3. Build linux Debug:
```bash
./in_docker.sh make build-linux-Debug
./in_docker.sh make build-PurePhone|BellHybrid-linux-Debug
```

4. Build RT1051 Release
```bash
./in_docker.sh config rt1051 Release
./in_docker.sh make build-rt1051-Release
./in_docker.sh config PurePhone|BellHybrid rt1051 Release
./in_docker.sh make build-PurePhone|BellHybrid-rt1051-Release
```
5. Build and run tests (Linux only)

```bash
./in_docker.sh make build-linux-Debug
./in_docker.sh make build-linux-Debug check
./in_docker.sh make build-PurePhone|BellHybrid-linux-Debug
./in_docker.sh make build-PurePhone|BellHybrid-linux-Debug check
```
To build selected test manually in the working directory of attached Docker image run:
```bash
cd ./build-linux-Debug ; make <test_name>; ./<test_name>
cd ./build-PurePhone|BellHybrid-linux-Debug ; make <test_name>; ./<test_name>
```
i.e.:
```bash
cd ./build-linux-Debug ; make unittest_gui && ./unittest_gui
cd ./build-PurePhone|BellHybrid-linux-Debug ; make unittest_gui && ./unittest_gui
```
Running tests checks memory leaks too - this might be helpful in creation of new widgets.


M image/assets/lang/Deutsch.json => image/assets/lang/Deutsch.json +33 -25
@@ 613,19 613,26 @@
  "app_bellmain_alarm": "Alarm",
  "app_bellmain_power_nap": "Kraft-Schläfchen",
  "app_bellmain_meditation_timer": "Meditation-Timer",
  "app_bellmain_background_sounds": "Hintergrundklänge",
  "app_bellmain_background_sounds": "Klangbibliothek",
  "app_bellmain_bedtime": "Schlafenzeit",
  "app_bellmain_settings": "Einstellungen",
  "app_bell_bedtime_notification": "Schlafenszeit",
  "app_bell_alarm_set_not_active": "<text>Alarm eingestellt.<br />Tief drücken, um zu aktivieren.</text>",
  "app_bell_powernap_session_ended_message": "<text>Guten Morgen!<br />Stehen Sie auf</text>",
  "app_bell_powernap_session_ended_message": "<text>Guten morgen!<br>Zeit zum aufstehen</text>",
  "app_bell_background_sounds_timer_title": "Timer",
  "app_bell_background_sounds_timer_off": "AUS",
  "app_bell_settings_home_view": "Home-Ansicht",
  "app_bell_onboarding_welcome_message": "Mudita Harmony",
  "app_bell_onboarding_info_rotate": "<text font='gt_pressura' weight='regular' size='38'>Drehen </text><text font='gt_pressura' weight='light' size='38'> um auszuwählen</text>",
  "app_bell_onboarding_info_light_click": "<text font='gt_pressura' weight='regular' size='38'>Leichter Klick </text><text font='gt_pressura' weight='light' size='38'>um fortzufahren</text>",
  "app_bell_onboarding_info_deep_click_warning": "<text font='gt_pressura' weight='light' size='38'>Sie haben </text><text font='gt_pressura' weight='regular' size='38'>tief gedrückt</text>",
  "app_bell_onboarding_info_deep_click_correction": "<text font='gt_pressura' weight='light' size='38'>Seien Sie sanfter,<br></br>versuchen </text><text font='gt_pressura' weight='regular' size='38'>Sie diesmal </text><text font='gt_pressura' weight='light' size='38'>leicht klicken</text>",
  "app_bell_settings_home_view": "Startansicht",
  "app_bell_settings_alarm_settings": "Alarmeinstellungen",
  "app_bell_settings_bedtime_tone": "Schlafenszeit-Klang",
  "app_bell_settings_bedtime_settings_tone": "Schlafenszeit-Klang",
  "app_bell_settings_bedtime_settings_volume": "<text>Schlafenzeit-Lautstärke</text>",
  "app_bell_settings_advanced": "erweitert",
  "app_bell_settings_alarm_settings_title": "Alarmeinstellungen",
  "app_bell_settings_bedtime_tone": "Schlafens-Klang",
  "app_bell_settings_bedtime_settings_tone": "Klang",
  "app_bell_settings_bedtime_settings_volume": "<text>Lautstärke</text>",
  "app_bell_settings_advanced": "Erweitert",
  "app_bell_settings_turn_off": "Ausschalten",
  "app_bell_settings_advanced_time_units": "Zeit und Einheiten",
  "app_bell_settings_advanced_language": "Sprache",


@@ 633,38 640,39 @@
  "app_bell_settings_advanced_about_product": "Mudita Harmony",
  "app_bell_settings_advanced_about_version": "<text>OS-Version: <token>$VERSION</token></text>",
  "app_bell_settings_advanced_about_storage_title": "Speicher",
  "app_bell_settings_advanced_about_storage_text": "<text><token>$USED_MEMORY</token>MB von <token>$TOTAL_MEMORY</token>MB belegt</text>",
  "app_bell_settings_advanced_about_storage_text": "<text>Verbraucht <token>$USED_MEMORY</token>MB von <token>$TOTAL_MEMORY</token>MB</text>",
  "app_bell_settings_advanced_about_info_title": "Handbuch & Zertifikat-Info",
  "app_bell_settings_advanced_about_info_text": "www.mudita.com",
  "app_bell_settings_alarm_settings_prewake_up": "Sanftes Wecken",
  "app_bell_settings_alarm_settings_prewake_up_chime_top_description": "Gong vor dem Aufwachen",
  "app_bell_settings_alarm_settings_prewake_up_chime_top_description": "Klang vor dem Aufwachen",
  "app_bell_settings_alarm_settings_prewake_up_chime_bottom_description": "vor dem Alarm",
  "app_bell_settings_alarm_settings_prewake_up_chime_tone": "Bevor Aufwachen-Klanggong",
  "app_bell_settings_alarm_settings_prewake_up_chime_volume": "Bevor Aufwachen-Klanggonglautstärke",
  "app_bell_settings_alarm_settings_prewake_up_light_top_description": "Bevor Aufwachen-Licht",
  "app_bell_settings_alarm_settings_prewake_up_chime_tone": "Klang",
  "app_bell_settings_alarm_settings_prewake_up_chime_volume": "Lautstärke",
  "app_bell_settings_alarm_settings_prewake_up_light_top_description": "Licht",
  "app_bell_settings_alarm_settings_prewake_up_light_bottom_description": "vor dem Alarm",
  "app_bell_settings_alarm_settings_prewake_up_finished": "Bevor Aufwachen-Funktion ist eingestellt",
  "app_bell_settings_alarm_settings_alarm_tone_and_light": "Alarmton & Leuchte",
  "app_bell_settings_alarm_settings_alarm_tone_and_light": "Hauptalarm",
  "app_bell_settings_alarm_settings_tone": "Alarmton",
  "app_bell_settings_alarm_settings_volume": "Alarmlautstärke",
  "app_bell_settings_alarm_settings_light": "Alarmleuchte",
  "app_bell_settings_alarm_settings_alarm_tone_and_light_finished": "Alarmton & Leuchte ist eingestellt",
  "app_bell_settings_alarm_settings_snooze": "Schlummer",
  "app_bell_settings_alarm_settings_snooze_length": "Schlummerlänge",
  "app_bell_settings_alarm_settings_snooze_chime_interval": "Schlummer Klangintervall",
  "app_bell_settings_alarm_settings_snooze_chime_interval_bot_desc": "wiederkehrende während des Schlummers",
  "app_bell_settings_alarm_settings_snooze_chime_tone": "Schlummer-Klanggong",
  "app_bell_settings_alarm_settings_snooze_chime_volume": "Schlummerklang-Lautstärke",
  "app_bell_settings_alarm_settings_snooze_finished": "Schlummer ist eingestellt",
  "app_bell_settings_alarm_settings_snooze_chime_interval_bot_desc": "während des Schlummern",
  "app_bell_settings_alarm_settings_snooze_chime_tone": "Schlummer-Klang",
  "app_bell_settings_alarm_settings_snooze_chime_volume": "Lautstärke",
  "app_bell_settings_advanced_frontlight": "Frontlicht",
  "app_bell_settings_frontlight_mode_top_message": "Frontlichtmodus",
  "app_bell_settings_frontlight_mode_auto": "automatisch",
  "app_bell_settings_frontlight_mode_on_demand": "auf Anfrage",
  "app_bell_settings_frontlight_mode_on_demand": "manuell",
  "app_bell_settings_frontlight_top_message": "Lichtstärke des Frontlichts",
  "app_bell_settings_frontlight_finished_message": "Frontlicht ist eingestellt",
  "app_bell_settings_advanced_language_set": "Sprache ist eingestellt",
  "app_bell_settings_time_units_finished_message": "Zeit & Einheiten werden eingestellt",
  "app_bell_greeting_msg": "Guten Morgen! Stehen Sie auf",
  "app_bell_settings_advanced_factory_reset": "Fabrikrückstellung",
  "app_bell_settings_display_factory_reset_confirmation": "<text>Auf Fabrikeinstellungen<br></br>zurücksetzen ?</text>"
  "app_bell_settings_advanced_factory_reset": "Fabrikeinstellungen",
  "app_bell_settings_display_factory_reset_confirmation": "<text>Auf Fabrikeinstellungen<br></br>zurücksetzen ?</text>",
  "app_bell_meditation_timer": "Meditation-Timer",
  "app_bell_meditation_interval_chime": "Intervallschall",
  "app_bell_meditation_progress": "Meditation-Timer",
  "app_bell_meditation_interval_none": "kein",
  "app_bell_meditation_interval_every_x_minutes": "jede %0 Minuten",
  "app_bell_meditation_put_down_and_wait": "<text>Legen Sie Mudita Harmony<br>ab und warten Sie auf den Gong</text>",
  "app_bell_meditation_thank_you_for_session": "<text>Danke für<br>die Sitzung</text>"
}

M image/assets/lang/English.json => image/assets/lang/English.json +7 -18
@@ 585,26 585,21 @@
  "tethering_menu_access_decline": "<text>Tethering is on.<br /><br />To access menu,<br />turn tethering off.</text>",
  "app_bell_settings_time_units_time_fmt_top_message": "Time format",
  "app_bell_settings_time_units_time_message": "Time",
  "app_bell_settings_time_units_finished_message": "Time and units are set.",
  "app_bellmain_alarm": "Alarm",
  "app_bellmain_bedtime": "Bedtime",
  "app_bell_bedtime_set_finished": "<text>Bedtime reminder<br />is set<text>",
  "app_bell_bedtime_notification": "It is Your bedtime",
  "app_bellmain_power_nap": "Power nap",
  "app_bellmain_meditation_timer": "Meditation",
  "app_bellmain_background_sounds": "Library",
  "app_bellmain_background_sounds": "Relaxation",
  "app_bellmain_settings": "Settings",
  "app_bellmain_main_window_title": "Bell Hybrid+",
  "app_bellmain_main_window_title": "Mudita Harmony",
  "app_bell_meditation_timer": "Meditation",
  "app_bell_meditation_interval_chime": "Interval chime",
  "app_bell_meditation_progress": "Meditation timer",
  "app_bell_meditation_interval_none": "None",
  "app_bell_meditation_interval_every_x_minutes": "every %0",
  "app_bell_meditation_put_down_and_wait": "<text>Put down Bell Harmony<br>and wait for the gong</text>",
  "app_bell_meditation_put_down_and_wait": "<text>Put down Mudita Harmony<br>and wait for the gong</text>",
  "app_bell_meditation_thank_you_for_session": "<text>Thank you for<br>the session</text>",
  "app_bell_meditation_minute": "minute",
  "app_bell_meditation_minutes": "minutes",
  "app_bell_meditation_paused": "<text>Paused</text>",
  "app_bell_onboarding_welcome_message": "Mudita Harmony",
  "app_bell_onboarding_info_rotate": "<text font='gt_pressura' weight='regular' size='38'>Rotate </text><text font='gt_pressura' weight='light' size='38'>to select</text>",
  "app_bell_onboarding_info_light_click": "<text font='gt_pressura' weight='regular' size='38'>Light click </text><text font='gt_pressura' weight='light' size='38'>to continue</text>",


@@ 615,7 610,6 @@
  "app_bell_settings_advanced_time_units": "Time & units",
  "app_bell_settings_advanced_temp_scale": "Temperature scale",
  "app_bell_settings_advanced_language": "Language",
  "app_bell_settings_advanced_language_set": "Language is set",
  "app_bell_settings_advanced_about": "About",
  "app_bell_settings_advanced_about_product": "Mudita Harmony",
  "app_bell_settings_advanced_about_version": "<text>OS version: <token>$VERSION</token></text>",


@@ 623,7 617,8 @@
  "app_bell_settings_advanced_about_storage_text": "<text><token>$USED_MEMORY</token>MB of <token>$TOTAL_MEMORY</token>MB used</text>",
  "app_bell_settings_advanced_about_info_title": "Manual & certification info",
  "app_bell_settings_advanced_about_info_text": "www.mudita.com",
  "app_bell_settings_alarm_settings": "Alarms settings",
  "app_bell_settings_alarm_settings": "Alarm",
  "app_bell_settings_alarm_settings_title": "Alarm settings",
  "app_bell_settings_alarm_settings_tone": "Alarm tone",
  "app_bell_settings_alarm_settings_volume": "Alarm volume",
  "app_bell_settings_alarm_settings_light": "Alarm light",


@@ 634,17 629,13 @@
  "app_bell_settings_alarm_settings_prewake_up_chime_volume": "Pre-wake up chime volume",
  "app_bell_settings_alarm_settings_prewake_up_light_top_description": "Pre-wake up light",
  "app_bell_settings_alarm_settings_prewake_up_light_bottom_description": "before the alarm",
  "app_bell_settings_alarm_settings_prewake_up_finished": "Pre-wake up is set",
  "app_bell_settings_alarm_settings_alarm_tone_and_light": "Main alarm",
  "app_bell_settings_alarm_settings_alarm_tone_and_light_finished": "Alarm tone & light is set",
  "app_bell_settings_bedtime_tone": "Bedtime tone",
  "app_bell_settings_bedtime_settings_tone": "Bedtime tone",
  "app_bell_settings_bedtime_settings_volume": "<text>Bedtime tone<br />volume</text>",
  "app_bell_settings_bedtime_tone_finished": "Bedtime tone is set",
  "app_bell_settings_home_view": "Home view",
  "app_bell_settings_turn_off": "Turn off",
  "app_bell_settings_alarm_settings_snooze": "Snooze",
  "app_bell_settings_alarm_settings_snooze_finished": "Snooze is set",
  "app_bell_settings_alarm_settings_snooze_length": "Snooze length",
  "app_bell_settings_alarm_settings_snooze_chime_interval": "Snooze chime interval",
  "app_bell_settings_alarm_settings_snooze_chime_interval_bot_desc": "<text>recurring during<br />snooze</text>",


@@ 659,12 650,11 @@
  "app_bell_settings_advanced_frontlight": "Frontlight",
  "app_bell_settings_frontlight_top_message": "Frontlight intensity",
  "app_bell_settings_frontlight_mode_top_message": "Frontlight mode",
  "app_bell_settings_frontlight_finished_message": "Frontlight is set",
  "app_bell_settings_frontlight_mode_auto": "auto",
  "app_bell_settings_frontlight_mode_on_demand": "on demand",
  "app_bell_powernap_session_ended_message": "<text>Hello!<br />Rise & shine</text>",
  "app_bell_background_sounds_timer_title": "Auto turn off",
  "app_bell_turn_off_question": "Turn off the device?",
  "app_bell_turn_off_question": "Turn off Mudita Hamrony?",
  "app_bell_goodbye": "Goodbye",
  "app_bell_reset_message": "<text>Resetting Mudita<br />Harmony</text>",
  "app_bell_greeting_msg": [


@@ 720,6 710,5 @@
    "<text>It's a new Day!<br />Spread  kindness everywhere you go</text>"
  ],
  "app_bell_settings_advanced_factory_reset": "Factory reset",
  "app_bell_settings_display_factory_reset_confirmation": "<text>Reset to factory<br></br>settings ?</text>",
  "app_bell_settings_factory_reset_finished": "Factory settings\nrestored"
  "app_bell_settings_display_factory_reset_confirmation": "<text>Reset to factory<br></br>settings ?</text>"
}

M image/assets/lang/Espanol.json => image/assets/lang/Espanol.json +34 -26
@@ 603,67 603,75 @@
  "app_bellmain_home_screen_bottom_desc": "La siguiente alarma sonará",
  "app_bellmain_home_screen_bottom_desc_in": "en",
  "app_bell_alarm_deactivated": "Alarma desactivada",
  "app_bell_turn_off_question": "¿Apagar el aparato?",
  "app_bell_turn_off_question": "¿Apagar Mudita Harmony?",
  "app_bell_goodbye": "Adiós",
  "app_bell_settings_time_units_time_fmt_top_message": "Formato de hora",
  "app_bell_settings_time_units_time_message": "Hora",
  "app_bell_settings_advanced_temp_scale": "Escala de temperatura",
  "app_bell_onboarding_finalize": "¡Bien hecho!",
  "app_bell_onboarding_welcome_message": "Mudita Harmony",
  "app_bell_onboarding_info_rotate": "<text font='gt_pressura' weight='regular' size='38'>Girar </text><text font='gt_pressura' weight='light' size='38'> para seleccionar</text>",
  "app_bell_onboarding_info_light_click": "<text font='gt_pressura' weight='regular' size='38'>Presiona ligeramente </text><text font='gt_pressura' weight='light' size='38'>para continuar</text>",
  "app_bell_onboarding_info_deep_click_warning": "<text font='gt_pressura' weight='light' size='38'>Has presionado </text><text font='gt_pressura' weight='regular' size='38'>a fondo</text>",
  "app_bell_onboarding_info_deep_click_correction": "<text font='gt_pressura' weight='light' size='38'>Sé más suave, <br></br>intenta </text><text font='gt_pressura' weight='regular' size='38'>presionar ligeramente </text><text font='gt_pressura' weight='light' size='38'>esta vez</text>",
  "app_bellmain_home_screen_bottom_desc_dp": "Presionar a fondo para activar",
  "app_bellmain_alarm": "Alarma",
  "app_bellmain_power_nap": "Siesta",
  "app_bellmain_meditation_timer": "Temporizador de meditación",
  "app_bellmain_meditation_timer": "Meditación",
  "app_bellmain_background_sounds": "Sonidos de fondo",
  "app_bellmain_bedtime": "Hora de dormir",
  "app_bellmain_settings": "Ajustes",
  "app_bell_bedtime_notification": "Es tu hora de dormir",
  "app_bell_powernap_session_ended_message": "¡Hola! Levántate y brilla",
  "app_bell_background_sounds_timer_title": "Temporizador",
  "app_bell_background_sounds_timer_off": "OFF",
  "app_bell_settings_home_view": "Vista de inicio",
  "app_bell_settings_alarm_settings": "Ajustes de alarma",
  "app_bell_settings_bedtime_tone": "Tono de Hora de dormir",
  "app_bell_settings_bedtime_settings_tone": "Tono de Hora de dormir",
  "app_bell_settings_bedtime_settings_volume": "<text>Volumen de Hora<br />de dormir</text>",
  "app_bell_settings_alarm_settings_title": "Ajustes de alarma",
  "app_bell_settings_bedtime_tone": "Hora de dormir",
  "app_bell_settings_bedtime_settings_tone": "Hora de dormir",
  "app_bell_settings_bedtime_settings_volume": "Volumen",
  "app_bell_settings_advanced": "Avanzados",
  "app_bell_settings_turn_off": "Apagar",
  "app_bell_settings_advanced_time_units": "Hora y unidades",
  "app_bell_settings_advanced_language": "Idioma",
  "app_bell_settings_advanced_about": "Sobre el dispositivo",
  "app_bell_settings_advanced_about": "Información",
  "app_bell_settings_advanced_about_product": "Mudita Harmony",
  "app_bell_settings_advanced_about_version": "<text>Versión del SO: <token>$VERSION</token></text>",
  "app_bell_settings_advanced_about_storage_title": "Almacenamiento",
  "app_bell_settings_advanced_about_storage_text": "<text>Usados <token>$USED_MEMORY</token>MB de <token>$TOTAL_MEMORY</token>MB</text>",
  "app_bell_settings_advanced_about_info_title": "Manual e información de la certificación",
  "app_bell_settings_advanced_about_info_title": "Manual y certificación",
  "app_bell_settings_advanced_about_info_text": "www.mudita.com",
  "app_bell_settings_advanced_frontlight": "Luz frontal",
  "app_bell_settings_alarm_settings_prewake_up": "Despertar gradual",
  "app_bell_settings_alarm_settings_prewake_up_chime_top_description": "Timbre de Antes de despertar",
  "app_bell_settings_alarm_settings_prewake_up_chime_top_description": "Despertar gradualmente",
  "app_bell_settings_alarm_settings_prewake_up_chime_bottom_description": "antes de la alarma",
  "app_bell_settings_alarm_settings_prewake_up_chime_tone": "Tono del timbre de Antes de despertar",
  "app_bell_settings_alarm_settings_prewake_up_chime_volume": "Volumen del timbre de Antes de despertar",
  "app_bell_settings_alarm_settings_prewake_up_light_top_description": "Luz de Antes de despertar",
  "app_bell_settings_alarm_settings_prewake_up_chime_tone": "Tono",
  "app_bell_settings_alarm_settings_prewake_up_chime_volume": "Volumen",
  "app_bell_settings_alarm_settings_prewake_up_light_top_description": "Luz",
  "app_bell_settings_alarm_settings_prewake_up_light_bottom_description": "antes de la alarma",
  "app_bell_settings_alarm_settings_prewake_up_finished": "El Antes de despertar está programado",
  "app_bell_settings_alarm_settings_alarm_tone_and_light": "Tono y luz de alarma",
  "app_bell_settings_alarm_settings_alarm_tone_and_light": "Alarma principal",
  "app_bell_settings_alarm_settings_tone": "Tono de alarma",
  "app_bell_settings_alarm_settings_volume": "Volumen de alarma",
  "app_bell_settings_alarm_settings_light": "Luz de alarma",
  "app_bell_settings_alarm_settings_alarm_tone_and_light_finished": "El tono y la luz de alarma están programados",
  "app_bell_settings_alarm_settings_snooze": "Repetición",
  "app_bell_settings_alarm_settings_snooze": "Posponer",
  "app_bell_settings_alarm_settings_snooze_length": "Duración de Repetición",
  "app_bell_settings_alarm_settings_snooze_chime_interval": "Intervalo del timbre de Repetición",
  "app_bell_settings_alarm_settings_snooze_chime_interval_bot_desc": "recurrente durante Repetición",
  "app_bell_settings_alarm_settings_snooze_chime_tone": "Tono del timbre de Repetición",
  "app_bell_settings_alarm_settings_snooze_chime_volume": "Volumen del timbre de Repetición",
  "app_bell_settings_alarm_settings_snooze_finished": "La Repetición está programada",
  "app_bell_settings_alarm_settings_snooze_chime_interval": "Intervalo del tono",
  "app_bell_settings_alarm_settings_snooze_chime_interval_bot_desc": "durante la función de posponer",
  "app_bell_settings_alarm_settings_snooze_chime_tone": "Tono",
  "app_bell_settings_alarm_settings_snooze_chime_volume": "Volumen",
  "app_bell_settings_frontlight_mode_top_message": "Modo de luz frontal",
  "app_bell_settings_frontlight_mode_auto": "automático",
  "app_bell_settings_frontlight_mode_on_demand": "a pedido",
  "app_bell_settings_frontlight_mode_on_demand": "manual",
  "app_bell_settings_frontlight_top_message": "Intensidad de luz frontal",
  "app_bell_settings_frontlight_finished_message": "La luz frontal está programada",
  "app_bell_settings_advanced_language_set": "El idioma está programado",
  "app_bell_settings_time_units_finished_message": "La hora y las unidades están programadas",
  "app_bell_greeting_msg": "¡Hola! Levántate y brilla",
  "app_bell_settings_advanced_factory_reset": "Restablecimiento de fábrica",
  "app_bell_settings_display_factory_reset_confirmation": "<text>¿Restablecer la configuración<br></br>de fábrica ?</text>"
  "app_bell_settings_advanced_factory_reset": "Restablecer",
  "app_bell_settings_display_factory_reset_confirmation": "<text>¿Restablecer la configuración<br></br>de fábrica ?</text>",
  "app_bell_meditation_timer": "Meditación",
  "app_bell_meditation_interval_chime": "Timbre de intervalo",
  "app_bell_meditation_progress": "Temporizador de meditación",
  "app_bell_meditation_interval_none": "Ninguno",
  "app_bell_meditation_interval_every_x_minutes": "cada %0 minutos",
  "app_bell_meditation_put_down_and_wait": "<text>Apaga Mudita Harmony<br>y espera el gong</text>",
  "app_bell_meditation_thank_you_for_session": "<text>Gracias<br>por la sesión</text>"
}

M image/assets/lang/Francais.json => image/assets/lang/Francais.json +43 -35
@@ 568,8 568,10 @@
  "tethering_phone_mode_change_prohibited": "<text>Le partage de connexion est activé.<br /><br />Ce mode-ci remplace et désactive les autres modes<br />(Connecté, NPD, Hors ligne)</text>",
  "tethering_menu_access_decline": "<text>Le partage de connexion est activé.<br /><br />Pour accéder au menu, veuillez<br />désactiver le partage de connextion.</text>",
  "app_bellmain_next_alarm": "Prochaine alarme",
  "app_bellmain_meditation_timer": "Minuterie pour méditation",
  "app_bellmain_meditation_timer": "Méditation",
  "app_bellmain_media_library": "Media Library",
  "app_bellmain_bedtime": "Heure du coucher",
  "app_bell_bedtime_notification": "C'est l'heure du coucher",
  "app_bellmain_settings": "Paramètres",
  "app_bellmain_power_nap": "Sieste éclair",
  "app_bellmain_home_screen_bottom_desc": "La prochaine alarme sonnera",


@@ 577,23 579,28 @@
  "app_bell_alarm_deactivated": "Alarme désactivée",
  "app_bell_turn_off_question": "Éteindre l'appareil ?",
  "app_bell_goodbye": "Au revoir",
  "app_bell_settings_time_units_time_fmt_top_message": "Format du temps",
  "app_bell_settings_time_units_time_message": "Temps",
  "app_bell_settings_time_units_time_fmt_top_message": "Format de l'heure",
  "app_bell_settings_time_units_time_message": "Heure",
  "app_bell_settings_advanced_temp_scale": "Échelle de température",
  "app_bell_onboarding_finalize": "Bien fait!",
  "app_bell_onboarding_welcome_message": "Mudita Harmony",
  "app_bell_onboarding_info_rotate": "<text font='gt_pressura' weight='regular' size='38'>Tourner </text><text font='gt_pressura' weight='light' size='38'>pour sélectionner</text>",
  "app_bell_onboarding_info_light_click": "<text font='gt_pressura' weight='regular' size='38'>Cliquer doucement </text><text font='gt_pressura' weight='light' size='38'>pour continuer</text>",
  "app_bell_onboarding_info_deep_click_warning": "<text font='gt_pressura' weight='light' size='38'>Vous avez </text><text font='gt_pressura' weight='regular' size='38'>appuyé fort</text>",
  "app_bell_onboarding_info_deep_click_correction": "<text font='gt_pressura' weight='light' size='38'>Soyez plus doux, <br></br>essayez </text><text font='gt_pressura' weight='regular' size='38'>de cliquer plus </text><text font='gt_pressura' weight='light' size='38'>légèrement cette fois</text>",
  "app_bellmain_home_screen_bottom_desc_dp": "Appuyer fort pour activer",
  "app_bellmain_alarm": "Alarme",
  "app_bellmain_background_sounds": "Bruits de fond",
  "app_bellmain_bedtime": "Heure du coucher",
  "app_bell_alarm_set_not_active": "Alarme activée. Appuyer fort pour activer.",
  "app_bell_alarm_set_not_active": "<text>Alarme réglée.<br />Appuyer fort pour activer.</text>",
  "app_bell_powernap_session_ended_message": "Salut! Levez-vous et brillez",
  "app_bell_background_sounds_timer_title": "Minuterie",
  "app_bell_background_sounds_timer_off": "DÉSACTIVÉ",
  "app_bell_settings_home_view": "Vue d'accueil",
  "app_bell_settings_alarm_settings": "Paramètres de l'alarme",
  "app_bell_settings_bedtime_tone": "Mélodie de l'heure du coucher",
  "app_bell_background_sounds_timer_off": "OFF",
  "app_bell_settings_home_view": "Écran d'accueil",
  "app_bell_settings_alarm_settings": "Alarme",
  "app_bell_settings_alarm_settings_title": "Alarme",
  "app_bell_settings_bedtime_tone": "Heure du coucher",
  "app_bell_settings_bedtime_settings_tone": "Mélodie de l'heure du coucher",
  "app_bell_settings_bedtime_settings_volume": "<text>Volume de l'heure<br />du coucher</text>",
  "app_bell_settings_bedtime_settings_volume": "Volume",
  "app_bell_settings_advanced": "Avancé",
  "app_bell_settings_turn_off": "Éteindre",
  "app_bell_settings_advanced_time_units": "Temps et unités",


@@ 603,37 610,38 @@
  "app_bell_settings_advanced_about_version": "<text>Version du système d'exploitation: <token>$VERSION</token></text>",
  "app_bell_settings_advanced_about_storage_title": "Stockage",
  "app_bell_settings_advanced_about_storage_text": "<text><token>$USED_MEMORY</token> Mo sur <token>$TOTAL_MEMORY</token> Mo utilisés</text>",
  "app_bell_settings_advanced_about_info_title": "Manuel et informations sur la certification",
  "app_bell_settings_advanced_about_info_title": "Manuel et certification",
  "app_bell_settings_advanced_about_info_text": "www.mudita.com",
  "app_bell_settings_advanced_frontlight": "Lumière avant",
  "app_bell_settings_advanced_frontlight": "Lumière",
  "app_bell_settings_alarm_settings_prewake_up": "Pré-réveil",
  "app_bell_settings_alarm_settings_prewake_up_chime_top_description": "Carillon de pré-réveil",
  "app_bell_settings_alarm_settings_prewake_up_chime_top_description": "Pré-réveil",
  "app_bell_settings_alarm_settings_prewake_up_chime_bottom_description": "avant l'alarme",
  "app_bell_settings_alarm_settings_prewake_up_chime_tone": "Mélodie du carillon de pré-réveil",
  "app_bell_settings_alarm_settings_prewake_up_chime_volume": "Volume du carillon de pré-réveil",
  "app_bell_settings_alarm_settings_prewake_up_chime_tone": "Mélodie de pré-réveil",
  "app_bell_settings_alarm_settings_prewake_up_chime_volume": "Volume",
  "app_bell_settings_alarm_settings_prewake_up_light_top_description": "Lumière de pré-réveil",
  "app_bell_settings_alarm_settings_prewake_up_light_bottom_description": "avant l'alarme",
  "app_bell_settings_alarm_settings_prewake_up_finished": "Le pré-réveil est activé",
  "app_bell_settings_alarm_settings_alarm_tone_and_light": "Mélodie et lumière de l’alarme",
  "app_bell_settings_alarm_settings_tone": "Mélodie de l’alarme",
  "app_bell_settings_alarm_settings_volume": "Volume de l’alarme",
  "app_bell_settings_alarm_settings_light": "Lumière de l’alarme",
  "app_bell_settings_alarm_settings_alarm_tone_and_light_finished": "La sonnerie et la lumière de l’alarme sont définies.",
  "app_bell_settings_alarm_settings_snooze": "Rappel de sonnerie",
  "app_bell_settings_alarm_settings_snooze_length": "Longueur du rappel de sonnerie",
  "app_bell_settings_alarm_settings_snooze_chime_interval": "Intervalle du rappel de sonnerie",
  "app_bell_settings_alarm_settings_snooze_chime_interval_bot_desc": "récurrent pendant le rappel de sonnerie",
  "app_bell_settings_alarm_settings_snooze_chime_tone": "Mélodie du rappel de sonnerie",
  "app_bell_settings_alarm_settings_snooze_chime_volume": "Volume du rappel de sonnerie",
  "app_bell_settings_alarm_settings_snooze_finished": "Le rappel de sonnerie est activé",
  "app_bell_settings_frontlight_mode_top_message": "Mode de la lumière avant",
  "app_bell_settings_alarm_settings_tone": "Mélodie de réveil",
  "app_bell_settings_alarm_settings_volume": "Volume",
  "app_bell_settings_alarm_settings_light": "Lumière de réveil",
  "app_bell_settings_alarm_settings_snooze": "Snooze",
  "app_bell_settings_alarm_settings_snooze_length": "Durée du snooze",
  "app_bell_settings_alarm_settings_snooze_chime_interval": "Intervalle de rappel",
  "app_bell_settings_alarm_settings_snooze_chime_interval_bot_desc": "pendant le snooze",
  "app_bell_settings_alarm_settings_snooze_chime_tone": "Mélodie",
  "app_bell_settings_alarm_settings_snooze_chime_volume": "Volume",
  "app_bell_settings_frontlight_mode_top_message": "Mode",
  "app_bell_settings_frontlight_mode_auto": "automatique",
  "app_bell_settings_frontlight_mode_on_demand": "à la demande",
  "app_bell_settings_frontlight_top_message": "Intensité de la lumière avant",
  "app_bell_settings_frontlight_finished_message": "La lumière avant est activée",
  "app_bell_settings_advanced_language_set": "La langue est définie",
  "app_bell_settings_time_units_finished_message": "Le temps et les unités sont définis",
  "app_bell_settings_frontlight_mode_on_demand": "manuel",
  "app_bell_settings_frontlight_top_message": "Intensité",
  "app_bell_greeting_msg": "Salut ! Levez-vous et brillez",
  "app_bell_settings_advanced_factory_reset": "Rétablissement de la configuration d'usine",
  "app_bell_settings_display_factory_reset_confirmation": "<text>Rétablir la configuration<br></br>d'usine ?</text>"
  "app_bell_settings_advanced_factory_reset": "Réinitialisation",
  "app_bell_settings_display_factory_reset_confirmation": "<text>Rétablir<br></br>la configuration ?</text>",
  "app_bell_meditation_timer": "Méditation",
  "app_bell_meditation_interval_chime": "gong intervalle",
  "app_bell_meditation_progress": "Minuterie pour méditation",
  "app_bell_meditation_interval_none": "Aucune",
  "app_bell_meditation_interval_every_x_minutes": "toutes les %0 minutes",
  "app_bell_meditation_put_down_and_wait": "<text>Posez Mudita Harmony<br>et attendez le gong</text>",
  "app_bell_meditation_thank_you_for_session": "<text>Merci<br>pour cette session</text>"
}

M image/assets/lang/Polski.json => image/assets/lang/Polski.json +49 -41
@@ 114,21 114,25 @@
  "app_alarm_clock_snooze_5_min": "5 min",
  "app_alarm_clock_snooze_10_min": "10 min",
  "app_alarm_clock_snooze_15_min": "15 min",
  "app_alarm_clock_snooze_30_min": "30 min",
  "app_alarm_clock_play_pause": "ODTWARZAJ/ZATRZYMAJ",
  "app_calendar_title_main": "Kalendarz",
  "app_calendar_options_edit": "Edytuj",
  "app_calendar_options_delete": "Usuń",
  "app_calendar_event_delete_confirmation": "Usunąć to wydarzenie?",
  "app_calendar_bar_month": "MIESIĄC",
  "app_calendar_bar_list": "LISTA",
  "app_calendar_event_detail": "Wydarzenie",
  "app_calendar_event_detail_repeat": "Powtarzaj",
  "app_calendar_event_detail_reminder": "Przypomnienie",
  "app_calendar_no_events_information": "<text align='center' color='5'>Nie ma jeszcze żadnych wydarzeń.<p>Wciśnij <b>lewą strzałkę</b>, by dodać nowe.</p></text>",
  "app_calendar_repeat_never": "Nigdy",
  "app_calendar_repeat_daily": "Codziennie",
  "app_calendar_repeat_weekly": "Co tydzień",
  "common_paused": "Pauza",
  "locale_12hour_min": "%I:%M %p",
  "locale_12hour_min_short": "%I:%M",
  "locale_24hour_min": "%H:%M",
  "locale_date_full": "%d.%m.%Y",
  "locale_date_short": "%d.%m",
  "common_AM": "AM",
  "common_PM": "PM",
  "duration_min_0sec": "%M:%0S",
  "duration_0min_0sec": "%0M:%0S",
  "duration_0hmin_0sec": "%0N:%0S",
  "duration_hour_0min_0sec": "%H:%0M:%0S",
  "brightness_text": "JASNOŚĆ",
  "phone_needs_rebooting": "Twój telefon musi zostać ponownie uruchomiony. Wciśnij dowolny przycisk, aby potwierdzić, a następnie wyjmij baterię na 10 sekund, by przeprowadzić pełny reset.",
  "home_modes_connected": "POŁĄCZONY",
  "home_modes_notdisturb": "NIE PRZESZKADZAĆ",
  "home_modes_offline": "OFFLINE",
  "home_modes_message_only": "Tylko wiadomości",
  "statusbar_battery_charging": "Ładowanie",
  "app_calendar_repeat_two_weeks": "Co dwa tygodnie",
  "app_calendar_repeat_month": "Co miesiąc",
  "app_calendar_repeat_year": "Co rok",


@@ 607,76 611,80 @@
  "tethering_menu_access_decline": "<text>Tethering włączony.<br /><br />Aby przejść do menu,<br />wyłącz tethering.</text>",
  "app_bell_settings_time_units_time_fmt_top_message": "Format czasu",
  "app_bell_settings_time_units_time_message": "Czas",
  "app_bell_settings_time_units_finished_message": "Czas i jednostki ustawione.",
  "app_bellmain_alarm": "Alarm",
  "app_bellmain_bedtime": "Pora snu",
  "app_bell_bedtime_set_finished": "<text>Pora snu<br />ustawiona</text>",
  "app_bell_bedtime_notification": "Pora na sen",
  "app_bellmain_power_nap": "Drzemka",
  "app_bellmain_meditation_timer": "Medytacja",
  "app_bellmain_background_sounds": "Biblioteka",
  "app_bellmain_settings": "Ustawienia",
  "app_bellmain_main_window_title": "Bell Hybrid+",
  "app_bellmain_main_window_title": "Mudita Harmony",
  "app_bell_onboarding_finalize": "Dobra robota!",
  "app_bell_onboarding_welcome_message": "Mudita Harmony",
  "app_bell_onboarding_info_rotate": "<text font='gt_pressura' weight='regular' size='38'>Obróć, </text><text font='gt_pressura' weight='light' size='38'>aby wybrać</text>",
  "app_bell_onboarding_info_light_click": "<text font='gt_pressura' weight='regular' size='38'>Kliknij lekko, </text><text font='gt_pressura' weight='light' size='38'>aby kontynuować</text>",
  "app_bell_onboarding_info_deep_click_warning": "<text font='gt_pressura' weight='light' size='38'>Głęboko </text><text font='gt_pressura' weight='regular' size='38'>wciśnięty</text>",
  "app_bell_onboarding_info_deep_click_correction": "<text font='gt_pressura' weight='light' size='38'>Bądź bardziej delikatny, <br></br>spróbuj </text><text font='gt_pressura' weight='regular' size='38'>tym razem </text><text font='gt_pressura' weight='light' size='38'>lekko kliknąć</text>",
  "app_bell_settings_advanced": "Zaawansowane",
  "app_bell_settings_advanced_time_units": "Czas i jednostki",
  "app_bell_settings_advanced_temp_scale": "Skala temperatury",
  "app_bell_settings_alarm_settings": "Alarmy",
  "app_bell_settings_alarm_settings_alarm_tone_and_light": "Dźwięk i światło alarmu",
  "app_bell_settings_bedtime_tone": "Dźwięk przed snem",
  "app_bell_settings_bedtime_settings_tone": "Dźwięk przed snem",
  "app_bell_settings_bedtime_settings_volume": "<text>Głośność przed<br />snem</text>",
  "app_bell_settings_bedtime_tone_finished": "Dźwięk ustawiony",
  "app_bell_settings_alarm_settings": "Alarm",
  "app_bell_settings_alarm_settings_title": "Ustawienia alarmu",
  "app_bell_settings_alarm_settings_alarm_tone_and_light": "Główny alarm",
  "app_bell_settings_bedtime_tone": "Pora snu",
  "app_bell_settings_bedtime_settings_tone": "<text>Pora snu <br/>dźwięk<text>",
  "app_bell_settings_bedtime_settings_volume": "<text>Pora snu <br/>głośność<text>",
  "app_bell_settings_home_view": "Widok główny",
  "app_bell_settings_turn_off": "Wyłącz",
  "app_bell_settings_alarm_settings_snooze": "Drzemka",
  "app_bell_settings_alarm_settings_snooze_finished": "Ustawiono drzemkę",
  "app_bell_settings_alarm_settings_snooze_length": "Długość drzemki",
  "app_bell_settings_alarm_settings_snooze_chime_interval": "Interwał dzwonka drzemki",
  "app_bell_settings_alarm_settings_snooze_chime_interval": "Interwał dźwięku wybudzania",
  "app_bell_settings_alarm_settings_snooze_chime_interval_bot_desc": "powtarzający się podczas drzemki",
  "app_bell_settings_alarm_settings_snooze_chime_tone": "Dźwięk dzwonka drzemki",
  "app_bell_settings_alarm_settings_snooze_chime_volume": "Głośność dzwonka drzemki",
  "app_bell_settings_alarm_settings_snooze_chime_tone": "Dźwięk wybudzania",
  "app_bell_settings_alarm_settings_snooze_chime_volume": "Głośność wybudzania",
  "app_bellmain_home_screen_bottom_desc": "Następny alarm zadzwoni",
  "app_bellmain_home_screen_bottom_desc_in": "za",
  "app_bellmain_home_screen_bottom_desc_dp": "Naciśnij głęboko, aby aktywować",
  "app_bell_alarm_deactivated": "Alarm wyłączony",
  "app_bell_settings_advanced_frontlight": "Podświetlenie",
  "app_bell_settings_frontlight_top_message": "Intensywność podświetlenia",
  "app_bell_settings_frontlight_finished_message": "Ustawiono podświetlenie",
  "app_bell_settings_frontlight_mode_top_message": "Tryb podświetlenia",
  "app_bell_settings_frontlight_mode_auto": "automatyczny",
  "app_bell_settings_frontlight_mode_on_demand": "na żądanie",
  "app_bell_powernap_session_ended_message": "<text>Witaj!<br />Pobudka</text>",
  "app_bell_powernap_session_ended_message": "Dzień dobry!",
  "app_bell_greeting_msg": [
    "<text>Dzień dobry!<br />Pobudka</text>"
  ],
  "app_bell_alarm_set_not_active": "<text>Ustawiono alarm.<br />Naciśnij głęboko, aby aktywować.</text>",
  "app_bell_background_sounds_timer_title": "Licznik czasu",
  "app_bell_background_sounds_timer_off": "Wyłączony",
  "app_bell_settings_alarm_settings_prewake_up": "Wybudzanie",
  "app_bell_settings_alarm_settings_prewake_up_chime_top_description": "Dzwonek wstępnego budzenia",
  "app_bell_settings_alarm_settings_prewake_up": "Wstępne budzenie",
  "app_bell_settings_alarm_settings_prewake_up_chime_top_description": "Dźwięk wstępnego budzenia",
  "app_bell_settings_alarm_settings_prewake_up_chime_bottom_description": "przed alarmem",
  "app_bell_settings_alarm_settings_prewake_up_chime_tone": "Dźwięk dzwonka wstępnego budzenia",
  "app_bell_settings_alarm_settings_prewake_up_chime_volume": "Głośność dzwonka wstępnego budzenia",
  "app_bell_settings_alarm_settings_prewake_up_chime_tone": "Dźwięk wstępnego budzenia",
  "app_bell_settings_alarm_settings_prewake_up_chime_volume": "Głośność wstępnego budzenia",
  "app_bell_settings_alarm_settings_prewake_up_light_top_description": "Światło wstępnego budzenia",
  "app_bell_settings_alarm_settings_prewake_up_light_bottom_description": "przed alarmem",
  "app_bell_settings_alarm_settings_prewake_up_finished": "Ustawiono wstępne budzenie",
  "app_bell_settings_alarm_settings_tone": "Dźwięk alarmu",
  "app_bell_settings_alarm_settings_volume": "Głośność alarmu",
  "app_bell_settings_alarm_settings_light": "Światło alarmu",
  "app_bell_settings_alarm_settings_alarm_tone_and_light_finished": "Ustawiono dźwięk i światło alarmu",
  "app_bell_turn_off_question": "Wyłączyć urządzenie?",
  "app_bell_turn_off_question": "Wyłączyć Mudita Harmony?",
  "app_bell_goodbye": "Do widzenia",
  "app_bell_settings_advanced_language": "Język",
  "app_bell_settings_advanced_language_set": "Ustawiono język",
  "app_bell_settings_advanced_factory_reset": "Ustawienia fabryczne",
  "app_bell_settings_display_factory_reset_confirmation": "<text>Przywrócić ustawienia<br></br>fabryczne ?</text>",
  "app_bell_settings_factory_reset_finished": "Ustawienia fabryczne\nprzywrócone",
  "app_bell_settings_advanced_about": "Informacje",
  "app_bell_settings_advanced_about": "O produkcie",
  "app_bell_settings_advanced_about_product": "Mudita Harmony",
  "app_bell_settings_advanced_about_version": "<text>Wersja OS: <token>$VERSION</token></text>",
  "app_bell_settings_advanced_about_storage_title": "Pamięć",
  "app_bell_settings_advanced_about_storage_text": "<text>Zużyto <token>$USED_MEMORY</token>MB z <token>$TOTAL_MEMORY</token>MB</text>",
  "app_bell_settings_advanced_about_info_title": "Instrukcja i informacje dot. certyfikacji",
  "app_bell_settings_advanced_about_info_text": "www.mudita.com"
  "app_bell_settings_advanced_about_info_text": "www.mudita.com",
  "app_bell_meditation_timer": "Medytacja",
  "app_bell_meditation_interval_chime": "Dzwonek interwału",
  "app_bell_meditation_progress": "Timer medytacyjny",
  "app_bell_meditation_interval_none": "Brak",
  "app_bell_meditation_interval_every_x_minutes": "co %0 minuty",
  "app_bell_meditation_put_down_and_wait": "<text>Odłóż Mudita Harmony<br>i czekaj na gong</text>",
  "app_bell_meditation_thank_you_for_session": "<text>Dziękujemy<br>za sesję</text>"
}

M module-bsp/board/linux/usb_cdc/usb_cdc.cpp => module-bsp/board/linux/usb_cdc/usb_cdc.cpp +3 -0
@@ 220,4 220,7 @@ namespace bsp

        return 0;
    }

    void usbHandleDataReceived()
    {}
} // namespace bsp

M module-bsp/board/rt1051/bellpx/hal/battery_charger/BatteryCharger.cpp => module-bsp/board/rt1051/bellpx/hal/battery_charger/BatteryCharger.cpp +1 -1
@@ 16,8 16,8 @@ namespace hal::battery

    void BatteryCharger::init(xQueueHandle queueBatteryHandle, xQueueHandle)
    {
        bsp::battery_charger::init(queueBatteryHandle);
        bsp::fuel_gauge::init(queueBatteryHandle);
        bsp::battery_charger::init(queueBatteryHandle);

        Store::Battery::modify().state = Store::Battery::State::Discharging;
        Store::Battery::modify().level = static_cast<unsigned int>(bsp::fuel_gauge::getBatteryLevel());

M module-bsp/bsp/usb/usb.hpp => module-bsp/bsp/usb/usb.hpp +3 -1
@@ 26,7 26,8 @@ namespace bsp
    {
        Disconnected,
        Connected,
        Configured
        Configured,
        DataReceived,
    };

    struct usbInitParams


@@ 43,5 44,6 @@ namespace bsp
    void usbDeinit();
    void usbReinit(const char *mtpRoot);
    void usbSuspend();
    void usbHandleDataReceived();

} // namespace bsp

M module-services/service-desktop/WorkerDesktop.cpp => module-services/service-desktop/WorkerDesktop.cpp +6 -1
@@ 148,6 148,7 @@ bool WorkerDesktop::handleMessage(uint32_t queueID)
            usbSuspendTimer.stop();
            ownerService->bus.sendUnicast(std::make_shared<sdesktop::usb::USBConnected>(),
                                          service::name::service_desktop);
            usbStatus = bsp::USBDeviceStatus::Connected;
        }
        else if (notification == bsp::USBDeviceStatus::Configured) {
            cpuSentinel->HoldMinimumFrequency(bsp::CpuFrequencyHz::Level_4);


@@ 161,14 162,18 @@ bool WorkerDesktop::handleMessage(uint32_t queueID)
                                                  sdesktop::usb::USBConfigurationType::reconfiguration),
                                              service::name::service_desktop);
            }
            usbStatus = bsp::USBDeviceStatus::Configured;
        }
        else if (notification == bsp::USBDeviceStatus::Disconnected) {
            usbSuspendTimer.start();
            cpuSentinel->ReleaseMinimumFrequency();
            ownerService->bus.sendUnicast(std::make_shared<sdesktop::usb::USBDisconnected>(),
                                          service::name::service_desktop);
            usbStatus = bsp::USBDeviceStatus::Disconnected;
        }
        else if (notification == bsp::USBDeviceStatus::DataReceived) {
            bsp::usbHandleDataReceived();
        }
        usbStatus = notification;
    }
    else {
        LOG_INFO("handeMessage got message on an unhandled queue");

M module-vfs/README.md => module-vfs/README.md +20 -15
@@ 1,39 1,44 @@
vfs for PurePhone
Virtual File System for PurePhone
-----------------

# What does this module provide?

We use POSIX calls wrapper to have proper filesystem experience.
We use POSIX calls wrapper to have proper filesystem experience and it supports C++17 filesystem library.

# File systems in use

Right now we are able to use 2 file systems
Right now we are able to use 3 file systems:

- FAT-FS
- Ext4 with 32 bit inodes.
- LittleFS

Curently only the FAT and EXT4 filesystems are used on the mass storage media.

# PurePhone partitions

PurePhone has 3 flash partitions:
1. for update and backup
2. FAT for phone data
3. LittleFS for user data
PurePhone uses old MBR partitioning scheme and it has  3 flash partitions:

LittleFS partition is needed to assert minimal to possibly no data loss in unexpected shutdown
1. FAT for the phone firmware (**ReadOnly**)
2. EXT4 for the backup data
2. EXT4 for the user data

# how to use PurePhone partitions
EXT4 partition is needed to assert minimal to possibly no data loss in unexpected shutdown
LFS can be used as an alternative user partition. Currently it is not used by the MuditaOS except internal EEPROM memory.

Pure phone on reboot on option 4 will present itself with 3 partitions via USB, the first two should be auto mount.
# how to use PurePhone partitions

## mounting FAT-FS partitions
Pure phone on reboot on option 9 will present itself with 3 partitions via USB, all partitions should be automount.
## mounting FAT-FS and EXT4 partitions

1. check which devices are PurePhone block devices ie with: `dmesg` or `lsblk`
1. check which devices are **PurePhone** block devices ie with: `dmesg` or `lsblk`
2. mount them with i.e `udisksctl mount -b /dev/sdbX` where X is number of block device

## mounting LittleFS partitions

For LittleFS you will have to use fuse to mount partition. Tool is already build with release and is ready to use:

1. Prepare mount point i.e. create catalog `mkdir mymount`
2. Mount: `./lfsfuse --block_size=32768 /dev/sdb3 mymount` where sdb3 is device where you expect Pure LittleFS partition
3. Enter here and play with user data
2. Mount: `./lfsfuse --block_size=32768 /dev/sdX mymount` where sdbx is device where you expect LFS partition
3. Enter here and play with data
4. Umount and eject the device i.e. with: `udisksctl power-off -b /dev/sdb`
5. Phone will reboot with changed data

M module-vfs/drivers/include/purefs/fs/drivers/file_handle_ext4.hpp => module-vfs/drivers/include/purefs/fs/drivers/file_handle_ext4.hpp +1 -1
@@ 19,7 19,7 @@ namespace purefs::fs::drivers
        {
            return &m_file;
        }
        [[nodiscard]] auto open_path() const noexcept -> const std::string &
        [[nodiscard]] auto open_path() const noexcept -> std::string override
        {
            return m_path;
        }

M module-vfs/drivers/include/purefs/fs/drivers/file_handle_littlefs.hpp => module-vfs/drivers/include/purefs/fs/drivers/file_handle_littlefs.hpp +1 -1
@@ 19,7 19,7 @@ namespace purefs::fs::drivers
        {
            return &file;
        }
        [[nodiscard]] auto open_path() const noexcept -> const std::string &
        [[nodiscard]] auto open_path() const noexcept -> std::string override
        {
            return m_path;
        }

M module-vfs/drivers/include/purefs/fs/drivers/file_handle_vfat.hpp => module-vfs/drivers/include/purefs/fs/drivers/file_handle_vfat.hpp +1 -1
@@ 20,7 20,7 @@ namespace purefs::fs::drivers
        {
            return &m_fil;
        }
        auto open_path() const noexcept -> const std::string &
        auto open_path() const noexcept -> std::string override
        {
            return m_path;
        }

M module-vfs/drivers/src/purefs/fs/filesystem_ext4.cpp => module-vfs/drivers/src/purefs/fs/filesystem_ext4.cpp +3 -2
@@ 1,6 1,7 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <memory>
#include <purefs/fs/drivers/filesystem_ext4.hpp>
#include <purefs/fs/drivers/mount_point_ext4.hpp>
#include <purefs/blkdev/disk_manager.hpp>


@@ 45,7 46,7 @@ namespace purefs::fs::drivers
        template <typename T>
        auto invoke_efs(filesystem_ext4::fsmount mnt, T efs_fun, std::string_view oldpath, std::string_view newpath)
        {
            auto mntp = std::static_pointer_cast<mount_point_ext4>(mnt);
            auto mntp = std::dynamic_pointer_cast<mount_point_ext4>(mnt);
            if (!mntp) {
                LOG_ERROR("Non ext4 mount point");
                return -EBADF;


@@ 59,7 60,7 @@ namespace purefs::fs::drivers
        template <typename T, typename... Args>
        auto invoke_efs(filesystem_ext4::fsmount fmnt, T efs_fun, std::string_view path, Args &&...args)
        {
            auto mntp = std::static_pointer_cast<mount_point_ext4>(fmnt);
            auto mntp = std::dynamic_pointer_cast<mount_point_ext4>(fmnt);
            if (!mntp) {
                LOG_ERROR("Non ext4 mount point");
                return -EBADF;

M module-vfs/include/user/purefs/fs/file_handle.hpp => module-vfs/include/user/purefs/fs/file_handle.hpp +5 -0
@@ 4,6 4,7 @@
#pragma once

#include <memory>
#include <string>

namespace purefs::fs::internal
{


@@ 33,6 34,10 @@ namespace purefs::fs::internal
        {
            return m_mount_point.lock();
        }
        [[nodiscard]] virtual auto open_path() const noexcept -> std::string
        {
            return {};
        }

      private:
        const std::weak_ptr<mount_point> m_mount_point;

M module-vfs/include/user/purefs/fs/filesystem.hpp => module-vfs/include/user/purefs/fs/filesystem.hpp +2 -0
@@ 282,6 282,8 @@ namespace purefs::fs
                }
            }
        }
        auto cleanup_opened_files(std::string_view mount_point) -> void;

      private:
        std::weak_ptr<blkdev::disk_manager> m_diskmm;
        std::unordered_map<std::string, std::shared_ptr<filesystem_operations>> m_fstypes;

M module-vfs/include/user/purefs/fs/handle_mapper.hpp => module-vfs/include/user/purefs/fs/handle_mapper.hpp +1 -0
@@ 21,6 21,7 @@ namespace purefs::fs::internal
        void remove(std::size_t index)
        {
            unused.push_back(index);
            data[index] = {};
        }
        bool exists(std::size_t index) const
        {

M module-vfs/src/purefs/fs/filesystem.cpp => module-vfs/src/purefs/fs/filesystem.cpp +33 -0
@@ 19,6 19,19 @@ namespace purefs::fs
    {
        constexpr std::pair<short, std::string_view> part_types_to_vfs[] = {
            {0x0b, "vfat"}, {0x9e, "littlefs"}, {0x83, "ext4"}};

        auto compare_mount_points(std::string_view path1, std::string_view path2)
        {
            std::string spath1{path1};
            std::string spath2{path2};
            if (spath1.back() == '/') {
                spath1.pop_back();
            }
            if (spath2.back() == '/') {
                spath2.pop_back();
            }
            return spath1 == spath2;
        }
    }
    filesystem::filesystem(std::shared_ptr<blkdev::disk_manager> diskmm)
        : m_diskmm(diskmm), m_lock(std::make_unique<cpp_freertos::MutexRecursive>()),


@@ 159,6 172,9 @@ namespace purefs::fs
            LOG_ERROR("Unable to lock filesystem operation");
            return -EIO;
        }

        cleanup_opened_files(mount_point);

        const auto diskh    = mnti->second->disk();
        const auto umnt_ret = fsops->umount(mnti->second);
        if (umnt_ret) {


@@ 315,4 331,21 @@ namespace purefs::fs
        return std::make_shared<inotify>(svc, m_notifier);
    }

    auto filesystem::cleanup_opened_files(std::string_view mount_point) -> void
    {
        LOG_INFO("Closing opened files on mntpoint: %s before umount.", std::string(mount_point).c_str());
        for (auto fd = 0U; fd < m_fds.size(); ++fd) {
            const auto filp = m_fds[fd];
            if (!filp)
                continue;
            const auto mp = filp->mntpoint();
            if (!mp)
                continue;
            if (compare_mount_points(mp->mount_path(), mount_point)) {
                const auto err = close(fd + first_file_descriptor);
                LOG_WARN("Emergency closing: %s result: %i.", filp->open_path().c_str(), err);
            }
        }
    }

} // namespace purefs::fs

M products/BellHybrid/apps/application-bell-main/ApplicationBellMain.cpp => products/BellHybrid/apps/application-bell-main/ApplicationBellMain.cpp +43 -0
@@ 19,6 19,8 @@
#include <common/windows/BellFactoryReset.hpp>
#include <service-db/DBNotificationMessage.hpp>
#include <windows/Dialog.hpp>
#include <service-appmgr/Controller.hpp>
#include <system/messages/SystemManagerMessage.hpp>
#include <common/popups/BedtimeNotificationWindow.hpp>

namespace app


@@ 41,6 43,17 @@ namespace app
            switchWindow(gui::BellWelcomeWindow::defaultName);
            return actionHandled();
        });

        addActionReceiver(app::manager::actions::SystemBrownout, [this](auto &&data) {
            setSystemCloseInProgress();
            switchWindow(gui::window::name::bell_battery_shutdown, std::move(data));
            return actionHandled();
        });

        addActionReceiver(app::manager::actions::DisplayLowBatteryScreen, [this](auto &&data) {
            handleLowBatteryNotification(std::move(data));
            return actionHandled();
        });
    }

    sys::ReturnCodes ApplicationBellMain::InitHandler()


@@ 70,10 83,12 @@ namespace app
        windowsFactory.attach(gui::window::name::bell_main_menu, [](ApplicationCommon *app, const std::string &name) {
            return std::make_unique<gui::BellMainMenuWindow>(app);
        });

        windowsFactory.attach(gui::window::name::bell_battery_shutdown,
                              [](ApplicationCommon *app, const std::string &name) {
                                  return std::make_unique<gui::BellBatteryShutdownWindow>(app);
                              });

        windowsFactory.attach(gui::BellFactoryReset::name, [](ApplicationCommon *app, const std::string &name) {
            return std::make_unique<gui::BellFactoryReset>(app, std::make_unique<gui::BellPowerOffPresenter>(app));
        });


@@ 147,4 162,32 @@ namespace app
        }
        return ApplicationCommon::handleSwitchWindow(msgl);
    }

    bool ApplicationBellMain::isPopupPermitted([[maybe_unused]] gui::popup::ID popupId) const
    {
        if (blockAllPopups) {
            return false;
        }
        return true;
    }

    void ApplicationBellMain::handleLowBatteryNotification(manager::actions::ActionParamsPtr &&data)
    {
        auto lowBatteryState = static_cast<manager::actions::LowBatteryNotificationParams *>(data.get());
        auto currentWindow   = getCurrentWindow();
        if (currentWindow->getName() == gui::window::name::bell_battery_shutdown) {
            data->ignoreCurrentWindowOnStack = true;
        }

        if (lowBatteryState->isActive()) {
            blockAllPopups = true;
            switchWindow(gui::window::name::bell_battery_shutdown, std::move(data));
        }
        else {
            blockAllPopups = false;
            if (currentWindow->getName() == gui::window::name::bell_battery_shutdown) {
                app::manager::Controller::sendAction(this, app::manager::actions::Home, std::move(data));
            }
        }
    }
} // namespace app

M products/BellHybrid/apps/application-bell-main/include/application-bell-main/ApplicationBellMain.hpp => products/BellHybrid/apps/application-bell-main/include/application-bell-main/ApplicationBellMain.hpp +9 -2
@@ 11,7 11,6 @@ namespace gui::window::name
    inline constexpr auto bell_main_menu        = "BellMainMenu";
    inline constexpr auto bell_main_menu_dialog = "BellMainMenuDialog";
    inline constexpr auto bell_battery_shutdown = "BellBatteryShutdown";

} // namespace gui::window::name

namespace app


@@ 41,17 40,25 @@ namespace app
        }

      private:
        bool blockAllPopups = false;

        bool isPopupPermitted([[maybe_unused]] gui::popup::ID popupId) const;
        void showPopup(gui::popup::ID id, const gui::PopupRequestParams *params) override;
        auto isHomeScreenFocused() -> bool;
        void onStart() override;
        sys::MessagePointer handleSwitchWindow(sys::Message *msgl) override;
        void handleLowBatteryNotification(manager::actions::ActionParamsPtr &&data);
    };

    template <> struct ManifestTraits<ApplicationBellMain>
    {
        static auto GetManifest() -> manager::ApplicationManifest
        {
            return {{manager::actions::Launch, manager::actions::ShowAlarm, manager::actions::DisplayLogoAtExit}};
            return {{manager::actions::Launch,
                     manager::actions::ShowAlarm,
                     manager::actions::DisplayLogoAtExit,
                     manager::actions::DisplayLowBatteryScreen,
                     manager::actions::SystemBrownout}};
        }
    };
} // namespace app

M products/BellHybrid/apps/application-bell-main/widgets/BellBattery.cpp => products/BellHybrid/apps/application-bell-main/widgets/BellBattery.cpp +2 -1
@@ 8,7 8,8 @@
namespace
{
    constexpr auto entries =
        std::array<battery_utils::BatteryLevelEntry, 6>{{{{5, 10}, {1, 5}, "bell_battery_empty"},
        std::array<battery_utils::BatteryLevelEntry, 7>{{{{0, 5}, {1, 1}, "bell_battery_empty"},
                                                         {{5, 10}, {1, 5}, "bell_battery_empty"},
                                                         {{11, 30}, {6, 29}, "bell_battery_lvl1"},
                                                         {{31, 50}, {30, 53}, "bell_battery_lvl2"},
                                                         {{51, 70}, {54, 77}, "bell_battery_lvl3"},

M products/BellHybrid/apps/application-bell-main/windows/BellBatteryStatusWindow.cpp => products/BellHybrid/apps/application-bell-main/windows/BellBatteryStatusWindow.cpp +2 -1
@@ 15,7 15,8 @@ namespace
{
    constexpr auto imageType = gui::ImageTypeSpecifier::W_G;
    constexpr auto batteryEntries =
        std::array<battery_utils::BatteryLevelEntry, 6>{{{{5, 10}, {1, 5}, "bell_status_battery_lvl0"},
        std::array<battery_utils::BatteryLevelEntry, 7>{{{{0, 5}, {1, 1}, "bell_status_battery_lvl0"},
                                                         {{5, 10}, {1, 5}, "bell_status_battery_lvl0"},
                                                         {{11, 30}, {6, 29}, "bell_status_battery_lvl1"},
                                                         {{31, 50}, {30, 53}, "bell_status_battery_lvl2"},
                                                         {{51, 70}, {54, 77}, "bell_status_battery_lvl3"},

M products/BellHybrid/apps/application-bell-meditation-timer/ApplicationBellMeditationTimer.cpp => products/BellHybrid/apps/application-bell-meditation-timer/ApplicationBellMeditationTimer.cpp +5 -5
@@ 6,10 6,10 @@
#include "windows/MeditationRunningWindow.hpp"
#include "windows/MeditationTimerWindow.hpp"
#include "windows/ReadyGoingWindow.hpp"
#include "windows/SessionEndWindow.hpp"
#include "windows/SessionPausedWindow.hpp"

#include <common/models/TimeModel.hpp>
#include <common/windows/BellFinishedWindow.hpp>

namespace app
{


@@ 60,10 60,10 @@ namespace app
        windowsFactory.attach(gui::name::window::sessionPaused, [](ApplicationCommon *app, const std::string &name) {
            return std::make_unique<gui::SessionPausedWindow>(app);
        });
        windowsFactory.attach(gui::name::window::sessionEnded, [](ApplicationCommon *app, const std::string &name) {
            auto presenter = std::make_unique<app::meditation::SessionEndedPresenter>(app);
            return std::make_unique<gui::SessionEndWindow>(app, std::move(presenter));
        });
        windowsFactory.attach(gui::window::bell_finished::defaultName,
                              [](ApplicationCommon *app, const std::string &name) {
                                  return std::make_unique<gui::BellFinishedWindow>(app);
                              });

        attachPopups({gui::popup::ID::AlarmActivated,
                      gui::popup::ID::AlarmDeactivated,

M products/BellHybrid/apps/application-bell-meditation-timer/CMakeLists.txt => products/BellHybrid/apps/application-bell-meditation-timer/CMakeLists.txt +0 -1
@@ 28,7 28,6 @@ target_sources(application-bell-meditation-timer
        windows/MeditationRunningWindow.cpp
        windows/MeditationTimerWindow.cpp
        windows/ReadyGoingWindow.cpp
        windows/SessionEndWindow.cpp
        windows/SessionPausedWindow.cpp
    PUBLIC
        include/application-bell-meditation-timer/ApplicationBellMeditationTimer.hpp

M products/BellHybrid/apps/application-bell-meditation-timer/presenter/IntervalChimePresenter.cpp => products/BellHybrid/apps/application-bell-meditation-timer/presenter/IntervalChimePresenter.cpp +16 -6
@@ 10,6 10,8 @@

namespace app::meditation
{
    constexpr auto intervalsList = {1, 2, 5, 10, 15, 30};

    IntervalChimePresenter::IntervalChimePresenter(app::ApplicationCommon *app, settings::Settings *settings)
        : app{app}, settings{settings}
    {


@@ 68,12 70,20 @@ namespace app::meditation
    void IntervalChimePresenter::initIntervalOptions()
    {
        intervalOptions.push_back({std::chrono::minutes{0}, utils::translate("app_bell_meditation_interval_none")});
        intervalOptions.push_back({std::chrono::minutes{1}, getIntervalString(1)});
        intervalOptions.push_back({std::chrono::minutes{2}, getIntervalString(2)});
        intervalOptions.push_back({std::chrono::minutes{5}, getIntervalString(5)});
        intervalOptions.push_back({std::chrono::minutes{10}, getIntervalString(10)});
        intervalOptions.push_back({std::chrono::minutes{15}, getIntervalString(15)});
        intervalOptions.push_back({std::chrono::minutes{30}, getIntervalString(30)});

        const auto duration =
            utils::getNumericValue<int>(settings->getValue(meditationDBRecordName, settings::SettingsScope::AppLocal));
        if (duration == 1) {
            settings->setValue(intervalDBRecordName, utils::to_string(0), settings::SettingsScope::AppLocal);
            app->switchWindow(gui::name::window::readyGoing);
            return;
        }

        for (const auto &interval : intervalsList) {
            if (interval < duration) {
                intervalOptions.push_back({std::chrono::minutes{interval}, getIntervalString(interval)});
            }
        }
    }

    std::string IntervalChimePresenter::getIntervalString(std::uint32_t value)

M products/BellHybrid/apps/application-bell-meditation-timer/presenter/MeditationProgressPresenter.cpp => products/BellHybrid/apps/application-bell-meditation-timer/presenter/MeditationProgressPresenter.cpp +3 -1
@@ 6,6 6,7 @@
#include "MeditationProgressPresenter.hpp"

#include <common/models/TimeModel.hpp>
#include <common/windows/BellFinishedWindow.hpp>
#include <service-appmgr/Controller.hpp>
#include <service-db/Settings.hpp>



@@ 75,7 76,8 @@ namespace app::meditation
    void MeditationProgressPresenter::finish()
    {
        timer->stop();
        app->switchWindow(gui::name::window::sessionEnded);
        app->switchWindow(gui::window::bell_finished::defaultName,
                          gui::BellFinishedWindowData::Factory::create("big_namaste_W_G", "", "", true));
    }

    void MeditationProgressPresenter::onProgressFinished()

D products/BellHybrid/apps/application-bell-meditation-timer/windows/SessionEndWindow.cpp => products/BellHybrid/apps/application-bell-meditation-timer/windows/SessionEndWindow.cpp +0 -32
@@ 1,32 0,0 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "ApplicationBellMeditationTimer.hpp"
#include "SessionEndWindow.hpp"

namespace gui
{
    SessionEndWindow::SessionEndWindow(
        app::ApplicationCommon *app,
        std::shared_ptr<app::meditation::SessionEndedPresenterContract::Presenter> winPresenter)
        : BellFinishedWindow(app, gui::name::window::sessionEnded), presenter{std::move(winPresenter)}
    {
        timerCallback = [this](Item &, sys::Timer &) {
            presenter->activate();
            return true;
        };
    }

    bool SessionEndWindow::onInput(const InputEvent &inputEvent)
    {
        return true;
    }

    void SessionEndWindow::onBeforeShow(ShowMode mode, SwitchData *data)
    {
        BellFinishedWindow::onBeforeShow(mode, data);

        icon->image->set("big_namaste", ImageTypeSpecifier::W_G);
        icon->text->setRichText(utils::translate("app_bell_meditation_thank_you_for_session"));
    }
} // namespace gui

D products/BellHybrid/apps/application-bell-meditation-timer/windows/SessionEndWindow.hpp => products/BellHybrid/apps/application-bell-meditation-timer/windows/SessionEndWindow.hpp +0 -26
@@ 1,26 0,0 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include "SessionEndedPresenter.hpp"

#include <common/windows/BellFinishedWindow.hpp>
#include <gui/widgets/Icon.hpp>

namespace gui
{
    class SessionEndWindow : public BellFinishedWindow
    {
      private:
        std::shared_ptr<app::meditation::SessionEndedPresenterContract::Presenter> presenter;

      public:
        SessionEndWindow(app::ApplicationCommon *app,
                         std::shared_ptr<app::meditation::SessionEndedPresenterContract::Presenter> winPresenter);

        // virtual methods
        bool onInput(const InputEvent &inputEvent) override;
        void onBeforeShow(ShowMode mode, SwitchData *data) override;
    };
} // namespace gui

M products/BellHybrid/apps/application-bell-meditation-timer/windows/SessionPausedWindow.cpp => products/BellHybrid/apps/application-bell-meditation-timer/windows/SessionPausedWindow.cpp +1 -1
@@ 39,7 39,7 @@ namespace gui
            icon->image->setMargins({0, itStyle::icon::imageTopMargin, 0, itStyle::icon::imageBottomMargin});
            icon->image->set(app::meditationStyle::itStyle::icon::imagePause, ImageTypeSpecifier::W_G);
            icon->text->setFont(itStyle::text::font);
            icon->text->setRichText(utils::translate("app_bell_meditation_paused"));
            icon->text->setRichText(utils::translate("common_paused"));
        }
    }
} // namespace gui

M products/BellHybrid/apps/application-bell-onboarding/include/application-bell-onboarding/ApplicationBellOnBoarding.hpp => products/BellHybrid/apps/application-bell-onboarding/include/application-bell-onboarding/ApplicationBellOnBoarding.hpp +1 -1
@@ 11,7 11,7 @@ namespace app::OnBoarding
    /// Image name, Prompt info text
    using InformationDisplay = std::pair<std::string, std::string>;

    constexpr auto informationPromptTimeout = std::chrono::seconds{5};
    constexpr auto informationPromptTimeout = std::chrono::seconds{15};
    constexpr auto informationTimerName     = "OnBoardingInformationTimer";

    enum class InformationStates

M products/BellHybrid/apps/application-bell-settings/windows/alarm_settings/BellSettingsAlarmSettingsMenuWindow.cpp => products/BellHybrid/apps/application-bell-settings/windows/alarm_settings/BellSettingsAlarmSettingsMenuWindow.cpp +1 -1
@@ 17,7 17,7 @@ namespace gui
        : BellOptionWindow(app, name)
    {
        addOptions(alarmSettingsOptionsList());
        setListTitle(utils::translate("app_bell_settings_alarm_settings"));
        setListTitle(utils::translate("app_bell_settings_alarm_settings_title"));
    }

    std::list<Option> BellSettingsAlarmSettingsMenuWindow::alarmSettingsOptionsList()

M products/BellHybrid/apps/common/include/common/data/StyleCommon.hpp => products/BellHybrid/apps/common/include/common/data/StyleCommon.hpp +4 -0
@@ 12,4 12,8 @@ namespace gui::bell_style
    inline constexpr auto font_center     = ::style::window::font::largelight;
    inline constexpr auto font_top        = ::style::window::font::largelight;
    inline constexpr auto statusClockFont = style::window::font::verybiglight;

    inline constexpr auto popup_icon_top_margin    = 120;
    inline constexpr auto popup_icon_bottom_margin = 30;

} // namespace gui::bell_style

M products/BellHybrid/apps/common/src/popups/AlarmActivatedWindow.cpp => products/BellHybrid/apps/common/src/popups/AlarmActivatedWindow.cpp +4 -1
@@ 5,6 5,7 @@
#include <apps-common/popups/data/PopupRequestParams.hpp>
#include <common/popups/AlarmActivatedWindow.hpp>
#include <common/TimeUtils.hpp>
#include <common/data/StyleCommon.hpp>
#include <gui/input/InputEvent.hpp>
#include <gui/widgets/Icon.hpp>
#include <popups/Popups.hpp>


@@ 47,7 48,9 @@ namespace gui
        header->setTitleVisibility(false);
        navBar->setVisible(false);

        icon = new Icon(this, 0, y_position, style::window_width, style::window_height, "big_alarm_W_G", {});
        icon = new Icon(this, 0, 0, style::window_width, style::window_height, "big_alarm_W_G", {});
        icon->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Top));
        icon->image->setMargins({0, bell_style::popup_icon_top_margin, 0, bell_style::popup_icon_bottom_margin});
        icon->text->setFont(style::window::font::verybiglight);
    }


M products/BellHybrid/apps/common/src/popups/AlarmDeactivatedWindow.cpp => products/BellHybrid/apps/common/src/popups/AlarmDeactivatedWindow.cpp +3 -0
@@ 5,6 5,7 @@
#include <apps-common/messages/DialogMetadataMessage.hpp>
#include <apps-common/popups/data/PopupRequestParams.hpp>
#include <apps-common/popups/Popups.hpp>
#include <common/data/StyleCommon.hpp>
#include <common/popups/AlarmDeactivatedWindow.hpp>
#include <gui/input/InputEvent.hpp>
#include <gui/widgets/Icon.hpp>


@@ 56,6 57,8 @@ namespace gui
                        style::window_height,
                        "big_no-alarm_W_G",
                        utils::translate("app_bell_alarm_deactivated"));
        icon->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Top));
        icon->image->setMargins({0, bell_style::popup_icon_top_margin, 0, bell_style::popup_icon_bottom_margin});
        icon->text->setFont(style::window::font::verybiglight);
    }


M products/BellHybrid/services/appmgr/ApplicationManager.cpp => products/BellHybrid/services/appmgr/ApplicationManager.cpp +0 -9
@@ 36,18 36,9 @@ namespace app::manager
        return rootApplicationName;
    }

    auto ApplicationManager::handleDisplayLowBatteryScreen(ActionEntry &action) -> ActionProcessStatus
    {
        SwitchRequest switchRequest(
            service::name::appmgr, resolveHomeApplication(), gui::window::name::bell_battery_shutdown, nullptr);
        return handleSwitchApplication(&switchRequest) ? ActionProcessStatus::Accepted : ActionProcessStatus::Dropped;
    }

    ActionProcessStatus ApplicationManager::handleAction(ActionEntry &action)
    {
        switch (action.actionId) {
        case actions::DisplayLowBatteryScreen:
            return handleDisplayLowBatteryScreen(action);
        default:
            return ApplicationManagerCommon::handleAction(action);
        }

M products/BellHybrid/services/appmgr/include/appmgr/ApplicationManager.hpp => products/BellHybrid/services/appmgr/include/appmgr/ApplicationManager.hpp +0 -2
@@ 24,7 24,5 @@ namespace app::manager
        auto startApplication(ApplicationHandle &app) -> bool override;
        auto resolveHomeApplication() -> std::string override;
        auto registerMessageHandlers() -> void override;

        auto handleDisplayLowBatteryScreen(ActionEntry &action) -> ActionProcessStatus;
    };
} // namespace app::manager

M products/BellHybrid/sys/SystemManager.cpp => products/BellHybrid/sys/SystemManager.cpp +9 -0
@@ 4,6 4,8 @@
#include <sys/SystemManager.hpp>
#include <sys/messages/AlarmActivationStatusChangeRequest.hpp>

#include <system/messages/SystemManagerMessage.hpp>

#include <appmgr/messages/AlarmMessage.hpp>
#include <appmgr/messages/BatteryShutdown.hpp>
#include <service-appmgr/messages/SwitchRequest.hpp>


@@ 48,4 50,11 @@ namespace sys
        bus.sendUnicast(msg, service::name::appmgr);
        SystemManagerCommon::batteryShutdownLevelAction();
    }

    void SystemManager::batteryCriticalLevelAction(bool charging)
    {
        SystemManagerCommon::batteryCriticalLevelAction(charging);
        auto msg = std::make_shared<CriticalBatteryLevelNotification>(true, charging);
        bus.sendUnicast(std::move(msg), service::name::appmgr);
    }
} // namespace sys

M products/BellHybrid/sys/include/sys/SystemManager.hpp => products/BellHybrid/sys/include/sys/SystemManager.hpp +2 -0
@@ 20,5 20,7 @@ namespace sys
        auto handleAlarmActivationStatusChangeRequest(AlarmActivationStatusChangeRequest *request) -> MessagePointer;

        void batteryShutdownLevelAction() override;

        void batteryCriticalLevelAction(bool charging) override;
    };
} // namespace sys

M third-party/usb_stack => third-party/usb_stack +1 -1
@@ 1,1 1,1 @@
Subproject commit 4b996eadb9ee27f0d0a26bb06e5c1587e8102a22
Subproject commit 60799ac591164bf2a85e1ad054e9ce937c05d2a8

M tools/download_asset2.py => tools/download_asset2.py +1 -1
@@ 172,7 172,7 @@ class GitOps:
                output.parent.mkdir(parents=True, exist_ok=True)
                self.copy_file(cached, output)
            except HTTP404NotFoundError as ex:
                raise RuntimeError(f'file not found with: {data} err: {ex}  on path: {Path(".").absolute()} with cache dir: {self.cache.absolute()} for {val["name"]}')
                raise RuntimeError(f'file not found with: {data} err: {ex}')
            except HTTP403ForbiddenError as ex:
                # gh is messed up - if you get persistent error on this file, try renaming
                raise RuntimeError(f'something is wrong with: {data} err: {ex}')